|
53165
|
NULL
|
0
|
2026-04-20T07:59:05.034112+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-20/1776 /Users/lukas/.screenpipe/data/data/2026-04-20/1776671945034_m2.jpg...
|
Slack
|
platform-inner-team (Channel) - Jiminny Inc - 1 ne platform-inner-team (Channel) - Jiminny Inc - 1 new item - Slack...
|
True
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Jiminny Inc
Jiminny (Staging)
Add workspaces
Home
Jiminny Inc
Jiminny (Staging)
Add workspaces
Home
Home
DMs
DMs
Activity
Activity
Files
Files
Later
Later
More…
More
Unreads
Threads
Huddles
Drafts & sent
Directories
jiminny-x-integration-app
platform-inner-team
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_jiminny
Galya Dimitrova
Aneliya Angelova
Stefka Stoyanova
Stoyan Tomov
Aneliya Angelova
,
Nikolay Yankov
,
Steliyan Georgiev
Nikolay Nikolov
Stoyan Tanev
Vasil Vasilev
Nikolay Ivanov
Ves
Toast
Jira Cloud
Messages
Messages
Channel Overview
Channel Overview
Refinements
Refinements
Files
Files
Pins
Pins
Bookmarks
Bookmarks
Retro Action Items
Retro Action Items
Deleted file
Deleted file
Add and Edit Channel Tabs
Canvas
List
Folder
Jump to date
Nikolay Nikolov
Apr 17th at 9:30:59 AM
9:30 AM
https://github.com/jiminny/app/pull/11976
https://github.com/jiminny/app/pull/11976
#11976 JY-20553 | Improve crm-sync delays
#11976 JY-20553 | Improve crm-sync delays
JIRA:
JY-20553
JY-20553
Casus:
• Minimize
crm-sync
queue Approximate Age Of Oldest Message from 6 h to hopefully 1 h
Changes:
• Add
syncObjects
jobs
distribution
Show more
Comments
5
jiminny/app
jiminny/app
|
Apr 16th
|
Added by
GitHub
GitHub
Steliyan Georgiev
Apr 17th at 3:58:42 PM
3:58 PM
Отивам да взема ученика по-рано, че ги гонят по-рано заради изборите
Nikolay Yankov
Apr 17th at 4:33:05 PM
4:33 PM
може ли едно ревю на PR-a за репортите?
https://github.com/jiminny/app/pull/11894
https://github.com/jiminny/app/pull/11894
Galya Dimitrova
Apr 17th at 4:38:54 PM
4:38 PM
сторита за рефайнмънт за понеделник:
https://jiminny.atlassian.net/browse/JY-20676
https://jiminny.atlassian.net/browse/JY-20676
https://jiminny.atlassian.net/browse/JY-20615
https://jiminny.atlassian.net/browse/JY-20615
https://jiminny.atlassian.net/browse/JY-20613
https://jiminny.atlassian.net/browse/JY-20613
https://jiminny.atlassian.net/browse/JY-20500
https://jiminny.atlassian.net/browse/JY-20500
https://jiminny.atlassian.net/browse/JY-20501
https://jiminny.atlassian.net/browse/JY-20501
JY-20676 Notify the user if a Panorama prompts is deleted but is used in AJ …
JY-20676 Notify the user if a Panorama prompts is deleted but is used in AJ …
Status:
Backlog
Type:
Story
Assignee:
Unassigned
Priority:
Medium
Sync thread
Sync thread
sparkles emoji AI Summarise
AI Summarise
More actions...
Added by
Jira Cloud
Jira Cloud
JY-20615 Notify the user if a SS is deleted but is used in AJ Report
JY-20615 Notify the user if a SS is deleted but is used in AJ Report
Status:
Backlog
Type:
Story
Assignee:
Unassigned
Priority:
Medium
Sync thread
Sync thread
sparkles emoji AI Summarise
AI Summarise
More actions...
Added by
Jira Cloud
Jira Cloud
JY-20613 Allow owner's role to be selected when setting up a trial
JY-20613 Allow owner's role to be selected when setting up a trial
Status:
Backlog
Type:
Story
Assignee:
Unassigned
Priority:
Medium
Sync thread
Sync thread
sparkles emoji AI Summarise
AI Summarise
More actions...
Added by
Jira Cloud
Jira Cloud
JY-20500 Batch initial sync for Salesforce
JY-20500 Batch initial sync for Salesforce
Status:
Backlog
Type:
Story
Assignee:
Unassigned
Priority:
Medium
Sync thread
Sync thread
sparkles emoji AI Summarise
AI Summarise
More actions...
Added by
Jira Cloud
Jira Cloud
JY-20501 Batch initial sync for Hubspot
JY-20501 Batch initial sync for Hubspot
Status:
Backlog
Type:
Story
Assignee:
Unassigned
Priority:
Medium
Sync thread
Sync thread
sparkles emoji AI Summarise
AI Summarise
More actions...
Added by
Jira Cloud
Jira Cloud
Jump to date
Lukas Kovalik
Today at 10:08:54 AM
10:08 AM
нещо ми изключи audio изцяло, края не съм чувал нищо, какво да погледна аз от тези
2 replies
Last reply today at 10:25 AM
View thread
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply to thread
Forward message…
Save for later
Summarize thread
More actions
Nikolay Yankov
Today at 10:56:34 AM
10:56 AM
Лукас, това тества ли го преди merge?
https://github.com/jiminny/app/pull/11970
https://github.com/jiminny/app/pull/11970
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Lukas Kovalik
Today at 10:58:45 AM
10:58 AM
не, трябваше ли
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Nikolay Yankov
is typing
No exact matches. Search for: shared-activi, 1 of 2 suggestions
Nikolay Yankov is typing...
|
[{"role":"AXRadioButton","text [{"role":"AXRadioButton","text":"Jiminny Inc","depth":12,"bounds":{"left":0.004654255,"top":0.06304868,"width":0.010638298,"height":0.025538707},"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true,"is_expanded":false},{"role":"AXRadioButton","text":"Jiminny (Staging)","depth":12,"bounds":{"left":0.004654255,"top":0.10454908,"width":0.010638298,"height":0.025538707},"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"Add workspaces","depth":12,"bounds":{"left":0.004654255,"top":0.14604948,"width":0.010638298,"height":0.025538707},"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"Home","depth":14,"bounds":{"left":0.022938829,"top":0.05586592,"width":0.017287234,"height":0.054269753},"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true,"is_expanded":false},{"role":"AXStaticText","text":"Home","depth":16,"bounds":{"left":0.026595745,"top":0.0933759,"width":0.009973404,"height":0.0103751},"role_description":"text"},{"role":"AXRadioButton","text":"DMs","depth":14,"bounds":{"left":0.022938829,"top":0.110135674,"width":0.017287234,"height":0.054269753},"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"DMs","depth":16,"bounds":{"left":0.027593086,"top":0.14764565,"width":0.007978723,"height":0.0103751},"role_description":"text"},{"role":"AXRadioButton","text":"Activity","depth":14,"bounds":{"left":0.022938829,"top":0.16440542,"width":0.017287234,"height":0.054269753},"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Activity","depth":16,"bounds":{"left":0.025265958,"top":0.2019154,"width":0.012965426,"height":0.0103751},"role_description":"text"},{"role":"AXRadioButton","text":"Files","depth":14,"bounds":{"left":0.022938829,"top":0.21867518,"width":0.017287234,"height":0.054269753},"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Files","depth":16,"bounds":{"left":0.027925532,"top":0.25618514,"width":0.0076462766,"height":0.0103751},"role_description":"text"},{"role":"AXRadioButton","text":"Later","depth":14,"bounds":{"left":0.022938829,"top":0.27294493,"width":0.017287234,"height":0.054269753},"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Later","depth":16,"bounds":{"left":0.027260639,"top":0.3104549,"width":0.008643617,"height":0.0103751},"role_description":"text"},{"role":"AXRadioButton","text":"More…","depth":14,"bounds":{"left":0.022938829,"top":0.3272147,"width":0.017287234,"height":0.054269753},"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"More","depth":16,"bounds":{"left":0.027260639,"top":0.36472467,"width":0.008976064,"height":0.0103751},"role_description":"text"},{"role":"AXStaticText","text":"Unreads","depth":21,"role_description":"text"},{"role":"AXStaticText","text":"Threads","depth":21,"role_description":"text"},{"role":"AXStaticText","text":"Huddles","depth":21,"role_description":"text"},{"role":"AXStaticText","text":"Drafts & sent","depth":21,"role_description":"text"},{"role":"AXStaticText","text":"Directories","depth":21,"bounds":{"left":0.056848403,"top":0.09177973,"width":0.023936171,"height":0.009577015},"role_description":"text"},{"role":"AXStaticText","text":"jiminny-x-integration-app","depth":21,"bounds":{"left":0.06216755,"top":0.1811652,"width":0.043882977,"height":0.014365523},"role_description":"text"},{"role":"AXStaticText","text":"platform-inner-team","depth":21,"bounds":{"left":0.06216755,"top":0.20351157,"width":0.044215426,"height":0.014365523},"role_description":"text"},{"role":"AXStaticText","text":"ai-chapter","depth":21,"bounds":{"left":0.06216755,"top":0.25618514,"width":0.022273935,"height":0.014365523},"role_description":"text"},{"role":"AXStaticText","text":"alerts","depth":21,"bounds":{"left":0.06216755,"top":0.27853152,"width":0.011968086,"height":0.014365523},"role_description":"text"},{"role":"AXStaticText","text":"backend","depth":21,"bounds":{"left":0.06216755,"top":0.3008779,"width":0.018284574,"height":0.014365523},"role_description":"text"},{"role":"AXStaticText","text":"confusion-clinic","depth":21,"bounds":{"left":0.06216755,"top":0.32322428,"width":0.034242023,"height":0.014365523},"role_description":"text"},{"role":"AXStaticText","text":"curiosity_lab","depth":21,"bounds":{"left":0.06216755,"top":0.34557062,"width":0.027593086,"height":0.014365523},"role_description":"text"},{"role":"AXStaticText","text":"engineering","depth":21,"bounds":{"left":0.06216755,"top":0.367917,"width":0.025598405,"height":0.014365523},"role_description":"text"},{"role":"AXStaticText","text":"frontend","depth":21,"bounds":{"left":0.06216755,"top":0.39026338,"width":0.018949468,"height":0.014365523},"role_description":"text"},{"role":"AXStaticText","text":"general","depth":21,"bounds":{"left":0.06216755,"top":0.41260973,"width":0.015957447,"height":0.014365523},"role_description":"text"},{"role":"AXStaticText","text":"infra-changes","depth":21,"bounds":{"left":0.06216755,"top":0.4349561,"width":0.029587766,"height":0.014365523},"role_description":"text"},{"role":"AXStaticText","text":"jiminny-bg","depth":21,"bounds":{"left":0.06216755,"top":0.45730248,"width":0.022938829,"height":0.014365523},"role_description":"text"},{"role":"AXStaticText","text":"platform-tickets","depth":21,"bounds":{"left":0.06216755,"top":0.47964883,"width":0.034906916,"height":0.014365523},"role_description":"text"},{"role":"AXStaticText","text":"product_launches","depth":21,"bounds":{"left":0.06216755,"top":0.5019952,"width":0.03856383,"height":0.014365523},"role_description":"text"},{"role":"AXStaticText","text":"random","depth":21,"bounds":{"left":0.06216755,"top":0.5243416,"width":0.01662234,"height":0.014365523},"role_description":"text"},{"role":"AXStaticText","text":"releases","depth":21,"bounds":{"left":0.06216755,"top":0.54668796,"width":0.018284574,"height":0.014365523},"role_description":"text"},{"role":"AXStaticText","text":"sofia-office","depth":21,"bounds":{"left":0.06216755,"top":0.56903434,"width":0.024268618,"height":0.014365523},"role_description":"text"},{"role":"AXStaticText","text":"support","depth":21,"bounds":{"left":0.06216755,"top":0.5913807,"width":0.016954787,"height":0.014365523},"role_description":"text"},{"role":"AXStaticText","text":"thank-yous","depth":21,"bounds":{"left":0.06216755,"top":0.61372703,"width":0.024268618,"height":0.014365523},"role_description":"text"},{"role":"AXStaticText","text":"the_people_of_jiminny","depth":21,"bounds":{"left":0.06216755,"top":0.6360734,"width":0.04488032,"height":0.014365523},"role_description":"text"},{"role":"AXStaticText","text":"Galya Dimitrova","depth":21,"bounds":{"left":0.06216755,"top":0.688747,"width":0.034906916,"height":0.014365523},"role_description":"text"},{"role":"AXStaticText","text":"Aneliya Angelova","depth":21,"bounds":{"left":0.06216755,"top":0.71109337,"width":0.03756649,"height":0.014365523},"role_description":"text"},{"role":"AXStaticText","text":"Stefka Stoyanova","depth":21,"bounds":{"left":0.06216755,"top":0.73343974,"width":0.03756649,"height":0.014365523},"role_description":"text"},{"role":"AXStaticText","text":"Stoyan Tomov","depth":21,"bounds":{"left":0.06216755,"top":0.7557861,"width":0.030585106,"height":0.014365523},"role_description":"text"},{"role":"AXStaticText","text":"Aneliya Angelova","depth":21,"bounds":{"left":0.06216755,"top":0.7781325,"width":0.03756649,"height":0.014365523},"role_description":"text"},{"role":"AXStaticText","text":",","depth":21,"bounds":{"left":0.09940159,"top":0.7781325,"width":0.0063164895,"height":0.014365523},"role_description":"text"},{"role":"AXStaticText","text":"Nikolay Yankov","depth":21,"bounds":{"left":0.10206117,"top":0.7781325,"width":0.014295213,"height":0.014365523},"role_description":"text"},{"role":"AXStaticText","text":",","depth":21,"bounds":{"left":0.116023935,"top":0.79569036,"width":0.0003324468,"height":0.0007980846},"role_description":"text"},{"role":"AXStaticText","text":"Steliyan Georgiev","depth":21,"bounds":{"left":0.116023935,"top":0.79569036,"width":0.0003324468,"height":0.0007980846},"role_description":"text"},{"role":"AXStaticText","text":"Nikolay Nikolov","depth":21,"bounds":{"left":0.06216755,"top":0.8004789,"width":0.034242023,"height":0.014365523},"role_description":"text"},{"role":"AXStaticText","text":"Stoyan Tanev","depth":21,"bounds":{"left":0.06216755,"top":0.8228252,"width":0.028922873,"height":0.014365523},"role_description":"text"},{"role":"AXStaticText","text":"Vasil Vasilev","depth":21,"bounds":{"left":0.06216755,"top":0.8451716,"width":0.026263298,"height":0.014365523},"role_description":"text"},{"role":"AXStaticText","text":"Nikolay Ivanov","depth":21,"bounds":{"left":0.06216755,"top":0.86751795,"width":0.031914894,"height":0.014365523},"role_description":"text"},{"role":"AXStaticText","text":"Ves","depth":21,"bounds":{"left":0.06216755,"top":0.8898643,"width":0.0076462766,"height":0.014365523},"role_description":"text"},{"role":"AXStaticText","text":"Toast","depth":21,"bounds":{"left":0.06216755,"top":0.9425379,"width":0.011968086,"height":0.014365523},"role_description":"text"},{"role":"AXStaticText","text":"Jira Cloud","depth":21,"bounds":{"left":0.06216755,"top":0.9648843,"width":0.021609042,"height":0.014365523},"role_description":"text"},{"role":"AXRadioButton","text":"Messages","depth":17,"bounds":{"left":0.12200798,"top":0.09177973,"width":0.030585106,"height":0.030327214},"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true,"is_expanded":false},{"role":"AXStaticText","text":"Messages","depth":19,"bounds":{"left":0.13131648,"top":0.10055866,"width":0.01861702,"height":0.012769354},"role_description":"text"},{"role":"AXRadioButton","text":"Channel Overview","depth":17,"bounds":{"left":0.15392287,"top":0.09177973,"width":0.047539894,"height":0.030327214},"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Channel Overview","depth":19,"bounds":{"left":0.16323139,"top":0.10055866,"width":0.03557181,"height":0.012769354},"role_description":"text"},{"role":"AXRadioButton","text":"Refinements","depth":17,"bounds":{"left":0.20279256,"top":0.09177973,"width":0.03756649,"height":0.030327214},"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Refinements","depth":19,"bounds":{"left":0.21210106,"top":0.10055866,"width":0.024268618,"height":0.012769354},"role_description":"text"},{"role":"AXRadioButton","text":"Files","depth":17,"bounds":{"left":0.24135639,"top":0.09177973,"width":0.020944148,"height":0.030327214},"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Files","depth":19,"bounds":{"left":0.2506649,"top":0.10055866,"width":0.008976064,"height":0.012769354},"role_description":"text"},{"role":"AXRadioButton","text":"Pins","depth":17,"bounds":{"left":0.26363033,"top":0.09177973,"width":0.020279255,"height":0.030327214},"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Pins","depth":19,"bounds":{"left":0.27293882,"top":0.10055866,"width":0.00831117,"height":0.012769354},"role_description":"text"},{"role":"AXRadioButton","text":"Bookmarks","depth":17,"bounds":{"left":0.28523937,"top":0.09177973,"width":0.033909574,"height":0.030327214},"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Bookmarks","depth":19,"bounds":{"left":0.2945479,"top":0.10055866,"width":0.021941489,"height":0.012769354},"role_description":"text"},{"role":"AXRadioButton","text":"Retro Action Items","depth":17,"bounds":{"left":0.32014626,"top":0.09177973,"width":0.049534574,"height":0.030327214},"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Retro Action Items","depth":19,"bounds":{"left":0.32978722,"top":0.10055866,"width":0.035904255,"height":0.012769354},"role_description":"text"},{"role":"AXRadioButton","text":"Deleted file","depth":17,"bounds":{"left":0.3706782,"top":0.09177973,"width":0.035904255,"height":0.030327214},"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Deleted file","depth":19,"bounds":{"left":0.3799867,"top":0.10055866,"width":0.022606382,"height":0.012769354},"role_description":"text"},{"role":"AXPopUpButton","text":"Add and Edit Channel Tabs","depth":17,"bounds":{"left":0.40757978,"top":0.09177973,"width":0.010970744,"height":0.030327214},"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Canvas","depth":17,"bounds":{"left":0.11635638,"top":0.0518755,"width":0.015625,"height":0.0007980846},"role_description":"text"},{"role":"AXStaticText","text":"List","depth":17,"bounds":{"left":0.11635638,"top":0.0518755,"width":0.0076462766,"height":0.0007980846},"role_description":"text"},{"role":"AXStaticText","text":"Folder","depth":17,"bounds":{"left":0.11635638,"top":0.0518755,"width":0.013962766,"height":0.0007980846},"role_description":"text"},{"role":"AXPopUpButton","text":"Jump to date","depth":23,"bounds":{"left":0.28424203,"top":0.12689546,"width":0.046875,"height":0.022346368},"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Nikolay Nikolov","depth":24,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":24,"role_description":"text"},{"role":"AXLink","text":"Apr 17th at 9:30:59 AM","depth":24,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"9:30 AM","depth":25,"role_description":"text"},{"role":"AXLink","text":"https://github.com/jiminny/app/pull/11976","depth":25,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"https://github.com/jiminny/app/pull/11976","depth":26,"role_description":"text"},{"role":"AXLink","text":"#11976 JY-20553 | Improve crm-sync delays","depth":26,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"#11976 JY-20553 | Improve crm-sync delays","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"JIRA:","depth":26,"role_description":"text"},{"role":"AXLink","text":"JY-20553","depth":26,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"JY-20553","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"Casus:","depth":26,"role_description":"text"},{"role":"AXStaticText","text":"• Minimize","depth":26,"role_description":"text"},{"role":"AXStaticText","text":"crm-sync","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"queue Approximate Age Of Oldest Message from 6 h to hopefully 1 h","depth":26,"role_description":"text"},{"role":"AXStaticText","text":"Changes:","depth":26,"role_description":"text"},{"role":"AXStaticText","text":"• Add","depth":26,"role_description":"text"},{"role":"AXStaticText","text":"syncObjects","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"jobs","depth":26,"role_description":"text"},{"role":"AXStaticText","text":"distribution","depth":26,"role_description":"text"},{"role":"AXButton","text":"Show more","depth":26,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Comments","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"5","depth":27,"role_description":"text"},{"role":"AXLink","text":"jiminny/app","depth":26,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"jiminny/app","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"|","depth":26,"role_description":"text"},{"role":"AXStaticText","text":"Apr 16th","depth":26,"role_description":"text"},{"role":"AXStaticText","text":"|","depth":26,"role_description":"text"},{"role":"AXStaticText","text":"Added by","depth":26,"role_description":"text"},{"role":"AXLink","text":"GitHub","depth":26,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"GitHub","depth":27,"role_description":"text"},{"role":"AXButton","text":"Steliyan Georgiev","depth":24,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":24,"role_description":"text"},{"role":"AXLink","text":"Apr 17th at 3:58:42 PM","depth":24,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"3:58 PM","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"Отивам да взема ученика по-рано, че ги гонят по-рано заради изборите","depth":25,"role_description":"text"},{"role":"AXButton","text":"Nikolay Yankov","depth":24,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":24,"role_description":"text"},{"role":"AXLink","text":"Apr 17th at 4:33:05 PM","depth":24,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"4:33 PM","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"може ли едно ревю на PR-a за репортите?","depth":25,"role_description":"text"},{"role":"AXLink","text":"https://github.com/jiminny/app/pull/11894","depth":25,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"https://github.com/jiminny/app/pull/11894","depth":26,"role_description":"text"},{"role":"AXButton","text":"Galya Dimitrova","depth":24,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":24,"role_description":"text"},{"role":"AXLink","text":"Apr 17th at 4:38:54 PM","depth":24,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"4:38 PM","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"сторита за рефайнмънт за понеделник:","depth":25,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXLink","text":"https://jiminny.atlassian.net/browse/JY-20676","depth":26,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"https://jiminny.atlassian.net/browse/JY-20676","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"role_description":"text"},{"role":"AXLink","text":"https://jiminny.atlassian.net/browse/JY-20615","depth":26,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"https://jiminny.atlassian.net/browse/JY-20615","depth":27,"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"bounds":{"left":0.13896276,"top":0.11572227,"width":0.004986702,"height":0.008778931},"role_description":"text"},{"role":"AXLink","text":"https://jiminny.atlassian.net/browse/JY-20613","depth":26,"bounds":{"left":0.14727394,"top":0.11572227,"width":0.10106383,"height":0.009577015},"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"https://jiminny.atlassian.net/browse/JY-20613","depth":27,"bounds":{"left":0.14727394,"top":0.11572227,"width":0.10106383,"height":0.009577015},"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"bounds":{"left":0.13896276,"top":0.1300878,"width":0.004986702,"height":0.011971269},"role_description":"text"},{"role":"AXLink","text":"https://jiminny.atlassian.net/browse/JY-20500","depth":26,"bounds":{"left":0.14727394,"top":0.12849163,"width":0.10106383,"height":0.014365523},"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"https://jiminny.atlassian.net/browse/JY-20500","depth":27,"bounds":{"left":0.14727394,"top":0.12849163,"width":0.10106383,"height":0.014365523},"role_description":"text"},{"role":"AXStaticText","text":"","depth":27,"bounds":{"left":0.13896276,"top":0.14764565,"width":0.004986702,"height":0.011971269},"role_description":"text"},{"role":"AXLink","text":"https://jiminny.atlassian.net/browse/JY-20501","depth":26,"bounds":{"left":0.14727394,"top":0.14604948,"width":0.10106383,"height":0.014365523},"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"https://jiminny.atlassian.net/browse/JY-20501","depth":27,"bounds":{"left":0.14727394,"top":0.14604948,"width":0.10106383,"height":0.014365523},"role_description":"text"},{"role":"AXLink","text":"JY-20676 Notify the user if a Panorama prompts is deleted but is used in AJ …","depth":27,"bounds":{"left":0.14328457,"top":0.16839585,"width":0.171875,"height":0.014365523},"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"JY-20676 Notify the user if a Panorama prompts is deleted but is used in AJ …","depth":28,"bounds":{"left":0.14328457,"top":0.16839585,"width":0.171875,"height":0.014365523},"role_description":"text"},{"role":"AXStaticText","text":"Status:","depth":26,"bounds":{"left":0.14328457,"top":0.19393456,"width":0.013962766,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"Backlog","depth":26,"bounds":{"left":0.15691489,"top":0.19393456,"width":0.015625,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"Type:","depth":26,"bounds":{"left":0.18550532,"top":0.19393456,"width":0.011635638,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"Story","depth":26,"bounds":{"left":0.19680852,"top":0.19393456,"width":0.010305851,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"Assignee:","depth":26,"bounds":{"left":0.22041224,"top":0.19393456,"width":0.019281914,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"Unassigned","depth":26,"bounds":{"left":0.2393617,"top":0.19393456,"width":0.022606382,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"Priority:","depth":26,"bounds":{"left":0.27526596,"top":0.19393456,"width":0.016289894,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"Medium","depth":26,"bounds":{"left":0.2912234,"top":0.19393456,"width":0.016289894,"height":0.012769354},"role_description":"text"},{"role":"AXButton","text":"Sync thread","depth":26,"bounds":{"left":0.14328457,"top":0.22027135,"width":0.027925532,"height":0.022346368},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Sync thread","depth":28,"bounds":{"left":0.14594415,"top":0.22426178,"width":0.022606382,"height":0.012769354},"role_description":"text"},{"role":"AXButton","text":"sparkles emoji AI Summarise","depth":26,"bounds":{"left":0.17386968,"top":0.22027135,"width":0.03856383,"height":0.022346368},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"AI Summarise","depth":28,"bounds":{"left":0.18218085,"top":0.22426178,"width":0.027260639,"height":0.012769354},"role_description":"text"},{"role":"AXComboBox","text":"More actions...","depth":27,"bounds":{"left":0.21509309,"top":0.22027135,"width":0.06349734,"height":0.022346368},"placeholder":"More actions...","role_description":"combo box","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Added by","depth":26,"bounds":{"left":0.14328457,"top":0.25219473,"width":0.01761968,"height":0.011173184},"role_description":"text"},{"role":"AXLink","text":"Jira Cloud","depth":26,"bounds":{"left":0.16057181,"top":0.25219473,"width":0.01761968,"height":0.011173184},"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Jira Cloud","depth":27,"bounds":{"left":0.16057181,"top":0.25219473,"width":0.01761968,"height":0.011173184},"role_description":"text"},{"role":"AXLink","text":"JY-20615 Notify the user if a SS is deleted but is used in AJ Report","depth":27,"bounds":{"left":0.14328457,"top":0.273743,"width":0.14660904,"height":0.014365523},"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"JY-20615 Notify the user if a SS is deleted but is used in AJ Report","depth":28,"bounds":{"left":0.14328457,"top":0.273743,"width":0.14660904,"height":0.014365523},"role_description":"text"},{"role":"AXStaticText","text":"Status:","depth":26,"bounds":{"left":0.14328457,"top":0.29928172,"width":0.013962766,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"Backlog","depth":26,"bounds":{"left":0.15691489,"top":0.29928172,"width":0.015625,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"Type:","depth":26,"bounds":{"left":0.18550532,"top":0.29928172,"width":0.011635638,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"Story","depth":26,"bounds":{"left":0.19680852,"top":0.29928172,"width":0.010305851,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"Assignee:","depth":26,"bounds":{"left":0.22041224,"top":0.29928172,"width":0.019281914,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"Unassigned","depth":26,"bounds":{"left":0.2393617,"top":0.29928172,"width":0.022606382,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"Priority:","depth":26,"bounds":{"left":0.27526596,"top":0.29928172,"width":0.016289894,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"Medium","depth":26,"bounds":{"left":0.2912234,"top":0.29928172,"width":0.016289894,"height":0.012769354},"role_description":"text"},{"role":"AXButton","text":"Sync thread","depth":26,"bounds":{"left":0.14328457,"top":0.3256185,"width":0.027925532,"height":0.022346368},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Sync thread","depth":28,"bounds":{"left":0.14594415,"top":0.32960895,"width":0.022606382,"height":0.012769354},"role_description":"text"},{"role":"AXButton","text":"sparkles emoji AI Summarise","depth":26,"bounds":{"left":0.17386968,"top":0.3256185,"width":0.03856383,"height":0.022346368},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"AI Summarise","depth":28,"bounds":{"left":0.18218085,"top":0.32960895,"width":0.027260639,"height":0.012769354},"role_description":"text"},{"role":"AXComboBox","text":"More actions...","depth":27,"bounds":{"left":0.21509309,"top":0.3256185,"width":0.06349734,"height":0.022346368},"placeholder":"More actions...","role_description":"combo box","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Added by","depth":26,"bounds":{"left":0.14328457,"top":0.3575419,"width":0.01761968,"height":0.011173184},"role_description":"text"},{"role":"AXLink","text":"Jira Cloud","depth":26,"bounds":{"left":0.16057181,"top":0.3575419,"width":0.01761968,"height":0.011173184},"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Jira Cloud","depth":27,"bounds":{"left":0.16057181,"top":0.3575419,"width":0.01761968,"height":0.011173184},"role_description":"text"},{"role":"AXLink","text":"JY-20613 Allow owner's role to be selected when setting up a trial","depth":27,"bounds":{"left":0.14328457,"top":0.3790902,"width":0.1462766,"height":0.014365523},"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"JY-20613 Allow owner's role to be selected when setting up a trial","depth":28,"bounds":{"left":0.14328457,"top":0.3790902,"width":0.1462766,"height":0.014365523},"role_description":"text"},{"role":"AXStaticText","text":"Status:","depth":26,"bounds":{"left":0.14328457,"top":0.4046289,"width":0.013962766,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"Backlog","depth":26,"bounds":{"left":0.15691489,"top":0.4046289,"width":0.015625,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"Type:","depth":26,"bounds":{"left":0.18550532,"top":0.4046289,"width":0.011635638,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"Story","depth":26,"bounds":{"left":0.19680852,"top":0.4046289,"width":0.010305851,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"Assignee:","depth":26,"bounds":{"left":0.22041224,"top":0.4046289,"width":0.019281914,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"Unassigned","depth":26,"bounds":{"left":0.2393617,"top":0.4046289,"width":0.022606382,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"Priority:","depth":26,"bounds":{"left":0.27526596,"top":0.4046289,"width":0.016289894,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"Medium","depth":26,"bounds":{"left":0.2912234,"top":0.4046289,"width":0.016289894,"height":0.012769354},"role_description":"text"},{"role":"AXButton","text":"Sync thread","depth":26,"bounds":{"left":0.14328457,"top":0.4309657,"width":0.027925532,"height":0.022346368},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Sync thread","depth":28,"bounds":{"left":0.14594415,"top":0.4349561,"width":0.022606382,"height":0.012769354},"role_description":"text"},{"role":"AXButton","text":"sparkles emoji AI Summarise","depth":26,"bounds":{"left":0.17386968,"top":0.4309657,"width":0.03856383,"height":0.022346368},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"AI Summarise","depth":28,"bounds":{"left":0.18218085,"top":0.4349561,"width":0.027260639,"height":0.012769354},"role_description":"text"},{"role":"AXComboBox","text":"More actions...","depth":27,"bounds":{"left":0.21509309,"top":0.4309657,"width":0.06349734,"height":0.022346368},"placeholder":"More actions...","role_description":"combo box","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Added by","depth":26,"bounds":{"left":0.14328457,"top":0.46288908,"width":0.01761968,"height":0.011173184},"role_description":"text"},{"role":"AXLink","text":"Jira Cloud","depth":26,"bounds":{"left":0.16057181,"top":0.46288908,"width":0.01761968,"height":0.011173184},"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Jira Cloud","depth":27,"bounds":{"left":0.16057181,"top":0.46288908,"width":0.01761968,"height":0.011173184},"role_description":"text"},{"role":"AXLink","text":"JY-20500 Batch initial sync for Salesforce","depth":27,"bounds":{"left":0.14328457,"top":0.48443735,"width":0.091755316,"height":0.014365523},"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"JY-20500 Batch initial sync for Salesforce","depth":28,"bounds":{"left":0.14328457,"top":0.48443735,"width":0.091755316,"height":0.014365523},"role_description":"text"},{"role":"AXStaticText","text":"Status:","depth":26,"bounds":{"left":0.14328457,"top":0.509976,"width":0.013962766,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"Backlog","depth":26,"bounds":{"left":0.15691489,"top":0.509976,"width":0.015625,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"Type:","depth":26,"bounds":{"left":0.18550532,"top":0.509976,"width":0.011635638,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"Story","depth":26,"bounds":{"left":0.19680852,"top":0.509976,"width":0.010305851,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"Assignee:","depth":26,"bounds":{"left":0.22041224,"top":0.509976,"width":0.019281914,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"Unassigned","depth":26,"bounds":{"left":0.2393617,"top":0.509976,"width":0.022606382,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"Priority:","depth":26,"bounds":{"left":0.27526596,"top":0.509976,"width":0.016289894,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"Medium","depth":26,"bounds":{"left":0.2912234,"top":0.509976,"width":0.016289894,"height":0.012769354},"role_description":"text"},{"role":"AXButton","text":"Sync thread","depth":26,"bounds":{"left":0.14328457,"top":0.5363129,"width":0.027925532,"height":0.022346368},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Sync thread","depth":28,"bounds":{"left":0.14594415,"top":0.5403033,"width":0.022606382,"height":0.012769354},"role_description":"text"},{"role":"AXButton","text":"sparkles emoji AI Summarise","depth":26,"bounds":{"left":0.17386968,"top":0.5363129,"width":0.03856383,"height":0.022346368},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"AI Summarise","depth":28,"bounds":{"left":0.18218085,"top":0.5403033,"width":0.027260639,"height":0.012769354},"role_description":"text"},{"role":"AXComboBox","text":"More actions...","depth":27,"bounds":{"left":0.21509309,"top":0.5363129,"width":0.06349734,"height":0.022346368},"placeholder":"More actions...","role_description":"combo box","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Added by","depth":26,"bounds":{"left":0.14328457,"top":0.56823623,"width":0.01761968,"height":0.011173184},"role_description":"text"},{"role":"AXLink","text":"Jira Cloud","depth":26,"bounds":{"left":0.16057181,"top":0.56823623,"width":0.01761968,"height":0.011173184},"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Jira Cloud","depth":27,"bounds":{"left":0.16057181,"top":0.56823623,"width":0.01761968,"height":0.011173184},"role_description":"text"},{"role":"AXLink","text":"JY-20501 Batch initial sync for Hubspot","depth":27,"bounds":{"left":0.14328457,"top":0.5897845,"width":0.08809841,"height":0.014365523},"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"JY-20501 Batch initial sync for Hubspot","depth":28,"bounds":{"left":0.14328457,"top":0.5897845,"width":0.08809841,"height":0.014365523},"role_description":"text"},{"role":"AXStaticText","text":"Status:","depth":26,"bounds":{"left":0.14328457,"top":0.61532325,"width":0.013962766,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"Backlog","depth":26,"bounds":{"left":0.15691489,"top":0.61532325,"width":0.015625,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"Type:","depth":26,"bounds":{"left":0.18550532,"top":0.61532325,"width":0.011635638,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"Story","depth":26,"bounds":{"left":0.19680852,"top":0.61532325,"width":0.010305851,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"Assignee:","depth":26,"bounds":{"left":0.22041224,"top":0.61532325,"width":0.019281914,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"Unassigned","depth":26,"bounds":{"left":0.2393617,"top":0.61532325,"width":0.022606382,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"Priority:","depth":26,"bounds":{"left":0.27526596,"top":0.61532325,"width":0.016289894,"height":0.012769354},"role_description":"text"},{"role":"AXStaticText","text":"Medium","depth":26,"bounds":{"left":0.2912234,"top":0.61532325,"width":0.016289894,"height":0.012769354},"role_description":"text"},{"role":"AXButton","text":"Sync thread","depth":26,"bounds":{"left":0.14328457,"top":0.64166003,"width":0.027925532,"height":0.022346368},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Sync thread","depth":28,"bounds":{"left":0.14594415,"top":0.64565045,"width":0.022606382,"height":0.012769354},"role_description":"text"},{"role":"AXButton","text":"sparkles emoji AI Summarise","depth":26,"bounds":{"left":0.17386968,"top":0.64166003,"width":0.03856383,"height":0.022346368},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"AI Summarise","depth":28,"bounds":{"left":0.18218085,"top":0.64565045,"width":0.027260639,"height":0.012769354},"role_description":"text"},{"role":"AXComboBox","text":"More actions...","depth":27,"bounds":{"left":0.21509309,"top":0.64166003,"width":0.06349734,"height":0.022346368},"placeholder":"More actions...","role_description":"combo box","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Added by","depth":26,"bounds":{"left":0.14328457,"top":0.6735834,"width":0.01761968,"height":0.011173184},"role_description":"text"},{"role":"AXLink","text":"Jira Cloud","depth":26,"bounds":{"left":0.16057181,"top":0.6735834,"width":0.01761968,"height":0.011173184},"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Jira Cloud","depth":27,"bounds":{"left":0.16057181,"top":0.6735834,"width":0.01761968,"height":0.011173184},"role_description":"text"},{"role":"AXPopUpButton","text":"Jump to date","depth":23,"bounds":{"left":0.29488033,"top":0.70311254,"width":0.025265958,"height":0.022346368},"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Lukas Kovalik","depth":24,"bounds":{"left":0.13796543,"top":0.73423785,"width":0.030917553,"height":0.017557861},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":24,"bounds":{"left":0.16855054,"top":0.735834,"width":0.0029920214,"height":0.014365523},"role_description":"text"},{"role":"AXLink","text":"Today at 10:08:54 AM","depth":24,"bounds":{"left":0.17121011,"top":0.73822826,"width":0.01761968,"height":0.011173184},"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"10:08 AM","depth":25,"bounds":{"left":0.17121011,"top":0.73822826,"width":0.01761968,"height":0.011173184},"role_description":"text"},{"role":"AXStaticText","text":"нещо ми изключи audio изцяло, края не съм чувал нищо, какво да погледна аз от тези","depth":25,"bounds":{"left":0.13796543,"top":0.75339186,"width":0.19913563,"height":0.014365523},"role_description":"text"},{"role":"AXButton","text":"2 replies","depth":24,"bounds":{"left":0.14827128,"top":0.77494013,"width":0.016289894,"height":0.015961692},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Last reply today at 10:25 AM","depth":25,"bounds":{"left":0.1668883,"top":0.77573824,"width":0.05518617,"height":0.013567438},"role_description":"text"},{"role":"AXStaticText","text":"View thread","depth":25,"bounds":{"left":0.1668883,"top":0.77573824,"width":0.023271276,"height":0.013567438},"role_description":"text"},{"role":"AXCheckBox","text":"React with white_check_mark","depth":26,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"React with eyes","depth":26,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"React with raised_hands","depth":26,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Add reaction…","depth":26,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Reply to thread","depth":26,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Forward message…","depth":26,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Save for later","depth":26,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Summarize thread","depth":26,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"More actions","depth":26,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Nikolay Yankov","depth":24,"bounds":{"left":0.13796543,"top":0.8028731,"width":0.034242023,"height":0.017557861},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":24,"bounds":{"left":0.17220744,"top":0.8044693,"width":0.0026595744,"height":0.014365523},"role_description":"text"},{"role":"AXLink","text":"Today at 10:56:34 AM","depth":24,"bounds":{"left":0.17486702,"top":0.80686355,"width":0.01761968,"height":0.011173184},"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"10:56 AM","depth":25,"bounds":{"left":0.17486702,"top":0.80686355,"width":0.01761968,"height":0.011173184},"role_description":"text"},{"role":"AXStaticText","text":"Лукас, това тества ли го преди merge?","depth":25,"bounds":{"left":0.13796543,"top":0.82202715,"width":0.08809841,"height":0.014365523},"role_description":"text"},{"role":"AXLink","text":"https://github.com/jiminny/app/pull/11970","depth":25,"bounds":{"left":0.13796543,"top":0.839585,"width":0.09474734,"height":0.014365523},"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"https://github.com/jiminny/app/pull/11970","depth":26,"bounds":{"left":0.13796543,"top":0.839585,"width":0.09474734,"height":0.014365523},"role_description":"text"},{"role":"AXCheckBox","text":"React with white_check_mark","depth":26,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"React with eyes","depth":26,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"React with raised_hands","depth":26,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Add reaction…","depth":26,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Reply in thread","depth":26,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Forward message…","depth":26,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Save for later","depth":26,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"More actions","depth":26,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Lukas Kovalik","depth":24,"bounds":{"left":0.13796543,"top":0.8619314,"width":0.030917553,"height":0.017557861},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"","depth":24,"bounds":{"left":0.16855054,"top":0.86352754,"width":0.0029920214,"height":0.014365523},"role_description":"text"},{"role":"AXLink","text":"Today at 10:58:45 AM","depth":24,"bounds":{"left":0.17121011,"top":0.8659218,"width":0.01761968,"height":0.011173184},"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"10:58 AM","depth":25,"bounds":{"left":0.17121011,"top":0.8659218,"width":0.01761968,"height":0.011173184},"role_description":"text"},{"role":"AXStaticText","text":"не, трябваше ли","depth":25,"bounds":{"left":0.13796543,"top":0.8810854,"width":0.03723404,"height":0.014365523},"role_description":"text"},{"role":"AXCheckBox","text":"React with white_check_mark","depth":26,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"React with eyes","depth":26,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"React with raised_hands","depth":26,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Add reaction…","depth":26,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Reply in thread","depth":26,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Forward message…","depth":26,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Save for later","depth":26,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"More actions","depth":26,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"","depth":23,"bounds":{"left":0.12367021,"top":0.91380686,"width":0.36768618,"height":0.030327214},"value":"","role_description":"text entry area","is_enabled":true,"is_focused":true,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Nikolay Yankov","depth":19,"bounds":{"left":0.12732713,"top":0.980846,"width":0.023603724,"height":0.0103751},"role_description":"text"},{"role":"AXStaticText","text":"is typing","depth":19,"bounds":{"left":0.1505984,"top":0.980846,"width":0.013962766,"height":0.0103751},"role_description":"text"},{"role":"AXStaticText","text":"No exact matches. Search for: shared-activi, 1 of 2 suggestions","depth":11,"bounds":{"left":0.0,"top":0.9992019,"width":0.026263298,"height":0.0007980846},"role_description":"text"},{"role":"AXStaticText","text":"Nikolay Yankov is typing","depth":11,"bounds":{"left":0.0,"top":0.9992019,"width":0.015625,"height":0.0007980846},"role_description":"text"}]...
|
8833822623509157299
|
-1783876724144728976
|
visual_change
|
hybrid
|
NULL
|
Jiminny Inc
Jiminny (Staging)
Add workspaces
Home
Jiminny Inc
Jiminny (Staging)
Add workspaces
Home
Home
DMs
DMs
Activity
Activity
Files
Files
Later
Later
More…
More
Unreads
Threads
Huddles
Drafts & sent
Directories
jiminny-x-integration-app
platform-inner-team
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_jiminny
Galya Dimitrova
Aneliya Angelova
Stefka Stoyanova
Stoyan Tomov
Aneliya Angelova
,
Nikolay Yankov
,
Steliyan Georgiev
Nikolay Nikolov
Stoyan Tanev
Vasil Vasilev
Nikolay Ivanov
Ves
Toast
Jira Cloud
Messages
Messages
Channel Overview
Channel Overview
Refinements
Refinements
Files
Files
Pins
Pins
Bookmarks
Bookmarks
Retro Action Items
Retro Action Items
Deleted file
Deleted file
Add and Edit Channel Tabs
Canvas
List
Folder
Jump to date
Nikolay Nikolov
Apr 17th at 9:30:59 AM
9:30 AM
https://github.com/jiminny/app/pull/11976
https://github.com/jiminny/app/pull/11976
#11976 JY-20553 | Improve crm-sync delays
#11976 JY-20553 | Improve crm-sync delays
JIRA:
JY-20553
JY-20553
Casus:
• Minimize
crm-sync
queue Approximate Age Of Oldest Message from 6 h to hopefully 1 h
Changes:
• Add
syncObjects
jobs
distribution
Show more
Comments
5
jiminny/app
jiminny/app
|
Apr 16th
|
Added by
GitHub
GitHub
Steliyan Georgiev
Apr 17th at 3:58:42 PM
3:58 PM
Отивам да взема ученика по-рано, че ги гонят по-рано заради изборите
Nikolay Yankov
Apr 17th at 4:33:05 PM
4:33 PM
може ли едно ревю на PR-a за репортите?
https://github.com/jiminny/app/pull/11894
https://github.com/jiminny/app/pull/11894
Galya Dimitrova
Apr 17th at 4:38:54 PM
4:38 PM
сторита за рефайнмънт за понеделник:
https://jiminny.atlassian.net/browse/JY-20676
https://jiminny.atlassian.net/browse/JY-20676
https://jiminny.atlassian.net/browse/JY-20615
https://jiminny.atlassian.net/browse/JY-20615
https://jiminny.atlassian.net/browse/JY-20613
https://jiminny.atlassian.net/browse/JY-20613
https://jiminny.atlassian.net/browse/JY-20500
https://jiminny.atlassian.net/browse/JY-20500
https://jiminny.atlassian.net/browse/JY-20501
https://jiminny.atlassian.net/browse/JY-20501
JY-20676 Notify the user if a Panorama prompts is deleted but is used in AJ …
JY-20676 Notify the user if a Panorama prompts is deleted but is used in AJ …
Status:
Backlog
Type:
Story
Assignee:
Unassigned
Priority:
Medium
Sync thread
Sync thread
sparkles emoji AI Summarise
AI Summarise
More actions...
Added by
Jira Cloud
Jira Cloud
JY-20615 Notify the user if a SS is deleted but is used in AJ Report
JY-20615 Notify the user if a SS is deleted but is used in AJ Report
Status:
Backlog
Type:
Story
Assignee:
Unassigned
Priority:
Medium
Sync thread
Sync thread
sparkles emoji AI Summarise
AI Summarise
More actions...
Added by
Jira Cloud
Jira Cloud
JY-20613 Allow owner's role to be selected when setting up a trial
JY-20613 Allow owner's role to be selected when setting up a trial
Status:
Backlog
Type:
Story
Assignee:
Unassigned
Priority:
Medium
Sync thread
Sync thread
sparkles emoji AI Summarise
AI Summarise
More actions...
Added by
Jira Cloud
Jira Cloud
JY-20500 Batch initial sync for Salesforce
JY-20500 Batch initial sync for Salesforce
Status:
Backlog
Type:
Story
Assignee:
Unassigned
Priority:
Medium
Sync thread
Sync thread
sparkles emoji AI Summarise
AI Summarise
More actions...
Added by
Jira Cloud
Jira Cloud
JY-20501 Batch initial sync for Hubspot
JY-20501 Batch initial sync for Hubspot
Status:
Backlog
Type:
Story
Assignee:
Unassigned
Priority:
Medium
Sync thread
Sync thread
sparkles emoji AI Summarise
AI Summarise
More actions...
Added by
Jira Cloud
Jira Cloud
Jump to date
Lukas Kovalik
Today at 10:08:54 AM
10:08 AM
нещо ми изключи audio изцяло, края не съм чувал нищо, какво да погледна аз от тези
2 replies
Last reply today at 10:25 AM
View thread
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply to thread
Forward message…
Save for later
Summarize thread
More actions
Nikolay Yankov
Today at 10:56:34 AM
10:56 AM
Лукас, това тества ли го преди merge?
https://github.com/jiminny/app/pull/11970
https://github.com/jiminny/app/pull/11970
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Lukas Kovalik
Today at 10:58:45 AM
10:58 AM
не, трябваше ли
React with white_check_mark
React with eyes
React with raised_hands
Add reaction…
Reply in thread
Forward message…
Save for later
More actions
Nikolay Yankov
is typing
No exact matches. Search for: shared-activi, 1 of 2 suggestions
Nikolay Yankov is typing
SlackQ• 4 • m • 10%4 8 Mon20Apr 10:59:048 10o Deleted hleActivityMoreVIewmistoryWindowHelpQ Search: shared-activiJiminny ...381 Directories& platform-inner-team• MessagesChannel OverviewEh External connections# Starred8 jiminny-x-integrati...8 platform-inner-team® Channelsal-chanter# alerts# backend# confusion-clinic# curiosity_lab# engineering# frontend# general# infra-changes# jiminny-bgi nlatform-nickets# product_launches# random# releases# sofia-office# support# thank-yous# the_people_of_jimi...6? Direct messages®. Galya Dimitrova. Aneliya Angelova2 Stefka StovanovaR. Stoyan TomovB Aneliya Angelova,...Nikolav Nikolov2. Stoyan TanevVasil Vasilev. Nikolay IvanovP. Vesi: Apps• Toastf Jira CloudRehnementsr Files& Pins• Bookmarks72 Retro Action Item:• https://jiminny.atlassian.net/browse/JY-20500Friday, April 17th• https://jiminny.atlassian.net/browse/JY-20501JY-20676 Notify the user if a Panorama prompts is deleted but is used in AJ ...Status: BacklogI Type: StoryAssignee: UnassignedT Priority: MediumSync thread*+ Al SummariseAdded by Jira CloudJY-0615 Notiv the user tra ss is deleted but is used in Au KebortWType: Story)Assignee: UnassignedT Priority: MediumSync thread*+ Al SummariseAdded by Jira CloudY-20613 Allow owner's role to he selected when setiing un a triallI Tvne: Story.•) Assienee: Unassiened1 Prioritv: MediumSync thread*Al SummariseAdded by Jira CloudJY-20500 Batch initial sync for SalesforceStatus. RackioeI Type: StoryAssignee: Unassigned1 Priority: MediumSync thread*+Al SummariseAdded by Jira CloudJY-20501 Batch initial sync for HubspotStatus: BacklosI Type: StoryAssignee: Unassigned1 Priority: MediumSync thread*+ Al SummariseAdded bv lira Cloudtry / catchTodavLukas Kovalik 10:08 AMнещо ми изключи audio изцяло, края не съм чувал нищо, какво да погледна аз от тези2 replies Last reply today at 10:25 AMNikolay Yankov 10:56 AMЛукас, това тества ли го преди merge?httnc:/leithub. com/fiminnv/ann/null /11070Lukas Kovallk 10.58 AMне тпябваше лиlMessage & platform-inner-team+ Aaeetingsur preferences in your GitHub account settingsdependency updates - 2026-04-15 #11970 •master from secfix/composer-20260415 8 minutes agoCode -# Checks 5E Files changed 1ays ago • edited -lates — composer - 2026-04-15the secfix bot. For this ecosystem, one commit carries every dependencyts below. Cl run logs →view)ly-actionable alerts were fixed as safe patch/minor bumps. Alert #463 (phpunit/s: the oatched version (12.5.22) reauires a maior version iumo from 11.x thatImovals and requires manual migration. This does not replace Cl, tests, or manualCVEPatchedversionChangelogNotesCVE-2026-3997613.7.1releasesCVE-2026-64094.33.6releasesCVE-2026-3293520 50releasesCVF-2026-333472.8.21releasesBreaking-change risk:none observed (patch/minor). Bumped fromV13.6.0 to v13.7.4 viacomposer update.Breaking-change risk:none observed (patch/minor). Transitive dep;bumped from v4.33.5to v4.33.6 viacomposer update.Breaking-change risk:none observed (patch/minor). Bumped from3.0.49 to 3.0.51 (alsofixes #454).Breaking-change risk:none observed (patch/minor). Transitive dep(via laravel/+23-23 mmaaoReviewers® TodorStamatovJiminnyilian-jiminny@ yalokin-jiminnyAssianeesNo one-assign yourselfLabelsNone yetProjectsNone yetMilestoneNo milestoneDevelopmentSuccessfully merging this pull request may close theseNone yetNotificationsCustomize& UnsubscribeYou're receiving notifications because you're watching4 participants0D08 Lock conversation...
|
NULL
|
|
53289
|
NULL
|
0
|
2026-04-20T08:04:34.750584+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-20/1776 /Users/lukas/.screenpipe/data/data/2026-04-20/1776672274750_m1.jpg...
|
Firefox
|
fix(security): composer dependency updates – 2026- fix(security): composer dependency updates – 2026-04-15 by github-actions[bot] · Pull Request #11970 · jiminny/app — Work...
|
True
|
github.com/jiminny/app/pull/11970/changes
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Platform Sprint 2 Q2 - Platform Team - Scrum Board Platform Sprint 2 Q2 - Platform Team - Scrum Board - Jira
[SRD-6793] Les Mills activity types not pulling in - Jira
[SRD-6793] Les Mills activity types not pulling in - Jira
JY-20698 handle failed field sync on playbook import activity types by LakyLak · Pull Request #11988 · jiminny/app
JY-20698 handle failed field sync on playbook import activity types by LakyLak · Pull Request #11988 · jiminny/app
JY-20692 change confirmation parameter by LakyLak · Pull Request #11986 · jiminny/app
JY-20692 change confirmation parameter by LakyLak · Pull Request #11986 · jiminny/app
[JY-20543] AJ Reports > Tracking - Jira
[JY-20543] AJ Reports > Tracking - Jira
[JY-18909] [Part2] Automated reports with Ask Jiminny - Jira
[JY-18909] [Part2] Automated reports with Ask Jiminny - Jira
Ask Jiminny Reports by nikolay-yankov · Pull Request #11894 · jiminny/app
Ask Jiminny Reports by nikolay-yankov · Pull Request #11894 · jiminny/app
New Tab
New Tab
Product Growth Platform | Userpilot
Product Growth Platform | Userpilot
Userpilot | Logged-activity
Userpilot | Logged-activity
fix(security): composer dependency updates – 2026-04-15 by github-actions[bot] · Pull Request #11970 · jiminny/app
fix(security): composer dependency updates – 2026-04-15 by github-actions[bot] · Pull Request #11970 · jiminny/app
Pipelines - jiminny/app
Pipelines - jiminny/app
Feed — jiminny — Sentry
Feed — jiminny — Sentry
fix(security): composer dependency updates – 2026-04-15 by github-actions[bot] · Pull Request #11970 · jiminny/app
fix(security): composer dependency updates – 2026-04-15 by github-actions[bot] · Pull Request #11970 · jiminny/app
Close tab
New Tab
Customize sidebar
Open Google Gemini (⌃X)
Tabs from other devices
Open history (⇧⌘H)
Close bookmarks (⌘B)
Bookmarks
Bookmarks
Close sidebar
Search bookmarks
Skip to content
Skip to content
Open menu
Homepage (g then d)
jiminny
jiminny
app
app
Search or jump to…
Type
/
to search
Chat with Copilot
Open Copilot…
Create new...
Issues(g then i)
Pull requests
Repositories
You have unread notifications(g then n)
Open user navigation menu
Repository navigation
Repository navigation
Code
Code
Pull requests (31)
Pull requests
(
31
)
Agents
Agents
Actions
Actions
Wiki
Wiki
Security and quality (22)
Security and quality
(
22
)
Insights
Insights
Settings
Settings
Important update
Important update
On April 24 we'll start using GitHub Copilot interaction data for AI model training unless you opt out.
Review this update
Review this update
and manage your preferences in your
GitHub account settings
GitHub account settings
.
Dismiss banner
fix(security): composer dependency updates – 2026-04-15 #11970 Edit title
fix(security): composer dependency updates – 2026-04-15
#
11970
Edit title
Preview
Preview
Code
Code
Merged
LakyLak
LakyLak
merged 2 commits into
master
master
from
secfix/composer-20260415
secfix/composer-20260415
Copy head branch name to clipboard
13 minutes ago
Lines changed: 23 additions & 23 deletions
Conversation (3)
Conversation
(
3
)
Commits (2)
Commits
(
2
)
Checks (5)
Checks
(
5
)
Files changed (1)
Files changed
(
1
)
Pull Request Toolbar
Pull Request Toolbar
Collapse file tree
All commits
All commits
0
/
1
viewed
Submit comments
Submit
comments
Open diff view settings
Open overview panel
Open comments panel
(
0
)
Filter files…
Filter options
File tree
File tree
composer.lock
composer.lock
Collapse file
composer.lock
composer.lock
composer.lock
Copy file name to clipboard
Lines changed: 23 additions & 23 deletions
Display the source diff
Display the rich diff
Not Viewed
Viewed
Comment on this file
More options
Load Diff
Load Diff
Some generated files are not rendered by default. Learn more about
customizing how changed files appear on GitHub.
customizing how changed files appear on GitHub.
Revert View details LakyLak merged commit 12ac2f1 into master 12 checks passed LakyLak Restore branch deleted the secfix/composer-20260415 branch
github.com/jiminny/app/blob/e4e0e6d46de855cb5293da5ea962719905804147/composer.lock...
|
[{"role":"AXRadioButton","text [{"role":"AXRadioButton","text":"Platform Sprint 2 Q2 - Platform Team - Scrum Board - Jira","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXRadioButton","text":"[SRD-6793] Les Mills activity types not pulling in - Jira","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"[SRD-6793] Les Mills activity types not pulling in - Jira","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"JY-20698 handle failed field sync on playbook import activity types by LakyLak · Pull Request #11988 · jiminny/app","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"JY-20698 handle failed field sync on playbook import activity types by LakyLak · Pull Request #11988 · jiminny/app","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"JY-20692 change confirmation parameter by LakyLak · Pull Request #11986 · jiminny/app","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"JY-20692 change confirmation parameter by LakyLak · Pull Request #11986 · jiminny/app","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"[JY-20543] AJ Reports > Tracking - Jira","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"[JY-20543] AJ Reports > Tracking - Jira","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"[JY-18909] [Part2] Automated reports with Ask Jiminny - Jira","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"[JY-18909] [Part2] Automated reports with Ask Jiminny - Jira","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Ask Jiminny Reports by nikolay-yankov · Pull Request #11894 · jiminny/app","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Ask Jiminny Reports by nikolay-yankov · Pull Request #11894 · jiminny/app","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"New Tab","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"New Tab","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Product Growth Platform | Userpilot","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Product Growth Platform | Userpilot","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Userpilot | Logged-activity","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Userpilot | Logged-activity","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"fix(security): composer dependency updates – 2026-04-15 by github-actions[bot] · Pull Request #11970 · jiminny/app","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"fix(security): composer dependency updates – 2026-04-15 by github-actions[bot] · Pull Request #11970 · jiminny/app","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Pipelines - jiminny/app","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Pipelines - jiminny/app","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Feed — jiminny — Sentry","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Feed — jiminny — Sentry","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"fix(security): composer dependency updates – 2026-04-15 by github-actions[bot] · Pull Request #11970 · jiminny/app","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true},{"role":"AXStaticText","text":"fix(security): composer dependency updates – 2026-04-15 by github-actions[bot] · Pull Request #11970 · jiminny/app","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Close tab","depth":5,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"New Tab","depth":4,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Customize sidebar","depth":6,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Open Google Gemini (⌃X)","depth":6,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Tabs from other devices","depth":6,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Open history (⇧⌘H)","depth":6,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Close bookmarks (⌘B)","depth":6,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXHeading","text":"Bookmarks","depth":5,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Bookmarks","depth":6,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Close sidebar","depth":6,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXTextField","text":"Search bookmarks","depth":7,"help_text":"","role_description":"search text field","subrole":"AXSearchField","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"Skip to content","depth":6,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Skip to content","depth":7,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Open menu","depth":10,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"Homepage (g then d)","depth":9,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"jiminny","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"jiminny","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"app","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"app","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Search or jump to…","depth":9,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Type","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"/","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"to search","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Chat with Copilot","depth":10,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXMenuButton","text":"Open Copilot…","depth":9,"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXMenuButton","text":"Create new...","depth":9,"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXLink","text":"Issues(g then i)","depth":9,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"Pull requests","depth":9,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"Repositories","depth":9,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"You have unread notifications(g then n)","depth":9,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Open user navigation menu","depth":9,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXHeading","text":"Repository navigation","depth":9,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Repository navigation","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Code","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Code","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Pull requests (31)","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Pull requests","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"(","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"31","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":")","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Agents","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Agents","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Actions","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Actions","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Wiki","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Wiki","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Security and quality (22)","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Security and quality","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"(","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"22","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":")","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Insights","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Insights","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Settings","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Settings","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Important update","depth":10,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Important update","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"On April 24 we'll start using GitHub Copilot interaction data for AI model training unless you opt out.","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Review this update","depth":10,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Review this update","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"and manage your preferences in your","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"GitHub account settings","depth":10,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"GitHub account settings","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":".","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Dismiss banner","depth":9,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXHeading","text":"fix(security): composer dependency updates – 2026-04-15 #11970 Edit title","depth":13,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"fix(security): composer dependency updates – 2026-04-15","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"#","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"11970","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Edit title","depth":14,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXMenuButton","text":"Preview","depth":13,"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Preview","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXMenuButton","text":"Code","depth":13,"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Code","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Merged","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"LakyLak","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"LakyLak","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"merged 2 commits into","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"master","depth":15,"role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"master","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"from","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"secfix/composer-20260415","depth":16,"role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"secfix/composer-20260415","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Copy head branch name to clipboard","depth":16,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"13 minutes ago","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Lines changed: 23 additions & 23 deletions","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Conversation (3)","depth":16,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Conversation","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"(","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"3","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":")","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Commits (2)","depth":16,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Commits","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"(","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"2","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":")","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Checks (5)","depth":16,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Checks","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"(","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"5","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":")","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Files changed (1)","depth":16,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true},{"role":"AXStaticText","text":"Files changed","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"(","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"1","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":")","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Pull Request Toolbar","depth":14,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Pull Request Toolbar","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Collapse file tree","depth":14,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":true},{"role":"AXButton","text":"All commits","depth":14,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"All commits","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"0","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"/","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"1","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"viewed","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Submit comments","depth":14,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Submit","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"comments","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXMenuButton","text":"Open diff view settings","depth":14,"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Open overview panel","depth":14,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Open comments panel","depth":14,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"(","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"0","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":")","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXTextField","text":"Filter files…","depth":16,"help_text":"","role_description":"text field","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXMenuButton","text":"Filter options","depth":16,"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXHeading","text":"File tree","depth":15,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"File tree","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"composer.lock","depth":19,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"composer.lock","depth":20,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Collapse file","depth":14,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXHeading","text":"composer.lock","depth":15,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXLink","text":"composer.lock","depth":16,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"composer.lock","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Copy file name to clipboard","depth":15,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Lines changed: 23 additions & 23 deletions","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Display the source diff","depth":16,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Display the rich diff","depth":16,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Not Viewed","depth":14,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Viewed","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Comment on this file","depth":14,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXMenuButton","text":"More options","depth":14,"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":true,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Load Diff","depth":13,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Load Diff","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Some generated files are not rendered by default. Learn more about","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"customizing how changed files appear on GitHub.","depth":14,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"customizing how changed files appear on GitHub.","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Revert View details LakyLak merged commit 12ac2f1 into master 12 checks passed LakyLak Restore branch deleted the secfix/composer-20260415 branch","depth":7,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"github.com/jiminny/app/blob/e4e0e6d46de855cb5293da5ea962719905804147/composer.lock","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"}]...
|
-8920265616913683044
|
3621022755567067507
|
click
|
accessibility
|
NULL
|
Platform Sprint 2 Q2 - Platform Team - Scrum Board Platform Sprint 2 Q2 - Platform Team - Scrum Board - Jira
[SRD-6793] Les Mills activity types not pulling in - Jira
[SRD-6793] Les Mills activity types not pulling in - Jira
JY-20698 handle failed field sync on playbook import activity types by LakyLak · Pull Request #11988 · jiminny/app
JY-20698 handle failed field sync on playbook import activity types by LakyLak · Pull Request #11988 · jiminny/app
JY-20692 change confirmation parameter by LakyLak · Pull Request #11986 · jiminny/app
JY-20692 change confirmation parameter by LakyLak · Pull Request #11986 · jiminny/app
[JY-20543] AJ Reports > Tracking - Jira
[JY-20543] AJ Reports > Tracking - Jira
[JY-18909] [Part2] Automated reports with Ask Jiminny - Jira
[JY-18909] [Part2] Automated reports with Ask Jiminny - Jira
Ask Jiminny Reports by nikolay-yankov · Pull Request #11894 · jiminny/app
Ask Jiminny Reports by nikolay-yankov · Pull Request #11894 · jiminny/app
New Tab
New Tab
Product Growth Platform | Userpilot
Product Growth Platform | Userpilot
Userpilot | Logged-activity
Userpilot | Logged-activity
fix(security): composer dependency updates – 2026-04-15 by github-actions[bot] · Pull Request #11970 · jiminny/app
fix(security): composer dependency updates – 2026-04-15 by github-actions[bot] · Pull Request #11970 · jiminny/app
Pipelines - jiminny/app
Pipelines - jiminny/app
Feed — jiminny — Sentry
Feed — jiminny — Sentry
fix(security): composer dependency updates – 2026-04-15 by github-actions[bot] · Pull Request #11970 · jiminny/app
fix(security): composer dependency updates – 2026-04-15 by github-actions[bot] · Pull Request #11970 · jiminny/app
Close tab
New Tab
Customize sidebar
Open Google Gemini (⌃X)
Tabs from other devices
Open history (⇧⌘H)
Close bookmarks (⌘B)
Bookmarks
Bookmarks
Close sidebar
Search bookmarks
Skip to content
Skip to content
Open menu
Homepage (g then d)
jiminny
jiminny
app
app
Search or jump to…
Type
/
to search
Chat with Copilot
Open Copilot…
Create new...
Issues(g then i)
Pull requests
Repositories
You have unread notifications(g then n)
Open user navigation menu
Repository navigation
Repository navigation
Code
Code
Pull requests (31)
Pull requests
(
31
)
Agents
Agents
Actions
Actions
Wiki
Wiki
Security and quality (22)
Security and quality
(
22
)
Insights
Insights
Settings
Settings
Important update
Important update
On April 24 we'll start using GitHub Copilot interaction data for AI model training unless you opt out.
Review this update
Review this update
and manage your preferences in your
GitHub account settings
GitHub account settings
.
Dismiss banner
fix(security): composer dependency updates – 2026-04-15 #11970 Edit title
fix(security): composer dependency updates – 2026-04-15
#
11970
Edit title
Preview
Preview
Code
Code
Merged
LakyLak
LakyLak
merged 2 commits into
master
master
from
secfix/composer-20260415
secfix/composer-20260415
Copy head branch name to clipboard
13 minutes ago
Lines changed: 23 additions & 23 deletions
Conversation (3)
Conversation
(
3
)
Commits (2)
Commits
(
2
)
Checks (5)
Checks
(
5
)
Files changed (1)
Files changed
(
1
)
Pull Request Toolbar
Pull Request Toolbar
Collapse file tree
All commits
All commits
0
/
1
viewed
Submit comments
Submit
comments
Open diff view settings
Open overview panel
Open comments panel
(
0
)
Filter files…
Filter options
File tree
File tree
composer.lock
composer.lock
Collapse file
composer.lock
composer.lock
composer.lock
Copy file name to clipboard
Lines changed: 23 additions & 23 deletions
Display the source diff
Display the rich diff
Not Viewed
Viewed
Comment on this file
More options
Load Diff
Load Diff
Some generated files are not rendered by default. Learn more about
customizing how changed files appear on GitHub.
customizing how changed files appear on GitHub.
Revert View details LakyLak merged commit 12ac2f1 into master 12 checks passed LakyLak Restore branch deleted the secfix/composer-20260415 branch
github.com/jiminny/app/blob/e4e0e6d46de855cb5293da5ea962719905804147/composer.lock...
|
NULL
|
|
53291
|
NULL
|
0
|
2026-04-20T08:04:38.311228+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-20/1776 /Users/lukas/.screenpipe/data/data/2026-04-20/1776672278311_m2.jpg...
|
Firefox
|
app/composer.lock at e4e0e6d46de855cb5293da5ea9627 app/composer.lock at e4e0e6d46de855cb5293da5ea962719905804147 · jiminny/app — Work...
|
True
|
github.com/jiminny/app/blob/e4e0e6d46de855cb5293da github.com/jiminny/app/blob/e4e0e6d46de855cb5293da5ea962719905804147/composer.lock...
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Platform Sprint 2 Q2 - Platform Team - Scrum Board Platform Sprint 2 Q2 - Platform Team - Scrum Board - Jira
[SRD-6793] Les Mills activity types not pulling in - Jira
[SRD-6793] Les Mills activity types not pulling in - Jira
JY-20698 handle failed field sync on playbook import activity types by LakyLak · Pull Request #11988 · jiminny/app
JY-20698 handle failed field sync on playbook import activity types by LakyLak · Pull Request #11988 · jiminny/app
JY-20692 change confirmation parameter by LakyLak · Pull Request #11986 · jiminny/app
JY-20692 change confirmation parameter by LakyLak · Pull Request #11986 · jiminny/app
[JY-20543] AJ Reports > Tracking - Jira
[JY-20543] AJ Reports > Tracking - Jira
[JY-18909] [Part2] Automated reports with Ask Jiminny - Jira
[JY-18909] [Part2] Automated reports with Ask Jiminny - Jira
Ask Jiminny Reports by nikolay-yankov · Pull Request #11894 · jiminny/app
Ask Jiminny Reports by nikolay-yankov · Pull Request #11894 · jiminny/app
New Tab
New Tab
Product Growth Platform | Userpilot
Product Growth Platform | Userpilot
Userpilot | Logged-activity
Userpilot | Logged-activity
fix(security): composer dependency updates – 2026-04-15 by github-actions[bot] · Pull Request #11970 · jiminny/app
fix(security): composer dependency updates – 2026-04-15 by github-actions[bot] · Pull Request #11970 · jiminny/app
Pipelines - jiminny/app
Pipelines - jiminny/app
Feed — jiminny — Sentry
Feed — jiminny — Sentry
app/composer.lock at e4e0e6d46de855cb5293da5ea962719905804147 · jiminny/app
app/composer.lock at e4e0e6d46de855cb5293da5ea962719905804147 · jiminny/app
Close tab
New Tab
Customize sidebar
Open Google Gemini (⌃X)
Tabs from other devices
Open history (⇧⌘H)
Close bookmarks (⌘B)
Bookmarks
Bookmarks
Close sidebar
Search bookmarks
Skip to content
Skip to content
Open menu
Homepage (g then d)
jiminny
jiminny
app
app
Search or jump to…
Type
/
to search
Chat with Copilot
Open Copilot…
Create new...
Issues(g then i)
Pull requests
Repositories
You have unread notifications(g then n)
Open user navigation menu
Repository navigation
Repository navigation
Code
Code
Pull requests (31)
Pull requests
(
31
)
Agents
Agents
Actions
Actions
Wiki
Wiki
Security and quality (22)
Security and quality
(
22
)
Insights
Insights
Settings
Settings
Important update
Important update
On April 24 we'll start using GitHub Copilot interaction data for AI model training unless you opt out.
Review this update
Review this update
and manage your preferences in your
GitHub account settings
GitHub account settings
.
Dismiss banner
Collapse file tree
Collapse file tree
Files
Files
View file on default branch
e4e0e6d branch
e4e0e6d
Search this repository(forward slash)
Go to file
.circleci
.cursor
.github
.sonarlint
.vscode
app
bootstrap
config
contrib
database
docs
front-end
lang
node_modules
phpstan
public
resources
routes
scripts
storage
tests
.editorconfig
.env.circleci
.env.circleci-nightly
.env.local
.env.production
.env.production-eu
.env.qa
.env.qai
.env.staging
.gitattributes
.gitignore
.php-cs-fixer.dist.php
composer.lock
Breadcrumbs
Breadcrumbs
app
app
composer.lock
composer.lock
Copy path
More file actions
Latest commit
Latest commit
LakyLak
commits by LakyLak
LakyLak
Merge branch 'master' into secfix/composer-20260415
Merge branch 'master' into secfix/composer-20260415
success
Commit e4e0e6d
e4e0e6d
·
41 minutes ago
History
History
History
History
File metadata and controls
File metadata and controls
Code
Code
Blame
Blame
24187 lines (24187 loc) · 871 KB
Your organization can pay for GitHub Copilot
Ask Copilot about this file
Raw
Raw
Copy raw file
Download raw file
You must be on a branch to make or propose changes to this file
More edit options
Open symbols panel
{
"_readme": [
"This file locks the dependencies of your project to a known state",
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
"content-hash": "c5b624c7761f54da18d67e9d401dc59f",
"packages": [
{
"name": "24slides/laravel-saml2",
"version": "2.4.2",
"source": {
"type": "git",
"url": "https://github.com/24Slides/laravel-saml2.git",
"reference": "e7f4938586c65fbe1fdd91552c582cac745223b9"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/24Slides/laravel-saml2/zipball/e7f4938586c65fbe1fdd91552c582cac745223b9",
"reference": "e7f4938586c65fbe1fdd91552c582cac745223b9",
"shasum": ""
},
"require": {
"ext-openssl": "*",
"illuminate/console": "~5.5|^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0",
"illuminate/database": "~5.5|^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0",
"illuminate/support": "~5.4|^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0",
"onelogin/php-saml": "^3.0|^4.0",
"php": ">=7.1",
"ramsey/uuid": "^3.8|^4.0"
},
"require-dev": {
"mockery/mockery": "^0.9.9",
"phpunit/phpunit": "^7.5|^9.0",
"squizlabs/php_codesniffer": "^2.3"
},
"type": "library",
"extra": {
"laravel": {
"aliases": {
"Saml2": "Slides\\Saml2\\Facades\\Auth"
},
"providers": [
"Slides\\Saml2\\ServiceProvider"
]
},
"branch-aliases": {
"dev-master": "2.0.8-dev"
}
},
"autoload": {
"files": [
"src/helpers.php"
],
"psr-4": {
"Slides\\Saml2\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Artem Brezhnev",
"email": "[EMAIL]"
}
],
"description": "SAML2 Service Provider integration to your Laravel 5.4+ application, based on OneLogin toolkit",
"homepage": "https://github.com/24slides/laravel-saml2",
"keywords": [
"SAML2",
"SSO",
"laravel",
"onelogin",
"saml"
],
"support": {
"issues": "https://github.com/24Slides/laravel-saml2/issues",
"source": "https://github.com/24Slides/laravel-saml2/tree/2.4.2"
},
"time": "2025-03-12T12:39:37+00:00"
},
{
"name": "adam-paterson/oauth2-slack",
"version": "1.1.3",
"source": {
"type": "git",
"url": "https://github.com/adam-paterson/oauth2-slack.git",
"reference": "ccc329eb3036a89d110227a4137e15d4a5661678"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/adam-paterson/oauth2-slack/zipball/ccc329eb3036a89d110227a4137e15d4a5661678",
"reference": "ccc329eb3036a89d110227a4137e15d4a5661678",
"shasum": ""
},
"require": {
"league/oauth2-client": "1.*|2.*",
"php": ">=5.6.0"
},
"require-dev": {
"mockery/mockery": "~0.9",
"phpunit/phpunit": "5.6",
"squizlabs/php_codesniffer": "~2.0"
},
"type": "library",
"autoload": {
"psr-4": {
"AdamPaterson\\OAuth2\\Client\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Adam Paterson",
"email": "[EMAIL]"
}
],
"description": "Slack OAuth 2.0 Client Provider for The PHP League OAuth2-Client",
"keywords": [
"Authentication",
"SSO",
"authorization",
"identity",
"idp",
"oauth",
"oauth2",
"single sign on",
"slack",
"slack api"
],
"support": {
"issues": "https://github.com/adam-paterson/oauth2-slack/issues",
"source": "https://github.com/adam-paterson/oauth2-slack/tree/master"
},
"time": "2017-06-20T14:43:31+00:00"
},
{
"name": "asimlqt/php-google-spreadsheet-client",
"version": "v3.0.2",
"source": {
"type": "git",
"url": "https://github.com/asimlqt/php-google-spreadsheet-client.git",
"reference": "fb82cdc12e6cef559a8f1e42dc26e0905f565055"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/asimlqt/php-google-spreadsheet-client/zipball/fb82cdc12e6cef559a8f1e42dc26e0905f565055",
"reference": "fb82cdc12e6cef559a8f1e42dc26e0905f565055",
"shasum": ""
},
"require": {
"php": ">=5.6.0"
},
"require-dev": {
"phpunit/phpunit": "4.4.2"
},
"type": "library",
"autoload": {
"psr-4": {
"Google\\": "src/Google"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"Apache-2.0"
],
"authors": [
{
"name": "Asim Liaquat",
"email": "[EMAIL]",
"role": "Developer"
}
],
"description": "Google Spreadsheet PHP Client",
"homepage": "https://github.com/asimlqt/php-google-spreadsheet-client",
"keywords": [
"google",
"spreadsheet"
],
"support": {
"issues": "https://github.com/asimlqt/php-google-spreadsheet-client/issues",
"source": "https://github.com/asimlqt/php-google-spreadsheet-client/tree/v3.0.2"
},
"time": "2016-11-09T07:43:08+00:00"
},
{
"name": "aws/aws-crt-php",
"version": "v1.2.7",
"source": {
"type": "git",
"url": "https://github.com/awslabs/aws-crt-php.git",
"reference": "d71d9906c7bb63a28295447ba12e74723bd3730e"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/awslabs/aws-crt-php/zipball/d71d9906c7bb63a28295447ba12e74723bd3730e",
"reference": "d71d9906c7bb63a28295447ba12e74723bd3730e",
"shasum": ""
},
"require": {
"php": ">=5.5"
},
"require-dev": {
"phpunit/phpunit": "^4.8.35||^5.6.3||^9.5",
"yoast/phpunit-polyfills": "^1.0"
},
"suggest": {
"ext-awscrt": "Make sure you install awscrt native extension to use any of the functionality."
},
"type": "library",
"autoload": {
"classmap": [
"src/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"Apache-2.0"
],
"authors": [
{
"name": "AWS SDK Common Runtime Team",
"email": "[EMAIL]"
}
],
"description": "AWS Common Runtime for PHP",
"homepage": "https://github.com/awslabs/aws-crt-php",
"keywords": [
"amazon",
"aws",
"crt",
"sdk"
],
"support": {
"issues": "https://github.com/awslabs/aws-crt-php/issues",
"source": "https://github.com/awslabs/aws-crt-php/tree/v1.2.7"
},
"time": "2024-10-18T22:15:13+00:00"
},
{
"name": "aws/aws-sdk-php",
"version": "3.373.2",
"source": {
"type": "git",
"url": "https://github.com/aws/aws-sdk-php.git",
"reference": "483fba51c28b3a0c0647bf5100e0edca82090b18"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/483fba51c28b3a0c0647bf5100e0edca82090b18",
"reference": "483fba51c28b3a0c0647bf5100e0edca82090b18",
"shasum": ""
},
"require": {
"aws/aws-crt-php": "^1.2.3",
"ext-json": "*",
"ext-pcre": "*",
"ext-simplexml": "*",
"guzzlehttp/guzzle": "^7.4.5",
"guzzlehttp/promises": "^2.0",
"guzzlehttp/psr7": "^2.4.5",
"mtdowling/jmespath.php": "^2.8.0",
"php": ">=8.1",
"psr/http-message": "^1.0 || ^2.0",
"symfony/filesystem": "^v5.4.45 || ^v6.4.3 || ^v7.1.0 || ^v8.0.0"
},
"require-dev": {
"andrewsville/php-token-reflection": "^1.4",
"aws/aws-php-sns-message-validator": "~1.0",
"behat/behat": "~3.0",
"composer/composer": "^2.7.8",
"dms/phpunit-arraysubset-asserts": "^v0.5.0",
"doctrine/cache": "~1.4",
"ext-dom": "*",
"ext-openssl": "*",
"ext-sockets": "*",
"phpunit/phpunit": "^10.0",
"psr/cache": "^2.0 || ^3.0",
"psr/simple-cache": "^2.0 || ^3.0",
"sebastian/comparator": "^1.2.3 || ^4.0 || ^5.0",
"yoast/phpunit-polyfills": "^2.0"
},
"suggest": {
"aws/aws-php-sns-message-validator": "To validate incoming SNS notifications",
"doctrine/cache": "To use the DoctrineCacheAdapter",
"ext-curl": "To send requests using cURL",
"ext-openssl": "Allows working with CloudFront private distributions and verifying received SNS messages",
"ext-pcntl": "To use client-side monitoring",
"ext-sockets": "To use client-side monitoring"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "3.0-dev"
}
},
"autoload": {
"files": [
"src/functions.php"
],
"psr-4": {
"Aws\\": "src/"
},
"exclude-from-classmap": [
"src/data/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"Apache-2.0"
],
"authors": [
{
"name": "Amazon Web Services",
"homepage": "https://aws.amazon.com"
}
],
"description": "AWS SDK for PHP - Use Amazon Web Services in your PHP project",
"homepage": "https://aws.amazon.com/sdk-for-php",
"keywords": [
"amazon",
"aws",
"cloud",
"dynamodb",
"ec2",
"glacier",
"s3",
"sdk"
],
"support": {
"forum": "https://github.com/aws/aws-sdk-php/discussions",
"issues": "https://github.com/aws/aws-sdk-php/issues",
"source": "https://github.com/aws/aws-sdk-php/tree/3.373.2"
},
"time": "2026-03-13T18:08:30+00:00"
},
{
"name": "aws/aws-sdk-php-laravel",
"version": "3.10.0",
"source": {
"type": "git",
"url": "https://github.com/aws/aws-sdk-php-laravel.git",
"reference": "c1477b1efd43a61238090c0e8f1ede979573dd4b"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/aws/aws-sdk-php-laravel/zipball/c1477b1efd43a61238090c0e8f1ede979573dd4b",
"reference": "c1477b1efd43a61238090c0e8f1ede979573dd4b",
"shasum": ""
},
"require": {
"aws/aws-sdk-php": "^3.338.0",
"illuminate/support": "^6.0 || ^7.0 || ^8.0 || ^9.0 || ^10.0 || ^11.0 || ^12.0",
"php": ">=8.1"
},
"require-dev": {
"phpunit/phpunit": "^8.0 || ^9.0",
"vlucas/phpdotenv": "^1.0 || ^2.0 || ^3.0 || ^4.0 || ^5.0",
"yoast/phpunit-polyfills": "^1.0"
},
"suggest": {
"laravel/framework": "To test the Laravel bindings",
"laravel/lumen-framework": "To test the Lumen bindings"
},
"type": "library",
"extra": {
"laravel": {
"aliases": {
"AWS": "Aws\\Laravel\\AwsFacade"
},
"providers": [
"Aws\\Laravel\\AwsServiceProvider"
]
}
},
"autoload": {
"psr-4": {
"Aws\\Laravel\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"Apache-2.0"
],
"authors": [
{
"name": "Amazon Web Services",
"homepage": "http://aws.amazon.com"
}
],
"description": "A simple Laravel 6/7/8/9/10/11/12 service provider for including the AWS SDK for PHP.",
"homepage": "https://aws.amazon.com/sdk-for-php/",
"keywords": [
"amazon",
"aws",
"dynamodb",
"ec2",
"laravel",
"laravel 10",
"laravel 11",
"laravel 12",
"laravel 6",
"laravel 7",
"laravel 8",
"laravel 9",
"s3",
"sdk"
],
"support": {
"issues": "https://github.com/aws/aws-sdk-php-laravel/issues",
"source": "https://github.com/aws/aws-sdk-php-laravel/tree/3.10.0"
},
"time": "2025-02-26T22:25:56+00:00"
},
{
"name": "bepsvpt/secure-headers",
"version": "9.0.0",
"source": {
"type": "git",
"url": "https://github.com/bepsvpt/secure-headers.git",
"reference": "7efbc3d8b988051b5ff81c4cacd1d12e875528ed"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/bepsvpt/secure-headers/zipball/7efbc3d8b988051b5ff81c4cacd1d12e875528ed",
"reference": "7efbc3d8b988051b5ff81c4cacd1d12e875528ed",
"shasum": ""
},
"require": {
"ext-json": "*",
"php": "^7.1 || ^8.0"
},
"require-dev": {
"ergebnis/composer-normalize": "^2.42",
"ext-xdebug": "*",
"laravel/pint": "^1.14",
"orchestra/testbench": "^3.1 || ^4.18 || ^5.20 || ^6.43 || ^7.41 || ^8.22 || ^9.0",
"phpstan/phpstan": "^1.10",
"phpunit/phpunit": "^5.7 || ^6.5 || ^7.5 || ^8.5 || ^9.6 || ^10.5"
},
"type": "library",
"extra": {
"laravel": {
"providers": [
"Bepsvpt\\SecureHeaders\\SecureHeadersServiceProvider"
]
}
},
"autoload": {
"files": [
"src/helpers.php"
],
"psr-4": {
"Bepsvpt\\SecureHeaders\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "bepsvpt",
"email": "[EMAIL]"
}
],
"description": "Add security related headers to HTTP response. The package includes Service Providers for easy Laravel integration.",
"homepage": "https://github.com/bepsvpt/secure-headers",
"keywords": [
"clear-site-data",
"content-security-policy",
"csp",
"except-ct",
"feature-policy",
"header",
"hsts",
"https",
"laravel",
"permissions-policy",
"referrer-policy"
],
"support": {
"issues": "https://github.com/bepsvpt/secure-headers/issues",
"source": "https://github.com/bepsvpt/secure-headers/tree/9.0.0"
},
"funding": [
{
"url": "https://opencollective.com/secure-headers",
"type": "open_collective"
}
],
"time": "2025-01-18T07:18:04+00:00"
},
{
"name": "brick/math",
"version": "0.14.8",
"source": {
"type": "git",
"url": "https://github.com/brick/math.git",
"reference": "63422359a44b7f06cae63c3b429b59e8efcc0629"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/brick/math/zipball/63422359a44b7f06cae63c3b429b59e8efcc0629",
"reference": "63422359a44b7f06cae63c3b429b59e8efcc0629",
"shasum": ""
},
"require": {
"php": "^8.2"
},
"require-dev": {
"php-coveralls/php-coveralls": "^2.2",
"phpstan/phpstan": "2.1.22",
"phpunit/phpunit": "^11.5"
},
"type": "library",
"autoload": {
"psr-4": {
"Brick\\Math\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"description": "Arbitrary-precision arithmetic library",
"keywords": [
"Arbitrary-precision",
"BigInteger",
"BigRational",
"arithmetic",
"bigdecimal",
"bignum",
"bignumber",
"brick",
"decimal",
"integer",
"math",
"mathematics",
"rational"
],
"support": {
"issues": "https://github.com/brick/math/issues",
"source": "https://github.com/brick/math/tree/0.14.8"
},
"funding": [
{
"url": "https://github.com/BenMorel",
"type": "github"
}
],
"time": "2026-02-10T14:33:43+00:00"
},
{
"name": "carbonphp/carbon-doctrine-types",
"version": "3.2.0",
"source": {
"type": "git",
"url": "https://github.com/CarbonPHP/carbon-doctrine-types.git",
"reference": "18ba5ddfec8976260ead6e866180bd5d2f71aa1d"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/CarbonPHP/carbon-doctrine-types/zipball/18ba5ddfec8976260ead6e866180bd5d2f71aa1d",
"reference": "18ba5ddfec8976260ead6e866180bd5d2f71aa1d",
"shasum": ""
},
"require": {
"php": "^8.1"
},
"conflict": {
"doctrine/dbal": "<4.0.0 || >=5.0.0"
},
"require-dev": {
"doctrine/dbal": "^4.0.0",
"nesbot/carbon": "^2.71.0 || ^3.0.0",
"phpunit/phpunit": "^10.3"
},
"type": "library",
"autoload": {
"psr-4": {
"Carbon\\Doctrine\\": "src/Carbon/Doctrine/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "KyleKatarn",
"email": "[EMAIL]"
}
],
"description": "Types to use Carbon in Doctrine",
"keywords": [
"carbon",
"date",
"datetime",
"doctrine",
"time"
],
"support": {
"issues": "https://github.com/CarbonPHP/carbon-doctrine-types/issues",
"source": "https://github.com/CarbonPHP/carbon-doctrine-types/tree/3.2.0"
},
"funding": [
{
"url": "https://github.com/kylekatarnls",
"type": "github"
},
{
"url": "https://opencollective.com/Carbon",
"type": "open_collective"
},
{
"url": "https://tidelift.com/funding/github/packagist/nesbot/carbon",
"type": "tidelift"
}
],
"time": "2024-02-09T16:56:22+00:00"
},
{
"name": "chadhutchins/oauth2-slack",
"version": "1.2.2",
"source": {
"type": "git",
"url": "https://github.com/chadhutchins/oauth2-slack.git",
"reference": "f738c0ed2695208353ee95b6e24e2d1ae412843a"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/chadhutchins/oauth2-slack/zipball/f738c0ed2695208353ee95b6e24e2d1ae412843a",
"reference": "f738c0ed2695208353ee95b6e24e2d1ae412843a",
"shasum": ""
},
"require": {
"league/oauth2-client": "1.*|2.*",
"php": ">=5.6.0"
},
"require-dev": {
"mockery/mockery": "~0.9",
"phpunit/phpunit": "5.6",
"squizlabs/php_codesniffer": "~2.0"
},
"type": "library",
"autoload": {
"psr-4": {
"Chadhutchins\\OAuth2\\Client\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Adam Paterson",
"email": "[EMAIL]"
},
{
"name": "Chad Hutchins",
"email": "[EMAIL]"
}
],
"description": "Slack OAuth 2.0 Client Provider for The PHP League OAuth2-Client",
"keywords": [
"Authentication",
"SSO",
"authorization",
"identity",
"idp",
"oauth",
"oauth2",
"single sign on",
"slack",
"slack api"
],
"support": {
"source": "https://github.com/chadhutchins/oauth2-slack/tree/1.2.2"
},
"time": "2020-11-23T15:41:35+00:00"
},
{
"name": "chaseconey/laravel-datadog-helper",
"version": "1.3.0",
"source": {
"type": "git",
"url": "https://github.com/chaseconey/laravel-datadog-helper.git",
"reference": "7219004fa87bcf226d5d5f1d268a555eef3d3a4b"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/chaseconey/laravel-datadog-helper/zipball/7219004fa87bcf226d5d5f1d268a555eef3d3a4b",
"reference": "7219004fa87bcf226d5d5f1d268a555eef3d3a4b",
"shasum": ""
},
"require": {
"datadog/php-datadogstatsd": "^1.4.0",
"illuminate/support": ">=5.1",
"php": ">=5.4.0"
},
"require-dev": {
"phpunit/phpunit": "~4.0||~5.0",
"scrutinizer/ocular": "~1.1",
"squizlabs/php_codesniffer": "~2.3"
},
"type": "library",
"extra": {
"laravel": {
"aliases": {
"Datadog": "ChaseConey\\LaravelDatadogHelper\\Datadog"
},
"providers": [
"ChaseConey\\LaravelDatadogHelper\\LaravelDatadogHelperServiceProvider"
]
}
},
"autoload": {
"psr-4": {
"ChaseConey\\LaravelDatadogHelper\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Chase Coney",
"email": "[EMAIL]",
"homepage": "http://chaseconey.com",
"role": "Developer"
}
],
"description": "A Laravel Datadog helper package.",
"homepage": "https://github.com/chaseconey/laravel-datadog-helper",
"keywords": [
"chaseconey",
"laravel-datadog-helper"
],
"support": {
"issues": "https://github.com/chaseconey/laravel-datadog-helper/issues",
"source": "https://github.com/chaseconey/laravel-datadog-helper/tree/1.3.0"
},
"funding": [
{
"url": "https://github.com/chaseconey",
"type": "github"
}
],
"time": "2025-07-28T21:50:15+00:00"
},
{
"name": "chrisyue/php-m3u8",
"version": "4.0.3",
"source": {
"type": "git",
"url": "https://github.com/chrisyue/php-m3u8.git",
"reference": "122745bda7c2cfcedf6b2893b48a028f87109717"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/chrisyue/php-m3u8/zipball/122745bda7c2cfcedf6b2893b48a028f87109717",
"reference": "122745bda7c2cfcedf6b2893b48a028f87109717",
"shasum": ""
},
"require": {
"php": ">=7.4"
},
"require-dev": {
"friendsofphp/php-cs-fixer": "^3",
"phpunit/phpunit": "^8"
},
"type": "library",
"autoload": {
"psr-4": {
"Chrisyue\\PhpM3u8\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "chrisyue",
"email": "[EMAIL]",
"homepage": "https://chrisyue.com"
}
],
"description": "PHP M3U8 parser / dumper",
"homepage": "http://chrisyue.com",
"keywords": [
"dumper",
"m3u8",
"parser"
],
"support": {
"issues": "https://github.com/chrisyue/php-m3u8/issues",
"source": "https://github.com/chrisyue/php-m3u8/tree/4.0.3"
},
"time": "2022-05-23T12:03:05+00:00"
},
{
"name": "clue/stream-filter",
"version": "v1.7.0",
"source": {
"type": "git",
"url": "https://github.com/clue/stream-filter.git",
"reference": "049509fef80032cb3f051595029ab75b49a3c2f7"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/clue/stream-filter/zipball/049509fef80032cb3f051595029ab75b49a3c2f7",
"reference": "049509fef80032cb3f051595029ab75b49a3c2f7",
"shasum": ""
},
"require": {
"php": ">=5.3"
},
"require-dev": {
"phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36"
},
"type": "library",
"autoload": {
"files": [
"src/functions_include.php"
],
"psr-4": {
"Clue\\StreamFilter\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Christian Lück",
"email": "[EMAIL]"
}
],
"description": "A simple and modern approach to stream filtering in PHP",
"homepage": "https://github.com/clue/stream-filter",
"keywords": [
"bucket brigade",
"callback",
"filter",
"php_user_filter",
"stream",
"stream_filter_append",
"stream_filter_register"
],
"support": {
"issues": "https://github.com/clue/stream-filter/issues",
"source": "https://github.com/clue/stream-filter/tree/v1.7.0"
},
"funding": [
{
"url": "https://clue.engineering/support",
"type": "custom"
},
{
"url": "https://github.com/clue",
"type": "github"
}
],
"time": "2023-12-20T15:40:13+00:00"
},
{
"name": "composer/semver",
"version": "3.4.4",
"source": {
"type": "git",
"url": "https://github.com/composer/semver.git",
"reference": "198166618906cb2de69b95d7d47e5fa8aa1b2b95"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/composer/semver/zipball/198166618906cb2de69b95d7d47e5fa8aa1b2b95",
"reference": "198166618906cb2de69b95d7d47e5fa8aa1b2b95",
"shasum": ""
},
"require": {
"php": "^5.3.2 || ^7.0 || ^8.0"
},
"require-dev": {
"phpstan/phpstan": "^1.11",
"symfony/phpunit-bridge": "^3 || ^7"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-main": "3.x-dev"
}
},
"autoload": {
"psr-4": {
"Composer\\Semver\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Nils Adermann",
"email": "[EMAIL]",
"homepage": "http://www.naderman.de"
},
{
"name": "Jordi Boggiano",
"email": "[EMAIL]",
"homepage": "http://seld.be"
},
{
"name": "Rob Bast",
"email": "[EMAIL]",
"homepage": "http://robbast.nl"
}
],
"description": "Semver library that offers utilities, version constraint parsing and validation.",
"keywords": [
"semantic",
"semver",
"validation",
"versioning"
],
"support": {
"irc": "ircs://irc.libera.chat:6697/composer",
"issues": "https://github.com/composer/semver/issues",
"source": "https://github.com/composer/semver/tree/3.4.4"
},
"funding": [
{
"url": "https://packagist.com",
"type": "custom"
},
{
"url": "https://github.com/composer",
"type": "github"
}
],
"time": "2025-08-20T19:15:30+00:00"
},
{
"name": "daniti/oauth2-pipedrive",
"version": "dev-master",
"source": {
"type": "git",
"url": "https://github.com/jiminny/oauth2-pipedrive.git",
"reference": "e8b269cfe30ea92817acd0dc3efc9da54fe390bf"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/jiminny/oauth2-pipedrive/zipball/e8b269cfe30ea92817acd0dc3efc9da54fe390bf",
"reference": "e8b269cfe30ea92817acd0dc3efc9da54fe390bf",
"shasum": ""
},
"require": {
"league/oauth2-client": "^2.3"
},
"default-branch": true,
"type": "library",
"autoload": {
"psr-4": {
"Daniti\\OAuth2\\Client\\Provider\\": "src/"
}
},
"license": [
"MIT"
],
"authors": [
{
"name": "Daniele Timo",
"email": "[EMAIL]"
}
],
"description": "Pipedrive OAuth 2.0 client provider for PHP League OAuth2 Client",
"support": {
"source": "https://github.com/jiminny/oauth2-pipedrive/tree/master",
"issues": "https://github.com/jiminny/oauth2-pipedrive/issues"
},
"time": "2021-03-15T17:10:01+00:00"
},
{
"name": "datadog/php-datadogstatsd",
"version": "1.7.1",
"source": {
"type": "git",
"url": "https://github.com/DataDog/php-datadogstatsd.git",
"reference": "f0d61f11e01780ef7d96daed9781c7db9311a568"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/DataDog/php-datadogstatsd/zipball/f0d61f11e01780ef7d96daed9781c7db9311a568",
"reference": "f0d61f11e01780ef7d96daed9781c7db9311a568",
"shasum": ""
},
"require": {
"ext-sockets": "*",
"php": ">=5.6.0"
},
"require-dev": {
"mikey179/vfsstream": "^1.6",
"squizlabs/php_codesniffer": "^3.3",
"yoast/phpunit-polyfills": "^1.0.1"
},
"type": "library",
"autoload": {
"psr-4": {
"DataDog\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Alex Corley",
"email": "[EMAIL]",
"role": "Developer"
},
{
"name": "Datadog",
"email": "[EMAIL]",
"role": "Developer"
}
],
"description": "An extremely simple PHP datadogstatsd client",
"homepage": "https://www.datadoghq.com/",
"keywords": [
"DataDog",
"check",
"error-reporting",
"health",
"logging",
"monitoring",
"statsd"
],
"support": {
"chat": "https://chat.datadoghq.com/",
"email": "[EMAIL]",
"irc": "irc://irc.freenode.net/datadog",
"issues": "https://github.com/DataDog/php-datadogstatsd/issues",
"source": "https://github.com/DataDog/php-datadogstatsd"
},
"time": "2025-08-25T15:42:11+00:00"
},
{
"name": "defuse/php-encryption",
"version": "v2.4.0",
"source": {
"type": "git",
"url": "https://github.com/defuse/php-encryption.git",
"reference": "f53396c2d34225064647a05ca76c1da9d99e5828"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/defuse/php-encryption/zipball/f53396c2d34225064647a05ca76c1da9d99e5828",
"reference": "f53396c2d34225064647a05ca76c1da9d99e5828",
"shasum": ""
},
"require": {
"ext-openssl": "*",
"paragonie/random_compat": ">= 2",
"php": ">=5.6.0"
},
"require-dev": {
"phpunit/phpunit": "^5|^6|^7|^8|^9|^10",
"yoast/phpunit-polyfills": "^2.0.0"
},
"bin": [
"bin/generate-defuse-key"
],
"type": "library",
"autoload": {
"psr-4": {
"Defuse\\Crypto\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Taylor Hornby",
"email": "[EMAIL]",
"homepage": "https://defuse.ca/"
},
{
"name": "Scott Arciszewski",
"email": "[EMAIL]",
"homepage": "https://paragonie.com"
}
],
"description": "Secure PHP Encryption Library",
"keywords": [
"aes",
"authenticated encryption",
"cipher",
"crypto",
"cryptography",
"encrypt",
"encryption",
"openssl",
"security",
"symmetric key cryptography"
],
"support": {
"issues": "https://github.com/defuse/php-encryption/issues",
"source": "https://github.com/defuse/php-encryption/tree/v2.4.0"
},
"time": "2023-06-19T06:10:36+00:00"
},
{
"name": "devio/pipedrive",
"version": "2.17.0",
"source": {
"type": "git",
"url": "https://github.com/IsraelOrtuno/pipedrive.git",
"reference": "7d3edfb12487b50046b0a91b1bd7dbe4002200e5"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/IsraelOrtuno/pipedrive/zipball/7d3edfb12487b50046b0a91b1bd7dbe4002200e5",
"reference": "7d3edfb12487b50046b0a91b1bd7dbe4002200e5",
"shasum": ""
},
"require": {
"guzzlehttp/guzzle": "~7.0|~6.0|~5.0|~4.0",
"illuminate/support": ">=4.0",
"laravel/helpers": "^1.0"
},
"require-dev": {
"phpspec/phpspec": "^2.4",
"symfony/var-dumper": "^2.7"
},
"type": "library",
"extra": {
"laravel": {
"aliases": {
"Pipedrive": "Devio\\Pipedrive\\PipedriveFacade"
},
"providers": [
"Devio\\Pipedrive\\PipedriveServiceProvider"
]
}
},
"autoload": {
"psr-4": {
"Devio\\Pipedrive\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Israel Ortuño",
"email": "[EMAIL]"
}
],
"description": "Complete Pipedrive API client for PHP and/or Laravel",
"keywords": [
"api",
"client",
"laravel",
"pipedrive"
],
"support": {
"issues": "https://github.com/IsraelOrtuno/pipedrive/issues",
"source": "https://github.com/IsraelOrtuno/pipedrive/tree/2.17.0"
},
"time": "2024-11-10T18:47:25+00:00"
},
{
"name": "dflydev/dot-access-data",
"version": "v3.0.3",
"source": {
"type": "git",
"url": "https://github.com/dflydev/dflydev-dot-access-data.git",
"reference": "a23a2bf4f31d3518f3ecb38660c95715dfead60f"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/dflydev/dflydev-dot-access-data/zipball/a23a2bf4f31d3518f3ecb38660c95715dfead60f",
"reference": "a23a2bf4f31d3518f3ecb38660c95715dfead60f",
"shasum": ""
},
"require": {
"php": "^7.1 || ^8.0"
},
"require-dev": {
"phpstan/phpstan": "^0.12.42",
"phpunit/phpunit": "^7.5 || ^8.5 || ^9.3",
"scrutinizer/ocular": "1.6.0",
"squizlabs/php_codesniffer": "^3.5",
"vimeo/psalm": "^4.0.0"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-main": "3.x-dev"
}
},
"autoload": {
"psr-4": {
"Dflydev\\DotAccessData\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Dragonfly Development Inc.",
"email": "[EMAIL]",
"homepage": "http://dflydev.com"
},
{
"name": "Beau Simensen",
"email": "[EMAIL]",
"homepage": "http://beausimensen.com"
},
{
"name": "Carlos Frutos",
"email": "[EMAIL]",
"homepage": "https://github.com/cfrutos"
},
{
"name": "Colin O'Dell",
"email": "[EMAIL]",
"homepage": "https://www.colinodell.com"
}
],
"description": "Given a deep data structure, access data by dot notation.",
"homepage": "https://github.com/dflydev/dflydev-dot-access-data",
"keywords": [
"access",
"data",
"dot",
"notation"
],
"support": {
"issues": "https://github.com/dflydev/dflydev-dot-access-data/issues",
"source": "https://github.com/dflydev/dflydev-dot-access-data/tree/v3.0.3"
},
"time": "2024-07-08T12:26:09+00:00"
},
{
"name": "doctrine/annotations",
"version": "2.0.2",
"source": {
"type": "git",
"url": "https://github.com/doctrine/annotations.git",
"reference": "901c2ee5d26eb64ff43c47976e114bf00843acf7"
...
|
[{"role":"AXRadioButton","text [{"role":"AXRadioButton","text":"Platform Sprint 2 Q2 - Platform Team - Scrum Board - Jira","depth":4,"bounds":{"left":0.0018284575,"top":0.0518755,"width":0.07596409,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXRadioButton","text":"[SRD-6793] Les Mills activity types not pulling in - Jira","depth":4,"bounds":{"left":0.0,"top":0.09497207,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"[SRD-6793] Les Mills activity types not pulling in - Jira","depth":5,"bounds":{"left":0.013297873,"top":0.10614525,"width":0.09524601,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"JY-20698 handle failed field sync on playbook import activity types by LakyLak · Pull Request #11988 · jiminny/app","depth":4,"bounds":{"left":0.0,"top":0.12769353,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"JY-20698 handle failed field sync on playbook import activity types by LakyLak · Pull Request #11988 · jiminny/app","depth":5,"bounds":{"left":0.013297873,"top":0.13886672,"width":0.19963431,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"JY-20692 change confirmation parameter by LakyLak · Pull Request #11986 · jiminny/app","depth":4,"bounds":{"left":0.0,"top":0.16041501,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"JY-20692 change confirmation parameter by LakyLak · Pull Request #11986 · jiminny/app","depth":5,"bounds":{"left":0.013297873,"top":0.17158818,"width":0.15525267,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"[JY-20543] AJ Reports > Tracking - Jira","depth":4,"bounds":{"left":0.0,"top":0.19313647,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"[JY-20543] AJ Reports > Tracking - Jira","depth":5,"bounds":{"left":0.013297873,"top":0.20430966,"width":0.06981383,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"[JY-18909] [Part2] Automated reports with Ask Jiminny - Jira","depth":4,"bounds":{"left":0.0,"top":0.22585794,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"[JY-18909] [Part2] Automated reports with Ask Jiminny - Jira","depth":5,"bounds":{"left":0.013297873,"top":0.23703113,"width":0.10688165,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Ask Jiminny Reports by nikolay-yankov · Pull Request #11894 · jiminny/app","depth":4,"bounds":{"left":0.0,"top":0.2585794,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Ask Jiminny Reports by nikolay-yankov · Pull Request #11894 · jiminny/app","depth":5,"bounds":{"left":0.013297873,"top":0.2697526,"width":0.12915559,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"New Tab","depth":4,"bounds":{"left":0.0,"top":0.29130086,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"New Tab","depth":5,"bounds":{"left":0.013297873,"top":0.30247405,"width":0.014960106,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Product Growth Platform | Userpilot","depth":4,"bounds":{"left":0.0,"top":0.32402235,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Product Growth Platform | Userpilot","depth":5,"bounds":{"left":0.013297873,"top":0.33519554,"width":0.06200133,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Userpilot | Logged-activity","depth":4,"bounds":{"left":0.0,"top":0.3567438,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Userpilot | Logged-activity","depth":5,"bounds":{"left":0.013297873,"top":0.367917,"width":0.04637633,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"fix(security): composer dependency updates – 2026-04-15 by github-actions[bot] · Pull Request #11970 · jiminny/app","depth":4,"bounds":{"left":0.0,"top":0.38946527,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"fix(security): composer dependency updates – 2026-04-15 by github-actions[bot] · Pull Request #11970 · jiminny/app","depth":5,"bounds":{"left":0.013297873,"top":0.40063846,"width":0.2052859,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Pipelines - jiminny/app","depth":4,"bounds":{"left":0.0,"top":0.42218676,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Pipelines - jiminny/app","depth":5,"bounds":{"left":0.013297873,"top":0.43335995,"width":0.039228722,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Feed — jiminny — Sentry","depth":4,"bounds":{"left":0.0,"top":0.45490822,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Feed — jiminny — Sentry","depth":5,"bounds":{"left":0.013297873,"top":0.4660814,"width":0.042719416,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"app/composer.lock at e4e0e6d46de855cb5293da5ea962719905804147 · jiminny/app","depth":4,"bounds":{"left":0.0,"top":0.48762968,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true},{"role":"AXStaticText","text":"app/composer.lock at e4e0e6d46de855cb5293da5ea962719905804147 · jiminny/app","depth":5,"bounds":{"left":0.013297873,"top":0.49880287,"width":0.1505984,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Close tab","depth":5,"bounds":{"left":0.06732048,"top":0.49481246,"width":0.007978723,"height":0.01915403},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"New Tab","depth":4,"bounds":{"left":0.0028257978,"top":0.5219473,"width":0.07413564,"height":0.025538707},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Customize sidebar","depth":6,"bounds":{"left":0.0028257978,"top":0.97007185,"width":0.010638298,"height":0.025538707},"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Open Google Gemini (⌃X)","depth":6,"bounds":{"left":0.013796543,"top":0.97007185,"width":0.010638298,"height":0.025538707},"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Tabs from other devices","depth":6,"bounds":{"left":0.024933511,"top":0.97007185,"width":0.010638298,"height":0.025538707},"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Open history (⇧⌘H)","depth":6,"bounds":{"left":0.036070477,"top":0.97007185,"width":0.010638298,"height":0.025538707},"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Close bookmarks (⌘B)","depth":6,"bounds":{"left":0.04720745,"top":0.97007185,"width":0.010638298,"height":0.025538707},"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXHeading","text":"Bookmarks","depth":5,"bounds":{"left":0.083277926,"top":0.06943336,"width":0.026761968,"height":0.014764565},"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Bookmarks","depth":6,"bounds":{"left":0.083277926,"top":0.06943336,"width":0.026761968,"height":0.014764565},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Close sidebar","depth":6,"bounds":{"left":0.1783577,"top":0.06424581,"width":0.010638298,"height":0.025538707},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXTextField","text":"Search bookmarks","depth":7,"bounds":{"left":0.082446806,"top":0.09976058,"width":0.107546546,"height":0.025538707},"help_text":"","role_description":"search text field","subrole":"AXSearchField","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"Skip to content","depth":6,"bounds":{"left":0.19547872,"top":0.0518755,"width":0.0003324468,"height":0.0007980846},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Skip to content","depth":7,"bounds":{"left":0.19547872,"top":0.05347167,"width":0.0029920214,"height":0.21468475},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Open menu","depth":10,"bounds":{"left":0.20079787,"top":0.06464485,"width":0.010638298,"height":0.025538707},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"Homepage (g then d)","depth":9,"bounds":{"left":0.21542554,"top":0.06464485,"width":0.010638298,"height":0.025538707},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"jiminny","depth":12,"bounds":{"left":0.2287234,"top":0.06464485,"width":0.018949468,"height":0.025538707},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"jiminny","depth":14,"bounds":{"left":0.23071809,"top":0.07063048,"width":0.014960106,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"app","depth":12,"bounds":{"left":0.2526596,"top":0.06464485,"width":0.017785905,"height":0.025538707},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"app","depth":14,"bounds":{"left":0.25465426,"top":0.07063048,"width":0.008477394,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Search or jump to…","depth":9,"bounds":{"left":0.8171542,"top":0.06464485,"width":0.06565824,"height":0.025538707},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Type","depth":12,"bounds":{"left":0.8294548,"top":0.07063048,"width":0.011801862,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"/","depth":12,"bounds":{"left":0.84258646,"top":0.07222666,"width":0.002493351,"height":0.011572227},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"to search","depth":12,"bounds":{"left":0.8465758,"top":0.07063048,"width":0.021276595,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Chat with Copilot","depth":10,"bounds":{"left":0.88480717,"top":0.06464485,"width":0.010638298,"height":0.025538707},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXMenuButton","text":"Open Copilot…","depth":9,"bounds":{"left":0.89511305,"top":0.06464485,"width":0.008643617,"height":0.025538707},"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXMenuButton","text":"Create new...","depth":9,"bounds":{"left":0.91173536,"top":0.06464485,"width":0.01662234,"height":0.025538707},"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXLink","text":"Issues(g then i)","depth":9,"bounds":{"left":0.9310173,"top":0.06464485,"width":0.010638298,"height":0.025538707},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"Pull requests","depth":9,"bounds":{"left":0.94431514,"top":0.06464485,"width":0.010638298,"height":0.025538707},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"Repositories","depth":9,"bounds":{"left":0.95761305,"top":0.06464485,"width":0.010638298,"height":0.025538707},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"You have unread notifications(g then n)","depth":9,"bounds":{"left":0.9709109,"top":0.06464485,"width":0.010638298,"height":0.025538707},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Open user navigation menu","depth":9,"bounds":{"left":0.98420876,"top":0.06464485,"width":0.010638298,"height":0.025538707},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXHeading","text":"Repository navigation","depth":9,"bounds":{"left":0.19514628,"top":0.051077414,"width":0.0003324468,"height":0.0007980846},"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Repository navigation","depth":10,"bounds":{"left":0.19514628,"top":0.05387071,"width":0.0787899,"height":0.023144454},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Code","depth":12,"bounds":{"left":0.20079787,"top":0.09936153,"width":0.025099734,"height":0.026336791},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Code","depth":14,"bounds":{"left":0.21143617,"top":0.10574621,"width":0.011801862,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Pull requests (31)","depth":12,"bounds":{"left":0.22855718,"top":0.09936153,"width":0.054521278,"height":0.026336791},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Pull requests","depth":14,"bounds":{"left":0.23986037,"top":0.10574621,"width":0.027925532,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"(","depth":14,"bounds":{"left":0.2711104,"top":0.113727055,"width":0.0029920214,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"31","depth":14,"bounds":{"left":0.2741024,"top":0.113727055,"width":0.004986702,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":")","depth":14,"bounds":{"left":0.2790891,"top":0.113727055,"width":0.0016622341,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Agents","depth":12,"bounds":{"left":0.28573802,"top":0.09936153,"width":0.029089095,"height":0.026336791},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Agents","depth":14,"bounds":{"left":0.29670876,"top":0.10574621,"width":0.014960106,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Actions","depth":12,"bounds":{"left":0.3174867,"top":0.09936153,"width":0.03025266,"height":0.026336791},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Actions","depth":14,"bounds":{"left":0.32862368,"top":0.10574621,"width":0.015957447,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Wiki","depth":12,"bounds":{"left":0.35039893,"top":0.09936153,"width":0.022938829,"height":0.026336791},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Wiki","depth":14,"bounds":{"left":0.36120346,"top":0.10574621,"width":0.009142287,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Security and quality (22)","depth":12,"bounds":{"left":0.37599733,"top":0.09936153,"width":0.07047872,"height":0.026336791},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Security and quality","depth":14,"bounds":{"left":0.3877992,"top":0.10574621,"width":0.04255319,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"(","depth":14,"bounds":{"left":0.43417552,"top":0.113727055,"width":0.0029920214,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"22","depth":14,"bounds":{"left":0.43716756,"top":0.113727055,"width":0.005485372,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":")","depth":14,"bounds":{"left":0.4426529,"top":0.113727055,"width":0.0016622341,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Insights","depth":12,"bounds":{"left":0.44913563,"top":0.09936153,"width":0.03125,"height":0.026336791},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Insights","depth":14,"bounds":{"left":0.4602726,"top":0.10574621,"width":0.016788565,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Settings","depth":12,"bounds":{"left":0.48304522,"top":0.09936153,"width":0.032081116,"height":0.026336791},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Settings","depth":14,"bounds":{"left":0.49418217,"top":0.10574621,"width":0.017785905,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Important update","depth":10,"bounds":{"left":0.20910904,"top":0.14365523,"width":0.0003324468,"height":0.016759777},"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Important update","depth":11,"bounds":{"left":0.20910904,"top":0.1452514,"width":0.039228722,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"On April 24 we'll start using GitHub Copilot interaction data for AI model training unless you opt out.","depth":10,"bounds":{"left":0.20910904,"top":0.1452514,"width":0.2159242,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Review this update","depth":10,"bounds":{"left":0.42503324,"top":0.1452514,"width":0.04055851,"height":0.013567438},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Review this update","depth":11,"bounds":{"left":0.42503324,"top":0.1452514,"width":0.04055851,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"and manage your preferences in your","depth":10,"bounds":{"left":0.46559176,"top":0.1452514,"width":0.08261303,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"GitHub account settings","depth":10,"bounds":{"left":0.5482048,"top":0.1452514,"width":0.05219415,"height":0.013567438},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"GitHub account settings","depth":11,"bounds":{"left":0.5482048,"top":0.1452514,"width":0.05219415,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":".","depth":10,"bounds":{"left":0.60039896,"top":0.1452514,"width":0.0013297872,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Dismiss banner","depth":9,"bounds":{"left":0.9865359,"top":0.13886672,"width":0.010638298,"height":0.025538707},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXHeading","text":"Collapse file tree","depth":14,"bounds":{"left":0.20079787,"top":0.18515563,"width":0.010638298,"height":0.025538707},"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXButton","text":"Collapse file tree","depth":15,"bounds":{"left":0.20079787,"top":0.18515563,"width":0.010638298,"height":0.025538707},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":true},{"role":"AXHeading","text":"Files","depth":14,"bounds":{"left":0.21409574,"top":0.18834797,"width":0.011635638,"height":0.01915403},"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Files","depth":15,"bounds":{"left":0.21409574,"top":0.19034317,"width":0.011635638,"height":0.015163607},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"View file on default branch","depth":16,"bounds":{"left":0.20079787,"top":0.22346368,"width":0.010638298,"height":0.025538707},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXMenuButton","text":"e4e0e6d branch","depth":15,"bounds":{"left":0.21110372,"top":0.22346368,"width":0.07247341,"height":0.025538707},"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"e4e0e6d","depth":18,"bounds":{"left":0.22323804,"top":0.22944932,"width":0.019780586,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Search this repository(forward slash)","depth":15,"bounds":{"left":0.28590426,"top":0.22346368,"width":0.010638298,"height":0.025538707},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXComboBox","text":"Go to file","depth":15,"bounds":{"left":0.21176861,"top":0.25618514,"width":0.07247341,"height":0.023942538},"role_description":"combo box","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":".circleci","depth":21,"bounds":{"left":0.21675532,"top":0.29648843,"width":0.016456118,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":".cursor","depth":21,"bounds":{"left":0.21675532,"top":0.32242617,"width":0.014960106,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":".github","depth":21,"bounds":{"left":0.21675532,"top":0.34796488,"width":0.014960106,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":".sonarlint","depth":21,"bounds":{"left":0.21675532,"top":0.3735036,"width":0.019780586,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":".vscode","depth":21,"bounds":{"left":0.21675532,"top":0.39944133,"width":0.016456118,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"app","depth":21,"bounds":{"left":0.21675532,"top":0.42498004,"width":0.008144947,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"bootstrap","depth":21,"bounds":{"left":0.21675532,"top":0.4509178,"width":0.020777926,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"config","depth":21,"bounds":{"left":0.21675532,"top":0.4764565,"width":0.013464096,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"contrib","depth":21,"bounds":{"left":0.21675532,"top":0.5019952,"width":0.01512633,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"database","depth":21,"bounds":{"left":0.21675532,"top":0.52793294,"width":0.019780586,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"docs","depth":21,"bounds":{"left":0.21675532,"top":0.5534717,"width":0.010472074,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"front-end","depth":21,"bounds":{"left":0.21675532,"top":0.5794094,"width":0.02044548,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"lang","depth":21,"bounds":{"left":0.21675532,"top":0.6049481,"width":0.009142287,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"node_modules","depth":21,"bounds":{"left":0.21675532,"top":0.63048685,"width":0.03158245,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"phpstan","depth":21,"bounds":{"left":0.21675532,"top":0.6564246,"width":0.017453458,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"public","depth":21,"bounds":{"left":0.21675532,"top":0.68196326,"width":0.013131649,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"resources","depth":21,"bounds":{"left":0.21675532,"top":0.70790106,"width":0.021276595,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"routes","depth":21,"bounds":{"left":0.21675532,"top":0.73343974,"width":0.013630319,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"scripts","depth":21,"bounds":{"left":0.21675532,"top":0.7589784,"width":0.01462766,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"storage","depth":21,"bounds":{"left":0.21675532,"top":0.7849162,"width":0.016289894,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"tests","depth":21,"bounds":{"left":0.21675532,"top":0.8104549,"width":0.010638298,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":".editorconfig","depth":21,"bounds":{"left":0.21675532,"top":0.83639264,"width":0.027094414,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":".env.circleci","depth":21,"bounds":{"left":0.21675532,"top":0.8619314,"width":0.025099734,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":".env.circleci-nightly","depth":21,"bounds":{"left":0.21675532,"top":0.88747007,"width":0.041722074,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":".env.local","depth":21,"bounds":{"left":0.21675532,"top":0.9134078,"width":0.019946808,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":".env.production","depth":21,"bounds":{"left":0.21675532,"top":0.93894655,"width":0.03324468,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":".env.production-eu","depth":21,"bounds":{"left":0.21675532,"top":0.9648843,"width":0.04055851,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":".env.qa","depth":21,"bounds":{"left":0.21675532,"top":0.99042296,"width":0.01512633,"height":0.009577036},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":".env.qai","depth":21,"bounds":{"left":0.21675532,"top":1.0,"width":0.016289894,"height":-0.015961647},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":".env.staging","depth":21,"bounds":{"left":0.21675532,"top":1.0,"width":0.025764627,"height":-0.041899443},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":".gitattributes","depth":21,"bounds":{"left":0.21675532,"top":1.0,"width":0.027426861,"height":-0.067438126},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":".gitignore","depth":21,"bounds":{"left":0.21675532,"top":1.0,"width":0.020279255,"height":-0.09337592},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":".php-cs-fixer.dist.php","depth":21,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"composer.lock","depth":21,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Breadcrumbs","depth":13,"bounds":{"left":0.3075133,"top":0.18834797,"width":0.0003324468,"height":0.0007980846},"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Breadcrumbs","depth":14,"bounds":{"left":0.3075133,"top":0.19233839,"width":0.06499335,"height":0.030327214},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"app","depth":15,"bounds":{"left":0.3075133,"top":0.19034317,"width":0.009474734,"height":0.015163607},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"app","depth":16,"bounds":{"left":0.3075133,"top":0.19034317,"width":0.009474734,"height":0.015163607},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"composer.lock","depth":13,"bounds":{"left":0.3238032,"top":0.18834797,"width":0.03706782,"height":0.01915403},"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"composer.lock","depth":14,"bounds":{"left":0.3238032,"top":0.19034317,"width":0.03706782,"height":0.015163607},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Copy path","depth":12,"bounds":{"left":0.36353058,"top":0.1867518,"width":0.00930851,"height":0.022346368},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXMenuButton","text":"More file actions","depth":12,"bounds":{"left":0.98420876,"top":0.18515563,"width":0.010638298,"height":0.025538707},"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXHeading","text":"Latest commit","depth":11,"bounds":{"left":0.3118351,"top":0.2414206,"width":0.0003324468,"height":0.0007980846},"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Latest commit","depth":12,"bounds":{"left":0.3118351,"top":0.24541101,"width":0.036402926,"height":0.06863528},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"LakyLak","depth":11,"bounds":{"left":0.3118351,"top":0.2330407,"width":0.009640957,"height":0.017557861},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"commits by LakyLak","depth":11,"bounds":{"left":0.32147607,"top":0.23343974,"width":0.01861702,"height":0.016759777},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"LakyLak","depth":12,"bounds":{"left":0.32147607,"top":0.23503591,"width":0.01861702,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Merge branch 'master' into secfix/composer-20260415","depth":12,"bounds":{"left":0.34275267,"top":0.23503591,"width":0.119015954,"height":0.013567438},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Merge branch 'master' into secfix/composer-20260415","depth":13,"bounds":{"left":0.34275267,"top":0.23503591,"width":0.119015954,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"success","depth":11,"bounds":{"left":0.4644282,"top":0.23064645,"width":0.00930851,"height":0.022346368},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"Commit e4e0e6d","depth":11,"bounds":{"left":0.91373,"top":0.23463687,"width":0.016954787,"height":0.014365523},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"e4e0e6d","depth":12,"bounds":{"left":0.91373,"top":0.235834,"width":0.016954787,"height":0.011971269},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"·","depth":11,"bounds":{"left":0.93068486,"top":0.235834,"width":0.0034906915,"height":0.011971269},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"41 minutes ago","depth":12,"bounds":{"left":0.93417555,"top":0.235834,"width":0.028424202,"height":0.011971269},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"History","depth":11,"bounds":{"left":0.9652593,"top":0.23064645,"width":0.0003324468,"height":0.0007980846},"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"History","depth":12,"bounds":{"left":0.9652593,"top":0.23463687,"width":0.034740686,"height":0.030327214},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"History","depth":11,"bounds":{"left":0.9652593,"top":0.23064645,"width":0.026595745,"height":0.022346368},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"History","depth":13,"bounds":{"left":0.97490025,"top":0.235834,"width":0.013962766,"height":0.011971269},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"File metadata and controls","depth":12,"bounds":{"left":0.31050533,"top":0.29090184,"width":0.0003324468,"height":0.0007980846},"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"File metadata and controls","depth":13,"bounds":{"left":0.31050533,"top":0.29489225,"width":0.046043884,"height":0.1452514},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Code","depth":14,"bounds":{"left":0.31050533,"top":0.2801277,"width":0.02044548,"height":0.022346368},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Code","depth":16,"bounds":{"left":0.3148271,"top":0.28451717,"width":0.011801862,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Blame","depth":14,"bounds":{"left":0.33128324,"top":0.2801277,"width":0.022606382,"height":0.022346368},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Blame","depth":16,"bounds":{"left":0.3359375,"top":0.28451717,"width":0.013297873,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"24187 lines (24187 loc) · 871 KB","depth":14,"bounds":{"left":0.3565492,"top":0.2857143,"width":0.07662899,"height":0.011572227},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXMenuButton","text":"Your organization can pay for GitHub Copilot","depth":12,"bounds":{"left":0.44115692,"top":0.2801277,"width":0.011303191,"height":0.022346368},"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Ask Copilot about this file","depth":12,"bounds":{"left":0.91572475,"top":0.2801277,"width":0.00930851,"height":0.022346368},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"Raw","depth":13,"bounds":{"left":0.92769283,"top":0.2801277,"width":0.013962766,"height":0.022346368},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Raw","depth":15,"bounds":{"left":0.93068486,"top":0.28531525,"width":0.007978723,"height":0.011971269},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Copy raw file","depth":13,"bounds":{"left":0.94132316,"top":0.2801277,"width":0.00930851,"height":0.022346368},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Download raw file","depth":13,"bounds":{"left":0.9502992,"top":0.2801277,"width":0.00930851,"height":0.022346368},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"You must be on a branch to make or propose changes to this file","depth":13,"bounds":{"left":0.96193486,"top":0.2801277,"width":0.00930851,"height":0.022346368},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":false,"is_focused":false,"is_selected":false},{"role":"AXMenuButton","text":"More edit options","depth":13,"bounds":{"left":0.9709109,"top":0.2801277,"width":0.00930851,"height":0.022346368},"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Open symbols panel","depth":12,"bounds":{"left":0.98254657,"top":0.2801277,"width":0.00930851,"height":0.022346368},"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"{\n \"_readme\": [\n \"This file locks the dependencies of your project to a known state\",\n \"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies\",\n \"This file is @generated automatically\"\n ],\n \"content-hash\": \"c5b624c7761f54da18d67e9d401dc59f\",\n \"packages\": [\n {\n \"name\": \"24slides/laravel-saml2\",\n \"version\": \"2.4.2\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/24Slides/laravel-saml2.git\",\n \"reference\": \"e7f4938586c65fbe1fdd91552c582cac745223b9\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/24Slides/laravel-saml2/zipball/e7f4938586c65fbe1fdd91552c582cac745223b9\",\n \"reference\": \"e7f4938586c65fbe1fdd91552c582cac745223b9\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"ext-openssl\": \"*\",\n \"illuminate/console\": \"~5.5|^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0\",\n \"illuminate/database\": \"~5.5|^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0\",\n \"illuminate/support\": \"~5.4|^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0\",\n \"onelogin/php-saml\": \"^3.0|^4.0\",\n \"php\": \">=7.1\",\n \"ramsey/uuid\": \"^3.8|^4.0\"\n },\n \"require-dev\": {\n \"mockery/mockery\": \"^0.9.9\",\n \"phpunit/phpunit\": \"^7.5|^9.0\",\n \"squizlabs/php_codesniffer\": \"^2.3\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"laravel\": {\n \"aliases\": {\n \"Saml2\": \"Slides\\\\Saml2\\\\Facades\\\\Auth\"\n },\n \"providers\": [\n \"Slides\\\\Saml2\\\\ServiceProvider\"\n ]\n },\n \"branch-aliases\": {\n \"dev-master\": \"2.0.8-dev\"\n }\n },\n \"autoload\": {\n \"files\": [\n \"src/helpers.php\"\n ],\n \"psr-4\": {\n \"Slides\\\\Saml2\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Artem Brezhnev\",\n \"email\": \"brezzhnev@gmail.com\"\n }\n ],\n \"description\": \"SAML2 Service Provider integration to your Laravel 5.4+ application, based on OneLogin toolkit\",\n \"homepage\": \"https://github.com/24slides/laravel-saml2\",\n \"keywords\": [\n \"SAML2\",\n \"SSO\",\n \"laravel\",\n \"onelogin\",\n \"saml\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/24Slides/laravel-saml2/issues\",\n \"source\": \"https://github.com/24Slides/laravel-saml2/tree/2.4.2\"\n },\n \"time\": \"2025-03-12T12:39:37+00:00\"\n },\n {\n \"name\": \"adam-paterson/oauth2-slack\",\n \"version\": \"1.1.3\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/adam-paterson/oauth2-slack.git\",\n \"reference\": \"ccc329eb3036a89d110227a4137e15d4a5661678\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/adam-paterson/oauth2-slack/zipball/ccc329eb3036a89d110227a4137e15d4a5661678\",\n \"reference\": \"ccc329eb3036a89d110227a4137e15d4a5661678\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"league/oauth2-client\": \"1.*|2.*\",\n \"php\": \">=5.6.0\"\n },\n \"require-dev\": {\n \"mockery/mockery\": \"~0.9\",\n \"phpunit/phpunit\": \"5.6\",\n \"squizlabs/php_codesniffer\": \"~2.0\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"AdamPaterson\\\\OAuth2\\\\Client\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Adam Paterson\",\n \"email\": \"hello@adampaterson.co.uk\"\n }\n ],\n \"description\": \"Slack OAuth 2.0 Client Provider for The PHP League OAuth2-Client\",\n \"keywords\": [\n \"Authentication\",\n \"SSO\",\n \"authorization\",\n \"identity\",\n \"idp\",\n \"oauth\",\n \"oauth2\",\n \"single sign on\",\n \"slack\",\n \"slack api\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/adam-paterson/oauth2-slack/issues\",\n \"source\": \"https://github.com/adam-paterson/oauth2-slack/tree/master\"\n },\n \"time\": \"2017-06-20T14:43:31+00:00\"\n },\n {\n \"name\": \"asimlqt/php-google-spreadsheet-client\",\n \"version\": \"v3.0.2\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/asimlqt/php-google-spreadsheet-client.git\",\n \"reference\": \"fb82cdc12e6cef559a8f1e42dc26e0905f565055\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/asimlqt/php-google-spreadsheet-client/zipball/fb82cdc12e6cef559a8f1e42dc26e0905f565055\",\n \"reference\": \"fb82cdc12e6cef559a8f1e42dc26e0905f565055\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=5.6.0\"\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \"4.4.2\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Google\\\\\": \"src/Google\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"Apache-2.0\"\n ],\n \"authors\": [\n {\n \"name\": \"Asim Liaquat\",\n \"email\": \"asimlqt22@gmail.com\",\n \"role\": \"Developer\"\n }\n ],\n \"description\": \"Google Spreadsheet PHP Client\",\n \"homepage\": \"https://github.com/asimlqt/php-google-spreadsheet-client\",\n \"keywords\": [\n \"google\",\n \"spreadsheet\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/asimlqt/php-google-spreadsheet-client/issues\",\n \"source\": \"https://github.com/asimlqt/php-google-spreadsheet-client/tree/v3.0.2\"\n },\n \"time\": \"2016-11-09T07:43:08+00:00\"\n },\n {\n \"name\": \"aws/aws-crt-php\",\n \"version\": \"v1.2.7\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/awslabs/aws-crt-php.git\",\n \"reference\": \"d71d9906c7bb63a28295447ba12e74723bd3730e\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/awslabs/aws-crt-php/zipball/d71d9906c7bb63a28295447ba12e74723bd3730e\",\n \"reference\": \"d71d9906c7bb63a28295447ba12e74723bd3730e\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=5.5\"\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \"^4.8.35||^5.6.3||^9.5\",\n \"yoast/phpunit-polyfills\": \"^1.0\"\n },\n \"suggest\": {\n \"ext-awscrt\": \"Make sure you install awscrt native extension to use any of the functionality.\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"classmap\": [\n \"src/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"Apache-2.0\"\n ],\n \"authors\": [\n {\n \"name\": \"AWS SDK Common Runtime Team\",\n \"email\": \"aws-sdk-common-runtime@amazon.com\"\n }\n ],\n \"description\": \"AWS Common Runtime for PHP\",\n \"homepage\": \"https://github.com/awslabs/aws-crt-php\",\n \"keywords\": [\n \"amazon\",\n \"aws\",\n \"crt\",\n \"sdk\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/awslabs/aws-crt-php/issues\",\n \"source\": \"https://github.com/awslabs/aws-crt-php/tree/v1.2.7\"\n },\n \"time\": \"2024-10-18T22:15:13+00:00\"\n },\n {\n \"name\": \"aws/aws-sdk-php\",\n \"version\": \"3.373.2\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/aws/aws-sdk-php.git\",\n \"reference\": \"483fba51c28b3a0c0647bf5100e0edca82090b18\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/aws/aws-sdk-php/zipball/483fba51c28b3a0c0647bf5100e0edca82090b18\",\n \"reference\": \"483fba51c28b3a0c0647bf5100e0edca82090b18\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"aws/aws-crt-php\": \"^1.2.3\",\n \"ext-json\": \"*\",\n \"ext-pcre\": \"*\",\n \"ext-simplexml\": \"*\",\n \"guzzlehttp/guzzle\": \"^7.4.5\",\n \"guzzlehttp/promises\": \"^2.0\",\n \"guzzlehttp/psr7\": \"^2.4.5\",\n \"mtdowling/jmespath.php\": \"^2.8.0\",\n \"php\": \">=8.1\",\n \"psr/http-message\": \"^1.0 || ^2.0\",\n \"symfony/filesystem\": \"^v5.4.45 || ^v6.4.3 || ^v7.1.0 || ^v8.0.0\"\n },\n \"require-dev\": {\n \"andrewsville/php-token-reflection\": \"^1.4\",\n \"aws/aws-php-sns-message-validator\": \"~1.0\",\n \"behat/behat\": \"~3.0\",\n \"composer/composer\": \"^2.7.8\",\n \"dms/phpunit-arraysubset-asserts\": \"^v0.5.0\",\n \"doctrine/cache\": \"~1.4\",\n \"ext-dom\": \"*\",\n \"ext-openssl\": \"*\",\n \"ext-sockets\": \"*\",\n \"phpunit/phpunit\": \"^10.0\",\n \"psr/cache\": \"^2.0 || ^3.0\",\n \"psr/simple-cache\": \"^2.0 || ^3.0\",\n \"sebastian/comparator\": \"^1.2.3 || ^4.0 || ^5.0\",\n \"yoast/phpunit-polyfills\": \"^2.0\"\n },\n \"suggest\": {\n \"aws/aws-php-sns-message-validator\": \"To validate incoming SNS notifications\",\n \"doctrine/cache\": \"To use the DoctrineCacheAdapter\",\n \"ext-curl\": \"To send requests using cURL\",\n \"ext-openssl\": \"Allows working with CloudFront private distributions and verifying received SNS messages\",\n \"ext-pcntl\": \"To use client-side monitoring\",\n \"ext-sockets\": \"To use client-side monitoring\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"3.0-dev\"\n }\n },\n \"autoload\": {\n \"files\": [\n \"src/functions.php\"\n ],\n \"psr-4\": {\n \"Aws\\\\\": \"src/\"\n },\n \"exclude-from-classmap\": [\n \"src/data/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"Apache-2.0\"\n ],\n \"authors\": [\n {\n \"name\": \"Amazon Web Services\",\n \"homepage\": \"https://aws.amazon.com\"\n }\n ],\n \"description\": \"AWS SDK for PHP - Use Amazon Web Services in your PHP project\",\n \"homepage\": \"https://aws.amazon.com/sdk-for-php\",\n \"keywords\": [\n \"amazon\",\n \"aws\",\n \"cloud\",\n \"dynamodb\",\n \"ec2\",\n \"glacier\",\n \"s3\",\n \"sdk\"\n ],\n \"support\": {\n \"forum\": \"https://github.com/aws/aws-sdk-php/discussions\",\n \"issues\": \"https://github.com/aws/aws-sdk-php/issues\",\n \"source\": \"https://github.com/aws/aws-sdk-php/tree/3.373.2\"\n },\n \"time\": \"2026-03-13T18:08:30+00:00\"\n },\n {\n \"name\": \"aws/aws-sdk-php-laravel\",\n \"version\": \"3.10.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/aws/aws-sdk-php-laravel.git\",\n \"reference\": \"c1477b1efd43a61238090c0e8f1ede979573dd4b\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/aws/aws-sdk-php-laravel/zipball/c1477b1efd43a61238090c0e8f1ede979573dd4b\",\n \"reference\": \"c1477b1efd43a61238090c0e8f1ede979573dd4b\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"aws/aws-sdk-php\": \"^3.338.0\",\n \"illuminate/support\": \"^6.0 || ^7.0 || ^8.0 || ^9.0 || ^10.0 || ^11.0 || ^12.0\",\n \"php\": \">=8.1\"\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \"^8.0 || ^9.0\",\n \"vlucas/phpdotenv\": \"^1.0 || ^2.0 || ^3.0 || ^4.0 || ^5.0\",\n \"yoast/phpunit-polyfills\": \"^1.0\"\n },\n \"suggest\": {\n \"laravel/framework\": \"To test the Laravel bindings\",\n \"laravel/lumen-framework\": \"To test the Lumen bindings\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"laravel\": {\n \"aliases\": {\n \"AWS\": \"Aws\\\\Laravel\\\\AwsFacade\"\n },\n \"providers\": [\n \"Aws\\\\Laravel\\\\AwsServiceProvider\"\n ]\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Aws\\\\Laravel\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"Apache-2.0\"\n ],\n \"authors\": [\n {\n \"name\": \"Amazon Web Services\",\n \"homepage\": \"http://aws.amazon.com\"\n }\n ],\n \"description\": \"A simple Laravel 6/7/8/9/10/11/12 service provider for including the AWS SDK for PHP.\",\n \"homepage\": \"https://aws.amazon.com/sdk-for-php/\",\n \"keywords\": [\n \"amazon\",\n \"aws\",\n \"dynamodb\",\n \"ec2\",\n \"laravel\",\n \"laravel 10\",\n \"laravel 11\",\n \"laravel 12\",\n \"laravel 6\",\n \"laravel 7\",\n \"laravel 8\",\n \"laravel 9\",\n \"s3\",\n \"sdk\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/aws/aws-sdk-php-laravel/issues\",\n \"source\": \"https://github.com/aws/aws-sdk-php-laravel/tree/3.10.0\"\n },\n \"time\": \"2025-02-26T22:25:56+00:00\"\n },\n {\n \"name\": \"bepsvpt/secure-headers\",\n \"version\": \"9.0.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/bepsvpt/secure-headers.git\",\n \"reference\": \"7efbc3d8b988051b5ff81c4cacd1d12e875528ed\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/bepsvpt/secure-headers/zipball/7efbc3d8b988051b5ff81c4cacd1d12e875528ed\",\n \"reference\": \"7efbc3d8b988051b5ff81c4cacd1d12e875528ed\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"ext-json\": \"*\",\n \"php\": \"^7.1 || ^8.0\"\n },\n \"require-dev\": {\n \"ergebnis/composer-normalize\": \"^2.42\",\n \"ext-xdebug\": \"*\",\n \"laravel/pint\": \"^1.14\",\n \"orchestra/testbench\": \"^3.1 || ^4.18 || ^5.20 || ^6.43 || ^7.41 || ^8.22 || ^9.0\",\n \"phpstan/phpstan\": \"^1.10\",\n \"phpunit/phpunit\": \"^5.7 || ^6.5 || ^7.5 || ^8.5 || ^9.6 || ^10.5\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"laravel\": {\n \"providers\": [\n \"Bepsvpt\\\\SecureHeaders\\\\SecureHeadersServiceProvider\"\n ]\n }\n },\n \"autoload\": {\n \"files\": [\n \"src/helpers.php\"\n ],\n \"psr-4\": {\n \"Bepsvpt\\\\SecureHeaders\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"bepsvpt\",\n \"email\": \"6ibrl@cpp.tw\"\n }\n ],\n \"description\": \"Add security related headers to HTTP response. The package includes Service Providers for easy Laravel integration.\",\n \"homepage\": \"https://github.com/bepsvpt/secure-headers\",\n \"keywords\": [\n \"clear-site-data\",\n \"content-security-policy\",\n \"csp\",\n \"except-ct\",\n \"feature-policy\",\n \"header\",\n \"hsts\",\n \"https\",\n \"laravel\",\n \"permissions-policy\",\n \"referrer-policy\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/bepsvpt/secure-headers/issues\",\n \"source\": \"https://github.com/bepsvpt/secure-headers/tree/9.0.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://opencollective.com/secure-headers\",\n \"type\": \"open_collective\"\n }\n ],\n \"time\": \"2025-01-18T07:18:04+00:00\"\n },\n {\n \"name\": \"brick/math\",\n \"version\": \"0.14.8\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/brick/math.git\",\n \"reference\": \"63422359a44b7f06cae63c3b429b59e8efcc0629\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/brick/math/zipball/63422359a44b7f06cae63c3b429b59e8efcc0629\",\n \"reference\": \"63422359a44b7f06cae63c3b429b59e8efcc0629\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \"^8.2\"\n },\n \"require-dev\": {\n \"php-coveralls/php-coveralls\": \"^2.2\",\n \"phpstan/phpstan\": \"2.1.22\",\n \"phpunit/phpunit\": \"^11.5\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Brick\\\\Math\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"description\": \"Arbitrary-precision arithmetic library\",\n \"keywords\": [\n \"Arbitrary-precision\",\n \"BigInteger\",\n \"BigRational\",\n \"arithmetic\",\n \"bigdecimal\",\n \"bignum\",\n \"bignumber\",\n \"brick\",\n \"decimal\",\n \"integer\",\n \"math\",\n \"mathematics\",\n \"rational\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/brick/math/issues\",\n \"source\": \"https://github.com/brick/math/tree/0.14.8\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/BenMorel\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2026-02-10T14:33:43+00:00\"\n },\n {\n \"name\": \"carbonphp/carbon-doctrine-types\",\n \"version\": \"3.2.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/CarbonPHP/carbon-doctrine-types.git\",\n \"reference\": \"18ba5ddfec8976260ead6e866180bd5d2f71aa1d\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/CarbonPHP/carbon-doctrine-types/zipball/18ba5ddfec8976260ead6e866180bd5d2f71aa1d\",\n \"reference\": \"18ba5ddfec8976260ead6e866180bd5d2f71aa1d\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \"^8.1\"\n },\n \"conflict\": {\n \"doctrine/dbal\": \"<4.0.0 || >=5.0.0\"\n },\n \"require-dev\": {\n \"doctrine/dbal\": \"^4.0.0\",\n \"nesbot/carbon\": \"^2.71.0 || ^3.0.0\",\n \"phpunit/phpunit\": \"^10.3\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Carbon\\\\Doctrine\\\\\": \"src/Carbon/Doctrine/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"KyleKatarn\",\n \"email\": \"kylekatarnls@gmail.com\"\n }\n ],\n \"description\": \"Types to use Carbon in Doctrine\",\n \"keywords\": [\n \"carbon\",\n \"date\",\n \"datetime\",\n \"doctrine\",\n \"time\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/CarbonPHP/carbon-doctrine-types/issues\",\n \"source\": \"https://github.com/CarbonPHP/carbon-doctrine-types/tree/3.2.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/kylekatarnls\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://opencollective.com/Carbon\",\n \"type\": \"open_collective\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/nesbot/carbon\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2024-02-09T16:56:22+00:00\"\n },\n {\n \"name\": \"chadhutchins/oauth2-slack\",\n \"version\": \"1.2.2\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/chadhutchins/oauth2-slack.git\",\n \"reference\": \"f738c0ed2695208353ee95b6e24e2d1ae412843a\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/chadhutchins/oauth2-slack/zipball/f738c0ed2695208353ee95b6e24e2d1ae412843a\",\n \"reference\": \"f738c0ed2695208353ee95b6e24e2d1ae412843a\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"league/oauth2-client\": \"1.*|2.*\",\n \"php\": \">=5.6.0\"\n },\n \"require-dev\": {\n \"mockery/mockery\": \"~0.9\",\n \"phpunit/phpunit\": \"5.6\",\n \"squizlabs/php_codesniffer\": \"~2.0\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Chadhutchins\\\\OAuth2\\\\Client\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Adam Paterson\",\n \"email\": \"hello@adampaterson.co.uk\"\n },\n {\n \"name\": \"Chad Hutchins\",\n \"email\": \"hutchins.chad@gmail.com\"\n }\n ],\n \"description\": \"Slack OAuth 2.0 Client Provider for The PHP League OAuth2-Client\",\n \"keywords\": [\n \"Authentication\",\n \"SSO\",\n \"authorization\",\n \"identity\",\n \"idp\",\n \"oauth\",\n \"oauth2\",\n \"single sign on\",\n \"slack\",\n \"slack api\"\n ],\n \"support\": {\n \"source\": \"https://github.com/chadhutchins/oauth2-slack/tree/1.2.2\"\n },\n \"time\": \"2020-11-23T15:41:35+00:00\"\n },\n {\n \"name\": \"chaseconey/laravel-datadog-helper\",\n \"version\": \"1.3.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/chaseconey/laravel-datadog-helper.git\",\n \"reference\": \"7219004fa87bcf226d5d5f1d268a555eef3d3a4b\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/chaseconey/laravel-datadog-helper/zipball/7219004fa87bcf226d5d5f1d268a555eef3d3a4b\",\n \"reference\": \"7219004fa87bcf226d5d5f1d268a555eef3d3a4b\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"datadog/php-datadogstatsd\": \"^1.4.0\",\n \"illuminate/support\": \">=5.1\",\n \"php\": \">=5.4.0\"\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \"~4.0||~5.0\",\n \"scrutinizer/ocular\": \"~1.1\",\n \"squizlabs/php_codesniffer\": \"~2.3\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"laravel\": {\n \"aliases\": {\n \"Datadog\": \"ChaseConey\\\\LaravelDatadogHelper\\\\Datadog\"\n },\n \"providers\": [\n \"ChaseConey\\\\LaravelDatadogHelper\\\\LaravelDatadogHelperServiceProvider\"\n ]\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"ChaseConey\\\\LaravelDatadogHelper\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Chase Coney\",\n \"email\": \"chasiepoo@gmail.com\",\n \"homepage\": \"http://chaseconey.com\",\n \"role\": \"Developer\"\n }\n ],\n \"description\": \"A Laravel Datadog helper package.\",\n \"homepage\": \"https://github.com/chaseconey/laravel-datadog-helper\",\n \"keywords\": [\n \"chaseconey\",\n \"laravel-datadog-helper\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/chaseconey/laravel-datadog-helper/issues\",\n \"source\": \"https://github.com/chaseconey/laravel-datadog-helper/tree/1.3.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/chaseconey\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2025-07-28T21:50:15+00:00\"\n },\n {\n \"name\": \"chrisyue/php-m3u8\",\n \"version\": \"4.0.3\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/chrisyue/php-m3u8.git\",\n \"reference\": \"122745bda7c2cfcedf6b2893b48a028f87109717\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/chrisyue/php-m3u8/zipball/122745bda7c2cfcedf6b2893b48a028f87109717\",\n \"reference\": \"122745bda7c2cfcedf6b2893b48a028f87109717\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=7.4\"\n },\n \"require-dev\": {\n \"friendsofphp/php-cs-fixer\": \"^3\",\n \"phpunit/phpunit\": \"^8\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Chrisyue\\\\PhpM3u8\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"chrisyue\",\n \"email\": \"blizzchris@gmail.com\",\n \"homepage\": \"https://chrisyue.com\"\n }\n ],\n \"description\": \"PHP M3U8 parser / dumper\",\n \"homepage\": \"http://chrisyue.com\",\n \"keywords\": [\n \"dumper\",\n \"m3u8\",\n \"parser\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/chrisyue/php-m3u8/issues\",\n \"source\": \"https://github.com/chrisyue/php-m3u8/tree/4.0.3\"\n },\n \"time\": \"2022-05-23T12:03:05+00:00\"\n },\n {\n \"name\": \"clue/stream-filter\",\n \"version\": \"v1.7.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/clue/stream-filter.git\",\n \"reference\": \"049509fef80032cb3f051595029ab75b49a3c2f7\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/clue/stream-filter/zipball/049509fef80032cb3f051595029ab75b49a3c2f7\",\n \"reference\": \"049509fef80032cb3f051595029ab75b49a3c2f7\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=5.3\"\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \"^9.6 || ^5.7 || ^4.8.36\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"files\": [\n \"src/functions_include.php\"\n ],\n \"psr-4\": {\n \"Clue\\\\StreamFilter\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Christian Lück\",\n \"email\": \"christian@clue.engineering\"\n }\n ],\n \"description\": \"A simple and modern approach to stream filtering in PHP\",\n \"homepage\": \"https://github.com/clue/stream-filter\",\n \"keywords\": [\n \"bucket brigade\",\n \"callback\",\n \"filter\",\n \"php_user_filter\",\n \"stream\",\n \"stream_filter_append\",\n \"stream_filter_register\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/clue/stream-filter/issues\",\n \"source\": \"https://github.com/clue/stream-filter/tree/v1.7.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://clue.engineering/support\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/clue\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2023-12-20T15:40:13+00:00\"\n },\n {\n \"name\": \"composer/semver\",\n \"version\": \"3.4.4\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/composer/semver.git\",\n \"reference\": \"198166618906cb2de69b95d7d47e5fa8aa1b2b95\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/composer/semver/zipball/198166618906cb2de69b95d7d47e5fa8aa1b2b95\",\n \"reference\": \"198166618906cb2de69b95d7d47e5fa8aa1b2b95\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \"^5.3.2 || ^7.0 || ^8.0\"\n },\n \"require-dev\": {\n \"phpstan/phpstan\": \"^1.11\",\n \"symfony/phpunit-bridge\": \"^3 || ^7\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-main\": \"3.x-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Composer\\\\Semver\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Nils Adermann\",\n \"email\": \"naderman@naderman.de\",\n \"homepage\": \"http://www.naderman.de\"\n },\n {\n \"name\": \"Jordi Boggiano\",\n \"email\": \"j.boggiano@seld.be\",\n \"homepage\": \"http://seld.be\"\n },\n {\n \"name\": \"Rob Bast\",\n \"email\": \"rob.bast@gmail.com\",\n \"homepage\": \"http://robbast.nl\"\n }\n ],\n \"description\": \"Semver library that offers utilities, version constraint parsing and validation.\",\n \"keywords\": [\n \"semantic\",\n \"semver\",\n \"validation\",\n \"versioning\"\n ],\n \"support\": {\n \"irc\": \"ircs://irc.libera.chat:6697/composer\",\n \"issues\": \"https://github.com/composer/semver/issues\",\n \"source\": \"https://github.com/composer/semver/tree/3.4.4\"\n },\n \"funding\": [\n {\n \"url\": \"https://packagist.com\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/composer\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2025-08-20T19:15:30+00:00\"\n },\n {\n \"name\": \"daniti/oauth2-pipedrive\",\n \"version\": \"dev-master\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/jiminny/oauth2-pipedrive.git\",\n \"reference\": \"e8b269cfe30ea92817acd0dc3efc9da54fe390bf\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/jiminny/oauth2-pipedrive/zipball/e8b269cfe30ea92817acd0dc3efc9da54fe390bf\",\n \"reference\": \"e8b269cfe30ea92817acd0dc3efc9da54fe390bf\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"league/oauth2-client\": \"^2.3\"\n },\n \"default-branch\": true,\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Daniti\\\\OAuth2\\\\Client\\\\Provider\\\\\": \"src/\"\n }\n },\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Daniele Timo\",\n \"email\": \"dani@danieletimo.com\"\n }\n ],\n \"description\": \"Pipedrive OAuth 2.0 client provider for PHP League OAuth2 Client\",\n \"support\": {\n \"source\": \"https://github.com/jiminny/oauth2-pipedrive/tree/master\",\n \"issues\": \"https://github.com/jiminny/oauth2-pipedrive/issues\"\n },\n \"time\": \"2021-03-15T17:10:01+00:00\"\n },\n {\n \"name\": \"datadog/php-datadogstatsd\",\n \"version\": \"1.7.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/DataDog/php-datadogstatsd.git\",\n \"reference\": \"f0d61f11e01780ef7d96daed9781c7db9311a568\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/DataDog/php-datadogstatsd/zipball/f0d61f11e01780ef7d96daed9781c7db9311a568\",\n \"reference\": \"f0d61f11e01780ef7d96daed9781c7db9311a568\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"ext-sockets\": \"*\",\n \"php\": \">=5.6.0\"\n },\n \"require-dev\": {\n \"mikey179/vfsstream\": \"^1.6\",\n \"squizlabs/php_codesniffer\": \"^3.3\",\n \"yoast/phpunit-polyfills\": \"^1.0.1\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"DataDog\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Alex Corley\",\n \"email\": \"anthroprose@gmail.com\",\n \"role\": \"Developer\"\n },\n {\n \"name\": \"Datadog\",\n \"email\": \"dev@datadoghq.com\",\n \"role\": \"Developer\"\n }\n ],\n \"description\": \"An extremely simple PHP datadogstatsd client\",\n \"homepage\": \"https://www.datadoghq.com/\",\n \"keywords\": [\n \"DataDog\",\n \"check\",\n \"error-reporting\",\n \"health\",\n \"logging\",\n \"monitoring\",\n \"statsd\"\n ],\n \"support\": {\n \"chat\": \"https://chat.datadoghq.com/\",\n \"email\": \"package@datadoghq.com\",\n \"irc\": \"irc://irc.freenode.net/datadog\",\n \"issues\": \"https://github.com/DataDog/php-datadogstatsd/issues\",\n \"source\": \"https://github.com/DataDog/php-datadogstatsd\"\n },\n \"time\": \"2025-08-25T15:42:11+00:00\"\n },\n {\n \"name\": \"defuse/php-encryption\",\n \"version\": \"v2.4.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/defuse/php-encryption.git\",\n \"reference\": \"f53396c2d34225064647a05ca76c1da9d99e5828\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/defuse/php-encryption/zipball/f53396c2d34225064647a05ca76c1da9d99e5828\",\n \"reference\": \"f53396c2d34225064647a05ca76c1da9d99e5828\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"ext-openssl\": \"*\",\n \"paragonie/random_compat\": \">= 2\",\n \"php\": \">=5.6.0\"\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \"^5|^6|^7|^8|^9|^10\",\n \"yoast/phpunit-polyfills\": \"^2.0.0\"\n },\n \"bin\": [\n \"bin/generate-defuse-key\"\n ],\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Defuse\\\\Crypto\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Taylor Hornby\",\n \"email\": \"taylor@defuse.ca\",\n \"homepage\": \"https://defuse.ca/\"\n },\n {\n \"name\": \"Scott Arciszewski\",\n \"email\": \"info@paragonie.com\",\n \"homepage\": \"https://paragonie.com\"\n }\n ],\n \"description\": \"Secure PHP Encryption Library\",\n \"keywords\": [\n \"aes\",\n \"authenticated encryption\",\n \"cipher\",\n \"crypto\",\n \"cryptography\",\n \"encrypt\",\n \"encryption\",\n \"openssl\",\n \"security\",\n \"symmetric key cryptography\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/defuse/php-encryption/issues\",\n \"source\": \"https://github.com/defuse/php-encryption/tree/v2.4.0\"\n },\n \"time\": \"2023-06-19T06:10:36+00:00\"\n },\n {\n \"name\": \"devio/pipedrive\",\n \"version\": \"2.17.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/IsraelOrtuno/pipedrive.git\",\n \"reference\": \"7d3edfb12487b50046b0a91b1bd7dbe4002200e5\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/IsraelOrtuno/pipedrive/zipball/7d3edfb12487b50046b0a91b1bd7dbe4002200e5\",\n \"reference\": \"7d3edfb12487b50046b0a91b1bd7dbe4002200e5\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"guzzlehttp/guzzle\": \"~7.0|~6.0|~5.0|~4.0\",\n \"illuminate/support\": \">=4.0\",\n \"laravel/helpers\": \"^1.0\"\n },\n \"require-dev\": {\n \"phpspec/phpspec\": \"^2.4\",\n \"symfony/var-dumper\": \"^2.7\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"laravel\": {\n \"aliases\": {\n \"Pipedrive\": \"Devio\\\\Pipedrive\\\\PipedriveFacade\"\n },\n \"providers\": [\n \"Devio\\\\Pipedrive\\\\PipedriveServiceProvider\"\n ]\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Devio\\\\Pipedrive\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Israel Ortuño\",\n \"email\": \"ai.ortuno@gmail.com\"\n }\n ],\n \"description\": \"Complete Pipedrive API client for PHP and/or Laravel\",\n \"keywords\": [\n \"api\",\n \"client\",\n \"laravel\",\n \"pipedrive\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/IsraelOrtuno/pipedrive/issues\",\n \"source\": \"https://github.com/IsraelOrtuno/pipedrive/tree/2.17.0\"\n },\n \"time\": \"2024-11-10T18:47:25+00:00\"\n },\n {\n \"name\": \"dflydev/dot-access-data\",\n \"version\": \"v3.0.3\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/dflydev/dflydev-dot-access-data.git\",\n \"reference\": \"a23a2bf4f31d3518f3ecb38660c95715dfead60f\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/dflydev/dflydev-dot-access-data/zipball/a23a2bf4f31d3518f3ecb38660c95715dfead60f\",\n \"reference\": \"a23a2bf4f31d3518f3ecb38660c95715dfead60f\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \"^7.1 || ^8.0\"\n },\n \"require-dev\": {\n \"phpstan/phpstan\": \"^0.12.42\",\n \"phpunit/phpunit\": \"^7.5 || ^8.5 || ^9.3\",\n \"scrutinizer/ocular\": \"1.6.0\",\n \"squizlabs/php_codesniffer\": \"^3.5\",\n \"vimeo/psalm\": \"^4.0.0\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-main\": \"3.x-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Dflydev\\\\DotAccessData\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Dragonfly Development Inc.\",\n \"email\": \"info@dflydev.com\",\n \"homepage\": \"http://dflydev.com\"\n },\n {\n \"name\": \"Beau Simensen\",\n \"email\": \"beau@dflydev.com\",\n \"homepage\": \"http://beausimensen.com\"\n },\n {\n \"name\": \"Carlos Frutos\",\n \"email\": \"carlos@kiwing.it\",\n \"homepage\": \"https://github.com/cfrutos\"\n },\n {\n \"name\": \"Colin O'Dell\",\n \"email\": \"colinodell@gmail.com\",\n \"homepage\": \"https://www.colinodell.com\"\n }\n ],\n \"description\": \"Given a deep data structure, access data by dot notation.\",\n \"homepage\": \"https://github.com/dflydev/dflydev-dot-access-data\",\n \"keywords\": [\n \"access\",\n \"data\",\n \"dot\",\n \"notation\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/dflydev/dflydev-dot-access-data/issues\",\n \"source\": \"https://github.com/dflydev/dflydev-dot-access-data/tree/v3.0.3\"\n },\n \"time\": \"2024-07-08T12:26:09+00:00\"\n },\n {\n \"name\": \"doctrine/annotations\",\n \"version\": \"2.0.2\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/doctrine/annotations.git\",\n \"reference\": \"901c2ee5d26eb64ff43c47976e114bf00843acf7\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/doctrine/annotations/zipball/901c2ee5d26eb64ff43c47976e114bf00843acf7\",\n \"reference\": \"901c2ee5d26eb64ff43c47976e114bf00843acf7\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"doctrine/lexer\": \"^2 || ^3\",\n \"ext-tokenizer\": \"*\",\n \"php\": \"^7.2 || ^8.0\",\n \"psr/cache\": \"^1 || ^2 || ^3\"\n },\n \"require-dev\": {\n \"doctrine/cache\": \"^2.0\",\n \"doctrine/coding-standard\": \"^10\",\n \"phpstan/phpstan\": \"^1.10.28\",\n \"phpunit/phpunit\": \"^7.5 || ^8.5 || ^9.5\",\n \"symfony/cache\": \"^5.4 || ^6.4 || ^7\",\n \"vimeo/psalm\": \"^4.30 || ^5.14\"\n },\n \"suggest\": {\n \"php\": \"PHP 8.0 or higher comes with attributes, a native replacement for annotations\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Doctrine\\\\Common\\\\Annotations\\\\\": \"lib/Doctrine/Common/Annotations\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Guilherme Blanco\",\n \"email\": \"guilhermeblanco@gmail.com\"\n },\n {\n \"name\": \"Roman Borschel\",\n \"email\": \"roman@code-factory.org\"\n },\n {\n \"name\": \"Benjamin Eberlei\",\n \"email\": \"kontakt@beberlei.de\"\n },\n {\n \"name\": \"Jonathan Wage\",\n \"email\": \"jonwage@gmail.com\"\n },\n {\n \"name\": \"Johannes Schmitt\",\n \"email\": \"schmittjoh@gmail.com\"\n }\n ],\n \"description\": \"Docblock Annotations Parser\",\n \"homepage\": \"https://www.doctrine-project.org/projects/annotations.html\",\n \"keywords\": [\n \"annotations\",\n \"docblock\",\n \"parser\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/doctrine/annotations/issues\",\n \"source\": \"https://github.com/doctrine/annotations/tree/2.0.2\"\n },\n \"abandoned\": true,\n \"time\": \"2024-09-05T10:17:24+00:00\"\n },\n {\n \"name\": \"doctrine/dbal\",\n \"version\": \"4.4.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/doctrine/dbal.git\",\n \"reference\": \"3d544473fb93f5c25b483ea4f4ce99f8c4d9d44c\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/doctrine/dbal/zipball/3d544473fb93f5c25b483ea4f4ce99f8c4d9d44c\",\n \"reference\": \"3d544473fb93f5c25b483ea4f4ce99f8c4d9d44c\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"doctrine/deprecations\": \"^1.1.5\",\n \"php\": \"^8.2\",\n \"psr/cache\": \"^1|^2|^3\",\n \"psr/log\": \"^1|^2|^3\"\n },\n \"require-dev\": {\n \"doctrine/coding-standard\": \"14.0.0\",\n \"fig/log-test\": \"^1\",\n \"jetbrains/phpstorm-stubs\": \"2023.2\",\n \"phpstan/phpstan\": \"2.1.30\",\n \"phpstan/phpstan-phpunit\": \"2.0.7\",\n \"phpstan/phpstan-strict-rules\": \"^2\",\n \"phpunit/phpunit\": \"11.5.23\",\n \"slevomat/coding-standard\": \"8.24.0\",\n \"squizlabs/php_codesniffer\": \"4.0.0\",\n \"symfony/cache\": \"^6.3.8|^7.0|^8.0\",\n \"symfony/console\": \"^5.4|^6.3|^7.0|^8.0\"\n },\n \"suggest\": {\n \"symfony/console\": \"For helpful console commands such as SQL execution and import of files.\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Doctrine\\\\DBAL\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Guilherme Blanco\",\n \"email\": \"guilhermeblanco@gmail.com\"\n },\n {\n \"name\": \"Roman Borschel\",\n \"email\": \"roman@code-factory.org\"\n },\n {\n \"name\": \"Benjamin Eberlei\",\n \"email\": \"kontakt@beberlei.de\"\n },\n {\n \"name\": \"Jonathan Wage\",\n \"email\": \"jonwage@gmail.com\"\n }\n ],\n \"description\": \"Powerful PHP database abstraction layer (DBAL) with many features for database schema introspection and management.\",\n \"homepage\": \"https://www.doctrine-project.org/projects/dbal.html\",\n \"keywords\": [\n \"abstraction\",\n \"database\",\n \"db2\",\n \"dbal\",\n \"mariadb\",\n \"mssql\",\n \"mysql\",\n \"oci8\",\n \"oracle\",\n \"pdo\",\n \"pgsql\",\n \"postgresql\",\n \"queryobject\",\n \"sasql\",\n \"sql\",\n \"sqlite\",\n \"sqlserver\",\n \"sqlsrv\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/doctrine/dbal/issues\",\n \"source\": \"https://github.com/doctrine/dbal/tree/4.4.1\"\n },\n \"funding\": [\n {\n \"url\": \"https://www.doctrine-project.org/sponsorship.html\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://www.patreon.com/phpdoctrine\",\n \"type\": \"patreon\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/doctrine%2Fdbal\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2025-12-04T10:11:03+00:00\"\n },\n {\n \"name\": \"doctrine/deprecations\",\n \"version\": \"1.1.6\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/doctrine/deprecations.git\",\n \"reference\": \"d4fe3e6fd9bb9e72557a19674f44d8ac7db4c6ca\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/doctrine/deprecations/zipball/d4fe3e6fd9bb9e72557a19674f44d8ac7db4c6ca\",\n \"reference\": \"d4fe3e6fd9bb9e72557a19674f44d8ac7db4c6ca\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \"^7.1 || ^8.0\"\n },\n \"conflict\": {\n \"phpunit/phpunit\": \"<=7.5 || >=14\"\n },\n \"require-dev\": {\n \"doctrine/coding-standard\": \"^9 || ^12 || ^14\",\n \"phpstan/phpstan\": \"1.4.10 || 2.1.30\",\n \"phpstan/phpstan-phpunit\": \"^1.0 || ^2\",\n \"phpunit/phpunit\": \"^7.5 || ^8.5 || ^9.6 || ^10.5 || ^11.5 || ^12.4 || ^13.0\",\n \"psr/log\": \"^1 || ^2 || ^3\"\n },\n \"suggest\": {\n \"psr/log\": \"Allows logging deprecations via PSR-3 logger implementation\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Doctrine\\\\Deprecations\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"description\": \"A small layer on top of trigger_error(E_USER_DEPRECATED) or PSR-3 logging with options to disable all deprecations or selectively for packages.\",\n \"homepage\": \"https://www.doctrine-project.org/\",\n \"support\": {\n \"issues\": \"https://github.com/doctrine/deprecations/issues\",\n \"source\": \"https://github.com/doctrine/deprecations/tree/1.1.6\"\n },\n \"time\": \"2026-02-07T07:09:04+00:00\"\n },\n {\n \"name\": \"doctrine/inflector\",\n \"version\": \"2.1.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/doctrine/inflector.git\",\n \"reference\": \"6d6c96277ea252fc1304627204c3d5e6e15faa3b\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/doctrine/inflector/zipball/6d6c96277ea252fc1304627204c3d5e6e15faa3b\",\n \"reference\": \"6d6c96277ea252fc1304627204c3d5e6e15faa3b\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \"^7.2 || ^8.0\"\n },\n \"require-dev\": {\n \"doctrine/coding-standard\": \"^12.0 || ^13.0\",\n \"phpstan/phpstan\": \"^1.12 || ^2.0\",\n \"phpstan/phpstan-phpunit\": \"^1.4 || ^2.0\",\n \"phpstan/phpstan-strict-rules\": \"^1.6 || ^2.0\",\n \"phpunit/phpunit\": \"^8.5 || ^12.2\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Doctrine\\\\Inflector\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Guilherme Blanco\",\n \"email\": \"guilhermeblanco@gmail.com\"\n },\n {\n \"name\": \"Roman Borschel\",\n \"email\": \"roman@code-factory.org\"\n },\n {\n \"name\": \"Benjamin Eberlei\",\n \"email\": \"kontakt@beberlei.de\"\n },\n {\n \"name\": \"Jonathan Wage\",\n \"email\": \"jonwage@gmail.com\"\n },\n {\n \"name\": \"Johannes Schmitt\",\n \"email\": \"schmittjoh@gmail.com\"\n }\n ],\n \"description\": \"PHP Doctrine Inflector is a small library that can perform string manipulations with regard to upper/lowercase and singular/plural forms of words.\",\n \"homepage\": \"https://www.doctrine-project.org/projects/inflector.html\",\n \"keywords\": [\n \"inflection\",\n \"inflector\",\n \"lowercase\",\n \"manipulation\",\n \"php\",\n \"plural\",\n \"singular\",\n \"strings\",\n \"uppercase\",\n \"words\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/doctrine/inflector/issues\",\n \"source\": \"https://github.com/doctrine/inflector/tree/2.1.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://www.doctrine-project.org/sponsorship.html\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://www.patreon.com/phpdoctrine\",\n \"type\": \"patreon\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/doctrine%2Finflector\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2025-08-10T19:31:58+00:00\"\n },\n {\n \"name\": \"doctrine/lexer\",\n \"version\": \"3.0.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/doctrine/lexer.git\",\n \"reference\": \"31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/doctrine/lexer/zipball/31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd\",\n \"reference\": \"31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \"^8.1\"\n },\n \"require-dev\": {\n \"doctrine/coding-standard\": \"^12\",\n \"phpstan/phpstan\": \"^1.10\",\n \"phpunit/phpunit\": \"^10.5\",\n \"psalm/plugin-phpunit\": \"^0.18.3\",\n \"vimeo/psalm\": \"^5.21\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Doctrine\\\\Common\\\\Lexer\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Guilherme Blanco\",\n \"email\": \"guilhermeblanco@gmail.com\"\n },\n {\n \"name\": \"Roman Borschel\",\n \"email\": \"roman@code-factory.org\"\n },\n {\n \"name\": \"Johannes Schmitt\",\n \"email\": \"schmittjoh@gmail.com\"\n }\n ],\n \"description\": \"PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.\",\n \"homepage\": \"https://www.doctrine-project.org/projects/lexer.html\",\n \"keywords\": [\n \"annotations\",\n \"docblock\",\n \"lexer\",\n \"parser\",\n \"php\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/doctrine/lexer/issues\",\n \"source\": \"https://github.com/doctrine/lexer/tree/3.0.1\"\n },\n \"funding\": [\n {\n \"url\": \"https://www.doctrine-project.org/sponsorship.html\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://www.patreon.com/phpdoctrine\",\n \"type\": \"patreon\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/doctrine%2Flexer\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2024-02-05T11:56:58+00:00\"\n },\n {\n \"name\": \"dragonmantank/cron-expression\",\n \"version\": \"v3.6.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/dragonmantank/cron-expression.git\",\n \"reference\": \"d61a8a9604ec1f8c3d150d09db6ce98b32675013\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/dragonmantank/cron-expression/zipball/d61a8a9604ec1f8c3d150d09db6ce98b32675013\",\n \"reference\": \"d61a8a9604ec1f8c3d150d09db6ce98b32675013\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \"^8.2|^8.3|^8.4|^8.5\"\n },\n \"replace\": {\n \"mtdowling/cron-expression\": \"^1.0\"\n },\n \"require-dev\": {\n \"phpstan/extension-installer\": \"^1.4.3\",\n \"phpstan/phpstan\": \"^1.12.32|^2.1.31\",\n \"phpunit/phpunit\": \"^8.5.48|^9.0\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"3.x-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Cron\\\\\": \"src/Cron/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Chris Tankersley\",\n \"email\": \"chris@ctankersley.com\",\n \"homepage\": \"https://github.com/dragonmantank\"\n }\n ],\n \"description\": \"CRON for PHP: Calculate the next or previous run date and determine if a CRON expression is due\",\n \"keywords\": [\n \"cron\",\n \"schedule\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/dragonmantank/cron-expression/issues\",\n \"source\": \"https://github.com/dragonmantank/cron-expression/tree/v3.6.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/dragonmantank\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2025-10-31T18:51:33+00:00\"\n },\n {\n \"name\": \"egulias/email-validator\",\n \"version\": \"4.0.4\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/egulias/EmailValidator.git\",\n \"reference\": \"d42c8731f0624ad6bdc8d3e5e9a4524f68801cfa\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/egulias/EmailValidator/zipball/d42c8731f0624ad6bdc8d3e5e9a4524f68801cfa\",\n \"reference\": \"d42c8731f0624ad6bdc8d3e5e9a4524f68801cfa\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"doctrine/lexer\": \"^2.0 || ^3.0\",\n \"php\": \">=8.1\",\n \"symfony/polyfill-intl-idn\": \"^1.26\"\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \"^10.2\",\n \"vimeo/psalm\": \"^5.12\"\n },\n \"suggest\": {\n \"ext-intl\": \"PHP Internationalization Libraries are required to use the SpoofChecking validation\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"4.0.x-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Egulias\\\\EmailValidator\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Eduardo Gulias Davis\"\n }\n ],\n \"description\": \"A library for validating emails against several RFCs\",\n \"homepage\": \"https://github.com/egulias/EmailValidator\",\n \"keywords\": [\n \"email\",\n \"emailvalidation\",\n \"emailvalidator\",\n \"validation\",\n \"validator\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/egulias/EmailValidator/issues\",\n \"source\": \"https://github.com/egulias/EmailValidator/tree/4.0.4\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/egulias\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2025-03-06T22:45:56+00:00\"\n },\n {\n \"name\": \"elasticsearch/elasticsearch\",\n \"version\": \"v7.17.3\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/elastic/elasticsearch-php.git\",\n \"reference\": \"b8a60b4136ee31117d1aa1b19879530eb6d11efb\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/elastic/elasticsearch-php/zipball/b8a60b4136ee31117d1aa1b19879530eb6d11efb\",\n \"reference\": \"b8a60b4136ee31117d1aa1b19879530eb6d11efb\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"ext-json\": \">=1.3.7\",\n \"ezimuel/ringphp\": \"^1.1.2\",\n \"php\": \"^7.3 || ^8.0\",\n \"psr/log\": \"^1|^2|^3\"\n },\n \"require-dev\": {\n \"ext-yaml\": \"*\",\n \"ext-zip\": \"*\",\n \"mockery/mockery\": \"^1.2\",\n \"phpstan/phpstan\": \"^1.10\",\n \"phpunit/phpunit\": \"^9.3\",\n \"squizlabs/php_codesniffer\": \"^3.4\",\n \"symfony/finder\": \"~4.0\"\n },\n \"suggest\": {\n \"ext-curl\": \"*\",\n \"monolog/monolog\": \"Allows for client-level logging and tracing\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"files\": [\n \"src/autoload.php\"\n ],\n \"psr-4\": {\n \"Elasticsearch\\\\\": \"src/Elasticsearch/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"Apache-2.0\",\n \"LGPL-2.1-only\"\n ],\n \"authors\": [\n {\n \"name\": \"Zachary Tong\"\n },\n {\n \"name\": \"Enrico Zimuel\"\n }\n ],\n \"description\": \"PHP Client for Elasticsearch\",\n \"keywords\": [\n \"client\",\n \"elasticsearch\",\n \"search\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/elastic/elasticsearch-php/issues\",\n \"source\": \"https://github.com/elastic/elasticsearch-php/tree/v7.17.3\"\n },\n \"time\": \"2025-07-14T09:07:02+00:00\"\n },\n {\n \"name\": \"erusev/parsedown\",\n \"version\": \"1.7.4\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/erusev/parsedown.git\",\n \"reference\": \"cb17b6477dfff935958ba01325f2e8a2bfa6dab3\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/erusev/parsedown/zipball/cb17b6477dfff935958ba01325f2e8a2bfa6dab3\",\n \"reference\": \"cb17b6477dfff935958ba01325f2e8a2bfa6dab3\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"ext-mbstring\": \"*\",\n \"php\": \">=5.3.0\"\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \"^4.8.35\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-0\": {\n \"Parsedown\": \"\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Emanuil Rusev\",\n \"email\": \"hello@erusev.com\",\n \"homepage\": \"http://erusev.com\"\n }\n ],\n \"description\": \"Parser for Markdown.\",\n \"homepage\": \"http://parsedown.org\",\n \"keywords\": [\n \"markdown\",\n \"parser\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/erusev/parsedown/issues\",\n \"source\": \"https://github.com/erusev/parsedown/tree/1.7.x\"\n },\n \"time\": \"2019-12-30T22:54:17+00:00\"\n },\n {\n \"name\": \"evenement/evenement\",\n \"version\": \"v3.0.2\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/igorw/evenement.git\",\n \"reference\": \"0a16b0d71ab13284339abb99d9d2bd813640efbc\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/igorw/evenement/zipball/0a16b0d71ab13284339abb99d9d2bd813640efbc\",\n \"reference\": \"0a16b0d71ab13284339abb99d9d2bd813640efbc\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=7.0\"\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \"^9 || ^6\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Evenement\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Igor Wiedler\",\n \"email\": \"igor@wiedler.ch\"\n }\n ],\n \"description\": \"Événement is a very simple event dispatching library for PHP\",\n \"keywords\": [\n \"event-dispatcher\",\n \"event-emitter\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/igorw/evenement/issues\",\n \"source\": \"https://github.com/igorw/evenement/tree/v3.0.2\"\n },\n \"time\": \"2023-08-08T05:53:35+00:00\"\n },\n {\n \"name\": \"ezimuel/guzzlestreams\",\n \"version\": \"4.1.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/ezimuel/guzzlestreams.git\",\n \"reference\": \"903161be81e9f497cc42fb7db982404a4e6441b0\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/ezimuel/guzzlestreams/zipball/903161be81e9f497cc42fb7db982404a4e6441b0\",\n \"reference\": \"903161be81e9f497cc42fb7db982404a4e6441b0\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=7.4.0\"\n },\n \"require-dev\": {\n \"phpstan/phpstan\": \"^2.1\",\n \"phpunit/phpunit\": \"~9.0\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"3.0-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"GuzzleHttp\\\\Stream\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Michael Dowling\",\n \"email\": \"mtdowling@gmail.com\",\n \"homepage\": \"https://github.com/mtdowling\"\n }\n ],\n \"description\": \"Fork of guzzle/streams (abandoned) to be used with elasticsearch-php\",\n \"homepage\": \"http://guzzlephp.org/\",\n \"keywords\": [\n \"Guzzle\",\n \"stream\"\n ],\n \"support\": {\n \"source\": \"https://github.com/ezimuel/guzzlestreams/tree/4.1.0\"\n },\n \"time\": \"2025-08-05T06:44:46+00:00\"\n },\n {\n \"name\": \"ezimuel/ringphp\",\n \"version\": \"1.4.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/ezimuel/ringphp.git\",\n \"reference\": \"bc983599ec7add50c00e420e867c403c8ed16ae7\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/ezimuel/ringphp/zipball/bc983599ec7add50c00e420e867c403c8ed16ae7\",\n \"reference\": \"bc983599ec7add50c00e420e867c403c8ed16ae7\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"ezimuel/guzzlestreams\": \"^3.0.1 || ^4.0.0\",\n \"php\": \">=5.4.0\",\n \"react/promise\": \"^2.0 || ^3.0\"\n },\n \"replace\": {\n \"guzzlehttp/ringphp\": \"self.version\"\n },\n \"require-dev\": {\n \"ext-curl\": \"*\",\n \"phpunit/phpunit\": \"~9.0\"\n },\n \"suggest\": {\n \"ext-curl\": \"Guzzle will use specific adapters if cURL is present\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"1.1-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"GuzzleHttp\\\\Ring\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Michael Dowling\",\n \"email\": \"mtdowling@gmail.com\",\n \"homepage\": \"https://github.com/mtdowling\"\n }\n ],\n \"description\": \"Fork of guzzle/RingPHP (abandoned) to be used with elasticsearch-php\",\n \"support\": {\n \"source\": \"https://github.com/ezimuel/ringphp/tree/1.4.0\"\n },\n \"time\": \"2025-08-07T09:30:38+00:00\"\n },\n {\n \"name\": \"fakerphp/faker\",\n \"version\": \"v1.24.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/FakerPHP/Faker.git\",\n \"reference\": \"e0ee18eb1e6dc3cda3ce9fd97e5a0689a88a64b5\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/FakerPHP/Faker/zipball/e0ee18eb1e6dc3cda3ce9fd97e5a0689a88a64b5\",\n \"reference\": \"e0ee18eb1e6dc3cda3ce9fd97e5a0689a88a64b5\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \"^7.4 || ^8.0\",\n \"psr/container\": \"^1.0 || ^2.0\",\n \"symfony/deprecation-contracts\": \"^2.2 || ^3.0\"\n },\n \"conflict\": {\n \"fzaninotto/faker\": \"*\"\n },\n \"require-dev\": {\n \"bamarni/composer-bin-plugin\": \"^1.4.1\",\n \"doctrine/persistence\": \"^1.3 || ^2.0\",\n \"ext-intl\": \"*\",\n \"phpunit/phpunit\": \"^9.5.26\",\n \"symfony/phpunit-bridge\": \"^5.4.16\"\n },\n \"suggest\": {\n \"doctrine/orm\": \"Required to use Faker\\\\ORM\\\\Doctrine\",\n \"ext-curl\": \"Required by Faker\\\\Provider\\\\Image to download images.\",\n \"ext-dom\": \"Required by Faker\\\\Provider\\\\HtmlLorem for generating random HTML.\",\n \"ext-iconv\": \"Required by Faker\\\\Provider\\\\ru_RU\\\\Text::realText() for generating real Russian text.\",\n \"ext-mbstring\": \"Required for multibyte Unicode string functionality.\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Faker\\\\\": \"src/Faker/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"François Zaninotto\"\n }\n ],\n \"description\": \"Faker is a PHP library that generates fake data for you.\",\n \"keywords\": [\n \"data\",\n \"faker\",\n \"fixtures\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/FakerPHP/Faker/issues\",\n \"source\": \"https://github.com/FakerPHP/Faker/tree/v1.24.1\"\n },\n \"time\": \"2024-11-21T13:46:39+00:00\"\n },\n {\n \"name\": \"firebase/php-jwt\",\n \"version\": \"v7.0.3\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/firebase/php-jwt.git\",\n \"reference\": \"28aa0694bcfdfa5e2959c394d5a1ee7a5083629e\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/firebase/php-jwt/zipball/28aa0694bcfdfa5e2959c394d5a1ee7a5083629e\",\n \"reference\": \"28aa0694bcfdfa5e2959c394d5a1ee7a5083629e\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \"^8.0\"\n },\n \"require-dev\": {\n \"guzzlehttp/guzzle\": \"^7.4\",\n \"phpspec/prophecy-phpunit\": \"^2.0\",\n \"phpunit/phpunit\": \"^9.5\",\n \"psr/cache\": \"^2.0||^3.0\",\n \"psr/http-client\": \"^1.0\",\n \"psr/http-factory\": \"^1.0\"\n },\n \"suggest\": {\n \"ext-sodium\": \"Support EdDSA (Ed25519) signatures\",\n \"paragonie/sodium_compat\": \"Support EdDSA (Ed25519) signatures when libsodium is not present\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Firebase\\\\JWT\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"BSD-3-Clause\"\n ],\n \"authors\": [\n {\n \"name\": \"Neuman Vong\",\n \"email\": \"neuman+pear@twilio.com\",\n \"role\": \"Developer\"\n },\n {\n \"name\": \"Anant Narayanan\",\n \"email\": \"anant@php.net\",\n \"role\": \"Developer\"\n }\n ],\n \"description\": \"A simple library to encode and decode JSON Web Tokens (JWT) in PHP. Should conform to the current spec.\",\n \"homepage\": \"https://github.com/firebase/php-jwt\",\n \"keywords\": [\n \"jwt\",\n \"php\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/firebase/php-jwt/issues\",\n \"source\": \"https://github.com/firebase/php-jwt/tree/v7.0.3\"\n },\n \"time\": \"2026-02-25T22:16:40+00:00\"\n },\n {\n \"name\": \"flipboxdigital/oauth2-hubspot\",\n \"version\": \"1.0.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/flipbox/oauth2-hubspot.git\",\n \"reference\": \"4e7def2ee4505dfc206cfa1969fa7ed2b2f89af8\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/flipbox/oauth2-hubspot/zipball/4e7def2ee4505dfc206cfa1969fa7ed2b2f89af8\",\n \"reference\": \"4e7def2ee4505dfc206cfa1969fa7ed2b2f89af8\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"league/oauth2-client\": \"^2.0\"\n },\n \"require-dev\": {\n \"mockery/mockery\": \"~0.9\",\n \"phpunit/phpunit\": \"~4.0\",\n \"squizlabs/php_codesniffer\": \"~2.0\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"1.0.x-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Flipbox\\\\OAuth2\\\\Client\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"description\": \"HubSpot OAuth 2.0 Client Provider for The PHP League OAuth2-Client\",\n \"keywords\": [\n \"authorisation\",\n \"authorization\",\n \"client\",\n \"hubspot\",\n \"oauth\",\n \"oauth2\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/flipbox/oauth2-hubspot/issues\",\n \"source\": \"https://github.com/flipbox/oauth2-hubspot/tree/develop\"\n },\n \"time\": \"2018-07-09T15:15:59+00:00\"\n },\n {\n \"name\": \"fruitcake/php-cors\",\n \"version\": \"v1.4.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/fruitcake/php-cors.git\",\n \"reference\": \"38aaa6c3fd4c157ffe2a4d10aa8b9b16ba8de379\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/fruitcake/php-cors/zipball/38aaa6c3fd4c157ffe2a4d10aa8b9b16ba8de379\",\n \"reference\": \"38aaa6c3fd4c157ffe2a4d10aa8b9b16ba8de379\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \"^8.1\",\n \"symfony/http-foundation\": \"^5.4|^6.4|^7.3|^8\"\n },\n \"require-dev\": {\n \"phpstan/phpstan\": \"^2\",\n \"phpunit/phpunit\": \"^9\",\n \"squizlabs/php_codesniffer\": \"^4\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"1.3-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Fruitcake\\\\Cors\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Fruitcake\",\n \"homepage\": \"https://fruitcake.nl\"\n },\n {\n \"name\": \"Barryvdh\",\n \"email\": \"barryvdh@gmail.com\"\n }\n ],\n \"description\": \"Cross-origin resource sharing library for the Symfony HttpFoundation\",\n \"homepage\": \"https://github.com/fruitcake/php-cors\",\n \"keywords\": [\n \"cors\",\n \"laravel\",\n \"symfony\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/fruitcake/php-cors/issues\",\n \"source\": \"https://github.com/fruitcake/php-cors/tree/v1.4.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://fruitcake.nl\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/barryvdh\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2025-12-03T09:33:47+00:00\"\n },\n {\n \"name\": \"giggsey/libphonenumber-for-php\",\n \"version\": \"8.13.55\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/giggsey/libphonenumber-for-php.git\",\n \"reference\": \"6e28b3d53cf96d7f41c83d9b80b6021ecbd00537\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/giggsey/libphonenumber-for-php/zipball/6e28b3d53cf96d7f41c83d9b80b6021ecbd00537\",\n \"reference\": \"6e28b3d53cf96d7f41c83d9b80b6021ecbd00537\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"giggsey/locale\": \"^2.0\",\n \"php\": \"^7.4|^8.0\",\n \"symfony/polyfill-mbstring\": \"^1.17\"\n },\n \"replace\": {\n \"giggsey/libphonenumber-for-php-lite\": \"self.version\"\n },\n \"require-dev\": {\n \"friendsofphp/php-cs-fixer\": \"^3.64\",\n \"pear/pear-core-minimal\": \"^1.10\",\n \"pear/pear_exception\": \"^1.0\",\n \"pear/versioncontrol_git\": \"^0.7\",\n \"phing/phing\": \"^3.0\",\n \"php-coveralls/php-coveralls\": \"^2.0\",\n \"phpunit/phpunit\": \"^9.6\",\n \"symfony/console\": \"^v5.2\",\n \"symfony/var-exporter\": \"^5.2\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"8.x-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"libphonenumber\\\\\": \"src/\"\n },\n \"exclude-from-classmap\": [\n \"/src/data/\",\n \"/src/carrier/data/\",\n \"/src/geocoding/data/\",\n \"/src/timezone/data/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"Apache-2.0\"\n ],\n \"authors\": [\n {\n \"name\": \"Joshua Gigg\",\n \"email\": \"giggsey@gmail.com\",\n \"homepage\": \"https://giggsey.com/\"\n }\n ],\n \"description\": \"PHP Port of Google's libphonenumber\",\n \"homepage\": \"https://github.com/giggsey/libphonenumber-for-php\",\n \"keywords\": [\n \"geocoding\",\n \"geolocation\",\n \"libphonenumber\",\n \"mobile\",\n \"phonenumber\",\n \"validation\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/giggsey/libphonenumber-for-php/issues\",\n \"source\": \"https://github.com/giggsey/libphonenumber-for-php\"\n },\n \"time\": \"2025-02-14T08:14:08+00:00\"\n },\n {\n \"name\": \"giggsey/locale\",\n \"version\": \"2.8.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/giggsey/Locale.git\",\n \"reference\": \"1cd8b3ad2d43e04f4c2c6a240495af44780f809b\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/giggsey/Locale/zipball/1cd8b3ad2d43e04f4c2c6a240495af44780f809b\",\n \"reference\": \"1cd8b3ad2d43e04f4c2c6a240495af44780f809b\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \"^8.1\"\n },\n \"require-dev\": {\n \"ext-json\": \"*\",\n \"friendsofphp/php-cs-fixer\": \"^3.66\",\n \"pear/pear-core-minimal\": \"^1.10\",\n \"pear/pear_exception\": \"^1.0\",\n \"pear/versioncontrol_git\": \"^0.5\",\n \"phing/phing\": \"^2.17.4\",\n \"php-coveralls/php-coveralls\": \"^2.7\",\n \"phpunit/phpunit\": \"^10.5.45\",\n \"symfony/console\": \"^6.4\",\n \"symfony/filesystem\": \"6.4\",\n \"symfony/finder\": \"^6.4\",\n \"symfony/process\": \"^6.4\",\n \"symfony/var-exporter\": \"^6.4\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Giggsey\\\\Locale\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Joshua Gigg\",\n \"email\": \"giggsey@gmail.com\",\n \"homepage\": \"https://giggsey.com/\"\n }\n ],\n \"description\": \"Locale functions required by libphonenumber-for-php\",\n \"support\": {\n \"issues\": \"https://github.com/giggsey/Locale/issues\",\n \"source\": \"https://github.com/giggsey/Locale/tree/2.8.0\"\n },\n \"time\": \"2025-03-20T14:25:27+00:00\"\n },\n {\n \"name\": \"google/apiclient\",\n \"version\": \"v2.19.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/googleapis/google-api-php-client.git\",\n \"reference\": \"b18fa8aed7b2b2dd4bcce74e2c7d267e16007ea9\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/googleapis/google-api-php-client/zipball/b18fa8aed7b2b2dd4bcce74e2c7d267e16007ea9\",\n \"reference\": \"b18fa8aed7b2b2dd4bcce74e2c7d267e16007ea9\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"firebase/php-jwt\": \"^6.0||^7.0\",\n \"google/apiclient-services\": \"~0.350\",\n \"google/auth\": \"^1.37\",\n \"guzzlehttp/guzzle\": \"^7.4.5\",\n \"guzzlehttp/psr7\": \"^2.6\",\n \"monolog/monolog\": \"^2.9||^3.0\",\n \"php\": \"^8.1\",\n \"phpseclib/phpseclib\": \"^3.0.36\"\n },\n \"require-dev\": {\n \"cache/filesystem-adapter\": \"^1.1\",\n \"composer/composer\": \"^1.10.23\",\n \"phpcompatibility/php-compatibility\": \"^9.2\",\n \"phpspec/prophecy-phpunit\": \"^2.1\",\n \"phpunit/phpunit\": \"^9.6\",\n \"squizlabs/php_codesniffer\": \"^3.8\",\n \"symfony/css-selector\": \"~2.1\",\n \"symfony/dom-crawler\": \"~2.1\"\n },\n \"suggest\": {\n \"cache/filesystem-adapter\": \"For caching certs and tokens (using Google\\\\Client::setCache)\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-main\": \"2.x-dev\"\n }\n },\n \"autoload\": {\n \"files\": [\n \"src/aliases.php\"\n ],\n \"psr-4\": {\n \"Google\\\\\": \"src/\"\n },\n \"classmap\": [\n \"src/aliases.php\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"Apache-2.0\"\n ],\n \"description\": \"Client library for Google APIs\",\n \"homepage\": \"http://developers.google.com/api-client-library/php\",\n \"keywords\": [\n \"google\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/googleapis/google-api-php-client/issues\",\n \"source\": \"https://github.com/googleapis/google-api-php-client/tree/v2.19.0\"\n },\n \"time\": \"2026-01-09T19:59:47+00:00\"\n },\n {\n \"name\": \"google/apiclient-services\",\n \"version\": \"v0.435.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/googleapis/google-api-php-client-services.git\",\n \"reference\": \"1edf0f5f2876945c372366107b4d7a387b17a6b9\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/googleapis/google-api-php-client-services/zipball/1edf0f5f2876945c372366107b4d7a387b17a6b9\",\n \"reference\": \"1edf0f5f2876945c372366107b4d7a387b17a6b9\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \"^8.1\"\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \"^9.6\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"files\": [\n \"autoload.php\"\n ],\n \"psr-4\": {\n \"Google\\\\Service\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"Apache-2.0\"\n ],\n \"description\": \"Client library for Google APIs\",\n \"homepage\": \"http://developers.google.com/api-client-library/php\",\n \"keywords\": [\n \"google\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/googleapis/google-api-php-client-services/issues\",\n \"source\": \"https://github.com/googleapis/google-api-php-client-services/tree/v0.435.0\"\n },\n \"time\": \"2026-03-01T01:14:26+00:00\"\n },\n {\n \"name\": \"google/apps-meet\",\n \"version\": \"v0.5.3\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/googleapis/php-apps-meet.git\",\n \"reference\": \"2e186214b725f98ed58520d0ac170ec821d11f95\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/googleapis/php-apps-meet/zipball/2e186214b725f98ed58520d0ac170ec821d11f95\",\n \"reference\": \"2e186214b725f98ed58520d0ac170ec821d11f95\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"google/gax\": \"^1.38.0\",\n \"php\": \"^8.1\"\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \"^9.0\"\n },\n \"suggest\": {\n \"ext-grpc\": \"Enables use of gRPC, a universal high-performance RPC framework created by Google.\",\n \"ext-protobuf\": \"Provides a significant increase in throughput over the pure PHP protobuf implementation. See https://cloud.google.com/php/grpc for installation instructions.\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"component\": {\n \"id\": \"apps-meet\",\n \"path\": \"AppsMeet\",\n \"target\": \"googleapis/php-apps-meet\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Google\\\\Apps\\\\Meet\\\\\": \"src\",\n \"GPBMetadata\\\\Google\\\\Apps\\\\Meet\\\\\": \"metadata\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"Apache-2.0\"\n ],\n \"description\": \"Google Apps Meet Client for PHP\",\n \"support\": {\n \"source\": \"https://github.com/googleapis/php-apps-meet/tree/v0.5.3\"\n },\n \"time\": \"2026-01-23T22:57:13+00:00\"\n },\n {\n \"name\": \"google/auth\",\n \"version\": \"v1.50.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/googleapis/google-auth-library-php.git\",\n \"reference\": \"e1c26a718198e16d8a3c69b1cae136b73f959b0f\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/googleapis/google-auth-library-php/zipball/e1c26a718198e16d8a3c69b1cae136b73f959b0f\",\n \"reference\": \"e1c26a718198e16d8a3c69b1cae136b73f959b0f\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"firebase/php-jwt\": \"^6.0||^7.0\",\n \"guzzlehttp/guzzle\": \"^7.4.5\",\n \"guzzlehttp/psr7\": \"^2.4.5\",\n \"php\": \"^8.1\",\n \"psr/cache\": \"^2.0||^3.0\",\n \"psr/http-message\": \"^1.1||^2.0\",\n \"psr/log\": \"^3.0\"\n },\n \"require-dev\": {\n \"guzzlehttp/promises\": \"^2.0\",\n \"kelvinmo/simplejwt\": \"^1.1.0\",\n \"phpseclib/phpseclib\": \"^3.0.35\",\n \"phpspec/prophecy-phpunit\": \"^2.1\",\n \"phpunit/phpunit\": \"^9.6\",\n \"sebastian/comparator\": \">=1.2.3\",\n \"squizlabs/php_codesniffer\": \"^4.0\",\n \"symfony/filesystem\": \"^6.3||^7.3\",\n \"symfony/process\": \"^6.0||^7.0\",\n \"webmozart/assert\": \"^1.11||^2.0\"\n },\n \"suggest\": {\n \"phpseclib/phpseclib\": \"May be used in place of OpenSSL for signing strings or for token management. Please require version ^2.\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Google\\\\Auth\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"Apache-2.0\"\n ],\n \"description\": \"Google Auth Library for PHP\",\n \"homepage\": \"https://github.com/google/google-auth-library-php\",\n \"keywords\": [\n \"Authentication\",\n \"google\",\n \"oauth2\"\n ],\n \"support\": {\n \"docs\": \"https://cloud.google.com/php/docs/reference/auth/latest\",\n \"issues\": \"https://github.com/googleapis/google-auth-library-php/issues\",\n \"source\": \"https://github.com/googleapis/google-auth-library-php/tree/v1.50.0\"\n },\n \"time\": \"2026-01-08T21:33:57+00:00\"\n },\n {\n \"name\": \"google/common-protos\",\n \"version\": \"4.12.4\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/googleapis/common-protos-php.git\",\n \"reference\": \"0127156899af0df2681bd42024c60bd5360d64e3\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/googleapis/common-protos-php/zipball/0127156899af0df2681bd42024c60bd5360d64e3\",\n \"reference\": \"0127156899af0df2681bd42024c60bd5360d64e3\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"google/protobuf\": \"^4.31\",\n \"php\": \"^8.1\"\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \"^9.6\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"component\": {\n \"id\": \"common-protos\",\n \"path\": \"CommonProtos\",\n \"entry\": \"README.md\",\n \"target\": \"googleapis/common-protos-php.git\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Google\\\\Api\\\\\": \"src/Api\",\n \"Google\\\\Iam\\\\\": \"src/Iam\",\n \"Google\\\\Rpc\\\\\": \"src/Rpc\",\n \"Google\\\\Type\\\\\": \"src/Type\",\n \"Google\\\\Cloud\\\\\": \"src/Cloud\",\n \"GPBMetadata\\\\Google\\\\Api\\\\\": \"metadata/Api\",\n \"GPBMetadata\\\\Google\\\\Iam\\\\\": \"metadata/Iam\",\n \"GPBMetadata\\\\Google\\\\Rpc\\\\\": \"metadata/Rpc\",\n \"GPBMetadata\\\\Google\\\\Type\\\\\": \"metadata/Type\",\n \"GPBMetadata\\\\Google\\\\Cloud\\\\\": \"metadata/Cloud\",\n \"GPBMetadata\\\\Google\\\\Logging\\\\\": \"metadata/Logging\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"Apache-2.0\"\n ],\n \"description\": \"Google API Common Protos for PHP\",\n \"homepage\": \"https://github.com/googleapis/common-protos-php\",\n \"keywords\": [\n \"google\"\n ],\n \"support\": {\n \"source\": \"https://github.com/googleapis/common-protos-php/tree/v4.12.4\"\n },\n \"time\": \"2025-09-20T01:29:44+00:00\"\n },\n {\n \"name\": \"google/gax\",\n \"version\": \"v1.42.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/googleapis/gax-php.git\",\n \"reference\": \"ab334c4869f4f16b6112acc95972a97b81dbfdda\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/googleapis/gax-php/zipball/ab334c4869f4f16b6112acc95972a97b81dbfdda\",\n \"reference\": \"ab334c4869f4f16b6112acc95972a97b81dbfdda\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"google/auth\": \"^1.49\",\n \"google/common-protos\": \"^4.4\",\n \"google/grpc-gcp\": \"^0.4\",\n \"google/longrunning\": \"~0.4\",\n \"google/protobuf\": \"^4.31||^5.0\",\n \"grpc/grpc\": \"^1.13\",\n \"guzzlehttp/promises\": \"^2.0\",\n \"guzzlehttp/psr7\": \"^2.0\",\n \"php\": \"^8.1\",\n \"ramsey/uuid\": \"^4.0\"\n },\n \"conflict\": {\n \"ext-protobuf\": \"<4.31.0\"\n },\n \"require-dev\": {\n \"google/cloud-tools\": \"^0.16.1\",\n \"phpspec/prophecy-phpunit\": \"^2.1\",\n \"phpstan/phpstan\": \"^2.0\",\n \"phpunit/phpunit\": \"^9.6\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Google\\\\ApiCore\\\\\": \"src\",\n \"GPBMetadata\\\\ApiCore\\\\\": \"metadata/ApiCore\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"BSD-3-Clause\"\n ],\n \"description\": \"Google API Core for PHP\",\n \"homepage\": \"https://github.com/googleapis/gax-php\",\n \"keywords\": [\n \"google\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/googleapis/gax-php/issues\",\n \"source\": \"https://github.com/googleapis/gax-php/tree/v1.42.1\"\n },\n \"time\": \"2026-03-12T21:22:20+00:00\"\n },\n {\n \"name\": \"google/grpc-gcp\",\n \"version\": \"0.4.2\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/GoogleCloudPlatform/grpc-gcp-php.git\",\n \"reference\": \"1049c0c15b6a1789fdeb52af688a94d540932469\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/GoogleCloudPlatform/grpc-gcp-php/zipball/1049c0c15b6a1789fdeb52af688a94d540932469\",\n \"reference\": \"1049c0c15b6a1789fdeb52af688a94d540932469\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"google/auth\": \"^1.3\",\n \"google/protobuf\": \"^v3.25.3||^4.26.1||^5.0\",\n \"grpc/grpc\": \"^v1.13.0\",\n \"php\": \"^8.0\",\n \"psr/cache\": \"^1.0.1||^2.0.0||^3.0.0\"\n },\n \"require-dev\": {\n \"google/cloud-spanner\": \"^1.7\",\n \"phpunit/phpunit\": \"^9.0\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Grpc\\\\Gcp\\\\\": \"src/\"\n },\n \"classmap\": [\n \"src/generated/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"Apache-2.0\"\n ],\n \"description\": \"gRPC GCP library for channel management\",\n \"support\": {\n \"issues\": \"https://github.com/GoogleCloudPlatform/grpc-gcp-php/issues\",\n \"source\": \"https://github.com/GoogleCloudPlatform/grpc-gcp-php/tree/v0.4.2\"\n },\n \"time\": \"2026-03-12T22:56:09+00:00\"\n },\n {\n \"name\": \"google/longrunning\",\n \"version\": \"0.6.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/googleapis/php-longrunning.git\",\n \"reference\": \"226d3b5166eaa13754cc5e452b37872478e23375\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/googleapis/php-longrunning/zipball/226d3b5166eaa13754cc5e452b37872478e23375\",\n \"reference\": \"226d3b5166eaa13754cc5e452b37872478e23375\",\n \"shasum\": \"\"\n },\n \"require-dev\": {\n \"google/gax\": \"^1.38.0\",\n \"phpunit/phpunit\": \"^9.0\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"component\": {\n \"id\": \"longrunning\",\n \"path\": \"LongRunning\",\n \"entry\": null,\n \"target\": \"googleapis/php-longrunning\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Google\\\\LongRunning\\\\\": \"src/LongRunning\",\n \"Google\\\\ApiCore\\\\LongRunning\\\\\": \"src/ApiCore/LongRunning\",\n \"GPBMetadata\\\\Google\\\\Longrunning\\\\\": \"metadata/Longrunning\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"Apache-2.0\"\n ],\n \"description\": \"Google LongRunning Client for PHP\",\n \"support\": {\n \"source\": \"https://github.com/googleapis/php-longrunning/tree/v0.6.0\"\n },\n \"time\": \"2025-10-07T18:41:09+00:00\"\n },\n {\n \"name\": \"google/protobuf\",\n \"version\": \"v4.33.6\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/protocolbuffers/protobuf-php.git\",\n \"reference\": \"84b008c23915ed94536737eae46f41ba3bccfe67\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/protocolbuffers/protobuf-php/zipball/84b008c23915ed94536737eae46f41ba3bccfe67\",\n \"reference\": \"84b008c23915ed94536737eae46f41ba3bccfe67\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.1.0\"\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \">=10.5.62 <11.0.0\"\n },\n \"suggest\": {\n \"ext-bcmath\": \"Need to support JSON deserialization\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Google\\\\Protobuf\\\\\": \"src/Google/Protobuf\",\n \"GPBMetadata\\\\Google\\\\Protobuf\\\\\": \"src/GPBMetadata/Google/Protobuf\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"BSD-3-Clause\"\n ],\n \"description\": \"proto library for PHP\",\n \"homepage\": \"https://developers.google.com/protocol-buffers/\",\n \"keywords\": [\n \"proto\"\n ],\n \"support\": {\n \"source\": \"https://github.com/protocolbuffers/protobuf-php/tree/v4.33.6\"\n },\n \"time\": \"2026-03-18T17:32:05+00:00\"\n },\n {\n \"name\": \"graham-campbell/manager\",\n \"version\": \"v5.2.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/GrahamCampbell/Laravel-Manager.git\",\n \"reference\": \"b6a4172a32b931fe20c5c242251c8c98b2c79e41\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/GrahamCampbell/Laravel-Manager/zipball/b6a4172a32b931fe20c5c242251c8c98b2c79e41\",\n \"reference\": \"b6a4172a32b931fe20c5c242251c8c98b2c79e41\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"illuminate/contracts\": \"^8.75 || ^9.0 || ^10.0 || ^11.0 || ^12.0\",\n \"illuminate/support\": \"^8.75 || ^9.0 || ^10.0 || ^11.0 || ^12.0\",\n \"php\": \"^7.4.15 || ^8.0.2\"\n },\n \"require-dev\": {\n \"graham-campbell/analyzer\": \"^4.2.1 || ^5.0.0\",\n \"graham-campbell/testbench-core\": \"^4.2.1\",\n \"mockery/mockery\": \"^1.6.12\",\n \"phpunit/phpunit\": \"^9.6.22 || ^10.5.45 || ^11.5.10\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"GrahamCampbell\\\\Manager\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Graham Campbell\",\n \"email\": \"hello@gjcampbell.co.uk\",\n \"homepage\": \"https://github.com/GrahamCampbell\"\n }\n ],\n \"description\": \"Manager Provides Some Manager Functionality For Laravel\",\n \"keywords\": [\n \"Graham Campbell\",\n \"GrahamCampbell\",\n \"Laravel Manager\",\n \"Laravel-Manager\",\n \"connector\",\n \"framework\",\n \"interface\",\n \"laravel\",\n \"manager\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/GrahamCampbell/Laravel-Manager/issues\",\n \"source\": \"https://github.com/GrahamCampbell/Laravel-Manager/tree/v5.2.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/GrahamCampbell\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/graham-campbell/manager\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2025-03-02T20:18:37+00:00\"\n },\n {\n \"name\": \"graham-campbell/result-type\",\n \"version\": \"v1.1.4\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/GrahamCampbell/Result-Type.git\",\n \"reference\": \"e01f4a821471308ba86aa202fed6698b6b695e3b\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/GrahamCampbell/Result-Type/zipball/e01f4a821471308ba86aa202fed6698b6b695e3b\",\n \"reference\": \"e01f4a821471308ba86aa202fed6698b6b695e3b\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \"^7.2.5 || ^8.0\",\n \"phpoption/phpoption\": \"^1.9.5\"\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \"^8.5.41 || ^9.6.22 || ^10.5.45 || ^11.5.7\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"GrahamCampbell\\\\ResultType\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Graham Campbell\",\n \"email\": \"hello@gjcampbell.co.uk\",\n \"homepage\": \"https://github.com/GrahamCampbell\"\n }\n ],\n \"description\": \"An Implementation Of The Result Type\",\n \"keywords\": [\n \"Graham Campbell\",\n \"GrahamCampbell\",\n \"Result Type\",\n \"Result-Type\",\n \"result\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/GrahamCampbell/Result-Type/issues\",\n \"source\": \"https://github.com/GrahamCampbell/Result-Type/tree/v1.1.4\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/GrahamCampbell\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/graham-campbell/result-type\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2025-12-27T19:43:20+00:00\"\n },\n {\n \"name\": \"grpc/grpc\",\n \"version\": \"1.74.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/grpc/grpc-php.git\",\n \"reference\": \"32bf4dba256d60d395582fb6e4e8d3936bcdb713\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/grpc/grpc-php/zipball/32bf4dba256d60d395582fb6e4e8d3936bcdb713\",\n \"reference\": \"32bf4dba256d60d395582fb6e4e8d3936bcdb713\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=7.0.0\"\n },\n \"require-dev\": {\n \"google/auth\": \"^v1.3.0\"\n },\n \"suggest\": {\n \"ext-protobuf\": \"For better performance, install the protobuf C extension.\",\n \"google/protobuf\": \"To get started using grpc quickly, install the native protobuf library.\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Grpc\\\\\": \"src/lib/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"Apache-2.0\"\n ],\n \"description\": \"gRPC library for PHP\",\n \"homepage\": \"https://grpc.io\",\n \"keywords\": [\n \"rpc\"\n ],\n \"support\": {\n \"source\": \"https://github.com/grpc/grpc-php/tree/v1.74.0\"\n },\n \"time\": \"2025-07-24T20:02:16+00:00\"\n },\n {\n \"name\": \"guzzlehttp/guzzle\",\n \"version\": \"7.10.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/guzzle/guzzle.git\",\n \"reference\": \"b51ac707cfa420b7bfd4e4d5e510ba8008e822b4\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/guzzle/guzzle/zipball/b51ac707cfa420b7bfd4e4d5e510ba8008e822b4\",\n \"reference\": \"b51ac707cfa420b7bfd4e4d5e510ba8008e822b4\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"ext-json\": \"*\",\n \"guzzlehttp/promises\": \"^2.3\",\n \"guzzlehttp/psr7\": \"^2.8\",\n \"php\": \"^7.2.5 || ^8.0\",\n \"psr/http-client\": \"^1.0\",\n \"symfony/deprecation-contracts\": \"^2.2 || ^3.0\"\n },\n \"provide\": {\n \"psr/http-client-implementation\": \"1.0\"\n },\n \"require-dev\": {\n \"bamarni/composer-bin-plugin\": \"^1.8.2\",\n \"ext-curl\": \"*\",\n \"guzzle/client-integration-tests\": \"3.0.2\",\n \"php-http/message-factory\": \"^1.1\",\n \"phpunit/phpunit\": \"^8.5.39 || ^9.6.20\",\n \"psr/log\": \"^1.1 || ^2.0 || ^3.0\"\n },\n \"suggest\": {\n \"ext-curl\": \"Required for CURL handler support\",\n \"ext-intl\": \"Required for Internationalized Domain Name (IDN) support\",\n \"psr/log\": \"Required for using the Log middleware\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"bamarni-bin\": {\n \"bin-links\": true,\n \"forward-command\": false\n }\n },\n \"autoload\": {\n \"files\": [\n \"src/functions_include.php\"\n ],\n \"psr-4\": {\n \"GuzzleHttp\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Graham Campbell\",\n \"email\": \"hello@gjcampbell.co.uk\",\n \"homepage\": \"https://github.com/GrahamCampbell\"\n },\n {\n \"name\": \"Michael Dowling\",\n \"email\": \"mtdowling@gmail.com\",\n \"homepage\": \"https://github.com/mtdowling\"\n },\n {\n \"name\": \"Jeremy Lindblom\",\n \"email\": \"jeremeamia@gmail.com\",\n \"homepage\": \"https://github.com/jeremeamia\"\n },\n {\n \"name\": \"George Mponos\",\n \"email\": \"gmponos@gmail.com\",\n \"homepage\": \"https://github.com/gmponos\"\n },\n {\n \"name\": \"Tobias Nyholm\",\n \"email\": \"tobias.nyholm@gmail.com\",\n \"homepage\": \"https://github.com/Nyholm\"\n },\n {\n \"name\": \"Márk Sági-Kazár\",\n \"email\": \"mark.sagikazar@gmail.com\",\n \"homepage\": \"https://github.com/sagikazarmark\"\n },\n {\n \"name\": \"Tobias Schultze\",\n \"email\": \"webmaster@tubo-world.de\",\n \"homepage\": \"https://github.com/Tobion\"\n }\n ],\n \"description\": \"Guzzle is a PHP HTTP client library\",\n \"keywords\": [\n \"client\",\n \"curl\",\n \"framework\",\n \"http\",\n \"http client\",\n \"psr-18\",\n \"psr-7\",\n \"rest\",\n \"web service\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/guzzle/guzzle/issues\",\n \"source\": \"https://github.com/guzzle/guzzle/tree/7.10.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/GrahamCampbell\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://github.com/Nyholm\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/guzzlehttp/guzzle\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2025-08-23T22:36:01+00:00\"\n },\n {\n \"name\": \"guzzlehttp/promises\",\n \"version\": \"2.3.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/guzzle/promises.git\",\n \"reference\": \"481557b130ef3790cf82b713667b43030dc9c957\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/guzzle/promises/zipball/481557b130ef3790cf82b713667b43030dc9c957\",\n \"reference\": \"481557b130ef3790cf82b713667b43030dc9c957\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \"^7.2.5 || ^8.0\"\n },\n \"require-dev\": {\n \"bamarni/composer-bin-plugin\": \"^1.8.2\",\n \"phpunit/phpunit\": \"^8.5.44 || ^9.6.25\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"bamarni-bin\": {\n \"bin-links\": true,\n \"forward-command\": false\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"GuzzleHttp\\\\Promise\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Graham Campbell\",\n \"email\": \"hello@gjcampbell.co.uk\",\n \"homepage\": \"https://github.com/GrahamCampbell\"\n },\n {\n \"name\": \"Michael Dowling\",\n \"email\": \"mtdowling@gmail.com\",\n \"homepage\": \"https://github.com/mtdowling\"\n },\n {\n \"name\": \"Tobias Nyholm\",\n \"email\": \"tobias.nyholm@gmail.com\",\n \"homepage\": \"https://github.com/Nyholm\"\n },\n {\n \"name\": \"Tobias Schultze\",\n \"email\": \"webmaster@tubo-world.de\",\n \"homepage\": \"https://github.com/Tobion\"\n }\n ],\n \"description\": \"Guzzle promises library\",\n \"keywords\": [\n \"promise\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/guzzle/promises/issues\",\n \"source\": \"https://github.com/guzzle/promises/tree/2.3.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/GrahamCampbell\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://github.com/Nyholm\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/guzzlehttp/promises\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2025-08-22T14:34:08+00:00\"\n },\n {\n \"name\": \"guzzlehttp/psr7\",\n \"version\": \"2.9.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/guzzle/psr7.git\",\n \"reference\": \"7d0ed42f28e42d61352a7a79de682e5e67fec884\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/guzzle/psr7/zipball/7d0ed42f28e42d61352a7a79de682e5e67fec884\",\n \"reference\": \"7d0ed42f28e42d61352a7a79de682e5e67fec884\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \"^7.2.5 || ^8.0\",\n \"psr/http-factory\": \"^1.0\",\n \"psr/http-message\": \"^1.1 || ^2.0\",\n \"ralouphie/getallheaders\": \"^3.0\"\n },\n \"provide\": {\n \"psr/http-factory-implementation\": \"1.0\",\n \"psr/http-message-implementation\": \"1.0\"\n },\n \"require-dev\": {\n \"bamarni/composer-bin-plugin\": \"^1.8.2\",\n \"http-interop/http-factory-tests\": \"0.9.0\",\n \"jshttp/mime-db\": \"1.54.0.1\",\n \"phpunit/phpunit\": \"^8.5.44 || ^9.6.25\"\n },\n \"suggest\": {\n \"laminas/laminas-httphandlerrunner\": \"Emit PSR-7 responses\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"bamarni-bin\": {\n \"bin-links\": true,\n \"forward-command\": false\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"GuzzleHttp\\\\Psr7\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Graham Campbell\",\n \"email\": \"hello@gjcampbell.co.uk\",\n \"homepage\": \"https://github.com/GrahamCampbell\"\n },\n {\n \"name\": \"Michael Dowling\",\n \"email\": \"mtdowling@gmail.com\",\n \"homepage\": \"https://github.com/mtdowling\"\n },\n {\n \"name\": \"George Mponos\",\n \"email\": \"gmponos@gmail.com\",\n \"homepage\": \"https://github.com/gmponos\"\n },\n {\n \"name\": \"Tobias Nyholm\",\n \"email\": \"tobias.nyholm@gmail.com\",\n \"homepage\": \"https://github.com/Nyholm\"\n },\n {\n \"name\": \"Márk Sági-Kazár\",\n \"email\": \"mark.sagikazar@gmail.com\",\n \"homepage\": \"https://github.com/sagikazarmark\"\n },\n {\n \"name\": \"Tobias Schultze\",\n \"email\": \"webmaster@tubo-world.de\",\n \"homepage\": \"https://github.com/Tobion\"\n },\n {\n \"name\": \"Márk Sági-Kazár\",\n \"email\": \"mark.sagikazar@gmail.com\",\n \"homepage\": \"https://sagikazarmark.hu\"\n }\n ],\n \"description\": \"PSR-7 message implementation that also provides common utility methods\",\n \"keywords\": [\n \"http\",\n \"message\",\n \"psr-7\",\n \"request\",\n \"response\",\n \"stream\",\n \"uri\",\n \"url\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/guzzle/psr7/issues\",\n \"source\": \"https://github.com/guzzle/psr7/tree/2.9.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/GrahamCampbell\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://github.com/Nyholm\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/guzzlehttp/psr7\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2026-03-10T16:41:02+00:00\"\n },\n {\n \"name\": \"guzzlehttp/uri-template\",\n \"version\": \"v1.0.5\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/guzzle/uri-template.git\",\n \"reference\": \"4f4bbd4e7172148801e76e3decc1e559bdee34e1\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/guzzle/uri-template/zipball/4f4bbd4e7172148801e76e3decc1e559bdee34e1\",\n \"reference\": \"4f4bbd4e7172148801e76e3decc1e559bdee34e1\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \"^7.2.5 || ^8.0\",\n \"symfony/polyfill-php80\": \"^1.24\"\n },\n \"require-dev\": {\n \"bamarni/composer-bin-plugin\": \"^1.8.2\",\n \"phpunit/phpunit\": \"^8.5.44 || ^9.6.25\",\n \"uri-template/tests\": \"1.0.0\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"bamarni-bin\": {\n \"bin-links\": true,\n \"forward-command\": false\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"GuzzleHttp\\\\UriTemplate\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Graham Campbell\",\n \"email\": \"hello@gjcampbell.co.uk\",\n \"homepage\": \"https://github.com/GrahamCampbell\"\n },\n {\n \"name\": \"Michael Dowling\",\n \"email\": \"mtdowling@gmail.com\",\n \"homepage\": \"https://github.com/mtdowling\"\n },\n {\n \"name\": \"George Mponos\",\n \"email\": \"gmponos@gmail.com\",\n \"homepage\": \"https://github.com/gmponos\"\n },\n {\n \"name\": \"Tobias Nyholm\",\n \"email\": \"tobias.nyholm@gmail.com\",\n \"homepage\": \"https://github.com/Nyholm\"\n }\n ],\n \"description\": \"A polyfill class for uri_template of PHP\",\n \"keywords\": [\n \"guzzlehttp\",\n \"uri-template\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/guzzle/uri-template/issues\",\n \"source\": \"https://github.com/guzzle/uri-template/tree/v1.0.5\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/GrahamCampbell\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://github.com/Nyholm\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/guzzlehttp/uri-template\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2025-08-22T14:27:06+00:00\"\n },\n {\n \"name\": \"halaxa/json-machine\",\n \"version\": \"1.2.5\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/halaxa/json-machine.git\",\n \"reference\": \"d0f84abf79ac98145d478b66d2bcf363d706477c\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/halaxa/json-machine/zipball/d0f84abf79ac98145d478b66d2bcf363d706477c\",\n \"reference\": \"d0f84abf79ac98145d478b66d2bcf363d706477c\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \"7.2 - 8.4\"\n },\n \"require-dev\": {\n \"ext-json\": \"*\",\n \"friendsofphp/php-cs-fixer\": \"^3.0\",\n \"phpstan/phpstan\": \"^1.10\",\n \"phpunit/phpunit\": \"^8.0\"\n },\n \"suggest\": {\n \"ext-json\": \"To run JSON Machine out of the box without custom decoders.\",\n \"guzzlehttp/guzzle\": \"To run example with GuzzleHttp\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"files\": [\n \"src/functions.php\"\n ],\n \"psr-4\": {\n \"JsonMachine\\\\\": \"src/\"\n },\n \"exclude-from-classmap\": [\n \"src/autoloader.php\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"Apache-2.0\"\n ],\n \"authors\": [\n {\n \"name\": \"Filip Halaxa\",\n \"email\": \"filip@halaxa.cz\"\n }\n ],\n \"description\": \"Efficient, easy-to-use and fast JSON pull parser\",\n \"support\": {\n \"issues\": \"https://github.com/halaxa/json-machine/issues\",\n \"source\": \"https://github.com/halaxa/json-machine/tree/1.2.5\"\n },\n \"funding\": [\n {\n \"url\": \"https://ko-fi.com/G2G57KTE4\",\n \"type\": \"other\"\n }\n ],\n \"time\": \"2025-07-07T13:38:34+00:00\"\n },\n {\n \"name\": \"hashids/hashids\",\n \"version\": \"5.0.2\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/vinkla/hashids.git\",\n \"reference\": \"197171016b77ddf14e259e186559152eb3f8cf33\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/vinkla/hashids/zipball/197171016b77ddf14e259e186559152eb3f8cf33\",\n \"reference\": \"197171016b77ddf14e259e186559152eb3f8cf33\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"ext-mbstring\": \"*\",\n \"php\": \"^8.1\"\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \"^10.0\"\n },\n \"suggest\": {\n \"ext-bcmath\": \"Required to use BC Math arbitrary precision mathematics (*).\",\n \"ext-gmp\": \"Required to use GNU multiple precision mathematics (*).\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"5.0-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Hashids\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Ivan Akimov\",\n \"email\": \"ivan@barreleye.com\"\n },\n {\n \"name\": \"Vincent Klaiber\",\n \"email\": \"hello@doubledip.se\"\n }\n ],\n \"description\": \"Generate short, unique, non-sequential ids (like YouTube and Bitly) from numbers\",\n \"homepage\": \"https://hashids.org/php\",\n \"keywords\": [\n \"bitly\",\n \"decode\",\n \"encode\",\n \"hash\",\n \"hashid\",\n \"hashids\",\n \"ids\",\n \"obfuscate\",\n \"youtube\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/vinkla/hashids/issues\",\n \"source\": \"https://github.com/vinkla/hashids/tree/5.0.2\"\n },\n \"time\": \"2023-02-23T15:00:54+00:00\"\n },\n {\n \"name\": \"html2text/html2text\",\n \"version\": \"4.3.2\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/mtibben/html2text.git\",\n \"reference\": \"3b443cbe302b52eb5806a21a9dbd79524203970a\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/mtibben/html2text/zipball/3b443cbe302b52eb5806a21a9dbd79524203970a\",\n \"reference\": \"3b443cbe302b52eb5806a21a9dbd79524203970a\",\n \"shasum\": \"\"\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \"~4|^9.0\"\n },\n \"suggest\": {\n \"ext-mbstring\": \"For best performance\",\n \"symfony/polyfill-mbstring\": \"If you can't install ext-mbstring\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Html2Text\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"GPL-2.0-or-later\"\n ],\n \"description\": \"Converts HTML to formatted plain text\",\n \"support\": {\n \"issues\": \"https://github.com/mtibben/html2text/issues\",\n \"source\": \"https://github.com/mtibben/html2text/tree/4.3.2\"\n },\n \"time\": \"2024-08-20T02:43:29+00:00\"\n },\n {\n \"name\": \"hubspot/api-client\",\n \"version\": \"5.0.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/HubSpot/hubspot-api-php.git\",\n \"reference\": \"0ab677f8ee5cfa663787d76df95c211abb6419cf\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/HubSpot/hubspot-api-php/zipball/0ab677f8ee5cfa663787d76df95c211abb6419cf\",\n \"reference\": \"0ab677f8ee5cfa663787d76df95c211abb6419cf\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"ext-curl\": \"*\",\n \"ext-json\": \"*\",\n \"ext-mbstring\": \"*\",\n \"guzzlehttp/guzzle\": \"^7.3\",\n \"guzzlehttp/psr7\": \"^2.0\",\n \"php\": \">=7.3\"\n },\n \"require-dev\": {\n \"friendsofphp/php-cs-fixer\": \"~2.12\",\n \"phpspec/phpspec\": \"^6.1\",\n \"phpunit/phpunit\": \"^8.5\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"HubSpot\\\\\": \"lib/\",\n \"Hubspot\\\\Tests\\\\\": \"tests/\",\n \"HubSpot\\\\Client\\\\\": \"codegen/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"Apache-2.0\"\n ],\n \"authors\": [\n {\n \"name\": \"HubSpot\",\n \"homepage\": \"https://hubspot.com/\"\n }\n ],\n \"description\": \"Hubspot API client\",\n \"homepage\": \"https://hubspot.com/\",\n \"keywords\": [\n \"api\",\n \"hubspot\",\n \"php\",\n \"sdk\",\n \"swagger\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/HubSpot/hubspot-api-php/issues\",\n \"source\": \"https://github.com/HubSpot/hubspot-api-php/tree/5.0.0\"\n },\n \"time\": \"2021-12-15T09:31:18+00:00\"\n },\n {\n \"name\": \"hubspot/hubspot-php\",\n \"version\": \"5.5.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/HubSpot/hubspot-php.git\",\n \"reference\": \"2d37f7edce728851f78e1012d448abd3f42201dc\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/HubSpot/hubspot-php/zipball/2d37f7edce728851f78e1012d448abd3f42201dc\",\n \"reference\": \"2d37f7edce728851f78e1012d448abd3f42201dc\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"ext-json\": \"*\",\n \"guzzlehttp/guzzle\": \"^7.3\",\n \"php\": \">=7.3\",\n \"psr/http-message\": \"^1.1 || ^2.0\"\n },\n \"require-dev\": {\n \"friendsofphp/php-cs-fixer\": \"^3.4\",\n \"phpspec/phpspec\": \"^7.1\",\n \"phpunit/phpunit\": \"^9.5\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"files\": [\n \"src/helpers.php\"\n ],\n \"psr-4\": {\n \"SevenShores\\\\Hubspot\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"Apache-2.0\"\n ],\n \"authors\": [\n {\n \"name\": \"Ryan Winchester\",\n \"email\": \"fungku@gmail.com\",\n \"homepage\": \"http://ryanwinchester.ca\"\n }\n ],\n \"description\": \"HubSpot PHP API client\",\n \"keywords\": [\n \"api\",\n \"hubspot\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/HubSpot/hubspot-php/issues\",\n \"source\": \"https://github.com/HubSpot/hubspot-php/tree/v5.5.0\"\n },\n \"time\": \"2025-06-26T14:43:12+00:00\"\n },\n {\n \"name\": \"intercom/intercom-php\",\n \"version\": \"v4.5.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/intercom/intercom-php.git\",\n \"reference\": \"2a7024440427caf5f0d563d46eb01b1a86b4e0c6\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/intercom/intercom-php/zipball/2a7024440427caf5f0d563d46eb01b1a86b4e0c6\",\n \"reference\": \"2a7024440427caf5f0d563d46eb01b1a86b4e0c6\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"ext-json\": \"*\",\n \"php\": \">= 7.1\",\n \"php-http/client-common\": \"^1.9 || ^2.0\",\n \"php-http/client-implementation\": \"^1.0\",\n \"php-http/discovery\": \"^1.4\",\n \"php-http/httplug\": \"^1.0 || ^2.0\",\n \"php-http/message\": \"^1.7\",\n \"psr/http-message\": \"^1.0 || ^2.0\"\n },\n \"require-dev\": {\n \"nyholm/psr7\": \"^1.6.1\",\n \"php-http/mock-client\": \"^1.4\",\n \"phpunit/phpunit\": \"^7.5 || ^8.5 || ^9.3\",\n \"squizlabs/php_codesniffer\": \"^3.1\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Intercom\\\\\": [\n \"src\"\n ]\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"Apache-2.0\"\n ],\n \"authors\": [\n {\n \"name\": \"Intercom Platform Team\",\n \"homepage\": \"https://www.intercom.com\"\n }\n ],\n \"description\": \"Intercom API client built on top of HTTPlug\",\n \"keywords\": [\n \"Guzzle\",\n \"api\",\n \"intercom\",\n \"intercom.io\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/intercom/intercom-php/issues\",\n \"source\": \"https://github.com/intercom/intercom-php\"\n },\n \"time\": \"2025-02-25T14:22:32+00:00\"\n },\n {\n \"name\": \"intervention/gif\",\n \"version\": \"4.2.2\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/Intervention/gif.git\",\n \"reference\": \"5999eac6a39aa760fb803bc809e8909ee67b451a\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/Intervention/gif/zipball/5999eac6a39aa760fb803bc809e8909ee67b451a\",\n \"reference\": \"5999eac6a39aa760fb803bc809e8909ee67b451a\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \"^8.1\"\n },\n \"require-dev\": {\n \"phpstan/phpstan\": \"^2.1\",\n \"phpunit/phpunit\": \"^10.0 || ^11.0 || ^12.0\",\n \"slevomat/coding-standard\": \"~8.0\",\n \"squizlabs/php_codesniffer\": \"^3.8\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Intervention\\\\Gif\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Oliver Vogel\",\n \"email\": \"oliver@intervention.io\",\n \"homepage\": \"https://intervention.io/\"\n }\n ],\n \"description\": \"Native PHP GIF Encoder/Decoder\",\n \"homepage\": \"https://github.com/intervention/gif\",\n \"keywords\": [\n \"animation\",\n \"gd\",\n \"gif\",\n \"image\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/Intervention/gif/issues\",\n \"source\": \"https://github.com/Intervention/gif/tree/4.2.2\"\n },\n \"funding\": [\n {\n \"url\": \"https://paypal.me/interventionio\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/Intervention\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://ko-fi.com/interventionphp\",\n \"type\": \"ko_fi\"\n }\n ],\n \"time\": \"2025-03-29T07:46:21+00:00\"\n },\n {\n \"name\": \"intervention/image\",\n \"version\": \"3.11.4\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/Intervention/image.git\",\n \"reference\": \"8c49eb21a6d2572532d1bc425964264f3e496846\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/Intervention/image/zipball/8c49eb21a6d2572532d1bc425964264f3e496846\",\n \"reference\": \"8c49eb21a6d2572532d1bc425964264f3e496846\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"ext-mbstring\": \"*\",\n \"intervention/gif\": \"^4.2\",\n \"php\": \"^8.1\"\n },\n \"require-dev\": {\n \"mockery/mockery\": \"^1.6\",\n \"phpstan/phpstan\": \"^2.1\",\n \"phpunit/phpunit\": \"^10.0 || ^11.0 || ^12.0\",\n \"slevomat/coding-standard\": \"~8.0\",\n \"squizlabs/php_codesniffer\": \"^3.8\"\n },\n \"suggest\": {\n \"ext-exif\": \"Recommended to be able to read EXIF data properly.\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Intervention\\\\Image\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Oliver Vogel\",\n \"email\": \"oliver@intervention.io\",\n \"homepage\": \"https://intervention.io/\"\n }\n ],\n \"description\": \"PHP image manipulation\",\n \"homepage\": \"https://image.intervention.io/\",\n \"keywords\": [\n \"gd\",\n \"image\",\n \"imagick\",\n \"resize\",\n \"thumbnail\",\n \"watermark\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/Intervention/image/issues\",\n \"source\": \"https://github.com/Intervention/image/tree/3.11.4\"\n },\n \"funding\": [\n {\n \"url\": \"https://paypal.me/interventionio\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/Intervention\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://ko-fi.com/interventionphp\",\n \"type\": \"ko_fi\"\n }\n ],\n \"time\": \"2025-07-30T13:13:19+00:00\"\n },\n {\n \"name\": \"jakeasmith/http_build_url\",\n \"version\": \"1.0.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/jakeasmith/http_build_url.git\",\n \"reference\": \"93c273e77cb1edead0cf8bcf8cd2003428e74e37\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/jakeasmith/http_build_url/zipball/93c273e77cb1edead0cf8bcf8cd2003428e74e37\",\n \"reference\": \"93c273e77cb1edead0cf8bcf8cd2003428e74e37\",\n \"shasum\": \"\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"files\": [\n \"src/http_build_url.php\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Jake A. Smith\",\n \"email\": \"theman@jakeasmith.com\"\n }\n ],\n \"description\": \"Provides functionality for http_build_url() to environments without pecl_http.\",\n \"support\": {\n \"issues\": \"https://github.com/jakeasmith/http_build_url/issues\",\n \"source\": \"https://github.com/jakeasmith/http_build_url\"\n },\n \"time\": \"2017-05-01T15:36:40+00:00\"\n },\n {\n \"name\": \"jane-php/json-schema-runtime\",\n \"version\": \"v7.9.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/janephp/json-schema-runtime.git\",\n \"reference\": \"ddb82546a1fa29456fb9acaa3c1a299beb0b40b1\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/janephp/json-schema-runtime/zipball/ddb82546a1fa29456fb9acaa3c1a299beb0b40b1\",\n \"reference\": \"ddb82546a1fa29456fb9acaa3c1a299beb0b40b1\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"ext-json\": \"*\",\n \"league/uri\": \"^6.7.2 || ^7.4\",\n \"php\": \"^8.0\",\n \"php-jsonpointer/php-jsonpointer\": \"^3.0 || ^4.0\",\n \"symfony/serializer\": \"^5.4 || ^6.4 || ^7.0\",\n \"symfony/yaml\": \"^5.4 || ^6.4 || ^7.0\"\n },\n \"conflict\": {\n \"symfony/framework-bundle\": \"5.1.0\"\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \"^8.5\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-next\": \"7-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Jane\\\\Component\\\\JsonSchemaRuntime\\\\\": \"\"\n },\n \"exclude-from-classmap\": [\n \"/Tests/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Joel Wurtz\",\n \"email\": \"jwurtz@jolicode.com\"\n },\n {\n \"name\": \"Baptiste Leduc\",\n \"email\": \"baptiste.leduc@gmail.com\"\n }\n ],\n \"description\": \"Jane runtime Library\",\n \"support\": {\n \"source\": \"https://github.com/janephp/json-schema-runtime/tree/v7.9.0\"\n },\n \"time\": \"2025-04-04T09:35:19+00:00\"\n },\n {\n \"name\": \"jane-php/open-api-runtime\",\n \"version\": \"v7.9.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/janephp/open-api-runtime.git\",\n \"reference\": \"bf05ecae7096ccb3bd115fadb9b612e26c702d56\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/janephp/open-api-runtime/zipball/bf05ecae7096ccb3bd115fadb9b612e26c702d56\",\n \"reference\": \"bf05ecae7096ccb3bd115fadb9b612e26c702d56\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"jane-php/json-schema-runtime\": \"^7.0\",\n \"nyholm/psr7\": \"^1.8\",\n \"php\": \"^8.0\",\n \"php-http/client-common\": \"^2.0\",\n \"php-http/discovery\": \"^1.6\",\n \"php-http/multipart-stream-builder\": \"^1.0\",\n \"psr/http-client\": \"^1.0\",\n \"psr/http-factory\": \"^1.0\",\n \"symfony/options-resolver\": \"^5.4 || ^6.4 || ^7.0\"\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \"^8.5\",\n \"symfony/serializer\": \"^5.4 || ^6.4 || ^7.0\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-next\": \"7-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Jane\\\\Component\\\\OpenApiRuntime\\\\\": \"\"\n },\n \"exclude-from-classmap\": [\n \"/Tests/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Joel Wurtz\",\n \"email\": \"jwurtz@jolicode.com\"\n },\n {\n \"name\": \"Baptiste Leduc\",\n \"email\": \"baptiste.leduc@gmail.com\"\n }\n ],\n \"description\": \"Jane OpenAPI Runtime Library, dependencies and utility class for a library generated by jane/openapi\",\n \"support\": {\n \"source\": \"https://github.com/janephp/open-api-runtime/tree/v7.9.0\"\n },\n \"time\": \"2025-04-17T14:07:07+00:00\"\n },\n {\n \"name\": \"jdavidbakr/cloudfront-proxies\",\n \"version\": \"1.7\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/jdavidbakr/CloudfrontProxies.git\",\n \"reference\": \"eb679f97f90d91afb16d201526cf6f5f48bea5f5\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/jdavidbakr/CloudfrontProxies/zipball/eb679f97f90d91afb16d201526cf6f5f48bea5f5\",\n \"reference\": \"eb679f97f90d91afb16d201526cf6f5f48bea5f5\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"guzzlehttp/guzzle\": \"^6.3|^7.0\",\n \"illuminate/support\": \"5.6.*|5.7.*|5.8.*|6.*|7.*|8.*|^9.0|^10.0|^11.0|^12.0\"\n },\n \"require-dev\": {\n \"mockery/mockery\": \"~1.0\",\n \"orchestra/testbench\": \"~3.0|~4.0|~5.0|~6.0|^7.0|^8.0|^9.0|^10.0\",\n \"phpunit/phpunit\": \"~7.0|~8.0|^9.0|^10.5|^11.5.3\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"laravel\": {\n \"providers\": [\n \"jdavidbakr\\\\CloudfrontProxies\\\\CloudfrontProxiesServiceProvider\"\n ]\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"jdavidbakr\\\\CloudfrontProxies\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"J David Baker\",\n \"email\": \"me@jdavidbaker.com\",\n \"homepage\": \"http://www.jdavidbaker.com\",\n \"role\": \"Developer\"\n }\n ],\n \"description\": \"Sets proxy settings for Cloudfront in a Laravel project\",\n \"keywords\": [\n \"cloudfront\",\n \"laravel\",\n \"trusted proxies\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/jdavidbakr/CloudfrontProxies/issues\",\n \"source\": \"https://github.com/jdavidbakr/CloudfrontProxies/tree/1.7\"\n },\n \"time\": \"2025-02-17T02:37:08+00:00\"\n },\n {\n \"name\": \"jean85/pretty-package-versions\",\n \"version\": \"2.1.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/Jean85/pretty-package-versions.git\",\n \"reference\": \"4d7aa5dab42e2a76d99559706022885de0e18e1a\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/Jean85/pretty-package-versions/zipball/4d7aa5dab42e2a76d99559706022885de0e18e1a\",\n \"reference\": \"4d7aa5dab42e2a76d99559706022885de0e18e1a\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"composer-runtime-api\": \"^2.1.0\",\n \"php\": \"^7.4|^8.0\"\n },\n \"require-dev\": {\n \"friendsofphp/php-cs-fixer\": \"^3.2\",\n \"jean85/composer-provided-replaced-stub-package\": \"^1.0\",\n \"phpstan/phpstan\": \"^2.0\",\n \"phpunit/phpunit\": \"^7.5|^8.5|^9.6\",\n \"rector/rector\": \"^2.0\",\n \"vimeo/psalm\": \"^4.3 || ^5.0\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"1.x-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Jean85\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Alessandro Lai\",\n \"email\": \"alessandro.lai85@gmail.com\"\n }\n ],\n \"description\": \"A library to get pretty versions strings of installed dependencies\",\n \"keywords\": [\n \"composer\",\n \"package\",\n \"release\",\n \"versions\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/Jean85/pretty-package-versions/issues\",\n \"source\": \"https://github.com/Jean85/pretty-package-versions/tree/2.1.1\"\n },\n \"time\": \"2025-03-19T14:43:43+00:00\"\n },\n {\n \"name\": \"jeremykendall/php-domain-parser\",\n \"version\": \"6.4.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/jeremykendall/php-domain-parser.git\",\n \"reference\": \"98401b32371fc1a75d93d4653d311b38e71f0d82\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/jeremykendall/php-domain-parser/zipball/98401b32371fc1a75d93d4653d311b38e71f0d82\",\n \"reference\": \"98401b32371fc1a75d93d4653d311b38e71f0d82\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"ext-filter\": \"*\",\n \"php\": \"^8.1\"\n },\n \"require-dev\": {\n \"friendsofphp/php-cs-fixer\": \"^3.65.0\",\n \"guzzlehttp/guzzle\": \"^7.9.2\",\n \"guzzlehttp/psr7\": \"^1.6 || ^2.7.0\",\n \"phpstan/phpstan\": \"^1.12.13\",\n \"phpstan/phpstan-phpunit\": \"^1.4.2\",\n \"phpstan/phpstan-strict-rules\": \"^1.6.1\",\n \"phpunit/phpunit\": \"^10.5.15 || ^11.5.1\",\n \"psr/http-factory\": \"^1.1.0\",\n \"psr/simple-cache\": \"^1.0.1 || ^2.0.0\",\n \"symfony/cache\": \"^v5.0.0 || ^6.4.16\",\n \"symfony/var-dumper\": \"^v6.4.18 || ^7.2\"\n },\n \"suggest\": {\n \"league/uri\": \"To parse and extract the host from an URL using a RFC3986/RFC3987 URI parser\",\n \"psr/http-client-implementation\": \"To use the storage functionality which depends on PSR-18\",\n \"psr/http-factory-implementation\": \"To use the storage functionality which depends on PSR-17\",\n \"psr/simple-cache-implementation\": \"To use the storage functionality which depends on PSR-16\",\n \"rowbot/url\": \"To parse and extract the host from an URL using a WHATWG URL parser\",\n \"symfony/polyfill-intl-idn\": \"to handle IDN host via the Symfony polyfill if ext-intl is not present\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"6.x-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Pdp\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Jeremy Kendall\",\n \"homepage\": \"https://about.me/jeremykendall\",\n \"role\": \"Developer\"\n },\n {\n \"name\": \"Ignace Nyamagana Butera\",\n \"homepage\": \"https://nyamsprod.com\",\n \"role\": \"Developer\"\n },\n {\n \"name\": \"Contributors\",\n \"homepage\": \"https://github.com/jeremykendall/php-domain-parser/graphs/contributors\"\n }\n ],\n \"description\": \"Public Suffix List and IANA Root Zone Database based Domain parsing implemented in PHP.\",\n \"homepage\": \"https://github.com/jeremykendall/php-domain-parser\",\n \"keywords\": [\n \"PSL\",\n \"Public Suffix List\",\n \"Top Level Domains\",\n \"domain parsing\",\n \"iana\",\n \"icann\",\n \"idn\",\n \"tld\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/jeremykendall/php-domain-parser/issues\",\n \"source\": \"https://github.com/jeremykendall/php-domain-parser\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/sponsors/nyamsprod\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2025-04-26T11:19:48+00:00\"\n },\n {\n \"name\": \"jiminny/oauth2-aircall\",\n \"version\": \"dev-master\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/jiminny/oauth2-aircall.git\",\n \"reference\": \"36870d8edc5882e1990af8836c6a72c65b48ec97\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/jiminny/oauth2-aircall/zipball/36870d8edc5882e1990af8836c6a72c65b48ec97\",\n \"reference\": \"36870d8edc5882e1990af8836c6a72c65b48ec97\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"guzzlehttp/guzzle\": \"^7.8\",\n \"league/oauth2-client\": \"^2.7\"\n },\n \"default-branch\": true,\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"1.0.x-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Jiminny\\\\OAuth2\\\\Client\\\\\": \"src/\"\n }\n },\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"James Graham\",\n \"email\": \"james.graham@jiminny.com\",\n \"homepage\": \"https://github.com/jamesgraham\"\n }\n ],\n \"description\": \"Aircall OAuth 2.0 Client Provider for The PHP League OAuth2-Client\",\n \"keywords\": [\n \"aircall\",\n \"authorisation\",\n \"authorization\",\n \"client\",\n \"oauth\",\n \"oauth2\"\n ],\n \"support\": {\n \"source\": \"https://github.com/jiminny/oauth2-aircall/tree/master\",\n \"issues\": \"https://github.com/jiminny/oauth2-aircall/issues\"\n },\n \"time\": \"2024-03-01T10:50:42+00:00\"\n },\n {\n \"name\": \"jiminny/oauth2-bullhorn\",\n \"version\": \"0.2.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/jiminny/oauth2-bullhorn.git\",\n \"reference\": \"3ff72e57684a7ef60616165fec5edeae6bdf8f6e\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/jiminny/oauth2-bullhorn/zipball/3ff72e57684a7ef60616165fec5edeae6bdf8f6e\",\n \"reference\": \"3ff72e57684a7ef60616165fec5edeae6bdf8f6e\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"league/oauth2-client\": \"^2.0\",\n \"php\": \"^7.2 || ^8.0\"\n },\n \"require-dev\": {\n \"friendsofphp/php-cs-fixer\": \"^2.18\",\n \"phpunit/phpunit\": \"^9.5\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Jiminny\\\\OAuth2\\\\Client\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Alexander Marinov\",\n \"email\": \"alex.g.marinov@gmail.com\"\n }\n ],\n \"description\": \"Bullhorn OAuth 2.0 Client Provider for The PHP League OAuth2-Client\",\n \"keywords\": [\n \"Authentication\",\n \"authorization\",\n \"bullhorn\",\n \"client\",\n \"oauth\",\n \"oauth2\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/jiminny/oauth2-bullhorn/issues\",\n \"source\": \"https://github.com/jiminny/oauth2-bullhorn/tree/0.2.0\"\n },\n \"time\": \"2021-08-27T12:35:31+00:00\"\n },\n {\n \"name\": \"jiminny/oauth2-dialpad\",\n \"version\": \"dev-master\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/jiminny/oauth2-dialpad.git\",\n \"reference\": \"10ca76bdee7875faf55017e7f17ab12c5934a33a\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/jiminny/oauth2-dialpad/zipball/10ca76bdee7875faf55017e7f17ab12c5934a33a\",\n \"reference\": \"10ca76bdee7875faf55017e7f17ab12c5934a33a\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"guzzlehttp/guzzle\": \"^7.8\",\n \"league/oauth2-client\": \"^2.7\"\n },\n \"require-dev\": {\n \"mockery/mockery\": \"~0.9\",\n \"phpunit/phpunit\": \"~4.0\",\n \"squizlabs/php_codesniffer\": \"~2.0\"\n },\n \"default-branch\": true,\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"1.0.x-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Jiminny\\\\OAuth2\\\\Client\\\\\": \"src/\"\n }\n },\n \"autoload-dev\": {\n \"psr-4\": {\n \"Jiminny\\\\OAuth2\\\\Client\\\\Test\\\\\": \"tests/src/\"\n }\n },\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"James Graham\",\n \"email\": \"james.graham@jiminny.com\",\n \"homepage\": \"https://github.com/jamesgraham\"\n }\n ],\n \"description\": \"Dialpad OAuth 2.0 Client Provider for The PHP League OAuth2-Client\",\n \"keywords\": [\n \"authorisation\",\n \"authorization\",\n \"client\",\n \"dialpad\",\n \"oauth\",\n \"oauth2\"\n ],\n \"support\": {\n \"source\": \"https://github.com/jiminny/oauth2-dialpad/tree/master\",\n \"issues\": \"https://github.com/jiminny/oauth2-dialpad/issues\"\n },\n \"time\": \"2023-10-11T11:13:28+00:00\"\n },\n {\n \"name\": \"jiminny/oauth2-salesloft\",\n \"version\": \"dev-master\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/jiminny/oauth2-salesloft.git\",\n \"reference\": \"53dfbcdf768920cfba018b2e0c7a47fb90289720\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/jiminny/oauth2-salesloft/zipball/53dfbcdf768920cfba018b2e0c7a47fb90289720\",\n \"reference\": \"53dfbcdf768920cfba018b2e0c7a47fb90289720\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"league/oauth2-client\": \"^2.7\"\n },\n \"require-dev\": {\n \"mockery/mockery\": \"~0.9\",\n \"phpunit/phpunit\": \"~4.0\",\n \"squizlabs/php_codesniffer\": \"~2.0\"\n },\n \"default-branch\": true,\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"1.0.x-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Jiminny\\\\OAuth2\\\\Client\\\\\": \"src/\"\n }\n },\n \"autoload-dev\": {\n \"psr-4\": {\n \"Jiminny\\\\OAuth2\\\\Client\\\\Test\\\\\": \"tests/src/\"\n }\n },\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"James Graham\",\n \"email\": \"james.graham@jiminny.com\",\n \"homepage\": \"https://github.com/jamesgraham\"\n }\n ],\n \"description\": \"Salesloft OAuth 2.0 Client Provider for The PHP League OAuth2-Client\",\n \"keywords\": [\n \"authorisation\",\n \"authorization\",\n \"client\",\n \"oauth\",\n \"oauth2\",\n \"salesloft\"\n ],\n \"support\": {\n \"source\": \"https://github.com/jiminny/oauth2-salesloft/tree/master\",\n \"issues\": \"https://github.com/jiminny/oauth2-salesloft/issues\"\n },\n \"time\": \"2023-10-11T11:14:12+00:00\"\n },\n {\n \"name\": \"jolicode/slack-php-api\",\n \"version\": \"v4.8.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/jolicode/slack-php-api.git\",\n \"reference\": \"59e617a0176f5d9579dc0ee935c8aeaa0e74c31c\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/jolicode/slack-php-api/zipball/59e617a0176f5d9579dc0ee935c8aeaa0e74c31c\",\n \"reference\": \"59e617a0176f5d9579dc0ee935c8aeaa0e74c31c\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"ext-curl\": \"*\",\n \"jane-php/open-api-runtime\": \"^7.7\",\n \"php\": \">=8.0\",\n \"php-http/client-common\": \"^1.9 || ^2.0\",\n \"php-http/discovery\": \"^1.11\",\n \"php-http/multipart-stream-builder\": \"^1.1\",\n \"psr/http-client-implementation\": \"*\"\n },\n \"conflict\": {\n \"php-http/httplug\": \"< 2.0\"\n },\n \"require-dev\": {\n \"friendsofphp/php-cs-fixer\": \"^3.2.2\",\n \"jane-php/open-api-2\": \"~v7.6.0\",\n \"nyholm/psr7\": \"^1.2\",\n \"opis/json-schema\": \"^1.0\",\n \"symfony/console\": \"^6.0 || ^7.0\",\n \"symfony/http-client\": \"^6.0 || ^7.0\",\n \"symfony/phpunit-bridge\": \"^6.0 || ^7.0\",\n \"symfony/process\": \"^6.0 || ^7.0\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"JoliCode\\\\Slack\\\\\": \"src/\",\n \"JoliCode\\\\Slack\\\\Api\\\\\": \"generated/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Loïck Piera\",\n \"email\": \"pyrech@gmail.com\"\n },\n {\n \"name\": \"JoliCode\",\n \"email\": \"coucou@jolicode.com\"\n }\n ],\n \"description\": \"An up to date PHP client for Slack's API\",\n \"keywords\": [\n \"api\",\n \"client\",\n \"openapi\",\n \"sdk\",\n \"slack\",\n \"slackapi\",\n \"swagger\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/jolicode/slack-php-api/issues\",\n \"source\": \"https://github.com/jolicode/slack-php-api/tree/v4.8.0\"\n },\n \"time\": \"2025-04-01T15:55:35+00:00\"\n },\n {\n \"name\": \"kalnoy/nestedset\",\n \"version\": \"v6.0.6\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/lazychaser/laravel-nestedset.git\",\n \"reference\": \"3cfc56a9759fb592bc903056166bfc0867f9e679\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/lazychaser/laravel-nestedset/zipball/3cfc56a9759fb592bc903056166bfc0867f9e679\",\n \"reference\": \"3cfc56a9759fb592bc903056166bfc0867f9e679\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"illuminate/database\": \"^7.0|^8.0|^9.0|^10.0|^11.0|^12.0\",\n \"illuminate/events\": \"^7.0|^8.0|^9.0|^10.0|^11.0|^12.0\",\n \"illuminate/support\": \"^7.0|^8.0|^9.0|^10.0|^11.0|^12.0\",\n \"php\": \"^8.0\"\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \"7.*|8.*|9.*|^10.5\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"laravel\": {\n \"providers\": [\n \"Kalnoy\\\\Nestedset\\\\NestedSetServiceProvider\"\n ]\n },\n \"branch-alias\": {\n \"dev-master\": \"v5.0.x-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Kalnoy\\\\Nestedset\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Alexander Kalnoy\",\n \"email\": \"lazychaser@gmail.com\"\n }\n ],\n \"description\": \"Nested Set Model for Laravel 5.7 and up\",\n \"keywords\": [\n \"database\",\n \"hierarchy\",\n \"laravel\",\n \"nested sets\",\n \"nsm\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/lazychaser/laravel-nestedset/issues\",\n \"source\": \"https://github.com/lazychaser/laravel-nestedset/tree/v6.0.6\"\n },\n \"time\": \"2025-04-22T19:38:02+00:00\"\n },\n {\n \"name\": \"kkszymanowski/traitor\",\n \"version\": \"1.1.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/KKSzymanowski/Traitor.git\",\n \"reference\": \"97d12e2b045fcc4e132fed5ddee3b1dcff409989\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/KKSzymanowski/Traitor/zipball/97d12e2b045fcc4e132fed5ddee3b1dcff409989\",\n \"reference\": \"97d12e2b045fcc4e132fed5ddee3b1dcff409989\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"nikic/php-parser\": \"^1.0|^2.0|^3.0|^4.0|^5.0\",\n \"php\": \">=5.4\"\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \"8.*\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Traitor\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Kuba Szymanowski\",\n \"email\": \"kuba.szymanowski@inf24.pl\"\n }\n ],\n \"description\": \"Add a trait use statement to existing PHP class\",\n \"keywords\": [\n \"add\",\n \"php\",\n \"trait\"\n ],\n \"support\": {\n \"email\": \"kuba.szymanowski@inf24.pl\",\n \"issues\": \"https://github.com/kkszymanowski/traitor/issues\",\n \"source\": \"https://github.com/kkszymanowski/traitor\"\n },\n \"time\": \"2024-01-29T09:23:11+00:00\"\n },\n {\n \"name\": \"laravel/framework\",\n \"version\": \"v12.54.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/laravel/framework.git\",\n \"reference\": \"325497463e7599cd14224c422c6e5dd2fe832868\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/laravel/framework/zipball/325497463e7599cd14224c422c6e5dd2fe832868\",\n \"reference\": \"325497463e7599cd14224c422c6e5dd2fe832868\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"brick/math\": \"^0.11|^0.12|^0.13|^0.14\",\n \"composer-runtime-api\": \"^2.2\",\n \"doctrine/inflector\": \"^2.0.5\",\n \"dragonmantank/cron-expression\": \"^3.4\",\n \"egulias/email-validator\": \"^3.2.1|^4.0\",\n \"ext-ctype\": \"*\",\n \"ext-filter\": \"*\",\n \"ext-hash\": \"*\",\n \"ext-mbstring\": \"*\",\n \"ext-openssl\": \"*\",\n \"ext-session\": \"*\",\n \"ext-tokenizer\": \"*\",\n \"fruitcake/php-cors\": \"^1.3\",\n \"guzzlehttp/guzzle\": \"^7.8.2\",\n \"guzzlehttp/uri-template\": \"^1.0\",\n \"laravel/prompts\": \"^0.3.0\",\n \"laravel/serializable-closure\": \"^1.3|^2.0\",\n \"league/commonmark\": \"^2.8.1\",\n \"league/flysystem\": \"^3.25.1\",\n \"league/flysystem-local\": \"^3.25.1\",\n \"league/uri\": \"^7.5.1\",\n \"monolog/monolog\": \"^3.0\",\n \"nesbot/carbon\": \"^3.8.4\",\n \"nunomaduro/termwind\": \"^2.0\",\n \"php\": \"^8.2\",\n \"psr/container\": \"^1.1.1|^2.0.1\",\n \"psr/log\": \"^1.0|^2.0|^3.0\",\n \"psr/simple-cache\": \"^1.0|^2.0|^3.0\",\n \"ramsey/uuid\": \"^4.7\",\n \"symfony/console\": \"^7.2.0\",\n \"symfony/error-handler\": \"^7.2.0\",\n \"symfony/finder\": \"^7.2.0\",\n \"symfony/http-foundation\": \"^7.2.0\",\n \"symfony/http-kernel\": \"^7.2.0\",\n \"symfony/mailer\": \"^7.2.0\",\n \"symfony/mime\": \"^7.2.0\",\n \"symfony/polyfill-php83\": \"^1.33\",\n \"symfony/polyfill-php84\": \"^1.33\",\n \"symfony/polyfill-php85\": \"^1.33\",\n \"symfony/process\": \"^7.2.0\",\n \"symfony/routing\": \"^7.2.0\",\n \"symfony/uid\": \"^7.2.0\",\n \"symfony/var-dumper\": \"^7.2.0\",\n \"tijsverkoyen/css-to-inline-styles\": \"^2.2.5\",\n \"vlucas/phpdotenv\": \"^5.6.1\",\n \"voku/portable-ascii\": \"^2.0.2\"\n },\n \"conflict\": {\n \"tightenco/collect\": \"<5.5.33\"\n },\n \"provide\": {\n \"psr/container-implementation\": \"1.1|2.0\",\n \"psr/log-implementation\": \"1.0|2.0|3.0\",\n \"psr/simple-cache-implementation\": \"1.0|2.0|3.0\"\n },\n \"replace\": {\n \"illuminate/auth\": \"self.version\",\n \"illuminate/broadcasting\": \"self.version\",\n \"illuminate/bus\": \"self.version\",\n \"illuminate/cache\": \"self.version\",\n \"illuminate/collections\": \"self.version\",\n \"illuminate/concurrency\": \"self.version\",\n \"illuminate/conditionable\": \"self.version\",\n \"illuminate/config\": \"self.version\",\n \"illuminate/console\": \"self.version\",\n \"illuminate/container\": \"self.version\",\n \"illuminate/contracts\": \"self.version\",\n \"illuminate/cookie\": \"self.version\",\n \"illuminate/database\": \"self.version\",\n \"illuminate/encryption\": \"self.version\",\n \"illuminate/events\": \"self.version\",\n \"illuminate/filesystem\": \"self.version\",\n \"illuminate/hashing\": \"self.version\",\n \"illuminate/http\": \"self.version\",\n \"illuminate/json-schema\": \"self.version\",\n \"illuminate/log\": \"self.version\",\n \"illuminate/macroable\": \"self.version\",\n \"illuminate/mail\": \"self.version\",\n \"illuminate/notifications\": \"self.version\",\n \"illuminate/pagination\": \"self.version\",\n \"illuminate/pipeline\": \"self.version\",\n \"illuminate/process\": \"self.version\",\n \"illuminate/queue\": \"self.version\",\n \"illuminate/redis\": \"self.version\",\n \"illuminate/reflection\": \"self.version\",\n \"illuminate/routing\": \"self.version\",\n \"illuminate/session\": \"self.version\",\n \"illuminate/support\": \"self.version\",\n \"illuminate/testing\": \"self.version\",\n \"illuminate/translation\": \"self.version\",\n \"illuminate/validation\": \"self.version\",\n \"illuminate/view\": \"self.version\",\n \"spatie/once\": \"*\"\n },\n \"require-dev\": {\n \"ably/ably-php\": \"^1.0\",\n \"aws/aws-sdk-php\": \"^3.322.9\",\n \"ext-gmp\": \"*\",\n \"fakerphp/faker\": \"^1.24\",\n \"guzzlehttp/promises\": \"^2.0.3\",\n \"guzzlehttp/psr7\": \"^2.4\",\n \"laravel/pint\": \"^1.18\",\n \"league/flysystem-aws-s3-v3\": \"^3.25.1\",\n \"league/flysystem-ftp\": \"^3.25.1\",\n \"league/flysystem-path-prefixing\": \"^3.25.1\",\n \"league/flysystem-read-only\": \"^3.25.1\",\n \"league/flysystem-sftp-v3\": \"^3.25.1\",\n \"mockery/mockery\": \"^1.6.10\",\n \"opis/json-schema\": \"^2.4.1\",\n \"orchestra/testbench-core\": \"^10.9.0\",\n \"pda/pheanstalk\": \"^5.0.6|^7.0.0\",\n \"php-http/discovery\": \"^1.15\",\n \"phpstan/phpstan\": \"^2.0\",\n \"phpunit/phpunit\": \"^10.5.35|^11.5.3|^12.0.1\",\n \"predis/predis\": \"^2.3|^3.0\",\n \"resend/resend-php\": \"^0.10.0|^1.0\",\n \"symfony/cache\": \"^7.2.0\",\n \"symfony/http-client\": \"^7.2.0\",\n \"symfony/psr-http-message-bridge\": \"^7.2.0\",\n \"symfony/translation\": \"^7.2.0\"\n },\n \"suggest\": {\n \"ably/ably-php\": \"Required to use the Ably broadcast driver (^1.0).\",\n \"aws/aws-sdk-php\": \"Required to use the SQS queue driver, DynamoDb failed job storage, and SES mail driver (^3.322.9).\",\n \"brianium/paratest\": \"Required to run tests in parallel (^7.0|^8.0).\",\n \"ext-apcu\": \"Required to use the APC cache driver.\",\n \"ext-fileinfo\": \"Required to use the Filesystem class.\",\n \"ext-ftp\": \"Required to use the Flysystem FTP driver.\",\n \"ext-gd\": \"Required to use Illuminate\\\\Http\\\\Testing\\\\FileFactory::image().\",\n \"ext-memcached\": \"Required to use the memcache cache driver.\",\n \"ext-pcntl\": \"Required to use all features of the queue worker and console signal trapping.\",\n \"ext-pdo\": \"Required to use all database features.\",\n \"ext-posix\": \"Required to use all features of the queue worker.\",\n \"ext-redis\": \"Required to use the Redis cache and queue drivers (^4.0|^5.0|^6.0).\",\n \"fakerphp/faker\": \"Required to generate fake data using the fake() helper (^1.23).\",\n \"filp/whoops\": \"Required for friendly error pages in development (^2.14.3).\",\n \"laravel/tinker\": \"Required to use the tinker console command (^2.0).\",\n \"league/flysystem-aws-s3-v3\": \"Required to use the Flysystem S3 driver (^3.25.1).\",\n \"league/flysystem-ftp\": \"Required to use the Flysystem FTP driver (^3.25.1).\",\n \"league/flysystem-path-prefixing\": \"Required to use the scoped driver (^3.25.1).\",\n \"league/flysystem-read-only\": \"Required to use read-only disks (^3.25.1)\",\n \"league/flysystem-sftp-v3\": \"Required to use the Flysystem SFTP driver (^3.25.1).\",\n \"mockery/mockery\": \"Required to use mocking (^1.6).\",\n \"pda/pheanstalk\": \"Required to use the beanstalk queue driver (^5.0).\",\n \"php-http/discovery\": \"Required to use PSR-7 bridging features (^1.15).\",\n \"phpunit/phpunit\": \"Required to use assertions and run tests (^10.5.35|^11.5.3|^12.0.1).\",\n \"predis/predis\": \"Required to use the predis connector (^2.3|^3.0).\",\n \"psr/http-message\": \"Required to allow Storage::put to accept a StreamInterface (^1.0).\",\n \"pusher/pusher-php-server\": \"Required to use the Pusher broadcast driver (^6.0|^7.0).\",\n \"resend/resend-php\": \"Required to enable support for the Resend mail transport (^0.10.0|^1.0).\",\n \"symfony/cache\": \"Required to PSR-6 cache bridge (^7.2).\",\n \"symfony/filesystem\": \"Required to enable support for relative symbolic links (^7.2).\",\n \"symfony/http-client\": \"Required to enable support for the Symfony API mail transports (^7.2).\",\n \"symfony/mailgun-mailer\": \"Required to enable support for the Mailgun mail transport (^7.2).\",\n \"symfony/postmark-mailer\": \"Required to enable support for the Postmark mail transport (^7.2).\",\n \"symfony/psr-http-message-bridge\": \"Required to use PSR-7 bridging features (^7.2).\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"12.x-dev\"\n }\n },\n \"autoload\": {\n \"files\": [\n \"src/Illuminate/Collections/functions.php\",\n \"src/Illuminate/Collections/helpers.php\",\n \"src/Illuminate/Events/functions.php\",\n \"src/Illuminate/Filesystem/functions.php\",\n \"src/Illuminate/Foundation/helpers.php\",\n \"src/Illuminate/Log/functions.php\",\n \"src/Illuminate/Reflection/helpers.php\",\n \"src/Illuminate/Support/functions.php\",\n \"src/Illuminate/Support/helpers.php\"\n ],\n \"psr-4\": {\n \"Illuminate\\\\\": \"src/Illuminate/\",\n \"Illuminate\\\\Support\\\\\": [\n \"src/Illuminate/Macroable/\",\n \"src/Illuminate/Collections/\",\n \"src/Illuminate/Conditionable/\",\n \"src/Illuminate/Reflection/\"\n ]\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Taylor Otwell\",\n \"email\": \"taylor@laravel.com\"\n }\n ],\n \"description\": \"The Laravel Framework.\",\n \"homepage\": \"https://laravel.com\",\n \"keywords\": [\n \"framework\",\n \"laravel\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/laravel/framework/issues\",\n \"source\": \"https://github.com/laravel/framework\"\n },\n \"time\": \"2026-03-10T20:25:56+00:00\"\n },\n {\n \"name\": \"laravel/helpers\",\n \"version\": \"v1.8.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/laravel/helpers.git\",\n \"reference\": \"d0094b4bc4364560c8ee3a9e956596d760d4afab\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/laravel/helpers/zipball/d0094b4bc4364560c8ee3a9e956596d760d4afab\",\n \"reference\": \"d0094b4bc4364560c8ee3a9e956596d760d4afab\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"illuminate/support\": \"~5.8.0|^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0\",\n \"php\": \"^7.2.0|^8.0\"\n },\n \"require-dev\": {\n \"phpstan/phpstan\": \"^1.10\",\n \"phpunit/phpunit\": \"^7.0|^8.0|^9.0|^10.0\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"1.x-dev\"\n }\n },\n \"autoload\": {\n \"files\": [\n \"src/helpers.php\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Taylor Otwell\",\n \"email\": \"taylor@laravel.com\"\n },\n {\n \"name\": \"Dries Vints\",\n \"email\": \"dries@laravel.com\"\n }\n ],\n \"description\": \"Provides backwards compatibility for helpers in the latest Laravel release.\",\n \"keywords\": [\n \"helpers\",\n \"laravel\"\n ],\n \"support\": {\n \"source\": \"https://github.com/laravel/helpers/tree/v1.8.1\"\n },\n \"time\": \"2025-09-02T15:31:25+00:00\"\n },\n {\n \"name\": \"laravel/passport\",\n \"version\": \"v13.7.4\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/laravel/passport.git\",\n \"reference\": \"16c45794c6a6176792fdf555f986aa1b944d9081\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/laravel/passport/zipball/16c45794c6a6176792fdf555f986aa1b944d9081\",\n \"reference\": \"16c45794c6a6176792fdf555f986aa1b944d9081\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"ext-json\": \"*\",\n \"ext-openssl\": \"*\",\n \"firebase/php-jwt\": \"^6.4|^7.0\",\n \"illuminate/auth\": \"^11.35|^12.0|^13.0\",\n \"illuminate/console\": \"^11.35|^12.0|^13.0\",\n \"illuminate/container\": \"^11.35|^12.0|^13.0\",\n \"illuminate/contracts\": \"^11.35|^12.0|^13.0\",\n \"illuminate/cookie\": \"^11.35|^12.0|^13.0\",\n \"illuminate/database\": \"^11.35|^12.0|^13.0\",\n \"illuminate/encryption\": \"^11.35|^12.0|^13.0\",\n \"illuminate/http\": \"^11.35|^12.0|^13.0\",\n \"illuminate/support\": \"^11.35|^12.0|^13.0\",\n \"league/oauth2-server\": \"^9.2\",\n \"php\": \"^8.2\",\n \"php-http/discovery\": \"^1.20\",\n \"phpseclib/phpseclib\": \"^3.0\",\n \"psr/http-factory-implementation\": \"*\",\n \"symfony/console\": \"^7.1|^8.0\",\n \"symfony/psr-http-message-bridge\": \"^7.1|^8.0\"\n },\n \"require-dev\": {\n \"orchestra/testbench\": \"^9.15|^10.8|^11.0\",\n \"phpstan/phpstan\": \"^2.0\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"laravel\": {\n \"providers\": [\n \"Laravel\\\\Passport\\\\PassportServiceProvider\"\n ]\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Laravel\\\\Passport\\\\\": \"src/\",\n \"Laravel\\\\Passport\\\\Database\\\\Factories\\\\\": \"database/factories/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Taylor Otwell\",\n \"email\": \"taylor@laravel.com\"\n }\n ],\n \"description\": \"Laravel Passport provides OAuth2 server support to Laravel.\",\n \"keywords\": [\n \"laravel\",\n \"oauth\",\n \"passport\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/laravel/passport/issues\",\n \"source\": \"https://github.com/laravel/passport\"\n },\n \"time\": \"2026-04-09T13:39:45+00:00\"\n },\n {\n \"name\": \"laravel/prompts\",\n \"version\": \"v0.3.14\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/laravel/prompts.git\",\n \"reference\": \"9f0e371244eedfe2ebeaa72c79c54bb5df6e0176\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/laravel/prompts/zipball/9f0e371244eedfe2ebeaa72c79c54bb5df6e0176\",\n \"reference\": \"9f0e371244eedfe2ebeaa72c79c54bb5df6e0176\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"composer-runtime-api\": \"^2.2\",\n \"ext-mbstring\": \"*\",\n \"php\": \"^8.1\",\n \"symfony/console\": \"^6.2|^7.0|^8.0\"\n },\n \"conflict\": {\n \"illuminate/console\": \">=10.17.0 <10.25.0\",\n \"laravel/framework\": \">=10.17.0 <10.25.0\"\n },\n \"require-dev\": {\n \"illuminate/collections\": \"^10.0|^11.0|^12.0|^13.0\",\n \"mockery/mockery\": \"^1.5\",\n \"pestphp/pest\": \"^2.3|^3.4|^4.0\",\n \"phpstan/phpstan\": \"^1.12.28\",\n \"phpstan/phpstan-mockery\": \"^1.1.3\"\n },\n \"suggest\": {\n \"ext-pcntl\": \"Required for the spinner to be animated.\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-main\": \"0.3.x-dev\"\n }\n },\n \"autoload\": {\n \"files\": [\n \"src/helpers.php\"\n ],\n \"psr-4\": {\n \"Laravel\\\\Prompts\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"description\": \"Add beautiful and user-friendly forms to your command-line applications.\",\n \"support\": {\n \"issues\": \"https://github.com/laravel/prompts/issues\",\n \"source\": \"https://github.com/laravel/prompts/tree/v0.3.14\"\n },\n \"time\": \"2026-03-01T09:02:38+00:00\"\n },\n {\n \"name\": \"laravel/serializable-closure\",\n \"version\": \"v2.0.10\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/laravel/serializable-closure.git\",\n \"reference\": \"870fc81d2f879903dfc5b60bf8a0f94a1609e669\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/laravel/serializable-closure/zipball/870fc81d2f879903dfc5b60bf8a0f94a1609e669\",\n \"reference\": \"870fc81d2f879903dfc5b60bf8a0f94a1609e669\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \"^8.1\"\n },\n \"require-dev\": {\n \"illuminate/support\": \"^10.0|^11.0|^12.0|^13.0\",\n \"nesbot/carbon\": \"^2.67|^3.0\",\n \"pestphp/pest\": \"^2.36|^3.0|^4.0\",\n \"phpstan/phpstan\": \"^2.0\",\n \"symfony/var-dumper\": \"^6.2.0|^7.0.0|^8.0.0\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"2.x-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Laravel\\\\SerializableClosure\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Taylor Otwell\",\n \"email\": \"taylor@laravel.com\"\n },\n {\n \"name\": \"Nuno Maduro\",\n \"email\": \"nuno@laravel.com\"\n }\n ],\n \"description\": \"Laravel Serializable Closure provides an easy and secure way to serialize closures in PHP.\",\n \"keywords\": [\n \"closure\",\n \"laravel\",\n \"serializable\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/laravel/serializable-closure/issues\",\n \"source\": \"https://github.com/laravel/serializable-closure\"\n },\n \"time\": \"2026-02-20T19:59:49+00:00\"\n },\n {\n \"name\": \"laravel/slack-notification-channel\",\n \"version\": \"v3.6.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/laravel/slack-notification-channel.git\",\n \"reference\": \"642677a57490eebccb7e9fb666f5a5379c6e3459\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/laravel/slack-notification-channel/zipball/642677a57490eebccb7e9fb666f5a5379c6e3459\",\n \"reference\": \"642677a57490eebccb7e9fb666f5a5379c6e3459\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"guzzlehttp/guzzle\": \"^7.0\",\n \"illuminate/http\": \"^9.0|^10.0|^11.0|^12.0\",\n \"illuminate/notifications\": \"^9.0|^10.0|^11.0|^12.0\",\n \"illuminate/support\": \"^9.0|^10.0|^11.0|^12.0\",\n \"php\": \"^8.0\"\n },\n \"require-dev\": {\n \"mockery/mockery\": \"^1.0\",\n \"orchestra/testbench\": \"^7.0|^8.0|^9.0|^10.0\",\n \"phpstan/phpstan\": \"^1.10\",\n \"phpunit/phpunit\": \"^9.0|^10.4|^11.5\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"laravel\": {\n \"providers\": [\n \"Illuminate\\\\Notifications\\\\SlackChannelServiceProvider\"\n ]\n },\n \"branch-alias\": {\n \"dev-master\": \"3.x-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Illuminate\\\\Notifications\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Taylor Otwell\",\n \"email\": \"taylor@laravel.com\"\n }\n ],\n \"description\": \"Slack Notification Channel for laravel.\",\n \"keywords\": [\n \"laravel\",\n \"notifications\",\n \"slack\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/laravel/slack-notification-channel/issues\",\n \"source\": \"https://github.com/laravel/slack-notification-channel/tree/v3.6.0\"\n },\n \"time\": \"2025-06-26T16:51:38+00:00\"\n },\n {\n \"name\": \"laravel/tinker\",\n \"version\": \"v2.10.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/laravel/tinker.git\",\n \"reference\": \"22177cc71807d38f2810c6204d8f7183d88a57d3\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/laravel/tinker/zipball/22177cc71807d38f2810c6204d8f7183d88a57d3\",\n \"reference\": \"22177cc71807d38f2810c6204d8f7183d88a57d3\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"illuminate/console\": \"^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0\",\n \"illuminate/contracts\": \"^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0\",\n \"illuminate/support\": \"^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0\",\n \"php\": \"^7.2.5|^8.0\",\n \"psy/psysh\": \"^0.11.1|^0.12.0\",\n \"symfony/var-dumper\": \"^4.3.4|^5.0|^6.0|^7.0\"\n },\n \"require-dev\": {\n \"mockery/mockery\": \"~1.3.3|^1.4.2\",\n \"phpstan/phpstan\": \"^1.10\",\n \"phpunit/phpunit\": \"^8.5.8|^9.3.3|^10.0\"\n },\n \"suggest\": {\n \"illuminate/database\": \"The Illuminate Database package (^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0).\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"laravel\": {\n \"providers\": [\n \"Laravel\\\\Tinker\\\\TinkerServiceProvider\"\n ]\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Laravel\\\\Tinker\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Taylor Otwell\",\n \"email\": \"taylor@laravel.com\"\n }\n ],\n \"description\": \"Powerful REPL for the Laravel framework.\",\n \"keywords\": [\n \"REPL\",\n \"Tinker\",\n \"laravel\",\n \"psysh\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/laravel/tinker/issues\",\n \"source\": \"https://github.com/laravel/tinker/tree/v2.10.1\"\n },\n \"time\": \"2025-01-27T14:24:01+00:00\"\n },\n {\n \"name\": \"laravel/ui\",\n \"version\": \"v4.6.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/laravel/ui.git\",\n \"reference\": \"7d6ffa38d79f19c9b3e70a751a9af845e8f41d88\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/laravel/ui/zipball/7d6ffa38d79f19c9b3e70a751a9af845e8f41d88\",\n \"reference\": \"7d6ffa38d79f19c9b3e70a751a9af845e8f41d88\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"illuminate/console\": \"^9.21|^10.0|^11.0|^12.0\",\n \"illuminate/filesystem\": \"^9.21|^10.0|^11.0|^12.0\",\n \"illuminate/support\": \"^9.21|^10.0|^11.0|^12.0\",\n \"illuminate/validation\": \"^9.21|^10.0|^11.0|^12.0\",\n \"php\": \"^8.0\",\n \"symfony/console\": \"^6.0|^7.0\"\n },\n \"require-dev\": {\n \"orchestra/testbench\": \"^7.35|^8.15|^9.0|^10.0\",\n \"phpunit/phpunit\": \"^9.3|^10.4|^11.5\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"laravel\": {\n \"providers\": [\n \"Laravel\\\\Ui\\\\UiServiceProvider\"\n ]\n },\n \"branch-alias\": {\n \"dev-master\": \"4.x-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Laravel\\\\Ui\\\\\": \"src/\",\n \"Illuminate\\\\Foundation\\\\Auth\\\\\": \"auth-backend/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Taylor Otwell\",\n \"email\": \"taylor@laravel.com\"\n }\n ],\n \"description\": \"Laravel UI utilities and presets.\",\n \"keywords\": [\n \"laravel\",\n \"ui\"\n ],\n \"support\": {\n \"source\": \"https://github.com/laravel/ui/tree/v4.6.1\"\n },\n \"time\": \"2025-01-28T15:15:29+00:00\"\n },\n {\n \"name\": \"laravolt/avatar\",\n \"version\": \"6.3.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/laravolt/avatar.git\",\n \"reference\": \"dea77b6fbff08f38e744a9e23855369c8270f2aa\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/laravolt/avatar/zipball/dea77b6fbff08f38e744a9e23855369c8270f2aa\",\n \"reference\": \"dea77b6fbff08f38e744a9e23855369c8270f2aa\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"illuminate/cache\": \"^10.0|^11.0|^12.0\",\n \"illuminate/support\": \"^10.0|^11.0|^12.0\",\n \"intervention/image\": \"^3.4\",\n \"php\": \">=8.2\"\n },\n \"require-dev\": {\n \"mockery/mockery\": \"^1.6.7\",\n \"pestphp/pest\": \"^2.34|^3.7\",\n \"pestphp/pest-plugin-type-coverage\": \"^2.8|^3.3\",\n \"php-coveralls/php-coveralls\": \"^2.1\",\n \"phpunit/phpunit\": \"^11.5.3\",\n \"roave/security-advisories\": \"dev-latest\"\n },\n \"suggest\": {\n \"ext-gd\": \"Needed to support image manipulation\",\n \"ext-imagick\": \"Needed to support image manipulation, better than GD\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"laravel\": {\n \"aliases\": {\n \"Avatar\": \"Laravolt\\\\Avatar\\\\Facade\"\n },\n \"providers\": [\n \"Laravolt\\\\Avatar\\\\ServiceProvider\"\n ]\n },\n \"branch-alias\": {\n \"dev-master\": \"6.0-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Laravolt\\\\Avatar\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Bayu Hendra Winata\",\n \"email\": \"uyab.exe@gmail.com\",\n \"homepage\": \"https://laravolt.dev\",\n \"role\": \"Developer\"\n }\n ],\n \"description\": \"Turn name, email, and any other string into initial-based avatar or gravatar.\",\n \"homepage\": \"https://github.com/laravolt/avatar\",\n \"keywords\": [\n \"avatar\",\n \"gravatar\",\n \"laravel\",\n \"laravolt\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/laravolt/avatar/issues\",\n \"source\": \"https://github.com/laravolt/avatar/tree/6.3.1\"\n },\n \"funding\": [\n {\n \"url\": \"https://paypal.me/bayuhendra\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://ko-fi.com/bayuhendra\",\n \"type\": \"ko_fi\"\n },\n {\n \"url\": \"https://www.patreon.com/uyab\",\n \"type\": \"patreon\"\n }\n ],\n \"time\": \"2025-08-27T08:20:27+00:00\"\n },\n {\n \"name\": \"lcobucci/clock\",\n \"version\": \"3.5.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/lcobucci/clock.git\",\n \"reference\": \"a3139d9e97d47826f27e6a17bb63f13621f86058\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/lcobucci/clock/zipball/a3139d9e97d47826f27e6a17bb63f13621f86058\",\n \"reference\": \"a3139d9e97d47826f27e6a17bb63f13621f86058\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \"~8.3.0 || ~8.4.0 || ~8.5.0\",\n \"psr/clock\": \"^1.0\"\n },\n \"provide\": {\n \"psr/clock-implementation\": \"1.0\"\n },\n \"require-dev\": {\n \"infection/infection\": \"^0.31\",\n \"lcobucci/coding-standard\": \"^11.2.0\",\n \"phpstan/extension-installer\": \"^1.3.1\",\n \"phpstan/phpstan\": \"^2.0.0\",\n \"phpstan/phpstan-deprecation-rules\": \"^2.0.0\",\n \"phpstan/phpstan-phpunit\": \"^2.0.0\",\n \"phpstan/phpstan-strict-rules\": \"^2.0.0\",\n \"phpunit/phpunit\": \"^12.0.0\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Lcobucci\\\\Clock\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Luís Cobucci\",\n \"email\": \"lcobucci@gmail.com\"\n }\n ],\n \"description\": \"Yet another clock abstraction\",\n \"support\": {\n \"issues\": \"https://github.com/lcobucci/clock/issues\",\n \"source\": \"https://github.com/lcobucci/clock/tree/3.5.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/lcobucci\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://www.patreon.com/lcobucci\",\n \"type\": \"patreon\"\n }\n ],\n \"time\": \"2025-10-27T09:03:17+00:00\"\n },\n {\n \"name\": \"lcobucci/jwt\",\n \"version\": \"5.6.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/lcobucci/jwt.git\",\n \"reference\": \"bb3e9f21e4196e8afc41def81ef649c164bca25e\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/lcobucci/jwt/zipball/bb3e9f21e4196e8afc41def81ef649c164bca25e\",\n \"reference\": \"bb3e9f21e4196e8afc41def81ef649c164bca25e\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"ext-openssl\": \"*\",\n \"ext-sodium\": \"*\",\n \"php\": \"~8.2.0 || ~8.3.0 || ~8.4.0 || ~8.5.0\",\n \"psr/clock\": \"^1.0\"\n },\n \"require-dev\": {\n \"infection/infection\": \"^0.29\",\n \"lcobucci/clock\": \"^3.2\",\n \"lcobucci/coding-standard\": \"^11.0\",\n \"phpbench/phpbench\": \"^1.2\",\n \"phpstan/extension-installer\": \"^1.2\",\n \"phpstan/phpstan\": \"^1.10.7\",\n \"phpstan/phpstan-deprecation-rules\": \"^1.1.3\",\n \"phpstan/phpstan-phpunit\": \"^1.3.10\",\n \"phpstan/phpstan-strict-rules\": \"^1.5.0\",\n \"phpunit/phpunit\": \"^11.1\"\n },\n \"suggest\": {\n \"lcobucci/clock\": \">= 3.2\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Lcobucci\\\\JWT\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"BSD-3-Clause\"\n ],\n \"authors\": [\n {\n \"name\": \"Luís Cobucci\",\n \"email\": \"lcobucci@gmail.com\",\n \"role\": \"Developer\"\n }\n ],\n \"description\": \"A simple library to work with JSON Web Token and JSON Web Signature\",\n \"keywords\": [\n \"JWS\",\n \"jwt\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/lcobucci/jwt/issues\",\n \"source\": \"https://github.com/lcobucci/jwt/tree/5.6.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/lcobucci\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://www.patreon.com/lcobucci\",\n \"type\": \"patreon\"\n }\n ],\n \"time\": \"2025-10-17T11:30:53+00:00\"\n },\n {\n \"name\": \"league/commonmark\",\n \"version\": \"2.8.2\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/thephpleague/commonmark.git\",\n \"reference\": \"59fb075d2101740c337c7216e3f32b36c204218b\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/thephpleague/commonmark/zipball/59fb075d2101740c337c7216e3f32b36c204218b\",\n \"reference\": \"59fb075d2101740c337c7216e3f32b36c204218b\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"ext-mbstring\": \"*\",\n \"league/config\": \"^1.1.1\",\n \"php\": \"^7.4 || ^8.0\",\n \"psr/event-dispatcher\": \"^1.0\",\n \"symfony/deprecation-contracts\": \"^2.1 || ^3.0\",\n \"symfony/polyfill-php80\": \"^1.16\"\n },\n \"require-dev\": {\n \"cebe/markdown\": \"^1.0\",\n \"commonmark/cmark\": \"0.31.1\",\n \"commonmark/commonmark.js\": \"0.31.1\",\n \"composer/package-versions-deprecated\": \"^1.8\",\n \"embed/embed\": \"^4.4\",\n \"erusev/parsedown\": \"^1.0\",\n \"ext-json\": \"*\",\n \"github/gfm\": \"0.29.0\",\n \"michelf/php-markdown\": \"^1.4 || ^2.0\",\n \"nyholm/psr7\": \"^1.5\",\n \"phpstan/phpstan\": \"^1.8.2\",\n \"phpunit/phpunit\": \"^9.5.21 || ^10.5.9 || ^11.0.0\",\n \"scrutinizer/ocular\": \"^1.8.1\",\n \"symfony/finder\": \"^5.3 | ^6.0 | ^7.0 || ^8.0\",\n \"symfony/process\": \"^5.4 | ^6.0 | ^7.0 || ^8.0\",\n \"symfony/yaml\": \"^2.3 | ^3.0 | ^4.0 | ^5.0 | ^6.0 | ^7.0 || ^8.0\",\n \"unleashedtech/php-coding-standard\": \"^3.1.1\",\n \"vimeo/psalm\": \"^4.24.0 || ^5.0.0 || ^6.0.0\"\n },\n \"suggest\": {\n \"symfony/yaml\": \"v2.3+ required if using the Front Matter extension\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-main\": \"2.9-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"League\\\\CommonMark\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"BSD-3-Clause\"\n ],\n \"authors\": [\n {\n \"name\": \"Colin O'Dell\",\n \"email\": \"colinodell@gmail.com\",\n \"homepage\": \"https://www.colinodell.com\",\n \"role\": \"Lead Developer\"\n }\n ],\n \"description\": \"Highly-extensible PHP Markdown parser which fully supports the CommonMark spec and GitHub-Flavored Markdown (GFM)\",\n \"homepage\": \"https://commonmark.thephpleague.com\",\n \"keywords\": [\n \"commonmark\",\n \"flavored\",\n \"gfm\",\n \"github\",\n \"github-flavored\",\n \"markdown\",\n \"md\",\n \"parser\"\n ],\n \"support\": {\n \"docs\": \"https://commonmark.thephpleague.com/\",\n \"forum\": \"https://github.com/thephpleague/commonmark/discussions\",\n \"issues\": \"https://github.com/thephpleague/commonmark/issues\",\n \"rss\": \"https://github.com/thephpleague/commonmark/releases.atom\",\n \"source\": \"https://github.com/thephpleague/commonmark\"\n },\n \"funding\": [\n {\n \"url\": \"https://www.colinodell.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://www.paypal.me/colinpodell/10.00\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/colinodell\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/league/commonmark\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2026-03-19T13:16:38+00:00\"\n },\n {\n \"name\": \"league/config\",\n \"version\": \"v1.2.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/thephpleague/config.git\",\n \"reference\": \"754b3604fb2984c71f4af4a9cbe7b57f346ec1f3\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/thephpleague/config/zipball/754b3604fb2984c71f4af4a9cbe7b57f346ec1f3\",\n \"reference\": \"754b3604fb2984c71f4af4a9cbe7b57f346ec1f3\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"dflydev/dot-access-data\": \"^3.0.1\",\n \"nette/schema\": \"^1.2\",\n \"php\": \"^7.4 || ^8.0\"\n },\n \"require-dev\": {\n \"phpstan/phpstan\": \"^1.8.2\",\n \"phpunit/phpunit\": \"^9.5.5\",\n \"scrutinizer/ocular\": \"^1.8.1\",\n \"unleashedtech/php-coding-standard\": \"^3.1\",\n \"vimeo/psalm\": \"^4.7.3\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-main\": \"1.2-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"League\\\\Config\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"BSD-3-Clause\"\n ],\n \"authors\": [\n {\n \"name\": \"Colin O'Dell\",\n \"email\": \"colinodell@gmail.com\",\n \"homepage\": \"https://www.colinodell.com\",\n \"role\": \"Lead Developer\"\n }\n ],\n \"description\": \"Define configuration arrays with strict schemas and access values with dot notation\",\n \"homepage\": \"https://config.thephpleague.com\",\n \"keywords\": [\n \"array\",\n \"config\",\n \"configuration\",\n \"dot\",\n \"dot-access\",\n \"nested\",\n \"schema\"\n ],\n \"support\": {\n \"docs\": \"https://config.thephpleague.com/\",\n \"issues\": \"https://github.com/thephpleague/config/issues\",\n \"rss\": \"https://github.com/thephpleague/config/releases.atom\",\n \"source\": \"https://github.com/thephpleague/config\"\n },\n \"funding\": [\n {\n \"url\": \"https://www.colinodell.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://www.paypal.me/colinpodell/10.00\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/colinodell\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2022-12-11T20:36:23+00:00\"\n },\n {\n \"name\": \"league/event\",\n \"version\": \"3.0.3\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/thephpleague/event.git\",\n \"reference\": \"ec38ff7ea10cad7d99a79ac937fbcffb9334c210\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/thephpleague/event/zipball/ec38ff7ea10cad7d99a79ac937fbcffb9334c210\",\n \"reference\": \"ec38ff7ea10cad7d99a79ac937fbcffb9334c210\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=7.2.0\",\n \"psr/event-dispatcher\": \"^1.0\"\n },\n \"provide\": {\n \"psr/event-dispatcher-implementation\": \"1.0\"\n },\n \"require-dev\": {\n \"friendsofphp/php-cs-fixer\": \"^2.16\",\n \"phpstan/phpstan\": \"^0.12.45\",\n \"phpunit/phpunit\": \"^8.5\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"3.0-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"League\\\\Event\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Frank de Jonge\",\n \"email\": \"info@frenky.net\"\n }\n ],\n \"description\": \"Event package\",\n \"keywords\": [\n \"emitter\",\n \"event\",\n \"listener\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/thephpleague/event/issues\",\n \"source\": \"https://github.com/thephpleague/event/tree/3.0.3\"\n },\n \"time\": \"2024-09-04T16:06:53+00:00\"\n },\n {\n \"name\": \"league/flysystem\",\n \"version\": \"3.32.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/thephpleague/flysystem.git\",\n \"reference\": \"254b1595b16b22dbddaaef9ed6ca9fdac4956725\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/thephpleague/flysystem/zipball/254b1595b16b22dbddaaef9ed6ca9fdac4956725\",\n \"reference\": \"254b1595b16b22dbddaaef9ed6ca9fdac4956725\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"league/flysystem-local\": \"^3.0.0\",\n \"league/mime-type-detection\": \"^1.0.0\",\n \"php\": \"^8.0.2\"\n },\n \"conflict\": {\n \"async-aws/core\": \"<1.19.0\",\n \"async-aws/s3\": \"<1.14.0\",\n \"aws/aws-sdk-php\": \"3.209.31 || 3.210.0\",\n \"guzzlehttp/guzzle\": \"<7.0\",\n \"guzzlehttp/ringphp\": \"<1.1.1\",\n \"phpseclib/phpseclib\": \"3.0.15\",\n \"symfony/http-client\": \"<5.2\"\n },\n \"require-dev\": {\n \"async-aws/s3\": \"^1.5 || ^2.0\",\n \"async-aws/simple-s3\": \"^1.1 || ^2.0\",\n \"aws/aws-sdk-php\": \"^3.295.10\",\n \"composer/semver\": \"^3.0\",\n \"ext-fileinfo\": \"*\",\n \"ext-ftp\": \"*\",\n \"ext-mongodb\": \"^1.3|^2\",\n \"ext-zip\": \"*\",\n \"friendsofphp/php-cs-fixer\": \"^3.5\",\n \"google/cloud-storage\": \"^1.23\",\n \"guzzlehttp/psr7\": \"^2.6\",\n \"microsoft/azure-storage-blob\": \"^1.1\",\n \"mongodb/mongodb\": \"^1.2|^2\",\n \"phpseclib/phpseclib\": \"^3.0.36\",\n \"phpstan/phpstan\": \"^1.10\",\n \"phpunit/phpunit\": \"^9.5.11|^10.0\",\n \"sabre/dav\": \"^4.6.0\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"League\\\\Flysystem\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Frank de Jonge\",\n \"email\": \"info@frankdejonge.nl\"\n }\n ],\n \"description\": \"File storage abstraction for PHP\",\n \"keywords\": [\n \"WebDAV\",\n \"aws\",\n \"cloud\",\n \"file\",\n \"files\",\n \"filesystem\",\n \"filesystems\",\n \"ftp\",\n \"s3\",\n \"sftp\",\n \"storage\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/thephpleague/flysystem/issues\",\n \"source\": \"https://github.com/thephpleague/flysystem/tree/3.32.0\"\n },\n \"time\": \"2026-02-25T17:01:41+00:00\"\n },\n {\n \"name\": \"league/flysystem-aws-s3-v3\",\n \"version\": \"3.29.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/thephpleague/flysystem-aws-s3-v3.git\",\n \"reference\": \"c6ff6d4606e48249b63f269eba7fabdb584e76a9\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/thephpleague/flysystem-aws-s3-v3/zipball/c6ff6d4606e48249b63f269eba7fabdb584e76a9\",\n \"reference\": \"c6ff6d4606e48249b63f269eba7fabdb584e76a9\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"aws/aws-sdk-php\": \"^3.295.10\",\n \"league/flysystem\": \"^3.10.0\",\n \"league/mime-type-detection\": \"^1.0.0\",\n \"php\": \"^8.0.2\"\n },\n \"conflict\": {\n \"guzzlehttp/guzzle\": \"<7.0\",\n \"guzzlehttp/ringphp\": \"<1.1.1\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"League\\\\Flysystem\\\\AwsS3V3\\\\\": \"\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Frank de Jonge\",\n \"email\": \"info@frankdejonge.nl\"\n }\n ],\n \"description\": \"AWS S3 filesystem adapter for Flysystem.\",\n \"keywords\": [\n \"Flysystem\",\n \"aws\",\n \"file\",\n \"files\",\n \"filesystem\",\n \"s3\",\n \"storage\"\n ],\n \"support\": {\n \"source\": \"https://github.com/thephpleague/flysystem-aws-s3-v3/tree/3.29.0\"\n },\n \"time\": \"2024-08-17T13:10:48+00:00\"\n },\n {\n \"name\": \"league/flysystem-local\",\n \"version\": \"3.31.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/thephpleague/flysystem-local.git\",\n \"reference\": \"2f669db18a4c20c755c2bb7d3a7b0b2340488079\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/thephpleague/flysystem-local/zipball/2f669db18a4c20c755c2bb7d3a7b0b2340488079\",\n \"reference\": \"2f669db18a4c20c755c2bb7d3a7b0b2340488079\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"ext-fileinfo\": \"*\",\n \"league/flysystem\": \"^3.0.0\",\n \"league/mime-type-detection\": \"^1.0.0\",\n \"php\": \"^8.0.2\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"League\\\\Flysystem\\\\Local\\\\\": \"\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Frank de Jonge\",\n \"email\": \"info@frankdejonge.nl\"\n }\n ],\n \"description\": \"Local filesystem adapter for Flysystem.\",\n \"keywords\": [\n \"Flysystem\",\n \"file\",\n \"files\",\n \"filesystem\",\n \"local\"\n ],\n \"support\": {\n \"source\": \"https://github.com/thephpleague/flysystem-local/tree/3.31.0\"\n },\n \"time\": \"2026-01-23T15:30:45+00:00\"\n },\n {\n \"name\": \"league/fractal\",\n \"version\": \"0.20.2\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/thephpleague/fractal.git\",\n \"reference\": \"573ca2e0e348a7fe573a3e8fbc29a6588ece8c4e\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/thephpleague/fractal/zipball/573ca2e0e348a7fe573a3e8fbc29a6588ece8c4e\",\n \"reference\": \"573ca2e0e348a7fe573a3e8fbc29a6588ece8c4e\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=7.4\"\n },\n \"require-dev\": {\n \"doctrine/orm\": \"^2.5\",\n \"illuminate/contracts\": \"~5.0\",\n \"laminas/laminas-paginator\": \"~2.12\",\n \"mockery/mockery\": \"^1.3\",\n \"pagerfanta/pagerfanta\": \"~1.0.0|~4.0.0\",\n \"phpstan/phpstan\": \"^1.4\",\n \"phpunit/phpunit\": \"^9.5\",\n \"squizlabs/php_codesniffer\": \"~3.4\",\n \"vimeo/psalm\": \"^4.30\"\n },\n \"suggest\": {\n \"illuminate/pagination\": \"The Illuminate Pagination component.\",\n \"laminas/laminas-paginator\": \"Laminas Framework Paginator\",\n \"pagerfanta/pagerfanta\": \"Pagerfanta Paginator\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"0.20.x-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"League\\\\Fractal\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Phil Sturgeon\",\n \"email\": \"me@philsturgeon.uk\",\n \"homepage\": \"http://philsturgeon.uk/\",\n \"role\": \"Developer\"\n }\n ],\n \"description\": \"Handle the output of complex data structures ready for API output.\",\n \"homepage\": \"http://fractal.thephpleague.com/\",\n \"keywords\": [\n \"api\",\n \"json\",\n \"league\",\n \"rest\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/thephpleague/fractal/issues\",\n \"source\": \"https://github.com/thephpleague/fractal/tree/0.20.2\"\n },\n \"time\": \"2025-02-14T21:33:14+00:00\"\n },\n {\n \"name\": \"league/mime-type-detection\",\n \"version\": \"1.16.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/thephpleague/mime-type-detection.git\",\n \"reference\": \"2d6702ff215bf922936ccc1ad31007edc76451b9\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/thephpleague/mime-type-detection/zipball/2d6702ff215bf922936ccc1ad31007edc76451b9\",\n \"reference\": \"2d6702ff215bf922936ccc1ad31007edc76451b9\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"ext-fileinfo\": \"*\",\n \"php\": \"^7.4 || ^8.0\"\n },\n \"require-dev\": {\n \"friendsofphp/php-cs-fixer\": \"^3.2\",\n \"phpstan/phpstan\": \"^0.12.68\",\n \"phpunit/phpunit\": \"^8.5.8 || ^9.3 || ^10.0\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"League\\\\MimeTypeDetection\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Frank de Jonge\",\n \"email\": \"info@frankdejonge.nl\"\n }\n ],\n \"description\": \"Mime-type detection for Flysystem\",\n \"support\": {\n \"issues\": \"https://github.com/thephpleague/mime-type-detection/issues\",\n \"source\": \"https://github.com/thephpleague/mime-type-detection/tree/1.16.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/frankdejonge\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/league/flysystem\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2024-09-21T08:32:55+00:00\"\n },\n {\n \"name\": \"league/oauth2-client\",\n \"version\": \"2.9.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/thephpleague/oauth2-client.git\",\n \"reference\": \"26e8c5da4f3d78cede7021e09b1330a0fc093d5e\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/thephpleague/oauth2-client/zipball/26e8c5da4f3d78cede7021e09b1330a0fc093d5e\",\n \"reference\": \"26e8c5da4f3d78cede7021e09b1330a0fc093d5e\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"ext-json\": \"*\",\n \"guzzlehttp/guzzle\": \"^6.5.8 || ^7.4.5\",\n \"php\": \"^7.1 || >=8.0.0 <8.6.0\"\n },\n \"require-dev\": {\n \"mockery/mockery\": \"^1.3.5\",\n \"php-parallel-lint/php-parallel-lint\": \"^1.4\",\n \"phpunit/phpunit\": \"^7 || ^8 || ^9 || ^10 || ^11\",\n \"squizlabs/php_codesniffer\": \"^3.11\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"League\\\\OAuth2\\\\Client\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Alex Bilbie\",\n \"email\": \"hello@alexbilbie.com\",\n \"homepage\": \"http://www.alexbilbie.com\",\n \"role\": \"Developer\"\n },\n {\n \"name\": \"Woody Gilk\",\n \"homepage\": \"https://github.com/shadowhand\",\n \"role\": \"Contributor\"\n }\n ],\n \"description\": \"OAuth 2.0 Client Library\",\n \"keywords\": [\n \"Authentication\",\n \"SSO\",\n \"authorization\",\n \"identity\",\n \"idp\",\n \"oauth\",\n \"oauth2\",\n \"single sign on\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/thephpleague/oauth2-client/issues\",\n \"source\": \"https://github.com/thephpleague/oauth2-client/tree/2.9.0\"\n },\n \"time\": \"2025-11-25T22:17:17+00:00\"\n },\n {\n \"name\": \"league/oauth2-google\",\n \"version\": \"4.0.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/thephpleague/oauth2-google.git\",\n \"reference\": \"1b01ba18ba31b29e88771e3e0979e5c91d4afe76\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/thephpleague/oauth2-google/zipball/1b01ba18ba31b29e88771e3e0979e5c91d4afe76\",\n \"reference\": \"1b01ba18ba31b29e88771e3e0979e5c91d4afe76\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"league/oauth2-client\": \"^2.0\",\n \"php\": \"^7.3 || ^8.0\"\n },\n \"require-dev\": {\n \"eloquent/phony-phpunit\": \"^6.0 || ^7.1\",\n \"phpunit/phpunit\": \"^8.0 || ^9.0\",\n \"squizlabs/php_codesniffer\": \"^3.0\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"League\\\\OAuth2\\\\Client\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Woody Gilk\",\n \"email\": \"hello@shadowhand.com\",\n \"homepage\": \"https://shadowhand.com\"\n }\n ],\n \"description\": \"Google OAuth 2.0 Client Provider for The PHP League OAuth2-Client\",\n \"keywords\": [\n \"Authentication\",\n \"authorization\",\n \"client\",\n \"google\",\n \"oauth\",\n \"oauth2\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/thephpleague/oauth2-google/issues\",\n \"source\": \"https://github.com/thephpleague/oauth2-google/tree/4.0.1\"\n },\n \"time\": \"2023-03-17T15:20:52+00:00\"\n },\n {\n \"name\": \"league/oauth2-linkedin\",\n \"version\": \"5.1.2\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/thephpleague/oauth2-linkedin.git\",\n \"reference\": \"f9ab661ca37884067ca286412b6c17304d3c2fac\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/thephpleague/oauth2-linkedin/zipball/f9ab661ca37884067ca286412b6c17304d3c2fac\",\n \"reference\": \"f9ab661ca37884067ca286412b6c17304d3c2fac\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"league/oauth2-client\": \"^2.0\"\n },\n \"require-dev\": {\n \"ext-json\": \"*\",\n \"mockery/mockery\": \"~0.9\",\n \"phpunit/phpunit\": \"~4.0\",\n \"squizlabs/php_codesniffer\": \"~2.0\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"1.0.x-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"League\\\\OAuth2\\\\Client\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Steven Maguire\",\n \"email\": \"stevenmaguire@gmail.com\",\n \"homepage\": \"https://github.com/stevenmaguire\"\n }\n ],\n \"description\": \"LinkedIn OAuth 2.0 Client Provider for The PHP League OAuth2-Client\",\n \"keywords\": [\n \"authorisation\",\n \"authorization\",\n \"client\",\n \"linkedin\",\n \"oauth\",\n \"oauth2\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/thephpleague/oauth2-linkedin/issues\",\n \"source\": \"https://github.com/thephpleague/oauth2-linkedin/tree/5.1.2\"\n },\n \"time\": \"2020-04-20T13:59:44+00:00\"\n },\n {\n \"name\": \"league/oauth2-server\",\n \"version\": \"9.3.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/thephpleague/oauth2-server.git\",\n \"reference\": \"d8e2f39f645a82b207bbac441694d6e6079357cb\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/thephpleague/oauth2-server/zipball/d8e2f39f645a82b207bbac441694d6e6079357cb\",\n \"reference\": \"d8e2f39f645a82b207bbac441694d6e6079357cb\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"defuse/php-encryption\": \"^2.4\",\n \"ext-json\": \"*\",\n \"ext-openssl\": \"*\",\n \"lcobucci/clock\": \"^2.3 || ^3.0\",\n \"lcobucci/jwt\": \"^5.0\",\n \"league/event\": \"^3.0\",\n \"league/uri\": \"^7.0\",\n \"php\": \"~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0 || ~8.5.0\",\n \"psr/http-message\": \"^2.0\",\n \"psr/http-server-middleware\": \"^1.0\"\n },\n \"replace\": {\n \"league/oauth2server\": \"*\",\n \"lncd/oauth2\": \"*\"\n },\n \"require-dev\": {\n \"laminas/laminas-diactoros\": \"^3.5\",\n \"php-parallel-lint/php-parallel-lint\": \"^1.3.2\",\n \"phpstan/extension-installer\": \"^1.3.1\",\n \"phpstan/phpstan\": \"^1.12|^2.0\",\n \"phpstan/phpstan-deprecation-rules\": \"^1.1.4|^2.0\",\n \"phpstan/phpstan-phpunit\": \"^1.3.15|^2.0\",\n \"phpstan/phpstan-strict-rules\": \"^1.5.2|^2.0\",\n \"phpunit/phpunit\": \"^10.5|^11.5|^12.0\",\n \"roave/security-advisories\": \"dev-master\",\n \"slevomat/coding-standard\": \"^8.14.1\",\n \"squizlabs/php_codesniffer\": \"^3.8\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"League\\\\OAuth2\\\\Server\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Alex Bilbie\",\n \"email\": \"hello@alexbilbie.com\",\n \"homepage\": \"http://www.alexbilbie.com\",\n \"role\": \"Developer\"\n },\n {\n \"name\": \"Andy Millington\",\n \"email\": \"andrew@noexceptions.io\",\n \"homepage\": \"https://www.noexceptions.io\",\n \"role\": \"Developer\"\n }\n ],\n \"description\": \"A lightweight and powerful OAuth 2.0 authorization and resource server library with support for all the core specification grants. This library will allow you to secure your API with OAuth and allow your applications users to approve apps that want to access their data from your API.\",\n \"homepage\": \"https://oauth2.thephpleague.com/\",\n \"keywords\": [\n \"Authentication\",\n \"api\",\n \"auth\",\n \"authorisation\",\n \"authorization\",\n \"oauth\",\n \"oauth 2\",\n \"oauth 2.0\",\n \"oauth2\",\n \"protect\",\n \"resource\",\n \"secure\",\n \"server\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/thephpleague/oauth2-server/issues\",\n \"source\": \"https://github.com/thephpleague/oauth2-server/tree/9.3.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/sephster\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2025-11-25T22:51:15+00:00\"\n },\n {\n \"name\": \"league/statsd\",\n \"version\": \"2.0.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/thephpleague/statsd.git\",\n \"reference\": \"e9829dc87a089a88a8645560b9c7432813440a67\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/thephpleague/statsd/zipball/e9829dc87a089a88a8645560b9c7432813440a67\",\n \"reference\": \"e9829dc87a089a88a8645560b9c7432813440a67\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \"^7.4 || ^8.0\"\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \"^9.5\",\n \"squizlabs/php_codesniffer\": \"^3.6\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"laravel\": {\n \"aliases\": {\n \"Statsd\": \"League\\\\StatsD\\\\Laravel5\\\\Facade\\\\StatsdFacade\"\n },\n \"providers\": [\n \"League\\\\StatsD\\\\Laravel5\\\\Provider\\\\StatsdServiceProvider\"\n ]\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"League\\\\StatsD\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Marc Qualie\",\n \"email\": \"marc@marcqualie.com\",\n \"homepage\": \"http://marcqualie.com\",\n \"role\": \"Developer\"\n }\n ],\n \"description\": \"A simple library for working with StatsD in PHP.\",\n \"homepage\": \"https://github.com/thephpleague/statsd\",\n \"keywords\": [\n \"graphite\",\n \"library\",\n \"statsd\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/thephpleague/statsd/issues\",\n \"source\": \"https://github.com/thephpleague/statsd/tree/2.0.0\"\n },\n \"time\": \"2022-01-15T03:21:44+00:00\"\n },\n {\n \"name\": \"league/uri\",\n \"version\": \"7.8.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/thephpleague/uri.git\",\n \"reference\": \"4436c6ec8d458e4244448b069cc572d088230b76\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/thephpleague/uri/zipball/4436c6ec8d458e4244448b069cc572d088230b76\",\n \"reference\": \"4436c6ec8d458e4244448b069cc572d088230b76\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"league/uri-interfaces\": \"^7.8\",\n \"php\": \"^8.1\",\n \"psr/http-factory\": \"^1\"\n },\n \"conflict\": {\n \"league/uri-schemes\": \"^1.0\"\n },\n \"suggest\": {\n \"ext-bcmath\": \"to improve IPV4 host parsing\",\n \"ext-dom\": \"to convert the URI into an HTML anchor tag\",\n \"ext-fileinfo\": \"to create Data URI from file contennts\",\n \"ext-gmp\": \"to improve IPV4 host parsing\",\n \"ext-intl\": \"to handle IDN host with the best performance\",\n \"ext-uri\": \"to use the PHP native URI class\",\n \"jeremykendall/php-domain-parser\": \"to further parse the URI host and resolve its Public Suffix and Top Level Domain\",\n \"league/uri-components\": \"to provide additional tools to manipulate URI objects components\",\n \"league/uri-polyfill\": \"to backport the PHP URI extension for older versions of PHP\",\n \"php-64bit\": \"to improve IPV4 host parsing\",\n \"rowbot/url\": \"to handle URLs using the WHATWG URL Living Standard specification\",\n \"symfony/polyfill-intl-idn\": \"to handle IDN host via the Symfony polyfill if ext-intl is not present\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"7.x-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"League\\\\Uri\\\\\": \"\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Ignace Nyamagana Butera\",\n \"email\": \"nyamsprod@gmail.com\",\n \"homepage\": \"https://nyamsprod.com\"\n }\n ],\n \"description\": \"URI manipulation library\",\n \"homepage\": \"https://uri.thephpleague.com\",\n \"keywords\": [\n \"URN\",\n \"data-uri\",\n \"file-uri\",\n \"ftp\",\n \"hostname\",\n \"http\",\n \"https\",\n \"middleware\",\n \"parse_str\",\n \"parse_url\",\n \"psr-7\",\n \"query-string\",\n \"querystring\",\n \"rfc2141\",\n \"rfc3986\",\n \"rfc3987\",\n \"rfc6570\",\n \"rfc8141\",\n \"uri\",\n \"uri-template\",\n \"url\",\n \"ws\"\n ],\n \"support\": {\n \"docs\": \"https://uri.thephpleague.com\",\n \"forum\": \"https://thephpleague.slack.com\",\n \"issues\": \"https://github.com/thephpleague/uri-src/issues\",\n \"source\": \"https://github.com/thephpleague/uri/tree/7.8.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/sponsors/nyamsprod\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2026-01-14T17:24:56+00:00\"\n },\n {\n \"name\": \"league/uri-interfaces\",\n \"version\": \"7.8.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/thephpleague/uri-interfaces.git\",\n \"reference\": \"c5c5cd056110fc8afaba29fa6b72a43ced42acd4\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/thephpleague/uri-interfaces/zipball/c5c5cd056110fc8afaba29fa6b72a43ced42acd4\",\n \"reference\": \"c5c5cd056110fc8afaba29fa6b72a43ced42acd4\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"ext-filter\": \"*\",\n \"php\": \"^8.1\",\n \"psr/http-message\": \"^1.1 || ^2.0\"\n },\n \"suggest\": {\n \"ext-bcmath\": \"to improve IPV4 host parsing\",\n \"ext-gmp\": \"to improve IPV4 host parsing\",\n \"ext-intl\": \"to handle IDN host with the best performance\",\n \"php-64bit\": \"to improve IPV4 host parsing\",\n \"rowbot/url\": \"to handle URLs using the WHATWG URL Living Standard specification\",\n \"symfony/polyfill-intl-idn\": \"to handle IDN host via the Symfony polyfill if ext-intl is not present\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"7.x-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"League\\\\Uri\\\\\": \"\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Ignace Nyamagana Butera\",\n \"email\": \"nyamsprod@gmail.com\",\n \"homepage\": \"https://nyamsprod.com\"\n }\n ],\n \"description\": \"Common tools for parsing and resolving RFC3987/RFC3986 URI\",\n \"homepage\": \"https://uri.thephpleague.com\",\n \"keywords\": [\n \"data-uri\",\n \"file-uri\",\n \"ftp\",\n \"hostname\",\n \"http\",\n \"https\",\n \"parse_str\",\n \"parse_url\",\n \"psr-7\",\n \"query-string\",\n \"querystring\",\n \"rfc3986\",\n \"rfc3987\",\n \"rfc6570\",\n \"uri\",\n \"url\",\n \"ws\"\n ],\n \"support\": {\n \"docs\": \"https://uri.thephpleague.com\",\n \"forum\": \"https://thephpleague.slack.com\",\n \"issues\": \"https://github.com/thephpleague/uri-src/issues\",\n \"source\": \"https://github.com/thephpleague/uri-interfaces/tree/7.8.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/sponsors/nyamsprod\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2026-01-15T06:54:53+00:00\"\n },\n {\n \"name\": \"markrogoyski/math-php\",\n \"version\": \"v2.11.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/markrogoyski/math-php.git\",\n \"reference\": \"ae499f31513821a62f3d2fb8c6f0d3a333e8b591\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/markrogoyski/math-php/zipball/ae499f31513821a62f3d2fb8c6f0d3a333e8b591\",\n \"reference\": \"ae499f31513821a62f3d2fb8c6f0d3a333e8b591\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"ext-json\": \"*\",\n \"php\": \">=7.2.0\"\n },\n \"require-dev\": {\n \"php-coveralls/php-coveralls\": \"^2.0\",\n \"php-parallel-lint/php-parallel-lint\": \"^1.2\",\n \"phploc/phploc\": \"*\",\n \"phpmd/phpmd\": \"^2.6\",\n \"phpstan/phpstan\": \"^1.10\",\n \"phpunit/phpunit\": \"^8.5\",\n \"squizlabs/php_codesniffer\": \"3.*\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"MathPHP\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Mark Rogoyski\",\n \"email\": \"mark@rogoyski.com\",\n \"homepage\": \"https://github.com/markrogoyski\",\n \"role\": \"Lead developer\"\n },\n {\n \"name\": \"Kevin Nowaczyk\",\n \"homepage\": \"https://github.com/Beakerboy\",\n \"role\": \"Developer\"\n },\n {\n \"name\": \"MathPHP Community of Contributors\",\n \"homepage\": \"https://github.com/markrogoyski/math-php/graphs/contributors\"\n }\n ],\n \"description\": \"Math Library for PHP. Features descriptive statistics and regressions; Continuous and discrete probability distributions; Linear algebra with matrices and vectors, Numerical analysis; special mathematical functions; Algebra\",\n \"homepage\": \"https://github.com/markrogoyski/math-php/\",\n \"keywords\": [\n \"algebra\",\n \"combinatorics\",\n \"distributions\",\n \"linear algebra\",\n \"math\",\n \"mathematics\",\n \"matrix\",\n \"numerical analysis\",\n \"probability\",\n \"regressions\",\n \"statistics\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/markrogoyski/math-php/issues\",\n \"source\": \"https://github.com/markrogoyski/math-php/tree/v2.11.0\"\n },\n \"time\": \"2025-01-26T20:16:06+00:00\"\n },\n {\n \"name\": \"masterminds/html5\",\n \"version\": \"2.10.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/Masterminds/html5-php.git\",\n \"reference\": \"fcf91eb64359852f00d921887b219479b4f21251\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/Masterminds/html5-php/zipball/fcf91eb64359852f00d921887b219479b4f21251\",\n \"reference\": \"fcf91eb64359852f00d921887b219479b4f21251\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"ext-dom\": \"*\",\n \"php\": \">=5.3.0\"\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \"^4.8.35 || ^5.7.21 || ^6 || ^7 || ^8 || ^9\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"2.7-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Masterminds\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Matt Butcher\",\n \"email\": \"technosophos@gmail.com\"\n },\n {\n \"name\": \"Matt Farina\",\n \"email\": \"matt@mattfarina.com\"\n },\n {\n \"name\": \"Asmir Mustafic\",\n \"email\": \"goetas@gmail.com\"\n }\n ],\n \"description\": \"An HTML5 parser and serializer.\",\n \"homepage\": \"http://masterminds.github.io/html5-php\",\n \"keywords\": [\n \"HTML5\",\n \"dom\",\n \"html\",\n \"parser\",\n \"querypath\",\n \"serializer\",\n \"xml\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/Masterminds/html5-php/issues\",\n \"source\": \"https://github.com/Masterminds/html5-php/tree/2.10.0\"\n },\n \"time\": \"2025-07-25T09:04:22+00:00\"\n },\n {\n \"name\": \"microsoft/kiota-abstractions\",\n \"version\": \"1.5.2\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/microsoft/kiota-abstractions-php.git\",\n \"reference\": \"dd22152c9497b5dedcefcf9025691c6db40c23b3\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/microsoft/kiota-abstractions-php/zipball/dd22152c9497b5dedcefcf9025691c6db40c23b3\",\n \"reference\": \"dd22152c9497b5dedcefcf9025691c6db40c23b3\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"doctrine/annotations\": \"^1.13 || ^2.0\",\n \"open-telemetry/sdk\": \"^1.0.0\",\n \"php\": \"^7.4 || ^8.0\",\n \"php-http/promise\": \"~1.2.0\",\n \"psr/http-message\": \"^1.1 || ^2.0\",\n \"ramsey/uuid\": \"^4.2.3\",\n \"stduritemplate/stduritemplate\": \"^0.0.53 || ^0.0.54 || ^0.0.55 || ^0.0.56 || ^0.0.57 || ^0.0.59 || ^1.0.0 || ^2.0.0\"\n },\n \"require-dev\": {\n \"phpstan/phpstan\": \"^1.12.16\",\n \"phpunit/phpunit\": \"^9.6.22\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Microsoft\\\\Kiota\\\\Abstractions\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Microsoft Graph Client Tooling\",\n \"email\": \"graphtooling@service.microsoft.com\",\n \"role\": \"Developer\"\n }\n ],\n \"description\": \"Abstractions for Kiota\",\n \"support\": {\n \"source\": \"https://github.com/microsoft/kiota-abstractions-php/tree/1.5.2\"\n },\n \"time\": \"2025-12-18T13:14:21+00:00\"\n },\n {\n \"name\": \"microsoft/kiota-authentication-phpleague\",\n \"version\": \"1.5.2\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/microsoft/kiota-authentication-phpleague-php.git\",\n \"reference\": \"7766da482a86ccae8629a947cb0d21d160b6d18b\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/microsoft/kiota-authentication-phpleague-php/zipball/7766da482a86ccae8629a947cb0d21d160b6d18b\",\n \"reference\": \"7766da482a86ccae8629a947cb0d21d160b6d18b\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"ext-json\": \"*\",\n \"ext-openssl\": \"*\",\n \"firebase/php-jwt\": \"^6 || ^7\",\n \"league/oauth2-client\": \"^2.6.1\",\n \"microsoft/kiota-abstractions\": \"^1.5.2\",\n \"php\": \"^7.4 || ^8.0\",\n \"ramsey/uuid\": \"^4.2.3\"\n },\n \"require-dev\": {\n \"phpstan/phpstan\": \"^1.12.16\",\n \"phpunit/phpunit\": \"^9.6.22\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Microsoft\\\\Kiota\\\\Authentication\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Microsoft Graph Client Tooling\",\n \"email\": \"graphtooling@service.microsoft.com\"\n }\n ],\n \"description\": \"Authentication provider for Kiota using the PHP League OAuth 2.0 client to authenticate against the Microsoft Identity platform\",\n \"support\": {\n \"source\": \"https://github.com/microsoft/kiota-authentication-phpleague-php/tree/1.5.2\"\n },\n \"time\": \"2025-12-18T13:55:33+00:00\"\n },\n {\n \"name\": \"microsoft/kiota-http-guzzle\",\n \"version\": \"1.5.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/microsoft/kiota-http-guzzle-php.git\",\n \"reference\": \"adb261be0bf44d69fac670db262e0d2006a55c01\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/microsoft/kiota-http-guzzle-php/zipball/adb261be0bf44d69fac670db262e0d2006a55c01\",\n \"reference\": \"adb261be0bf44d69fac670db262e0d2006a55c01\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"ext-json\": \"*\",\n \"ext-zlib\": \"*\",\n \"guzzlehttp/guzzle\": \"^7.4.5\",\n \"microsoft/kiota-abstractions\": \"^1.5.1\",\n \"php\": \"^7.4 || ^8.0\"\n },\n \"require-dev\": {\n \"phpstan/phpstan\": \"^1.12.16\",\n \"phpunit/phpunit\": \"^9.6.22\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Microsoft\\\\Kiota\\\\Http\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Microsoft Graph Client Tooling\",\n \"email\": \"graphtooling@service.microsoft.com\"\n }\n ],\n \"description\": \"Kiota HTTP Request Adapter implementation\",\n \"support\": {\n \"source\": \"https://github.com/microsoft/kiota-http-guzzle-php/tree/1.5.1\"\n },\n \"time\": \"2025-10-08T16:48:12+00:00\"\n },\n {\n \"name\": \"microsoft/kiota-serialization-form\",\n \"version\": \"1.5.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/microsoft/kiota-serialization-form-php.git\",\n \"reference\": \"2820f4070a8eef3df89c46ec9e657b1427800c99\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/microsoft/kiota-serialization-form-php/zipball/2820f4070a8eef3df89c46ec9e657b1427800c99\",\n \"reference\": \"2820f4070a8eef3df89c46ec9e657b1427800c99\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"ext-json\": \"*\",\n \"guzzlehttp/psr7\": \"^1.6 || ^2\",\n \"microsoft/kiota-abstractions\": \"^1.5.1\",\n \"php\": \"^7.4 || ^8.0\"\n },\n \"require-dev\": {\n \"phpstan/phpstan\": \"^1.12.16\",\n \"phpunit/phpunit\": \"^9.6.22\",\n \"roave/security-advisories\": \"dev-latest\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Microsoft\\\\Kiota\\\\Serialization\\\\Form\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Microsoft Graph Client Tooling\",\n \"email\": \"graphtooling@service.microsoft.com\",\n \"role\": \"Developer\"\n }\n ],\n \"description\": \"Form implementation of Kiota abstractions serialization.\",\n \"support\": {\n \"source\": \"https://github.com/microsoft/kiota-serialization-form-php/tree/1.5.1\"\n },\n \"time\": \"2025-10-08T16:47:34+00:00\"\n },\n {\n \"name\": \"microsoft/kiota-serialization-json\",\n \"version\": \"1.5.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/microsoft/kiota-serialization-json-php.git\",\n \"reference\": \"8537f9e53d5c5aed303e87a35e4d2a253468aac6\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/microsoft/kiota-serialization-json-php/zipball/8537f9e53d5c5aed303e87a35e4d2a253468aac6\",\n \"reference\": \"8537f9e53d5c5aed303e87a35e4d2a253468aac6\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"ext-json\": \"*\",\n \"guzzlehttp/psr7\": \"^1.6 || ^2\",\n \"microsoft/kiota-abstractions\": \"^1.5.1\",\n \"php\": \"^7.4 || ^8.0\"\n },\n \"require-dev\": {\n \"phpstan/phpstan\": \"^1.12.16\",\n \"phpunit/phpunit\": \"^9.6.22\",\n \"roave/security-advisories\": \"dev-latest\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Microsoft\\\\Kiota\\\\Serialization\\\\Json\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Microsoft Graph Client Tooling\",\n \"email\": \"graphtooling@service.microsoft.com\",\n \"role\": \"Developer\"\n }\n ],\n \"description\": \"Implementation of Kiota serialization abstractions using Json.\",\n \"support\": {\n \"source\": \"https://github.com/microsoft/kiota-serialization-json-php/tree/1.5.1\"\n },\n \"time\": \"2025-10-08T16:47:11+00:00\"\n },\n {\n \"name\": \"microsoft/kiota-serialization-multipart\",\n \"version\": \"1.5.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/microsoft/kiota-serialization-multipart-php.git\",\n \"reference\": \"28ad890e9b1602ea1681e8d933edd3c78287e729\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/microsoft/kiota-serialization-multipart-php/zipball/28ad890e9b1602ea1681e8d933edd3c78287e729\",\n \"reference\": \"28ad890e9b1602ea1681e8d933edd3c78287e729\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"ext-json\": \"*\",\n \"guzzlehttp/psr7\": \"^1.6 || ^2\",\n \"microsoft/kiota-abstractions\": \"^1.5.1\",\n \"php\": \"^7.4 || ^8.0\"\n },\n \"require-dev\": {\n \"phpstan/phpstan\": \"^1.12.16\",\n \"phpunit/phpunit\": \"^9.6.22\",\n \"roave/security-advisories\": \"dev-latest\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Microsoft\\\\Kiota\\\\Serialization\\\\Multipart\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Microsoft Graph Client Tooling\",\n \"email\": \"graphtooling@service.microsoft.com\",\n \"role\": \"Developer\"\n }\n ],\n \"description\": \"Multipart implementation of Kiota abstractions serialization.\",\n \"support\": {\n \"source\": \"https://github.com/microsoft/kiota-serialization-multipart-php/tree/1.5.1\"\n },\n \"time\": \"2025-10-08T16:47:45+00:00\"\n },\n {\n \"name\": \"microsoft/kiota-serialization-text\",\n \"version\": \"1.5.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/microsoft/kiota-serialization-text-php.git\",\n \"reference\": \"257afebadf347f47284fdaa28849f7187bafb6e6\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/microsoft/kiota-serialization-text-php/zipball/257afebadf347f47284fdaa28849f7187bafb6e6\",\n \"reference\": \"257afebadf347f47284fdaa28849f7187bafb6e6\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"guzzlehttp/psr7\": \"^1.6 || ^2\",\n \"microsoft/kiota-abstractions\": \"^1.5.1\",\n \"php\": \"^7.4 || ^8.0\"\n },\n \"require-dev\": {\n \"phpstan/phpstan\": \"^1.12.16\",\n \"phpunit/phpunit\": \"^9.6.22\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Microsoft\\\\Kiota\\\\Serialization\\\\Text\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Microsoft Graph Client Tooling\",\n \"email\": \"graphtooling@service.microsoft.com\"\n }\n ],\n \"description\": \"Implementation of Serialization Abstractions for text/plain content\",\n \"support\": {\n \"source\": \"https://github.com/microsoft/kiota-serialization-text-php/tree/1.5.1\"\n },\n \"time\": \"2025-10-08T16:46:20+00:00\"\n },\n {\n \"name\": \"microsoft/microsoft-graph\",\n \"version\": \"v2.51.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/microsoftgraph/msgraph-sdk-php.git\",\n \"reference\": \"d77461fb5142d38e2e5313296937b8a771410c34\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/microsoftgraph/msgraph-sdk-php/zipball/d77461fb5142d38e2e5313296937b8a771410c34\",\n \"reference\": \"d77461fb5142d38e2e5313296937b8a771410c34\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"microsoft/microsoft-graph-core\": \"^2.2.1\",\n \"php\": \"^8.0 || ^7.4\"\n },\n \"require-dev\": {\n \"phpstan/phpstan\": \"^0.12.90 || ^1.0.0\",\n \"phpunit/phpunit\": \"^8.0 || ^9.0\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Microsoft\\\\Graph\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Microsoft Graph Client Tooling\",\n \"email\": \"graphtooling@service.microsoft.com\",\n \"role\": \"Developer\"\n }\n ],\n \"description\": \"The Microsoft Graph SDK for PHP\",\n \"homepage\": \"https://developer.microsoft.com/en-us/graph\",\n \"support\": {\n \"issues\": \"https://github.com/microsoftgraph/msgraph-sdk-php/issues\",\n \"source\": \"https://github.com/microsoftgraph/msgraph-sdk-php/tree/v2.51.0\"\n },\n \"time\": \"2025-11-20T01:20:23+00:00\"\n },\n {\n \"name\": \"microsoft/microsoft-graph-core\",\n \"version\": \"v2.3.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/microsoftgraph/msgraph-sdk-php-core.git\",\n \"reference\": \"783111f9e81db9da20cc2dbd48aa1876b500ba15\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/microsoftgraph/msgraph-sdk-php-core/zipball/783111f9e81db9da20cc2dbd48aa1876b500ba15\",\n \"reference\": \"783111f9e81db9da20cc2dbd48aa1876b500ba15\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"ext-json\": \"*\",\n \"microsoft/kiota-authentication-phpleague\": \"^1.5.0\",\n \"microsoft/kiota-http-guzzle\": \"^1.5.0\",\n \"microsoft/kiota-serialization-form\": \"^1.5.0\",\n \"microsoft/kiota-serialization-json\": \"^1.5.0\",\n \"microsoft/kiota-serialization-multipart\": \"^1.5.0\",\n \"microsoft/kiota-serialization-text\": \"^1.5.0\",\n \"php\": \"^8.0 || ^7.4\"\n },\n \"require-dev\": {\n \"mikey179/vfsstream\": \"^1.2\",\n \"phpstan/phpstan\": \"^0.12.90 || ^1.0.0\",\n \"phpunit/phpunit\": \"^9.0\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Microsoft\\\\Graph\\\\Core\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Microsoft Graph Client Tooling\",\n \"email\": \"graphtooling@service.microsoft.com\",\n \"role\": \"Developer\"\n }\n ],\n \"description\": \"The Microsoft Graph Core SDK for PHP\",\n \"homepage\": \"https://developer.microsoft.com/en-us/graph\",\n \"support\": {\n \"issues\": \"https://github.com/microsoftgraph/msgraph-sdk-php-core/issues\",\n \"source\": \"https://github.com/microsoftgraph/msgraph-sdk-php-core/tree/v2.3.1\"\n },\n \"time\": \"2025-03-18T14:27:59+00:00\"\n },\n {\n \"name\": \"monolog/monolog\",\n \"version\": \"3.10.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/Seldaek/monolog.git\",\n \"reference\": \"b321dd6749f0bf7189444158a3ce785cc16d69b0\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/Seldaek/monolog/zipball/b321dd6749f0bf7189444158a3ce785cc16d69b0\",\n \"reference\": \"b321dd6749f0bf7189444158a3ce785cc16d69b0\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.1\",\n \"psr/log\": \"^2.0 || ^3.0\"\n },\n \"provide\": {\n \"psr/log-implementation\": \"3.0.0\"\n },\n \"require-dev\": {\n \"aws/aws-sdk-php\": \"^3.0\",\n \"doctrine/couchdb\": \"~1.0@dev\",\n \"elasticsearch/elasticsearch\": \"^7 || ^8\",\n \"ext-json\": \"*\",\n \"graylog2/gelf-php\": \"^1.4.2 || ^2.0\",\n \"guzzlehttp/guzzle\": \"^7.4.5\",\n \"guzzlehttp/psr7\": \"^2.2\",\n \"mongodb/mongodb\": \"^1.8 || ^2.0\",\n \"php-amqplib/php-amqplib\": \"~2.4 || ^3\",\n \"php-console/php-console\": \"^3.1.8\",\n \"phpstan/phpstan\": \"^2\",\n \"phpstan/phpstan-deprecation-rules\": \"^2\",\n \"phpstan/phpstan-strict-rules\": \"^2\",\n \"phpunit/phpunit\": \"^10.5.17 || ^11.0.7\",\n \"predis/predis\": \"^1.1 || ^2\",\n \"rollbar/rollbar\": \"^4.0\",\n \"ruflin/elastica\": \"^7 || ^8\",\n \"symfony/mailer\": \"^5.4 || ^6\",\n \"symfony/mime\": \"^5.4 || ^6\"\n },\n \"suggest\": {\n \"aws/aws-sdk-php\": \"Allow sending log messages to AWS services like DynamoDB\",\n \"doctrine/couchdb\": \"Allow sending log messages to a CouchDB server\",\n \"elasticsearch/elasticsearch\": \"Allow sending log messages to an Elasticsearch server via official client\",\n \"ext-amqp\": \"Allow sending log messages to an AMQP server (1.0+ required)\",\n \"ext-curl\": \"Required to send log messages using the IFTTTHandler, the LogglyHandler, the SendGridHandler, the SlackWebhookHandler or the TelegramBotHandler\",\n \"ext-mbstring\": \"Allow to work properly with unicode symbols\",\n \"ext-mongodb\": \"Allow sending log messages to a MongoDB server (via driver)\",\n \"ext-openssl\": \"Required to send log messages using SSL\",\n \"ext-sockets\": \"Allow sending log messages to a Syslog server (via UDP driver)\",\n \"graylog2/gelf-php\": \"Allow sending log messages to a GrayLog2 server\",\n \"mongodb/mongodb\": \"Allow sending log messages to a MongoDB server (via library)\",\n \"php-amqplib/php-amqplib\": \"Allow sending log messages to an AMQP server using php-amqplib\",\n \"rollbar/rollbar\": \"Allow sending log messages to Rollbar\",\n \"ruflin/elastica\": \"Allow sending log messages to an Elastic Search server\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-main\": \"3.x-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Monolog\\\\\": \"src/Monolog\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Jordi Boggiano\",\n \"email\": \"j.boggiano@seld.be\",\n \"homepage\": \"https://seld.be\"\n }\n ],\n \"description\": \"Sends your logs to files, sockets, inboxes, databases and various web services\",\n \"homepage\": \"https://github.com/Seldaek/monolog\",\n \"keywords\": [\n \"log\",\n \"logging\",\n \"psr-3\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/Seldaek/monolog/issues\",\n \"source\": \"https://github.com/Seldaek/monolog/tree/3.10.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/Seldaek\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/monolog/monolog\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2026-01-02T08:56:05+00:00\"\n },\n {\n \"name\": \"mtdowling/jmespath.php\",\n \"version\": \"2.8.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/jmespath/jmespath.php.git\",\n \"reference\": \"a2a865e05d5f420b50cc2f85bb78d565db12a6bc\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/jmespath/jmespath.php/zipball/a2a865e05d5f420b50cc2f85bb78d565db12a6bc\",\n \"reference\": \"a2a865e05d5f420b50cc2f85bb78d565db12a6bc\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \"^7.2.5 || ^8.0\",\n \"symfony/polyfill-mbstring\": \"^1.17\"\n },\n \"require-dev\": {\n \"composer/xdebug-handler\": \"^3.0.3\",\n \"phpunit/phpunit\": \"^8.5.33\"\n },\n \"bin\": [\n \"bin/jp.php\"\n ],\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"2.8-dev\"\n }\n },\n \"autoload\": {\n \"files\": [\n \"src/JmesPath.php\"\n ],\n \"psr-4\": {\n \"JmesPath\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Graham Campbell\",\n \"email\": \"hello@gjcampbell.co.uk\",\n \"homepage\": \"https://github.com/GrahamCampbell\"\n },\n {\n \"name\": \"Michael Dowling\",\n \"email\": \"mtdowling@gmail.com\",\n \"homepage\": \"https://github.com/mtdowling\"\n }\n ],\n \"description\": \"Declaratively specify how to extract elements from a JSON document\",\n \"keywords\": [\n \"json\",\n \"jsonpath\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/jmespath/jmespath.php/issues\",\n \"source\": \"https://github.com/jmespath/jmespath.php/tree/2.8.0\"\n },\n \"time\": \"2024-09-04T18:46:31+00:00\"\n },\n {\n \"name\": \"nesbot/carbon\",\n \"version\": \"3.11.3\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/CarbonPHP/carbon.git\",\n \"reference\": \"6a7e652845bb018c668220c2a545aded8594fbbf\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/CarbonPHP/carbon/zipball/6a7e652845bb018c668220c2a545aded8594fbbf\",\n \"reference\": \"6a7e652845bb018c668220c2a545aded8594fbbf\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"carbonphp/carbon-doctrine-types\": \"<100.0\",\n \"ext-json\": \"*\",\n \"php\": \"^8.1\",\n \"psr/clock\": \"^1.0\",\n \"symfony/clock\": \"^6.3.12 || ^7.0 || ^8.0\",\n \"symfony/polyfill-mbstring\": \"^1.0\",\n \"symfony/translation\": \"^4.4.18 || ^5.2.1 || ^6.0 || ^7.0 || ^8.0\"\n },\n \"provide\": {\n \"psr/clock-implementation\": \"1.0\"\n },\n \"require-dev\": {\n \"doctrine/dbal\": \"^3.6.3 || ^4.0\",\n \"doctrine/orm\": \"^2.15.2 || ^3.0\",\n \"friendsofphp/php-cs-fixer\": \"^v3.87.1\",\n \"kylekatarnls/multi-tester\": \"^2.5.3\",\n \"phpmd/phpmd\": \"^2.15.0\",\n \"phpstan/extension-installer\": \"^1.4.3\",\n \"phpstan/phpstan\": \"^2.1.22\",\n \"phpunit/phpunit\": \"^10.5.53\",\n \"squizlabs/php_codesniffer\": \"^3.13.4 || ^4.0.0\"\n },\n \"bin\": [\n \"bin/carbon\"\n ],\n \"type\": \"library\",\n \"extra\": {\n \"laravel\": {\n \"providers\": [\n \"Carbon\\\\Laravel\\\\ServiceProvider\"\n ]\n },\n \"phpstan\": {\n \"includes\": [\n \"extension.neon\"\n ]\n },\n \"branch-alias\": {\n \"dev-2.x\": \"2.x-dev\",\n \"dev-master\": \"3.x-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Carbon\\\\\": \"src/Carbon/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Brian Nesbitt\",\n \"email\": \"brian@nesbot.com\",\n \"homepage\": \"https://markido.com\"\n },\n {\n \"name\": \"kylekatarnls\",\n \"homepage\": \"https://github.com/kylekatarnls\"\n }\n ],\n \"description\": \"An API extension for DateTime that supports 281 different languages.\",\n \"homepage\": \"https://carbonphp.github.io/carbon/\",\n \"keywords\": [\n \"date\",\n \"datetime\",\n \"time\"\n ],\n \"support\": {\n \"docs\": \"https://carbonphp.github.io/carbon/guide/getting-started/introduction.html\",\n \"issues\": \"https://github.com/CarbonPHP/carbon/issues\",\n \"source\": \"https://github.com/CarbonPHP/carbon\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/sponsors/kylekatarnls\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://opencollective.com/Carbon#sponsor\",\n \"type\": \"opencollective\"\n },\n {\n \"url\": \"https://tidelift.com/subscription/pkg/packagist-nesbot-carbon?utm_source=packagist-nesbot-carbon&utm_medium=referral&utm_campaign=readme\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2026-03-11T17:23:39+00:00\"\n },\n {\n \"name\": \"nette/caching\",\n \"version\": \"v3.4.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/nette/caching.git\",\n \"reference\": \"a1c13221b350d0db0a2bd4a77c1e7b65e0aa065d\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/nette/caching/zipball/a1c13221b350d0db0a2bd4a77c1e7b65e0aa065d\",\n \"reference\": \"a1c13221b350d0db0a2bd4a77c1e7b65e0aa065d\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"nette/utils\": \"^4.0\",\n \"php\": \"8.1 - 8.5\"\n },\n \"conflict\": {\n \"latte/latte\": \"<3.0.12\"\n },\n \"require-dev\": {\n \"latte/latte\": \"^3.0.12\",\n \"nette/di\": \"^3.1 || ^4.0\",\n \"nette/tester\": \"^2.4\",\n \"phpstan/phpstan-nette\": \"^2.0@stable\",\n \"psr/simple-cache\": \"^2.0 || ^3.0\",\n \"tracy/tracy\": \"^2.9\"\n },\n \"suggest\": {\n \"ext-pdo_sqlite\": \"to use SQLiteStorage or SQLiteJournal\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"3.4-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Nette\\\\\": \"src\"\n },\n \"classmap\": [\n \"src/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"BSD-3-Clause\",\n \"GPL-2.0-only\",\n \"GPL-3.0-only\"\n ],\n \"authors\": [\n {\n \"name\": \"David Grudl\",\n \"homepage\": \"https://davidgrudl.com\"\n },\n {\n \"name\": \"Nette Community\",\n \"homepage\": \"https://nette.org/contributors\"\n }\n ],\n \"description\": \"⏱ Nette Caching: library with easy-to-use API and many cache backends.\",\n \"homepage\": \"https://nette.org\",\n \"keywords\": [\n \"cache\",\n \"journal\",\n \"memcached\",\n \"nette\",\n \"sqlite\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/nette/caching/issues\",\n \"source\": \"https://github.com/nette/caching/tree/v3.4.0\"\n },\n \"time\": \"2025-08-06T23:05:08+00:00\"\n },\n {\n \"name\": \"nette/schema\",\n \"version\": \"v1.3.5\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/nette/schema.git\",\n \"reference\": \"f0ab1a3cda782dbc5da270d28545236aa80c4002\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/nette/schema/zipball/f0ab1a3cda782dbc5da270d28545236aa80c4002\",\n \"reference\": \"f0ab1a3cda782dbc5da270d28545236aa80c4002\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"nette/utils\": \"^4.0\",\n \"php\": \"8.1 - 8.5\"\n },\n \"require-dev\": {\n \"nette/phpstan-rules\": \"^1.0\",\n \"nette/tester\": \"^2.6\",\n \"phpstan/extension-installer\": \"^1.4@stable\",\n \"phpstan/phpstan\": \"^2.1.39@stable\",\n \"tracy/tracy\": \"^2.8\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"1.3-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Nette\\\\\": \"src\"\n },\n \"classmap\": [\n \"src/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"BSD-3-Clause\",\n \"GPL-2.0-only\",\n \"GPL-3.0-only\"\n ],\n \"authors\": [\n {\n \"name\": \"David Grudl\",\n \"homepage\": \"https://davidgrudl.com\"\n },\n {\n \"name\": \"Nette Community\",\n \"homepage\": \"https://nette.org/contributors\"\n }\n ],\n \"description\": \"📐 Nette Schema: validating data structures against a given Schema.\",\n \"homepage\": \"https://nette.org\",\n \"keywords\": [\n \"config\",\n \"nette\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/nette/schema/issues\",\n \"source\": \"https://github.com/nette/schema/tree/v1.3.5\"\n },\n \"time\": \"2026-02-23T03:47:12+00:00\"\n },\n {\n \"name\": \"nette/utils\",\n \"version\": \"v4.1.3\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/nette/utils.git\",\n \"reference\": \"bb3ea637e3d131d72acc033cfc2746ee893349fe\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/nette/utils/zipball/bb3ea637e3d131d72acc033cfc2746ee893349fe\",\n \"reference\": \"bb3ea637e3d131d72acc033cfc2746ee893349fe\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \"8.2 - 8.5\"\n },\n \"conflict\": {\n \"nette/finder\": \"<3\",\n \"nette/schema\": \"<1.2.2\"\n },\n \"require-dev\": {\n \"jetbrains/phpstorm-attributes\": \"^1.2\",\n \"nette/phpstan-rules\": \"^1.0\",\n \"nette/tester\": \"^2.5\",\n \"phpstan/extension-installer\": \"^1.4@stable\",\n \"phpstan/phpstan\": \"^2.1@stable\",\n \"tracy/tracy\": \"^2.9\"\n },\n \"suggest\": {\n \"ext-gd\": \"to use Image\",\n \"ext-iconv\": \"to use Strings::webalize(), toAscii(), chr() and reverse()\",\n \"ext-intl\": \"to use Strings::webalize(), toAscii(), normalize() and compare()\",\n \"ext-json\": \"to use Nette\\\\Utils\\\\Json\",\n \"ext-mbstring\": \"to use Strings::lower() etc...\",\n \"ext-tokenizer\": \"to use Nette\\\\Utils\\\\Reflection::getUseStatements()\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"4.1-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Nette\\\\\": \"src\"\n },\n \"classmap\": [\n \"src/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"BSD-3-Clause\",\n \"GPL-2.0-only\",\n \"GPL-3.0-only\"\n ],\n \"authors\": [\n {\n \"name\": \"David Grudl\",\n \"homepage\": \"https://davidgrudl.com\"\n },\n {\n \"name\": \"Nette Community\",\n \"homepage\": \"https://nette.org/contributors\"\n }\n ],\n \"description\": \"🛠 Nette Utils: lightweight utilities for string & array manipulation, image handling, safe JSON encoding/decoding, validation, slug or strong password generating etc.\",\n \"homepage\": \"https://nette.org\",\n \"keywords\": [\n \"array\",\n \"core\",\n \"datetime\",\n \"images\",\n \"json\",\n \"nette\",\n \"paginator\",\n \"password\",\n \"slugify\",\n \"string\",\n \"unicode\",\n \"utf-8\",\n \"utility\",\n \"validation\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/nette/utils/issues\",\n \"source\": \"https://github.com/nette/utils/tree/v4.1.3\"\n },\n \"time\": \"2026-02-13T03:05:33+00:00\"\n },\n {\n \"name\": \"nikic/php-parser\",\n \"version\": \"v5.7.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/nikic/PHP-Parser.git\",\n \"reference\": \"dca41cd15c2ac9d055ad70dbfd011130757d1f82\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/nikic/PHP-Parser/zipball/dca41cd15c2ac9d055ad70dbfd011130757d1f82\",\n \"reference\": \"dca41cd15c2ac9d055ad70dbfd011130757d1f82\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"ext-ctype\": \"*\",\n \"ext-json\": \"*\",\n \"ext-tokenizer\": \"*\",\n \"php\": \">=7.4\"\n },\n \"require-dev\": {\n \"ircmaxell/php-yacc\": \"^0.0.7\",\n \"phpunit/phpunit\": \"^9.0\"\n },\n \"bin\": [\n \"bin/php-parse\"\n ],\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"5.x-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"PhpParser\\\\\": \"lib/PhpParser\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"BSD-3-Clause\"\n ],\n \"authors\": [\n {\n \"name\": \"Nikita Popov\"\n }\n ],\n \"description\": \"A PHP parser written in PHP\",\n \"keywords\": [\n \"parser\",\n \"php\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/nikic/PHP-Parser/issues\",\n \"source\": \"https://github.com/nikic/PHP-Parser/tree/v5.7.0\"\n },\n \"time\": \"2025-12-06T11:56:16+00:00\"\n },\n {\n \"name\": \"nunomaduro/termwind\",\n \"version\": \"v2.4.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/nunomaduro/termwind.git\",\n \"reference\": \"712a31b768f5daea284c2169a7d227031001b9a8\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/nunomaduro/termwind/zipball/712a31b768f5daea284c2169a7d227031001b9a8\",\n \"reference\": \"712a31b768f5daea284c2169a7d227031001b9a8\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"ext-mbstring\": \"*\",\n \"php\": \"^8.2\",\n \"symfony/console\": \"^7.4.4 || ^8.0.4\"\n },\n \"require-dev\": {\n \"illuminate/console\": \"^11.47.0\",\n \"laravel/pint\": \"^1.27.1\",\n \"mockery/mockery\": \"^1.6.12\",\n \"pestphp/pest\": \"^2.36.0 || ^3.8.4 || ^4.3.2\",\n \"phpstan/phpstan\": \"^1.12.32\",\n \"phpstan/phpstan-strict-rules\": \"^1.6.2\",\n \"symfony/var-dumper\": \"^7.3.5 || ^8.0.4\",\n \"thecodingmachine/phpstan-strict-rules\": \"^1.0.0\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"laravel\": {\n \"providers\": [\n \"Termwind\\\\Laravel\\\\TermwindServiceProvider\"\n ]\n },\n \"branch-alias\": {\n \"dev-2.x\": \"2.x-dev\"\n }\n },\n \"autoload\": {\n \"files\": [\n \"src/Functions.php\"\n ],\n \"psr-4\": {\n \"Termwind\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Nuno Maduro\",\n \"email\": \"enunomaduro@gmail.com\"\n }\n ],\n \"description\": \"It's like Tailwind CSS, but for the console.\",\n \"keywords\": [\n \"cli\",\n \"console\",\n \"css\",\n \"package\",\n \"php\",\n \"style\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/nunomaduro/termwind/issues\",\n \"source\": \"https://github.com/nunomaduro/termwind/tree/v2.4.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://www.paypal.com/paypalme/enunomaduro\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/nunomaduro\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://github.com/xiCO2k\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2026-02-16T23:10:27+00:00\"\n },\n {\n \"name\": \"nyholm/dsn\",\n \"version\": \"2.0.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/Nyholm/dsn.git\",\n \"reference\": \"9445621b426bac8c0ca161db8cd700da00a4e618\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/Nyholm/dsn/zipball/9445621b426bac8c0ca161db8cd700da00a4e618\",\n \"reference\": \"9445621b426bac8c0ca161db8cd700da00a4e618\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=7.1\"\n },\n \"require-dev\": {\n \"symfony/phpunit-bridge\": \"^5.1\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"2.0-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Nyholm\\\\Dsn\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Tobias Nyholm\",\n \"email\": \"tobias.nyholm@gmail.com\"\n }\n ],\n \"description\": \"Parse your DSN strings in a powerful and flexible way\",\n \"homepage\": \"http://tnyholm.se\",\n \"keywords\": [\n \"database\",\n \"dsn\",\n \"dsn parser\",\n \"parser\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/Nyholm/dsn/issues\",\n \"source\": \"https://github.com/Nyholm/dsn/tree/2.0.1\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/Nyholm\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2021-11-18T09:23:29+00:00\"\n },\n {\n \"name\": \"nyholm/psr7\",\n \"version\": \"1.8.2\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/Nyholm/psr7.git\",\n \"reference\": \"a71f2b11690f4b24d099d6b16690a90ae14fc6f3\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/Nyholm/psr7/zipball/a71f2b11690f4b24d099d6b16690a90ae14fc6f3\",\n \"reference\": \"a71f2b11690f4b24d099d6b16690a90ae14fc6f3\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=7.2\",\n \"psr/http-factory\": \"^1.0\",\n \"psr/http-message\": \"^1.1 || ^2.0\"\n },\n \"provide\": {\n \"php-http/message-factory-implementation\": \"1.0\",\n \"psr/http-factory-implementation\": \"1.0\",\n \"psr/http-message-implementation\": \"1.0\"\n },\n \"require-dev\": {\n \"http-interop/http-factory-tests\": \"^0.9\",\n \"php-http/message-factory\": \"^1.0\",\n \"php-http/psr7-integration-tests\": \"^1.0\",\n \"phpunit/phpunit\": \"^7.5 || ^8.5 || ^9.4\",\n \"symfony/error-handler\": \"^4.4\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"1.8-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Nyholm\\\\Psr7\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Tobias Nyholm\",\n \"email\": \"tobias.nyholm@gmail.com\"\n },\n {\n \"name\": \"Martijn van der Ven\",\n \"email\": \"martijn@vanderven.se\"\n }\n ],\n \"description\": \"A fast PHP7 implementation of PSR-7\",\n \"homepage\": \"https://tnyholm.se\",\n \"keywords\": [\n \"psr-17\",\n \"psr-7\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/Nyholm/psr7/issues\",\n \"source\": \"https://github.com/Nyholm/psr7/tree/1.8.2\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/Zegnat\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://github.com/nyholm\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2024-09-09T07:06:30+00:00\"\n },\n {\n \"name\": \"nyholm/psr7-server\",\n \"version\": \"1.1.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/Nyholm/psr7-server.git\",\n \"reference\": \"4335801d851f554ca43fa6e7d2602141538854dc\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/Nyholm/psr7-server/zipball/4335801d851f554ca43fa6e7d2602141538854dc\",\n \"reference\": \"4335801d851f554ca43fa6e7d2602141538854dc\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \"^7.1 || ^8.0\",\n \"psr/http-factory\": \"^1.0\",\n \"psr/http-message\": \"^1.0 || ^2.0\"\n },\n \"require-dev\": {\n \"nyholm/nsa\": \"^1.1\",\n \"nyholm/psr7\": \"^1.3\",\n \"phpunit/phpunit\": \"^7.0 || ^8.5 || ^9.3\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Nyholm\\\\Psr7Server\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Tobias Nyholm\",\n \"email\": \"tobias.nyholm@gmail.com\"\n },\n {\n \"name\": \"Martijn van der Ven\",\n \"email\": \"martijn@vanderven.se\"\n }\n ],\n \"description\": \"Helper classes to handle PSR-7 server requests\",\n \"homepage\": \"http://tnyholm.se\",\n \"keywords\": [\n \"psr-17\",\n \"psr-7\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/Nyholm/psr7-server/issues\",\n \"source\": \"https://github.com/Nyholm/psr7-server/tree/1.1.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/Zegnat\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://github.com/nyholm\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2023-11-08T09:30:43+00:00\"\n },\n {\n \"name\": \"onelogin/php-saml\",\n \"version\": \"4.3.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/SAML-Toolkits/php-saml.git\",\n \"reference\": \"b009f160e4ac11f49366a45e0d45706b48429353\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/SAML-Toolkits/php-saml/zipball/b009f160e4ac11f49366a45e0d45706b48429353\",\n \"reference\": \"b009f160e4ac11f49366a45e0d45706b48429353\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=7.3\",\n \"robrichards/xmlseclibs\": \">=3.1.4\"\n },\n \"require-dev\": {\n \"pdepend/pdepend\": \"^2.8.0\",\n \"php-coveralls/php-coveralls\": \"^2.0\",\n \"phploc/phploc\": \"^4.0 || ^5.0 || ^6.0 || ^7.0\",\n \"phpunit/phpunit\": \"^9.5\",\n \"sebastian/phpcpd\": \"^4.0 || ^5.0 || ^6.0 \",\n \"squizlabs/php_codesniffer\": \"^3.5.8\"\n },\n \"suggest\": {\n \"ext-curl\": \"Install curl lib to be able to use the IdPMetadataParser for parsing remote XMLs\",\n \"ext-dom\": \"Install xml lib\",\n \"ext-openssl\": \"Install openssl lib in order to handle with x509 certs (require to support sign and encryption)\",\n \"ext-zlib\": \"Install zlib\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"OneLogin\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"description\": \"PHP SAML Toolkit\",\n \"homepage\": \"https://github.com/SAML-Toolkits/php-saml\",\n \"keywords\": [\n \"Federation\",\n \"SAML2\",\n \"SSO\",\n \"identity\",\n \"saml\"\n ],\n \"support\": {\n \"email\": \"sixto.martin.garcia@gmail.com\",\n \"issues\": \"https://github.com/onelogin/SAML-Toolkits/issues\",\n \"source\": \"https://github.com/onelogin/SAML-Toolkits/\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/SAML-Toolkits\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2025-12-09T10:50:49+00:00\"\n },\n {\n \"name\": \"open-telemetry/api\",\n \"version\": \"1.8.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/opentelemetry-php/api.git\",\n \"reference\": \"df5197c6fd0ddd8e9883b87de042d9341300e2ad\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/opentelemetry-php/api/zipball/df5197c6fd0ddd8e9883b87de042d9341300e2ad\",\n \"reference\": \"df5197c6fd0ddd8e9883b87de042d9341300e2ad\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"open-telemetry/context\": \"^1.4\",\n \"php\": \"^8.1\",\n \"psr/log\": \"^1.1|^2.0|^3.0\",\n \"symfony/polyfill-php82\": \"^1.26\"\n },\n \"conflict\": {\n \"open-telemetry/sdk\": \"<=1.11\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"spi\": {\n \"OpenTelemetry\\\\API\\\\Instrumentation\\\\AutoInstrumentation\\\\HookManagerInterface\": [\n \"OpenTelemetry\\\\API\\\\Instrumentation\\\\AutoInstrumentation\\\\ExtensionHookManager\"\n ]\n },\n \"branch-alias\": {\n \"dev-main\": \"1.8.x-dev\"\n }\n },\n \"autoload\": {\n \"files\": [\n \"Trace/functions.php\"\n ],\n \"psr-4\": {\n \"OpenTelemetry\\\\API\\\\\": \".\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"Apache-2.0\"\n ],\n \"authors\": [\n {\n \"name\": \"opentelemetry-php contributors\",\n \"homepage\": \"https://github.com/open-telemetry/opentelemetry-php/graphs/contributors\"\n }\n ],\n \"description\": \"API for OpenTelemetry PHP.\",\n \"keywords\": [\n \"Metrics\",\n \"api\",\n \"apm\",\n \"logging\",\n \"opentelemetry\",\n \"otel\",\n \"tracing\"\n ],\n \"support\": {\n \"chat\": \"https://app.slack.com/client/T08PSQ7BQ/C01NFPCV44V\",\n \"docs\": \"https://opentelemetry.io/docs/languages/php\",\n \"issues\": \"https://github.com/open-telemetry/opentelemetry-php/issues\",\n \"source\": \"https://github.com/open-telemetry/opentelemetry-php\"\n },\n \"time\": \"2026-01-21T04:14:03+00:00\"\n },\n {\n \"name\": \"open-telemetry/context\",\n \"version\": \"1.4.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/opentelemetry-php/context.git\",\n \"reference\": \"d4c4470b541ce72000d18c339cfee633e4c8e0cf\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/opentelemetry-php/context/zipball/d4c4470b541ce72000d18c339cfee633e4c8e0cf\",\n \"reference\": \"d4c4470b541ce72000d18c339cfee633e4c8e0cf\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \"^8.1\",\n \"symfony/polyfill-php82\": \"^1.26\"\n },\n \"suggest\": {\n \"ext-ffi\": \"To allow context switching in Fibers\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-main\": \"1.0.x-dev\"\n }\n },\n \"autoload\": {\n \"files\": [\n \"fiber/initialize_fiber_handler.php\"\n ],\n \"psr-4\": {\n \"OpenTelemetry\\\\Context\\\\\": \".\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"Apache-2.0\"\n ],\n \"authors\": [\n {\n \"name\": \"opentelemetry-php contributors\",\n \"homepage\": \"https://github.com/open-telemetry/opentelemetry-php/graphs/contributors\"\n }\n ],\n \"description\": \"Context implementation for OpenTelemetry PHP.\",\n \"keywords\": [\n \"Context\",\n \"opentelemetry\",\n \"otel\"\n ],\n \"support\": {\n \"chat\": \"https://app.slack.com/client/T08PSQ7BQ/C01NFPCV44V\",\n \"docs\": \"https://opentelemetry.io/docs/php\",\n \"issues\": \"https://github.com/open-telemetry/opentelemetry-php/issues\",\n \"source\": \"https://github.com/open-telemetry/opentelemetry-php\"\n },\n \"time\": \"2025-09-19T00:05:49+00:00\"\n },\n {\n \"name\": \"open-telemetry/sdk\",\n \"version\": \"1.13.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/opentelemetry-php/sdk.git\",\n \"reference\": \"c76f91203bf7ef98ab3f4e0a82ca21699af185e1\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/opentelemetry-php/sdk/zipball/c76f91203bf7ef98ab3f4e0a82ca21699af185e1\",\n \"reference\": \"c76f91203bf7ef98ab3f4e0a82ca21699af185e1\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"ext-json\": \"*\",\n \"nyholm/psr7-server\": \"^1.1\",\n \"open-telemetry/api\": \"^1.7\",\n \"open-telemetry/context\": \"^1.4\",\n \"open-telemetry/sem-conv\": \"^1.0\",\n \"php\": \"^8.1\",\n \"php-http/discovery\": \"^1.14\",\n \"psr/http-client\": \"^1.0\",\n \"psr/http-client-implementation\": \"^1.0\",\n \"psr/http-factory-implementation\": \"^1.0\",\n \"psr/http-message\": \"^1.0.1|^2.0\",\n \"psr/log\": \"^1.1|^2.0|^3.0\",\n \"ramsey/uuid\": \"^3.0 || ^4.0\",\n \"symfony/polyfill-mbstring\": \"^1.23\",\n \"symfony/polyfill-php82\": \"^1.26\",\n \"tbachert/spi\": \"^1.0.5\"\n },\n \"suggest\": {\n \"ext-gmp\": \"To support unlimited number of synchronous metric readers\",\n \"ext-mbstring\": \"To increase performance of string operations\",\n \"open-telemetry/sdk-configuration\": \"File-based OpenTelemetry SDK configuration\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"spi\": {\n \"OpenTelemetry\\\\API\\\\Configuration\\\\ConfigEnv\\\\EnvComponentLoader\": [\n \"OpenTelemetry\\\\API\\\\Instrumentation\\\\Configuration\\\\General\\\\ConfigEnv\\\\EnvComponentLoaderHttpConfig\",\n \"OpenTelemetry\\\\API\\\\Instrumentation\\\\Configuration\\\\General\\\\ConfigEnv\\\\EnvComponentLoaderPeerConfig\"\n ],\n \"OpenTelemetry\\\\SDK\\\\Common\\\\Configuration\\\\Resolver\\\\ResolverInterface\": [\n \"OpenTelemetry\\\\SDK\\\\Common\\\\Configuration\\\\Resolver\\\\SdkConfigurationResolver\"\n ],\n \"OpenTelemetry\\\\API\\\\Instrumentation\\\\AutoInstrumentation\\\\HookManagerInterface\": [\n \"OpenTelemetry\\\\API\\\\Instrumentation\\\\AutoInstrumentation\\\\ExtensionHookManager\"\n ]\n },\n \"branch-alias\": {\n \"dev-main\": \"1.12.x-dev\"\n }\n },\n \"autoload\": {\n \"files\": [\n \"Common/Util/functions.php\",\n \"Logs/Exporter/_register.php\",\n \"Metrics/MetricExporter/_register.php\",\n \"Propagation/_register.php\",\n \"Trace/SpanExporter/_register.php\",\n \"Common/Dev/Compatibility/_load.php\",\n \"_autoload.php\"\n ],\n \"psr-4\": {\n \"OpenTelemetry\\\\SDK\\\\\": \".\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"Apache-2.0\"\n ],\n \"authors\": [\n {\n \"name\": \"opentelemetry-php contributors\",\n \"homepage\": \"https://github.com/open-telemetry/opentelemetry-php/graphs/contributors\"\n }\n ],\n \"description\": \"SDK for OpenTelemetry PHP.\",\n \"keywords\": [\n \"Metrics\",\n \"apm\",\n \"logging\",\n \"opentelemetry\",\n \"otel\",\n \"sdk\",\n \"tracing\"\n ],\n \"support\": {\n \"chat\": \"https://app.slack.com/client/T08PSQ7BQ/C01NFPCV44V\",\n \"docs\": \"https://opentelemetry.io/docs/languages/php\",\n \"issues\": \"https://github.com/open-telemetry/opentelemetry-php/issues\",\n \"source\": \"https://github.com/open-telemetry/opentelemetry-php\"\n },\n \"time\": \"2026-01-28T11:38:11+00:00\"\n },\n {\n \"name\": \"open-telemetry/sem-conv\",\n \"version\": \"1.38.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/opentelemetry-php/sem-conv.git\",\n \"reference\": \"e613bc640a407def4991b8a936a9b27edd9a3240\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/opentelemetry-php/sem-conv/zipball/e613bc640a407def4991b8a936a9b27edd9a3240\",\n \"reference\": \"e613bc640a407def4991b8a936a9b27edd9a3240\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \"^8.0\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-main\": \"1.x-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"OpenTelemetry\\\\SemConv\\\\\": \".\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"Apache-2.0\"\n ],\n \"authors\": [\n {\n \"name\": \"opentelemetry-php contributors\",\n \"homepage\": \"https://github.com/open-telemetry/opentelemetry-php/graphs/contributors\"\n }\n ],\n \"description\": \"Semantic conventions for OpenTelemetry PHP.\",\n \"keywords\": [\n \"Metrics\",\n \"apm\",\n \"logging\",\n \"opentelemetry\",\n \"otel\",\n \"semantic conventions\",\n \"semconv\",\n \"tracing\"\n ],\n \"support\": {\n \"chat\": \"https://app.slack.com/client/T08PSQ7BQ/C01NFPCV44V\",\n \"docs\": \"https://opentelemetry.io/docs/languages/php\",\n \"issues\": \"https://github.com/open-telemetry/opentelemetry-php/issues\",\n \"source\": \"https://github.com/open-telemetry/opentelemetry-php\"\n },\n \"time\": \"2026-01-21T04:14:03+00:00\"\n },\n {\n \"name\": \"paragonie/constant_time_encoding\",\n \"version\": \"v3.1.3\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/paragonie/constant_time_encoding.git\",\n \"reference\": \"d5b01a39b3415c2cd581d3bd3a3575c1ebbd8e77\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/paragonie/constant_time_encoding/zipball/d5b01a39b3415c2cd581d3bd3a3575c1ebbd8e77\",\n \"reference\": \"d5b01a39b3415c2cd581d3bd3a3575c1ebbd8e77\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \"^8\"\n },\n \"require-dev\": {\n \"infection/infection\": \"^0\",\n \"nikic/php-fuzzer\": \"^0\",\n \"phpunit/phpunit\": \"^9|^10|^11\",\n \"vimeo/psalm\": \"^4|^5|^6\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"ParagonIE\\\\ConstantTime\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Paragon Initiative Enterprises\",\n \"email\": \"security@paragonie.com\",\n \"homepage\": \"https://paragonie.com\",\n \"role\": \"Maintainer\"\n },\n {\n \"name\": \"Steve 'Sc00bz' Thomas\",\n \"email\": \"steve@tobtu.com\",\n \"homepage\": \"https://www.tobtu.com\",\n \"role\": \"Original Developer\"\n }\n ],\n \"description\": \"Constant-time Implementations of RFC 4648 Encoding (Base-64, Base-32, Base-16)\",\n \"keywords\": [\n \"base16\",\n \"base32\",\n \"base32_decode\",\n \"base32_encode\",\n \"base64\",\n \"base64_decode\",\n \"base64_encode\",\n \"bin2hex\",\n \"encoding\",\n \"hex\",\n \"hex2bin\",\n \"rfc4648\"\n ],\n \"support\": {\n \"email\": \"info@paragonie.com\",\n \"issues\": \"https://github.com/paragonie/constant_time_encoding/issues\",\n \"source\": \"https://github.com/paragonie/constant_time_encoding\"\n },\n \"time\": \"2025-09-24T15:06:41+00:00\"\n },\n {\n \"name\": \"paragonie/random_compat\",\n \"version\": \"v9.99.100\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/paragonie/random_compat.git\",\n \"reference\": \"996434e5492cb4c3edcb9168db6fbb1359ef965a\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/paragonie/random_compat/zipball/996434e5492cb4c3edcb9168db6fbb1359ef965a\",\n \"reference\": \"996434e5492cb4c3edcb9168db6fbb1359ef965a\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">= 7\"\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \"4.*|5.*\",\n \"vimeo/psalm\": \"^1\"\n },\n \"suggest\": {\n \"ext-libsodium\": \"Provides a modern crypto API that can be used to generate random bytes.\"\n },\n \"type\": \"library\",\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Paragon Initiative Enterprises\",\n \"email\": \"security@paragonie.com\",\n \"homepage\": \"https://paragonie.com\"\n }\n ],\n \"description\": \"PHP 5.x polyfill for random_bytes() and random_int() from PHP 7\",\n \"keywords\": [\n \"csprng\",\n \"polyfill\",\n \"pseudorandom\",\n \"random\"\n ],\n \"support\": {\n \"email\": \"info@paragonie.com\",\n \"issues\": \"https://github.com/paragonie/random_compat/issues\",\n \"source\": \"https://github.com/paragonie/random_compat\"\n },\n \"time\": \"2020-10-15T08:29:30+00:00\"\n },\n {\n \"name\": \"paragonie/sodium_compat\",\n \"version\": \"v1.24.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/paragonie/sodium_compat.git\",\n \"reference\": \"2cb48f26130919f92f30650bdcc30e6f4ebe45ac\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/paragonie/sodium_compat/zipball/2cb48f26130919f92f30650bdcc30e6f4ebe45ac\",\n \"reference\": \"2cb48f26130919f92f30650bdcc30e6f4ebe45ac\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"paragonie/random_compat\": \">=1\",\n \"php\": \"^5.2.4|^5.3|^5.4|^5.5|^5.6|^7|^8\"\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \"^3|^4|^5|^6|^7|^8|^9\"\n },\n \"suggest\": {\n \"ext-libsodium\": \"PHP < 7.0: Better performance, password hashing (Argon2i), secure memory management (memzero), and better security.\",\n \"ext-sodium\": \"PHP >= 7.0: Better performance, password hashing (Argon2i), secure memory management (memzero), and better security.\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"files\": [\n \"autoload.php\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"ISC\"\n ],\n \"authors\": [\n {\n \"name\": \"Paragon Initiative Enterprises\",\n \"email\": \"security@paragonie.com\"\n },\n {\n \"name\": \"Frank Denis\",\n \"email\": \"jedisct1@pureftpd.org\"\n }\n ],\n \"description\": \"Pure PHP implementation of libsodium; uses the PHP extension if it exists\",\n \"keywords\": [\n \"Authentication\",\n \"BLAKE2b\",\n \"ChaCha20\",\n \"ChaCha20-Poly1305\",\n \"Chapoly\",\n \"Curve25519\",\n \"Ed25519\",\n \"EdDSA\",\n \"Edwards-curve Digital Signature Algorithm\",\n \"Elliptic Curve Diffie-Hellman\",\n \"Poly1305\",\n \"Pure-PHP cryptography\",\n \"RFC 7748\",\n \"RFC 8032\",\n \"Salpoly\",\n \"Salsa20\",\n \"X25519\",\n \"XChaCha20-Poly1305\",\n \"XSalsa20-Poly1305\",\n \"Xchacha20\",\n \"Xsalsa20\",\n \"aead\",\n \"cryptography\",\n \"ecdh\",\n \"elliptic curve\",\n \"elliptic curve cryptography\",\n \"encryption\",\n \"libsodium\",\n \"php\",\n \"public-key cryptography\",\n \"secret-key cryptography\",\n \"side-channel resistant\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/paragonie/sodium_compat/issues\",\n \"source\": \"https://github.com/paragonie/sodium_compat/tree/v1.24.0\"\n },\n \"time\": \"2025-12-30T16:16:35+00:00\"\n },\n {\n \"name\": \"phlib/sms-length\",\n \"version\": \"2.0.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/phlib/sms-length.git\",\n \"reference\": \"8fcb9908c52a9f5e6d7c4e6646e32f539f0fd63b\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/phlib/sms-length/zipball/8fcb9908c52a9f5e6d7c4e6646e32f539f0fd63b\",\n \"reference\": \"8fcb9908c52a9f5e6d7c4e6646e32f539f0fd63b\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"ext-mbstring\": \"*\",\n \"php\": \"^7.3|^8.0\"\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \"^9\",\n \"symplify/easy-coding-standard\": \"^9\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Phlib\\\\SmsLength\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"LGPL-3.0\"\n ],\n \"authors\": [\n {\n \"name\": \"Chris Minett\",\n \"role\": \"developer\"\n }\n ],\n \"description\": \"SMS Length calculations, using GSM 03.38 and GSM 03.40\",\n \"keywords\": [\n \"gsm\",\n \"length\",\n \"message\",\n \"size\",\n \"sms\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/phlib/sms-length/issues\",\n \"source\": \"https://github.com/phlib/sms-length/tree/2.0.1\"\n },\n \"time\": \"2022-06-26T04:31:23+00:00\"\n },\n {\n \"name\": \"php-di/invoker\",\n \"version\": \"2.3.7\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/PHP-DI/Invoker.git\",\n \"reference\": \"3c1ddfdef181431fbc4be83378f6d036d59e81e1\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/PHP-DI/Invoker/zipball/3c1ddfdef181431fbc4be83378f6d036d59e81e1\",\n \"reference\": \"3c1ddfdef181431fbc4be83378f6d036d59e81e1\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=7.3\",\n \"psr/container\": \"^1.0|^2.0\"\n },\n \"require-dev\": {\n \"athletic/athletic\": \"~0.1.8\",\n \"mnapoli/hard-mode\": \"~0.3.0\",\n \"phpunit/phpunit\": \"^9.0 || ^10 || ^11 || ^12\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Invoker\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"description\": \"Generic and extensible callable invoker\",\n \"homepage\": \"https://github.com/PHP-DI/Invoker\",\n \"keywords\": [\n \"callable\",\n \"dependency\",\n \"dependency-injection\",\n \"injection\",\n \"invoke\",\n \"invoker\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/PHP-DI/Invoker/issues\",\n \"source\": \"https://github.com/PHP-DI/Invoker/tree/2.3.7\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/mnapoli\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2025-08-30T10:22:22+00:00\"\n },\n {\n \"name\": \"php-di/php-di\",\n \"version\": \"7.1.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/PHP-DI/PHP-DI.git\",\n \"reference\": \"f88054cc052e40dbe7b383c8817c19442d480352\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/PHP-DI/PHP-DI/zipball/f88054cc052e40dbe7b383c8817c19442d480352\",\n \"reference\": \"f88054cc052e40dbe7b383c8817c19442d480352\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"laravel/serializable-closure\": \"^1.0 || ^2.0\",\n \"php\": \">=8.0\",\n \"php-di/invoker\": \"^2.0\",\n \"psr/container\": \"^1.1 || ^2.0\"\n },\n \"provide\": {\n \"psr/container-implementation\": \"^1.0\"\n },\n \"require-dev\": {\n \"friendsofphp/php-cs-fixer\": \"^3\",\n \"friendsofphp/proxy-manager-lts\": \"^1\",\n \"mnapoli/phpunit-easymock\": \"^1.3\",\n \"phpunit/phpunit\": \"^9.6 || ^10 || ^11\",\n \"vimeo/psalm\": \"^5|^6\"\n },\n \"suggest\": {\n \"friendsofphp/proxy-manager-lts\": \"Install it if you want to use lazy injection (version ^1)\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"files\": [\n \"src/functions.php\"\n ],\n \"psr-4\": {\n \"DI\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"description\": \"The dependency injection container for humans\",\n \"homepage\": \"https://php-di.org/\",\n \"keywords\": [\n \"PSR-11\",\n \"container\",\n \"container-interop\",\n \"dependency injection\",\n \"di\",\n \"ioc\",\n \"psr11\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/PHP-DI/PHP-DI/issues\",\n \"source\": \"https://github.com/PHP-DI/PHP-DI/tree/7.1.1\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/mnapoli\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/php-di/php-di\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2025-08-16T11:10:48+00:00\"\n },\n {\n \"name\": \"php-ffmpeg/php-ffmpeg\",\n \"version\": \"v1.3.2\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/PHP-FFMpeg/PHP-FFMpeg.git\",\n \"reference\": \"8e74bdc07ad200da7a6cfb21ec2652875e4368e0\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/PHP-FFMpeg/PHP-FFMpeg/zipball/8e74bdc07ad200da7a6cfb21ec2652875e4368e0\",\n \"reference\": \"8e74bdc07ad200da7a6cfb21ec2652875e4368e0\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"evenement/evenement\": \"^3.0\",\n \"php\": \"^8.0 || ^8.1 || ^8.2 || ^8.3 || ^8.4\",\n \"psr/log\": \"^1.0 || ^2.0 || ^3.0\",\n \"spatie/temporary-directory\": \"^2.0\",\n \"symfony/cache\": \"^5.4 || ^6.0 || ^7.0\",\n \"symfony/process\": \"^5.4 || ^6.0 || ^7.0\"\n },\n \"require-dev\": {\n \"mockery/mockery\": \"^1.5\",\n \"phpunit/phpunit\": \"^9.5.10 || ^10.0\"\n },\n \"suggest\": {\n \"php-ffmpeg/extras\": \"A compilation of common audio & video drivers for PHP-FFMpeg\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"FFMpeg\\\\\": \"src/FFMpeg\",\n \"Alchemy\\\\BinaryDriver\\\\\": \"src/Alchemy/BinaryDriver\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Romain Neutron\",\n \"email\": \"imprec@gmail.com\",\n \"homepage\": \"http://www.lickmychip.com/\"\n },\n {\n \"name\": \"Phraseanet Team\",\n \"email\": \"info@alchemy.fr\",\n \"homepage\": \"http://www.phraseanet.com/\"\n },\n {\n \"name\": \"Patrik Karisch\",\n \"email\": \"patrik@karisch.guru\",\n \"homepage\": \"http://www.karisch.guru\"\n },\n {\n \"name\": \"Romain Biard\",\n \"email\": \"romain.biard@gmail.com\",\n \"homepage\": \"https://www.strime.io/\"\n },\n {\n \"name\": \"Jens Hausdorf\",\n \"email\": \"hello@jens-hausdorf.de\",\n \"homepage\": \"https://jens-hausdorf.de\"\n },\n {\n \"name\": \"Pascal Baljet\",\n \"email\": \"pascal@protone.media\",\n \"homepage\": \"https://protone.media\"\n }\n ],\n \"description\": \"FFMpeg PHP, an Object Oriented library to communicate with AVconv / ffmpeg\",\n \"keywords\": [\n \"audio\",\n \"audio processing\",\n \"avconv\",\n \"avprobe\",\n \"ffmpeg\",\n \"ffprobe\",\n \"video\",\n \"video processing\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/PHP-FFMpeg/PHP-FFMpeg/issues\",\n \"source\": \"https://github.com/PHP-FFMpeg/PHP-FFMpeg/tree/v1.3.2\"\n },\n \"time\": \"2025-04-01T20:36:46+00:00\"\n },\n {\n \"name\": \"php-http/client-common\",\n \"version\": \"2.7.2\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/php-http/client-common.git\",\n \"reference\": \"0cfe9858ab9d3b213041b947c881d5b19ceeca46\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/php-http/client-common/zipball/0cfe9858ab9d3b213041b947c881d5b19ceeca46\",\n \"reference\": \"0cfe9858ab9d3b213041b947c881d5b19ceeca46\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \"^7.1 || ^8.0\",\n \"php-http/httplug\": \"^2.0\",\n \"php-http/message\": \"^1.6\",\n \"psr/http-client\": \"^1.0\",\n \"psr/http-factory\": \"^1.0\",\n \"psr/http-message\": \"^1.0 || ^2.0\",\n \"symfony/options-resolver\": \"~4.0.15 || ~4.1.9 || ^4.2.1 || ^5.0 || ^6.0 || ^7.0\",\n \"symfony/polyfill-php80\": \"^1.17\"\n },\n \"require-dev\": {\n \"doctrine/instantiator\": \"^1.1\",\n \"guzzlehttp/psr7\": \"^1.4\",\n \"nyholm/psr7\": \"^1.2\",\n \"phpspec/phpspec\": \"^5.1 || ^6.3 || ^7.1\",\n \"phpspec/prophecy\": \"^1.10.2\",\n \"phpunit/phpunit\": \"^7.5.20 || ^8.5.33 || ^9.6.7\"\n },\n \"suggest\": {\n \"ext-json\": \"To detect JSON responses with the ContentTypePlugin\",\n \"ext-libxml\": \"To detect XML responses with the ContentTypePlugin\",\n \"php-http/cache-plugin\": \"PSR-6 Cache plugin\",\n \"php-http/logger-plugin\": \"PSR-3 Logger plugin\",\n \"php-http/stopwatch-plugin\": \"Symfony Stopwatch plugin\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Http\\\\Client\\\\Common\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Márk Sági-Kazár\",\n \"email\": \"mark.sagikazar@gmail.com\"\n }\n ],\n \"description\": \"Common HTTP Client implementations and tools for HTTPlug\",\n \"homepage\": \"http://httplug.io\",\n \"keywords\": [\n \"client\",\n \"common\",\n \"http\",\n \"httplug\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/php-http/client-common/issues\",\n \"source\": \"https://github.com/php-http/client-common/tree/2.7.2\"\n },\n \"time\": \"2024-09-24T06:21:48+00:00\"\n },\n {\n \"name\": \"php-http/curl-client\",\n \"version\": \"2.3.3\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/php-http/curl-client.git\",\n \"reference\": \"f3eb48d266341afec0229a7a37a03521d3646b81\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/php-http/curl-client/zipball/f3eb48d266341afec0229a7a37a03521d3646b81\",\n \"reference\": \"f3eb48d266341afec0229a7a37a03521d3646b81\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"ext-curl\": \"*\",\n \"php\": \"^7.4 || ^8.0\",\n \"php-http/discovery\": \"^1.6\",\n \"php-http/httplug\": \"^2.0\",\n \"php-http/message\": \"^1.2\",\n \"psr/http-client\": \"^1.0\",\n \"psr/http-factory-implementation\": \"^1.0\",\n \"symfony/options-resolver\": \"^3.4 || ^4.0 || ^5.0 || ^6.0 || ^7.0\"\n },\n \"provide\": {\n \"php-http/async-client-implementation\": \"1.0\",\n \"php-http/client-implementation\": \"1.0\",\n \"psr/http-client-implementation\": \"1.0\"\n },\n \"require-dev\": {\n \"guzzlehttp/psr7\": \"^2.0\",\n \"laminas/laminas-diactoros\": \"^2.0 || ^3.0\",\n \"php-http/client-integration-tests\": \"^3.0\",\n \"php-http/message-factory\": \"^1.1\",\n \"phpunit/phpunit\": \"^7.5 || ^9.4\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Http\\\\Client\\\\Curl\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Михаил Красильников\",\n \"email\": \"m.krasilnikov@yandex.ru\"\n }\n ],\n \"description\": \"PSR-18 and HTTPlug Async client with cURL\",\n \"homepage\": \"http://php-http.org\",\n \"keywords\": [\n \"curl\",\n \"http\",\n \"psr-18\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/php-http/curl-client/issues\",\n \"source\": \"https://github.com/php-http/curl-client/tree/2.3.3\"\n },\n \"time\": \"2024-10-31T07:36:58+00:00\"\n },\n {\n \"name\": \"php-http/discovery\",\n \"version\": \"1.20.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/php-http/discovery.git\",\n \"reference\": \"82fe4c73ef3363caed49ff8dd1539ba06044910d\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/php-http/discovery/zipball/82fe4c73ef3363caed49ff8dd1539ba06044910d\",\n \"reference\": \"82fe4c73ef3363caed49ff8dd1539ba06044910d\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"composer-plugin-api\": \"^1.0|^2.0\",\n \"php\": \"^7.1 || ^8.0\"\n },\n \"conflict\": {\n \"nyholm/psr7\": \"<1.0\",\n \"zendframework/zend-diactoros\": \"*\"\n },\n \"provide\": {\n \"php-http/async-client-implementation\": \"*\",\n \"php-http/client-implementation\": \"*\",\n \"psr/http-client-implementation\": \"*\",\n \"psr/http-factory-implementation\": \"*\",\n \"psr/http-message-implementation\": \"*\"\n },\n \"require-dev\": {\n \"composer/composer\": \"^1.0.2|^2.0\",\n \"graham-campbell/phpspec-skip-example-extension\": \"^5.0\",\n \"php-http/httplug\": \"^1.0 || ^2.0\",\n \"php-http/message-factory\": \"^1.0\",\n \"phpspec/phpspec\": \"^5.1 || ^6.1 || ^7.3\",\n \"sebastian/comparator\": \"^3.0.5 || ^4.0.8\",\n \"symfony/phpunit-bridge\": \"^6.4.4 || ^7.0.1\"\n },\n \"type\": \"composer-plugin\",\n \"extra\": {\n \"class\": \"Http\\\\Discovery\\\\Composer\\\\Plugin\",\n \"plugin-optional\": true\n },\n \"autoload\": {\n \"psr-4\": {\n \"Http\\\\Discovery\\\\\": \"src/\"\n },\n \"exclude-from-classmap\": [\n \"src/Composer/Plugin.php\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Márk Sági-Kazár\",\n \"email\": \"mark.sagikazar@gmail.com\"\n }\n ],\n \"description\": \"Finds and installs PSR-7, PSR-17, PSR-18 and HTTPlug implementations\",\n \"homepage\": \"http://php-http.org\",\n \"keywords\": [\n \"adapter\",\n \"client\",\n \"discovery\",\n \"factory\",\n \"http\",\n \"message\",\n \"psr17\",\n \"psr7\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/php-http/discovery/issues\",\n \"source\": \"https://github.com/php-http/discovery/tree/1.20.0\"\n },\n \"time\": \"2024-10-02T11:20:13+00:00\"\n },\n {\n \"name\": \"php-http/httplug\",\n \"version\": \"2.4.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/php-http/httplug.git\",\n \"reference\": \"5cad731844891a4c282f3f3e1b582c46839d22f4\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/php-http/httplug/zipball/5cad731844891a4c282f3f3e1b582c46839d22f4\",\n \"reference\": \"5cad731844891a4c282f3f3e1b582c46839d22f4\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \"^7.1 || ^8.0\",\n \"php-http/promise\": \"^1.1\",\n \"psr/http-client\": \"^1.0\",\n \"psr/http-message\": \"^1.0 || ^2.0\"\n },\n \"require-dev\": {\n \"friends-of-phpspec/phpspec-code-coverage\": \"^4.1 || ^5.0 || ^6.0\",\n \"phpspec/phpspec\": \"^5.1 || ^6.0 || ^7.0\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Http\\\\Client\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Eric GELOEN\",\n \"email\": \"geloen.eric@gmail.com\"\n },\n {\n \"name\": \"Márk Sági-Kazár\",\n \"email\": \"mark.sagikazar@gmail.com\",\n \"homepage\": \"https://sagikazarmark.hu\"\n }\n ],\n \"description\": \"HTTPlug, the HTTP client abstraction for PHP\",\n \"homepage\": \"http://httplug.io\",\n \"keywords\": [\n \"client\",\n \"http\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/php-http/httplug/issues\",\n \"source\": \"https://github.com/php-http/httplug/tree/2.4.1\"\n },\n \"time\": \"2024-09-23T11:39:58+00:00\"\n },\n {\n \"name\": \"php-http/message\",\n \"version\": \"1.16.2\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/php-http/message.git\",\n \"reference\": \"06dd5e8562f84e641bf929bfe699ee0f5ce8080a\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/php-http/message/zipball/06dd5e8562f84e641bf929bfe699ee0f5ce8080a\",\n \"reference\": \"06dd5e8562f84e641bf929bfe699ee0f5ce8080a\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"clue/stream-filter\": \"^1.5\",\n \"php\": \"^7.2 || ^8.0\",\n \"psr/http-message\": \"^1.1 || ^2.0\"\n },\n \"provide\": {\n \"php-http/message-factory-implementation\": \"1.0\"\n },\n \"require-dev\": {\n \"ergebnis/composer-normalize\": \"^2.6\",\n \"ext-zlib\": \"*\",\n \"guzzlehttp/psr7\": \"^1.0 || ^2.0\",\n \"laminas/laminas-diactoros\": \"^2.0 || ^3.0\",\n \"php-http/message-factory\": \"^1.0.2\",\n \"phpspec/phpspec\": \"^5.1 || ^6.3 || ^7.1\",\n \"slim/slim\": \"^3.0\"\n },\n \"suggest\": {\n \"ext-zlib\": \"Used with compressor/decompressor streams\",\n \"guzzlehttp/psr7\": \"Used with Guzzle PSR-7 Factories\",\n \"laminas/laminas-diactoros\": \"Used with Diactoros Factories\",\n \"slim/slim\": \"Used with Slim Framework PSR-7 implementation\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"files\": [\n \"src/filters.php\"\n ],\n \"psr-4\": {\n \"Http\\\\Message\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Márk Sági-Kazár\",\n \"email\": \"mark.sagikazar@gmail.com\"\n }\n ],\n \"description\": \"HTTP Message related tools\",\n \"homepage\": \"http://php-http.org\",\n \"keywords\": [\n \"http\",\n \"message\",\n \"psr-7\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/php-http/message/issues\",\n \"source\": \"https://github.com/php-http/message/tree/1.16.2\"\n },\n \"time\": \"2024-10-02T11:34:13+00:00\"\n },\n {\n \"name\": \"php-http/multipart-stream-builder\",\n \"version\": \"1.4.2\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/php-http/multipart-stream-builder.git\",\n \"reference\": \"10086e6de6f53489cca5ecc45b6f468604d3460e\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/php-http/multipart-stream-builder/zipball/10086e6de6f53489cca5ecc45b6f468604d3460e\",\n \"reference\": \"10086e6de6f53489cca5ecc45b6f468604d3460e\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \"^7.1 || ^8.0\",\n \"php-http/discovery\": \"^1.15\",\n \"psr/http-factory-implementation\": \"^1.0\"\n },\n \"require-dev\": {\n \"nyholm/psr7\": \"^1.0\",\n \"php-http/message\": \"^1.5\",\n \"php-http/message-factory\": \"^1.0.2\",\n \"phpunit/phpunit\": \"^7.5.15 || ^8.5 || ^9.3\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Http\\\\Message\\\\MultipartStream\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Tobias Nyholm\",\n \"email\": \"tobias.nyholm@gmail.com\"\n }\n ],\n \"description\": \"A builder class that help you create a multipart stream\",\n \"homepage\": \"http://php-http.org\",\n \"keywords\": [\n \"factory\",\n \"http\",\n \"message\",\n \"multipart stream\",\n \"stream\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/php-http/multipart-stream-builder/issues\",\n \"source\": \"https://github.com/php-http/multipart-stream-builder/tree/1.4.2\"\n },\n \"time\": \"2024-09-04T13:22:54+00:00\"\n },\n {\n \"name\": \"php-http/promise\",\n \"version\": \"1.2.2\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/php-http/promise.git\",\n \"reference\": \"b81bdf5a8e82a065fd73eb82919f28e0ac4d2a1b\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/php-http/promise/zipball/b81bdf5a8e82a065fd73eb82919f28e0ac4d2a1b\",\n \"reference\": \"b81bdf5a8e82a065fd73eb82919f28e0ac4d2a1b\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \"^7.1 || ^8.0\"\n },\n \"require-dev\": {\n \"friends-of-phpspec/phpspec-code-coverage\": \"^4.3.2 || ^6.3\",\n \"phpspec/phpspec\": \"^5.1.2 || ^6.2 || ^7.4\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Http\\\\Promise\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Joel Wurtz\",\n \"email\": \"joel.wurtz@gmail.com\"\n },\n {\n \"name\": \"Márk Sági-Kazár\",\n \"email\": \"mark.sagikazar@gmail.com\"\n }\n ],\n \"description\": \"Promise used for asynchronous HTTP requests\",\n \"homepage\": \"http://httplug.io\",\n \"keywords\": [\n \"promise\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/php-http/promise/issues\",\n \"source\": \"https://github.com/php-http/promise/tree/1.2.2\"\n },\n \"time\": \"2025-11-08T15:23:07+00:00\"\n },\n {\n \"name\": \"php-jsonpointer/php-jsonpointer\",\n \"version\": \"v4.0.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/raphaelstolt/php-jsonpointer.git\",\n \"reference\": \"fd50fc1aecd80dedb5bc59c9a1d70d4cfec7933b\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/raphaelstolt/php-jsonpointer/zipball/fd50fc1aecd80dedb5bc59c9a1d70d4cfec7933b\",\n \"reference\": \"fd50fc1aecd80dedb5bc59c9a1d70d4cfec7933b\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=7.4\"\n },\n \"require-dev\": {\n \"friendsofphp/php-cs-fixer\": \"^3.0\",\n \"phpunit/phpunit\": \"8.*\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"2.0.x-dev\"\n }\n },\n \"autoload\": {\n \"psr-0\": {\n \"Rs\\\\Json\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Raphael Stolt\",\n \"email\": \"raphael.stolt@gmail.com\",\n \"homepage\": \"http://raphaelstolt.blogspot.com/\"\n }\n ],\n \"description\": \"Implementation of JSON Pointer (http://tools.ietf.org/html/rfc6901)\",\n \"homepage\": \"https://github.com/raphaelstolt/php-jsonpointer\",\n \"keywords\": [\n \"json\",\n \"json pointer\",\n \"json traversal\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/raphaelstolt/php-jsonpointer/issues\",\n \"source\": \"https://github.com/raphaelstolt/php-jsonpointer/tree/v4.0.0\"\n },\n \"time\": \"2022-01-11T14:28:07+00:00\"\n },\n {\n \"name\": \"phpoption/phpoption\",\n \"version\": \"1.9.5\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/schmittjoh/php-option.git\",\n \"reference\": \"75365b91986c2405cf5e1e012c5595cd487a98be\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/schmittjoh/php-option/zipball/75365b91986c2405cf5e1e012c5595cd487a98be\",\n \"reference\": \"75365b91986c2405cf5e1e012c5595cd487a98be\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \"^7.2.5 || ^8.0\"\n },\n \"require-dev\": {\n \"bamarni/composer-bin-plugin\": \"^1.8.2\",\n \"phpunit/phpunit\": \"^8.5.44 || ^9.6.25 || ^10.5.53 || ^11.5.34\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"bamarni-bin\": {\n \"bin-links\": true,\n \"forward-command\": false\n },\n \"branch-alias\": {\n \"dev-master\": \"1.9-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"PhpOption\\\\\": \"src/PhpOption/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"Apache-2.0\"\n ],\n \"authors\": [\n {\n \"name\": \"Johannes M. Schmitt\",\n \"email\": \"schmittjoh@gmail.com\",\n \"homepage\": \"https://github.com/schmittjoh\"\n },\n {\n \"name\": \"Graham Campbell\",\n \"email\": \"hello@gjcampbell.co.uk\",\n \"homepage\": \"https://github.com/GrahamCampbell\"\n }\n ],\n \"description\": \"Option Type for PHP\",\n \"keywords\": [\n \"language\",\n \"option\",\n \"php\",\n \"type\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/schmittjoh/php-option/issues\",\n \"source\": \"https://github.com/schmittjoh/php-option/tree/1.9.5\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/GrahamCampbell\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/phpoption/phpoption\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2025-12-27T19:41:33+00:00\"\n },\n {\n \"name\": \"phpseclib/phpseclib\",\n \"version\": \"3.0.51\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/phpseclib/phpseclib.git\",\n \"reference\": \"d59c94077f9c9915abb51ddb52ce85188ece1748\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/phpseclib/phpseclib/zipball/d59c94077f9c9915abb51ddb52ce85188ece1748\",\n \"reference\": \"d59c94077f9c9915abb51ddb52ce85188ece1748\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"paragonie/constant_time_encoding\": \"^1|^2|^3\",\n \"paragonie/random_compat\": \"^1.4|^2.0|^9.99.99\",\n \"php\": \">=5.6.1\"\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \"*\"\n },\n \"suggest\": {\n \"ext-dom\": \"Install the DOM extension to load XML formatted public keys.\",\n \"ext-gmp\": \"Install the GMP (GNU Multiple Precision) extension in order to speed up arbitrary precision integer arithmetic operations.\",\n \"ext-libsodium\": \"SSH2/SFTP can make use of some algorithms provided by the libsodium-php extension.\",\n \"ext-mcrypt\": \"Install the Mcrypt extension in order to speed up a few other cryptographic operations.\",\n \"ext-openssl\": \"Install the OpenSSL extension in order to speed up a wide variety of cryptographic operations.\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"files\": [\n \"phpseclib/bootstrap.php\"\n ],\n \"psr-4\": {\n \"phpseclib3\\\\\": \"phpseclib/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Jim Wigginton\",\n \"email\": \"terrafrost@php.net\",\n \"role\": \"Lead Developer\"\n },\n {\n \"name\": \"Patrick Monnerat\",\n \"email\": \"pm@datasphere.ch\",\n \"role\": \"Developer\"\n },\n {\n \"name\": \"Andreas Fischer\",\n \"email\": \"bantu@phpbb.com\",\n \"role\": \"Developer\"\n },\n {\n \"name\": \"Hans-Jürgen Petrich\",\n \"email\": \"petrich@tronic-media.com\",\n \"role\": \"Developer\"\n },\n {\n \"name\": \"Graham Campbell\",\n \"email\": \"graham@alt-three.com\",\n \"role\": \"Developer\"\n }\n ],\n \"description\": \"PHP Secure Communications Library - Pure-PHP implementations of RSA, AES, SSH2, SFTP, X.509 etc.\",\n \"homepage\": \"http://phpseclib.sourceforge.net\",\n \"keywords\": [\n \"BigInteger\",\n \"aes\",\n \"asn.1\",\n \"asn1\",\n \"blowfish\",\n \"crypto\",\n \"cryptography\",\n \"encryption\",\n \"rsa\",\n \"security\",\n \"sftp\",\n \"signature\",\n \"signing\",\n \"ssh\",\n \"twofish\",\n \"x.509\",\n \"x509\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/phpseclib/phpseclib/issues\",\n \"source\": \"https://github.com/phpseclib/phpseclib/tree/3.0.51\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/terrafrost\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://www.patreon.com/phpseclib\",\n \"type\": \"patreon\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/phpseclib/phpseclib\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2026-04-10T01:33:53+00:00\"\n },\n {\n \"name\": \"propaganistas/laravel-phone\",\n \"version\": \"5.3.6\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/Propaganistas/Laravel-Phone.git\",\n \"reference\": \"89f26e8336cf8f8041609148b4fef752f0bd720e\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/Propaganistas/Laravel-Phone/zipball/89f26e8336cf8f8041609148b4fef752f0bd720e\",\n \"reference\": \"89f26e8336cf8f8041609148b4fef752f0bd720e\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"giggsey/libphonenumber-for-php-lite\": \"^8.13.35|^9.0.0\",\n \"illuminate/contracts\": \"^10.0|^11.0|^12.0\",\n \"illuminate/support\": \"^10.0|^11.0|^12.0\",\n \"illuminate/validation\": \"^10.0|^11.0|^12.0\",\n \"php\": \"^8.1\"\n },\n \"require-dev\": {\n \"laravel/pint\": \"^1.14\",\n \"orchestra/testbench\": \"*\",\n \"phpunit/phpunit\": \"^10.5|^11.5.3\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"laravel\": {\n \"providers\": [\n \"Propaganistas\\\\LaravelPhone\\\\PhoneServiceProvider\"\n ]\n }\n },\n \"autoload\": {\n \"files\": [\n \"src/helpers.php\"\n ],\n \"psr-4\": {\n \"Propaganistas\\\\LaravelPhone\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Propaganistas\",\n \"email\": \"Propaganistas@users.noreply.github.com\"\n }\n ],\n \"description\": \"Adds phone number functionality to Laravel based on Google's libphonenumber API.\",\n \"keywords\": [\n \"laravel\",\n \"libphonenumber\",\n \"phone\",\n \"validation\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/Propaganistas/Laravel-Phone/issues\",\n \"source\": \"https://github.com/Propaganistas/Laravel-Phone/tree/5.3.6\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/Propaganistas\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2025-03-21T09:07:26+00:00\"\n },\n {\n \"name\": \"psr/cache\",\n \"version\": \"3.0.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/php-fig/cache.git\",\n \"reference\": \"aa5030cfa5405eccfdcb1083ce040c2cb8d253bf\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/php-fig/cache/zipball/aa5030cfa5405eccfdcb1083ce040c2cb8d253bf\",\n \"reference\": \"aa5030cfa5405eccfdcb1083ce040c2cb8d253bf\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.0.0\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"1.0.x-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Psr\\\\Cache\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"PHP-FIG\",\n \"homepage\": \"https://www.php-fig.org/\"\n }\n ],\n \"description\": \"Common interface for caching libraries\",\n \"keywords\": [\n \"cache\",\n \"psr\",\n \"psr-6\"\n ],\n \"support\": {\n \"source\": \"https://github.com/php-fig/cache/tree/3.0.0\"\n },\n \"time\": \"2021-02-03T23:26:27+00:00\"\n },\n {\n \"name\": \"psr/clock\",\n \"version\": \"1.0.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/php-fig/clock.git\",\n \"reference\": \"e41a24703d4560fd0acb709162f73b8adfc3aa0d\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/php-fig/clock/zipball/e41a24703d4560fd0acb709162f73b8adfc3aa0d\",\n \"reference\": \"e41a24703d4560fd0acb709162f73b8adfc3aa0d\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \"^7.0 || ^8.0\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Psr\\\\Clock\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"PHP-FIG\",\n \"homepage\": \"https://www.php-fig.org/\"\n }\n ],\n \"description\": \"Common interface for reading the clock.\",\n \"homepage\": \"https://github.com/php-fig/clock\",\n \"keywords\": [\n \"clock\",\n \"now\",\n \"psr\",\n \"psr-20\",\n \"time\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/php-fig/clock/issues\",\n \"source\": \"https://github.com/php-fig/clock/tree/1.0.0\"\n },\n \"time\": \"2022-11-25T14:36:26+00:00\"\n },\n {\n \"name\": \"psr/container\",\n \"version\": \"2.0.2\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/php-fig/container.git\",\n \"reference\": \"c71ecc56dfe541dbd90c5360474fbc405f8d5963\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963\",\n \"reference\": \"c71ecc56dfe541dbd90c5360474fbc405f8d5963\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=7.4.0\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"2.0.x-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Psr\\\\Container\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"PHP-FIG\",\n \"homepage\": \"https://www.php-fig.org/\"\n }\n ],\n \"description\": \"Common Container Interface (PHP FIG PSR-11)\",\n \"homepage\": \"https://github.com/php-fig/container\",\n \"keywords\": [\n \"PSR-11\",\n \"container\",\n \"container-interface\",\n \"container-interop\",\n \"psr\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/php-fig/container/issues\",\n \"source\": \"https://github.com/php-fig/container/tree/2.0.2\"\n },\n \"time\": \"2021-11-05T16:47:00+00:00\"\n },\n {\n \"name\": \"psr/event-dispatcher\",\n \"version\": \"1.0.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/php-fig/event-dispatcher.git\",\n \"reference\": \"dbefd12671e8a14ec7f180cab83036ed26714bb0\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0\",\n \"reference\": \"dbefd12671e8a14ec7f180cab83036ed26714bb0\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=7.2.0\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"1.0.x-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Psr\\\\EventDispatcher\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"PHP-FIG\",\n \"homepage\": \"http://www.php-fig.org/\"\n }\n ],\n \"description\": \"Standard interfaces for event handling.\",\n \"keywords\": [\n \"events\",\n \"psr\",\n \"psr-14\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/php-fig/event-dispatcher/issues\",\n \"source\": \"https://github.com/php-fig/event-dispatcher/tree/1.0.0\"\n },\n \"time\": \"2019-01-08T18:20:26+00:00\"\n },\n {\n \"name\": \"psr/http-client\",\n \"version\": \"1.0.3\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/php-fig/http-client.git\",\n \"reference\": \"bb5906edc1c324c9a05aa0873d40117941e5fa90\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/php-fig/http-client/zipball/bb5906edc1c324c9a05aa0873d40117941e5fa90\",\n \"reference\": \"bb5906edc1c324c9a05aa0873d40117941e5fa90\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \"^7.0 || ^8.0\",\n \"psr/http-message\": \"^1.0 || ^2.0\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"1.0.x-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Psr\\\\Http\\\\Client\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"PHP-FIG\",\n \"homepage\": \"https://www.php-fig.org/\"\n }\n ],\n \"description\": \"Common interface for HTTP clients\",\n \"homepage\": \"https://github.com/php-fig/http-client\",\n \"keywords\": [\n \"http\",\n \"http-client\",\n \"psr\",\n \"psr-18\"\n ],\n \"support\": {\n \"source\": \"https://github.com/php-fig/http-client\"\n },\n \"time\": \"2023-09-23T14:17:50+00:00\"\n },\n {\n \"name\": \"psr/http-factory\",\n \"version\": \"1.1.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/php-fig/http-factory.git\",\n \"reference\": \"2b4765fddfe3b508ac62f829e852b1501d3f6e8a\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/php-fig/http-factory/zipball/2b4765fddfe3b508ac62f829e852b1501d3f6e8a\",\n \"reference\": \"2b4765fddfe3b508ac62f829e852b1501d3f6e8a\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=7.1\",\n \"psr/http-message\": \"^1.0 || ^2.0\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"1.0.x-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Psr\\\\Http\\\\Message\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"PHP-FIG\",\n \"homepage\": \"https://www.php-fig.org/\"\n }\n ],\n \"description\": \"PSR-17: Common interfaces for PSR-7 HTTP message factories\",\n \"keywords\": [\n \"factory\",\n \"http\",\n \"message\",\n \"psr\",\n \"psr-17\",\n \"psr-7\",\n \"request\",\n \"response\"\n ],\n \"support\": {\n \"source\": \"https://github.com/php-fig/http-factory\"\n },\n \"time\": \"2024-04-15T12:06:14+00:00\"\n },\n {\n \"name\": \"psr/http-message\",\n \"version\": \"2.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/php-fig/http-message.git\",\n \"reference\": \"402d35bcb92c70c026d1a6a9883f06b2ead23d71\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/php-fig/http-message/zipball/402d35bcb92c70c026d1a6a9883f06b2ead23d71\",\n \"reference\": \"402d35bcb92c70c026d1a6a9883f06b2ead23d71\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \"^7.2 || ^8.0\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"2.0.x-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Psr\\\\Http\\\\Message\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"PHP-FIG\",\n \"homepage\": \"https://www.php-fig.org/\"\n }\n ],\n \"description\": \"Common interface for HTTP messages\",\n \"homepage\": \"https://github.com/php-fig/http-message\",\n \"keywords\": [\n \"http\",\n \"http-message\",\n \"psr\",\n \"psr-7\",\n \"request\",\n \"response\"\n ],\n \"support\": {\n \"source\": \"https://github.com/php-fig/http-message/tree/2.0\"\n },\n \"time\": \"2023-04-04T09:54:51+00:00\"\n },\n {\n \"name\": \"psr/http-server-handler\",\n \"version\": \"1.0.2\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/php-fig/http-server-handler.git\",\n \"reference\": \"84c4fb66179be4caaf8e97bd239203245302e7d4\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/php-fig/http-server-handler/zipball/84c4fb66179be4caaf8e97bd239203245302e7d4\",\n \"reference\": \"84c4fb66179be4caaf8e97bd239203245302e7d4\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=7.0\",\n \"psr/http-message\": \"^1.0 || ^2.0\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"1.0.x-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Psr\\\\Http\\\\Server\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"PHP-FIG\",\n \"homepage\": \"https://www.php-fig.org/\"\n }\n ],\n \"description\": \"Common interface for HTTP server-side request handler\",\n \"keywords\": [\n \"handler\",\n \"http\",\n \"http-interop\",\n \"psr\",\n \"psr-15\",\n \"psr-7\",\n \"request\",\n \"response\",\n \"server\"\n ],\n \"support\": {\n \"source\": \"https://github.com/php-fig/http-server-handler/tree/1.0.2\"\n },\n \"time\": \"2023-04-10T20:06:20+00:00\"\n },\n {\n \"name\": \"psr/http-server-middleware\",\n \"version\": \"1.0.2\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/php-fig/http-server-middleware.git\",\n \"reference\": \"c1481f747daaa6a0782775cd6a8c26a1bf4a3829\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/php-fig/http-server-middleware/zipball/c1481f747daaa6a0782775cd6a8c26a1bf4a3829\",\n \"reference\": \"c1481f747daaa6a0782775cd6a8c26a1bf4a3829\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=7.0\",\n \"psr/http-message\": \"^1.0 || ^2.0\",\n \"psr/http-server-handler\": \"^1.0\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"1.0.x-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Psr\\\\Http\\\\Server\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"PHP-FIG\",\n \"homepage\": \"https://www.php-fig.org/\"\n }\n ],\n \"description\": \"Common interface for HTTP server-side middleware\",\n \"keywords\": [\n \"http\",\n \"http-interop\",\n \"middleware\",\n \"psr\",\n \"psr-15\",\n \"psr-7\",\n \"request\",\n \"response\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/php-fig/http-server-middleware/issues\",\n \"source\": \"https://github.com/php-fig/http-server-middleware/tree/1.0.2\"\n },\n \"time\": \"2023-04-11T06:14:47+00:00\"\n },\n {\n \"name\": \"psr/log\",\n \"version\": \"3.0.2\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/php-fig/log.git\",\n \"reference\": \"f16e1d5863e37f8d8c2a01719f5b34baa2b714d3\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/php-fig/log/zipball/f16e1d5863e37f8d8c2a01719f5b34baa2b714d3\",\n \"reference\": \"f16e1d5863e37f8d8c2a01719f5b34baa2b714d3\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.0.0\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"3.x-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Psr\\\\Log\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"PHP-FIG\",\n \"homepage\": \"https://www.php-fig.org/\"\n }\n ],\n \"description\": \"Common interface for logging libraries\",\n \"homepage\": \"https://github.com/php-fig/log\",\n \"keywords\": [\n \"log\",\n \"psr\",\n \"psr-3\"\n ],\n \"support\": {\n \"source\": \"https://github.com/php-fig/log/tree/3.0.2\"\n },\n \"time\": \"2024-09-11T13:17:53+00:00\"\n },\n {\n \"name\": \"psr/simple-cache\",\n \"version\": \"3.0.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/php-fig/simple-cache.git\",\n \"reference\": \"764e0b3939f5ca87cb904f570ef9be2d78a07865\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/php-fig/simple-cache/zipball/764e0b3939f5ca87cb904f570ef9be2d78a07865\",\n \"reference\": \"764e0b3939f5ca87cb904f570ef9be2d78a07865\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.0.0\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"3.0.x-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Psr\\\\SimpleCache\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"PHP-FIG\",\n \"homepage\": \"https://www.php-fig.org/\"\n }\n ],\n \"description\": \"Common interfaces for simple caching\",\n \"keywords\": [\n \"cache\",\n \"caching\",\n \"psr\",\n \"psr-16\",\n \"simple-cache\"\n ],\n \"support\": {\n \"source\": \"https://github.com/php-fig/simple-cache/tree/3.0.0\"\n },\n \"time\": \"2021-10-29T13:26:27+00:00\"\n },\n {\n \"name\": \"psy/psysh\",\n \"version\": \"v0.12.21\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/bobthecow/psysh.git\",\n \"reference\": \"4821fab5b7cd8c49a673a9fd5754dc9162bb9e97\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/bobthecow/psysh/zipball/4821fab5b7cd8c49a673a9fd5754dc9162bb9e97\",\n \"reference\": \"4821fab5b7cd8c49a673a9fd5754dc9162bb9e97\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"ext-json\": \"*\",\n \"ext-tokenizer\": \"*\",\n \"nikic/php-parser\": \"^5.0 || ^4.0\",\n \"php\": \"^8.0 || ^7.4\",\n \"symfony/console\": \"^8.0 || ^7.0 || ^6.0 || ^5.0 || ^4.0 || ^3.4\",\n \"symfony/var-dumper\": \"^8.0 || ^7.0 || ^6.0 || ^5.0 || ^4.0 || ^3.4\"\n },\n \"conflict\": {\n \"symfony/console\": \"4.4.37 || 5.3.14 || 5.3.15 || 5.4.3 || 5.4.4 || 6.0.3 || 6.0.4\"\n },\n \"require-dev\": {\n \"bamarni/composer-bin-plugin\": \"^1.2\",\n \"composer/class-map-generator\": \"^1.6\"\n },\n \"suggest\": {\n \"composer/class-map-generator\": \"Improved tab completion performance with better class discovery.\",\n \"ext-pcntl\": \"Enabling the PCNTL extension makes PsySH a lot happier :)\",\n \"ext-posix\": \"If you have PCNTL, you'll want the POSIX extension as well.\"\n },\n \"bin\": [\n \"bin/psysh\"\n ],\n \"type\": \"library\",\n \"extra\": {\n \"bamarni-bin\": {\n \"bin-links\": false,\n \"forward-command\": false\n },\n \"branch-alias\": {\n \"dev-main\": \"0.12.x-dev\"\n }\n },\n \"autoload\": {\n \"files\": [\n \"src/functions.php\"\n ],\n \"psr-4\": {\n \"Psy\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Justin Hileman\",\n \"email\": \"justin@justinhileman.info\"\n }\n ],\n \"description\": \"An interactive shell for modern PHP.\",\n \"homepage\": \"https://psysh.org\",\n \"keywords\": [\n \"REPL\",\n \"console\",\n \"interactive\",\n \"shell\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/bobthecow/psysh/issues\",\n \"source\": \"https://github.com/bobthecow/psysh/tree/v0.12.21\"\n },\n \"time\": \"2026-03-06T21:21:28+00:00\"\n },\n {\n \"name\": \"pubnub/pubnub\",\n \"version\": \"6.3.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/pubnub/php.git\",\n \"reference\": \"26de0a59dda29f1246378995f96c4f95f6d64980\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/pubnub/php/zipball/26de0a59dda29f1246378995f96c4f95f6d64980\",\n \"reference\": \"26de0a59dda29f1246378995f96c4f95f6d64980\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \"^7.4|>=8.0\",\n \"psr/log\": \"^1.1|^2.0|^3.0\",\n \"rmccue/requests\": \"^2.0\"\n },\n \"require-dev\": {\n \"monolog/monolog\": \"^2.9 || ^3.0\",\n \"phpstan/phpstan\": \"^1.8\",\n \"phpunit/phpunit\": \"^9.5\",\n \"squizlabs/php_codesniffer\": \"^3.7\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"PubNub\\\\\": \"src/PubNub\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"proprietary\"\n ],\n \"authors\": [\n {\n \"name\": \"PubNub\",\n \"email\": \"support@pubnub.com\"\n }\n ],\n \"description\": \"This is the official PubNub PHP SDK repository.\",\n \"homepage\": \"http://www.pubnub.com/\",\n \"keywords\": [\n \"ajax\",\n \"api\",\n \"push\",\n \"real time\",\n \"real-time\",\n \"realtime\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/pubnub/php/issues\",\n \"source\": \"https://github.com/pubnub/php/tree/v6.3.0\"\n },\n \"time\": \"2024-06-19T07:31:01+00:00\"\n },\n {\n \"name\": \"pusher/pusher-php-server\",\n \"version\": \"7.2.3\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/pusher/pusher-http-php.git\",\n \"reference\": \"416e68dd5f640175ad5982131c42a7a666d1d8e9\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/pusher/pusher-http-php/zipball/416e68dd5f640175ad5982131c42a7a666d1d8e9\",\n \"reference\": \"416e68dd5f640175ad5982131c42a7a666d1d8e9\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"ext-curl\": \"*\",\n \"ext-json\": \"*\",\n \"guzzlehttp/guzzle\": \"^7.2\",\n \"paragonie/sodium_compat\": \"^1.6\",\n \"php\": \"^7.3|^8.0\",\n \"psr/log\": \"^1.0|^2.0|^3.0\"\n },\n \"require-dev\": {\n \"overtrue/phplint\": \"^2.3\",\n \"phpunit/phpunit\": \"^9.3\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"5.0-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Pusher\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"description\": \"Library for interacting with the Pusher REST API\",\n \"keywords\": [\n \"events\",\n \"messaging\",\n \"php-pusher-server\",\n \"publish\",\n \"push\",\n \"pusher\",\n \"real time\",\n \"real-time\",\n \"realtime\",\n \"rest\",\n \"trigger\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/pusher/pusher-http-php/issues\",\n \"source\": \"https://github.com/pusher/pusher-http-php/tree/7.2.3\"\n },\n \"time\": \"2023-05-17T16:00:06+00:00\"\n },\n {\n \"name\": \"ralouphie/getallheaders\",\n \"version\": \"3.0.3\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/ralouphie/getallheaders.git\",\n \"reference\": \"120b605dfeb996808c31b6477290a714d356e822\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822\",\n \"reference\": \"120b605dfeb996808c31b6477290a714d356e822\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=5.6\"\n },\n \"require-dev\": {\n \"php-coveralls/php-coveralls\": \"^2.1\",\n \"phpunit/phpunit\": \"^5 || ^6.5\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"files\": [\n \"src/getallheaders.php\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Ralph Khattar\",\n \"email\": \"ralph.khattar@gmail.com\"\n }\n ],\n \"description\": \"A polyfill for getallheaders.\",\n \"support\": {\n \"issues\": \"https://github.com/ralouphie/getallheaders/issues\",\n \"source\": \"https://github.com/ralouphie/getallheaders/tree/develop\"\n },\n \"time\": \"2019-03-08T08:55:37+00:00\"\n },\n {\n \"name\": \"ramsey/collection\",\n \"version\": \"2.1.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/ramsey/collection.git\",\n \"reference\": \"344572933ad0181accbf4ba763e85a0306a8c5e2\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/ramsey/collection/zipball/344572933ad0181accbf4ba763e85a0306a8c5e2\",\n \"reference\": \"344572933ad0181accbf4ba763e85a0306a8c5e2\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \"^8.1\"\n },\n \"require-dev\": {\n \"captainhook/plugin-composer\": \"^5.3\",\n \"ergebnis/composer-normalize\": \"^2.45\",\n \"fakerphp/faker\": \"^1.24\",\n \"hamcrest/hamcrest-php\": \"^2.0\",\n \"jangregor/phpstan-prophecy\": \"^2.1\",\n \"mockery/mockery\": \"^1.6\",\n \"php-parallel-lint/php-console-highlighter\": \"^1.0\",\n \"php-parallel-lint/php-parallel-lint\": \"^1.4\",\n \"phpspec/prophecy-phpunit\": \"^2.3\",\n \"phpstan/extension-installer\": \"^1.4\",\n \"phpstan/phpstan\": \"^2.1\",\n \"phpstan/phpstan-mockery\": \"^2.0\",\n \"phpstan/phpstan-phpunit\": \"^2.0\",\n \"phpunit/phpunit\": \"^10.5\",\n \"ramsey/coding-standard\": \"^2.3\",\n \"ramsey/conventional-commits\": \"^1.6\",\n \"roave/security-advisories\": \"dev-latest\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"captainhook\": {\n \"force-install\": true\n },\n \"ramsey/conventional-commits\": {\n \"configFile\": \"conventional-commits.json\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Ramsey\\\\Collection\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Ben Ramsey\",\n \"email\": \"ben@benramsey.com\",\n \"homepage\": \"https://benramsey.com\"\n }\n ],\n \"description\": \"A PHP library for representing and manipulating collections.\",\n \"keywords\": [\n \"array\",\n \"collection\",\n \"hash\",\n \"map\",\n \"queue\",\n \"set\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/ramsey/collection/issues\",\n \"source\": \"https://github.com/ramsey/collection/tree/2.1.1\"\n },\n \"time\": \"2025-03-22T05:38:12+00:00\"\n },\n {\n \"name\": \"ramsey/uuid\",\n \"version\": \"4.9.2\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/ramsey/uuid.git\",\n \"reference\": \"8429c78ca35a09f27565311b98101e2826affde0\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/ramsey/uuid/zipball/8429c78ca35a09f27565311b98101e2826affde0\",\n \"reference\": \"8429c78ca35a09f27565311b98101e2826affde0\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"brick/math\": \"^0.8.16 || ^0.9 || ^0.10 || ^0.11 || ^0.12 || ^0.13 || ^0.14\",\n \"php\": \"^8.0\",\n \"ramsey/collection\": \"^1.2 || ^2.0\"\n },\n \"replace\": {\n \"rhumsaa/uuid\": \"self.version\"\n },\n \"require-dev\": {\n \"captainhook/captainhook\": \"^5.25\",\n \"captainhook/plugin-composer\": \"^5.3\",\n \"dealerdirect/phpcodesniffer-composer-installer\": \"^1.0\",\n \"ergebnis/composer-normalize\": \"^2.47\",\n \"mockery/mockery\": \"^1.6\",\n \"paragonie/random-lib\": \"^2\",\n \"php-mock/php-mock\": \"^2.6\",\n \"php-mock/php-mock-mockery\": \"^1.5\",\n \"php-parallel-lint/php-parallel-lint\": \"^1.4.0\",\n \"phpbench/phpbench\": \"^1.2.14\",\n \"phpstan/extension-installer\": \"^1.4\",\n \"phpstan/phpstan\": \"^2.1\",\n \"phpstan/phpstan-mockery\": \"^2.0\",\n \"phpstan/phpstan-phpunit\": \"^2.0\",\n \"phpunit/phpunit\": \"^9.6\",\n \"slevomat/coding-standard\": \"^8.18\",\n \"squizlabs/php_codesniffer\": \"^3.13\"\n },\n \"suggest\": {\n \"ext-bcmath\": \"Enables faster math with arbitrary-precision integers using BCMath.\",\n \"ext-gmp\": \"Enables faster math with arbitrary-precision integers using GMP.\",\n \"ext-uuid\": \"Enables the use of PeclUuidTimeGenerator and PeclUuidRandomGenerator.\",\n \"paragonie/random-lib\": \"Provides RandomLib for use with the RandomLibAdapter\",\n \"ramsey/uuid-doctrine\": \"Allows the use of Ramsey\\\\Uuid\\\\Uuid as Doctrine field type.\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"captainhook\": {\n \"force-install\": true\n }\n },\n \"autoload\": {\n \"files\": [\n \"src/functions.php\"\n ],\n \"psr-4\": {\n \"Ramsey\\\\Uuid\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"description\": \"A PHP library for generating and working with universally unique identifiers (UUIDs).\",\n \"keywords\": [\n \"guid\",\n \"identifier\",\n \"uuid\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/ramsey/uuid/issues\",\n \"source\": \"https://github.com/ramsey/uuid/tree/4.9.2\"\n },\n \"time\": \"2025-12-14T04:43:48+00:00\"\n },\n {\n \"name\": \"ratchet/pawl\",\n \"version\": \"v0.4.3\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/ratchetphp/Pawl.git\",\n \"reference\": \"2c582373c78271de32cb04c755c4c0db7e09c9c0\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/ratchetphp/Pawl/zipball/2c582373c78271de32cb04c755c4c0db7e09c9c0\",\n \"reference\": \"2c582373c78271de32cb04c755c4c0db7e09c9c0\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"evenement/evenement\": \"^3.0 || ^2.0\",\n \"guzzlehttp/psr7\": \"^2.0\",\n \"php\": \">=7.4\",\n \"ratchet/rfc6455\": \"^0.3.1 || ^0.4.0\",\n \"react/socket\": \"^1.9\"\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \"^9.3 || ^5.7 || ^4.8\"\n },\n \"suggest\": {\n \"reactivex/rxphp\": \"~2.0\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"files\": [\n \"src/functions_include.php\"\n ],\n \"psr-4\": {\n \"Ratchet\\\\Client\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"description\": \"Asynchronous WebSocket client\",\n \"keywords\": [\n \"Ratchet\",\n \"async\",\n \"client\",\n \"websocket\",\n \"websocket client\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/ratchetphp/Pawl/issues\",\n \"source\": \"https://github.com/ratchetphp/Pawl/tree/v0.4.3\"\n },\n \"time\": \"2025-03-19T16:47:38+00:00\"\n },\n {\n \"name\": \"ratchet/rfc6455\",\n \"version\": \"v0.4.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/ratchetphp/RFC6455.git\",\n \"reference\": \"859d95f85dda0912c6d5b936d036d044e3af47ef\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/ratchetphp/RFC6455/zipball/859d95f85dda0912c6d5b936d036d044e3af47ef\",\n \"reference\": \"859d95f85dda0912c6d5b936d036d044e3af47ef\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=7.4\",\n \"psr/http-factory-implementation\": \"^1.0\",\n \"symfony/polyfill-php80\": \"^1.15\"\n },\n \"require-dev\": {\n \"guzzlehttp/psr7\": \"^2.7\",\n \"phpunit/phpunit\": \"^9.5\",\n \"react/socket\": \"^1.3\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Ratchet\\\\RFC6455\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Chris Boden\",\n \"email\": \"cboden@gmail.com\",\n \"role\": \"Developer\"\n },\n {\n \"name\": \"Matt Bonneau\",\n \"role\": \"Developer\"\n }\n ],\n \"description\": \"RFC6455 WebSocket protocol handler\",\n \"homepage\": \"http://socketo.me\",\n \"keywords\": [\n \"WebSockets\",\n \"rfc6455\",\n \"websocket\"\n ],\n \"support\": {\n \"chat\": \"https://gitter.im/reactphp/reactphp\",\n \"issues\": \"https://github.com/ratchetphp/RFC6455/issues\",\n \"source\": \"https://github.com/ratchetphp/RFC6455/tree/v0.4.0\"\n },\n \"time\": \"2025-02-24T01:18:22+00:00\"\n },\n {\n \"name\": \"react/cache\",\n \"version\": \"v1.2.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/reactphp/cache.git\",\n \"reference\": \"d47c472b64aa5608225f47965a484b75c7817d5b\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/reactphp/cache/zipball/d47c472b64aa5608225f47965a484b75c7817d5b\",\n \"reference\": \"d47c472b64aa5608225f47965a484b75c7817d5b\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=5.3.0\",\n \"react/promise\": \"^3.0 || ^2.0 || ^1.1\"\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \"^9.5 || ^5.7 || ^4.8.35\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"React\\\\Cache\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Christian Lück\",\n \"email\": \"christian@clue.engineering\",\n \"homepage\": \"https://clue.engineering/\"\n },\n {\n \"name\": \"Cees-Jan Kiewiet\",\n \"email\": \"reactphp@ceesjankiewiet.nl\",\n \"homepage\": \"https://wyrihaximus.net/\"\n },\n {\n \"name\": \"Jan Sorgalla\",\n \"email\": \"jsorgalla@gmail.com\",\n \"homepage\": \"https://sorgalla.com/\"\n },\n {\n \"name\": \"Chris Boden\",\n \"email\": \"cboden@gmail.com\",\n \"homepage\": \"https://cboden.dev/\"\n }\n ],\n \"description\": \"Async, Promise-based cache interface for ReactPHP\",\n \"keywords\": [\n \"cache\",\n \"caching\",\n \"promise\",\n \"reactphp\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/reactphp/cache/issues\",\n \"source\": \"https://github.com/reactphp/cache/tree/v1.2.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://opencollective.com/reactphp\",\n \"type\": \"open_collective\"\n }\n ],\n \"time\": \"2022-11-30T15:59:55+00:00\"\n },\n {\n \"name\": \"react/dns\",\n \"version\": \"v1.13.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/reactphp/dns.git\",\n \"reference\": \"eb8ae001b5a455665c89c1df97f6fb682f8fb0f5\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/reactphp/dns/zipball/eb8ae001b5a455665c89c1df97f6fb682f8fb0f5\",\n \"reference\": \"eb8ae001b5a455665c89c1df97f6fb682f8fb0f5\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=5.3.0\",\n \"react/cache\": \"^1.0 || ^0.6 || ^0.5\",\n \"react/event-loop\": \"^1.2\",\n \"react/promise\": \"^3.2 || ^2.7 || ^1.2.1\"\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \"^9.6 || ^5.7 || ^4.8.36\",\n \"react/async\": \"^4.3 || ^3 || ^2\",\n \"react/promise-timer\": \"^1.11\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"React\\\\Dns\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Christian Lück\",\n \"email\": \"christian@clue.engineering\",\n \"homepage\": \"https://clue.engineering/\"\n },\n {\n \"name\": \"Cees-Jan Kiewiet\",\n \"email\": \"reactphp@ceesjankiewiet.nl\",\n \"homepage\": \"https://wyrihaximus.net/\"\n },\n {\n \"name\": \"Jan Sorgalla\",\n \"email\": \"jsorgalla@gmail.com\",\n \"homepage\": \"https://sorgalla.com/\"\n },\n {\n \"name\": \"Chris Boden\",\n \"email\": \"cboden@gmail.com\",\n \"homepage\": \"https://cboden.dev/\"\n }\n ],\n \"description\": \"Async DNS resolver for ReactPHP\",\n \"keywords\": [\n \"async\",\n \"dns\",\n \"dns-resolver\",\n \"reactphp\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/reactphp/dns/issues\",\n \"source\": \"https://github.com/reactphp/dns/tree/v1.13.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://opencollective.com/reactphp\",\n \"type\": \"open_collective\"\n }\n ],\n \"time\": \"2024-06-13T14:18:03+00:00\"\n },\n {\n \"name\": \"react/event-loop\",\n \"version\": \"v1.5.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/reactphp/event-loop.git\",\n \"reference\": \"bbe0bd8c51ffc05ee43f1729087ed3bdf7d53354\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/reactphp/event-loop/zipball/bbe0bd8c51ffc05ee43f1729087ed3bdf7d53354\",\n \"reference\": \"bbe0bd8c51ffc05ee43f1729087ed3bdf7d53354\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=5.3.0\"\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \"^9.6 || ^5.7 || ^4.8.36\"\n },\n \"suggest\": {\n \"ext-pcntl\": \"For signal handling support when using the StreamSelectLoop\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"React\\\\EventLoop\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Christian Lück\",\n \"email\": \"christian@clue.engineering\",\n \"homepage\": \"https://clue.engineering/\"\n },\n {\n \"name\": \"Cees-Jan Kiewiet\",\n \"email\": \"reactphp@ceesjankiewiet.nl\",\n \"homepage\": \"https://wyrihaximus.net/\"\n },\n {\n \"name\": \"Jan Sorgalla\",\n \"email\": \"jsorgalla@gmail.com\",\n \"homepage\": \"https://sorgalla.com/\"\n },\n {\n \"name\": \"Chris Boden\",\n \"email\": \"cboden@gmail.com\",\n \"homepage\": \"https://cboden.dev/\"\n }\n ],\n \"description\": \"ReactPHP's core reactor event loop that libraries can use for evented I/O.\",\n \"keywords\": [\n \"asynchronous\",\n \"event-loop\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/reactphp/event-loop/issues\",\n \"source\": \"https://github.com/reactphp/event-loop/tree/v1.5.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://opencollective.com/reactphp\",\n \"type\": \"open_collective\"\n }\n ],\n \"time\": \"2023-11-13T13:48:05+00:00\"\n },\n {\n \"name\": \"react/promise\",\n \"version\": \"v3.3.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/reactphp/promise.git\",\n \"reference\": \"23444f53a813a3296c1368bb104793ce8d88f04a\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/reactphp/promise/zipball/23444f53a813a3296c1368bb104793ce8d88f04a\",\n \"reference\": \"23444f53a813a3296c1368bb104793ce8d88f04a\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=7.1.0\"\n },\n \"require-dev\": {\n \"phpstan/phpstan\": \"1.12.28 || 1.4.10\",\n \"phpunit/phpunit\": \"^9.6 || ^7.5\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"files\": [\n \"src/functions_include.php\"\n ],\n \"psr-4\": {\n \"React\\\\Promise\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Jan Sorgalla\",\n \"email\": \"jsorgalla@gmail.com\",\n \"homepage\": \"https://sorgalla.com/\"\n },\n {\n \"name\": \"Christian Lück\",\n \"email\": \"christian@clue.engineering\",\n \"homepage\": \"https://clue.engineering/\"\n },\n {\n \"name\": \"Cees-Jan Kiewiet\",\n \"email\": \"reactphp@ceesjankiewiet.nl\",\n \"homepage\": \"https://wyrihaximus.net/\"\n },\n {\n \"name\": \"Chris Boden\",\n \"email\": \"cboden@gmail.com\",\n \"homepage\": \"https://cboden.dev/\"\n }\n ],\n \"description\": \"A lightweight implementation of CommonJS Promises/A for PHP\",\n \"keywords\": [\n \"promise\",\n \"promises\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/reactphp/promise/issues\",\n \"source\": \"https://github.com/reactphp/promise/tree/v3.3.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://opencollective.com/reactphp\",\n \"type\": \"open_collective\"\n }\n ],\n \"time\": \"2025-08-19T18:57:03+00:00\"\n },\n {\n \"name\": \"react/socket\",\n \"version\": \"v1.16.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/reactphp/socket.git\",\n \"reference\": \"23e4ff33ea3e160d2d1f59a0e6050e4b0fb0eac1\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/reactphp/socket/zipball/23e4ff33ea3e160d2d1f59a0e6050e4b0fb0eac1\",\n \"reference\": \"23e4ff33ea3e160d2d1f59a0e6050e4b0fb0eac1\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"evenement/evenement\": \"^3.0 || ^2.0 || ^1.0\",\n \"php\": \">=5.3.0\",\n \"react/dns\": \"^1.13\",\n \"react/event-loop\": \"^1.2\",\n \"react/promise\": \"^3.2 || ^2.6 || ^1.2.1\",\n \"react/stream\": \"^1.4\"\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \"^9.6 || ^5.7 || ^4.8.36\",\n \"react/async\": \"^4.3 || ^3.3 || ^2\",\n \"react/promise-stream\": \"^1.4\",\n \"react/promise-timer\": \"^1.11\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"React\\\\Socket\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Christian Lück\",\n \"email\": \"christian@clue.engineering\",\n \"homepage\": \"https://clue.engineering/\"\n },\n {\n \"name\": \"Cees-Jan Kiewiet\",\n \"email\": \"reactphp@ceesjankiewiet.nl\",\n \"homepage\": \"https://wyrihaximus.net/\"\n },\n {\n \"name\": \"Jan Sorgalla\",\n \"email\": \"jsorgalla@gmail.com\",\n \"homepage\": \"https://sorgalla.com/\"\n },\n {\n \"name\": \"Chris Boden\",\n \"email\": \"cboden@gmail.com\",\n \"homepage\": \"https://cboden.dev/\"\n }\n ],\n \"description\": \"Async, streaming plaintext TCP/IP and secure TLS socket server and client connections for ReactPHP\",\n \"keywords\": [\n \"Connection\",\n \"Socket\",\n \"async\",\n \"reactphp\",\n \"stream\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/reactphp/socket/issues\",\n \"source\": \"https://github.com/reactphp/socket/tree/v1.16.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://opencollective.com/reactphp\",\n \"type\": \"open_collective\"\n }\n ],\n \"time\": \"2024-07-26T10:38:09+00:00\"\n },\n {\n \"name\": \"react/stream\",\n \"version\": \"v1.4.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/reactphp/stream.git\",\n \"reference\": \"1e5b0acb8fe55143b5b426817155190eb6f5b18d\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/reactphp/stream/zipball/1e5b0acb8fe55143b5b426817155190eb6f5b18d\",\n \"reference\": \"1e5b0acb8fe55143b5b426817155190eb6f5b18d\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"evenement/evenement\": \"^3.0 || ^2.0 || ^1.0\",\n \"php\": \">=5.3.8\",\n \"react/event-loop\": \"^1.2\"\n },\n \"require-dev\": {\n \"clue/stream-filter\": \"~1.2\",\n \"phpunit/phpunit\": \"^9.6 || ^5.7 || ^4.8.36\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"React\\\\Stream\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Christian Lück\",\n \"email\": \"christian@clue.engineering\",\n \"homepage\": \"https://clue.engineering/\"\n },\n {\n \"name\": \"Cees-Jan Kiewiet\",\n \"email\": \"reactphp@ceesjankiewiet.nl\",\n \"homepage\": \"https://wyrihaximus.net/\"\n },\n {\n \"name\": \"Jan Sorgalla\",\n \"email\": \"jsorgalla@gmail.com\",\n \"homepage\": \"https://sorgalla.com/\"\n },\n {\n \"name\": \"Chris Boden\",\n \"email\": \"cboden@gmail.com\",\n \"homepage\": \"https://cboden.dev/\"\n }\n ],\n \"description\": \"Event-driven readable and writable streams for non-blocking I/O in ReactPHP\",\n \"keywords\": [\n \"event-driven\",\n \"io\",\n \"non-blocking\",\n \"pipe\",\n \"reactphp\",\n \"readable\",\n \"stream\",\n \"writable\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/reactphp/stream/issues\",\n \"source\": \"https://github.com/reactphp/stream/tree/v1.4.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://opencollective.com/reactphp\",\n \"type\": \"open_collective\"\n }\n ],\n \"time\": \"2024-06-11T12:45:25+00:00\"\n },\n {\n \"name\": \"ringcentral/ringcentral-php\",\n \"version\": \"3.0.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/ringcentral/ringcentral-php.git\",\n \"reference\": \"3e47c19ef8d4f995f085fbc31927ce7704826ebb\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/ringcentral/ringcentral-php/zipball/3e47c19ef8d4f995f085fbc31927ce7704826ebb\",\n \"reference\": \"3e47c19ef8d4f995f085fbc31927ce7704826ebb\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"ext-curl\": \"*\",\n \"ext-json\": \"*\",\n \"guzzlehttp/guzzle\": \"^6.3.3|^7.4.1\",\n \"guzzlehttp/psr7\": \"^2.1.0\",\n \"php\": \">=7.2\",\n \"pubnub/pubnub\": \"^4.7.0|^6.0\",\n \"ratchet/pawl\": \"^0.4.1\",\n \"symfony/event-dispatcher\": \"^2|^3|^4|^5|^6\"\n },\n \"require-dev\": {\n \"macfja/phar-builder\": \"^0.2.8\",\n \"php-coveralls/php-coveralls\": \"^2.1\",\n \"phpunit/phpunit\": \"^7.5.12|^8.0|^9.0\",\n \"react/async\": \"^3.0\"\n },\n \"suggest\": {\n \"ext-openssl\": \"to decrypt PubNub messages\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"phar-builder\": {\n \"name\": \"ringcentral.phar\",\n \"include\": [],\n \"excluded\": [\n \"vendor/bin\"\n ],\n \"output-dir\": \"./dist\",\n \"compression\": \"gzip\",\n \"entry-point\": \"./vendor/autoload.php\",\n \"include-dev\": false,\n \"skip-shebang\": true\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"RingCentral\\\\SDK\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Kirill Konshin\",\n \"email\": \"kirill.konshin@ringcentral.com\"\n },\n {\n \"name\": \"Byrne Reese\",\n \"email\": \"byrne.reese@ringcentral.com\"\n }\n ],\n \"description\": \"RingCentral Platform PHP SDK\",\n \"homepage\": \"http://developers.ringcentral.com\",\n \"keywords\": [\n \"api\",\n \"connect\",\n \"php\",\n \"platform\",\n \"ringcentral\",\n \"sdk\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/ringcentral/ringcentral-php/issues\",\n \"source\": \"https://github.com/ringcentral/ringcentral-php/tree/3.0.0\"\n },\n \"time\": \"2023-05-31T09:14:02+00:00\"\n },\n {\n \"name\": \"rmccue/requests\",\n \"version\": \"v2.0.15\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/WordPress/Requests.git\",\n \"reference\": \"877cd66169755899682f1595e057334b40d9d149\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/WordPress/Requests/zipball/877cd66169755899682f1595e057334b40d9d149\",\n \"reference\": \"877cd66169755899682f1595e057334b40d9d149\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"ext-json\": \"*\",\n \"php\": \">=5.6\"\n },\n \"require-dev\": {\n \"dealerdirect/phpcodesniffer-composer-installer\": \"^0.7\",\n \"php-parallel-lint/php-console-highlighter\": \"^0.5.0\",\n \"php-parallel-lint/php-parallel-lint\": \"^1.3.1\",\n \"phpcompatibility/php-compatibility\": \"^9.0\",\n \"requests/test-server\": \"dev-main\",\n \"roave/security-advisories\": \"dev-latest\",\n \"squizlabs/php_codesniffer\": \"^3.6\",\n \"wp-coding-standards/wpcs\": \"^2.0\",\n \"yoast/phpunit-polyfills\": \"^1.0.0\"\n },\n \"suggest\": {\n \"art4/requests-psr18-adapter\": \"For using Requests as a PSR-18 HTTP Client\",\n \"ext-curl\": \"For improved performance\",\n \"ext-openssl\": \"For secure transport support\",\n \"ext-zlib\": \"For improved performance when decompressing encoded streams\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"files\": [\n \"library/Deprecated.php\"\n ],\n \"psr-4\": {\n \"WpOrg\\\\Requests\\\\\": \"src/\"\n },\n \"classmap\": [\n \"library/Requests.php\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"ISC\"\n ],\n \"authors\": [\n {\n \"name\": \"Ryan McCue\",\n \"homepage\": \"https://rmccue.io/\"\n },\n {\n \"name\": \"Alain Schlesser\",\n \"homepage\": \"https://github.com/schlessera\"\n },\n {\n \"name\": \"Juliette Reinders Folmer\",\n \"homepage\": \"https://github.com/jrfnl\"\n },\n {\n \"name\": \"Contributors\",\n \"homepage\": \"https://github.com/WordPress/Requests/graphs/contributors\"\n }\n ],\n \"description\": \"A HTTP library written in PHP, for human beings.\",\n \"homepage\": \"https://requests.ryanmccue.info/\",\n \"keywords\": [\n \"curl\",\n \"fsockopen\",\n \"http\",\n \"idna\",\n \"ipv6\",\n \"iri\",\n \"sockets\"\n ],\n \"support\": {\n \"docs\": \"https://requests.ryanmccue.info/\",\n \"issues\": \"https://github.com/WordPress/Requests/issues\",\n \"source\": \"https://github.com/WordPress/Requests\"\n },\n \"time\": \"2025-01-21T10:13:31+00:00\"\n },\n {\n \"name\": \"robrichards/xmlseclibs\",\n \"version\": \"3.1.5\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/robrichards/xmlseclibs.git\",\n \"reference\": \"03062be78178cbb5e8f605cd255dc32a14981f92\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/robrichards/xmlseclibs/zipball/03062be78178cbb5e8f605cd255dc32a14981f92\",\n \"reference\": \"03062be78178cbb5e8f605cd255dc32a14981f92\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"ext-openssl\": \"*\",\n \"php\": \">= 5.4\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"RobRichards\\\\XMLSecLibs\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"BSD-3-Clause\"\n ],\n \"description\": \"A PHP library for XML Security\",\n \"homepage\": \"https://github.com/robrichards/xmlseclibs\",\n \"keywords\": [\n \"security\",\n \"signature\",\n \"xml\",\n \"xmldsig\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/robrichards/xmlseclibs/issues\",\n \"source\": \"https://github.com/robrichards/xmlseclibs/tree/3.1.5\"\n },\n \"time\": \"2026-03-13T10:31:56+00:00\"\n },\n {\n \"name\": \"ruflin/elastica\",\n \"version\": \"7.3.2\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/ruflin/Elastica.git\",\n \"reference\": \"84ba137678707a1aa4242d12bad891dc38fa2608\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/ruflin/Elastica/zipball/84ba137678707a1aa4242d12bad891dc38fa2608\",\n \"reference\": \"84ba137678707a1aa4242d12bad891dc38fa2608\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"elasticsearch/elasticsearch\": \"^7.10\",\n \"ext-json\": \"*\",\n \"nyholm/dsn\": \"^2.0.0\",\n \"php\": \"^7.2 || ^8.0\",\n \"psr/log\": \"^1.0 || ^2.0 || ^3.0\",\n \"symfony/deprecation-contracts\": \"^2.2 || ^3.0\",\n \"symfony/polyfill-php73\": \"^1.19\"\n },\n \"require-dev\": {\n \"aws/aws-sdk-php\": \"^3.155\",\n \"guzzlehttp/guzzle\": \"^6.3 || ^7.2\",\n \"phpstan/phpstan\": \"^1.5\",\n \"phpstan/phpstan-phpunit\": \"^1.1\",\n \"phpunit/phpunit\": \"^8.5.8 || ^9.4\",\n \"symfony/phpunit-bridge\": \"^6.0\"\n },\n \"suggest\": {\n \"aws/aws-sdk-php\": \"Allow using IAM authentication with Amazon ElasticSearch Service\",\n \"guzzlehttp/guzzle\": \"Allow using guzzle as transport\",\n \"monolog/monolog\": \"Logging request\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"7.0.x-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Elastica\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Nicolas Ruflin\",\n \"homepage\": \"http://ruflin.com/\"\n }\n ],\n \"description\": \"Elasticsearch Client\",\n \"homepage\": \"http://elastica.io/\",\n \"keywords\": [\n \"client\",\n \"search\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/ruflin/Elastica/issues\",\n \"source\": \"https://github.com/ruflin/Elastica/tree/7.3.2\"\n },\n \"time\": \"2024-03-11T14:11:50+00:00\"\n },\n {\n \"name\": \"santigarcor/laratrust\",\n \"version\": \"8.5.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/santigarcor/laratrust.git\",\n \"reference\": \"33229272952f2cb61593b67a68aff43c99a0e4f0\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/santigarcor/laratrust/zipball/33229272952f2cb61593b67a68aff43c99a0e4f0\",\n \"reference\": \"33229272952f2cb61593b67a68aff43c99a0e4f0\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"kkszymanowski/traitor\": \"^1.0\",\n \"laravel/framework\": \"^10.0|^11.0|^12.0\",\n \"php\": \">=8.1\"\n },\n \"require-dev\": {\n \"mockery/mockery\": \"^1.3.2\",\n \"orchestra/testbench\": \"^8.0|^9.0|^10.0\",\n \"phpunit/phpunit\": \"^8.4|^9.0|^10.5|^11.5.3\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"laravel\": {\n \"aliases\": {\n \"Laratrust\": \"Laratrust\\\\LaratrustFacade\"\n },\n \"providers\": [\n \"Laratrust\\\\LaratrustServiceProvider\"\n ]\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Laratrust\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Santiago Garcia\",\n \"homepage\": \"http://santigarcor.me\"\n }\n ],\n \"description\": \"This package provides a flexible way to add Role-based Permissions to Laravel\",\n \"keywords\": [\n \"Teams\",\n \"acl\",\n \"authorization\",\n \"laratrust\",\n \"laravel\",\n \"multiusers\",\n \"permissions\",\n \"php\",\n \"rbac\",\n \"roles\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/santigarcor/laratrust/issues\",\n \"source\": \"https://github.com/santigarcor/laratrust/tree/8.5.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/santigarcor\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2025-06-02T14:29:05+00:00\"\n },\n {\n \"name\": \"sentry/sentry\",\n \"version\": \"4.13.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/getsentry/sentry-php.git\",\n \"reference\": \"b54a0eaedfc27fc2da587e64455a66cd29cd3c4d\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/getsentry/sentry-php/zipball/b54a0eaedfc27fc2da587e64455a66cd29cd3c4d\",\n \"reference\": \"b54a0eaedfc27fc2da587e64455a66cd29cd3c4d\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"ext-curl\": \"*\",\n \"ext-json\": \"*\",\n \"ext-mbstring\": \"*\",\n \"guzzlehttp/psr7\": \"^1.8.4|^2.1.1\",\n \"jean85/pretty-package-versions\": \"^1.5|^2.0.4\",\n \"php\": \"^7.2|^8.0\",\n \"psr/log\": \"^1.0|^2.0|^3.0\",\n \"symfony/options-resolver\": \"^4.4.30|^5.0.11|^6.0|^7.0\"\n },\n \"conflict\": {\n \"raven/raven\": \"*\"\n },\n \"require-dev\": {\n \"friendsofphp/php-cs-fixer\": \"^3.4\",\n \"guzzlehttp/promises\": \"^2.0.3\",\n \"guzzlehttp/psr7\": \"^1.8.4|^2.1.1\",\n \"monolog/monolog\": \"^1.6|^2.0|^3.0\",\n \"phpbench/phpbench\": \"^1.0\",\n \"phpstan/phpstan\": \"^1.3\",\n \"phpunit/phpunit\": \"^8.5|^9.6\",\n \"symfony/phpunit-bridge\": \"^5.2|^6.0|^7.0\",\n \"vimeo/psalm\": \"^4.17\"\n },\n \"suggest\": {\n \"monolog/monolog\": \"Allow sending log messages to Sentry by using the included Monolog handler.\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"files\": [\n \"src/functions.php\"\n ],\n \"psr-4\": {\n \"Sentry\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Sentry\",\n \"email\": \"accounts@sentry.io\"\n }\n ],\n \"description\": \"PHP SDK for Sentry (http://sentry.io)\",\n \"homepage\": \"http://sentry.io\",\n \"keywords\": [\n \"crash-reporting\",\n \"crash-reports\",\n \"error-handler\",\n \"error-monitoring\",\n \"log\",\n \"logging\",\n \"profiling\",\n \"sentry\",\n \"tracing\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/getsentry/sentry-php/issues\",\n \"source\": \"https://github.com/getsentry/sentry-php/tree/4.13.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://sentry.io/\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://sentry.io/pricing/\",\n \"type\": \"custom\"\n }\n ],\n \"time\": \"2025-06-10T15:39:27+00:00\"\n },\n {\n \"name\": \"sentry/sentry-laravel\",\n \"version\": \"4.13.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/getsentry/sentry-laravel.git\",\n \"reference\": \"d232ac494258e0d50a77c575a5af5f1a426d3f87\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/getsentry/sentry-laravel/zipball/d232ac494258e0d50a77c575a5af5f1a426d3f87\",\n \"reference\": \"d232ac494258e0d50a77c575a5af5f1a426d3f87\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"illuminate/support\": \"^6.0 | ^7.0 | ^8.0 | ^9.0 | ^10.0 | ^11.0 | ^12.0\",\n \"nyholm/psr7\": \"^1.0\",\n \"php\": \"^7.2 | ^8.0\",\n \"sentry/sentry\": \"^4.10\",\n \"symfony/psr-http-message-bridge\": \"^1.0 | ^2.0 | ^6.0 | ^7.0\"\n },\n \"require-dev\": {\n \"friendsofphp/php-cs-fixer\": \"^3.11\",\n \"guzzlehttp/guzzle\": \"^7.2\",\n \"laravel/folio\": \"^1.1\",\n \"laravel/framework\": \"^6.0 | ^7.0 | ^8.0 | ^9.0 | ^10.0 | ^11.0 | ^12.0\",\n \"livewire/livewire\": \"^2.0 | ^3.0\",\n \"mockery/mockery\": \"^1.3\",\n \"orchestra/testbench\": \"^4.7 | ^5.1 | ^6.0 | ^7.0 | ^8.0 | ^9.0 | ^10.0\",\n \"phpstan/phpstan\": \"^1.10\",\n \"phpunit/phpunit\": \"^8.4 | ^9.3 | ^10.4 | ^11.5\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"laravel\": {\n \"aliases\": {\n \"Sentry\": \"Sentry\\\\Laravel\\\\Facade\"\n },\n \"providers\": [\n \"Sentry\\\\Laravel\\\\ServiceProvider\",\n \"Sentry\\\\Laravel\\\\Tracing\\\\ServiceProvider\"\n ]\n }\n },\n \"autoload\": {\n \"psr-0\": {\n \"Sentry\\\\Laravel\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Sentry\",\n \"email\": \"accounts@sentry.io\"\n }\n ],\n \"description\": \"Laravel SDK for Sentry (https://sentry.io)\",\n \"homepage\": \"https://sentry.io\",\n \"keywords\": [\n \"crash-reporting\",\n \"crash-reports\",\n \"error-handler\",\n \"error-monitoring\",\n \"laravel\",\n \"log\",\n \"logging\",\n \"profiling\",\n \"sentry\",\n \"tracing\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/getsentry/sentry-laravel/issues\",\n \"source\": \"https://github.com/getsentry/sentry-laravel/tree/4.13.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://sentry.io/\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://sentry.io/pricing/\",\n \"type\": \"custom\"\n }\n ],\n \"time\": \"2025-02-18T10:09:29+00:00\"\n },\n {\n \"name\": \"shiftonelabs/laravel-sqs-fifo-queue\",\n \"version\": \"3.0.3\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/shiftonelabs/laravel-sqs-fifo-queue.git\",\n \"reference\": \"ef10d55db6a93243b8ea3789590f46a0567e44f6\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/shiftonelabs/laravel-sqs-fifo-queue/zipball/ef10d55db6a93243b8ea3789590f46a0567e44f6\",\n \"reference\": \"ef10d55db6a93243b8ea3789590f46a0567e44f6\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"aws/aws-sdk-php\": \"~3.0\",\n \"illuminate/queue\": \">=9.0\",\n \"illuminate/support\": \">=9.0\",\n \"php\": \">=8.0.2\",\n \"ramsey/uuid\": \">=4.2.2\"\n },\n \"require-dev\": {\n \"illuminate/mail\": \">=9.0\",\n \"illuminate/notifications\": \">=9.0\",\n \"mockery/mockery\": \"~1.3\",\n \"phpunit/phpunit\": \"~9.3 || ~10.0\",\n \"shiftonelabs/codesniffer-standard\": \"0.*\",\n \"squizlabs/php_codesniffer\": \"3.*\",\n \"vlucas/phpdotenv\": \"~5.4\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"laravel\": {\n \"providers\": [\n \"ShiftOneLabs\\\\LaravelSqsFifoQueue\\\\LaravelSqsFifoQueueServiceProvider\"\n ]\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"ShiftOneLabs\\\\LaravelSqsFifoQueue\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Patrick Carlo-Hickman\",\n \"email\": \"patrick@shiftonelabs.com\"\n }\n ],\n \"description\": \"Adds a Laravel queue driver for Amazon SQS FIFO queues.\",\n \"homepage\": \"https://github.com/shiftonelabs/laravel-sqs-fifo-queue\",\n \"keywords\": [\n \"aws\",\n \"fifo\",\n \"illuminate\",\n \"laravel\",\n \"lumen\",\n \"queue\",\n \"sqs\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/shiftonelabs/laravel-sqs-fifo-queue/issues\",\n \"source\": \"https://github.com/shiftonelabs/laravel-sqs-fifo-queue\"\n },\n \"time\": \"2024-09-21T22:48:23+00:00\"\n },\n {\n \"name\": \"spatie/backtrace\",\n \"version\": \"1.8.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/spatie/backtrace.git\",\n \"reference\": \"8c0f16a59ae35ec8c62d85c3c17585158f430110\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/spatie/backtrace/zipball/8c0f16a59ae35ec8c62d85c3c17585158f430110\",\n \"reference\": \"8c0f16a59ae35ec8c62d85c3c17585158f430110\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \"^7.3 || ^8.0\"\n },\n \"require-dev\": {\n \"ext-json\": \"*\",\n \"laravel/serializable-closure\": \"^1.3 || ^2.0\",\n \"phpunit/phpunit\": \"^9.3 || ^11.4.3\",\n \"spatie/phpunit-snapshot-assertions\": \"^4.2 || ^5.1.6\",\n \"symfony/var-dumper\": \"^5.1 || ^6.0 || ^7.0\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Spatie\\\\Backtrace\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Freek Van de Herten\",\n \"email\": \"freek@spatie.be\",\n \"homepage\": \"https://spatie.be\",\n \"role\": \"Developer\"\n }\n ],\n \"description\": \"A better backtrace\",\n \"homepage\": \"https://github.com/spatie/backtrace\",\n \"keywords\": [\n \"Backtrace\",\n \"spatie\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/spatie/backtrace/issues\",\n \"source\": \"https://github.com/spatie/backtrace/tree/1.8.1\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/sponsors/spatie\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://spatie.be/open-source/support-us\",\n \"type\": \"other\"\n }\n ],\n \"time\": \"2025-08-26T08:22:30+00:00\"\n },\n {\n \"name\": \"spatie/error-solutions\",\n \"version\": \"1.1.3\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/spatie/error-solutions.git\",\n \"reference\": \"e495d7178ca524f2dd0fe6a1d99a1e608e1c9936\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/spatie/error-solutions/zipball/e495d7178ca524f2dd0fe6a1d99a1e608e1c9936\",\n \"reference\": \"e495d7178ca524f2dd0fe6a1d99a1e608e1c9936\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \"^8.0\"\n },\n \"require-dev\": {\n \"illuminate/broadcasting\": \"^10.0|^11.0|^12.0\",\n \"illuminate/cache\": \"^10.0|^11.0|^12.0\",\n \"illuminate/support\": \"^10.0|^11.0|^12.0\",\n \"livewire/livewire\": \"^2.11|^3.5.20\",\n \"openai-php/client\": \"^0.10.1\",\n \"orchestra/testbench\": \"8.22.3|^9.0|^10.0\",\n \"pestphp/pest\": \"^2.20|^3.0\",\n \"phpstan/phpstan\": \"^2.1\",\n \"psr/simple-cache\": \"^3.0\",\n \"psr/simple-cache-implementation\": \"^3.0\",\n \"spatie/ray\": \"^1.28\",\n \"symfony/cache\": \"^5.4|^6.0|^7.0\",\n \"symfony/process\": \"^5.4|^6.0|^7.0\",\n \"vlucas/phpdotenv\": \"^5.5\"\n },\n \"suggest\": {\n \"openai-php/client\": \"Require get solutions from OpenAI\",\n \"simple-cache-implementation\": \"To cache solutions from OpenAI\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Spatie\\\\Ignition\\\\\": \"legacy/ignition\",\n \"Spatie\\\\ErrorSolutions\\\\\": \"src\",\n \"Spatie\\\\LaravelIgnition\\\\\": \"legacy/laravel-ignition\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Ruben Van Assche\",\n \"email\": \"ruben@spatie.be\",\n \"role\": \"Developer\"\n }\n ],\n \"description\": \"This is my package error-solutions\",\n \"homepage\": \"https://github.com/spatie/error-solutions\",\n \"keywords\": [\n \"error-solutions\",\n \"spatie\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/spatie/error-solutions/issues\",\n \"source\": \"https://github.com/spatie/error-solutions/tree/1.1.3\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/Spatie\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2025-02-14T12:29:50+00:00\"\n },\n {\n \"name\": \"spatie/flare-client-php\",\n \"version\": \"1.10.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/spatie/flare-client-php.git\",\n \"reference\": \"bf1716eb98bd689451b071548ae9e70738dce62f\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/spatie/flare-client-php/zipball/bf1716eb98bd689451b071548ae9e70738dce62f\",\n \"reference\": \"bf1716eb98bd689451b071548ae9e70738dce62f\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"illuminate/pipeline\": \"^8.0|^9.0|^10.0|^11.0|^12.0\",\n \"php\": \"^8.0\",\n \"spatie/backtrace\": \"^1.6.1\",\n \"symfony/http-foundation\": \"^5.2|^6.0|^7.0\",\n \"symfony/mime\": \"^5.2|^6.0|^7.0\",\n \"symfony/process\": \"^5.2|^6.0|^7.0\",\n \"symfony/var-dumper\": \"^5.2|^6.0|^7.0\"\n },\n \"require-dev\": {\n \"dms/phpunit-arraysubset-asserts\": \"^0.5.0\",\n \"pestphp/pest\": \"^1.20|^2.0\",\n \"phpstan/extension-installer\": \"^1.1\",\n \"phpstan/phpstan-deprecation-rules\": \"^1.0\",\n \"phpstan/phpstan-phpunit\": \"^1.0\",\n \"spatie/pest-plugin-snapshots\": \"^1.0|^2.0\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-main\": \"1.3.x-dev\"\n }\n },\n \"autoload\": {\n \"files\": [\n \"src/helpers.php\"\n ],\n \"psr-4\": {\n \"Spatie\\\\FlareClient\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"description\": \"Send PHP errors to Flare\",\n \"homepage\": \"https://github.com/spatie/flare-client-php\",\n \"keywords\": [\n \"exception\",\n \"flare\",\n \"reporting\",\n \"spatie\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/spatie/flare-client-php/issues\",\n \"source\": \"https://github.com/spatie/flare-client-php/tree/1.10.1\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/spatie\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2025-02-14T13:42:06+00:00\"\n },\n {\n \"name\": \"spatie/fractalistic\",\n \"version\": \"2.11.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/spatie/fractalistic.git\",\n \"reference\": \"046c535f30b31a9356fc034ce75e8ee74614ed4f\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/spatie/fractalistic/zipball/046c535f30b31a9356fc034ce75e8ee74614ed4f\",\n \"reference\": \"046c535f30b31a9356fc034ce75e8ee74614ed4f\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"league/fractal\": \"^0.20.1\",\n \"php\": \"^7.4|^8.0\"\n },\n \"require-dev\": {\n \"illuminate/pagination\": \"~5.3.0|~5.4.0|^9.0\",\n \"pestphp/pest\": \"^1.22\",\n \"phpunit/phpunit\": \"^9.0\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Spatie\\\\Fractalistic\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Freek Van der Herten\",\n \"email\": \"freek@spatie.be\",\n \"homepage\": \"https://spatie.be\",\n \"role\": \"Developer\"\n }\n ],\n \"description\": \"A developer friendly wrapper around Fractal\",\n \"homepage\": \"https://github.com/spatie/fractalistic\",\n \"keywords\": [\n \"api\",\n \"fractal\",\n \"fractalistic\",\n \"spatie\",\n \"transform\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/spatie/fractalistic/issues\",\n \"source\": \"https://github.com/spatie/fractalistic/tree/2.11.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/spatie\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2025-01-27T09:52:33+00:00\"\n },\n {\n \"name\": \"spatie/ignition\",\n \"version\": \"1.15.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/spatie/ignition.git\",\n \"reference\": \"31f314153020aee5af3537e507fef892ffbf8c85\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/spatie/ignition/zipball/31f314153020aee5af3537e507fef892ffbf8c85\",\n \"reference\": \"31f314153020aee5af3537e507fef892ffbf8c85\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"ext-json\": \"*\",\n \"ext-mbstring\": \"*\",\n \"php\": \"^8.0\",\n \"spatie/error-solutions\": \"^1.0\",\n \"spatie/flare-client-php\": \"^1.7\",\n \"symfony/console\": \"^5.4|^6.0|^7.0\",\n \"symfony/var-dumper\": \"^5.4|^6.0|^7.0\"\n },\n \"require-dev\": {\n \"illuminate/cache\": \"^9.52|^10.0|^11.0|^12.0\",\n \"mockery/mockery\": \"^1.4\",\n \"pestphp/pest\": \"^1.20|^2.0\",\n \"phpstan/extension-installer\": \"^1.1\",\n \"phpstan/phpstan-deprecation-rules\": \"^1.0\",\n \"phpstan/phpstan-phpunit\": \"^1.0\",\n \"psr/simple-cache-implementation\": \"*\",\n \"symfony/cache\": \"^5.4|^6.0|^7.0\",\n \"symfony/process\": \"^5.4|^6.0|^7.0\",\n \"vlucas/phpdotenv\": \"^5.5\"\n },\n \"suggest\": {\n \"openai-php/client\": \"Require get solutions from OpenAI\",\n \"simple-cache-implementation\": \"To cache solutions from OpenAI\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-main\": \"1.5.x-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Spatie\\\\Ignition\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Spatie\",\n \"email\": \"info@spatie.be\",\n \"role\": \"Developer\"\n }\n ],\n \"description\": \"A beautiful error page for PHP applications.\",\n \"homepage\": \"https://flareapp.io/ignition\",\n \"keywords\": [\n \"error\",\n \"flare\",\n \"laravel\",\n \"page\"\n ],\n \"support\": {\n \"docs\": \"https://flareapp.io/docs/ignition-for-laravel/introduction\",\n \"forum\": \"https://twitter.com/flareappio\",\n \"issues\": \"https://github.com/spatie/ignition/issues\",\n \"source\": \"https://github.com/spatie/ignition\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/spatie\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2025-02-21T14:31:39+00:00\"\n },\n {\n \"name\": \"spatie/laravel-fractal\",\n \"version\": \"6.3.2\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/spatie/laravel-fractal.git\",\n \"reference\": \"d078aa670233100e1309a0a7096c42f5b605ef29\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/spatie/laravel-fractal/zipball/d078aa670233100e1309a0a7096c42f5b605ef29\",\n \"reference\": \"d078aa670233100e1309a0a7096c42f5b605ef29\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"illuminate/contracts\": \"^8.0|^9.0|^10.0|^11.0|^12.0\",\n \"illuminate/support\": \"^8.0|^9.0|^10.0|^11.0|^12.0\",\n \"league/fractal\": \"^0.20.1|^0.20\",\n \"nesbot/carbon\": \"^2.63|^3.0\",\n \"php\": \"^8.0\",\n \"spatie/fractalistic\": \"^2.9.5|^2.9\",\n \"spatie/laravel-package-tools\": \"^1.11\"\n },\n \"require-dev\": {\n \"ext-json\": \"*\",\n \"orchestra/testbench\": \"^7.0|^8.0|^9.0|^10.0\",\n \"pestphp/pest\": \"^1.22|^2.34|^3.0\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"laravel\": {\n \"aliases\": {\n \"Fractal\": \"Spatie\\\\Fractal\\\\Facades\\\\Fractal\"\n },\n \"providers\": [\n \"Spatie\\\\Fractal\\\\FractalServiceProvider\"\n ]\n }\n },\n \"autoload\": {\n \"files\": [\n \"src/helpers.php\"\n ],\n \"psr-4\": {\n \"Spatie\\\\Fractal\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Freek Van der Herten\",\n \"email\": \"freek@spatie.be\",\n \"homepage\": \"https://spatie.be\",\n \"role\": \"Developer\"\n }\n ],\n \"description\": \"An easy to use Fractal integration for Laravel applications\",\n \"homepage\": \"https://github.com/spatie/laravel-fractal\",\n \"keywords\": [\n \"api\",\n \"fractal\",\n \"laravel\",\n \"laravel-fractal\",\n \"lumen\",\n \"spatie\",\n \"transform\"\n ],\n \"support\": {\n \"source\": \"https://github.com/spatie/laravel-fractal/tree/6.3.2\"\n },\n \"funding\": [\n {\n \"url\": \"https://spatie.be/open-source/support-us\",\n \"type\": \"custom\"\n }\n ],\n \"time\": \"2025-02-14T10:43:50+00:00\"\n },\n {\n \"name\": \"spatie/laravel-ignition\",\n \"version\": \"2.9.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/spatie/laravel-ignition.git\",\n \"reference\": \"1baee07216d6748ebd3a65ba97381b051838707a\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/spatie/laravel-ignition/zipball/1baee07216d6748ebd3a65ba97381b051838707a\",\n \"reference\": \"1baee07216d6748ebd3a65ba97381b051838707a\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"ext-curl\": \"*\",\n \"ext-json\": \"*\",\n \"ext-mbstring\": \"*\",\n \"illuminate/support\": \"^10.0|^11.0|^12.0\",\n \"php\": \"^8.1\",\n \"spatie/ignition\": \"^1.15\",\n \"symfony/console\": \"^6.2.3|^7.0\",\n \"symfony/var-dumper\": \"^6.2.3|^7.0\"\n },\n \"require-dev\": {\n \"livewire/livewire\": \"^2.11|^3.3.5\",\n \"mockery/mockery\": \"^1.5.1\",\n \"openai-php/client\": \"^0.8.1|^0.10\",\n \"orchestra/testbench\": \"8.22.3|^9.0|^10.0\",\n \"pestphp/pest\": \"^2.34|^3.7\",\n \"phpstan/extension-installer\": \"^1.3.1\",\n \"phpstan/phpstan-deprecation-rules\": \"^1.1.1|^2.0\",\n \"phpstan/phpstan-phpunit\": \"^1.3.16|^2.0\",\n \"vlucas/phpdotenv\": \"^5.5\"\n },\n \"suggest\": {\n \"openai-php/client\": \"Require get solutions from OpenAI\",\n \"psr/simple-cache-implementation\": \"Needed to cache solutions from OpenAI\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"laravel\": {\n \"aliases\": {\n \"Flare\": \"Spatie\\\\LaravelIgnition\\\\Facades\\\\Flare\"\n },\n \"providers\": [\n \"Spatie\\\\LaravelIgnition\\\\IgnitionServiceProvider\"\n ]\n }\n },\n \"autoload\": {\n \"files\": [\n \"src/helpers.php\"\n ],\n \"psr-4\": {\n \"Spatie\\\\LaravelIgnition\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Spatie\",\n \"email\": \"info@spatie.be\",\n \"role\": \"Developer\"\n }\n ],\n \"description\": \"A beautiful error page for Laravel applications.\",\n \"homepage\": \"https://flareapp.io/ignition\",\n \"keywords\": [\n \"error\",\n \"flare\",\n \"laravel\",\n \"page\"\n ],\n \"support\": {\n \"docs\": \"https://flareapp.io/docs/ignition-for-laravel/introduction\",\n \"forum\": \"https://twitter.com/flareappio\",\n \"issues\": \"https://github.com/spatie/laravel-ignition/issues\",\n \"source\": \"https://github.com/spatie/laravel-ignition\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/spatie\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2025-02-20T13:13:55+00:00\"\n },\n {\n \"name\": \"spatie/laravel-package-tools\",\n \"version\": \"1.92.7\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/spatie/laravel-package-tools.git\",\n \"reference\": \"f09a799850b1ed765103a4f0b4355006360c49a5\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/spatie/laravel-package-tools/zipball/f09a799850b1ed765103a4f0b4355006360c49a5\",\n \"reference\": \"f09a799850b1ed765103a4f0b4355006360c49a5\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"illuminate/contracts\": \"^9.28|^10.0|^11.0|^12.0\",\n \"php\": \"^8.0\"\n },\n \"require-dev\": {\n \"mockery/mockery\": \"^1.5\",\n \"orchestra/testbench\": \"^7.7|^8.0|^9.0|^10.0\",\n \"pestphp/pest\": \"^1.23|^2.1|^3.1\",\n \"phpunit/php-code-coverage\": \"^9.0|^10.0|^11.0\",\n \"phpunit/phpunit\": \"^9.5.24|^10.5|^11.5\",\n \"spatie/pest-plugin-test-time\": \"^1.1|^2.2\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Spatie\\\\LaravelPackageTools\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Freek Van der Herten\",\n \"email\": \"freek@spatie.be\",\n \"role\": \"Developer\"\n }\n ],\n \"description\": \"Tools for creating Laravel packages\",\n \"homepage\": \"https://github.com/spatie/laravel-package-tools\",\n \"keywords\": [\n \"laravel-package-tools\",\n \"spatie\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/spatie/laravel-package-tools/issues\",\n \"source\": \"https://github.com/spatie/laravel-package-tools/tree/1.92.7\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/spatie\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2025-07-17T15:46:43+00:00\"\n },\n {\n \"name\": \"spatie/laravel-webhook-server\",\n \"version\": \"3.8.3\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/spatie/laravel-webhook-server.git\",\n \"reference\": \"e3d8f24030bbb4087867cd0be681c028736b772f\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/spatie/laravel-webhook-server/zipball/e3d8f24030bbb4087867cd0be681c028736b772f\",\n \"reference\": \"e3d8f24030bbb4087867cd0be681c028736b772f\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"ext-json\": \"*\",\n \"guzzlehttp/guzzle\": \"^6.3|^7.3\",\n \"illuminate/bus\": \"^8.50|^9.0|^10.0|^11.0|^12.0\",\n \"illuminate/queue\": \"^8.50|^9.0|^10.0|^11.0|^12.0\",\n \"illuminate/support\": \"^8.50|^9.0|^10.0|^11.0|^12.0\",\n \"php\": \"^8.0\",\n \"spatie/laravel-package-tools\": \"^1.11\"\n },\n \"require-dev\": {\n \"mockery/mockery\": \"^1.4.3\",\n \"orchestra/testbench\": \"^6.19|^7.0|^8.0|^10.0\",\n \"pestphp/pest\": \"^1.22|^2.0|^3.0\",\n \"pestphp/pest-plugin-laravel\": \"^1.3|^2.0|^3.0\",\n \"spatie/test-time\": \"^1.2.2\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"laravel\": {\n \"providers\": [\n \"Spatie\\\\WebhookServer\\\\WebhookServerServiceProvider\"\n ]\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Spatie\\\\WebhookServer\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Freek Van der Herten\",\n \"email\": \"freek@spatie.be\",\n \"homepage\": \"https://spatie.be\",\n \"role\": \"Developer\"\n }\n ],\n \"description\": \"Send webhooks in Laravel apps\",\n \"homepage\": \"https://github.com/spatie/laravel-webhook-server\",\n \"keywords\": [\n \"laravel-webhook-server\",\n \"server\",\n \"spatie\",\n \"webhook\"\n ],\n \"support\": {\n \"source\": \"https://github.com/spatie/laravel-webhook-server/tree/3.8.3\"\n },\n \"funding\": [\n {\n \"url\": \"https://spatie.be/open-source/support-us\",\n \"type\": \"custom\"\n }\n ],\n \"time\": \"2025-02-14T12:55:41+00:00\"\n },\n {\n \"name\": \"spatie/temporary-directory\",\n \"version\": \"2.3.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/spatie/temporary-directory.git\",\n \"reference\": \"580eddfe9a0a41a902cac6eeb8f066b42e65a32b\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/spatie/temporary-directory/zipball/580eddfe9a0a41a902cac6eeb8f066b42e65a32b\",\n \"reference\": \"580eddfe9a0a41a902cac6eeb8f066b42e65a32b\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \"^8.0\"\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \"^9.5\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Spatie\\\\TemporaryDirectory\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Alex Vanderbist\",\n \"email\": \"alex@spatie.be\",\n \"homepage\": \"https://spatie.be\",\n \"role\": \"Developer\"\n }\n ],\n \"description\": \"Easily create, use and destroy temporary directories\",\n \"homepage\": \"https://github.com/spatie/temporary-directory\",\n \"keywords\": [\n \"php\",\n \"spatie\",\n \"temporary-directory\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/spatie/temporary-directory/issues\",\n \"source\": \"https://github.com/spatie/temporary-directory/tree/2.3.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://spatie.be/open-source/support-us\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/spatie\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2025-01-13T13:04:43+00:00\"\n },\n {\n \"name\": \"staudenmeir/belongs-to-through\",\n \"version\": \"v2.17\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/staudenmeir/belongs-to-through.git\",\n \"reference\": \"e45460f8eecd882e5daea2af8f948d7596c20ba0\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/staudenmeir/belongs-to-through/zipball/e45460f8eecd882e5daea2af8f948d7596c20ba0\",\n \"reference\": \"e45460f8eecd882e5daea2af8f948d7596c20ba0\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"illuminate/database\": \"^12.0\",\n \"php\": \"^8.2\"\n },\n \"require-dev\": {\n \"barryvdh/laravel-ide-helper\": \"^3.0\",\n \"larastan/larastan\": \"^3.0\",\n \"laravel/framework\": \"^12.0\",\n \"mockery/mockery\": \"^1.5.1\",\n \"orchestra/testbench-core\": \"^10.0\",\n \"phpunit/phpunit\": \"^11.0\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"laravel\": {\n \"providers\": [\n \"Staudenmeir\\\\BelongsToThrough\\\\IdeHelperServiceProvider\"\n ]\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Znck\\\\Eloquent\\\\\": \"src/\",\n \"Staudenmeir\\\\BelongsToThrough\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Rahul Kadyan\",\n \"email\": \"hi@znck.me\"\n },\n {\n \"name\": \"Jonas Staudenmeir\",\n \"email\": \"mail@jonas-staudenmeir.de\"\n }\n ],\n \"description\": \"Laravel Eloquent BelongsToThrough relationships\",\n \"support\": {\n \"issues\": \"https://github.com/staudenmeir/belongs-to-through/issues\",\n \"source\": \"https://github.com/staudenmeir/belongs-to-through/tree/v2.17\"\n },\n \"funding\": [\n {\n \"url\": \"https://paypal.me/JonasStaudenmeir\",\n \"type\": \"custom\"\n }\n ],\n \"time\": \"2025-02-20T19:24:03+00:00\"\n },\n {\n \"name\": \"stduritemplate/stduritemplate\",\n \"version\": \"2.0.8\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/std-uritemplate/std-uritemplate-php.git\",\n \"reference\": \"4c08308d512d5f349acdd415800f011300f7cf98\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/std-uritemplate/std-uritemplate-php/zipball/4c08308d512d5f349acdd415800f011300f7cf98\",\n \"reference\": \"4c08308d512d5f349acdd415800f011300f7cf98\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \"^7.4 || ^8.0\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"StdUriTemplate\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"Apache-2.0\"\n ],\n \"authors\": [\n {\n \"name\": \"Andrea Peruffo\",\n \"email\": \"andrea.peruffo1982@gmail.com\"\n }\n ],\n \"description\": \"Std UriTemplate, RFC 6570 implementation\",\n \"support\": {\n \"source\": \"https://github.com/std-uritemplate/std-uritemplate-php/tree/2.0.8\"\n },\n \"time\": \"2025-10-16T15:52:12+00:00\"\n },\n {\n \"name\": \"stevenmaguire/oauth2-salesforce\",\n \"version\": \"2.0.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/stevenmaguire/oauth2-salesforce.git\",\n \"reference\": \"37e1a2a59240e14b1f95d416a4f8d3d57199822b\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/stevenmaguire/oauth2-salesforce/zipball/37e1a2a59240e14b1f95d416a4f8d3d57199822b\",\n \"reference\": \"37e1a2a59240e14b1f95d416a4f8d3d57199822b\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"league/oauth2-client\": \"^2.0\"\n },\n \"require-dev\": {\n \"mockery/mockery\": \"~0.9\",\n \"phpunit/phpunit\": \"~4.0\",\n \"squizlabs/php_codesniffer\": \"~2.0\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"1.0.x-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Stevenmaguire\\\\OAuth2\\\\Client\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Steven Maguire\",\n \"email\": \"stevenmaguire@gmail.com\",\n \"homepage\": \"https://github.com/stevenmaguire\"\n }\n ],\n \"description\": \"Salesforce OAuth 2.0 Client Provider for The PHP League OAuth2-Client\",\n \"keywords\": [\n \"authorisation\",\n \"authorization\",\n \"client\",\n \"oauth\",\n \"oauth2\",\n \"salesforce\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/stevenmaguire/oauth2-salesforce/issues\",\n \"source\": \"https://github.com/stevenmaguire/oauth2-salesforce/tree/master\"\n },\n \"time\": \"2017-02-03T19:23:57+00:00\"\n },\n {\n \"name\": \"symfony/cache\",\n \"version\": \"v7.3.2\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/cache.git\",\n \"reference\": \"6621a2bee5373e3e972b2ae5dbedd5ac899d8cb6\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/cache/zipball/6621a2bee5373e3e972b2ae5dbedd5ac899d8cb6\",\n \"reference\": \"6621a2bee5373e3e972b2ae5dbedd5ac899d8cb6\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.2\",\n \"psr/cache\": \"^2.0|^3.0\",\n \"psr/log\": \"^1.1|^2|^3\",\n \"symfony/cache-contracts\": \"^3.6\",\n \"symfony/deprecation-contracts\": \"^2.5|^3.0\",\n \"symfony/service-contracts\": \"^2.5|^3\",\n \"symfony/var-exporter\": \"^6.4|^7.0\"\n },\n \"conflict\": {\n \"doctrine/dbal\": \"<3.6\",\n \"symfony/dependency-injection\": \"<6.4\",\n \"symfony/http-kernel\": \"<6.4\",\n \"symfony/var-dumper\": \"<6.4\"\n },\n \"provide\": {\n \"psr/cache-implementation\": \"2.0|3.0\",\n \"psr/simple-cache-implementation\": \"1.0|2.0|3.0\",\n \"symfony/cache-implementation\": \"1.1|2.0|3.0\"\n },\n \"require-dev\": {\n \"cache/integration-tests\": \"dev-master\",\n \"doctrine/dbal\": \"^3.6|^4\",\n \"predis/predis\": \"^1.1|^2.0\",\n \"psr/simple-cache\": \"^1.0|^2.0|^3.0\",\n \"symfony/clock\": \"^6.4|^7.0\",\n \"symfony/config\": \"^6.4|^7.0\",\n \"symfony/dependency-injection\": \"^6.4|^7.0\",\n \"symfony/filesystem\": \"^6.4|^7.0\",\n \"symfony/http-kernel\": \"^6.4|^7.0\",\n \"symfony/messenger\": \"^6.4|^7.0\",\n \"symfony/var-dumper\": \"^6.4|^7.0\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Symfony\\\\Component\\\\Cache\\\\\": \"\"\n },\n \"classmap\": [\n \"Traits/ValueWrapper.php\"\n ],\n \"exclude-from-classmap\": [\n \"/Tests/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Nicolas Grekas\",\n \"email\": \"p@tchwork.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Provides extended PSR-6, PSR-16 (and tags) implementations\",\n \"homepage\": \"https://symfony.com\",\n \"keywords\": [\n \"caching\",\n \"psr6\"\n ],\n \"support\": {\n \"source\": \"https://github.com/symfony/cache/tree/v7.3.2\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://github.com/nicolas-grekas\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2025-07-30T17:13:41+00:00\"\n },\n {\n \"name\": \"symfony/cache-contracts\",\n \"version\": \"v3.6.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/cache-contracts.git\",\n \"reference\": \"5d68a57d66910405e5c0b63d6f0af941e66fc868\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/cache-contracts/zipball/5d68a57d66910405e5c0b63d6f0af941e66fc868\",\n \"reference\": \"5d68a57d66910405e5c0b63d6f0af941e66fc868\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.1\",\n \"psr/cache\": \"^3.0\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"thanks\": {\n \"url\": \"https://github.com/symfony/contracts\",\n \"name\": \"symfony/contracts\"\n },\n \"branch-alias\": {\n \"dev-main\": \"3.6-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Symfony\\\\Contracts\\\\Cache\\\\\": \"\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Nicolas Grekas\",\n \"email\": \"p@tchwork.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Generic abstractions related to caching\",\n \"homepage\": \"https://symfony.com\",\n \"keywords\": [\n \"abstractions\",\n \"contracts\",\n \"decoupling\",\n \"interfaces\",\n \"interoperability\",\n \"standards\"\n ],\n \"support\": {\n \"source\": \"https://github.com/symfony/cache-contracts/tree/v3.6.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2025-03-13T15:25:07+00:00\"\n },\n {\n \"name\": \"symfony/clock\",\n \"version\": \"v7.4.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/clock.git\",\n \"reference\": \"9169f24776edde469914c1e7a1442a50f7a4e110\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/clock/zipball/9169f24776edde469914c1e7a1442a50f7a4e110\",\n \"reference\": \"9169f24776edde469914c1e7a1442a50f7a4e110\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.2\",\n \"psr/clock\": \"^1.0\",\n \"symfony/polyfill-php83\": \"^1.28\"\n },\n \"provide\": {\n \"psr/clock-implementation\": \"1.0\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"files\": [\n \"Resources/now.php\"\n ],\n \"psr-4\": {\n \"Symfony\\\\Component\\\\Clock\\\\\": \"\"\n },\n \"exclude-from-classmap\": [\n \"/Tests/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Nicolas Grekas\",\n \"email\": \"p@tchwork.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Decouples applications from the system clock\",\n \"homepage\": \"https://symfony.com\",\n \"keywords\": [\n \"clock\",\n \"psr20\",\n \"time\"\n ],\n \"support\": {\n \"source\": \"https://github.com/symfony/clock/tree/v7.4.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://github.com/nicolas-grekas\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2025-11-12T15:39:26+00:00\"\n },\n {\n \"name\": \"symfony/console\",\n \"version\": \"v7.4.7\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/console.git\",\n \"reference\": \"e1e6770440fb9c9b0cf725f81d1361ad1835329d\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/console/zipball/e1e6770440fb9c9b0cf725f81d1361ad1835329d\",\n \"reference\": \"e1e6770440fb9c9b0cf725f81d1361ad1835329d\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.2\",\n \"symfony/deprecation-contracts\": \"^2.5|^3\",\n \"symfony/polyfill-mbstring\": \"~1.0\",\n \"symfony/service-contracts\": \"^2.5|^3\",\n \"symfony/string\": \"^7.2|^8.0\"\n },\n \"conflict\": {\n \"symfony/dependency-injection\": \"<6.4\",\n \"symfony/dotenv\": \"<6.4\",\n \"symfony/event-dispatcher\": \"<6.4\",\n \"symfony/lock\": \"<6.4\",\n \"symfony/process\": \"<6.4\"\n },\n \"provide\": {\n \"psr/log-implementation\": \"1.0|2.0|3.0\"\n },\n \"require-dev\": {\n \"psr/log\": \"^1|^2|^3\",\n \"symfony/config\": \"^6.4|^7.0|^8.0\",\n \"symfony/dependency-injection\": \"^6.4|^7.0|^8.0\",\n \"symfony/event-dispatcher\": \"^6.4|^7.0|^8.0\",\n \"symfony/http-foundation\": \"^6.4|^7.0|^8.0\",\n \"symfony/http-kernel\": \"^6.4|^7.0|^8.0\",\n \"symfony/lock\": \"^6.4|^7.0|^8.0\",\n \"symfony/messenger\": \"^6.4|^7.0|^8.0\",\n \"symfony/process\": \"^6.4|^7.0|^8.0\",\n \"symfony/stopwatch\": \"^6.4|^7.0|^8.0\",\n \"symfony/var-dumper\": \"^6.4|^7.0|^8.0\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Symfony\\\\Component\\\\Console\\\\\": \"\"\n },\n \"exclude-from-classmap\": [\n \"/Tests/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Fabien Potencier\",\n \"email\": \"fabien@symfony.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Eases the creation of beautiful and testable command line interfaces\",\n \"homepage\": \"https://symfony.com\",\n \"keywords\": [\n \"cli\",\n \"command-line\",\n \"console\",\n \"terminal\"\n ],\n \"support\": {\n \"source\": \"https://github.com/symfony/console/tree/v7.4.7\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://github.com/nicolas-grekas\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2026-03-06T14:06:20+00:00\"\n },\n {\n \"name\": \"symfony/css-selector\",\n \"version\": \"v7.4.6\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/css-selector.git\",\n \"reference\": \"2e7c52c647b406e2107dd867db424a4dbac91864\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/css-selector/zipball/2e7c52c647b406e2107dd867db424a4dbac91864\",\n \"reference\": \"2e7c52c647b406e2107dd867db424a4dbac91864\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.2\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Symfony\\\\Component\\\\CssSelector\\\\\": \"\"\n },\n \"exclude-from-classmap\": [\n \"/Tests/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Fabien Potencier\",\n \"email\": \"fabien@symfony.com\"\n },\n {\n \"name\": \"Jean-François Simon\",\n \"email\": \"jeanfrancois.simon@sensiolabs.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Converts CSS selectors to XPath expressions\",\n \"homepage\": \"https://symfony.com\",\n \"support\": {\n \"source\": \"https://github.com/symfony/css-selector/tree/v7.4.6\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://github.com/nicolas-grekas\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2026-02-17T07:53:42+00:00\"\n },\n {\n \"name\": \"symfony/debug\",\n \"version\": \"v4.4.44\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/debug.git\",\n \"reference\": \"1a692492190773c5310bc7877cb590c04c2f05be\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/debug/zipball/1a692492190773c5310bc7877cb590c04c2f05be\",\n \"reference\": \"1a692492190773c5310bc7877cb590c04c2f05be\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=7.1.3\",\n \"psr/log\": \"^1|^2|^3\"\n },\n \"conflict\": {\n \"symfony/http-kernel\": \"<3.4\"\n },\n \"require-dev\": {\n \"symfony/http-kernel\": \"^3.4|^4.0|^5.0\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Symfony\\\\Component\\\\Debug\\\\\": \"\"\n },\n \"exclude-from-classmap\": [\n \"/Tests/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Fabien Potencier\",\n \"email\": \"fabien@symfony.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Provides tools to ease debugging PHP code\",\n \"homepage\": \"https://symfony.com\",\n \"support\": {\n \"source\": \"https://github.com/symfony/debug/tree/v4.4.44\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"abandoned\": \"symfony/error-handler\",\n \"time\": \"2022-07-28T16:29:46+00:00\"\n },\n {\n \"name\": \"symfony/deprecation-contracts\",\n \"version\": \"v3.6.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/deprecation-contracts.git\",\n \"reference\": \"63afe740e99a13ba87ec199bb07bbdee937a5b62\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/deprecation-contracts/zipball/63afe740e99a13ba87ec199bb07bbdee937a5b62\",\n \"reference\": \"63afe740e99a13ba87ec199bb07bbdee937a5b62\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.1\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"thanks\": {\n \"url\": \"https://github.com/symfony/contracts\",\n \"name\": \"symfony/contracts\"\n },\n \"branch-alias\": {\n \"dev-main\": \"3.6-dev\"\n }\n },\n \"autoload\": {\n \"files\": [\n \"function.php\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Nicolas Grekas\",\n \"email\": \"p@tchwork.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"A generic function and convention to trigger deprecation notices\",\n \"homepage\": \"https://symfony.com\",\n \"support\": {\n \"source\": \"https://github.com/symfony/deprecation-contracts/tree/v3.6.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2024-09-25T14:21:43+00:00\"\n },\n {\n \"name\": \"symfony/dom-crawler\",\n \"version\": \"v7.3.3\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/dom-crawler.git\",\n \"reference\": \"efa076ea0eeff504383ff0dcf827ea5ce15690ba\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/dom-crawler/zipball/efa076ea0eeff504383ff0dcf827ea5ce15690ba\",\n \"reference\": \"efa076ea0eeff504383ff0dcf827ea5ce15690ba\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"masterminds/html5\": \"^2.6\",\n \"php\": \">=8.2\",\n \"symfony/polyfill-ctype\": \"~1.8\",\n \"symfony/polyfill-mbstring\": \"~1.0\"\n },\n \"require-dev\": {\n \"symfony/css-selector\": \"^6.4|^7.0\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Symfony\\\\Component\\\\DomCrawler\\\\\": \"\"\n },\n \"exclude-from-classmap\": [\n \"/Tests/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Fabien Potencier\",\n \"email\": \"fabien@symfony.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Eases DOM navigation for HTML and XML documents\",\n \"homepage\": \"https://symfony.com\",\n \"support\": {\n \"source\": \"https://github.com/symfony/dom-crawler/tree/v7.3.3\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://github.com/nicolas-grekas\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2025-08-06T20:13:54+00:00\"\n },\n {\n \"name\": \"symfony/error-handler\",\n \"version\": \"v7.4.4\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/error-handler.git\",\n \"reference\": \"8da531f364ddfee53e36092a7eebbbd0b775f6b8\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/error-handler/zipball/8da531f364ddfee53e36092a7eebbbd0b775f6b8\",\n \"reference\": \"8da531f364ddfee53e36092a7eebbbd0b775f6b8\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.2\",\n \"psr/log\": \"^1|^2|^3\",\n \"symfony/polyfill-php85\": \"^1.32\",\n \"symfony/var-dumper\": \"^6.4|^7.0|^8.0\"\n },\n \"conflict\": {\n \"symfony/deprecation-contracts\": \"<2.5\",\n \"symfony/http-kernel\": \"<6.4\"\n },\n \"require-dev\": {\n \"symfony/console\": \"^6.4|^7.0|^8.0\",\n \"symfony/deprecation-contracts\": \"^2.5|^3\",\n \"symfony/http-kernel\": \"^6.4|^7.0|^8.0\",\n \"symfony/serializer\": \"^6.4|^7.0|^8.0\",\n \"symfony/webpack-encore-bundle\": \"^1.0|^2.0\"\n },\n \"bin\": [\n \"Resources/bin/patch-type-declarations\"\n ],\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Symfony\\\\Component\\\\ErrorHandler\\\\\": \"\"\n },\n \"exclude-from-classmap\": [\n \"/Tests/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Fabien Potencier\",\n \"email\": \"fabien@symfony.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Provides tools to manage errors and ease debugging PHP code\",\n \"homepage\": \"https://symfony.com\",\n \"support\": {\n \"source\": \"https://github.com/symfony/error-handler/tree/v7.4.4\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://github.com/nicolas-grekas\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2026-01-20T16:42:42+00:00\"\n },\n {\n \"name\": \"symfony/event-dispatcher\",\n \"version\": \"v6.4.32\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/event-dispatcher.git\",\n \"reference\": \"99d7e101826e6610606b9433248f80c1997cd20b\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/event-dispatcher/zipball/99d7e101826e6610606b9433248f80c1997cd20b\",\n \"reference\": \"99d7e101826e6610606b9433248f80c1997cd20b\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.1\",\n \"symfony/event-dispatcher-contracts\": \"^2.5|^3\"\n },\n \"conflict\": {\n \"symfony/dependency-injection\": \"<5.4\",\n \"symfony/service-contracts\": \"<2.5\"\n },\n \"provide\": {\n \"psr/event-dispatcher-implementation\": \"1.0\",\n \"symfony/event-dispatcher-implementation\": \"2.0|3.0\"\n },\n \"require-dev\": {\n \"psr/log\": \"^1|^2|^3\",\n \"symfony/config\": \"^5.4|^6.0|^7.0\",\n \"symfony/dependency-injection\": \"^5.4|^6.0|^7.0\",\n \"symfony/error-handler\": \"^5.4|^6.0|^7.0\",\n \"symfony/expression-language\": \"^5.4|^6.0|^7.0\",\n \"symfony/http-foundation\": \"^5.4|^6.0|^7.0\",\n \"symfony/service-contracts\": \"^2.5|^3\",\n \"symfony/stopwatch\": \"^5.4|^6.0|^7.0\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Symfony\\\\Component\\\\EventDispatcher\\\\\": \"\"\n },\n \"exclude-from-classmap\": [\n \"/Tests/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Fabien Potencier\",\n \"email\": \"fabien@symfony.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Provides tools that allow your application components to communicate with each other by dispatching events and listening to them\",\n \"homepage\": \"https://symfony.com\",\n \"support\": {\n \"source\": \"https://github.com/symfony/event-dispatcher/tree/v6.4.32\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://github.com/nicolas-grekas\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2026-01-05T11:13:48+00:00\"\n },\n {\n \"name\": \"symfony/event-dispatcher-contracts\",\n \"version\": \"v3.6.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/event-dispatcher-contracts.git\",\n \"reference\": \"59eb412e93815df44f05f342958efa9f46b1e586\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/59eb412e93815df44f05f342958efa9f46b1e586\",\n \"reference\": \"59eb412e93815df44f05f342958efa9f46b1e586\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.1\",\n \"psr/event-dispatcher\": \"^1\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"thanks\": {\n \"url\": \"https://github.com/symfony/contracts\",\n \"name\": \"symfony/contracts\"\n },\n \"branch-alias\": {\n \"dev-main\": \"3.6-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Symfony\\\\Contracts\\\\EventDispatcher\\\\\": \"\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Nicolas Grekas\",\n \"email\": \"p@tchwork.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Generic abstractions related to dispatching event\",\n \"homepage\": \"https://symfony.com\",\n \"keywords\": [\n \"abstractions\",\n \"contracts\",\n \"decoupling\",\n \"interfaces\",\n \"interoperability\",\n \"standards\"\n ],\n \"support\": {\n \"source\": \"https://github.com/symfony/event-dispatcher-contracts/tree/v3.6.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2024-09-25T14:21:43+00:00\"\n },\n {\n \"name\": \"symfony/expression-language\",\n \"version\": \"v7.3.2\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/expression-language.git\",\n \"reference\": \"32d2d19c62e58767e6552166c32fb259975d2b23\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/expression-language/zipball/32d2d19c62e58767e6552166c32fb259975d2b23\",\n \"reference\": \"32d2d19c62e58767e6552166c32fb259975d2b23\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.2\",\n \"symfony/cache\": \"^6.4|^7.0\",\n \"symfony/deprecation-contracts\": \"^2.5|^3\",\n \"symfony/service-contracts\": \"^2.5|^3\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Symfony\\\\Component\\\\ExpressionLanguage\\\\\": \"\"\n },\n \"exclude-from-classmap\": [\n \"/Tests/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Fabien Potencier\",\n \"email\": \"fabien@symfony.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Provides an engine that can compile and evaluate expressions\",\n \"homepage\": \"https://symfony.com\",\n \"support\": {\n \"source\": \"https://github.com/symfony/expression-language/tree/v7.3.2\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://github.com/nicolas-grekas\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2025-07-10T08:29:33+00:00\"\n },\n {\n \"name\": \"symfony/filesystem\",\n \"version\": \"v7.3.2\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/filesystem.git\",\n \"reference\": \"edcbb768a186b5c3f25d0643159a787d3e63b7fd\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/filesystem/zipball/edcbb768a186b5c3f25d0643159a787d3e63b7fd\",\n \"reference\": \"edcbb768a186b5c3f25d0643159a787d3e63b7fd\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.2\",\n \"symfony/polyfill-ctype\": \"~1.8\",\n \"symfony/polyfill-mbstring\": \"~1.8\"\n },\n \"require-dev\": {\n \"symfony/process\": \"^6.4|^7.0\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Symfony\\\\Component\\\\Filesystem\\\\\": \"\"\n },\n \"exclude-from-classmap\": [\n \"/Tests/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Fabien Potencier\",\n \"email\": \"fabien@symfony.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Provides basic utilities for the filesystem\",\n \"homepage\": \"https://symfony.com\",\n \"support\": {\n \"source\": \"https://github.com/symfony/filesystem/tree/v7.3.2\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://github.com/nicolas-grekas\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2025-07-07T08:17:47+00:00\"\n },\n {\n \"name\": \"symfony/finder\",\n \"version\": \"v7.4.6\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/finder.git\",\n \"reference\": \"8655bf1076b7a3a346cb11413ffdabff50c7ffcf\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/finder/zipball/8655bf1076b7a3a346cb11413ffdabff50c7ffcf\",\n \"reference\": \"8655bf1076b7a3a346cb11413ffdabff50c7ffcf\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.2\"\n },\n \"require-dev\": {\n \"symfony/filesystem\": \"^6.4|^7.0|^8.0\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Symfony\\\\Component\\\\Finder\\\\\": \"\"\n },\n \"exclude-from-classmap\": [\n \"/Tests/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Fabien Potencier\",\n \"email\": \"fabien@symfony.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Finds files and directories via an intuitive fluent interface\",\n \"homepage\": \"https://symfony.com\",\n \"support\": {\n \"source\": \"https://github.com/symfony/finder/tree/v7.4.6\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://github.com/nicolas-grekas\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2026-01-29T09:40:50+00:00\"\n },\n {\n \"name\": \"symfony/http-client\",\n \"version\": \"v7.3.3\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/http-client.git\",\n \"reference\": \"333b9bd7639cbdaecd25a3a48a9d2dcfaa86e019\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/http-client/zipball/333b9bd7639cbdaecd25a3a48a9d2dcfaa86e019\",\n \"reference\": \"333b9bd7639cbdaecd25a3a48a9d2dcfaa86e019\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.2\",\n \"psr/log\": \"^1|^2|^3\",\n \"symfony/deprecation-contracts\": \"^2.5|^3\",\n \"symfony/http-client-contracts\": \"~3.4.4|^3.5.2\",\n \"symfony/polyfill-php83\": \"^1.29\",\n \"symfony/service-contracts\": \"^2.5|^3\"\n },\n \"conflict\": {\n \"amphp/amp\": \"<2.5\",\n \"amphp/socket\": \"<1.1\",\n \"php-http/discovery\": \"<1.15\",\n \"symfony/http-foundation\": \"<6.4\"\n },\n \"provide\": {\n \"php-http/async-client-implementation\": \"*\",\n \"php-http/client-implementation\": \"*\",\n \"psr/http-client-implementation\": \"1.0\",\n \"symfony/http-client-implementation\": \"3.0\"\n },\n \"require-dev\": {\n \"amphp/http-client\": \"^4.2.1|^5.0\",\n \"amphp/http-tunnel\": \"^1.0|^2.0\",\n \"guzzlehttp/promises\": \"^1.4|^2.0\",\n \"nyholm/psr7\": \"^1.0\",\n \"php-http/httplug\": \"^1.0|^2.0\",\n \"psr/http-client\": \"^1.0\",\n \"symfony/amphp-http-client-meta\": \"^1.0|^2.0\",\n \"symfony/dependency-injection\": \"^6.4|^7.0\",\n \"symfony/http-kernel\": \"^6.4|^7.0\",\n \"symfony/messenger\": \"^6.4|^7.0\",\n \"symfony/process\": \"^6.4|^7.0\",\n \"symfony/rate-limiter\": \"^6.4|^7.0\",\n \"symfony/stopwatch\": \"^6.4|^7.0\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Symfony\\\\Component\\\\HttpClient\\\\\": \"\"\n },\n \"exclude-from-classmap\": [\n \"/Tests/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Nicolas Grekas\",\n \"email\": \"p@tchwork.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Provides powerful methods to fetch HTTP resources synchronously or asynchronously\",\n \"homepage\": \"https://symfony.com\",\n \"keywords\": [\n \"http\"\n ],\n \"support\": {\n \"source\": \"https://github.com/symfony/http-client/tree/v7.3.3\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://github.com/nicolas-grekas\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2025-08-27T07:45:05+00:00\"\n },\n {\n \"name\": \"symfony/http-client-contracts\",\n \"version\": \"v3.6.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/http-client-contracts.git\",\n \"reference\": \"75d7043853a42837e68111812f4d964b01e5101c\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/http-client-contracts/zipball/75d7043853a42837e68111812f4d964b01e5101c\",\n \"reference\": \"75d7043853a42837e68111812f4d964b01e5101c\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.1\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"thanks\": {\n \"url\": \"https://github.com/symfony/contracts\",\n \"name\": \"symfony/contracts\"\n },\n \"branch-alias\": {\n \"dev-main\": \"3.6-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Symfony\\\\Contracts\\\\HttpClient\\\\\": \"\"\n },\n \"exclude-from-classmap\": [\n \"/Test/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Nicolas Grekas\",\n \"email\": \"p@tchwork.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Generic abstractions related to HTTP clients\",\n \"homepage\": \"https://symfony.com\",\n \"keywords\": [\n \"abstractions\",\n \"contracts\",\n \"decoupling\",\n \"interfaces\",\n \"interoperability\",\n \"standards\"\n ],\n \"support\": {\n \"source\": \"https://github.com/symfony/http-client-contracts/tree/v3.6.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2025-04-29T11:18:49+00:00\"\n },\n {\n \"name\": \"symfony/http-foundation\",\n \"version\": \"v7.4.7\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/http-foundation.git\",\n \"reference\": \"f94b3e7b7dafd40e666f0c9ff2084133bae41e81\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/http-foundation/zipball/f94b3e7b7dafd40e666f0c9ff2084133bae41e81\",\n \"reference\": \"f94b3e7b7dafd40e666f0c9ff2084133bae41e81\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.2\",\n \"symfony/deprecation-contracts\": \"^2.5|^3\",\n \"symfony/polyfill-mbstring\": \"^1.1\"\n },\n \"conflict\": {\n \"doctrine/dbal\": \"<3.6\",\n \"symfony/cache\": \"<6.4.12|>=7.0,<7.1.5\"\n },\n \"require-dev\": {\n \"doctrine/dbal\": \"^3.6|^4\",\n \"predis/predis\": \"^1.1|^2.0\",\n \"symfony/cache\": \"^6.4.12|^7.1.5|^8.0\",\n \"symfony/clock\": \"^6.4|^7.0|^8.0\",\n \"symfony/dependency-injection\": \"^6.4|^7.0|^8.0\",\n \"symfony/expression-language\": \"^6.4|^7.0|^8.0\",\n \"symfony/http-kernel\": \"^6.4|^7.0|^8.0\",\n \"symfony/mime\": \"^6.4|^7.0|^8.0\",\n \"symfony/rate-limiter\": \"^6.4|^7.0|^8.0\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Symfony\\\\Component\\\\HttpFoundation\\\\\": \"\"\n },\n \"exclude-from-classmap\": [\n \"/Tests/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Fabien Potencier\",\n \"email\": \"fabien@symfony.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Defines an object-oriented layer for the HTTP specification\",\n \"homepage\": \"https://symfony.com\",\n \"support\": {\n \"source\": \"https://github.com/symfony/http-foundation/tree/v7.4.7\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://github.com/nicolas-grekas\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2026-03-06T13:15:18+00:00\"\n },\n {\n \"name\": \"symfony/http-kernel\",\n \"version\": \"v7.2.9\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/http-kernel.git\",\n \"reference\": \"d0cc0295c9c2fd5e053fee2b2a143001f2d0c33c\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/http-kernel/zipball/d0cc0295c9c2fd5e053fee2b2a143001f2d0c33c\",\n \"reference\": \"d0cc0295c9c2fd5e053fee2b2a143001f2d0c33c\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.2\",\n \"psr/log\": \"^1|^2|^3\",\n \"symfony/deprecation-contracts\": \"^2.5|^3\",\n \"symfony/error-handler\": \"^6.4|^7.0\",\n \"symfony/event-dispatcher\": \"^6.4|^7.0\",\n \"symfony/http-foundation\": \"^6.4|^7.0\",\n \"symfony/polyfill-ctype\": \"^1.8\"\n },\n \"conflict\": {\n \"symfony/browser-kit\": \"<6.4\",\n \"symfony/cache\": \"<6.4\",\n \"symfony/config\": \"<6.4\",\n \"symfony/console\": \"<6.4\",\n \"symfony/dependency-injection\": \"<6.4\",\n \"symfony/doctrine-bridge\": \"<6.4\",\n \"symfony/form\": \"<6.4\",\n \"symfony/http-client\": \"<6.4\",\n \"symfony/http-client-contracts\": \"<2.5\",\n \"symfony/mailer\": \"<6.4\",\n \"symfony/messenger\": \"<6.4\",\n \"symfony/translation\": \"<6.4\",\n \"symfony/translation-contracts\": \"<2.5\",\n \"symfony/twig-bridge\": \"<6.4\",\n \"symfony/validator\": \"<6.4\",\n \"symfony/var-dumper\": \"<6.4\",\n \"twig/twig\": \"<3.12\"\n },\n \"provide\": {\n \"psr/log-implementation\": \"1.0|2.0|3.0\"\n },\n \"require-dev\": {\n \"psr/cache\": \"^1.0|^2.0|^3.0\",\n \"symfony/browser-kit\": \"^6.4|^7.0\",\n \"symfony/clock\": \"^6.4|^7.0\",\n \"symfony/config\": \"^6.4|^7.0\",\n \"symfony/console\": \"^6.4|^7.0\",\n \"symfony/css-selector\": \"^6.4|^7.0\",\n \"symfony/dependency-injection\": \"^6.4|^7.0\",\n \"symfony/dom-crawler\": \"^6.4|^7.0\",\n \"symfony/expression-language\": \"^6.4|^7.0\",\n \"symfony/finder\": \"^6.4|^7.0\",\n \"symfony/http-client-contracts\": \"^2.5|^3\",\n \"symfony/process\": \"^6.4|^7.0\",\n \"symfony/property-access\": \"^7.1\",\n \"symfony/routing\": \"^6.4|^7.0\",\n \"symfony/serializer\": \"^7.1\",\n \"symfony/stopwatch\": \"^6.4|^7.0\",\n \"symfony/translation\": \"^6.4|^7.0\",\n \"symfony/translation-contracts\": \"^2.5|^3\",\n \"symfony/uid\": \"^6.4|^7.0\",\n \"symfony/validator\": \"^6.4|^7.0\",\n \"symfony/var-dumper\": \"^6.4|^7.0\",\n \"symfony/var-exporter\": \"^6.4|^7.0\",\n \"twig/twig\": \"^3.12\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Symfony\\\\Component\\\\HttpKernel\\\\\": \"\"\n },\n \"exclude-from-classmap\": [\n \"/Tests/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Fabien Potencier\",\n \"email\": \"fabien@symfony.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Provides a structured process for converting a Request into a Response\",\n \"homepage\": \"https://symfony.com\",\n \"support\": {\n \"source\": \"https://github.com/symfony/http-kernel/tree/v7.2.9\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://github.com/nicolas-grekas\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2025-07-31T09:36:38+00:00\"\n },\n {\n \"name\": \"symfony/mailer\",\n \"version\": \"v7.4.6\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/mailer.git\",\n \"reference\": \"b02726f39a20bc65e30364f5c750c4ddbf1f58e9\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/mailer/zipball/b02726f39a20bc65e30364f5c750c4ddbf1f58e9\",\n \"reference\": \"b02726f39a20bc65e30364f5c750c4ddbf1f58e9\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"egulias/email-validator\": \"^2.1.10|^3|^4\",\n \"php\": \">=8.2\",\n \"psr/event-dispatcher\": \"^1\",\n \"psr/log\": \"^1|^2|^3\",\n \"symfony/event-dispatcher\": \"^6.4|^7.0|^8.0\",\n \"symfony/mime\": \"^7.2|^8.0\",\n \"symfony/service-contracts\": \"^2.5|^3\"\n },\n \"conflict\": {\n \"symfony/http-client-contracts\": \"<2.5\",\n \"symfony/http-kernel\": \"<6.4\",\n \"symfony/messenger\": \"<6.4\",\n \"symfony/mime\": \"<6.4\",\n \"symfony/twig-bridge\": \"<6.4\"\n },\n \"require-dev\": {\n \"symfony/console\": \"^6.4|^7.0|^8.0\",\n \"symfony/http-client\": \"^6.4|^7.0|^8.0\",\n \"symfony/messenger\": \"^6.4|^7.0|^8.0\",\n \"symfony/twig-bridge\": \"^6.4|^7.0|^8.0\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Symfony\\\\Component\\\\Mailer\\\\\": \"\"\n },\n \"exclude-from-classmap\": [\n \"/Tests/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Fabien Potencier\",\n \"email\": \"fabien@symfony.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Helps sending emails\",\n \"homepage\": \"https://symfony.com\",\n \"support\": {\n \"source\": \"https://github.com/symfony/mailer/tree/v7.4.6\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://github.com/nicolas-grekas\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2026-02-25T16:50:00+00:00\"\n },\n {\n \"name\": \"symfony/mime\",\n \"version\": \"v7.4.7\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/mime.git\",\n \"reference\": \"da5ab4fde3f6c88ab06e96185b9922f48b677cd1\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/mime/zipball/da5ab4fde3f6c88ab06e96185b9922f48b677cd1\",\n \"reference\": \"da5ab4fde3f6c88ab06e96185b9922f48b677cd1\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.2\",\n \"symfony/deprecation-contracts\": \"^2.5|^3\",\n \"symfony/polyfill-intl-idn\": \"^1.10\",\n \"symfony/polyfill-mbstring\": \"^1.0\"\n },\n \"conflict\": {\n \"egulias/email-validator\": \"~3.0.0\",\n \"phpdocumentor/reflection-docblock\": \"<5.2|>=7\",\n \"phpdocumentor/type-resolver\": \"<1.5.1\",\n \"symfony/mailer\": \"<6.4\",\n \"symfony/serializer\": \"<6.4.3|>7.0,<7.0.3\"\n },\n \"require-dev\": {\n \"egulias/email-validator\": \"^2.1.10|^3.1|^4\",\n \"league/html-to-markdown\": \"^5.0\",\n \"phpdocumentor/reflection-docblock\": \"^5.2|^6.0\",\n \"symfony/dependency-injection\": \"^6.4|^7.0|^8.0\",\n \"symfony/process\": \"^6.4|^7.0|^8.0\",\n \"symfony/property-access\": \"^6.4|^7.0|^8.0\",\n \"symfony/property-info\": \"^6.4|^7.0|^8.0\",\n \"symfony/serializer\": \"^6.4.3|^7.0.3|^8.0\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Symfony\\\\Component\\\\Mime\\\\\": \"\"\n },\n \"exclude-from-classmap\": [\n \"/Tests/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Fabien Potencier\",\n \"email\": \"fabien@symfony.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Allows manipulating MIME messages\",\n \"homepage\": \"https://symfony.com\",\n \"keywords\": [\n \"mime\",\n \"mime-type\"\n ],\n \"support\": {\n \"source\": \"https://github.com/symfony/mime/tree/v7.4.7\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://github.com/nicolas-grekas\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2026-03-05T15:24:09+00:00\"\n },\n {\n \"name\": \"symfony/options-resolver\",\n \"version\": \"v7.3.3\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/options-resolver.git\",\n \"reference\": \"0ff2f5c3df08a395232bbc3c2eb7e84912df911d\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/options-resolver/zipball/0ff2f5c3df08a395232bbc3c2eb7e84912df911d\",\n \"reference\": \"0ff2f5c3df08a395232bbc3c2eb7e84912df911d\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.2\",\n \"symfony/deprecation-contracts\": \"^2.5|^3\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Symfony\\\\Component\\\\OptionsResolver\\\\\": \"\"\n },\n \"exclude-from-classmap\": [\n \"/Tests/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Fabien Potencier\",\n \"email\": \"fabien@symfony.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Provides an improved replacement for the array_replace PHP function\",\n \"homepage\": \"https://symfony.com\",\n \"keywords\": [\n \"config\",\n \"configuration\",\n \"options\"\n ],\n \"support\": {\n \"source\": \"https://github.com/symfony/options-resolver/tree/v7.3.3\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://github.com/nicolas-grekas\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2025-08-05T10:16:07+00:00\"\n },\n {\n \"name\": \"symfony/polyfill-ctype\",\n \"version\": \"v1.33.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/polyfill-ctype.git\",\n \"reference\": \"a3cc8b044a6ea513310cbd48ef7333b384945638\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/polyfill-ctype/zipball/a3cc8b044a6ea513310cbd48ef7333b384945638\",\n \"reference\": \"a3cc8b044a6ea513310cbd48ef7333b384945638\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=7.2\"\n },\n \"provide\": {\n \"ext-ctype\": \"*\"\n },\n \"suggest\": {\n \"ext-ctype\": \"For best performance\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"thanks\": {\n \"url\": \"https://github.com/symfony/polyfill\",\n \"name\": \"symfony/polyfill\"\n }\n },\n \"autoload\": {\n \"files\": [\n \"bootstrap.php\"\n ],\n \"psr-4\": {\n \"Symfony\\\\Polyfill\\\\Ctype\\\\\": \"\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Gert de Pagter\",\n \"email\": \"BackEndTea@gmail.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Symfony polyfill for ctype functions\",\n \"homepage\": \"https://symfony.com\",\n \"keywords\": [\n \"compatibility\",\n \"ctype\",\n \"polyfill\",\n \"portable\"\n ],\n \"support\": {\n \"source\": \"https://github.com/symfony/polyfill-ctype/tree/v1.33.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://github.com/nicolas-grekas\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2024-09-09T11:45:10+00:00\"\n },\n {\n \"name\": \"symfony/polyfill-iconv\",\n \"version\": \"v1.33.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/polyfill-iconv.git\",\n \"reference\": \"5f3b930437ae03ae5dff61269024d8ea1b3774aa\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/polyfill-iconv/zipball/5f3b930437ae03ae5dff61269024d8ea1b3774aa\",\n \"reference\": \"5f3b930437ae03ae5dff61269024d8ea1b3774aa\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=7.2\"\n },\n \"provide\": {\n \"ext-iconv\": \"*\"\n },\n \"suggest\": {\n \"ext-iconv\": \"For best performance\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"thanks\": {\n \"url\": \"https://github.com/symfony/polyfill\",\n \"name\": \"symfony/polyfill\"\n }\n },\n \"autoload\": {\n \"files\": [\n \"bootstrap.php\"\n ],\n \"psr-4\": {\n \"Symfony\\\\Polyfill\\\\Iconv\\\\\": \"\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Nicolas Grekas\",\n \"email\": \"p@tchwork.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Symfony polyfill for the Iconv extension\",\n \"homepage\": \"https://symfony.com\",\n \"keywords\": [\n \"compatibility\",\n \"iconv\",\n \"polyfill\",\n \"portable\",\n \"shim\"\n ],\n \"support\": {\n \"source\": \"https://github.com/symfony/polyfill-iconv/tree/v1.33.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://github.com/nicolas-grekas\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2024-09-17T14:58:18+00:00\"\n },\n {\n \"name\": \"symfony/polyfill-intl-grapheme\",\n \"version\": \"v1.33.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/polyfill-intl-grapheme.git\",\n \"reference\": \"380872130d3a5dd3ace2f4010d95125fde5d5c70\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/380872130d3a5dd3ace2f4010d95125fde5d5c70\",\n \"reference\": \"380872130d3a5dd3ace2f4010d95125fde5d5c70\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=7.2\"\n },\n \"suggest\": {\n \"ext-intl\": \"For best performance\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"thanks\": {\n \"url\": \"https://github.com/symfony/polyfill\",\n \"name\": \"symfony/polyfill\"\n }\n },\n \"autoload\": {\n \"files\": [\n \"bootstrap.php\"\n ],\n \"psr-4\": {\n \"Symfony\\\\Polyfill\\\\Intl\\\\Grapheme\\\\\": \"\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Nicolas Grekas\",\n \"email\": \"p@tchwork.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Symfony polyfill for intl's grapheme_* functions\",\n \"homepage\": \"https://symfony.com\",\n \"keywords\": [\n \"compatibility\",\n \"grapheme\",\n \"intl\",\n \"polyfill\",\n \"portable\",\n \"shim\"\n ],\n \"support\": {\n \"source\": \"https://github.com/symfony/polyfill-intl-grapheme/tree/v1.33.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://github.com/nicolas-grekas\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2025-06-27T09:58:17+00:00\"\n },\n {\n \"name\": \"symfony/polyfill-intl-idn\",\n \"version\": \"v1.33.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/polyfill-intl-idn.git\",\n \"reference\": \"9614ac4d8061dc257ecc64cba1b140873dce8ad3\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/9614ac4d8061dc257ecc64cba1b140873dce8ad3\",\n \"reference\": \"9614ac4d8061dc257ecc64cba1b140873dce8ad3\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=7.2\",\n \"symfony/polyfill-intl-normalizer\": \"^1.10\"\n },\n \"suggest\": {\n \"ext-intl\": \"For best performance\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"thanks\": {\n \"url\": \"https://github.com/symfony/polyfill\",\n \"name\": \"symfony/polyfill\"\n }\n },\n \"autoload\": {\n \"files\": [\n \"bootstrap.php\"\n ],\n \"psr-4\": {\n \"Symfony\\\\Polyfill\\\\Intl\\\\Idn\\\\\": \"\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Laurent Bassin\",\n \"email\": \"laurent@bassin.info\"\n },\n {\n \"name\": \"Trevor Rowbotham\",\n \"email\": \"trevor.rowbotham@pm.me\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions\",\n \"homepage\": \"https://symfony.com\",\n \"keywords\": [\n \"compatibility\",\n \"idn\",\n \"intl\",\n \"polyfill\",\n \"portable\",\n \"shim\"\n ],\n \"support\": {\n \"source\": \"https://github.com/symfony/polyfill-intl-idn/tree/v1.33.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://github.com/nicolas-grekas\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2024-09-10T14:38:51+00:00\"\n },\n {\n \"name\": \"symfony/polyfill-intl-normalizer\",\n \"version\": \"v1.33.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/polyfill-intl-normalizer.git\",\n \"reference\": \"3833d7255cc303546435cb650316bff708a1c75c\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/3833d7255cc303546435cb650316bff708a1c75c\",\n \"reference\": \"3833d7255cc303546435cb650316bff708a1c75c\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=7.2\"\n },\n \"suggest\": {\n \"ext-intl\": \"For best performance\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"thanks\": {\n \"url\": \"https://github.com/symfony/polyfill\",\n \"name\": \"symfony/polyfill\"\n }\n },\n \"autoload\": {\n \"files\": [\n \"bootstrap.php\"\n ],\n \"psr-4\": {\n \"Symfony\\\\Polyfill\\\\Intl\\\\Normalizer\\\\\": \"\"\n },\n \"classmap\": [\n \"Resources/stubs\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Nicolas Grekas\",\n \"email\": \"p@tchwork.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Symfony polyfill for intl's Normalizer class and related functions\",\n \"homepage\": \"https://symfony.com\",\n \"keywords\": [\n \"compatibility\",\n \"intl\",\n \"normalizer\",\n \"polyfill\",\n \"portable\",\n \"shim\"\n ],\n \"support\": {\n \"source\": \"https://github.com/symfony/polyfill-intl-normalizer/tree/v1.33.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://github.com/nicolas-grekas\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2024-09-09T11:45:10+00:00\"\n },\n {\n \"name\": \"symfony/polyfill-mbstring\",\n \"version\": \"v1.33.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/polyfill-mbstring.git\",\n \"reference\": \"6d857f4d76bd4b343eac26d6b539585d2bc56493\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/polyfill-mbstring/zipball/6d857f4d76bd4b343eac26d6b539585d2bc56493\",\n \"reference\": \"6d857f4d76bd4b343eac26d6b539585d2bc56493\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"ext-iconv\": \"*\",\n \"php\": \">=7.2\"\n },\n \"provide\": {\n \"ext-mbstring\": \"*\"\n },\n \"suggest\": {\n \"ext-mbstring\": \"For best performance\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"thanks\": {\n \"url\": \"https://github.com/symfony/polyfill\",\n \"name\": \"symfony/polyfill\"\n }\n },\n \"autoload\": {\n \"files\": [\n \"bootstrap.php\"\n ],\n \"psr-4\": {\n \"Symfony\\\\Polyfill\\\\Mbstring\\\\\": \"\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Nicolas Grekas\",\n \"email\": \"p@tchwork.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Symfony polyfill for the Mbstring extension\",\n \"homepage\": \"https://symfony.com\",\n \"keywords\": [\n \"compatibility\",\n \"mbstring\",\n \"polyfill\",\n \"portable\",\n \"shim\"\n ],\n \"support\": {\n \"source\": \"https://github.com/symfony/polyfill-mbstring/tree/v1.33.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://github.com/nicolas-grekas\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2024-12-23T08:48:59+00:00\"\n },\n {\n \"name\": \"symfony/polyfill-php73\",\n \"version\": \"v1.33.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/polyfill-php73.git\",\n \"reference\": \"0f68c03565dcaaf25a890667542e8bd75fe7e5bb\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/polyfill-php73/zipball/0f68c03565dcaaf25a890667542e8bd75fe7e5bb\",\n \"reference\": \"0f68c03565dcaaf25a890667542e8bd75fe7e5bb\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=7.2\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"thanks\": {\n \"url\": \"https://github.com/symfony/polyfill\",\n \"name\": \"symfony/polyfill\"\n }\n },\n \"autoload\": {\n \"files\": [\n \"bootstrap.php\"\n ],\n \"psr-4\": {\n \"Symfony\\\\Polyfill\\\\Php73\\\\\": \"\"\n },\n \"classmap\": [\n \"Resources/stubs\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Nicolas Grekas\",\n \"email\": \"p@tchwork.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions\",\n \"homepage\": \"https://symfony.com\",\n \"keywords\": [\n \"compatibility\",\n \"polyfill\",\n \"portable\",\n \"shim\"\n ],\n \"support\": {\n \"source\": \"https://github.com/symfony/polyfill-php73/tree/v1.33.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://github.com/nicolas-grekas\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2024-09-09T11:45:10+00:00\"\n },\n {\n \"name\": \"symfony/polyfill-php80\",\n \"version\": \"v1.33.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/polyfill-php80.git\",\n \"reference\": \"0cc9dd0f17f61d8131e7df6b84bd344899fe2608\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/polyfill-php80/zipball/0cc9dd0f17f61d8131e7df6b84bd344899fe2608\",\n \"reference\": \"0cc9dd0f17f61d8131e7df6b84bd344899fe2608\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=7.2\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"thanks\": {\n \"url\": \"https://github.com/symfony/polyfill\",\n \"name\": \"symfony/polyfill\"\n }\n },\n \"autoload\": {\n \"files\": [\n \"bootstrap.php\"\n ],\n \"psr-4\": {\n \"Symfony\\\\Polyfill\\\\Php80\\\\\": \"\"\n },\n \"classmap\": [\n \"Resources/stubs\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Ion Bazan\",\n \"email\": \"ion.bazan@gmail.com\"\n },\n {\n \"name\": \"Nicolas Grekas\",\n \"email\": \"p@tchwork.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions\",\n \"homepage\": \"https://symfony.com\",\n \"keywords\": [\n \"compatibility\",\n \"polyfill\",\n \"portable\",\n \"shim\"\n ],\n \"support\": {\n \"source\": \"https://github.com/symfony/polyfill-php80/tree/v1.33.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://github.com/nicolas-grekas\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2025-01-02T08:10:11+00:00\"\n },\n {\n \"name\": \"symfony/polyfill-php82\",\n \"version\": \"v1.33.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/polyfill-php82.git\",\n \"reference\": \"5d2ed36f7734637dacc025f179698031951b1692\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/polyfill-php82/zipball/5d2ed36f7734637dacc025f179698031951b1692\",\n \"reference\": \"5d2ed36f7734637dacc025f179698031951b1692\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=7.2\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"thanks\": {\n \"url\": \"https://github.com/symfony/polyfill\",\n \"name\": \"symfony/polyfill\"\n }\n },\n \"autoload\": {\n \"files\": [\n \"bootstrap.php\"\n ],\n \"psr-4\": {\n \"Symfony\\\\Polyfill\\\\Php82\\\\\": \"\"\n },\n \"classmap\": [\n \"Resources/stubs\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Nicolas Grekas\",\n \"email\": \"p@tchwork.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Symfony polyfill backporting some PHP 8.2+ features to lower PHP versions\",\n \"homepage\": \"https://symfony.com\",\n \"keywords\": [\n \"compatibility\",\n \"polyfill\",\n \"portable\",\n \"shim\"\n ],\n \"support\": {\n \"source\": \"https://github.com/symfony/polyfill-php82/tree/v1.33.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://github.com/nicolas-grekas\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2024-09-09T11:45:10+00:00\"\n },\n {\n \"name\": \"symfony/polyfill-php83\",\n \"version\": \"v1.33.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/polyfill-php83.git\",\n \"reference\": \"17f6f9a6b1735c0f163024d959f700cfbc5155e5\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/polyfill-php83/zipball/17f6f9a6b1735c0f163024d959f700cfbc5155e5\",\n \"reference\": \"17f6f9a6b1735c0f163024d959f700cfbc5155e5\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=7.2\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"thanks\": {\n \"url\": \"https://github.com/symfony/polyfill\",\n \"name\": \"symfony/polyfill\"\n }\n },\n \"autoload\": {\n \"files\": [\n \"bootstrap.php\"\n ],\n \"psr-4\": {\n \"Symfony\\\\Polyfill\\\\Php83\\\\\": \"\"\n },\n \"classmap\": [\n \"Resources/stubs\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Nicolas Grekas\",\n \"email\": \"p@tchwork.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Symfony polyfill backporting some PHP 8.3+ features to lower PHP versions\",\n \"homepage\": \"https://symfony.com\",\n \"keywords\": [\n \"compatibility\",\n \"polyfill\",\n \"portable\",\n \"shim\"\n ],\n \"support\": {\n \"source\": \"https://github.com/symfony/polyfill-php83/tree/v1.33.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://github.com/nicolas-grekas\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2025-07-08T02:45:35+00:00\"\n },\n {\n \"name\": \"symfony/polyfill-php84\",\n \"version\": \"v1.33.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/polyfill-php84.git\",\n \"reference\": \"d8ced4d875142b6a7426000426b8abc631d6b191\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/polyfill-php84/zipball/d8ced4d875142b6a7426000426b8abc631d6b191\",\n \"reference\": \"d8ced4d875142b6a7426000426b8abc631d6b191\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=7.2\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"thanks\": {\n \"url\": \"https://github.com/symfony/polyfill\",\n \"name\": \"symfony/polyfill\"\n }\n },\n \"autoload\": {\n \"files\": [\n \"bootstrap.php\"\n ],\n \"psr-4\": {\n \"Symfony\\\\Polyfill\\\\Php84\\\\\": \"\"\n },\n \"classmap\": [\n \"Resources/stubs\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Nicolas Grekas\",\n \"email\": \"p@tchwork.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Symfony polyfill backporting some PHP 8.4+ features to lower PHP versions\",\n \"homepage\": \"https://symfony.com\",\n \"keywords\": [\n \"compatibility\",\n \"polyfill\",\n \"portable\",\n \"shim\"\n ],\n \"support\": {\n \"source\": \"https://github.com/symfony/polyfill-php84/tree/v1.33.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://github.com/nicolas-grekas\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2025-06-24T13:30:11+00:00\"\n },\n {\n \"name\": \"symfony/polyfill-php85\",\n \"version\": \"v1.33.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/polyfill-php85.git\",\n \"reference\": \"d4e5fcd4ab3d998ab16c0db48e6cbb9a01993f91\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/polyfill-php85/zipball/d4e5fcd4ab3d998ab16c0db48e6cbb9a01993f91\",\n \"reference\": \"d4e5fcd4ab3d998ab16c0db48e6cbb9a01993f91\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=7.2\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"thanks\": {\n \"url\": \"https://github.com/symfony/polyfill\",\n \"name\": \"symfony/polyfill\"\n }\n },\n \"autoload\": {\n \"files\": [\n \"bootstrap.php\"\n ],\n \"psr-4\": {\n \"Symfony\\\\Polyfill\\\\Php85\\\\\": \"\"\n },\n \"classmap\": [\n \"Resources/stubs\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Nicolas Grekas\",\n \"email\": \"p@tchwork.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Symfony polyfill backporting some PHP 8.5+ features to lower PHP versions\",\n \"homepage\": \"https://symfony.com\",\n \"keywords\": [\n \"compatibility\",\n \"polyfill\",\n \"portable\",\n \"shim\"\n ],\n \"support\": {\n \"source\": \"https://github.com/symfony/polyfill-php85/tree/v1.33.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://github.com/nicolas-grekas\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2025-06-23T16:12:55+00:00\"\n },\n {\n \"name\": \"symfony/polyfill-uuid\",\n \"version\": \"v1.33.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/polyfill-uuid.git\",\n \"reference\": \"21533be36c24be3f4b1669c4725c7d1d2bab4ae2\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/polyfill-uuid/zipball/21533be36c24be3f4b1669c4725c7d1d2bab4ae2\",\n \"reference\": \"21533be36c24be3f4b1669c4725c7d1d2bab4ae2\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=7.2\"\n },\n \"provide\": {\n \"ext-uuid\": \"*\"\n },\n \"suggest\": {\n \"ext-uuid\": \"For best performance\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"thanks\": {\n \"url\": \"https://github.com/symfony/polyfill\",\n \"name\": \"symfony/polyfill\"\n }\n },\n \"autoload\": {\n \"files\": [\n \"bootstrap.php\"\n ],\n \"psr-4\": {\n \"Symfony\\\\Polyfill\\\\Uuid\\\\\": \"\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Grégoire Pineau\",\n \"email\": \"lyrixx@lyrixx.info\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Symfony polyfill for uuid functions\",\n \"homepage\": \"https://symfony.com\",\n \"keywords\": [\n \"compatibility\",\n \"polyfill\",\n \"portable\",\n \"uuid\"\n ],\n \"support\": {\n \"source\": \"https://github.com/symfony/polyfill-uuid/tree/v1.33.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://github.com/nicolas-grekas\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2024-09-09T11:45:10+00:00\"\n },\n {\n \"name\": \"symfony/postmark-mailer\",\n \"version\": \"v7.3.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/postmark-mailer.git\",\n \"reference\": \"71ac001f8bc2ac36cc0bbea3fd6f4a4087d0cec0\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/postmark-mailer/zipball/71ac001f8bc2ac36cc0bbea3fd6f4a4087d0cec0\",\n \"reference\": \"71ac001f8bc2ac36cc0bbea3fd6f4a4087d0cec0\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.2\",\n \"psr/event-dispatcher\": \"^1\",\n \"symfony/mailer\": \"^7.2\"\n },\n \"conflict\": {\n \"symfony/http-foundation\": \"<6.4\"\n },\n \"require-dev\": {\n \"symfony/http-client\": \"^6.4|^7.0\",\n \"symfony/webhook\": \"^6.4|^7.0\"\n },\n \"type\": \"symfony-mailer-bridge\",\n \"autoload\": {\n \"psr-4\": {\n \"Symfony\\\\Component\\\\Mailer\\\\Bridge\\\\Postmark\\\\\": \"\"\n },\n \"exclude-from-classmap\": [\n \"/Tests/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Fabien Potencier\",\n \"email\": \"fabien@symfony.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Symfony Postmark Mailer Bridge\",\n \"homepage\": \"https://symfony.com\",\n \"support\": {\n \"source\": \"https://github.com/symfony/postmark-mailer/tree/v7.3.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2025-04-30T07:52:47+00:00\"\n },\n {\n \"name\": \"symfony/process\",\n \"version\": \"v7.4.5\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/process.git\",\n \"reference\": \"608476f4604102976d687c483ac63a79ba18cc97\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/process/zipball/608476f4604102976d687c483ac63a79ba18cc97\",\n \"reference\": \"608476f4604102976d687c483ac63a79ba18cc97\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.2\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Symfony\\\\Component\\\\Process\\\\\": \"\"\n },\n \"exclude-from-classmap\": [\n \"/Tests/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Fabien Potencier\",\n \"email\": \"fabien@symfony.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Executes commands in sub-processes\",\n \"homepage\": \"https://symfony.com\",\n \"support\": {\n \"source\": \"https://github.com/symfony/process/tree/v7.4.5\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://github.com/nicolas-grekas\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2026-01-26T15:07:59+00:00\"\n },\n {\n \"name\": \"symfony/property-access\",\n \"version\": \"v7.3.3\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/property-access.git\",\n \"reference\": \"4a4389e5c8bd1d0320d80a23caa6a1ac71cb81a7\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/property-access/zipball/4a4389e5c8bd1d0320d80a23caa6a1ac71cb81a7\",\n \"reference\": \"4a4389e5c8bd1d0320d80a23caa6a1ac71cb81a7\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.2\",\n \"symfony/property-info\": \"^6.4|^7.0\"\n },\n \"require-dev\": {\n \"symfony/cache\": \"^6.4|^7.0\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Symfony\\\\Component\\\\PropertyAccess\\\\\": \"\"\n },\n \"exclude-from-classmap\": [\n \"/Tests/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Fabien Potencier\",\n \"email\": \"fabien@symfony.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Provides functions to read and write from/to an object or array using a simple string notation\",\n \"homepage\": \"https://symfony.com\",\n \"keywords\": [\n \"access\",\n \"array\",\n \"extraction\",\n \"index\",\n \"injection\",\n \"object\",\n \"property\",\n \"property-path\",\n \"reflection\"\n ],\n \"support\": {\n \"source\": \"https://github.com/symfony/property-access/tree/v7.3.3\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://github.com/nicolas-grekas\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2025-08-04T15:15:28+00:00\"\n },\n {\n \"name\": \"symfony/property-info\",\n \"version\": \"v7.3.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/property-info.git\",\n \"reference\": \"90586acbf2a6dd13bee4f09f09111c8bd4773970\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/property-info/zipball/90586acbf2a6dd13bee4f09f09111c8bd4773970\",\n \"reference\": \"90586acbf2a6dd13bee4f09f09111c8bd4773970\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.2\",\n \"symfony/deprecation-contracts\": \"^2.5|^3\",\n \"symfony/string\": \"^6.4|^7.0\",\n \"symfony/type-info\": \"~7.2.8|^7.3.1\"\n },\n \"conflict\": {\n \"phpdocumentor/reflection-docblock\": \"<5.2\",\n \"phpdocumentor/type-resolver\": \"<1.5.1\",\n \"symfony/cache\": \"<6.4\",\n \"symfony/dependency-injection\": \"<6.4\",\n \"symfony/serializer\": \"<6.4\"\n },\n \"require-dev\": {\n \"phpdocumentor/reflection-docblock\": \"^5.2\",\n \"phpstan/phpdoc-parser\": \"^1.0|^2.0\",\n \"symfony/cache\": \"^6.4|^7.0\",\n \"symfony/dependency-injection\": \"^6.4|^7.0\",\n \"symfony/serializer\": \"^6.4|^7.0\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Symfony\\\\Component\\\\PropertyInfo\\\\\": \"\"\n },\n \"exclude-from-classmap\": [\n \"/Tests/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Kévin Dunglas\",\n \"email\": \"dunglas@gmail.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Extracts information about PHP class' properties using metadata of popular sources\",\n \"homepage\": \"https://symfony.com\",\n \"keywords\": [\n \"doctrine\",\n \"phpdoc\",\n \"property\",\n \"symfony\",\n \"type\",\n \"validator\"\n ],\n \"support\": {\n \"source\": \"https://github.com/symfony/property-info/tree/v7.3.1\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2025-06-27T19:55:54+00:00\"\n },\n {\n \"name\": \"symfony/psr-http-message-bridge\",\n \"version\": \"v7.4.4\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/psr-http-message-bridge.git\",\n \"reference\": \"929ffe10bbfbb92e711ac3818d416f9daffee067\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/psr-http-message-bridge/zipball/929ffe10bbfbb92e711ac3818d416f9daffee067\",\n \"reference\": \"929ffe10bbfbb92e711ac3818d416f9daffee067\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.2\",\n \"psr/http-message\": \"^1.0|^2.0\",\n \"symfony/http-foundation\": \"^6.4|^7.0|^8.0\"\n },\n \"conflict\": {\n \"php-http/discovery\": \"<1.15\",\n \"symfony/http-kernel\": \"<6.4\"\n },\n \"require-dev\": {\n \"nyholm/psr7\": \"^1.1\",\n \"php-http/discovery\": \"^1.15\",\n \"psr/log\": \"^1.1.4|^2|^3\",\n \"symfony/browser-kit\": \"^6.4|^7.0|^8.0\",\n \"symfony/config\": \"^6.4|^7.0|^8.0\",\n \"symfony/event-dispatcher\": \"^6.4|^7.0|^8.0\",\n \"symfony/framework-bundle\": \"^6.4.13|^7.1.6|^8.0\",\n \"symfony/http-kernel\": \"^6.4.13|^7.1.6|^8.0\",\n \"symfony/runtime\": \"^6.4.13|^7.1.6|^8.0\"\n },\n \"type\": \"symfony-bridge\",\n \"autoload\": {\n \"psr-4\": {\n \"Symfony\\\\Bridge\\\\PsrHttpMessage\\\\\": \"\"\n },\n \"exclude-from-classmap\": [\n \"/Tests/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Fabien Potencier\",\n \"email\": \"fabien@symfony.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"PSR HTTP message bridge\",\n \"homepage\": \"https://symfony.com\",\n \"keywords\": [\n \"http\",\n \"http-message\",\n \"psr-17\",\n \"psr-7\"\n ],\n \"support\": {\n \"source\": \"https://github.com/symfony/psr-http-message-bridge/tree/v7.4.4\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://github.com/nicolas-grekas\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2026-01-03T23:30:35+00:00\"\n },\n {\n \"name\": \"symfony/routing\",\n \"version\": \"v7.4.6\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/routing.git\",\n \"reference\": \"238d749c56b804b31a9bf3e26519d93b65a60938\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/routing/zipball/238d749c56b804b31a9bf3e26519d93b65a60938\",\n \"reference\": \"238d749c56b804b31a9bf3e26519d93b65a60938\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.2\",\n \"symfony/deprecation-contracts\": \"^2.5|^3\"\n },\n \"conflict\": {\n \"symfony/config\": \"<6.4\",\n \"symfony/dependency-injection\": \"<6.4\",\n \"symfony/yaml\": \"<6.4\"\n },\n \"require-dev\": {\n \"psr/log\": \"^1|^2|^3\",\n \"symfony/config\": \"^6.4|^7.0|^8.0\",\n \"symfony/dependency-injection\": \"^6.4|^7.0|^8.0\",\n \"symfony/expression-language\": \"^6.4|^7.0|^8.0\",\n \"symfony/http-foundation\": \"^6.4|^7.0|^8.0\",\n \"symfony/yaml\": \"^6.4|^7.0|^8.0\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Symfony\\\\Component\\\\Routing\\\\\": \"\"\n },\n \"exclude-from-classmap\": [\n \"/Tests/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Fabien Potencier\",\n \"email\": \"fabien@symfony.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Maps an HTTP request to a set of configuration variables\",\n \"homepage\": \"https://symfony.com\",\n \"keywords\": [\n \"router\",\n \"routing\",\n \"uri\",\n \"url\"\n ],\n \"support\": {\n \"source\": \"https://github.com/symfony/routing/tree/v7.4.6\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://github.com/nicolas-grekas\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2026-02-25T16:50:00+00:00\"\n },\n {\n \"name\": \"symfony/serializer\",\n \"version\": \"v7.3.3\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/serializer.git\",\n \"reference\": \"5608b04d8daaf29432d76ecc618b0fac169c2dfb\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/serializer/zipball/5608b04d8daaf29432d76ecc618b0fac169c2dfb\",\n \"reference\": \"5608b04d8daaf29432d76ecc618b0fac169c2dfb\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.2\",\n \"symfony/deprecation-contracts\": \"^2.5|^3\",\n \"symfony/polyfill-ctype\": \"~1.8\",\n \"symfony/polyfill-php84\": \"^1.30\"\n },\n \"conflict\": {\n \"phpdocumentor/reflection-docblock\": \"<3.2.2\",\n \"phpdocumentor/type-resolver\": \"<1.4.0\",\n \"symfony/dependency-injection\": \"<6.4\",\n \"symfony/property-access\": \"<6.4\",\n \"symfony/property-info\": \"<6.4\",\n \"symfony/uid\": \"<6.4\",\n \"symfony/validator\": \"<6.4\",\n \"symfony/yaml\": \"<6.4\"\n },\n \"require-dev\": {\n \"phpdocumentor/reflection-docblock\": \"^3.2|^4.0|^5.0\",\n \"phpstan/phpdoc-parser\": \"^1.0|^2.0\",\n \"seld/jsonlint\": \"^1.10\",\n \"symfony/cache\": \"^6.4|^7.0\",\n \"symfony/config\": \"^6.4|^7.0\",\n \"symfony/console\": \"^6.4|^7.0\",\n \"symfony/dependency-injection\": \"^7.2\",\n \"symfony/error-handler\": \"^6.4|^7.0\",\n \"symfony/filesystem\": \"^6.4|^7.0\",\n \"symfony/form\": \"^6.4|^7.0\",\n \"symfony/http-foundation\": \"^6.4|^7.0\",\n \"symfony/http-kernel\": \"^6.4|^7.0\",\n \"symfony/messenger\": \"^6.4|^7.0\",\n \"symfony/mime\": \"^6.4|^7.0\",\n \"symfony/property-access\": \"^6.4|^7.0\",\n \"symfony/property-info\": \"^6.4|^7.0\",\n \"symfony/translation-contracts\": \"^2.5|^3\",\n \"symfony/type-info\": \"^7.1.8\",\n \"symfony/uid\": \"^6.4|^7.0\",\n \"symfony/validator\": \"^6.4|^7.0\",\n \"symfony/var-dumper\": \"^6.4|^7.0\",\n \"symfony/var-exporter\": \"^6.4|^7.0\",\n \"symfony/yaml\": \"^6.4|^7.0\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Symfony\\\\Component\\\\Serializer\\\\\": \"\"\n },\n \"exclude-from-classmap\": [\n \"/Tests/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Fabien Potencier\",\n \"email\": \"fabien@symfony.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Handles serializing and deserializing data structures, including object graphs, into array structures or other formats like XML and JSON.\",\n \"homepage\": \"https://symfony.com\",\n \"support\": {\n \"source\": \"https://github.com/symfony/serializer/tree/v7.3.3\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://github.com/nicolas-grekas\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2025-08-27T11:34:33+00:00\"\n },\n {\n \"name\": \"symfony/service-contracts\",\n \"version\": \"v3.6.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/service-contracts.git\",\n \"reference\": \"45112560a3ba2d715666a509a0bc9521d10b6c43\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/service-contracts/zipball/45112560a3ba2d715666a509a0bc9521d10b6c43\",\n \"reference\": \"45112560a3ba2d715666a509a0bc9521d10b6c43\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.1\",\n \"psr/container\": \"^1.1|^2.0\",\n \"symfony/deprecation-contracts\": \"^2.5|^3\"\n },\n \"conflict\": {\n \"ext-psr\": \"<1.1|>=2\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"thanks\": {\n \"url\": \"https://github.com/symfony/contracts\",\n \"name\": \"symfony/contracts\"\n },\n \"branch-alias\": {\n \"dev-main\": \"3.6-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Symfony\\\\Contracts\\\\Service\\\\\": \"\"\n },\n \"exclude-from-classmap\": [\n \"/Test/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Nicolas Grekas\",\n \"email\": \"p@tchwork.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Generic abstractions related to writing services\",\n \"homepage\": \"https://symfony.com\",\n \"keywords\": [\n \"abstractions\",\n \"contracts\",\n \"decoupling\",\n \"interfaces\",\n \"interoperability\",\n \"standards\"\n ],\n \"support\": {\n \"source\": \"https://github.com/symfony/service-contracts/tree/v3.6.1\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://github.com/nicolas-grekas\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2025-07-15T11:30:57+00:00\"\n },\n {\n \"name\": \"symfony/string\",\n \"version\": \"v7.4.6\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/string.git\",\n \"reference\": \"9f209231affa85aa930a5e46e6eb03381424b30b\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/string/zipball/9f209231affa85aa930a5e46e6eb03381424b30b\",\n \"reference\": \"9f209231affa85aa930a5e46e6eb03381424b30b\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.2\",\n \"symfony/deprecation-contracts\": \"^2.5|^3.0\",\n \"symfony/polyfill-ctype\": \"~1.8\",\n \"symfony/polyfill-intl-grapheme\": \"~1.33\",\n \"symfony/polyfill-intl-normalizer\": \"~1.0\",\n \"symfony/polyfill-mbstring\": \"~1.0\"\n },\n \"conflict\": {\n \"symfony/translation-contracts\": \"<2.5\"\n },\n \"require-dev\": {\n \"symfony/emoji\": \"^7.1|^8.0\",\n \"symfony/http-client\": \"^6.4|^7.0|^8.0\",\n \"symfony/intl\": \"^6.4|^7.0|^8.0\",\n \"symfony/translation-contracts\": \"^2.5|^3.0\",\n \"symfony/var-exporter\": \"^6.4|^7.0|^8.0\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"files\": [\n \"Resources/functions.php\"\n ],\n \"psr-4\": {\n \"Symfony\\\\Component\\\\String\\\\\": \"\"\n },\n \"exclude-from-classmap\": [\n \"/Tests/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Nicolas Grekas\",\n \"email\": \"p@tchwork.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way\",\n \"homepage\": \"https://symfony.com\",\n \"keywords\": [\n \"grapheme\",\n \"i18n\",\n \"string\",\n \"unicode\",\n \"utf-8\",\n \"utf8\"\n ],\n \"support\": {\n \"source\": \"https://github.com/symfony/string/tree/v7.4.6\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://github.com/nicolas-grekas\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2026-02-09T09:33:46+00:00\"\n },\n {\n \"name\": \"symfony/translation\",\n \"version\": \"v7.4.6\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/translation.git\",\n \"reference\": \"1888cf064399868af3784b9e043240f1d89d25ce\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/translation/zipball/1888cf064399868af3784b9e043240f1d89d25ce\",\n \"reference\": \"1888cf064399868af3784b9e043240f1d89d25ce\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.2\",\n \"symfony/deprecation-contracts\": \"^2.5|^3\",\n \"symfony/polyfill-mbstring\": \"~1.0\",\n \"symfony/translation-contracts\": \"^2.5.3|^3.3\"\n },\n \"conflict\": {\n \"nikic/php-parser\": \"<5.0\",\n \"symfony/config\": \"<6.4\",\n \"symfony/console\": \"<6.4\",\n \"symfony/dependency-injection\": \"<6.4\",\n \"symfony/http-client-contracts\": \"<2.5\",\n \"symfony/http-kernel\": \"<6.4\",\n \"symfony/service-contracts\": \"<2.5\",\n \"symfony/twig-bundle\": \"<6.4\",\n \"symfony/yaml\": \"<6.4\"\n },\n \"provide\": {\n \"symfony/translation-implementation\": \"2.3|3.0\"\n },\n \"require-dev\": {\n \"nikic/php-parser\": \"^5.0\",\n \"psr/log\": \"^1|^2|^3\",\n \"symfony/config\": \"^6.4|^7.0|^8.0\",\n \"symfony/console\": \"^6.4|^7.0|^8.0\",\n \"symfony/dependency-injection\": \"^6.4|^7.0|^8.0\",\n \"symfony/finder\": \"^6.4|^7.0|^8.0\",\n \"symfony/http-client-contracts\": \"^2.5|^3.0\",\n \"symfony/http-kernel\": \"^6.4|^7.0|^8.0\",\n \"symfony/intl\": \"^6.4|^7.0|^8.0\",\n \"symfony/polyfill-intl-icu\": \"^1.21\",\n \"symfony/routing\": \"^6.4|^7.0|^8.0\",\n \"symfony/service-contracts\": \"^2.5|^3\",\n \"symfony/yaml\": \"^6.4|^7.0|^8.0\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"files\": [\n \"Resources/functions.php\"\n ],\n \"psr-4\": {\n \"Symfony\\\\Component\\\\Translation\\\\\": \"\"\n },\n \"exclude-from-classmap\": [\n \"/Tests/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Fabien Potencier\",\n \"email\": \"fabien@symfony.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Provides tools to internationalize your application\",\n \"homepage\": \"https://symfony.com\",\n \"support\": {\n \"source\": \"https://github.com/symfony/translation/tree/v7.4.6\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://github.com/nicolas-grekas\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2026-02-17T07:53:42+00:00\"\n },\n {\n \"name\": \"symfony/translation-contracts\",\n \"version\": \"v3.6.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/translation-contracts.git\",\n \"reference\": \"65a8bc82080447fae78373aa10f8d13b38338977\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/translation-contracts/zipball/65a8bc82080447fae78373aa10f8d13b38338977\",\n \"reference\": \"65a8bc82080447fae78373aa10f8d13b38338977\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.1\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"thanks\": {\n \"url\": \"https://github.com/symfony/contracts\",\n \"name\": \"symfony/contracts\"\n },\n \"branch-alias\": {\n \"dev-main\": \"3.6-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Symfony\\\\Contracts\\\\Translation\\\\\": \"\"\n },\n \"exclude-from-classmap\": [\n \"/Test/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Nicolas Grekas\",\n \"email\": \"p@tchwork.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Generic abstractions related to translation\",\n \"homepage\": \"https://symfony.com\",\n \"keywords\": [\n \"abstractions\",\n \"contracts\",\n \"decoupling\",\n \"interfaces\",\n \"interoperability\",\n \"standards\"\n ],\n \"support\": {\n \"source\": \"https://github.com/symfony/translation-contracts/tree/v3.6.1\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://github.com/nicolas-grekas\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2025-07-15T13:41:35+00:00\"\n },\n {\n \"name\": \"symfony/type-info\",\n \"version\": \"v7.3.3\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/type-info.git\",\n \"reference\": \"aa64b58ed04517d4d730202dd035895743c23273\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/type-info/zipball/aa64b58ed04517d4d730202dd035895743c23273\",\n \"reference\": \"aa64b58ed04517d4d730202dd035895743c23273\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.2\",\n \"psr/container\": \"^1.1|^2.0\",\n \"symfony/deprecation-contracts\": \"^2.5|^3\"\n },\n \"conflict\": {\n \"phpstan/phpdoc-parser\": \"<1.30\"\n },\n \"require-dev\": {\n \"phpstan/phpdoc-parser\": \"^1.30|^2.0\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Symfony\\\\Component\\\\TypeInfo\\\\\": \"\"\n },\n \"exclude-from-classmap\": [\n \"/Tests/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Mathias Arlaud\",\n \"email\": \"mathias.arlaud@gmail.com\"\n },\n {\n \"name\": \"Baptiste LEDUC\",\n \"email\": \"baptiste.leduc@gmail.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Extracts PHP types information.\",\n \"homepage\": \"https://symfony.com\",\n \"keywords\": [\n \"PHPStan\",\n \"phpdoc\",\n \"symfony\",\n \"type\"\n ],\n \"support\": {\n \"source\": \"https://github.com/symfony/type-info/tree/v7.3.3\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://github.com/nicolas-grekas\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2025-08-28T09:38:04+00:00\"\n },\n {\n \"name\": \"symfony/uid\",\n \"version\": \"v7.4.4\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/uid.git\",\n \"reference\": \"7719ce8aba76be93dfe249192f1fbfa52c588e36\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/uid/zipball/7719ce8aba76be93dfe249192f1fbfa52c588e36\",\n \"reference\": \"7719ce8aba76be93dfe249192f1fbfa52c588e36\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.2\",\n \"symfony/polyfill-uuid\": \"^1.15\"\n },\n \"require-dev\": {\n \"symfony/console\": \"^6.4|^7.0|^8.0\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Symfony\\\\Component\\\\Uid\\\\\": \"\"\n },\n \"exclude-from-classmap\": [\n \"/Tests/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Grégoire Pineau\",\n \"email\": \"lyrixx@lyrixx.info\"\n },\n {\n \"name\": \"Nicolas Grekas\",\n \"email\": \"p@tchwork.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Provides an object-oriented API to generate and represent UIDs\",\n \"homepage\": \"https://symfony.com\",\n \"keywords\": [\n \"UID\",\n \"ulid\",\n \"uuid\"\n ],\n \"support\": {\n \"source\": \"https://github.com/symfony/uid/tree/v7.4.4\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://github.com/nicolas-grekas\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2026-01-03T23:30:35+00:00\"\n },\n {\n \"name\": \"symfony/var-dumper\",\n \"version\": \"v7.4.6\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/var-dumper.git\",\n \"reference\": \"045321c440ac18347b136c63d2e9bf28a2dc0291\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/var-dumper/zipball/045321c440ac18347b136c63d2e9bf28a2dc0291\",\n \"reference\": \"045321c440ac18347b136c63d2e9bf28a2dc0291\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.2\",\n \"symfony/deprecation-contracts\": \"^2.5|^3\",\n \"symfony/polyfill-mbstring\": \"~1.0\"\n },\n \"conflict\": {\n \"symfony/console\": \"<6.4\"\n },\n \"require-dev\": {\n \"symfony/console\": \"^6.4|^7.0|^8.0\",\n \"symfony/http-kernel\": \"^6.4|^7.0|^8.0\",\n \"symfony/process\": \"^6.4|^7.0|^8.0\",\n \"symfony/uid\": \"^6.4|^7.0|^8.0\",\n \"twig/twig\": \"^3.12\"\n },\n \"bin\": [\n \"Resources/bin/var-dump-server\"\n ],\n \"type\": \"library\",\n \"autoload\": {\n \"files\": [\n \"Resources/functions/dump.php\"\n ],\n \"psr-4\": {\n \"Symfony\\\\Component\\\\VarDumper\\\\\": \"\"\n },\n \"exclude-from-classmap\": [\n \"/Tests/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Nicolas Grekas\",\n \"email\": \"p@tchwork.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Provides mechanisms for walking through any arbitrary PHP variable\",\n \"homepage\": \"https://symfony.com\",\n \"keywords\": [\n \"debug\",\n \"dump\"\n ],\n \"support\": {\n \"source\": \"https://github.com/symfony/var-dumper/tree/v7.4.6\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://github.com/nicolas-grekas\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2026-02-15T10:53:20+00:00\"\n },\n {\n \"name\": \"symfony/var-exporter\",\n \"version\": \"v7.3.3\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/var-exporter.git\",\n \"reference\": \"d4dfcd2a822cbedd7612eb6fbd260e46f87b7137\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/var-exporter/zipball/d4dfcd2a822cbedd7612eb6fbd260e46f87b7137\",\n \"reference\": \"d4dfcd2a822cbedd7612eb6fbd260e46f87b7137\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.2\",\n \"symfony/deprecation-contracts\": \"^2.5|^3\"\n },\n \"require-dev\": {\n \"symfony/property-access\": \"^6.4|^7.0\",\n \"symfony/serializer\": \"^6.4|^7.0\",\n \"symfony/var-dumper\": \"^6.4|^7.0\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Symfony\\\\Component\\\\VarExporter\\\\\": \"\"\n },\n \"exclude-from-classmap\": [\n \"/Tests/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Nicolas Grekas\",\n \"email\": \"p@tchwork.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Allows exporting any serializable PHP data structure to plain PHP code\",\n \"homepage\": \"https://symfony.com\",\n \"keywords\": [\n \"clone\",\n \"construct\",\n \"export\",\n \"hydrate\",\n \"instantiate\",\n \"lazy-loading\",\n \"proxy\",\n \"serialize\"\n ],\n \"support\": {\n \"source\": \"https://github.com/symfony/var-exporter/tree/v7.3.3\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://github.com/nicolas-grekas\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2025-08-18T13:10:53+00:00\"\n },\n {\n \"name\": \"symfony/workflow\",\n \"version\": \"v7.3.2\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/workflow.git\",\n \"reference\": \"3d45024478161e563264a97895d9be5e6d7fb152\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/workflow/zipball/3d45024478161e563264a97895d9be5e6d7fb152\",\n \"reference\": \"3d45024478161e563264a97895d9be5e6d7fb152\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.2\",\n \"symfony/deprecation-contracts\": \"2.5|^3\"\n },\n \"conflict\": {\n \"symfony/event-dispatcher\": \"<6.4\"\n },\n \"require-dev\": {\n \"psr/log\": \"^1|^2|^3\",\n \"symfony/config\": \"^6.4|^7.0\",\n \"symfony/dependency-injection\": \"^6.4|^7.0\",\n \"symfony/error-handler\": \"^6.4|^7.0\",\n \"symfony/event-dispatcher\": \"^6.4|^7.0\",\n \"symfony/expression-language\": \"^6.4|^7.0\",\n \"symfony/http-kernel\": \"^6.4|^7.0\",\n \"symfony/security-core\": \"^6.4|^7.0\",\n \"symfony/stopwatch\": \"^6.4|^7.0\",\n \"symfony/validator\": \"^6.4|^7.0\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Symfony\\\\Component\\\\Workflow\\\\\": \"\"\n },\n \"exclude-from-classmap\": [\n \"/Tests/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Fabien Potencier\",\n \"email\": \"fabien@symfony.com\"\n },\n {\n \"name\": \"Grégoire Pineau\",\n \"email\": \"lyrixx@lyrixx.info\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Provides tools for managing a workflow or finite state machine\",\n \"homepage\": \"https://symfony.com\",\n \"keywords\": [\n \"petrinet\",\n \"place\",\n \"state\",\n \"statemachine\",\n \"transition\",\n \"workflow\"\n ],\n \"support\": {\n \"source\": \"https://github.com/symfony/workflow/tree/v7.3.2\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://github.com/nicolas-grekas\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2025-07-15T17:58:03+00:00\"\n },\n {\n \"name\": \"symfony/yaml\",\n \"version\": \"v7.3.3\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/yaml.git\",\n \"reference\": \"d4f4a66866fe2451f61296924767280ab5732d9d\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/yaml/zipball/d4f4a66866fe2451f61296924767280ab5732d9d\",\n \"reference\": \"d4f4a66866fe2451f61296924767280ab5732d9d\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.2\",\n \"symfony/deprecation-contracts\": \"^2.5|^3.0\",\n \"symfony/polyfill-ctype\": \"^1.8\"\n },\n \"conflict\": {\n \"symfony/console\": \"<6.4\"\n },\n \"require-dev\": {\n \"symfony/console\": \"^6.4|^7.0\"\n },\n \"bin\": [\n \"Resources/bin/yaml-lint\"\n ],\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Symfony\\\\Component\\\\Yaml\\\\\": \"\"\n },\n \"exclude-from-classmap\": [\n \"/Tests/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Fabien Potencier\",\n \"email\": \"fabien@symfony.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Loads and dumps YAML files\",\n \"homepage\": \"https://symfony.com\",\n \"support\": {\n \"source\": \"https://github.com/symfony/yaml/tree/v7.3.3\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://github.com/nicolas-grekas\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2025-08-27T11:34:33+00:00\"\n },\n {\n \"name\": \"tbachert/spi\",\n \"version\": \"v1.0.5\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/Nevay/spi.git\",\n \"reference\": \"e7078767866d0a9e0f91d3f9d42a832df5e39002\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/Nevay/spi/zipball/e7078767866d0a9e0f91d3f9d42a832df5e39002\",\n \"reference\": \"e7078767866d0a9e0f91d3f9d42a832df5e39002\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"composer-plugin-api\": \"^2.0\",\n \"composer/semver\": \"^1.0 || ^2.0 || ^3.0\",\n \"php\": \"^8.1\"\n },\n \"require-dev\": {\n \"composer/composer\": \"^2.0\",\n \"infection/infection\": \"^0.27.9\",\n \"phpunit/phpunit\": \"^10.5\",\n \"psalm/phar\": \"^5.18\"\n },\n \"type\": \"composer-plugin\",\n \"extra\": {\n \"class\": \"Nevay\\\\SPI\\\\Composer\\\\Plugin\",\n \"branch-alias\": {\n \"dev-main\": \"1.0.x-dev\"\n },\n \"plugin-optional\": true\n },\n \"autoload\": {\n \"psr-4\": {\n \"Nevay\\\\SPI\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"Apache-2.0\"\n ],\n \"description\": \"Service provider loading facility\",\n \"keywords\": [\n \"service provider\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/Nevay/spi/issues\",\n \"source\": \"https://github.com/Nevay/spi/tree/v1.0.5\"\n },\n \"time\": \"2025-06-29T15:42:06+00:00\"\n },\n {\n \"name\": \"tecnickcom/tcpdf\",\n \"version\": \"6.11.2\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/tecnickcom/TCPDF.git\",\n \"reference\": \"e1e2ade18e574e963473f53271591edd8c0033ec\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/tecnickcom/TCPDF/zipball/e1e2ade18e574e963473f53271591edd8c0033ec\",\n \"reference\": \"e1e2ade18e574e963473f53271591edd8c0033ec\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"ext-curl\": \"*\",\n \"php\": \">=7.1.0\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"classmap\": [\n \"config\",\n \"include\",\n \"tcpdf.php\",\n \"tcpdf_barcodes_1d.php\",\n \"tcpdf_barcodes_2d.php\",\n \"include/tcpdf_colors.php\",\n \"include/tcpdf_filters.php\",\n \"include/tcpdf_font_data.php\",\n \"include/tcpdf_fonts.php\",\n \"include/tcpdf_images.php\",\n \"include/tcpdf_static.php\",\n \"include/barcodes/datamatrix.php\",\n \"include/barcodes/pdf417.php\",\n \"include/barcodes/qrcode.php\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"LGPL-3.0-or-later\"\n ],\n \"authors\": [\n {\n \"name\": \"Nicola Asuni\",\n \"email\": \"info@tecnick.com\",\n \"role\": \"lead\"\n }\n ],\n \"description\": \"TCPDF is a PHP class for generating PDF documents and barcodes.\",\n \"homepage\": \"http://www.tcpdf.org/\",\n \"keywords\": [\n \"PDFD32000-2008\",\n \"TCPDF\",\n \"barcodes\",\n \"datamatrix\",\n \"pdf\",\n \"pdf417\",\n \"qrcode\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/tecnickcom/TCPDF/issues\",\n \"source\": \"https://github.com/tecnickcom/TCPDF/tree/6.11.2\"\n },\n \"funding\": [\n {\n \"url\": \"https://www.paypal.com/donate/?hosted_button_id=NZUEC5XS8MFBJ\",\n \"type\": \"custom\"\n }\n ],\n \"time\": \"2026-03-03T08:58:10+00:00\"\n },\n {\n \"name\": \"thenetworg/oauth2-azure\",\n \"version\": \"dev-master\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/TheNetworg/oauth2-azure.git\",\n \"reference\": \"06f1aa023e18cc3ea80df6410c7c2dc5502a3655\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/TheNetworg/oauth2-azure/zipball/06f1aa023e18cc3ea80df6410c7c2dc5502a3655\",\n \"reference\": \"06f1aa023e18cc3ea80df6410c7c2dc5502a3655\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"ext-json\": \"*\",\n \"ext-openssl\": \"*\",\n \"firebase/php-jwt\": \"~3.0||~4.0||~5.0||~6.0||~7.0\",\n \"league/oauth2-client\": \"~2.0\",\n \"php\": \"^7.1|^8.0\"\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \"^9.6\"\n },\n \"default-branch\": true,\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"TheNetworg\\\\OAuth2\\\\Client\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Jan Hajek\",\n \"email\": \"jan.hajek@thenetw.org\",\n \"homepage\": \"https://thenetw.org\"\n }\n ],\n \"description\": \"Azure Active Directory OAuth 2.0 Client Provider for The PHP League OAuth2-Client\",\n \"keywords\": [\n \"SSO\",\n \"aad\",\n \"authorization\",\n \"azure\",\n \"azure active directory\",\n \"client\",\n \"microsoft\",\n \"oauth\",\n \"oauth2\",\n \"windows azure\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/TheNetworg/oauth2-azure/issues\",\n \"source\": \"https://github.com/TheNetworg/oauth2-azure/tree/master\"\n },\n \"time\": \"2026-02-26T08:05:57+00:00\"\n },\n {\n \"name\": \"tijsverkoyen/css-to-inline-styles\",\n \"version\": \"v2.4.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/tijsverkoyen/CssToInlineStyles.git\",\n \"reference\": \"f0292ccf0ec75843d65027214426b6b163b48b41\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/tijsverkoyen/CssToInlineStyles/zipball/f0292ccf0ec75843d65027214426b6b163b48b41\",\n \"reference\": \"f0292ccf0ec75843d65027214426b6b163b48b41\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"ext-dom\": \"*\",\n \"ext-libxml\": \"*\",\n \"php\": \"^7.4 || ^8.0\",\n \"symfony/css-selector\": \"^5.4 || ^6.0 || ^7.0 || ^8.0\"\n },\n \"require-dev\": {\n \"phpstan/phpstan\": \"^2.0\",\n \"phpstan/phpstan-phpunit\": \"^2.0\",\n \"phpunit/phpunit\": \"^8.5.21 || ^9.5.10\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"2.x-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"TijsVerkoyen\\\\CssToInlineStyles\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"BSD-3-Clause\"\n ],\n \"authors\": [\n {\n \"name\": \"Tijs Verkoyen\",\n \"email\": \"css_to_inline_styles@verkoyen.eu\",\n \"role\": \"Developer\"\n }\n ],\n \"description\": \"CssToInlineStyles is a class that enables you to convert HTML-pages/files into HTML-pages/files with inline styles. This is very useful when you're sending emails.\",\n \"homepage\": \"https://github.com/tijsverkoyen/CssToInlineStyles\",\n \"support\": {\n \"issues\": \"https://github.com/tijsverkoyen/CssToInlineStyles/issues\",\n \"source\": \"https://github.com/tijsverkoyen/CssToInlineStyles/tree/v2.4.0\"\n },\n \"time\": \"2025-12-02T11:56:42+00:00\"\n },\n {\n \"name\": \"tmannherz/oauth2-ringcentral\",\n \"version\": \"dev-master\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/jiminny/oauth2-ringcentral.git\",\n \"reference\": \"80082612910485dcb9b1ff3f5fa21190494e4b1c\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/jiminny/oauth2-ringcentral/zipball/80082612910485dcb9b1ff3f5fa21190494e4b1c\",\n \"reference\": \"80082612910485dcb9b1ff3f5fa21190494e4b1c\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"league/oauth2-client\": \"^2.5.0\",\n \"php\": \">=5.5.0\"\n },\n \"default-branch\": true,\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"TMannherz\\\\OAuth2\\\\Client\\\\\": \"src/\"\n }\n },\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Todd Mannherz\",\n \"email\": \"todd.mannherz@gmail.com\"\n }\n ],\n \"description\": \"RingCentral OAuth 2.0 Client Provider for The PHP League OAuth2-Client\",\n \"keywords\": [\n \"authentication\",\n \"authorization\",\n \"identity\",\n \"idp\",\n \"oauth\",\n \"oauth2\",\n \"ring central\",\n \"ringcentral\",\n \"ringcentral api\",\n \"single sign on\",\n \"sso\"\n ],\n \"support\": {\n \"source\": \"https://github.com/jiminny/oauth2-ringcentral/tree/master\"\n },\n \"time\": \"2021-03-23T16:37:32+00:00\"\n },\n {\n \"name\": \"twilio/sdk\",\n \"version\": \"8.9.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/twilio/twilio-php\",\n \"reference\": \"7bae72d9066055e714d8b20d0440149068490c43\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/twilio/twilio-php/zipball/7bae72d9066055e714d8b20d0440149068490c43\",\n \"reference\": \"7bae72d9066055e714d8b20d0440149068490c43\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=7.1.0\"\n },\n \"require-dev\": {\n \"friendsofphp/php-cs-fixer\": \"^3.0\",\n \"guzzlehttp/guzzle\": \"^6.3 || ^7.0\",\n \"phpunit/phpunit\": \">=7.0 < 10\"\n },\n \"suggest\": {\n \"guzzlehttp/guzzle\": \"An HTTP client to execute the API requests\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Twilio\\\\\": \"src/Twilio/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Twilio API Team\",\n \"email\": \"api@twilio.com\"\n }\n ],\n \"description\": \"A PHP wrapper for Twilio's API\",\n \"homepage\": \"https://github.com/twilio/twilio-php\",\n \"keywords\": [\n \"api\",\n \"sms\",\n \"twilio\"\n ],\n \"time\": \"2025-12-03T11:18:57+00:00\"\n },\n {\n \"name\": \"vanderlee/php-sentence\",\n \"version\": \"1.0.8\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/vanderlee/php-sentence.git\",\n \"reference\": \"3febfae719c7dfbb51800ec1cfcab35eb3260b7d\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/vanderlee/php-sentence/zipball/3febfae719c7dfbb51800ec1cfcab35eb3260b7d\",\n \"reference\": \"3febfae719c7dfbb51800ec1cfcab35eb3260b7d\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"ext-ctype\": \"*\",\n \"ext-mbstring\": \"*\",\n \"php\": \">=5.4.0\"\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \"^3.6.12\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Vanderlee\\\\Sentence\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"description\": \"Simple text sentence splitting and counting. Supports at least english, german and dutch, possibly more.\",\n \"homepage\": \"https://github.com/vanderlee/php-sentence.git\",\n \"keywords\": [\n \"boundary\",\n \"count\",\n \"disambiguation\",\n \"segmentation\",\n \"sentence\",\n \"split\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/vanderlee/php-sentence/issues\",\n \"source\": \"https://github.com/vanderlee/php-sentence\"\n },\n \"time\": \"2024-04-11T09:45:10+00:00\"\n },\n {\n \"name\": \"vinkla/hashids\",\n \"version\": \"13.0.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/vinkla/laravel-hashids.git\",\n \"reference\": \"f59ebf0d223b4986c4bdc76e6e694bf6056f8a0a\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/vinkla/laravel-hashids/zipball/f59ebf0d223b4986c4bdc76e6e694bf6056f8a0a\",\n \"reference\": \"f59ebf0d223b4986c4bdc76e6e694bf6056f8a0a\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"graham-campbell/manager\": \"^5.2\",\n \"hashids/hashids\": \"^5.0\",\n \"illuminate/contracts\": \"^12.0\",\n \"illuminate/support\": \"^12.0\",\n \"php\": \"^8.2\"\n },\n \"require-dev\": {\n \"graham-campbell/analyzer\": \"^5.0\",\n \"graham-campbell/testbench\": \"^6.1\",\n \"mockery/mockery\": \"^1.6.6\",\n \"phpunit/phpunit\": \"^11.5\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"laravel\": {\n \"aliases\": {\n \"Hashids\": \"Vinkla\\\\Hashids\\\\Facades\\\\Hashids\"\n },\n \"providers\": [\n \"Vinkla\\\\Hashids\\\\HashidsServiceProvider\"\n ]\n },\n \"branch-alias\": {\n \"dev-master\": \"12.0-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Vinkla\\\\Hashids\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Vincent Klaiber\",\n \"homepage\": \"https://github.com/vinkla\"\n }\n ],\n \"description\": \"A Hashids bridge for Laravel\",\n \"keywords\": [\n \"hashids\",\n \"laravel\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/vinkla/laravel-hashids/issues\",\n \"source\": \"https://github.com/vinkla/laravel-hashids/tree/13.0.0\"\n },\n \"time\": \"2025-03-02T21:39:35+00:00\"\n },\n {\n \"name\": \"vlucas/phpdotenv\",\n \"version\": \"v5.6.3\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/vlucas/phpdotenv.git\",\n \"reference\": \"955e7815d677a3eaa7075231212f2110983adecc\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/vlucas/phpdotenv/zipball/955e7815d677a3eaa7075231212f2110983adecc\",\n \"reference\": \"955e7815d677a3eaa7075231212f2110983adecc\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"ext-pcre\": \"*\",\n \"graham-campbell/result-type\": \"^1.1.4\",\n \"php\": \"^7.2.5 || ^8.0\",\n \"phpoption/phpoption\": \"^1.9.5\",\n \"symfony/polyfill-ctype\": \"^1.26\",\n \"symfony/polyfill-mbstring\": \"^1.26\",\n \"symfony/polyfill-php80\": \"^1.26\"\n },\n \"require-dev\": {\n \"bamarni/composer-bin-plugin\": \"^1.8.2\",\n \"ext-filter\": \"*\",\n \"phpunit/phpunit\": \"^8.5.34 || ^9.6.13 || ^10.4.2\"\n },\n \"suggest\": {\n \"ext-filter\": \"Required to use the boolean validator.\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"bamarni-bin\": {\n \"bin-links\": true,\n \"forward-command\": false\n },\n \"branch-alias\": {\n \"dev-master\": \"5.6-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Dotenv\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"BSD-3-Clause\"\n ],\n \"authors\": [\n {\n \"name\": \"Graham Campbell\",\n \"email\": \"hello@gjcampbell.co.uk\",\n \"homepage\": \"https://github.com/GrahamCampbell\"\n },\n {\n \"name\": \"Vance Lucas\",\n \"email\": \"vance@vancelucas.com\",\n \"homepage\": \"https://github.com/vlucas\"\n }\n ],\n \"description\": \"Loads environment variables from `.env` to `getenv()`, `$_ENV` and `$_SERVER` automagically.\",\n \"keywords\": [\n \"dotenv\",\n \"env\",\n \"environment\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/vlucas/phpdotenv/issues\",\n \"source\": \"https://github.com/vlucas/phpdotenv/tree/v5.6.3\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/GrahamCampbell\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/vlucas/phpdotenv\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2025-12-27T19:49:13+00:00\"\n },\n {\n \"name\": \"voku/portable-ascii\",\n \"version\": \"2.0.3\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/voku/portable-ascii.git\",\n \"reference\": \"b1d923f88091c6bf09699efcd7c8a1b1bfd7351d\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/voku/portable-ascii/zipball/b1d923f88091c6bf09699efcd7c8a1b1bfd7351d\",\n \"reference\": \"b1d923f88091c6bf09699efcd7c8a1b1bfd7351d\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=7.0.0\"\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \"~6.0 || ~7.0 || ~9.0\"\n },\n \"suggest\": {\n \"ext-intl\": \"Use Intl for transliterator_transliterate() support\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"voku\\\\\": \"src/voku/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Lars Moelleken\",\n \"homepage\": \"https://www.moelleken.org/\"\n }\n ],\n \"description\": \"Portable ASCII library - performance optimized (ascii) string functions for php.\",\n \"homepage\": \"https://github.com/voku/portable-ascii\",\n \"keywords\": [\n \"ascii\",\n \"clean\",\n \"php\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/voku/portable-ascii/issues\",\n \"source\": \"https://github.com/voku/portable-ascii/tree/2.0.3\"\n },\n \"funding\": [\n {\n \"url\": \"https://www.paypal.me/moelleken\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/voku\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://opencollective.com/portable-ascii\",\n \"type\": \"open_collective\"\n },\n {\n \"url\": \"https://www.patreon.com/voku\",\n \"type\": \"patreon\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/voku/portable-ascii\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2024-11-21T01:49:47+00:00\"\n },\n {\n \"name\": \"wildbit/postmark-php\",\n \"version\": \"v6.1.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/ActiveCampaign/postmark-php.git\",\n \"reference\": \"9ba4ed06f607ae1cc7976fa507cd22dab395b078\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/ActiveCampaign/postmark-php/zipball/9ba4ed06f607ae1cc7976fa507cd22dab395b078\",\n \"reference\": \"9ba4ed06f607ae1cc7976fa507cd22dab395b078\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"guzzlehttp/guzzle\": \"^7.8\",\n \"php\": \"~8.1 || ~8.2|| ~8.3 || ~8.4\"\n },\n \"require-dev\": {\n \"friendsofphp/php-cs-fixer\": \"^3.40\",\n \"phpstan/phpstan\": \"^1.10\",\n \"phpunit/phpunit\": \"^9\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-0\": {\n \"Postmark\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"description\": \"The officially supported client for Postmark (http://postmarkapp.com)\",\n \"support\": {\n \"issues\": \"https://github.com/ActiveCampaign/postmark-php/issues\",\n \"source\": \"https://github.com/ActiveCampaign/postmark-php/tree/v6.1.0\"\n },\n \"time\": \"2025-06-25T20:23:19+00:00\"\n },\n {\n \"name\": \"willdurand/email-reply-parser\",\n \"version\": \"2.10.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/willdurand/EmailReplyParser.git\",\n \"reference\": \"f25f8c6c3cb876112e3857eb3da15e38e44e4725\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/willdurand/EmailReplyParser/zipball/f25f8c6c3cb876112e3857eb3da15e38e44e4725\",\n \"reference\": \"f25f8c6c3cb876112e3857eb3da15e38e44e4725\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=7.4.0\"\n },\n \"require-dev\": {\n \"symfony/phpunit-bridge\": \"^5.0\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"2.8-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"EmailReplyParser\\\\\": \"src/EmailReplyParser\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"William Durand\",\n \"email\": \"will+git@drnd.me\"\n }\n ],\n \"description\": \"Port of the cool GitHub's EmailReplyParser library in PHP\",\n \"keywords\": [\n \"email\",\n \"reply-parser\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/willdurand/EmailReplyParser/issues\",\n \"source\": \"https://github.com/willdurand/EmailReplyParser/tree/2.10.0\"\n },\n \"time\": \"2022-01-30T20:56:36+00:00\"\n },\n {\n \"name\": \"zbateson/mail-mime-parser\",\n \"version\": \"3.0.4\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/zbateson/mail-mime-parser.git\",\n \"reference\": \"f0ccec9290a5b9cf014d7b7ea3401d2a4a626e9a\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/zbateson/mail-mime-parser/zipball/f0ccec9290a5b9cf014d7b7ea3401d2a4a626e9a\",\n \"reference\": \"f0ccec9290a5b9cf014d7b7ea3401d2a4a626e9a\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"guzzlehttp/psr7\": \"^2.5\",\n \"php\": \">=8.0\",\n \"php-di/php-di\": \"^6.0|^7.0\",\n \"psr/log\": \"^1|^2|^3\",\n \"zbateson/mb-wrapper\": \"^2.0\",\n \"zbateson/stream-decorators\": \"^2.1\"\n },\n \"require-dev\": {\n \"friendsofphp/php-cs-fixer\": \"*\",\n \"monolog/monolog\": \"^2|^3\",\n \"phpstan/phpstan\": \"*\",\n \"phpunit/phpunit\": \"^9.6\"\n },\n \"suggest\": {\n \"ext-iconv\": \"For best support/performance\",\n \"ext-mbstring\": \"For best support/performance\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"ZBateson\\\\MailMimeParser\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"BSD-2-Clause\"\n ],\n \"authors\": [\n {\n \"name\": \"Zaahid Bateson\"\n },\n {\n \"name\": \"Contributors\",\n \"homepage\": \"https://github.com/zbateson/mail-mime-parser/graphs/contributors\"\n }\n ],\n \"description\": \"MIME email message parser\",\n \"homepage\": \"https://mail-mime-parser.org\",\n \"keywords\": [\n \"MimeMailParser\",\n \"email\",\n \"mail\",\n \"mailparse\",\n \"mime\",\n \"mimeparse\",\n \"parser\",\n \"php-imap\"\n ],\n \"support\": {\n \"docs\": \"https://mail-mime-parser.org/#usage-guide\",\n \"issues\": \"https://github.com/zbateson/mail-mime-parser/issues\",\n \"source\": \"https://github.com/zbateson/mail-mime-parser\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/zbateson\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2025-09-03T17:18:36+00:00\"\n },\n {\n \"name\": \"zbateson/mb-wrapper\",\n \"version\": \"2.0.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/zbateson/mb-wrapper.git\",\n \"reference\": \"50a14c0c9537f978a61cde9fdc192a0267cc9cff\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/zbateson/mb-wrapper/zipball/50a14c0c9537f978a61cde9fdc192a0267cc9cff\",\n \"reference\": \"50a14c0c9537f978a61cde9fdc192a0267cc9cff\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.0\",\n \"symfony/polyfill-iconv\": \"^1.9\",\n \"symfony/polyfill-mbstring\": \"^1.9\"\n },\n \"require-dev\": {\n \"friendsofphp/php-cs-fixer\": \"*\",\n \"phpstan/phpstan\": \"*\",\n \"phpunit/phpunit\": \"^9.6|^10.0\"\n },\n \"suggest\": {\n \"ext-iconv\": \"For best support/performance\",\n \"ext-mbstring\": \"For best support/performance\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"ZBateson\\\\MbWrapper\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"BSD-2-Clause\"\n ],\n \"authors\": [\n {\n \"name\": \"Zaahid Bateson\"\n }\n ],\n \"description\": \"Wrapper for mbstring with fallback to iconv for encoding conversion and string manipulation\",\n \"keywords\": [\n \"charset\",\n \"encoding\",\n \"http\",\n \"iconv\",\n \"mail\",\n \"mb\",\n \"mb_convert_encoding\",\n \"mbstring\",\n \"mime\",\n \"multibyte\",\n \"string\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/zbateson/mb-wrapper/issues\",\n \"source\": \"https://github.com/zbateson/mb-wrapper/tree/2.0.1\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/zbateson\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2024-12-20T22:05:33+00:00\"\n },\n {\n \"name\": \"zbateson/stream-decorators\",\n \"version\": \"2.1.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/zbateson/stream-decorators.git\",\n \"reference\": \"32a2a62fb0f26313395c996ebd658d33c3f9c4e5\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/zbateson/stream-decorators/zipball/32a2a62fb0f26313395c996ebd658d33c3f9c4e5\",\n \"reference\": \"32a2a62fb0f26313395c996ebd658d33c3f9c4e5\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"guzzlehttp/psr7\": \"^2.5\",\n \"php\": \">=8.0\",\n \"zbateson/mb-wrapper\": \"^2.0\"\n },\n \"require-dev\": {\n \"friendsofphp/php-cs-fixer\": \"*\",\n \"phpstan/phpstan\": \"*\",\n \"phpunit/phpunit\": \"^9.6|^10.0\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"ZBateson\\\\StreamDecorators\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"BSD-2-Clause\"\n ],\n \"authors\": [\n {\n \"name\": \"Zaahid Bateson\"\n }\n ],\n \"description\": \"PHP psr7 stream decorators for mime message part streams\",\n \"keywords\": [\n \"base64\",\n \"charset\",\n \"decorators\",\n \"mail\",\n \"mime\",\n \"psr7\",\n \"quoted-printable\",\n \"stream\",\n \"uuencode\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/zbateson/stream-decorators/issues\",\n \"source\": \"https://github.com/zbateson/stream-decorators/tree/2.1.1\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/zbateson\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2024-04-29T21:42:39+00:00\"\n }\n ],\n \"packages-dev\": [\n {\n \"name\": \"amphp/amp\",\n \"version\": \"v3.1.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/amphp/amp.git\",\n \"reference\": \"fa0ab33a6f47a82929c38d03ca47ebb71086a93f\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/amphp/amp/zipball/fa0ab33a6f47a82929c38d03ca47ebb71086a93f\",\n \"reference\": \"fa0ab33a6f47a82929c38d03ca47ebb71086a93f\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.1\",\n \"revolt/event-loop\": \"^1 || ^0.2\"\n },\n \"require-dev\": {\n \"amphp/php-cs-fixer-config\": \"^2\",\n \"phpunit/phpunit\": \"^9\",\n \"psalm/phar\": \"5.23.1\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"files\": [\n \"src/functions.php\",\n \"src/Future/functions.php\",\n \"src/Internal/functions.php\"\n ],\n \"psr-4\": {\n \"Amp\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Aaron Piotrowski\",\n \"email\": \"aaron@trowski.com\"\n },\n {\n \"name\": \"Bob Weinand\",\n \"email\": \"bobwei9@hotmail.com\"\n },\n {\n \"name\": \"Niklas Keller\",\n \"email\": \"me@kelunik.com\"\n },\n {\n \"name\": \"Daniel Lowrey\",\n \"email\": \"rdlowrey@php.net\"\n }\n ],\n \"description\": \"A non-blocking concurrency framework for PHP applications.\",\n \"homepage\": \"https://amphp.org/amp\",\n \"keywords\": [\n \"async\",\n \"asynchronous\",\n \"awaitable\",\n \"concurrency\",\n \"event\",\n \"event-loop\",\n \"future\",\n \"non-blocking\",\n \"promise\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/amphp/amp/issues\",\n \"source\": \"https://github.com/amphp/amp/tree/v3.1.1\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/amphp\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2025-08-27T21:42:00+00:00\"\n },\n {\n \"name\": \"amphp/byte-stream\",\n \"version\": \"v2.1.2\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/amphp/byte-stream.git\",\n \"reference\": \"55a6bd071aec26fa2a3e002618c20c35e3df1b46\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/amphp/byte-stream/zipball/55a6bd071aec26fa2a3e002618c20c35e3df1b46\",\n \"reference\": \"55a6bd071aec26fa2a3e002618c20c35e3df1b46\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"amphp/amp\": \"^3\",\n \"amphp/parser\": \"^1.1\",\n \"amphp/pipeline\": \"^1\",\n \"amphp/serialization\": \"^1\",\n \"amphp/sync\": \"^2\",\n \"php\": \">=8.1\",\n \"revolt/event-loop\": \"^1 || ^0.2.3\"\n },\n \"require-dev\": {\n \"amphp/php-cs-fixer-config\": \"^2\",\n \"amphp/phpunit-util\": \"^3\",\n \"phpunit/phpunit\": \"^9\",\n \"psalm/phar\": \"5.22.1\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"files\": [\n \"src/functions.php\",\n \"src/Internal/functions.php\"\n ],\n \"psr-4\": {\n \"Amp\\\\ByteStream\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Aaron Piotrowski\",\n \"email\": \"aaron@trowski.com\"\n },\n {\n \"name\": \"Niklas Keller\",\n \"email\": \"me@kelunik.com\"\n }\n ],\n \"description\": \"A stream abstraction to make working with non-blocking I/O simple.\",\n \"homepage\": \"https://amphp.org/byte-stream\",\n \"keywords\": [\n \"amp\",\n \"amphp\",\n \"async\",\n \"io\",\n \"non-blocking\",\n \"stream\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/amphp/byte-stream/issues\",\n \"source\": \"https://github.com/amphp/byte-stream/tree/v2.1.2\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/amphp\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2025-03-16T17:10:27+00:00\"\n },\n {\n \"name\": \"amphp/cache\",\n \"version\": \"v2.0.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/amphp/cache.git\",\n \"reference\": \"46912e387e6aa94933b61ea1ead9cf7540b7797c\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/amphp/cache/zipball/46912e387e6aa94933b61ea1ead9cf7540b7797c\",\n \"reference\": \"46912e387e6aa94933b61ea1ead9cf7540b7797c\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"amphp/amp\": \"^3\",\n \"amphp/serialization\": \"^1\",\n \"amphp/sync\": \"^2\",\n \"php\": \">=8.1\",\n \"revolt/event-loop\": \"^1 || ^0.2\"\n },\n \"require-dev\": {\n \"amphp/php-cs-fixer-config\": \"^2\",\n \"amphp/phpunit-util\": \"^3\",\n \"phpunit/phpunit\": \"^9\",\n \"psalm/phar\": \"^5.4\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Amp\\\\Cache\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Niklas Keller\",\n \"email\": \"me@kelunik.com\"\n },\n {\n \"name\": \"Aaron Piotrowski\",\n \"email\": \"aaron@trowski.com\"\n },\n {\n \"name\": \"Daniel Lowrey\",\n \"email\": \"rdlowrey@php.net\"\n }\n ],\n \"description\": \"A fiber-aware cache API based on Amp and Revolt.\",\n \"homepage\": \"https://amphp.org/cache\",\n \"support\": {\n \"issues\": \"https://github.com/amphp/cache/issues\",\n \"source\": \"https://github.com/amphp/cache/tree/v2.0.1\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/amphp\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2024-04-19T03:38:06+00:00\"\n },\n {\n \"name\": \"amphp/dns\",\n \"version\": \"v2.4.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/amphp/dns.git\",\n \"reference\": \"78eb3db5fc69bf2fc0cb503c4fcba667bc223c71\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/amphp/dns/zipball/78eb3db5fc69bf2fc0cb503c4fcba667bc223c71\",\n \"reference\": \"78eb3db5fc69bf2fc0cb503c4fcba667bc223c71\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"amphp/amp\": \"^3\",\n \"amphp/byte-stream\": \"^2\",\n \"amphp/cache\": \"^2\",\n \"amphp/parser\": \"^1\",\n \"amphp/process\": \"^2\",\n \"daverandom/libdns\": \"^2.0.2\",\n \"ext-filter\": \"*\",\n \"ext-json\": \"*\",\n \"php\": \">=8.1\",\n \"revolt/event-loop\": \"^1 || ^0.2\"\n },\n \"require-dev\": {\n \"amphp/php-cs-fixer-config\": \"^2\",\n \"amphp/phpunit-util\": \"^3\",\n \"phpunit/phpunit\": \"^9\",\n \"psalm/phar\": \"5.20\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"files\": [\n \"src/functions.php\"\n ],\n \"psr-4\": {\n \"Amp\\\\Dns\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Chris Wright\",\n \"email\": \"addr@daverandom.com\"\n },\n {\n \"name\": \"Daniel Lowrey\",\n \"email\": \"rdlowrey@php.net\"\n },\n {\n \"name\": \"Bob Weinand\",\n \"email\": \"bobwei9@hotmail.com\"\n },\n {\n \"name\": \"Niklas Keller\",\n \"email\": \"me@kelunik.com\"\n },\n {\n \"name\": \"Aaron Piotrowski\",\n \"email\": \"aaron@trowski.com\"\n }\n ],\n \"description\": \"Async DNS resolution for Amp.\",\n \"homepage\": \"https://github.com/amphp/dns\",\n \"keywords\": [\n \"amp\",\n \"amphp\",\n \"async\",\n \"client\",\n \"dns\",\n \"resolve\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/amphp/dns/issues\",\n \"source\": \"https://github.com/amphp/dns/tree/v2.4.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/amphp\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2025-01-19T15:43:40+00:00\"\n },\n {\n \"name\": \"amphp/parallel\",\n \"version\": \"v2.3.2\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/amphp/parallel.git\",\n \"reference\": \"321b45ae771d9c33a068186b24117e3cd1c48dce\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/amphp/parallel/zipball/321b45ae771d9c33a068186b24117e3cd1c48dce\",\n \"reference\": \"321b45ae771d9c33a068186b24117e3cd1c48dce\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"amphp/amp\": \"^3\",\n \"amphp/byte-stream\": \"^2\",\n \"amphp/cache\": \"^2\",\n \"amphp/parser\": \"^1\",\n \"amphp/pipeline\": \"^1\",\n \"amphp/process\": \"^2\",\n \"amphp/serialization\": \"^1\",\n \"amphp/socket\": \"^2\",\n \"amphp/sync\": \"^2\",\n \"php\": \">=8.1\",\n \"revolt/event-loop\": \"^1\"\n },\n \"require-dev\": {\n \"amphp/php-cs-fixer-config\": \"^2\",\n \"amphp/phpunit-util\": \"^3\",\n \"phpunit/phpunit\": \"^9\",\n \"psalm/phar\": \"^5.18\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"files\": [\n \"src/Context/functions.php\",\n \"src/Context/Internal/functions.php\",\n \"src/Ipc/functions.php\",\n \"src/Worker/functions.php\"\n ],\n \"psr-4\": {\n \"Amp\\\\Parallel\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Aaron Piotrowski\",\n \"email\": \"aaron@trowski.com\"\n },\n {\n \"name\": \"Niklas Keller\",\n \"email\": \"me@kelunik.com\"\n },\n {\n \"name\": \"Stephen Coakley\",\n \"email\": \"me@stephencoakley.com\"\n }\n ],\n \"description\": \"Parallel processing component for Amp.\",\n \"homepage\": \"https://github.com/amphp/parallel\",\n \"keywords\": [\n \"async\",\n \"asynchronous\",\n \"concurrent\",\n \"multi-processing\",\n \"multi-threading\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/amphp/parallel/issues\",\n \"source\": \"https://github.com/amphp/parallel/tree/v2.3.2\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/amphp\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2025-08-27T21:55:40+00:00\"\n },\n {\n \"name\": \"amphp/parser\",\n \"version\": \"v1.1.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/amphp/parser.git\",\n \"reference\": \"3cf1f8b32a0171d4b1bed93d25617637a77cded7\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/amphp/parser/zipball/3cf1f8b32a0171d4b1bed93d25617637a77cded7\",\n \"reference\": \"3cf1f8b32a0171d4b1bed93d25617637a77cded7\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=7.4\"\n },\n \"require-dev\": {\n \"amphp/php-cs-fixer-config\": \"^2\",\n \"phpunit/phpunit\": \"^9\",\n \"psalm/phar\": \"^5.4\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Amp\\\\Parser\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Aaron Piotrowski\",\n \"email\": \"aaron@trowski.com\"\n },\n {\n \"name\": \"Niklas Keller\",\n \"email\": \"me@kelunik.com\"\n }\n ],\n \"description\": \"A generator parser to make streaming parsers simple.\",\n \"homepage\": \"https://github.com/amphp/parser\",\n \"keywords\": [\n \"async\",\n \"non-blocking\",\n \"parser\",\n \"stream\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/amphp/parser/issues\",\n \"source\": \"https://github.com/amphp/parser/tree/v1.1.1\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/amphp\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2024-03-21T19:16:53+00:00\"\n },\n {\n \"name\": \"amphp/pipeline\",\n \"version\": \"v1.2.3\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/amphp/pipeline.git\",\n \"reference\": \"7b52598c2e9105ebcddf247fc523161581930367\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/amphp/pipeline/zipball/7b52598c2e9105ebcddf247fc523161581930367\",\n \"reference\": \"7b52598c2e9105ebcddf247fc523161581930367\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"amphp/amp\": \"^3\",\n \"php\": \">=8.1\",\n \"revolt/event-loop\": \"^1\"\n },\n \"require-dev\": {\n \"amphp/php-cs-fixer-config\": \"^2\",\n \"amphp/phpunit-util\": \"^3\",\n \"phpunit/phpunit\": \"^9\",\n \"psalm/phar\": \"^5.18\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Amp\\\\Pipeline\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Aaron Piotrowski\",\n \"email\": \"aaron@trowski.com\"\n },\n {\n \"name\": \"Niklas Keller\",\n \"email\": \"me@kelunik.com\"\n }\n ],\n \"description\": \"Asynchronous iterators and operators.\",\n \"homepage\": \"https://amphp.org/pipeline\",\n \"keywords\": [\n \"amp\",\n \"amphp\",\n \"async\",\n \"io\",\n \"iterator\",\n \"non-blocking\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/amphp/pipeline/issues\",\n \"source\": \"https://github.com/amphp/pipeline/tree/v1.2.3\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/amphp\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2025-03-16T16:33:53+00:00\"\n },\n {\n \"name\": \"amphp/process\",\n \"version\": \"v2.0.3\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/amphp/process.git\",\n \"reference\": \"52e08c09dec7511d5fbc1fb00d3e4e79fc77d58d\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/amphp/process/zipball/52e08c09dec7511d5fbc1fb00d3e4e79fc77d58d\",\n \"reference\": \"52e08c09dec7511d5fbc1fb00d3e4e79fc77d58d\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"amphp/amp\": \"^3\",\n \"amphp/byte-stream\": \"^2\",\n \"amphp/sync\": \"^2\",\n \"php\": \">=8.1\",\n \"revolt/event-loop\": \"^1 || ^0.2\"\n },\n \"require-dev\": {\n \"amphp/php-cs-fixer-config\": \"^2\",\n \"amphp/phpunit-util\": \"^3\",\n \"phpunit/phpunit\": \"^9\",\n \"psalm/phar\": \"^5.4\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"files\": [\n \"src/functions.php\"\n ],\n \"psr-4\": {\n \"Amp\\\\Process\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Bob Weinand\",\n \"email\": \"bobwei9@hotmail.com\"\n },\n {\n \"name\": \"Aaron Piotrowski\",\n \"email\": \"aaron@trowski.com\"\n },\n {\n \"name\": \"Niklas Keller\",\n \"email\": \"me@kelunik.com\"\n }\n ],\n \"description\": \"A fiber-aware process manager based on Amp and Revolt.\",\n \"homepage\": \"https://amphp.org/process\",\n \"support\": {\n \"issues\": \"https://github.com/amphp/process/issues\",\n \"source\": \"https://github.com/amphp/process/tree/v2.0.3\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/amphp\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2024-04-19T03:13:44+00:00\"\n },\n {\n \"name\": \"amphp/serialization\",\n \"version\": \"v1.0.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/amphp/serialization.git\",\n \"reference\": \"693e77b2fb0b266c3c7d622317f881de44ae94a1\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/amphp/serialization/zipball/693e77b2fb0b266c3c7d622317f881de44ae94a1\",\n \"reference\": \"693e77b2fb0b266c3c7d622317f881de44ae94a1\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=7.1\"\n },\n \"require-dev\": {\n \"amphp/php-cs-fixer-config\": \"dev-master\",\n \"phpunit/phpunit\": \"^9 || ^8 || ^7\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"files\": [\n \"src/functions.php\"\n ],\n \"psr-4\": {\n \"Amp\\\\Serialization\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Aaron Piotrowski\",\n \"email\": \"aaron@trowski.com\"\n },\n {\n \"name\": \"Niklas Keller\",\n \"email\": \"me@kelunik.com\"\n }\n ],\n \"description\": \"Serialization tools for IPC and data storage in PHP.\",\n \"homepage\": \"https://github.com/amphp/serialization\",\n \"keywords\": [\n \"async\",\n \"asynchronous\",\n \"serialization\",\n \"serialize\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/amphp/serialization/issues\",\n \"source\": \"https://github.com/amphp/serialization/tree/master\"\n },\n \"time\": \"2020-03-25T21:39:07+00:00\"\n },\n {\n \"name\": \"amphp/socket\",\n \"version\": \"v2.3.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/amphp/socket.git\",\n \"reference\": \"58e0422221825b79681b72c50c47a930be7bf1e1\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/amphp/socket/zipball/58e0422221825b79681b72c50c47a930be7bf1e1\",\n \"reference\": \"58e0422221825b79681b72c50c47a930be7bf1e1\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"amphp/amp\": \"^3\",\n \"amphp/byte-stream\": \"^2\",\n \"amphp/dns\": \"^2\",\n \"ext-openssl\": \"*\",\n \"kelunik/certificate\": \"^1.1\",\n \"league/uri\": \"^6.5 | ^7\",\n \"league/uri-interfaces\": \"^2.3 | ^7\",\n \"php\": \">=8.1\",\n \"revolt/event-loop\": \"^1 || ^0.2\"\n },\n \"require-dev\": {\n \"amphp/php-cs-fixer-config\": \"^2\",\n \"amphp/phpunit-util\": \"^3\",\n \"amphp/process\": \"^2\",\n \"phpunit/phpunit\": \"^9\",\n \"psalm/phar\": \"5.20\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"files\": [\n \"src/functions.php\",\n \"src/Internal/functions.php\",\n \"src/SocketAddress/functions.php\"\n ],\n \"psr-4\": {\n \"Amp\\\\Socket\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Daniel Lowrey\",\n \"email\": \"rdlowrey@gmail.com\"\n },\n {\n \"name\": \"Aaron Piotrowski\",\n \"email\": \"aaron@trowski.com\"\n },\n {\n \"name\": \"Niklas Keller\",\n \"email\": \"me@kelunik.com\"\n }\n ],\n \"description\": \"Non-blocking socket connection / server implementations based on Amp and Revolt.\",\n \"homepage\": \"https://github.com/amphp/socket\",\n \"keywords\": [\n \"amp\",\n \"async\",\n \"encryption\",\n \"non-blocking\",\n \"sockets\",\n \"tcp\",\n \"tls\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/amphp/socket/issues\",\n \"source\": \"https://github.com/amphp/socket/tree/v2.3.1\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/amphp\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2024-04-21T14:33:03+00:00\"\n },\n {\n \"name\": \"amphp/sync\",\n \"version\": \"v2.3.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/amphp/sync.git\",\n \"reference\": \"217097b785130d77cfcc58ff583cf26cd1770bf1\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/amphp/sync/zipball/217097b785130d77cfcc58ff583cf26cd1770bf1\",\n \"reference\": \"217097b785130d77cfcc58ff583cf26cd1770bf1\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"amphp/amp\": \"^3\",\n \"amphp/pipeline\": \"^1\",\n \"amphp/serialization\": \"^1\",\n \"php\": \">=8.1\",\n \"revolt/event-loop\": \"^1 || ^0.2\"\n },\n \"require-dev\": {\n \"amphp/php-cs-fixer-config\": \"^2\",\n \"amphp/phpunit-util\": \"^3\",\n \"phpunit/phpunit\": \"^9\",\n \"psalm/phar\": \"5.23\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"files\": [\n \"src/functions.php\"\n ],\n \"psr-4\": {\n \"Amp\\\\Sync\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Aaron Piotrowski\",\n \"email\": \"aaron@trowski.com\"\n },\n {\n \"name\": \"Niklas Keller\",\n \"email\": \"me@kelunik.com\"\n },\n {\n \"name\": \"Stephen Coakley\",\n \"email\": \"me@stephencoakley.com\"\n }\n ],\n \"description\": \"Non-blocking synchronization primitives for PHP based on Amp and Revolt.\",\n \"homepage\": \"https://github.com/amphp/sync\",\n \"keywords\": [\n \"async\",\n \"asynchronous\",\n \"mutex\",\n \"semaphore\",\n \"synchronization\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/amphp/sync/issues\",\n \"source\": \"https://github.com/amphp/sync/tree/v2.3.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/amphp\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2024-08-03T19:31:26+00:00\"\n },\n {\n \"name\": \"barryvdh/laravel-debugbar\",\n \"version\": \"v3.16.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/barryvdh/laravel-debugbar.git\",\n \"reference\": \"f265cf5e38577d42311f1a90d619bcd3740bea23\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/barryvdh/laravel-debugbar/zipball/f265cf5e38577d42311f1a90d619bcd3740bea23\",\n \"reference\": \"f265cf5e38577d42311f1a90d619bcd3740bea23\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"illuminate/routing\": \"^9|^10|^11|^12\",\n \"illuminate/session\": \"^9|^10|^11|^12\",\n \"illuminate/support\": \"^9|^10|^11|^12\",\n \"php\": \"^8.1\",\n \"php-debugbar/php-debugbar\": \"~2.2.0\",\n \"symfony/finder\": \"^6|^7\"\n },\n \"require-dev\": {\n \"mockery/mockery\": \"^1.3.3\",\n \"orchestra/testbench-dusk\": \"^7|^8|^9|^10\",\n \"phpunit/phpunit\": \"^9.5.10|^10|^11\",\n \"squizlabs/php_codesniffer\": \"^3.5\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"laravel\": {\n \"aliases\": {\n \"Debugbar\": \"Barryvdh\\\\Debugbar\\\\Facades\\\\Debugbar\"\n },\n \"providers\": [\n \"Barryvdh\\\\Debugbar\\\\ServiceProvider\"\n ]\n },\n \"branch-alias\": {\n \"dev-master\": \"3.16-dev\"\n }\n },\n \"autoload\": {\n \"files\": [\n \"src/helpers.php\"\n ],\n \"psr-4\": {\n \"Barryvdh\\\\Debugbar\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Barry vd. Heuvel\",\n \"email\": \"barryvdh@gmail.com\"\n }\n ],\n \"description\": \"PHP Debugbar integration for Laravel\",\n \"keywords\": [\n \"debug\",\n \"debugbar\",\n \"dev\",\n \"laravel\",\n \"profiler\",\n \"webprofiler\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/barryvdh/laravel-debugbar/issues\",\n \"source\": \"https://github.com/barryvdh/laravel-debugbar/tree/v3.16.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://fruitcake.nl\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/barryvdh\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2025-07-14T11:56:43+00:00\"\n },\n {\n \"name\": \"barryvdh/laravel-ide-helper\",\n \"version\": \"v3.6.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/barryvdh/laravel-ide-helper.git\",\n \"reference\": \"8d00250cba25728373e92c1d8dcebcbf64623d29\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/barryvdh/laravel-ide-helper/zipball/8d00250cba25728373e92c1d8dcebcbf64623d29\",\n \"reference\": \"8d00250cba25728373e92c1d8dcebcbf64623d29\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"barryvdh/reflection-docblock\": \"^2.4\",\n \"composer/class-map-generator\": \"^1.0\",\n \"ext-json\": \"*\",\n \"illuminate/console\": \"^11.15 || ^12\",\n \"illuminate/database\": \"^11.15 || ^12\",\n \"illuminate/filesystem\": \"^11.15 || ^12\",\n \"illuminate/support\": \"^11.15 || ^12\",\n \"php\": \"^8.2\"\n },\n \"require-dev\": {\n \"ext-pdo_sqlite\": \"*\",\n \"friendsofphp/php-cs-fixer\": \"^3\",\n \"illuminate/config\": \"^11.15 || ^12\",\n \"illuminate/view\": \"^11.15 || ^12\",\n \"mockery/mockery\": \"^1.4\",\n \"orchestra/testbench\": \"^9.2 || ^10\",\n \"phpunit/phpunit\": \"^10.5 || ^11.5.3\",\n \"spatie/phpunit-snapshot-assertions\": \"^4 || ^5\",\n \"vimeo/psalm\": \"^5.4\",\n \"vlucas/phpdotenv\": \"^5\"\n },\n \"suggest\": {\n \"illuminate/events\": \"Required for automatic helper generation (^6|^7|^8|^9|^10|^11).\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"laravel\": {\n \"providers\": [\n \"Barryvdh\\\\LaravelIdeHelper\\\\IdeHelperServiceProvider\"\n ]\n },\n \"branch-alias\": {\n \"dev-master\": \"3.5-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Barryvdh\\\\LaravelIdeHelper\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Barry vd. Heuvel\",\n \"email\": \"barryvdh@gmail.com\"\n }\n ],\n \"description\": \"Laravel IDE Helper, generates correct PHPDocs for all Facade classes, to improve auto-completion.\",\n \"keywords\": [\n \"autocomplete\",\n \"codeintel\",\n \"dev\",\n \"helper\",\n \"ide\",\n \"laravel\",\n \"netbeans\",\n \"phpdoc\",\n \"phpstorm\",\n \"sublime\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/barryvdh/laravel-ide-helper/issues\",\n \"source\": \"https://github.com/barryvdh/laravel-ide-helper/tree/v3.6.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://fruitcake.nl\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/barryvdh\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2025-07-17T20:11:57+00:00\"\n },\n {\n \"name\": \"barryvdh/reflection-docblock\",\n \"version\": \"v2.4.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/barryvdh/ReflectionDocBlock.git\",\n \"reference\": \"d103774cbe7e94ddee7e4870f97f727b43fe7201\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/barryvdh/ReflectionDocBlock/zipball/d103774cbe7e94ddee7e4870f97f727b43fe7201\",\n \"reference\": \"d103774cbe7e94ddee7e4870f97f727b43fe7201\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=7.1\"\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \"^8.5.14|^9\"\n },\n \"suggest\": {\n \"dflydev/markdown\": \"~1.0\",\n \"erusev/parsedown\": \"~1.0\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"2.3.x-dev\"\n }\n },\n \"autoload\": {\n \"psr-0\": {\n \"Barryvdh\": [\n \"src/\"\n ]\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Mike van Riel\",\n \"email\": \"mike.vanriel@naenius.com\"\n }\n ],\n \"support\": {\n \"source\": \"https://github.com/barryvdh/ReflectionDocBlock/tree/v2.4.0\"\n },\n \"time\": \"2025-07-17T06:07:30+00:00\"\n },\n {\n \"name\": \"brianium/paratest\",\n \"version\": \"v7.8.4\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/paratestphp/paratest.git\",\n \"reference\": \"130a9bf0e269ee5f5b320108f794ad03e275cad4\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/paratestphp/paratest/zipball/130a9bf0e269ee5f5b320108f794ad03e275cad4\",\n \"reference\": \"130a9bf0e269ee5f5b320108f794ad03e275cad4\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"ext-dom\": \"*\",\n \"ext-pcre\": \"*\",\n \"ext-reflection\": \"*\",\n \"ext-simplexml\": \"*\",\n \"fidry/cpu-core-counter\": \"^1.2.0\",\n \"jean85/pretty-package-versions\": \"^2.1.1\",\n \"php\": \"~8.2.0 || ~8.3.0 || ~8.4.0\",\n \"phpunit/php-code-coverage\": \"^11.0.10\",\n \"phpunit/php-file-iterator\": \"^5.1.0\",\n \"phpunit/php-timer\": \"^7.0.1\",\n \"phpunit/phpunit\": \"^11.5.24\",\n \"sebastian/environment\": \"^7.2.1\",\n \"symfony/console\": \"^6.4.22 || ^7.3.0\",\n \"symfony/process\": \"^6.4.20 || ^7.3.0\"\n },\n \"require-dev\": {\n \"doctrine/coding-standard\": \"^12.0.0\",\n \"ext-pcov\": \"*\",\n \"ext-posix\": \"*\",\n \"phpstan/phpstan\": \"^2.1.17\",\n \"phpstan/phpstan-deprecation-rules\": \"^2.0.3\",\n \"phpstan/phpstan-phpunit\": \"^2.0.6\",\n \"phpstan/phpstan-strict-rules\": \"^2.0.4\",\n \"squizlabs/php_codesniffer\": \"^3.13.2\",\n \"symfony/filesystem\": \"^6.4.13 || ^7.3.0\"\n },\n \"bin\": [\n \"bin/paratest\",\n \"bin/paratest_for_phpstorm\"\n ],\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"ParaTest\\\\\": [\n \"src/\"\n ]\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Brian Scaturro\",\n \"email\": \"scaturrob@gmail.com\",\n \"role\": \"Developer\"\n },\n {\n \"name\": \"Filippo Tessarotto\",\n \"email\": \"zoeslam@gmail.com\",\n \"role\": \"Developer\"\n }\n ],\n \"description\": \"Parallel testing for PHP\",\n \"homepage\": \"https://github.com/paratestphp/paratest\",\n \"keywords\": [\n \"concurrent\",\n \"parallel\",\n \"phpunit\",\n \"testing\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/paratestphp/paratest/issues\",\n \"source\": \"https://github.com/paratestphp/paratest/tree/v7.8.4\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/sponsors/Slamdunk\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://paypal.me/filippotessarotto\",\n \"type\": \"paypal\"\n }\n ],\n \"time\": \"2025-06-23T06:07:21+00:00\"\n },\n {\n \"name\": \"browserstack/browserstack-local\",\n \"version\": \"v1.1.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/browserstack/browserstack-local-php.git\",\n \"reference\": \"491c6e31960ce8111d2cb70cb84d03e73f270dbb\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/browserstack/browserstack-local-php/zipball/491c6e31960ce8111d2cb70cb84d03e73f270dbb\",\n \"reference\": \"491c6e31960ce8111d2cb70cb84d03e73f270dbb\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=5.3.19\"\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \"4.6.*\"\n },\n \"suggest\": {\n \"phpdocumentor/phpdocumentor\": \"2.*\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"BrowserStack\\\\\": \"lib/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"description\": \"PHP bindings for BrowserStack Local\",\n \"homepage\": \"https://github.com/browserstack/browserstack-local-php\",\n \"keywords\": [\n \"BrowserStack\",\n \"browserstacklocal\",\n \"local\",\n \"php\",\n \"selenium\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/browserstack/browserstack-local-php/issues\",\n \"source\": \"https://github.com/browserstack/browserstack-local-php\"\n },\n \"time\": \"2016-09-19T13:39:06+00:00\"\n },\n {\n \"name\": \"clue/ndjson-react\",\n \"version\": \"v1.3.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/clue/reactphp-ndjson.git\",\n \"reference\": \"392dc165fce93b5bb5c637b67e59619223c931b0\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/clue/reactphp-ndjson/zipball/392dc165fce93b5bb5c637b67e59619223c931b0\",\n \"reference\": \"392dc165fce93b5bb5c637b67e59619223c931b0\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=5.3\",\n \"react/stream\": \"^1.2\"\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \"^9.5 || ^5.7 || ^4.8.35\",\n \"react/event-loop\": \"^1.2\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Clue\\\\React\\\\NDJson\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Christian Lück\",\n \"email\": \"christian@clue.engineering\"\n }\n ],\n \"description\": \"Streaming newline-delimited JSON (NDJSON) parser and encoder for ReactPHP.\",\n \"homepage\": \"https://github.com/clue/reactphp-ndjson\",\n \"keywords\": [\n \"NDJSON\",\n \"json\",\n \"jsonlines\",\n \"newline\",\n \"reactphp\",\n \"streaming\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/clue/reactphp-ndjson/issues\",\n \"source\": \"https://github.com/clue/reactphp-ndjson/tree/v1.3.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://clue.engineering/support\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/clue\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2022-12-23T10:58:28+00:00\"\n },\n {\n \"name\": \"colinodell/json5\",\n \"version\": \"v3.0.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/colinodell/json5.git\",\n \"reference\": \"5724d21bc5c910c2560af1b8915f0cc0163579c8\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/colinodell/json5/zipball/5724d21bc5c910c2560af1b8915f0cc0163579c8\",\n \"reference\": \"5724d21bc5c910c2560af1b8915f0cc0163579c8\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"ext-json\": \"*\",\n \"ext-mbstring\": \"*\",\n \"php\": \"^8.0\"\n },\n \"require-dev\": {\n \"mikehaertl/php-shellcommand\": \"^1.7.0\",\n \"phpstan/phpstan\": \"^1.10.57\",\n \"scrutinizer/ocular\": \"^1.9\",\n \"squizlabs/php_codesniffer\": \"^3.8.1\",\n \"symfony/finder\": \"^6.0|^7.0\",\n \"symfony/phpunit-bridge\": \"^7.0.3\"\n },\n \"bin\": [\n \"bin/json5\"\n ],\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-main\": \"4.0-dev\"\n }\n },\n \"autoload\": {\n \"files\": [\n \"src/global.php\"\n ],\n \"psr-4\": {\n \"ColinODell\\\\Json5\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Colin O'Dell\",\n \"email\": \"colinodell@gmail.com\",\n \"homepage\": \"https://www.colinodell.com\",\n \"role\": \"Developer\"\n }\n ],\n \"description\": \"UTF-8 compatible JSON5 parser for PHP\",\n \"homepage\": \"https://github.com/colinodell/json5\",\n \"keywords\": [\n \"JSON5\",\n \"json\",\n \"json5_decode\",\n \"json_decode\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/colinodell/json5/issues\",\n \"source\": \"https://github.com/colinodell/json5/tree/v3.0.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://www.colinodell.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://www.paypal.me/colinpodell/10.00\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/colinodell\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://www.patreon.com/colinodell\",\n \"type\": \"patreon\"\n }\n ],\n \"time\": \"2024-02-09T13:06:12+00:00\"\n },\n {\n \"name\": \"composer/class-map-generator\",\n \"version\": \"1.6.2\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/composer/class-map-generator.git\",\n \"reference\": \"ba9f089655d4cdd64e762a6044f411ccdaec0076\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/composer/class-map-generator/zipball/ba9f089655d4cdd64e762a6044f411ccdaec0076\",\n \"reference\": \"ba9f089655d4cdd64e762a6044f411ccdaec0076\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"composer/pcre\": \"^2.1 || ^3.1\",\n \"php\": \"^7.2 || ^8.0\",\n \"symfony/finder\": \"^4.4 || ^5.3 || ^6 || ^7\"\n },\n \"require-dev\": {\n \"phpstan/phpstan\": \"^1.12 || ^2\",\n \"phpstan/phpstan-deprecation-rules\": \"^1 || ^2\",\n \"phpstan/phpstan-phpunit\": \"^1 || ^2\",\n \"phpstan/phpstan-strict-rules\": \"^1.1 || ^2\",\n \"phpunit/phpunit\": \"^8\",\n \"symfony/filesystem\": \"^5.4 || ^6\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-main\": \"1.x-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Composer\\\\ClassMapGenerator\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Jordi Boggiano\",\n \"email\": \"j.boggiano@seld.be\",\n \"homepage\": \"https://seld.be\"\n }\n ],\n \"description\": \"Utilities to scan PHP code and generate class maps.\",\n \"keywords\": [\n \"classmap\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/composer/class-map-generator/issues\",\n \"source\": \"https://github.com/composer/class-map-generator/tree/1.6.2\"\n },\n \"funding\": [\n {\n \"url\": \"https://packagist.com\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/composer\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2025-08-20T18:52:43+00:00\"\n },\n {\n \"name\": \"composer/pcre\",\n \"version\": \"3.3.2\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/composer/pcre.git\",\n \"reference\": \"b2bed4734f0cc156ee1fe9c0da2550420d99a21e\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/composer/pcre/zipball/b2bed4734f0cc156ee1fe9c0da2550420d99a21e\",\n \"reference\": \"b2bed4734f0cc156ee1fe9c0da2550420d99a21e\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \"^7.4 || ^8.0\"\n },\n \"conflict\": {\n \"phpstan/phpstan\": \"<1.11.10\"\n },\n \"require-dev\": {\n \"phpstan/phpstan\": \"^1.12 || ^2\",\n \"phpstan/phpstan-strict-rules\": \"^1 || ^2\",\n \"phpunit/phpunit\": \"^8 || ^9\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"phpstan\": {\n \"includes\": [\n \"extension.neon\"\n ]\n },\n \"branch-alias\": {\n \"dev-main\": \"3.x-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Composer\\\\Pcre\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Jordi Boggiano\",\n \"email\": \"j.boggiano@seld.be\",\n \"homepage\": \"http://seld.be\"\n }\n ],\n \"description\": \"PCRE wrapping library that offers type-safe preg_* replacements.\",\n \"keywords\": [\n \"PCRE\",\n \"preg\",\n \"regex\",\n \"regular expression\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/composer/pcre/issues\",\n \"source\": \"https://github.com/composer/pcre/tree/3.3.2\"\n },\n \"funding\": [\n {\n \"url\": \"https://packagist.com\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/composer\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/composer/composer\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2024-11-12T16:29:46+00:00\"\n },\n {\n \"name\": \"composer/xdebug-handler\",\n \"version\": \"3.0.5\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/composer/xdebug-handler.git\",\n \"reference\": \"6c1925561632e83d60a44492e0b344cf48ab85ef\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/composer/xdebug-handler/zipball/6c1925561632e83d60a44492e0b344cf48ab85ef\",\n \"reference\": \"6c1925561632e83d60a44492e0b344cf48ab85ef\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"composer/pcre\": \"^1 || ^2 || ^3\",\n \"php\": \"^7.2.5 || ^8.0\",\n \"psr/log\": \"^1 || ^2 || ^3\"\n },\n \"require-dev\": {\n \"phpstan/phpstan\": \"^1.0\",\n \"phpstan/phpstan-strict-rules\": \"^1.1\",\n \"phpunit/phpunit\": \"^8.5 || ^9.6 || ^10.5\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Composer\\\\XdebugHandler\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"John Stevenson\",\n \"email\": \"john-stevenson@blueyonder.co.uk\"\n }\n ],\n \"description\": \"Restarts a process without Xdebug.\",\n \"keywords\": [\n \"Xdebug\",\n \"performance\"\n ],\n \"support\": {\n \"irc\": \"ircs://irc.libera.chat:6697/composer\",\n \"issues\": \"https://github.com/composer/xdebug-handler/issues\",\n \"source\": \"https://github.com/composer/xdebug-handler/tree/3.0.5\"\n },\n \"funding\": [\n {\n \"url\": \"https://packagist.com\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/composer\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/composer/composer\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2024-05-06T16:37:16+00:00\"\n },\n {\n \"name\": \"daverandom/libdns\",\n \"version\": \"v2.1.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/DaveRandom/LibDNS.git\",\n \"reference\": \"b84c94e8fe6b7ee4aecfe121bfe3b6177d303c8a\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/DaveRandom/LibDNS/zipball/b84c94e8fe6b7ee4aecfe121bfe3b6177d303c8a\",\n \"reference\": \"b84c94e8fe6b7ee4aecfe121bfe3b6177d303c8a\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"ext-ctype\": \"*\",\n \"php\": \">=7.1\"\n },\n \"suggest\": {\n \"ext-intl\": \"Required for IDN support\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"files\": [\n \"src/functions.php\"\n ],\n \"psr-4\": {\n \"LibDNS\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"description\": \"DNS protocol implementation written in pure PHP\",\n \"keywords\": [\n \"dns\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/DaveRandom/LibDNS/issues\",\n \"source\": \"https://github.com/DaveRandom/LibDNS/tree/v2.1.0\"\n },\n \"time\": \"2024-04-12T12:12:48+00:00\"\n },\n {\n \"name\": \"dnoegel/php-xdg-base-dir\",\n \"version\": \"v0.1.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/dnoegel/php-xdg-base-dir.git\",\n \"reference\": \"8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/dnoegel/php-xdg-base-dir/zipball/8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd\",\n \"reference\": \"8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=5.3.2\"\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \"~7.0|~6.0|~5.0|~4.8.35\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"XdgBaseDir\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"description\": \"implementation of xdg base directory specification for php\",\n \"support\": {\n \"issues\": \"https://github.com/dnoegel/php-xdg-base-dir/issues\",\n \"source\": \"https://github.com/dnoegel/php-xdg-base-dir/tree/v0.1.1\"\n },\n \"time\": \"2019-12-04T15:06:13+00:00\"\n },\n {\n \"name\": \"felixfbecker/advanced-json-rpc\",\n \"version\": \"v3.2.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/felixfbecker/php-advanced-json-rpc.git\",\n \"reference\": \"b5f37dbff9a8ad360ca341f3240dc1c168b45447\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/felixfbecker/php-advanced-json-rpc/zipball/b5f37dbff9a8ad360ca341f3240dc1c168b45447\",\n \"reference\": \"b5f37dbff9a8ad360ca341f3240dc1c168b45447\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"netresearch/jsonmapper\": \"^1.0 || ^2.0 || ^3.0 || ^4.0\",\n \"php\": \"^7.1 || ^8.0\",\n \"phpdocumentor/reflection-docblock\": \"^4.3.4 || ^5.0.0\"\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \"^7.0 || ^8.0\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"AdvancedJsonRpc\\\\\": \"lib/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"ISC\"\n ],\n \"authors\": [\n {\n \"name\": \"Felix Becker\",\n \"email\": \"felix.b@outlook.com\"\n }\n ],\n \"description\": \"A more advanced JSONRPC implementation\",\n \"support\": {\n \"issues\": \"https://github.com/felixfbecker/php-advanced-json-rpc/issues\",\n \"source\": \"https://github.com/felixfbecker/php-advanced-json-rpc/tree/v3.2.1\"\n },\n \"time\": \"2021-06-11T22:34:44+00:00\"\n },\n {\n \"name\": \"felixfbecker/language-server-protocol\",\n \"version\": \"v1.5.3\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/felixfbecker/php-language-server-protocol.git\",\n \"reference\": \"a9e113dbc7d849e35b8776da39edaf4313b7b6c9\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/felixfbecker/php-language-server-protocol/zipball/a9e113dbc7d849e35b8776da39edaf4313b7b6c9\",\n \"reference\": \"a9e113dbc7d849e35b8776da39edaf4313b7b6c9\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=7.1\"\n },\n \"require-dev\": {\n \"phpstan/phpstan\": \"*\",\n \"squizlabs/php_codesniffer\": \"^3.1\",\n \"vimeo/psalm\": \"^4.0\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"1.x-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"LanguageServerProtocol\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"ISC\"\n ],\n \"authors\": [\n {\n \"name\": \"Felix Becker\",\n \"email\": \"felix.b@outlook.com\"\n }\n ],\n \"description\": \"PHP classes for the Language Server Protocol\",\n \"keywords\": [\n \"language\",\n \"microsoft\",\n \"php\",\n \"server\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/felixfbecker/php-language-server-protocol/issues\",\n \"source\": \"https://github.com/felixfbecker/php-language-server-protocol/tree/v1.5.3\"\n },\n \"time\": \"2024-04-30T00:40:11+00:00\"\n },\n {\n \"name\": \"fidry/cpu-core-counter\",\n \"version\": \"1.3.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/theofidry/cpu-core-counter.git\",\n \"reference\": \"db9508f7b1474469d9d3c53b86f817e344732678\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/theofidry/cpu-core-counter/zipball/db9508f7b1474469d9d3c53b86f817e344732678\",\n \"reference\": \"db9508f7b1474469d9d3c53b86f817e344732678\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \"^7.2 || ^8.0\"\n },\n \"require-dev\": {\n \"fidry/makefile\": \"^0.2.0\",\n \"fidry/php-cs-fixer-config\": \"^1.1.2\",\n \"phpstan/extension-installer\": \"^1.2.0\",\n \"phpstan/phpstan\": \"^2.0\",\n \"phpstan/phpstan-deprecation-rules\": \"^2.0.0\",\n \"phpstan/phpstan-phpunit\": \"^2.0\",\n \"phpstan/phpstan-strict-rules\": \"^2.0\",\n \"phpunit/phpunit\": \"^8.5.31 || ^9.5.26\",\n \"webmozarts/strict-phpunit\": \"^7.5\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Fidry\\\\CpuCoreCounter\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Théo FIDRY\",\n \"email\": \"theo.fidry@gmail.com\"\n }\n ],\n \"description\": \"Tiny utility to get the number of CPU cores.\",\n \"keywords\": [\n \"CPU\",\n \"core\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/theofidry/cpu-core-counter/issues\",\n \"source\": \"https://github.com/theofidry/cpu-core-counter/tree/1.3.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/theofidry\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2025-08-14T07:29:31+00:00\"\n },\n {\n \"name\": \"filp/whoops\",\n \"version\": \"2.18.4\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/filp/whoops.git\",\n \"reference\": \"d2102955e48b9fd9ab24280a7ad12ed552752c4d\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/filp/whoops/zipball/d2102955e48b9fd9ab24280a7ad12ed552752c4d\",\n \"reference\": \"d2102955e48b9fd9ab24280a7ad12ed552752c4d\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \"^7.1 || ^8.0\",\n \"psr/log\": \"^1.0.1 || ^2.0 || ^3.0\"\n },\n \"require-dev\": {\n \"mockery/mockery\": \"^1.0\",\n \"phpunit/phpunit\": \"^7.5.20 || ^8.5.8 || ^9.3.3\",\n \"symfony/var-dumper\": \"^4.0 || ^5.0\"\n },\n \"suggest\": {\n \"symfony/var-dumper\": \"Pretty print complex values better with var-dumper available\",\n \"whoops/soap\": \"Formats errors as SOAP responses\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"2.7-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Whoops\\\\\": \"src/Whoops/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Filipe Dobreira\",\n \"homepage\": \"https://github.com/filp\",\n \"role\": \"Developer\"\n }\n ],\n \"description\": \"php error handling for cool kids\",\n \"homepage\": \"https://filp.github.io/whoops/\",\n \"keywords\": [\n \"error\",\n \"exception\",\n \"handling\",\n \"library\",\n \"throwable\",\n \"whoops\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/filp/whoops/issues\",\n \"source\": \"https://github.com/filp/whoops/tree/2.18.4\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/denis-sokolov\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2025-08-08T12:00:00+00:00\"\n },\n {\n \"name\": \"friendsofphp/php-cs-fixer\",\n \"version\": \"v3.87.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git\",\n \"reference\": \"2f5170365e2a422d0c5421f9c8818b2c078105f6\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/2f5170365e2a422d0c5421f9c8818b2c078105f6\",\n \"reference\": \"2f5170365e2a422d0c5421f9c8818b2c078105f6\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"clue/ndjson-react\": \"^1.3\",\n \"composer/semver\": \"^3.4\",\n \"composer/xdebug-handler\": \"^3.0.5\",\n \"ext-filter\": \"*\",\n \"ext-hash\": \"*\",\n \"ext-json\": \"*\",\n \"ext-tokenizer\": \"*\",\n \"fidry/cpu-core-counter\": \"^1.3\",\n \"php\": \"^7.4 || ^8.0\",\n \"react/child-process\": \"^0.6.6\",\n \"react/event-loop\": \"^1.5\",\n \"react/promise\": \"^3.3\",\n \"react/socket\": \"^1.16\",\n \"react/stream\": \"^1.4\",\n \"sebastian/diff\": \"^4.0.6 || ^5.1.1 || ^6.0.2 || ^7.0\",\n \"symfony/console\": \"^5.4.47 || ^6.4.24 || ^7.0\",\n \"symfony/event-dispatcher\": \"^5.4.45 || ^6.4.24 || ^7.0\",\n \"symfony/filesystem\": \"^5.4.45 || ^6.4.24 || ^7.0\",\n \"symfony/finder\": \"^5.4.45 || ^6.4.24 || ^7.0\",\n \"symfony/options-resolver\": \"^5.4.45 || ^6.4.24 || ^7.0\",\n \"symfony/polyfill-mbstring\": \"^1.33\",\n \"symfony/polyfill-php80\": \"^1.33\",\n \"symfony/polyfill-php81\": \"^1.33\",\n \"symfony/process\": \"^5.4.47 || ^6.4.24 || ^7.2\",\n \"symfony/stopwatch\": \"^5.4.45 || ^6.4.24 || ^7.0\"\n },\n \"require-dev\": {\n \"facile-it/paraunit\": \"^1.3.1 || ^2.7\",\n \"infection/infection\": \"^0.29.14\",\n \"justinrainbow/json-schema\": \"^6.5\",\n \"keradus/cli-executor\": \"^2.2\",\n \"mikey179/vfsstream\": \"^1.6.12\",\n \"php-coveralls/php-coveralls\": \"^2.8\",\n \"php-cs-fixer/phpunit-constraint-isidenticalstring\": \"^1.6\",\n \"php-cs-fixer/phpunit-constraint-xmlmatchesxsd\": \"^1.6\",\n \"phpunit/phpunit\": \"^9.6.25 || ^10.5.53 || ^11.5.34\",\n \"symfony/polyfill-php84\": \"^1.33\",\n \"symfony/var-dumper\": \"^5.4.48 || ^6.4.24 || ^7.3.2\",\n \"symfony/yaml\": \"^5.4.45 || ^6.4.24 || ^7.3.2\"\n },\n \"suggest\": {\n \"ext-dom\": \"For handling output formats in XML\",\n \"ext-mbstring\": \"For handling non-UTF8 characters.\"\n },\n \"bin\": [\n \"php-cs-fixer\"\n ],\n \"type\": \"application\",\n \"autoload\": {\n \"psr-4\": {\n \"PhpCsFixer\\\\\": \"src/\"\n },\n \"exclude-from-classmap\": [\n \"src/Fixer/Internal/*\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Fabien Potencier\",\n \"email\": \"fabien@symfony.com\"\n },\n {\n \"name\": \"Dariusz Rumiński\",\n \"email\": \"dariusz.ruminski@gmail.com\"\n }\n ],\n \"description\": \"A tool to automatically fix PHP code style\",\n \"keywords\": [\n \"Static code analysis\",\n \"fixer\",\n \"standards\",\n \"static analysis\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/issues\",\n \"source\": \"https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.87.1\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/keradus\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2025-09-02T15:27:36+00:00\"\n },\n {\n \"name\": \"hamcrest/hamcrest-php\",\n \"version\": \"v2.1.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/hamcrest/hamcrest-php.git\",\n \"reference\": \"f8b1c0173b22fa6ec77a81fe63e5b01eba7e6487\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/hamcrest/hamcrest-php/zipball/f8b1c0173b22fa6ec77a81fe63e5b01eba7e6487\",\n \"reference\": \"f8b1c0173b22fa6ec77a81fe63e5b01eba7e6487\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \"^7.4|^8.0\"\n },\n \"replace\": {\n \"cordoval/hamcrest-php\": \"*\",\n \"davedevelopment/hamcrest-php\": \"*\",\n \"kodova/hamcrest-php\": \"*\"\n },\n \"require-dev\": {\n \"phpunit/php-file-iterator\": \"^1.4 || ^2.0 || ^3.0\",\n \"phpunit/phpunit\": \"^4.8.36 || ^5.7 || ^6.5 || ^7.0 || ^8.0 || ^9.0\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"2.1-dev\"\n }\n },\n \"autoload\": {\n \"classmap\": [\n \"hamcrest\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"BSD-3-Clause\"\n ],\n \"description\": \"This is the PHP port of Hamcrest Matchers\",\n \"keywords\": [\n \"test\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/hamcrest/hamcrest-php/issues\",\n \"source\": \"https://github.com/hamcrest/hamcrest-php/tree/v2.1.1\"\n },\n \"time\": \"2025-04-30T06:54:44+00:00\"\n },\n {\n \"name\": \"iamcal/sql-parser\",\n \"version\": \"v0.6\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/iamcal/SQLParser.git\",\n \"reference\": \"947083e2dca211a6f12fb1beb67a01e387de9b62\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/iamcal/SQLParser/zipball/947083e2dca211a6f12fb1beb67a01e387de9b62\",\n \"reference\": \"947083e2dca211a6f12fb1beb67a01e387de9b62\",\n \"shasum\": \"\"\n },\n \"require-dev\": {\n \"php-coveralls/php-coveralls\": \"^1.0\",\n \"phpunit/phpunit\": \"^5|^6|^7|^8|^9\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"iamcal\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Cal Henderson\",\n \"email\": \"cal@iamcal.com\"\n }\n ],\n \"description\": \"MySQL schema parser\",\n \"support\": {\n \"issues\": \"https://github.com/iamcal/SQLParser/issues\",\n \"source\": \"https://github.com/iamcal/SQLParser/tree/v0.6\"\n },\n \"time\": \"2025-03-17T16:59:46+00:00\"\n },\n {\n \"name\": \"infection/abstract-testframework-adapter\",\n \"version\": \"0.5.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/infection/abstract-testframework-adapter.git\",\n \"reference\": \"18925e20d15d1a5995bb85c9dc09e8751e1e069b\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/infection/abstract-testframework-adapter/zipball/18925e20d15d1a5995bb85c9dc09e8751e1e069b\",\n \"reference\": \"18925e20d15d1a5995bb85c9dc09e8751e1e069b\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \"^7.4 || ^8.0\"\n },\n \"require-dev\": {\n \"ergebnis/composer-normalize\": \"^2.8\",\n \"friendsofphp/php-cs-fixer\": \"^2.17\",\n \"phpunit/phpunit\": \"^9.5\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Infection\\\\AbstractTestFramework\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"BSD-3-Clause\"\n ],\n \"authors\": [\n {\n \"name\": \"Maks Rafalko\",\n \"email\": \"maks.rafalko@gmail.com\"\n }\n ],\n \"description\": \"Abstract Test Framework Adapter for Infection\",\n \"support\": {\n \"issues\": \"https://github.com/infection/abstract-testframework-adapter/issues\",\n \"source\": \"https://github.com/infection/abstract-testframework-adapter/tree/0.5.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/infection\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://opencollective.com/infection\",\n \"type\": \"open_collective\"\n }\n ],\n \"time\": \"2021-08-17T18:49:12+00:00\"\n },\n {\n \"name\": \"infection/extension-installer\",\n \"version\": \"0.1.2\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/infection/extension-installer.git\",\n \"reference\": \"9b351d2910b9a23ab4815542e93d541e0ca0cdcf\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/infection/extension-installer/zipball/9b351d2910b9a23ab4815542e93d541e0ca0cdcf\",\n \"reference\": \"9b351d2910b9a23ab4815542e93d541e0ca0cdcf\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"composer-plugin-api\": \"^1.1 || ^2.0\"\n },\n \"require-dev\": {\n \"composer/composer\": \"^1.9 || ^2.0\",\n \"friendsofphp/php-cs-fixer\": \"^2.18, <2.19\",\n \"infection/infection\": \"^0.15.2\",\n \"php-coveralls/php-coveralls\": \"^2.4\",\n \"phpstan/extension-installer\": \"^1.0\",\n \"phpstan/phpstan\": \"^0.12.10\",\n \"phpstan/phpstan-phpunit\": \"^0.12.6\",\n \"phpstan/phpstan-strict-rules\": \"^0.12.2\",\n \"phpstan/phpstan-webmozart-assert\": \"^0.12.2\",\n \"phpunit/phpunit\": \"^9.5\",\n \"vimeo/psalm\": \"^4.8\"\n },\n \"type\": \"composer-plugin\",\n \"extra\": {\n \"class\": \"Infection\\\\ExtensionInstaller\\\\Plugin\"\n },\n \"autoload\": {\n \"psr-4\": {\n \"Infection\\\\ExtensionInstaller\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"BSD-3-Clause\"\n ],\n \"authors\": [\n {\n \"name\": \"Maks Rafalko\",\n \"email\": \"maks.rafalko@gmail.com\"\n }\n ],\n \"description\": \"Infection Extension Installer\",\n \"support\": {\n \"issues\": \"https://github.com/infection/extension-installer/issues\",\n \"source\": \"https://github.com/infection/extension-installer/tree/0.1.2\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/infection\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://opencollective.com/infection\",\n \"type\": \"open_collective\"\n }\n ],\n \"time\": \"2021-10-20T22:08:34+00:00\"\n },\n {\n \"name\": \"infection/include-interceptor\",\n \"version\": \"0.2.5\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/infection/include-interceptor.git\",\n \"reference\": \"0cc76d95a79d9832d74e74492b0a30139904bdf7\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/infection/include-interceptor/zipball/0cc76d95a79d9832d74e74492b0a30139904bdf7\",\n \"reference\": \"0cc76d95a79d9832d74e74492b0a30139904bdf7\",\n \"shasum\": \"\"\n },\n \"require-dev\": {\n \"friendsofphp/php-cs-fixer\": \"^2.16\",\n \"infection/infection\": \"^0.15.0\",\n \"phan/phan\": \"^2.4 || ^3\",\n \"php-coveralls/php-coveralls\": \"^2.2\",\n \"phpstan/phpstan\": \"^0.12.8\",\n \"phpunit/phpunit\": \"^8.5\",\n \"vimeo/psalm\": \"^3.8\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Infection\\\\StreamWrapper\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"BSD-3-Clause\"\n ],\n \"authors\": [\n {\n \"name\": \"Maks Rafalko\",\n \"email\": \"maks.rafalko@gmail.com\"\n }\n ],\n \"description\": \"Stream Wrapper: Include Interceptor. Allows to replace included (autoloaded) file with another one.\",\n \"support\": {\n \"issues\": \"https://github.com/infection/include-interceptor/issues\",\n \"source\": \"https://github.com/infection/include-interceptor/tree/0.2.5\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/infection\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://opencollective.com/infection\",\n \"type\": \"open_collective\"\n }\n ],\n \"time\": \"2021-08-09T10:03:57+00:00\"\n },\n {\n \"name\": \"infection/infection\",\n \"version\": \"0.29.14\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/infection/infection.git\",\n \"reference\": \"feea2a48a8aeedd3a4d2105167b41a46f0e568a3\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/infection/infection/zipball/feea2a48a8aeedd3a4d2105167b41a46f0e568a3\",\n \"reference\": \"feea2a48a8aeedd3a4d2105167b41a46f0e568a3\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"colinodell/json5\": \"^2.2 || ^3.0\",\n \"composer-runtime-api\": \"^2.0\",\n \"composer/xdebug-handler\": \"^2.0 || ^3.0\",\n \"ext-dom\": \"*\",\n \"ext-json\": \"*\",\n \"ext-libxml\": \"*\",\n \"ext-mbstring\": \"*\",\n \"fidry/cpu-core-counter\": \"^0.4.0 || ^0.5.0 || ^1.0\",\n \"infection/abstract-testframework-adapter\": \"^0.5.0\",\n \"infection/extension-installer\": \"^0.1.0\",\n \"infection/include-interceptor\": \"^0.2.5\",\n \"infection/mutator\": \"^0.4\",\n \"justinrainbow/json-schema\": \"^5.3 || ^6.0\",\n \"nikic/php-parser\": \"^5.3\",\n \"ondram/ci-detector\": \"^4.1.0\",\n \"php\": \"^8.2\",\n \"sanmai/later\": \"^0.1.1\",\n \"sanmai/pipeline\": \"^5.1 || ^6\",\n \"sebastian/diff\": \"^3.0.2 || ^4.0 || ^5.0 || ^6.0 || ^7.0\",\n \"symfony/console\": \"^6.4 || ^7.0\",\n \"symfony/filesystem\": \"^6.4 || ^7.0\",\n \"symfony/finder\": \"^6.4 || ^7.0\",\n \"symfony/process\": \"^6.4 || ^7.0\",\n \"thecodingmachine/safe\": \"^v3.0\",\n \"webmozart/assert\": \"^1.11\"\n },\n \"conflict\": {\n \"antecedent/patchwork\": \"<2.1.25\",\n \"dg/bypass-finals\": \"<1.4.1\",\n \"phpunit/php-code-coverage\": \">9,<9.1.4 || >9.2.17,<9.2.21\"\n },\n \"require-dev\": {\n \"ext-simplexml\": \"*\",\n \"fidry/makefile\": \"^1.0\",\n \"phpstan/extension-installer\": \"^1.4\",\n \"phpstan/phpstan\": \"^2.1\",\n \"phpstan/phpstan-phpunit\": \"^2.0\",\n \"phpstan/phpstan-strict-rules\": \"^2.0\",\n \"phpstan/phpstan-webmozart-assert\": \"^2.0\",\n \"phpunit/phpunit\": \"^11.5\",\n \"rector/rector\": \"^2.0\",\n \"sidz/phpstan-rules\": \"^0.5.1\",\n \"symfony/yaml\": \"^6.4 || ^7.0\",\n \"thecodingmachine/phpstan-safe-rule\": \"^1.4\"\n },\n \"bin\": [\n \"bin/infection\"\n ],\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Infection\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"BSD-3-Clause\"\n ],\n \"authors\": [\n {\n \"name\": \"Maks Rafalko\",\n \"email\": \"maks.rafalko@gmail.com\",\n \"homepage\": \"https://twitter.com/maks_rafalko\"\n },\n {\n \"name\": \"Oleg Zhulnev\",\n \"homepage\": \"https://github.com/sidz\"\n },\n {\n \"name\": \"Gert de Pagter\",\n \"homepage\": \"https://github.com/BackEndTea\"\n },\n {\n \"name\": \"Théo FIDRY\",\n \"email\": \"theo.fidry@gmail.com\",\n \"homepage\": \"https://twitter.com/tfidry\"\n },\n {\n \"name\": \"Alexey Kopytko\",\n \"email\": \"alexey@kopytko.com\",\n \"homepage\": \"https://www.alexeykopytko.com\"\n },\n {\n \"name\": \"Andreas Möller\",\n \"email\": \"am@localheinz.com\",\n \"homepage\": \"https://localheinz.com\"\n }\n ],\n \"description\": \"Infection is a Mutation Testing framework for PHP. The mutation adequacy score can be used to measure the effectiveness of a test set in terms of its ability to detect faults.\",\n \"keywords\": [\n \"coverage\",\n \"mutant\",\n \"mutation framework\",\n \"mutation testing\",\n \"testing\",\n \"unit testing\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/infection/infection/issues\",\n \"source\": \"https://github.com/infection/infection/tree/0.29.14\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/infection\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://opencollective.com/infection\",\n \"type\": \"open_collective\"\n }\n ],\n \"time\": \"2025-03-02T18:49:12+00:00\"\n },\n {\n \"name\": \"infection/mutator\",\n \"version\": \"0.4.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/infection/mutator.git\",\n \"reference\": \"3c976d721b02b32f851ee4e15d553ef1e9186d1d\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/infection/mutator/zipball/3c976d721b02b32f851ee4e15d553ef1e9186d1d\",\n \"reference\": \"3c976d721b02b32f851ee4e15d553ef1e9186d1d\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"nikic/php-parser\": \"^5.0\"\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \"^9.6 || ^10\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Infection\\\\Mutator\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"BSD-3-Clause\"\n ],\n \"authors\": [\n {\n \"name\": \"Maks Rafalko\",\n \"email\": \"maks.rafalko@gmail.com\"\n }\n ],\n \"description\": \"Mutator interface to implement custom mutators (mutation operators) for Infection\",\n \"support\": {\n \"issues\": \"https://github.com/infection/mutator/issues\",\n \"source\": \"https://github.com/infection/mutator/tree/0.4.1\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/infection\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://opencollective.com/infection\",\n \"type\": \"open_collective\"\n }\n ],\n \"time\": \"2025-04-29T08:19:52+00:00\"\n },\n {\n \"name\": \"jasonmccreary/laravel-test-assertions\",\n \"version\": \"v2.8.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/jasonmccreary/laravel-test-assertions.git\",\n \"reference\": \"4e0542af0a49d72247b353092f9e79128e3615db\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/jasonmccreary/laravel-test-assertions/zipball/4e0542af0a49d72247b353092f9e79128e3615db\",\n \"reference\": \"4e0542af0a49d72247b353092f9e79128e3615db\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"illuminate/testing\": \"^11.0|^12.0\",\n \"mockery/mockery\": \"^1.4.4\",\n \"php\": \"^8.1\",\n \"phpunit/phpunit\": \"^10.1|^11.0|^12.0\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"laravel\": {\n \"providers\": [\n \"JMac\\\\Testing\\\\AdditionalAssertionsServiceProvider\"\n ]\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"JMac\\\\Testing\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Jason McCreary\",\n \"email\": \"jason@pureconcepts.net\"\n }\n ],\n \"description\": \"A set of helpful assertions when testing Laravel applications.\",\n \"support\": {\n \"issues\": \"https://github.com/jasonmccreary/laravel-test-assertions/issues\",\n \"source\": \"https://github.com/jasonmccreary/laravel-test-assertions/tree/v2.8.0\"\n },\n \"time\": \"2025-04-10T20:19:59+00:00\"\n },\n {\n \"name\": \"justinrainbow/json-schema\",\n \"version\": \"6.5.2\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/jsonrainbow/json-schema.git\",\n \"reference\": \"ac0d369c09653cf7af561f6d91a705bc617a87b8\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/jsonrainbow/json-schema/zipball/ac0d369c09653cf7af561f6d91a705bc617a87b8\",\n \"reference\": \"ac0d369c09653cf7af561f6d91a705bc617a87b8\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"ext-json\": \"*\",\n \"marc-mabe/php-enum\": \"^4.0\",\n \"php\": \"^7.2 || ^8.0\"\n },\n \"require-dev\": {\n \"friendsofphp/php-cs-fixer\": \"3.3.0\",\n \"json-schema/json-schema-test-suite\": \"^23.2\",\n \"marc-mabe/php-enum-phpstan\": \"^2.0\",\n \"phpspec/prophecy\": \"^1.19\",\n \"phpstan/phpstan\": \"^1.12\",\n \"phpunit/phpunit\": \"^8.5\"\n },\n \"bin\": [\n \"bin/validate-json\"\n ],\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"6.x-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"JsonSchema\\\\\": \"src/JsonSchema/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Bruno Prieto Reis\",\n \"email\": \"bruno.p.reis@gmail.com\"\n },\n {\n \"name\": \"Justin Rainbow\",\n \"email\": \"justin.rainbow@gmail.com\"\n },\n {\n \"name\": \"Igor Wiedler\",\n \"email\": \"igor@wiedler.ch\"\n },\n {\n \"name\": \"Robert Schönthal\",\n \"email\": \"seroscho@googlemail.com\"\n }\n ],\n \"description\": \"A library to validate a json schema.\",\n \"homepage\": \"https://github.com/jsonrainbow/json-schema\",\n \"keywords\": [\n \"json\",\n \"schema\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/jsonrainbow/json-schema/issues\",\n \"source\": \"https://github.com/jsonrainbow/json-schema/tree/6.5.2\"\n },\n \"time\": \"2025-09-09T09:42:27+00:00\"\n },\n {\n \"name\": \"kelunik/certificate\",\n \"version\": \"v1.1.3\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/kelunik/certificate.git\",\n \"reference\": \"7e00d498c264d5eb4f78c69f41c8bd6719c0199e\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/kelunik/certificate/zipball/7e00d498c264d5eb4f78c69f41c8bd6719c0199e\",\n \"reference\": \"7e00d498c264d5eb4f78c69f41c8bd6719c0199e\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"ext-openssl\": \"*\",\n \"php\": \">=7.0\"\n },\n \"require-dev\": {\n \"amphp/php-cs-fixer-config\": \"^2\",\n \"phpunit/phpunit\": \"^6 | 7 | ^8 | ^9\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"1.x-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Kelunik\\\\Certificate\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Niklas Keller\",\n \"email\": \"me@kelunik.com\"\n }\n ],\n \"description\": \"Access certificate details and transform between different formats.\",\n \"keywords\": [\n \"DER\",\n \"certificate\",\n \"certificates\",\n \"openssl\",\n \"pem\",\n \"x509\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/kelunik/certificate/issues\",\n \"source\": \"https://github.com/kelunik/certificate/tree/v1.1.3\"\n },\n \"time\": \"2023-02-03T21:26:53+00:00\"\n },\n {\n \"name\": \"larastan/larastan\",\n \"version\": \"v3.6.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/larastan/larastan.git\",\n \"reference\": \"3c223047e374befd1b64959784685d6ecccf66aa\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/larastan/larastan/zipball/3c223047e374befd1b64959784685d6ecccf66aa\",\n \"reference\": \"3c223047e374befd1b64959784685d6ecccf66aa\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"ext-json\": \"*\",\n \"iamcal/sql-parser\": \"^0.6.0\",\n \"illuminate/console\": \"^11.44.2 || ^12.4.1\",\n \"illuminate/container\": \"^11.44.2 || ^12.4.1\",\n \"illuminate/contracts\": \"^11.44.2 || ^12.4.1\",\n \"illuminate/database\": \"^11.44.2 || ^12.4.1\",\n \"illuminate/http\": \"^11.44.2 || ^12.4.1\",\n \"illuminate/pipeline\": \"^11.44.2 || ^12.4.1\",\n \"illuminate/support\": \"^11.44.2 || ^12.4.1\",\n \"php\": \"^8.2\",\n \"phpstan/phpstan\": \"^2.1.11\"\n },\n \"require-dev\": {\n \"doctrine/coding-standard\": \"^13\",\n \"laravel/framework\": \"^11.44.2 || ^12.7.2\",\n \"mockery/mockery\": \"^1.6.12\",\n \"nikic/php-parser\": \"^5.4\",\n \"orchestra/canvas\": \"^v9.2.2 || ^10.0.1\",\n \"orchestra/testbench-core\": \"^9.12.0 || ^10.1\",\n \"phpstan/phpstan-deprecation-rules\": \"^2.0.1\",\n \"phpunit/phpunit\": \"^10.5.35 || ^11.5.15\"\n },\n \"suggest\": {\n \"orchestra/testbench\": \"Using Larastan for analysing a package needs Testbench\"\n },\n \"type\": \"phpstan-extension\",\n \"extra\": {\n \"phpstan\": {\n \"includes\": [\n \"extension.neon\"\n ]\n },\n \"branch-alias\": {\n \"dev-master\": \"3.0-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Larastan\\\\Larastan\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Can Vural\",\n \"email\": \"can9119@gmail.com\"\n }\n ],\n \"description\": \"Larastan - Discover bugs in your code without running it. A phpstan/phpstan extension for Laravel\",\n \"keywords\": [\n \"PHPStan\",\n \"code analyse\",\n \"code analysis\",\n \"larastan\",\n \"laravel\",\n \"package\",\n \"php\",\n \"static analysis\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/larastan/larastan/issues\",\n \"source\": \"https://github.com/larastan/larastan/tree/v3.6.1\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/canvural\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2025-08-25T07:24:56+00:00\"\n },\n {\n \"name\": \"maglnet/composer-require-checker\",\n \"version\": \"4.16.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/maglnet/ComposerRequireChecker.git\",\n \"reference\": \"2449a6298a0c39d940287d5d3afaf05a6f80fd0c\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/maglnet/ComposerRequireChecker/zipball/2449a6298a0c39d940287d5d3afaf05a6f80fd0c\",\n \"reference\": \"2449a6298a0c39d940287d5d3afaf05a6f80fd0c\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"composer-runtime-api\": \"^2.0.0\",\n \"ext-phar\": \"*\",\n \"nikic/php-parser\": \"^5.4.0\",\n \"php\": \"~8.2.0 || ~8.3.0 || ~8.4.0\",\n \"symfony/console\": \"^6.4.1 || ^7.0.1\",\n \"webmozart/assert\": \"^1.11.0\",\n \"webmozart/glob\": \"^4.7.0\"\n },\n \"require-dev\": {\n \"doctrine/coding-standard\": \"^12.0.0\",\n \"ext-zend-opcache\": \"*\",\n \"phing/phing\": \"^3.0.1\",\n \"phpstan/phpstan\": \"^2.1.2\",\n \"phpunit/phpunit\": \"^11.5.7\",\n \"psalm/plugin-phpunit\": \"^0.19.2\",\n \"roave/infection-static-analysis-plugin\": \"^1.36.0\",\n \"spatie/temporary-directory\": \"^2.3.0\",\n \"vimeo/psalm\": \"^6.4.0\"\n },\n \"bin\": [\n \"bin/composer-require-checker\"\n ],\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"2.1-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"ComposerRequireChecker\\\\\": \"src/ComposerRequireChecker\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Marco Pivetta\",\n \"email\": \"ocramius@gmail.com\",\n \"homepage\": \"http://ocramius.github.io/\"\n },\n {\n \"name\": \"Matthias Glaub\",\n \"email\": \"magl@magl.net\",\n \"homepage\": \"http://magl.net\"\n }\n ],\n \"description\": \"CLI tool to analyze composer dependencies and verify that no unknown symbols are used in the sources of a package\",\n \"homepage\": \"https://github.com/maglnet/ComposerRequireChecker\",\n \"keywords\": [\n \"cli\",\n \"composer\",\n \"dependency\",\n \"imports\",\n \"require\",\n \"requirements\",\n \"static analysis\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/maglnet/ComposerRequireChecker/issues\",\n \"source\": \"https://github.com/maglnet/ComposerRequireChecker/tree/4.16.1\"\n },\n \"time\": \"2025-02-07T09:09:45+00:00\"\n },\n {\n \"name\": \"marc-mabe/php-enum\",\n \"version\": \"v4.7.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/marc-mabe/php-enum.git\",\n \"reference\": \"7159809e5cfa041dca28e61f7f7ae58063aae8ed\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/marc-mabe/php-enum/zipball/7159809e5cfa041dca28e61f7f7ae58063aae8ed\",\n \"reference\": \"7159809e5cfa041dca28e61f7f7ae58063aae8ed\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"ext-reflection\": \"*\",\n \"php\": \"^7.1 | ^8.0\"\n },\n \"require-dev\": {\n \"phpbench/phpbench\": \"^0.16.10 || ^1.0.4\",\n \"phpstan/phpstan\": \"^1.3.1\",\n \"phpunit/phpunit\": \"^7.5.20 | ^8.5.22 | ^9.5.11\",\n \"vimeo/psalm\": \"^4.17.0 | ^5.26.1\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-3.x\": \"3.2-dev\",\n \"dev-master\": \"4.7-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"MabeEnum\\\\\": \"src/\"\n },\n \"classmap\": [\n \"stubs/Stringable.php\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"BSD-3-Clause\"\n ],\n \"authors\": [\n {\n \"name\": \"Marc Bennewitz\",\n \"email\": \"dev@mabe.berlin\",\n \"homepage\": \"https://mabe.berlin/\",\n \"role\": \"Lead\"\n }\n ],\n \"description\": \"Simple and fast implementation of enumerations with native PHP\",\n \"homepage\": \"https://github.com/marc-mabe/php-enum\",\n \"keywords\": [\n \"enum\",\n \"enum-map\",\n \"enum-set\",\n \"enumeration\",\n \"enumerator\",\n \"enummap\",\n \"enumset\",\n \"map\",\n \"set\",\n \"type\",\n \"type-hint\",\n \"typehint\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/marc-mabe/php-enum/issues\",\n \"source\": \"https://github.com/marc-mabe/php-enum/tree/v4.7.1\"\n },\n \"time\": \"2024-11-28T04:54:44+00:00\"\n },\n {\n \"name\": \"mockery/mockery\",\n \"version\": \"1.6.12\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/mockery/mockery.git\",\n \"reference\": \"1f4efdd7d3beafe9807b08156dfcb176d18f1699\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/mockery/mockery/zipball/1f4efdd7d3beafe9807b08156dfcb176d18f1699\",\n \"reference\": \"1f4efdd7d3beafe9807b08156dfcb176d18f1699\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"hamcrest/hamcrest-php\": \"^2.0.1\",\n \"lib-pcre\": \">=7.0\",\n \"php\": \">=7.3\"\n },\n \"conflict\": {\n \"phpunit/phpunit\": \"<8.0\"\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \"^8.5 || ^9.6.17\",\n \"symplify/easy-coding-standard\": \"^12.1.14\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"files\": [\n \"library/helpers.php\",\n \"library/Mockery.php\"\n ],\n \"psr-4\": {\n \"Mockery\\\\\": \"library/Mockery\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"BSD-3-Clause\"\n ],\n \"authors\": [\n {\n \"name\": \"Pádraic Brady\",\n \"email\": \"padraic.brady@gmail.com\",\n \"homepage\": \"https://github.com/padraic\",\n \"role\": \"Author\"\n },\n {\n \"name\": \"Dave Marshall\",\n \"email\": \"dave.marshall@atstsolutions.co.uk\",\n \"homepage\": \"https://davedevelopment.co.uk\",\n \"role\": \"Developer\"\n },\n {\n \"name\": \"Nathanael Esayeas\",\n \"email\": \"nathanael.esayeas@protonmail.com\",\n \"homepage\": \"https://github.com/ghostwriter\",\n \"role\": \"Lead Developer\"\n }\n ],\n \"description\": \"Mockery is a simple yet flexible PHP mock object framework\",\n \"homepage\": \"https://github.com/mockery/mockery\",\n \"keywords\": [\n \"BDD\",\n \"TDD\",\n \"library\",\n \"mock\",\n \"mock objects\",\n \"mockery\",\n \"stub\",\n \"test\",\n \"test double\",\n \"testing\"\n ],\n \"support\": {\n \"docs\": \"https://docs.mockery.io/\",\n \"issues\": \"https://github.com/mockery/mockery/issues\",\n \"rss\": \"https://github.com/mockery/mockery/releases.atom\",\n \"security\": \"https://github.com/mockery/mockery/security/advisories\",\n \"source\": \"https://github.com/mockery/mockery\"\n },\n \"time\": \"2024-05-16T03:13:13+00:00\"\n },\n {\n \"name\": \"myclabs/deep-copy\",\n \"version\": \"1.13.4\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/myclabs/DeepCopy.git\",\n \"reference\": \"07d290f0c47959fd5eed98c95ee5602db07e0b6a\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/myclabs/DeepCopy/zipball/07d290f0c47959fd5eed98c95ee5602db07e0b6a\",\n \"reference\": \"07d290f0c47959fd5eed98c95ee5602db07e0b6a\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \"^7.1 || ^8.0\"\n },\n \"conflict\": {\n \"doctrine/collections\": \"<1.6.8\",\n \"doctrine/common\": \"<2.13.3 || >=3 <3.2.2\"\n },\n \"require-dev\": {\n \"doctrine/collections\": \"^1.6.8\",\n \"doctrine/common\": \"^2.13.3 || ^3.2.2\",\n \"phpspec/prophecy\": \"^1.10\",\n \"phpunit/phpunit\": \"^7.5.20 || ^8.5.23 || ^9.5.13\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"files\": [\n \"src/DeepCopy/deep_copy.php\"\n ],\n \"psr-4\": {\n \"DeepCopy\\\\\": \"src/DeepCopy/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"description\": \"Create deep copies (clones) of your objects\",\n \"keywords\": [\n \"clone\",\n \"copy\",\n \"duplicate\",\n \"object\",\n \"object graph\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/myclabs/DeepCopy/issues\",\n \"source\": \"https://github.com/myclabs/DeepCopy/tree/1.13.4\"\n },\n \"funding\": [\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/myclabs/deep-copy\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2025-08-01T08:46:24+00:00\"\n },\n {\n \"name\": \"netresearch/jsonmapper\",\n \"version\": \"v4.5.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/cweiske/jsonmapper.git\",\n \"reference\": \"8e76efb98ee8b6afc54687045e1b8dba55ac76e5\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/cweiske/jsonmapper/zipball/8e76efb98ee8b6afc54687045e1b8dba55ac76e5\",\n \"reference\": \"8e76efb98ee8b6afc54687045e1b8dba55ac76e5\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"ext-json\": \"*\",\n \"ext-pcre\": \"*\",\n \"ext-reflection\": \"*\",\n \"ext-spl\": \"*\",\n \"php\": \">=7.1\"\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \"~7.5 || ~8.0 || ~9.0 || ~10.0\",\n \"squizlabs/php_codesniffer\": \"~3.5\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-0\": {\n \"JsonMapper\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"OSL-3.0\"\n ],\n \"authors\": [\n {\n \"name\": \"Christian Weiske\",\n \"email\": \"cweiske@cweiske.de\",\n \"homepage\": \"http://github.com/cweiske/jsonmapper/\",\n \"role\": \"Developer\"\n }\n ],\n \"description\": \"Map nested JSON structures onto PHP classes\",\n \"support\": {\n \"email\": \"cweiske@cweiske.de\",\n \"issues\": \"https://github.com/cweiske/jsonmapper/issues\",\n \"source\": \"https://github.com/cweiske/jsonmapper/tree/v4.5.0\"\n },\n \"time\": \"2024-09-08T10:13:13+00:00\"\n },\n {\n \"name\": \"nunomaduro/collision\",\n \"version\": \"v8.8.2\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/nunomaduro/collision.git\",\n \"reference\": \"60207965f9b7b7a4ce15a0f75d57f9dadb105bdb\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/nunomaduro/collision/zipball/60207965f9b7b7a4ce15a0f75d57f9dadb105bdb\",\n \"reference\": \"60207965f9b7b7a4ce15a0f75d57f9dadb105bdb\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"filp/whoops\": \"^2.18.1\",\n \"nunomaduro/termwind\": \"^2.3.1\",\n \"php\": \"^8.2.0\",\n \"symfony/console\": \"^7.3.0\"\n },\n \"conflict\": {\n \"laravel/framework\": \"<11.44.2 || >=13.0.0\",\n \"phpunit/phpunit\": \"<11.5.15 || >=13.0.0\"\n },\n \"require-dev\": {\n \"brianium/paratest\": \"^7.8.3\",\n \"larastan/larastan\": \"^3.4.2\",\n \"laravel/framework\": \"^11.44.2 || ^12.18\",\n \"laravel/pint\": \"^1.22.1\",\n \"laravel/sail\": \"^1.43.1\",\n \"laravel/sanctum\": \"^4.1.1\",\n \"laravel/tinker\": \"^2.10.1\",\n \"orchestra/testbench-core\": \"^9.12.0 || ^10.4\",\n \"pestphp/pest\": \"^3.8.2\",\n \"sebastian/environment\": \"^7.2.1 || ^8.0\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"laravel\": {\n \"providers\": [\n \"NunoMaduro\\\\Collision\\\\Adapters\\\\Laravel\\\\CollisionServiceProvider\"\n ]\n },\n \"branch-alias\": {\n \"dev-8.x\": \"8.x-dev\"\n }\n },\n \"autoload\": {\n \"files\": [\n \"./src/Adapters/Phpunit/Autoload.php\"\n ],\n \"psr-4\": {\n \"NunoMaduro\\\\Collision\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Nuno Maduro\",\n \"email\": \"enunomaduro@gmail.com\"\n }\n ],\n \"description\": \"Cli error handling for console/command-line PHP applications.\",\n \"keywords\": [\n \"artisan\",\n \"cli\",\n \"command-line\",\n \"console\",\n \"dev\",\n \"error\",\n \"handling\",\n \"laravel\",\n \"laravel-zero\",\n \"php\",\n \"symfony\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/nunomaduro/collision/issues\",\n \"source\": \"https://github.com/nunomaduro/collision\"\n },\n \"funding\": [\n {\n \"url\": \"https://www.paypal.com/paypalme/enunomaduro\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/nunomaduro\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://www.patreon.com/nunomaduro\",\n \"type\": \"patreon\"\n }\n ],\n \"time\": \"2025-06-25T02:12:12+00:00\"\n },\n {\n \"name\": \"ondram/ci-detector\",\n \"version\": \"4.2.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/OndraM/ci-detector.git\",\n \"reference\": \"8b0223b5ed235fd377c75fdd1bfcad05c0f168b8\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/OndraM/ci-detector/zipball/8b0223b5ed235fd377c75fdd1bfcad05c0f168b8\",\n \"reference\": \"8b0223b5ed235fd377c75fdd1bfcad05c0f168b8\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \"^7.4 || ^8.0\"\n },\n \"require-dev\": {\n \"ergebnis/composer-normalize\": \"^2.13.2\",\n \"lmc/coding-standard\": \"^3.0.0\",\n \"php-parallel-lint/php-parallel-lint\": \"^1.2\",\n \"phpstan/extension-installer\": \"^1.1.0\",\n \"phpstan/phpstan\": \"^1.2.0\",\n \"phpstan/phpstan-phpunit\": \"^1.0.0\",\n \"phpunit/phpunit\": \"^9.6.13\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"OndraM\\\\CiDetector\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Ondřej Machulda\",\n \"email\": \"ondrej.machulda@gmail.com\"\n }\n ],\n \"description\": \"Detect continuous integration environment and provide unified access to properties of current build\",\n \"keywords\": [\n \"CircleCI\",\n \"Codeship\",\n \"Wercker\",\n \"adapter\",\n \"appveyor\",\n \"aws\",\n \"aws codebuild\",\n \"azure\",\n \"azure devops\",\n \"azure pipelines\",\n \"bamboo\",\n \"bitbucket\",\n \"buddy\",\n \"ci-info\",\n \"codebuild\",\n \"continuous integration\",\n \"continuousphp\",\n \"devops\",\n \"drone\",\n \"github\",\n \"gitlab\",\n \"interface\",\n \"jenkins\",\n \"pipelines\",\n \"sourcehut\",\n \"teamcity\",\n \"travis\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/OndraM/ci-detector/issues\",\n \"source\": \"https://github.com/OndraM/ci-detector/tree/4.2.0\"\n },\n \"time\": \"2024-03-12T13:22:30+00:00\"\n },\n {\n \"name\": \"phar-io/manifest\",\n \"version\": \"2.0.4\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/phar-io/manifest.git\",\n \"reference\": \"54750ef60c58e43759730615a392c31c80e23176\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/phar-io/manifest/zipball/54750ef60c58e43759730615a392c31c80e23176\",\n \"reference\": \"54750ef60c58e43759730615a392c31c80e23176\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"ext-dom\": \"*\",\n \"ext-libxml\": \"*\",\n \"ext-phar\": \"*\",\n \"ext-xmlwriter\": \"*\",\n \"phar-io/version\": \"^3.0.1\",\n \"php\": \"^7.2 || ^8.0\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"2.0.x-dev\"\n }\n },\n \"autoload\": {\n \"classmap\": [\n \"src/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"BSD-3-Clause\"\n ],\n \"authors\": [\n {\n \"name\": \"Arne Blankerts\",\n \"email\": \"arne@blankerts.de\",\n \"role\": \"Developer\"\n },\n {\n \"name\": \"Sebastian Heuer\",\n \"email\": \"sebastian@phpeople.de\",\n \"role\": \"Developer\"\n },\n {\n \"name\": \"Sebastian Bergmann\",\n \"email\": \"sebastian@phpunit.de\",\n \"role\": \"Developer\"\n }\n ],\n \"description\": \"Component for reading phar.io manifest information from a PHP Archive (PHAR)\",\n \"support\": {\n \"issues\": \"https://github.com/phar-io/manifest/issues\",\n \"source\": \"https://github.com/phar-io/manifest/tree/2.0.4\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/theseer\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2024-03-03T12:33:53+00:00\"\n },\n {\n \"name\": \"phar-io/version\",\n \"version\": \"3.2.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/phar-io/version.git\",\n \"reference\": \"4f7fd7836c6f332bb2933569e566a0d6c4cbed74\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74\",\n \"reference\": \"4f7fd7836c6f332bb2933569e566a0d6c4cbed74\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \"^7.2 || ^8.0\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"classmap\": [\n \"src/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"BSD-3-Clause\"\n ],\n \"authors\": [\n {\n \"name\": \"Arne Blankerts\",\n \"email\": \"arne@blankerts.de\",\n \"role\": \"Developer\"\n },\n {\n \"name\": \"Sebastian Heuer\",\n \"email\": \"sebastian@phpeople.de\",\n \"role\": \"Developer\"\n },\n {\n \"name\": \"Sebastian Bergmann\",\n \"email\": \"sebastian@phpunit.de\",\n \"role\": \"Developer\"\n }\n ],\n \"description\": \"Library for handling version information and constraints\",\n \"support\": {\n \"issues\": \"https://github.com/phar-io/version/issues\",\n \"source\": \"https://github.com/phar-io/version/tree/3.2.1\"\n },\n \"time\": \"2022-02-21T01:04:05+00:00\"\n },\n {\n \"name\": \"php-debugbar/php-debugbar\",\n \"version\": \"v2.2.4\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/php-debugbar/php-debugbar.git\",\n \"reference\": \"3146d04671f51f69ffec2a4207ac3bdcf13a9f35\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/php-debugbar/php-debugbar/zipball/3146d04671f51f69ffec2a4207ac3bdcf13a9f35\",\n \"reference\": \"3146d04671f51f69ffec2a4207ac3bdcf13a9f35\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \"^8\",\n \"psr/log\": \"^1|^2|^3\",\n \"symfony/var-dumper\": \"^4|^5|^6|^7\"\n },\n \"replace\": {\n \"maximebf/debugbar\": \"self.version\"\n },\n \"require-dev\": {\n \"dbrekelmans/bdi\": \"^1\",\n \"phpunit/phpunit\": \"^8|^9\",\n \"symfony/panther\": \"^1|^2.1\",\n \"twig/twig\": \"^1.38|^2.7|^3.0\"\n },\n \"suggest\": {\n \"kriswallsmith/assetic\": \"The best way to manage assets\",\n \"monolog/monolog\": \"Log using Monolog\",\n \"predis/predis\": \"Redis storage\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"2.1-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"DebugBar\\\\\": \"src/DebugBar/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Maxime Bouroumeau-Fuseau\",\n \"email\": \"maxime.bouroumeau@gmail.com\",\n \"homepage\": \"http://maximebf.com\"\n },\n {\n \"name\": \"Barry vd. Heuvel\",\n \"email\": \"barryvdh@gmail.com\"\n }\n ],\n \"description\": \"Debug bar in the browser for php application\",\n \"homepage\": \"https://github.com/php-debugbar/php-debugbar\",\n \"keywords\": [\n \"debug\",\n \"debug bar\",\n \"debugbar\",\n \"dev\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/php-debugbar/php-debugbar/issues\",\n \"source\": \"https://github.com/php-debugbar/php-debugbar/tree/v2.2.4\"\n },\n \"time\": \"2025-07-22T14:01:30+00:00\"\n },\n {\n \"name\": \"phpdocumentor/reflection-common\",\n \"version\": \"2.2.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/phpDocumentor/ReflectionCommon.git\",\n \"reference\": \"1d01c49d4ed62f25aa84a747ad35d5a16924662b\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b\",\n \"reference\": \"1d01c49d4ed62f25aa84a747ad35d5a16924662b\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \"^7.2 || ^8.0\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-2.x\": \"2.x-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"phpDocumentor\\\\Reflection\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Jaap van Otterdijk\",\n \"email\": \"opensource@ijaap.nl\"\n }\n ],\n \"description\": \"Common reflection classes used by phpdocumentor to reflect the code structure\",\n \"homepage\": \"http://www.phpdoc.org\",\n \"keywords\": [\n \"FQSEN\",\n \"phpDocumentor\",\n \"phpdoc\",\n \"reflection\",\n \"static analysis\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/phpDocumentor/ReflectionCommon/issues\",\n \"source\": \"https://github.com/phpDocumentor/ReflectionCommon/tree/2.x\"\n },\n \"time\": \"2020-06-27T09:03:43+00:00\"\n },\n {\n \"name\": \"phpdocumentor/reflection-docblock\",\n \"version\": \"5.6.3\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/phpDocumentor/ReflectionDocBlock.git\",\n \"reference\": \"94f8051919d1b0369a6bcc7931d679a511c03fe9\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/94f8051919d1b0369a6bcc7931d679a511c03fe9\",\n \"reference\": \"94f8051919d1b0369a6bcc7931d679a511c03fe9\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"doctrine/deprecations\": \"^1.1\",\n \"ext-filter\": \"*\",\n \"php\": \"^7.4 || ^8.0\",\n \"phpdocumentor/reflection-common\": \"^2.2\",\n \"phpdocumentor/type-resolver\": \"^1.7\",\n \"phpstan/phpdoc-parser\": \"^1.7|^2.0\",\n \"webmozart/assert\": \"^1.9.1\"\n },\n \"require-dev\": {\n \"mockery/mockery\": \"~1.3.5 || ~1.6.0\",\n \"phpstan/extension-installer\": \"^1.1\",\n \"phpstan/phpstan\": \"^1.8\",\n \"phpstan/phpstan-mockery\": \"^1.1\",\n \"phpstan/phpstan-webmozart-assert\": \"^1.2\",\n \"phpunit/phpunit\": \"^9.5\",\n \"psalm/phar\": \"^5.26\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"5.x-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"phpDocumentor\\\\Reflection\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Mike van Riel\",\n \"email\": \"me@mikevanriel.com\"\n },\n {\n \"name\": \"Jaap van Otterdijk\",\n \"email\": \"opensource@ijaap.nl\"\n }\n ],\n \"description\": \"With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.\",\n \"support\": {\n \"issues\": \"https://github.com/phpDocumentor/ReflectionDocBlock/issues\",\n \"source\": \"https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.6.3\"\n },\n \"time\": \"2025-08-01T19:43:32+00:00\"\n },\n {\n \"name\": \"phpdocumentor/type-resolver\",\n \"version\": \"1.10.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/phpDocumentor/TypeResolver.git\",\n \"reference\": \"679e3ce485b99e84c775d28e2e96fade9a7fb50a\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/679e3ce485b99e84c775d28e2e96fade9a7fb50a\",\n \"reference\": \"679e3ce485b99e84c775d28e2e96fade9a7fb50a\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"doctrine/deprecations\": \"^1.0\",\n \"php\": \"^7.3 || ^8.0\",\n \"phpdocumentor/reflection-common\": \"^2.0\",\n \"phpstan/phpdoc-parser\": \"^1.18|^2.0\"\n },\n \"require-dev\": {\n \"ext-tokenizer\": \"*\",\n \"phpbench/phpbench\": \"^1.2\",\n \"phpstan/extension-installer\": \"^1.1\",\n \"phpstan/phpstan\": \"^1.8\",\n \"phpstan/phpstan-phpunit\": \"^1.1\",\n \"phpunit/phpunit\": \"^9.5\",\n \"rector/rector\": \"^0.13.9\",\n \"vimeo/psalm\": \"^4.25\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-1.x\": \"1.x-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"phpDocumentor\\\\Reflection\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Mike van Riel\",\n \"email\": \"me@mikevanriel.com\"\n }\n ],\n \"description\": \"A PSR-5 based resolver of Class names, Types and Structural Element Names\",\n \"support\": {\n \"issues\": \"https://github.com/phpDocumentor/TypeResolver/issues\",\n \"source\": \"https://github.com/phpDocumentor/TypeResolver/tree/1.10.0\"\n },\n \"time\": \"2024-11-09T15:12:26+00:00\"\n },\n {\n \"name\": \"phpstan/phpdoc-parser\",\n \"version\": \"2.3.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/phpstan/phpdoc-parser.git\",\n \"reference\": \"1e0cd5370df5dd2e556a36b9c62f62e555870495\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/phpstan/phpdoc-parser/zipball/1e0cd5370df5dd2e556a36b9c62f62e555870495\",\n \"reference\": \"1e0cd5370df5dd2e556a36b9c62f62e555870495\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \"^7.4 || ^8.0\"\n },\n \"require-dev\": {\n \"doctrine/annotations\": \"^2.0\",\n \"nikic/php-parser\": \"^5.3.0\",\n \"php-parallel-lint/php-parallel-lint\": \"^1.2\",\n \"phpstan/extension-installer\": \"^1.0\",\n \"phpstan/phpstan\": \"^2.0\",\n \"phpstan/phpstan-phpunit\": \"^2.0\",\n \"phpstan/phpstan-strict-rules\": \"^2.0\",\n \"phpunit/phpunit\": \"^9.6\",\n \"symfony/process\": \"^5.2\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"PHPStan\\\\PhpDocParser\\\\\": [\n \"src/\"\n ]\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"description\": \"PHPDoc parser with support for nullable, intersection and generic types\",\n \"support\": {\n \"issues\": \"https://github.com/phpstan/phpdoc-parser/issues\",\n \"source\": \"https://github.com/phpstan/phpdoc-parser/tree/2.3.0\"\n },\n \"time\": \"2025-08-30T15:50:23+00:00\"\n },\n {\n \"name\": \"phpstan/phpstan\",\n \"version\": \"2.1.22\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/phpstan/phpstan.git\",\n \"reference\": \"41600c8379eb5aee63e9413fe9e97273e25d57e4\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/phpstan/phpstan/zipball/41600c8379eb5aee63e9413fe9e97273e25d57e4\",\n \"reference\": \"41600c8379eb5aee63e9413fe9e97273e25d57e4\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \"^7.4|^8.0\"\n },\n \"conflict\": {\n \"phpstan/phpstan-shim\": \"*\"\n },\n \"bin\": [\n \"phpstan\",\n \"phpstan.phar\"\n ],\n \"type\": \"library\",\n \"autoload\": {\n \"files\": [\n \"bootstrap.php\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"description\": \"PHPStan - PHP Static Analysis Tool\",\n \"keywords\": [\n \"dev\",\n \"static analysis\"\n ],\n \"support\": {\n \"docs\": \"https://phpstan.org/user-guide/getting-started\",\n \"forum\": \"https://github.com/phpstan/phpstan/discussions\",\n \"issues\": \"https://github.com/phpstan/phpstan/issues\",\n \"security\": \"https://github.com/phpstan/phpstan/security/policy\",\n \"source\": \"https://github.com/phpstan/phpstan-src\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/ondrejmirtes\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://github.com/phpstan\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2025-08-04T19:17:37+00:00\"\n },\n {\n \"name\": \"phpunit/php-code-coverage\",\n \"version\": \"11.0.12\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/sebastianbergmann/php-code-coverage.git\",\n \"reference\": \"2c1ed04922802c15e1de5d7447b4856de949cf56\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/2c1ed04922802c15e1de5d7447b4856de949cf56\",\n \"reference\": \"2c1ed04922802c15e1de5d7447b4856de949cf56\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"ext-dom\": \"*\",\n \"ext-libxml\": \"*\",\n \"ext-xmlwriter\": \"*\",\n \"nikic/php-parser\": \"^5.7.0\",\n \"php\": \">=8.2\",\n \"phpunit/php-file-iterator\": \"^5.1.0\",\n \"phpunit/php-text-template\": \"^4.0.1\",\n \"sebastian/code-unit-reverse-lookup\": \"^4.0.1\",\n \"sebastian/complexity\": \"^4.0.1\",\n \"sebastian/environment\": \"^7.2.1\",\n \"sebastian/lines-of-code\": \"^3.0.1\",\n \"sebastian/version\": \"^5.0.2\",\n \"theseer/tokenizer\": \"^1.3.1\"\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \"^11.5.46\"\n },\n \"suggest\": {\n \"ext-pcov\": \"PHP extension that provides line coverage\",\n \"ext-xdebug\": \"PHP extension that provides line coverage as well as branch and path coverage\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-main\": \"11.0.x-dev\"\n }\n },\n \"autoload\": {\n \"classmap\": [\n \"src/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"BSD-3-Clause\"\n ],\n \"authors\": [\n {\n \"name\": \"Sebastian Bergmann\",\n \"email\": \"sebastian@phpunit.de\",\n \"role\": \"lead\"\n }\n ],\n \"description\": \"Library that provides collection, processing, and rendering functionality for PHP code coverage information.\",\n \"homepage\": \"https://github.com/sebastianbergmann/php-code-coverage\",\n \"keywords\": [\n \"coverage\",\n \"testing\",\n \"xunit\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/sebastianbergmann/php-code-coverage/issues\",\n \"security\": \"https://github.com/sebastianbergmann/php-code-coverage/security/policy\",\n \"source\": \"https://github.com/sebastianbergmann/php-code-coverage/tree/11.0.12\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/sebastianbergmann\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://liberapay.com/sebastianbergmann\",\n \"type\": \"liberapay\"\n },\n {\n \"url\": \"https://thanks.dev/u/gh/sebastianbergmann\",\n \"type\": \"thanks_dev\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/phpunit/php-code-coverage\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2025-12-24T07:01:01+00:00\"\n },\n {\n \"name\": \"phpunit/php-file-iterator\",\n \"version\": \"5.1.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/sebastianbergmann/php-file-iterator.git\",\n \"reference\": \"2f3a64888c814fc235386b7387dd5b5ed92ad903\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/2f3a64888c814fc235386b7387dd5b5ed92ad903\",\n \"reference\": \"2f3a64888c814fc235386b7387dd5b5ed92ad903\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.2\"\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \"^11.3\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-main\": \"5.1-dev\"\n }\n },\n \"autoload\": {\n \"classmap\": [\n \"src/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"BSD-3-Clause\"\n ],\n \"authors\": [\n {\n \"name\": \"Sebastian Bergmann\",\n \"email\": \"sebastian@phpunit.de\",\n \"role\": \"lead\"\n }\n ],\n \"description\": \"FilterIterator implementation that filters files based on a list of suffixes.\",\n \"homepage\": \"https://github.com/sebastianbergmann/php-file-iterator/\",\n \"keywords\": [\n \"filesystem\",\n \"iterator\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/sebastianbergmann/php-file-iterator/issues\",\n \"security\": \"https://github.com/sebastianbergmann/php-file-iterator/security/policy\",\n \"source\": \"https://github.com/sebastianbergmann/php-file-iterator/tree/5.1.1\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/sebastianbergmann\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://liberapay.com/sebastianbergmann\",\n \"type\": \"liberapay\"\n },\n {\n \"url\": \"https://thanks.dev/u/gh/sebastianbergmann\",\n \"type\": \"thanks_dev\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/phpunit/php-file-iterator\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2026-02-02T13:52:54+00:00\"\n },\n {\n \"name\": \"phpunit/php-invoker\",\n \"version\": \"5.0.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/sebastianbergmann/php-invoker.git\",\n \"reference\": \"c1ca3814734c07492b3d4c5f794f4b0995333da2\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/c1ca3814734c07492b3d4c5f794f4b0995333da2\",\n \"reference\": \"c1ca3814734c07492b3d4c5f794f4b0995333da2\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.2\"\n },\n \"require-dev\": {\n \"ext-pcntl\": \"*\",\n \"phpunit/phpunit\": \"^11.0\"\n },\n \"suggest\": {\n \"ext-pcntl\": \"*\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-main\": \"5.0-dev\"\n }\n },\n \"autoload\": {\n \"classmap\": [\n \"src/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"BSD-3-Clause\"\n ],\n \"authors\": [\n {\n \"name\": \"Sebastian Bergmann\",\n \"email\": \"sebastian@phpunit.de\",\n \"role\": \"lead\"\n }\n ],\n \"description\": \"Invoke callables with a timeout\",\n \"homepage\": \"https://github.com/sebastianbergmann/php-invoker/\",\n \"keywords\": [\n \"process\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/sebastianbergmann/php-invoker/issues\",\n \"security\": \"https://github.com/sebastianbergmann/php-invoker/security/policy\",\n \"source\": \"https://github.com/sebastianbergmann/php-invoker/tree/5.0.1\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/sebastianbergmann\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2024-07-03T05:07:44+00:00\"\n },\n {\n \"name\": \"phpunit/php-text-template\",\n \"version\": \"4.0.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/sebastianbergmann/php-text-template.git\",\n \"reference\": \"3e0404dc6b300e6bf56415467ebcb3fe4f33e964\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/3e0404dc6b300e6bf56415467ebcb3fe4f33e964\",\n \"reference\": \"3e0404dc6b300e6bf56415467ebcb3fe4f33e964\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.2\"\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \"^11.0\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-main\": \"4.0-dev\"\n }\n },\n \"autoload\": {\n \"classmap\": [\n \"src/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"BSD-3-Clause\"\n ],\n \"authors\": [\n {\n \"name\": \"Sebastian Bergmann\",\n \"email\": \"sebastian@phpunit.de\",\n \"role\": \"lead\"\n }\n ],\n \"description\": \"Simple template engine.\",\n \"homepage\": \"https://github.com/sebastianbergmann/php-text-template/\",\n \"keywords\": [\n \"template\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/sebastianbergmann/php-text-template/issues\",\n \"security\": \"https://github.com/sebastianbergmann/php-text-template/security/policy\",\n \"source\": \"https://github.com/sebastianbergmann/php-text-template/tree/4.0.1\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/sebastianbergmann\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2024-07-03T05:08:43+00:00\"\n },\n {\n \"name\": \"phpunit/php-timer\",\n \"version\": \"7.0.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/sebastianbergmann/php-timer.git\",\n \"reference\": \"3b415def83fbcb41f991d9ebf16ae4ad8b7837b3\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/sebastianbergmann/php-timer/zipball/3b415def83fbcb41f991d9ebf16ae4ad8b7837b3\",\n \"reference\": \"3b415def83fbcb41f991d9ebf16ae4ad8b7837b3\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.2\"\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \"^11.0\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-main\": \"7.0-dev\"\n }\n },\n \"autoload\": {\n \"classmap\": [\n \"src/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"BSD-3-Clause\"\n ],\n \"authors\": [\n {\n \"name\": \"Sebastian Bergmann\",\n \"email\": \"sebastian@phpunit.de\",\n \"role\": \"lead\"\n }\n ],\n \"description\": \"Utility class for timing\",\n \"homepage\": \"https://github.com/sebastianbergmann/php-timer/\",\n \"keywords\": [\n \"timer\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/sebastianbergmann/php-timer/issues\",\n \"security\": \"https://github.com/sebastianbergmann/php-timer/security/policy\",\n \"source\": \"https://github.com/sebastianbergmann/php-timer/tree/7.0.1\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/sebastianbergmann\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2024-07-03T05:09:35+00:00\"\n },\n {\n \"name\": \"phpunit/phpunit\",\n \"version\": \"11.5.55\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/sebastianbergmann/phpunit.git\",\n \"reference\": \"adc7262fccc12de2b30f12a8aa0b33775d814f00\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/sebastianbergmann/phpunit/zipball/adc7262fccc12de2b30f12a8aa0b33775d814f00\",\n \"reference\": \"adc7262fccc12de2b30f12a8aa0b33775d814f00\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"ext-dom\": \"*\",\n \"ext-json\": \"*\",\n \"ext-libxml\": \"*\",\n \"ext-mbstring\": \"*\",\n \"ext-xml\": \"*\",\n \"ext-xmlwriter\": \"*\",\n \"myclabs/deep-copy\": \"^1.13.4\",\n \"phar-io/manifest\": \"^2.0.4\",\n \"phar-io/version\": \"^3.2.1\",\n \"php\": \">=8.2\",\n \"phpunit/php-code-coverage\": \"^11.0.12\",\n \"phpunit/php-file-iterator\": \"^5.1.1\",\n \"phpunit/php-invoker\": \"^5.0.1\",\n \"phpunit/php-text-template\": \"^4.0.1\",\n \"phpunit/php-timer\": \"^7.0.1\",\n \"sebastian/cli-parser\": \"^3.0.2\",\n \"sebastian/code-unit\": \"^3.0.3\",\n \"sebastian/comparator\": \"^6.3.3\",\n \"sebastian/diff\": \"^6.0.2\",\n \"sebastian/environment\": \"^7.2.1\",\n \"sebastian/exporter\": \"^6.3.2\",\n \"sebastian/global-state\": \"^7.0.2\",\n \"sebastian/object-enumerator\": \"^6.0.1\",\n \"sebastian/recursion-context\": \"^6.0.3\",\n \"sebastian/type\": \"^5.1.3\",\n \"sebastian/version\": \"^5.0.2\",\n \"staabm/side-effects-detector\": \"^1.0.5\"\n },\n \"suggest\": {\n \"ext-soap\": \"To be able to generate mocks based on WSDL files\"\n },\n \"bin\": [\n \"phpunit\"\n ],\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-main\": \"11.5-dev\"\n }\n },\n \"autoload\": {\n \"files\": [\n \"src/Framework/Assert/Functions.php\"\n ],\n \"classmap\": [\n \"src/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"BSD-3-Clause\"\n ],\n \"authors\": [\n {\n \"name\": \"Sebastian Bergmann\",\n \"email\": \"sebastian@phpunit.de\",\n \"role\": \"lead\"\n }\n ],\n \"description\": \"The PHP Unit Testing framework.\",\n \"homepage\": \"https://phpunit.de/\",\n \"keywords\": [\n \"phpunit\",\n \"testing\",\n \"xunit\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/sebastianbergmann/phpunit/issues\",\n \"security\": \"https://github.com/sebastianbergmann/phpunit/security/policy\",\n \"source\": \"https://github.com/sebastianbergmann/phpunit/tree/11.5.55\"\n },\n \"funding\": [\n {\n \"url\": \"https://phpunit.de/sponsors.html\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/sebastianbergmann\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://liberapay.com/sebastianbergmann\",\n \"type\": \"liberapay\"\n },\n {\n \"url\": \"https://thanks.dev/u/gh/sebastianbergmann\",\n \"type\": \"thanks_dev\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/phpunit/phpunit\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2026-02-18T12:37:06+00:00\"\n },\n {\n \"name\": \"react/child-process\",\n \"version\": \"v0.6.6\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/reactphp/child-process.git\",\n \"reference\": \"1721e2b93d89b745664353b9cfc8f155ba8a6159\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/reactphp/child-process/zipball/1721e2b93d89b745664353b9cfc8f155ba8a6159\",\n \"reference\": \"1721e2b93d89b745664353b9cfc8f155ba8a6159\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"evenement/evenement\": \"^3.0 || ^2.0 || ^1.0\",\n \"php\": \">=5.3.0\",\n \"react/event-loop\": \"^1.2\",\n \"react/stream\": \"^1.4\"\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \"^9.6 || ^5.7 || ^4.8.36\",\n \"react/socket\": \"^1.16\",\n \"sebastian/environment\": \"^5.0 || ^3.0 || ^2.0 || ^1.0\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"React\\\\ChildProcess\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Christian Lück\",\n \"email\": \"christian@clue.engineering\",\n \"homepage\": \"https://clue.engineering/\"\n },\n {\n \"name\": \"Cees-Jan Kiewiet\",\n \"email\": \"reactphp@ceesjankiewiet.nl\",\n \"homepage\": \"https://wyrihaximus.net/\"\n },\n {\n \"name\": \"Jan Sorgalla\",\n \"email\": \"jsorgalla@gmail.com\",\n \"homepage\": \"https://sorgalla.com/\"\n },\n {\n \"name\": \"Chris Boden\",\n \"email\": \"cboden@gmail.com\",\n \"homepage\": \"https://cboden.dev/\"\n }\n ],\n \"description\": \"Event-driven library for executing child processes with ReactPHP.\",\n \"keywords\": [\n \"event-driven\",\n \"process\",\n \"reactphp\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/reactphp/child-process/issues\",\n \"source\": \"https://github.com/reactphp/child-process/tree/v0.6.6\"\n },\n \"funding\": [\n {\n \"url\": \"https://opencollective.com/reactphp\",\n \"type\": \"open_collective\"\n }\n ],\n \"time\": \"2025-01-01T16:37:48+00:00\"\n },\n {\n \"name\": \"revolt/event-loop\",\n \"version\": \"v1.0.7\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/revoltphp/event-loop.git\",\n \"reference\": \"09bf1bf7f7f574453efe43044b06fafe12216eb3\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/revoltphp/event-loop/zipball/09bf1bf7f7f574453efe43044b06fafe12216eb3\",\n \"reference\": \"09bf1bf7f7f574453efe43044b06fafe12216eb3\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.1\"\n },\n \"require-dev\": {\n \"ext-json\": \"*\",\n \"jetbrains/phpstorm-stubs\": \"^2019.3\",\n \"phpunit/phpunit\": \"^9\",\n \"psalm/phar\": \"^5.15\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-main\": \"1.x-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Revolt\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Aaron Piotrowski\",\n \"email\": \"aaron@trowski.com\"\n },\n {\n \"name\": \"Cees-Jan Kiewiet\",\n \"email\": \"ceesjank@gmail.com\"\n },\n {\n \"name\": \"Christian Lück\",\n \"email\": \"christian@clue.engineering\"\n },\n {\n \"name\": \"Niklas Keller\",\n \"email\": \"me@kelunik.com\"\n }\n ],\n \"description\": \"Rock-solid event loop for concurrent PHP applications.\",\n \"keywords\": [\n \"async\",\n \"asynchronous\",\n \"concurrency\",\n \"event\",\n \"event-loop\",\n \"non-blocking\",\n \"scheduler\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/revoltphp/event-loop/issues\",\n \"source\": \"https://github.com/revoltphp/event-loop/tree/v1.0.7\"\n },\n \"time\": \"2025-01-25T19:27:39+00:00\"\n },\n {\n \"name\": \"sanmai/later\",\n \"version\": \"0.1.7\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/sanmai/later.git\",\n \"reference\": \"72a82d783864bca90412d8a26c1878f8981fee97\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/sanmai/later/zipball/72a82d783864bca90412d8a26c1878f8981fee97\",\n \"reference\": \"72a82d783864bca90412d8a26c1878f8981fee97\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.2\"\n },\n \"require-dev\": {\n \"ergebnis/composer-normalize\": \"^2.8\",\n \"friendsofphp/php-cs-fixer\": \"^3.35.1\",\n \"infection/infection\": \">=0.27.6\",\n \"phan/phan\": \">=2\",\n \"php-coveralls/php-coveralls\": \"^2.0\",\n \"phpstan/phpstan\": \">=1.4.5\",\n \"phpunit/phpunit\": \">=9.5 <10\",\n \"vimeo/psalm\": \">=2\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-main\": \"0.1.x-dev\"\n }\n },\n \"autoload\": {\n \"files\": [\n \"src/functions.php\"\n ],\n \"psr-4\": {\n \"Later\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"Apache-2.0\"\n ],\n \"authors\": [\n {\n \"name\": \"Alexey Kopytko\",\n \"email\": \"alexey@kopytko.com\"\n }\n ],\n \"description\": \"Later: deferred wrapper object\",\n \"support\": {\n \"issues\": \"https://github.com/sanmai/later/issues\",\n \"source\": \"https://github.com/sanmai/later/tree/0.1.7\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/sanmai\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2025-05-11T01:48:00+00:00\"\n },\n {\n \"name\": \"sanmai/pipeline\",\n \"version\": \"6.22\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/sanmai/pipeline.git\",\n \"reference\": \"fb8d0c23b4ef085315a36d397fafa052203020ce\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/sanmai/pipeline/zipball/fb8d0c23b4ef085315a36d397fafa052203020ce\",\n \"reference\": \"fb8d0c23b4ef085315a36d397fafa052203020ce\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.2\"\n },\n \"require-dev\": {\n \"ergebnis/composer-normalize\": \"^2.8\",\n \"esi/phpunit-coverage-check\": \">2\",\n \"friendsofphp/php-cs-fixer\": \"^3.17\",\n \"infection/infection\": \">=0.30.3\",\n \"league/pipeline\": \"^0.3 || ^1.0\",\n \"php-coveralls/php-coveralls\": \"^2.4.1\",\n \"phpstan/extension-installer\": \"^1.4\",\n \"phpstan/phpstan\": \"^2\",\n \"phpunit/phpunit\": \">=9.4 <12\",\n \"sanmai/phpstan-rules\": \"^0.3.0\",\n \"sanmai/phpunit-double-colon-syntax\": \"^0.1.1\",\n \"vimeo/psalm\": \">=2\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-main\": \"v6.x-dev\"\n }\n },\n \"autoload\": {\n \"files\": [\n \"src/functions.php\"\n ],\n \"psr-4\": {\n \"Pipeline\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"Apache-2.0\"\n ],\n \"authors\": [\n {\n \"name\": \"Alexey Kopytko\",\n \"email\": \"alexey@kopytko.com\"\n }\n ],\n \"description\": \"General-purpose collections pipeline\",\n \"support\": {\n \"issues\": \"https://github.com/sanmai/pipeline/issues\",\n \"source\": \"https://github.com/sanmai/pipeline/tree/6.22\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/sanmai\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2025-07-22T09:07:07+00:00\"\n },\n {\n \"name\": \"sebastian/cli-parser\",\n \"version\": \"3.0.2\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/sebastianbergmann/cli-parser.git\",\n \"reference\": \"15c5dd40dc4f38794d383bb95465193f5e0ae180\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/15c5dd40dc4f38794d383bb95465193f5e0ae180\",\n \"reference\": \"15c5dd40dc4f38794d383bb95465193f5e0ae180\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.2\"\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \"^11.0\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-main\": \"3.0-dev\"\n }\n },\n \"autoload\": {\n \"classmap\": [\n \"src/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"BSD-3-Clause\"\n ],\n \"authors\": [\n {\n \"name\": \"Sebastian Bergmann\",\n \"email\": \"sebastian@phpunit.de\",\n \"role\": \"lead\"\n }\n ],\n \"description\": \"Library for parsing CLI options\",\n \"homepage\": \"https://github.com/sebastianbergmann/cli-parser\",\n \"support\": {\n \"issues\": \"https://github.com/sebastianbergmann/cli-parser/issues\",\n \"security\": \"https://github.com/sebastianbergmann/cli-parser/security/policy\",\n \"source\": \"https://github.com/sebastianbergmann/cli-parser/tree/3.0.2\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/sebastianbergmann\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2024-07-03T04:41:36+00:00\"\n },\n {\n \"name\": \"sebastian/code-unit\",\n \"version\": \"3.0.3\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/sebastianbergmann/code-unit.git\",\n \"reference\": \"54391c61e4af8078e5b276ab082b6d3c54c9ad64\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/sebastianbergmann/code-unit/zipball/54391c61e4af8078e5b276ab082b6d3c54c9ad64\",\n \"reference\": \"54391c61e4af8078e5b276ab082b6d3c54c9ad64\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.2\"\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \"^11.5\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-main\": \"3.0-dev\"\n }\n },\n \"autoload\": {\n \"classmap\": [\n \"src/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"BSD-3-Clause\"\n ],\n \"authors\": [\n {\n \"name\": \"Sebastian Bergmann\",\n \"email\": \"sebastian@phpunit.de\",\n \"role\": \"lead\"\n }\n ],\n \"description\": \"Collection of value objects that represent the PHP code units\",\n \"homepage\": \"https://github.com/sebastianbergmann/code-unit\",\n \"support\": {\n \"issues\": \"https://github.com/sebastianbergmann/code-unit/issues\",\n \"security\": \"https://github.com/sebastianbergmann/code-unit/security/policy\",\n \"source\": \"https://github.com/sebastianbergmann/code-unit/tree/3.0.3\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/sebastianbergmann\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2025-03-19T07:56:08+00:00\"\n },\n {\n \"name\": \"sebastian/code-unit-reverse-lookup\",\n \"version\": \"4.0.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/sebastianbergmann/code-unit-reverse-lookup.git\",\n \"reference\": \"183a9b2632194febd219bb9246eee421dad8d45e\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/183a9b2632194febd219bb9246eee421dad8d45e\",\n \"reference\": \"183a9b2632194febd219bb9246eee421dad8d45e\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.2\"\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \"^11.0\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-main\": \"4.0-dev\"\n }\n },\n \"autoload\": {\n \"classmap\": [\n \"src/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"BSD-3-Clause\"\n ],\n \"authors\": [\n {\n \"name\": \"Sebastian Bergmann\",\n \"email\": \"sebastian@phpunit.de\"\n }\n ],\n \"description\": \"Looks up which function or method a line of code belongs to\",\n \"homepage\": \"https://github.com/sebastianbergmann/code-unit-reverse-lookup/\",\n \"support\": {\n \"issues\": \"https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues\",\n \"security\": \"https://github.com/sebastianbergmann/code-unit-reverse-lookup/security/policy\",\n \"source\": \"https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/4.0.1\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/sebastianbergmann\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2024-07-03T04:45:54+00:00\"\n },\n {\n \"name\": \"sebastian/comparator\",\n \"version\": \"6.3.3\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/sebastianbergmann/comparator.git\",\n \"reference\": \"2c95e1e86cb8dd41beb8d502057d1081ccc8eca9\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/sebastianbergmann/comparator/zipball/2c95e1e86cb8dd41beb8d502057d1081ccc8eca9\",\n \"reference\": \"2c95e1e86cb8dd41beb8d502057d1081ccc8eca9\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"ext-dom\": \"*\",\n \"ext-mbstring\": \"*\",\n \"php\": \">=8.2\",\n \"sebastian/diff\": \"^6.0\",\n \"sebastian/exporter\": \"^6.0\"\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \"^11.4\"\n },\n \"suggest\": {\n \"ext-bcmath\": \"For comparing BcMath\\\\Number objects\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-main\": \"6.3-dev\"\n }\n },\n \"autoload\": {\n \"classmap\": [\n \"src/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"BSD-3-Clause\"\n ],\n \"authors\": [\n {\n \"name\": \"Sebastian Bergmann\",\n \"email\": \"sebastian@phpunit.de\"\n },\n {\n \"name\": \"Jeff Welch\",\n \"email\": \"whatthejeff@gmail.com\"\n },\n {\n \"name\": \"Volker Dusch\",\n \"email\": \"github@wallbash.com\"\n },\n {\n \"name\": \"Bernhard Schussek\",\n \"email\": \"bschussek@2bepublished.at\"\n }\n ],\n \"description\": \"Provides the functionality to compare PHP values for equality\",\n \"homepage\": \"https://github.com/sebastianbergmann/comparator\",\n \"keywords\": [\n \"comparator\",\n \"compare\",\n \"equality\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/sebastianbergmann/comparator/issues\",\n \"security\": \"https://github.com/sebastianbergmann/comparator/security/policy\",\n \"source\": \"https://github.com/sebastianbergmann/comparator/tree/6.3.3\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/sebastianbergmann\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://liberapay.com/sebastianbergmann\",\n \"type\": \"liberapay\"\n },\n {\n \"url\": \"https://thanks.dev/u/gh/sebastianbergmann\",\n \"type\": \"thanks_dev\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/sebastian/comparator\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2026-01-24T09:26:40+00:00\"\n },\n {\n \"name\": \"sebastian/complexity\",\n \"version\": \"4.0.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/sebastianbergmann/complexity.git\",\n \"reference\": \"ee41d384ab1906c68852636b6de493846e13e5a0\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/sebastianbergmann/complexity/zipball/ee41d384ab1906c68852636b6de493846e13e5a0\",\n \"reference\": \"ee41d384ab1906c68852636b6de493846e13e5a0\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"nikic/php-parser\": \"^5.0\",\n \"php\": \">=8.2\"\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \"^11.0\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-main\": \"4.0-dev\"\n }\n },\n \"autoload\": {\n \"classmap\": [\n \"src/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"BSD-3-Clause\"\n ],\n \"authors\": [\n {\n \"name\": \"Sebastian Bergmann\",\n \"email\": \"sebastian@phpunit.de\",\n \"role\": \"lead\"\n }\n ],\n \"description\": \"Library for calculating the complexity of PHP code units\",\n \"homepage\": \"https://github.com/sebastianbergmann/complexity\",\n \"support\": {\n \"issues\": \"https://github.com/sebastianbergmann/complexity/issues\",\n \"security\": \"https://github.com/sebastianbergmann/complexity/security/policy\",\n \"source\": \"https://github.com/sebastianbergmann/complexity/tree/4.0.1\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/sebastianbergmann\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2024-07-03T04:49:50+00:00\"\n },\n {\n \"name\": \"sebastian/diff\",\n \"version\": \"6.0.2\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/sebastianbergmann/diff.git\",\n \"reference\": \"b4ccd857127db5d41a5b676f24b51371d76d8544\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/sebastianbergmann/diff/zipball/b4ccd857127db5d41a5b676f24b51371d76d8544\",\n \"reference\": \"b4ccd857127db5d41a5b676f24b51371d76d8544\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.2\"\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \"^11.0\",\n \"symfony/process\": \"^4.2 || ^5\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-main\": \"6.0-dev\"\n }\n },\n \"autoload\": {\n \"classmap\": [\n \"src/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"BSD-3-Clause\"\n ],\n \"authors\": [\n {\n \"name\": \"Sebastian Bergmann\",\n \"email\": \"sebastian@phpunit.de\"\n },\n {\n \"name\": \"Kore Nordmann\",\n \"email\": \"mail@kore-nordmann.de\"\n }\n ],\n \"description\": \"Diff implementation\",\n \"homepage\": \"https://github.com/sebastianbergmann/diff\",\n \"keywords\": [\n \"diff\",\n \"udiff\",\n \"unidiff\",\n \"unified diff\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/sebastianbergmann/diff/issues\",\n \"security\": \"https://github.com/sebastianbergmann/diff/security/policy\",\n \"source\": \"https://github.com/sebastianbergmann/diff/tree/6.0.2\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/sebastianbergmann\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2024-07-03T04:53:05+00:00\"\n },\n {\n \"name\": \"sebastian/environment\",\n \"version\": \"7.2.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/sebastianbergmann/environment.git\",\n \"reference\": \"a5c75038693ad2e8d4b6c15ba2403532647830c4\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/sebastianbergmann/environment/zipball/a5c75038693ad2e8d4b6c15ba2403532647830c4\",\n \"reference\": \"a5c75038693ad2e8d4b6c15ba2403532647830c4\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.2\"\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \"^11.3\"\n },\n \"suggest\": {\n \"ext-posix\": \"*\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-main\": \"7.2-dev\"\n }\n },\n \"autoload\": {\n \"classmap\": [\n \"src/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"BSD-3-Clause\"\n ],\n \"authors\": [\n {\n \"name\": \"Sebastian Bergmann\",\n \"email\": \"sebastian@phpunit.de\"\n }\n ],\n \"description\": \"Provides functionality to handle HHVM/PHP environments\",\n \"homepage\": \"https://github.com/sebastianbergmann/environment\",\n \"keywords\": [\n \"Xdebug\",\n \"environment\",\n \"hhvm\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/sebastianbergmann/environment/issues\",\n \"security\": \"https://github.com/sebastianbergmann/environment/security/policy\",\n \"source\": \"https://github.com/sebastianbergmann/environment/tree/7.2.1\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/sebastianbergmann\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://liberapay.com/sebastianbergmann\",\n \"type\": \"liberapay\"\n },\n {\n \"url\": \"https://thanks.dev/u/gh/sebastianbergmann\",\n \"type\": \"thanks_dev\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/sebastian/environment\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2025-05-21T11:55:47+00:00\"\n },\n {\n \"name\": \"sebastian/exporter\",\n \"version\": \"6.3.2\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/sebastianbergmann/exporter.git\",\n \"reference\": \"70a298763b40b213ec087c51c739efcaa90bcd74\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/sebastianbergmann/exporter/zipball/70a298763b40b213ec087c51c739efcaa90bcd74\",\n \"reference\": \"70a298763b40b213ec087c51c739efcaa90bcd74\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"ext-mbstring\": \"*\",\n \"php\": \">=8.2\",\n \"sebastian/recursion-context\": \"^6.0\"\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \"^11.3\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-main\": \"6.3-dev\"\n }\n },\n \"autoload\": {\n \"classmap\": [\n \"src/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"BSD-3-Clause\"\n ],\n \"authors\": [\n {\n \"name\": \"Sebastian Bergmann\",\n \"email\": \"sebastian@phpunit.de\"\n },\n {\n \"name\": \"Jeff Welch\",\n \"email\": \"whatthejeff@gmail.com\"\n },\n {\n \"name\": \"Volker Dusch\",\n \"email\": \"github@wallbash.com\"\n },\n {\n \"name\": \"Adam Harvey\",\n \"email\": \"aharvey@php.net\"\n },\n {\n \"name\": \"Bernhard Schussek\",\n \"email\": \"bschussek@gmail.com\"\n }\n ],\n \"description\": \"Provides the functionality to export PHP variables for visualization\",\n \"homepage\": \"https://www.github.com/sebastianbergmann/exporter\",\n \"keywords\": [\n \"export\",\n \"exporter\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/sebastianbergmann/exporter/issues\",\n \"security\": \"https://github.com/sebastianbergmann/exporter/security/policy\",\n \"source\": \"https://github.com/sebastianbergmann/exporter/tree/6.3.2\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/sebastianbergmann\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://liberapay.com/sebastianbergmann\",\n \"type\": \"liberapay\"\n },\n {\n \"url\": \"https://thanks.dev/u/gh/sebastianbergmann\",\n \"type\": \"thanks_dev\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/sebastian/exporter\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2025-09-24T06:12:51+00:00\"\n },\n {\n \"name\": \"sebastian/global-state\",\n \"version\": \"7.0.2\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/sebastianbergmann/global-state.git\",\n \"reference\": \"3be331570a721f9a4b5917f4209773de17f747d7\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/sebastianbergmann/global-state/zipball/3be331570a721f9a4b5917f4209773de17f747d7\",\n \"reference\": \"3be331570a721f9a4b5917f4209773de17f747d7\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.2\",\n \"sebastian/object-reflector\": \"^4.0\",\n \"sebastian/recursion-context\": \"^6.0\"\n },\n \"require-dev\": {\n \"ext-dom\": \"*\",\n \"phpunit/phpunit\": \"^11.0\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-main\": \"7.0-dev\"\n }\n },\n \"autoload\": {\n \"classmap\": [\n \"src/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"BSD-3-Clause\"\n ],\n \"authors\": [\n {\n \"name\": \"Sebastian Bergmann\",\n \"email\": \"sebastian@phpunit.de\"\n }\n ],\n \"description\": \"Snapshotting of global state\",\n \"homepage\": \"https://www.github.com/sebastianbergmann/global-state\",\n \"keywords\": [\n \"global state\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/sebastianbergmann/global-state/issues\",\n \"security\": \"https://github.com/sebastianbergmann/global-state/security/policy\",\n \"source\": \"https://github.com/sebastianbergmann/global-state/tree/7.0.2\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/sebastianbergmann\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2024-07-03T04:57:36+00:00\"\n },\n {\n \"name\": \"sebastian/lines-of-code\",\n \"version\": \"3.0.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/sebastianbergmann/lines-of-code.git\",\n \"reference\": \"d36ad0d782e5756913e42ad87cb2890f4ffe467a\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/d36ad0d782e5756913e42ad87cb2890f4ffe467a\",\n \"reference\": \"d36ad0d782e5756913e42ad87cb2890f4ffe467a\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"nikic/php-parser\": \"^5.0\",\n \"php\": \">=8.2\"\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \"^11.0\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-main\": \"3.0-dev\"\n }\n },\n \"autoload\": {\n \"classmap\": [\n \"src/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"BSD-3-Clause\"\n ],\n \"authors\": [\n {\n \"name\": \"Sebastian Bergmann\",\n \"email\": \"sebastian@phpunit.de\",\n \"role\": \"lead\"\n }\n ],\n \"description\": \"Library for counting the lines of code in PHP source code\",\n \"homepage\": \"https://github.com/sebastianbergmann/lines-of-code\",\n \"support\": {\n \"issues\": \"https://github.com/sebastianbergmann/lines-of-code/issues\",\n \"security\": \"https://github.com/sebastianbergmann/lines-of-code/security/policy\",\n \"source\": \"https://github.com/sebastianbergmann/lines-of-code/tree/3.0.1\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/sebastianbergmann\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2024-07-03T04:58:38+00:00\"\n },\n {\n \"name\": \"sebastian/object-enumerator\",\n \"version\": \"6.0.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/sebastianbergmann/object-enumerator.git\",\n \"reference\": \"f5b498e631a74204185071eb41f33f38d64608aa\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/f5b498e631a74204185071eb41f33f38d64608aa\",\n \"reference\": \"f5b498e631a74204185071eb41f33f38d64608aa\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.2\",\n \"sebastian/object-reflector\": \"^4.0\",\n \"sebastian/recursion-context\": \"^6.0\"\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \"^11.0\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-main\": \"6.0-dev\"\n }\n },\n \"autoload\": {\n \"classmap\": [\n \"src/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"BSD-3-Clause\"\n ],\n \"authors\": [\n {\n \"name\": \"Sebastian Bergmann\",\n \"email\": \"sebastian@phpunit.de\"\n }\n ],\n \"description\": \"Traverses array structures and object graphs to enumerate all referenced objects\",\n \"homepage\": \"https://github.com/sebastianbergmann/object-enumerator/\",\n \"support\": {\n \"issues\": \"https://github.com/sebastianbergmann/object-enumerator/issues\",\n \"security\": \"https://github.com/sebastianbergmann/object-enumerator/security/policy\",\n \"source\": \"https://github.com/sebastianbergmann/object-enumerator/tree/6.0.1\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/sebastianbergmann\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2024-07-03T05:00:13+00:00\"\n },\n {\n \"name\": \"sebastian/object-reflector\",\n \"version\": \"4.0.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/sebastianbergmann/object-reflector.git\",\n \"reference\": \"6e1a43b411b2ad34146dee7524cb13a068bb35f9\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/6e1a43b411b2ad34146dee7524cb13a068bb35f9\",\n \"reference\": \"6e1a43b411b2ad34146dee7524cb13a068bb35f9\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.2\"\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \"^11.0\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-main\": \"4.0-dev\"\n }\n },\n \"autoload\": {\n \"classmap\": [\n \"src/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"BSD-3-Clause\"\n ],\n \"authors\": [\n {\n \"name\": \"Sebastian Bergmann\",\n \"email\": \"sebastian@phpunit.de\"\n }\n ],\n \"description\": \"Allows reflection of object attributes, including inherited and non-public ones\",\n \"homepage\": \"https://github.com/sebastianbergmann/object-reflector/\",\n \"support\": {\n \"issues\": \"https://github.com/sebastianbergmann/object-reflector/issues\",\n \"security\": \"https://github.com/sebastianbergmann/object-reflector/security/policy\",\n \"source\": \"https://github.com/sebastianbergmann/object-reflector/tree/4.0.1\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/sebastianbergmann\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2024-07-03T05:01:32+00:00\"\n },\n {\n \"name\": \"sebastian/recursion-context\",\n \"version\": \"6.0.3\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/sebastianbergmann/recursion-context.git\",\n \"reference\": \"f6458abbf32a6c8174f8f26261475dc133b3d9dc\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/f6458abbf32a6c8174f8f26261475dc133b3d9dc\",\n \"reference\": \"f6458abbf32a6c8174f8f26261475dc133b3d9dc\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.2\"\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \"^11.3\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-main\": \"6.0-dev\"\n }\n },\n \"autoload\": {\n \"classmap\": [\n \"src/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"BSD-3-Clause\"\n ],\n \"authors\": [\n {\n \"name\": \"Sebastian Bergmann\",\n \"email\": \"sebastian@phpunit.de\"\n },\n {\n \"name\": \"Jeff Welch\",\n \"email\": \"whatthejeff@gmail.com\"\n },\n {\n \"name\": \"Adam Harvey\",\n \"email\": \"aharvey@php.net\"\n }\n ],\n \"description\": \"Provides functionality to recursively process PHP variables\",\n \"homepage\": \"https://github.com/sebastianbergmann/recursion-context\",\n \"support\": {\n \"issues\": \"https://github.com/sebastianbergmann/recursion-context/issues\",\n \"security\": \"https://github.com/sebastianbergmann/recursion-context/security/policy\",\n \"source\": \"https://github.com/sebastianbergmann/recursion-context/tree/6.0.3\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/sebastianbergmann\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://liberapay.com/sebastianbergmann\",\n \"type\": \"liberapay\"\n },\n {\n \"url\": \"https://thanks.dev/u/gh/sebastianbergmann\",\n \"type\": \"thanks_dev\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/sebastian/recursion-context\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2025-08-13T04:42:22+00:00\"\n },\n {\n \"name\": \"sebastian/type\",\n \"version\": \"5.1.3\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/sebastianbergmann/type.git\",\n \"reference\": \"f77d2d4e78738c98d9a68d2596fe5e8fa380f449\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/sebastianbergmann/type/zipball/f77d2d4e78738c98d9a68d2596fe5e8fa380f449\",\n \"reference\": \"f77d2d4e78738c98d9a68d2596fe5e8fa380f449\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.2\"\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \"^11.3\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-main\": \"5.1-dev\"\n }\n },\n \"autoload\": {\n \"classmap\": [\n \"src/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"BSD-3-Clause\"\n ],\n \"authors\": [\n {\n \"name\": \"Sebastian Bergmann\",\n \"email\": \"sebastian@phpunit.de\",\n \"role\": \"lead\"\n }\n ],\n \"description\": \"Collection of value objects that represent the types of the PHP type system\",\n \"homepage\": \"https://github.com/sebastianbergmann/type\",\n \"support\": {\n \"issues\": \"https://github.com/sebastianbergmann/type/issues\",\n \"security\": \"https://github.com/sebastianbergmann/type/security/policy\",\n \"source\": \"https://github.com/sebastianbergmann/type/tree/5.1.3\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/sebastianbergmann\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://liberapay.com/sebastianbergmann\",\n \"type\": \"liberapay\"\n },\n {\n \"url\": \"https://thanks.dev/u/gh/sebastianbergmann\",\n \"type\": \"thanks_dev\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/sebastian/type\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2025-08-09T06:55:48+00:00\"\n },\n {\n \"name\": \"sebastian/version\",\n \"version\": \"5.0.2\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/sebastianbergmann/version.git\",\n \"reference\": \"c687e3387b99f5b03b6caa64c74b63e2936ff874\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/sebastianbergmann/version/zipball/c687e3387b99f5b03b6caa64c74b63e2936ff874\",\n \"reference\": \"c687e3387b99f5b03b6caa64c74b63e2936ff874\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.2\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-main\": \"5.0-dev\"\n }\n },\n \"autoload\": {\n \"classmap\": [\n \"src/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"BSD-3-Clause\"\n ],\n \"authors\": [\n {\n \"name\": \"Sebastian Bergmann\",\n \"email\": \"sebastian@phpunit.de\",\n \"role\": \"lead\"\n }\n ],\n \"description\": \"Library that helps with managing the version number of Git-hosted PHP projects\",\n \"homepage\": \"https://github.com/sebastianbergmann/version\",\n \"support\": {\n \"issues\": \"https://github.com/sebastianbergmann/version/issues\",\n \"security\": \"https://github.com/sebastianbergmann/version/security/policy\",\n \"source\": \"https://github.com/sebastianbergmann/version/tree/5.0.2\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/sebastianbergmann\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2024-10-09T05:16:32+00:00\"\n },\n {\n \"name\": \"spatie/array-to-xml\",\n \"version\": \"3.4.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/spatie/array-to-xml.git\",\n \"reference\": \"7dcfc67d60b0272926dabad1ec01f6b8a5fb5e67\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/spatie/array-to-xml/zipball/7dcfc67d60b0272926dabad1ec01f6b8a5fb5e67\",\n \"reference\": \"7dcfc67d60b0272926dabad1ec01f6b8a5fb5e67\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"ext-dom\": \"*\",\n \"php\": \"^8.0\"\n },\n \"require-dev\": {\n \"mockery/mockery\": \"^1.2\",\n \"pestphp/pest\": \"^1.21\",\n \"spatie/pest-plugin-snapshots\": \"^1.1\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-main\": \"3.x-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Spatie\\\\ArrayToXml\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Freek Van der Herten\",\n \"email\": \"freek@spatie.be\",\n \"homepage\": \"https://freek.dev\",\n \"role\": \"Developer\"\n }\n ],\n \"description\": \"Convert an array to xml\",\n \"homepage\": \"https://github.com/spatie/array-to-xml\",\n \"keywords\": [\n \"array\",\n \"convert\",\n \"xml\"\n ],\n \"support\": {\n \"source\": \"https://github.com/spatie/array-to-xml/tree/3.4.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://spatie.be/open-source/support-us\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/spatie\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2024-12-16T12:45:15+00:00\"\n },\n {\n \"name\": \"staabm/side-effects-detector\",\n \"version\": \"1.0.5\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/staabm/side-effects-detector.git\",\n \"reference\": \"d8334211a140ce329c13726d4a715adbddd0a163\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/staabm/side-effects-detector/zipball/d8334211a140ce329c13726d4a715adbddd0a163\",\n \"reference\": \"d8334211a140ce329c13726d4a715adbddd0a163\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"ext-tokenizer\": \"*\",\n \"php\": \"^7.4 || ^8.0\"\n },\n \"require-dev\": {\n \"phpstan/extension-installer\": \"^1.4.3\",\n \"phpstan/phpstan\": \"^1.12.6\",\n \"phpunit/phpunit\": \"^9.6.21\",\n \"symfony/var-dumper\": \"^5.4.43\",\n \"tomasvotruba/type-coverage\": \"1.0.0\",\n \"tomasvotruba/unused-public\": \"1.0.0\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"classmap\": [\n \"lib/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"description\": \"A static analysis tool to detect side effects in PHP code\",\n \"keywords\": [\n \"static analysis\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/staabm/side-effects-detector/issues\",\n \"source\": \"https://github.com/staabm/side-effects-detector/tree/1.0.5\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/staabm\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2024-10-20T05:08:20+00:00\"\n },\n {\n \"name\": \"symfony/phpunit-bridge\",\n \"version\": \"v7.3.3\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/phpunit-bridge.git\",\n \"reference\": \"7954e563ed14f924593169f6c4645d58d9d9ac77\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/phpunit-bridge/zipball/7954e563ed14f924593169f6c4645d58d9d9ac77\",\n \"reference\": \"7954e563ed14f924593169f6c4645d58d9d9ac77\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=7.2.5\"\n },\n \"conflict\": {\n \"phpunit/phpunit\": \"<7.5|9.1.2\"\n },\n \"require-dev\": {\n \"symfony/deprecation-contracts\": \"^2.5|^3.0\",\n \"symfony/error-handler\": \"^5.4|^6.4|^7.0\",\n \"symfony/polyfill-php81\": \"^1.27\"\n },\n \"bin\": [\n \"bin/simple-phpunit\"\n ],\n \"type\": \"symfony-bridge\",\n \"extra\": {\n \"thanks\": {\n \"url\": \"https://github.com/sebastianbergmann/phpunit\",\n \"name\": \"phpunit/phpunit\"\n }\n },\n \"autoload\": {\n \"files\": [\n \"bootstrap.php\"\n ],\n \"psr-4\": {\n \"Symfony\\\\Bridge\\\\PhpUnit\\\\\": \"\"\n },\n \"exclude-from-classmap\": [\n \"/Tests/\",\n \"/bin/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Nicolas Grekas\",\n \"email\": \"p@tchwork.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Provides utilities for PHPUnit, especially user deprecation notices management\",\n \"homepage\": \"https://symfony.com\",\n \"keywords\": [\n \"testing\"\n ],\n \"support\": {\n \"source\": \"https://github.com/symfony/phpunit-bridge/tree/v7.3.3\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://github.com/nicolas-grekas\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2025-08-04T15:15:28+00:00\"\n },\n {\n \"name\": \"symfony/polyfill-php81\",\n \"version\": \"v1.33.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/polyfill-php81.git\",\n \"reference\": \"4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/polyfill-php81/zipball/4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c\",\n \"reference\": \"4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=7.2\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"thanks\": {\n \"url\": \"https://github.com/symfony/polyfill\",\n \"name\": \"symfony/polyfill\"\n }\n },\n \"autoload\": {\n \"files\": [\n \"bootstrap.php\"\n ],\n \"psr-4\": {\n \"Symfony\\\\Polyfill\\\\Php81\\\\\": \"\"\n },\n \"classmap\": [\n \"Resources/stubs\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Nicolas Grekas\",\n \"email\": \"p@tchwork.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Symfony polyfill backporting some PHP 8.1+ features to lower PHP versions\",\n \"homepage\": \"https://symfony.com\",\n \"keywords\": [\n \"compatibility\",\n \"polyfill\",\n \"portable\",\n \"shim\"\n ],\n \"support\": {\n \"source\": \"https://github.com/symfony/polyfill-php81/tree/v1.33.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://github.com/nicolas-grekas\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2024-09-09T11:45:10+00:00\"\n },\n {\n \"name\": \"symfony/stopwatch\",\n \"version\": \"v7.3.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/stopwatch.git\",\n \"reference\": \"5a49289e2b308214c8b9c2fda4ea454d8b8ad7cd\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/stopwatch/zipball/5a49289e2b308214c8b9c2fda4ea454d8b8ad7cd\",\n \"reference\": \"5a49289e2b308214c8b9c2fda4ea454d8b8ad7cd\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.2\",\n \"symfony/service-contracts\": \"^2.5|^3\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Symfony\\\\Component\\\\Stopwatch\\\\\": \"\"\n },\n \"exclude-from-classmap\": [\n \"/Tests/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Fabien Potencier\",\n \"email\": \"fabien@symfony.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Provides a way to profile code\",\n \"homepage\": \"https://symfony.com\",\n \"support\": {\n \"source\": \"https://github.com/symfony/stopwatch/tree/v7.3.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2025-02-24T10:49:57+00:00\"\n },\n {\n \"name\": \"thecodingmachine/safe\",\n \"version\": \"v3.3.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/thecodingmachine/safe.git\",\n \"reference\": \"2cdd579eeaa2e78e51c7509b50cc9fb89a956236\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/thecodingmachine/safe/zipball/2cdd579eeaa2e78e51c7509b50cc9fb89a956236\",\n \"reference\": \"2cdd579eeaa2e78e51c7509b50cc9fb89a956236\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \"^8.1\"\n },\n \"require-dev\": {\n \"php-parallel-lint/php-parallel-lint\": \"^1.4\",\n \"phpstan/phpstan\": \"^2\",\n \"phpunit/phpunit\": \"^10\",\n \"squizlabs/php_codesniffer\": \"^3.2\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"files\": [\n \"lib/special_cases.php\",\n \"generated/apache.php\",\n \"generated/apcu.php\",\n \"generated/array.php\",\n \"generated/bzip2.php\",\n \"generated/calendar.php\",\n \"generated/classobj.php\",\n \"generated/com.php\",\n \"generated/cubrid.php\",\n \"generated/curl.php\",\n \"generated/datetime.php\",\n \"generated/dir.php\",\n \"generated/eio.php\",\n \"generated/errorfunc.php\",\n \"generated/exec.php\",\n \"generated/fileinfo.php\",\n \"generated/filesystem.php\",\n \"generated/filter.php\",\n \"generated/fpm.php\",\n \"generated/ftp.php\",\n \"generated/funchand.php\",\n \"generated/gettext.php\",\n \"generated/gmp.php\",\n \"generated/gnupg.php\",\n \"generated/hash.php\",\n \"generated/ibase.php\",\n \"generated/ibmDb2.php\",\n \"generated/iconv.php\",\n \"generated/image.php\",\n \"generated/imap.php\",\n \"generated/info.php\",\n \"generated/inotify.php\",\n \"generated/json.php\",\n \"generated/ldap.php\",\n \"generated/libxml.php\",\n \"generated/lzf.php\",\n \"generated/mailparse.php\",\n \"generated/mbstring.php\",\n \"generated/misc.php\",\n \"generated/mysql.php\",\n \"generated/mysqli.php\",\n \"generated/network.php\",\n \"generated/oci8.php\",\n \"generated/opcache.php\",\n \"generated/openssl.php\",\n \"generated/outcontrol.php\",\n \"generated/pcntl.php\",\n \"generated/pcre.php\",\n \"generated/pgsql.php\",\n \"generated/posix.php\",\n \"generated/ps.php\",\n \"generated/pspell.php\",\n \"generated/readline.php\",\n \"generated/rnp.php\",\n \"generated/rpminfo.php\",\n \"generated/rrd.php\",\n \"generated/sem.php\",\n \"generated/session.php\",\n \"generated/shmop.php\",\n \"generated/sockets.php\",\n \"generated/sodium.php\",\n \"generated/solr.php\",\n \"generated/spl.php\",\n \"generated/sqlsrv.php\",\n \"generated/ssdeep.php\",\n \"generated/ssh2.php\",\n \"generated/stream.php\",\n \"generated/strings.php\",\n \"generated/swoole.php\",\n \"generated/uodbc.php\",\n \"generated/uopz.php\",\n \"generated/url.php\",\n \"generated/var.php\",\n \"generated/xdiff.php\",\n \"generated/xml.php\",\n \"generated/xmlrpc.php\",\n \"generated/yaml.php\",\n \"generated/yaz.php\",\n \"generated/zip.php\",\n \"generated/zlib.php\"\n ],\n \"classmap\": [\n \"lib/DateTime.php\",\n \"lib/DateTimeImmutable.php\",\n \"lib/Exceptions/\",\n \"generated/Exceptions/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"description\": \"PHP core functions that throw exceptions instead of returning FALSE on error\",\n \"support\": {\n \"issues\": \"https://github.com/thecodingmachine/safe/issues\",\n \"source\": \"https://github.com/thecodingmachine/safe/tree/v3.3.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/OskarStark\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://github.com/shish\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://github.com/staabm\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2025-05-14T06:15:44+00:00\"\n },\n {\n \"name\": \"theseer/tokenizer\",\n \"version\": \"1.3.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/theseer/tokenizer.git\",\n \"reference\": \"b7489ce515e168639d17feec34b8847c326b0b3c\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/theseer/tokenizer/zipball/b7489ce515e168639d17feec34b8847c326b0b3c\",\n \"reference\": \"b7489ce515e168639d17feec34b8847c326b0b3c\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"ext-dom\": \"*\",\n \"ext-tokenizer\": \"*\",\n \"ext-xmlwriter\": \"*\",\n \"php\": \"^7.2 || ^8.0\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"classmap\": [\n \"src/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"BSD-3-Clause\"\n ],\n \"authors\": [\n {\n \"name\": \"Arne Blankerts\",\n \"email\": \"arne@blankerts.de\",\n \"role\": \"Developer\"\n }\n ],\n \"description\": \"A small library for converting tokenized PHP source code into XML and potentially other formats\",\n \"support\": {\n \"issues\": \"https://github.com/theseer/tokenizer/issues\",\n \"source\": \"https://github.com/theseer/tokenizer/tree/1.3.1\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/theseer\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2025-11-17T20:03:58+00:00\"\n },\n {\n \"name\": \"vimeo/psalm\",\n \"version\": \"6.5.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/vimeo/psalm.git\",\n \"reference\": \"38fc8444edf0cebc9205296ee6e30e906ade783b\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/vimeo/psalm/zipball/38fc8444edf0cebc9205296ee6e30e906ade783b\",\n \"reference\": \"38fc8444edf0cebc9205296ee6e30e906ade783b\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"amphp/amp\": \"^3\",\n \"amphp/byte-stream\": \"^2\",\n \"amphp/parallel\": \"^2.3\",\n \"composer-runtime-api\": \"^2\",\n \"composer/semver\": \"^1.4 || ^2.0 || ^3.0\",\n \"composer/xdebug-handler\": \"^2.0 || ^3.0\",\n \"dnoegel/php-xdg-base-dir\": \"^0.1.1\",\n \"ext-ctype\": \"*\",\n \"ext-dom\": \"*\",\n \"ext-json\": \"*\",\n \"ext-libxml\": \"*\",\n \"ext-mbstring\": \"*\",\n \"ext-simplexml\": \"*\",\n \"ext-tokenizer\": \"*\",\n \"felixfbecker/advanced-json-rpc\": \"^3.1\",\n \"felixfbecker/language-server-protocol\": \"^1.5.3\",\n \"fidry/cpu-core-counter\": \"^0.4.1 || ^0.5.1 || ^1.0.0\",\n \"netresearch/jsonmapper\": \"^1.0 || ^2.0 || ^3.0 || ^4.0\",\n \"nikic/php-parser\": \"^5.0.0\",\n \"php\": \"~8.1.17 || ~8.2.4 || ~8.3.0 || ~8.4.0\",\n \"sebastian/diff\": \"^4.0 || ^5.0 || ^6.0 || ^7.0\",\n \"spatie/array-to-xml\": \"^2.17.0 || ^3.0\",\n \"symfony/console\": \"^6.0 || ^7.0\",\n \"symfony/filesystem\": \"^6.0 || ^7.0\"\n },\n \"provide\": {\n \"psalm/psalm\": \"self.version\"\n },\n \"require-dev\": {\n \"amphp/phpunit-util\": \"^3\",\n \"bamarni/composer-bin-plugin\": \"^1.4\",\n \"brianium/paratest\": \"^6.9\",\n \"dg/bypass-finals\": \"^1.5\",\n \"ext-curl\": \"*\",\n \"mockery/mockery\": \"^1.5\",\n \"nunomaduro/mock-final-classes\": \"^1.1\",\n \"php-parallel-lint/php-parallel-lint\": \"^1.2\",\n \"phpstan/phpdoc-parser\": \"^1.6\",\n \"phpunit/phpunit\": \"^9.6\",\n \"psalm/plugin-mockery\": \"^1.1\",\n \"psalm/plugin-phpunit\": \"^0.19\",\n \"slevomat/coding-standard\": \"^8.4\",\n \"squizlabs/php_codesniffer\": \"^3.6\",\n \"symfony/process\": \"^6.0 || ^7.0\"\n },\n \"suggest\": {\n \"ext-curl\": \"In order to send data to shepherd\",\n \"ext-igbinary\": \"^2.0.5 is required, used to serialize caching data\"\n },\n \"bin\": [\n \"psalm\",\n \"psalm-language-server\",\n \"psalm-plugin\",\n \"psalm-refactor\",\n \"psalm-review\",\n \"psalter\"\n ],\n \"type\": \"project\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-1.x\": \"1.x-dev\",\n \"dev-2.x\": \"2.x-dev\",\n \"dev-3.x\": \"3.x-dev\",\n \"dev-4.x\": \"4.x-dev\",\n \"dev-5.x\": \"5.x-dev\",\n \"dev-6.x\": \"6.x-dev\",\n \"dev-master\": \"7.x-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Psalm\\\\\": \"src/Psalm/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Matthew Brown\"\n },\n {\n \"name\": \"Daniil Gentili\",\n \"email\": \"daniil@daniil.it\"\n }\n ],\n \"description\": \"A static analysis tool for finding errors in PHP applications\",\n \"keywords\": [\n \"code\",\n \"inspection\",\n \"php\",\n \"static analysis\"\n ],\n \"support\": {\n \"docs\": \"https://psalm.dev/docs\",\n \"issues\": \"https://github.com/vimeo/psalm/issues\",\n \"source\": \"https://github.com/vimeo/psalm\"\n },\n \"time\": \"2025-02-07T20:42:25+00:00\"\n },\n {\n \"name\": \"webmozart/assert\",\n \"version\": \"1.12.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/webmozarts/assert.git\",\n \"reference\": \"9be6926d8b485f55b9229203f962b51ed377ba68\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/webmozarts/assert/zipball/9be6926d8b485f55b9229203f962b51ed377ba68\",\n \"reference\": \"9be6926d8b485f55b9229203f962b51ed377ba68\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"ext-ctype\": \"*\",\n \"ext-date\": \"*\",\n \"ext-filter\": \"*\",\n \"php\": \"^7.2 || ^8.0\"\n },\n \"suggest\": {\n \"ext-intl\": \"\",\n \"ext-simplexml\": \"\",\n \"ext-spl\": \"\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"1.10-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Webmozart\\\\Assert\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Bernhard Schussek\",\n \"email\": \"bschussek@gmail.com\"\n }\n ],\n \"description\": \"Assertions to validate method input/output with nice error messages.\",\n \"keywords\": [\n \"assert\",\n \"check\",\n \"validate\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/webmozarts/assert/issues\",\n \"source\": \"https://github.com/webmozarts/assert/tree/1.12.1\"\n },\n \"time\": \"2025-10-29T15:56:20+00:00\"\n },\n {\n \"name\": \"webmozart/glob\",\n \"version\": \"4.7.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/webmozarts/glob.git\",\n \"reference\": \"8a2842112d6916e61e0e15e316465b611f3abc17\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/webmozarts/glob/zipball/8a2842112d6916e61e0e15e316465b611f3abc17\",\n \"reference\": \"8a2842112d6916e61e0e15e316465b611f3abc17\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \"^7.3 || ^8.0.0\"\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \"^9.5\",\n \"symfony/filesystem\": \"^5.3\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"4.1-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Webmozart\\\\Glob\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Bernhard Schussek\",\n \"email\": \"bschussek@gmail.com\"\n }\n ],\n \"description\": \"A PHP implementation of Ant's glob.\",\n \"support\": {\n \"issues\": \"https://github.com/webmozarts/glob/issues\",\n \"source\": \"https://github.com/webmozarts/glob/tree/4.7.0\"\n },\n \"time\": \"2024-03-07T20:33:40+00:00\"\n }\n ],\n \"aliases\": [],\n \"minimum-stability\": \"stable\",\n \"stability-flags\": {\n \"daniti/oauth2-pipedrive\": 20,\n \"jiminny/oauth2-aircall\": 20,\n \"jiminny/oauth2-dialpad\": 20,\n \"jiminny/oauth2-salesloft\": 20,\n \"thenetworg/oauth2-azure\": 20,\n \"tmannherz/oauth2-ringcentral\": 20\n },\n \"prefer-stable\": true,\n \"prefer-lowest\": false,\n \"platform\": {\n \"php\": \"^8.3\",\n \"ext-ctype\": \"*\",\n \"ext-curl\": \"*\",\n \"ext-date\": \"*\",\n \"ext-dom\": \"*\",\n \"ext-fileinfo\": \"*\",\n \"ext-filter\": \"*\",\n \"ext-gd\": \"*\",\n \"ext-gmp\": \"*\",\n \"ext-hash\": \"*\",\n \"ext-iconv\": \"*\",\n \"ext-igbinary\": \"*\",\n \"ext-imagick\": \"*\",\n \"ext-intl\": \"*\",\n \"ext-json\": \"*\",\n \"ext-libxml\": \"*\",\n \"ext-mailparse\": \"*\",\n \"ext-mbstring\": \"*\",\n \"ext-mysqlnd\": \"*\",\n \"ext-openssl\": \"*\",\n \"ext-pcntl\": \"*\",\n \"ext-pcre\": \"*\",\n \"ext-pdo\": \"*\",\n \"ext-pdo_mysql\": \"*\",\n \"ext-phar\": \"*\",\n \"ext-phpiredis\": \"*\",\n \"ext-posix\": \"*\",\n \"ext-readline\": \"*\",\n \"ext-redis\": \"*\",\n \"ext-reflection\": \"*\",\n \"ext-session\": \"*\",\n \"ext-simplexml\": \"*\",\n \"ext-sockets\": \"*\",\n \"ext-spl\": \"*\",\n \"ext-tokenizer\": \"*\",\n \"ext-xml\": \"*\",\n \"ext-xmlreader\": \"*\",\n \"ext-xmlwriter\": \"*\",\n \"ext-zend-opcache\": \"*\",\n \"ext-zip\": \"*\",\n \"ext-zlib\": \"*\",\n \"lib-curl\": \"*\",\n \"lib-curl-openssl\": \"*\",\n \"lib-curl-zlib\": \"*\",\n \"lib-date-timelib\": \"*\",\n \"lib-date-zoneinfo\": \"*\",\n \"lib-fileinfo-libmagic\": \"*\",\n \"lib-gd\": \"*\",\n \"lib-gd-freetype\": \"*\",\n \"lib-gd-libjpeg\": \"*\",\n \"lib-gd-libpng\": \"*\",\n \"lib-gmp\": \"*\",\n \"lib-icu\": \"*\",\n \"lib-icu-cldr\": \"*\",\n \"lib-icu-unicode\": \"*\",\n \"lib-imagick-imagemagick\": \"*\",\n \"lib-libxml\": \"*\",\n \"lib-mbstring-libmbfl\": \"*\",\n \"lib-mbstring-oniguruma\": \"*\",\n \"lib-openssl\": \"*\",\n \"lib-pcre\": \"*\",\n \"lib-pcre-unicode\": \"*\",\n \"lib-zip-libzip\": \"*\",\n \"lib-zlib\": \"*\"\n },\n \"platform-dev\": [],\n \"plugin-api-version\": \"2.6.0\"\n}","depth":16,"bounds":{"left":0.30784574,"top":0.31444532,"width":0.6866689,"height":0.6855547},"value":"{\n \"_readme\": [\n \"This file locks the dependencies of your project to a known state\",\n \"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies\",\n \"This file is @generated automatically\"\n ],\n \"content-hash\": \"c5b624c7761f54da18d67e9d401dc59f\",\n \"packages\": [\n {\n \"name\": \"24slides/laravel-saml2\",\n \"version\": \"2.4.2\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/24Slides/laravel-saml2.git\",\n \"reference\": \"e7f4938586c65fbe1fdd91552c582cac745223b9\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/24Slides/laravel-saml2/zipball/e7f4938586c65fbe1fdd91552c582cac745223b9\",\n \"reference\": \"e7f4938586c65fbe1fdd91552c582cac745223b9\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"ext-openssl\": \"*\",\n \"illuminate/console\": \"~5.5|^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0\",\n \"illuminate/database\": \"~5.5|^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0\",\n \"illuminate/support\": \"~5.4|^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0\",\n \"onelogin/php-saml\": \"^3.0|^4.0\",\n \"php\": \">=7.1\",\n \"ramsey/uuid\": \"^3.8|^4.0\"\n },\n \"require-dev\": {\n \"mockery/mockery\": \"^0.9.9\",\n \"phpunit/phpunit\": \"^7.5|^9.0\",\n \"squizlabs/php_codesniffer\": \"^2.3\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"laravel\": {\n \"aliases\": {\n \"Saml2\": \"Slides\\\\Saml2\\\\Facades\\\\Auth\"\n },\n \"providers\": [\n \"Slides\\\\Saml2\\\\ServiceProvider\"\n ]\n },\n \"branch-aliases\": {\n \"dev-master\": \"2.0.8-dev\"\n }\n },\n \"autoload\": {\n \"files\": [\n \"src/helpers.php\"\n ],\n \"psr-4\": {\n \"Slides\\\\Saml2\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Artem Brezhnev\",\n \"email\": \"brezzhnev@gmail.com\"\n }\n ],\n \"description\": \"SAML2 Service Provider integration to your Laravel 5.4+ application, based on OneLogin toolkit\",\n \"homepage\": \"https://github.com/24slides/laravel-saml2\",\n \"keywords\": [\n \"SAML2\",\n \"SSO\",\n \"laravel\",\n \"onelogin\",\n \"saml\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/24Slides/laravel-saml2/issues\",\n \"source\": \"https://github.com/24Slides/laravel-saml2/tree/2.4.2\"\n },\n \"time\": \"2025-03-12T12:39:37+00:00\"\n },\n {\n \"name\": \"adam-paterson/oauth2-slack\",\n \"version\": \"1.1.3\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/adam-paterson/oauth2-slack.git\",\n \"reference\": \"ccc329eb3036a89d110227a4137e15d4a5661678\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/adam-paterson/oauth2-slack/zipball/ccc329eb3036a89d110227a4137e15d4a5661678\",\n \"reference\": \"ccc329eb3036a89d110227a4137e15d4a5661678\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"league/oauth2-client\": \"1.*|2.*\",\n \"php\": \">=5.6.0\"\n },\n \"require-dev\": {\n \"mockery/mockery\": \"~0.9\",\n \"phpunit/phpunit\": \"5.6\",\n \"squizlabs/php_codesniffer\": \"~2.0\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"AdamPaterson\\\\OAuth2\\\\Client\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Adam Paterson\",\n \"email\": \"hello@adampaterson.co.uk\"\n }\n ],\n \"description\": \"Slack OAuth 2.0 Client Provider for The PHP League OAuth2-Client\",\n \"keywords\": [\n \"Authentication\",\n \"SSO\",\n \"authorization\",\n \"identity\",\n \"idp\",\n \"oauth\",\n \"oauth2\",\n \"single sign on\",\n \"slack\",\n \"slack api\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/adam-paterson/oauth2-slack/issues\",\n \"source\": \"https://github.com/adam-paterson/oauth2-slack/tree/master\"\n },\n \"time\": \"2017-06-20T14:43:31+00:00\"\n },\n {\n \"name\": \"asimlqt/php-google-spreadsheet-client\",\n \"version\": \"v3.0.2\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/asimlqt/php-google-spreadsheet-client.git\",\n \"reference\": \"fb82cdc12e6cef559a8f1e42dc26e0905f565055\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/asimlqt/php-google-spreadsheet-client/zipball/fb82cdc12e6cef559a8f1e42dc26e0905f565055\",\n \"reference\": \"fb82cdc12e6cef559a8f1e42dc26e0905f565055\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=5.6.0\"\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \"4.4.2\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Google\\\\\": \"src/Google\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"Apache-2.0\"\n ],\n \"authors\": [\n {\n \"name\": \"Asim Liaquat\",\n \"email\": \"asimlqt22@gmail.com\",\n \"role\": \"Developer\"\n }\n ],\n \"description\": \"Google Spreadsheet PHP Client\",\n \"homepage\": \"https://github.com/asimlqt/php-google-spreadsheet-client\",\n \"keywords\": [\n \"google\",\n \"spreadsheet\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/asimlqt/php-google-spreadsheet-client/issues\",\n \"source\": \"https://github.com/asimlqt/php-google-spreadsheet-client/tree/v3.0.2\"\n },\n \"time\": \"2016-11-09T07:43:08+00:00\"\n },\n {\n \"name\": \"aws/aws-crt-php\",\n \"version\": \"v1.2.7\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/awslabs/aws-crt-php.git\",\n \"reference\": \"d71d9906c7bb63a28295447ba12e74723bd3730e\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/awslabs/aws-crt-php/zipball/d71d9906c7bb63a28295447ba12e74723bd3730e\",\n \"reference\": \"d71d9906c7bb63a28295447ba12e74723bd3730e\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=5.5\"\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \"^4.8.35||^5.6.3||^9.5\",\n \"yoast/phpunit-polyfills\": \"^1.0\"\n },\n \"suggest\": {\n \"ext-awscrt\": \"Make sure you install awscrt native extension to use any of the functionality.\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"classmap\": [\n \"src/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"Apache-2.0\"\n ],\n \"authors\": [\n {\n \"name\": \"AWS SDK Common Runtime Team\",\n \"email\": \"aws-sdk-common-runtime@amazon.com\"\n }\n ],\n \"description\": \"AWS Common Runtime for PHP\",\n \"homepage\": \"https://github.com/awslabs/aws-crt-php\",\n \"keywords\": [\n \"amazon\",\n \"aws\",\n \"crt\",\n \"sdk\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/awslabs/aws-crt-php/issues\",\n \"source\": \"https://github.com/awslabs/aws-crt-php/tree/v1.2.7\"\n },\n \"time\": \"2024-10-18T22:15:13+00:00\"\n },\n {\n \"name\": \"aws/aws-sdk-php\",\n \"version\": \"3.373.2\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/aws/aws-sdk-php.git\",\n \"reference\": \"483fba51c28b3a0c0647bf5100e0edca82090b18\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/aws/aws-sdk-php/zipball/483fba51c28b3a0c0647bf5100e0edca82090b18\",\n \"reference\": \"483fba51c28b3a0c0647bf5100e0edca82090b18\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"aws/aws-crt-php\": \"^1.2.3\",\n \"ext-json\": \"*\",\n \"ext-pcre\": \"*\",\n \"ext-simplexml\": \"*\",\n \"guzzlehttp/guzzle\": \"^7.4.5\",\n \"guzzlehttp/promises\": \"^2.0\",\n \"guzzlehttp/psr7\": \"^2.4.5\",\n \"mtdowling/jmespath.php\": \"^2.8.0\",\n \"php\": \">=8.1\",\n \"psr/http-message\": \"^1.0 || ^2.0\",\n \"symfony/filesystem\": \"^v5.4.45 || ^v6.4.3 || ^v7.1.0 || ^v8.0.0\"\n },\n \"require-dev\": {\n \"andrewsville/php-token-reflection\": \"^1.4\",\n \"aws/aws-php-sns-message-validator\": \"~1.0\",\n \"behat/behat\": \"~3.0\",\n \"composer/composer\": \"^2.7.8\",\n \"dms/phpunit-arraysubset-asserts\": \"^v0.5.0\",\n \"doctrine/cache\": \"~1.4\",\n \"ext-dom\": \"*\",\n \"ext-openssl\": \"*\",\n \"ext-sockets\": \"*\",\n \"phpunit/phpunit\": \"^10.0\",\n \"psr/cache\": \"^2.0 || ^3.0\",\n \"psr/simple-cache\": \"^2.0 || ^3.0\",\n \"sebastian/comparator\": \"^1.2.3 || ^4.0 || ^5.0\",\n \"yoast/phpunit-polyfills\": \"^2.0\"\n },\n \"suggest\": {\n \"aws/aws-php-sns-message-validator\": \"To validate incoming SNS notifications\",\n \"doctrine/cache\": \"To use the DoctrineCacheAdapter\",\n \"ext-curl\": \"To send requests using cURL\",\n \"ext-openssl\": \"Allows working with CloudFront private distributions and verifying received SNS messages\",\n \"ext-pcntl\": \"To use client-side monitoring\",\n \"ext-sockets\": \"To use client-side monitoring\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"3.0-dev\"\n }\n },\n \"autoload\": {\n \"files\": [\n \"src/functions.php\"\n ],\n \"psr-4\": {\n \"Aws\\\\\": \"src/\"\n },\n \"exclude-from-classmap\": [\n \"src/data/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"Apache-2.0\"\n ],\n \"authors\": [\n {\n \"name\": \"Amazon Web Services\",\n \"homepage\": \"https://aws.amazon.com\"\n }\n ],\n \"description\": \"AWS SDK for PHP - Use Amazon Web Services in your PHP project\",\n \"homepage\": \"https://aws.amazon.com/sdk-for-php\",\n \"keywords\": [\n \"amazon\",\n \"aws\",\n \"cloud\",\n \"dynamodb\",\n \"ec2\",\n \"glacier\",\n \"s3\",\n \"sdk\"\n ],\n \"support\": {\n \"forum\": \"https://github.com/aws/aws-sdk-php/discussions\",\n \"issues\": \"https://github.com/aws/aws-sdk-php/issues\",\n \"source\": \"https://github.com/aws/aws-sdk-php/tree/3.373.2\"\n },\n \"time\": \"2026-03-13T18:08:30+00:00\"\n },\n {\n \"name\": \"aws/aws-sdk-php-laravel\",\n \"version\": \"3.10.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/aws/aws-sdk-php-laravel.git\",\n \"reference\": \"c1477b1efd43a61238090c0e8f1ede979573dd4b\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/aws/aws-sdk-php-laravel/zipball/c1477b1efd43a61238090c0e8f1ede979573dd4b\",\n \"reference\": \"c1477b1efd43a61238090c0e8f1ede979573dd4b\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"aws/aws-sdk-php\": \"^3.338.0\",\n \"illuminate/support\": \"^6.0 || ^7.0 || ^8.0 || ^9.0 || ^10.0 || ^11.0 || ^12.0\",\n \"php\": \">=8.1\"\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \"^8.0 || ^9.0\",\n \"vlucas/phpdotenv\": \"^1.0 || ^2.0 || ^3.0 || ^4.0 || ^5.0\",\n \"yoast/phpunit-polyfills\": \"^1.0\"\n },\n \"suggest\": {\n \"laravel/framework\": \"To test the Laravel bindings\",\n \"laravel/lumen-framework\": \"To test the Lumen bindings\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"laravel\": {\n \"aliases\": {\n \"AWS\": \"Aws\\\\Laravel\\\\AwsFacade\"\n },\n \"providers\": [\n \"Aws\\\\Laravel\\\\AwsServiceProvider\"\n ]\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Aws\\\\Laravel\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"Apache-2.0\"\n ],\n \"authors\": [\n {\n \"name\": \"Amazon Web Services\",\n \"homepage\": \"http://aws.amazon.com\"\n }\n ],\n \"description\": \"A simple Laravel 6/7/8/9/10/11/12 service provider for including the AWS SDK for PHP.\",\n \"homepage\": \"https://aws.amazon.com/sdk-for-php/\",\n \"keywords\": [\n \"amazon\",\n \"aws\",\n \"dynamodb\",\n \"ec2\",\n \"laravel\",\n \"laravel 10\",\n \"laravel 11\",\n \"laravel 12\",\n \"laravel 6\",\n \"laravel 7\",\n \"laravel 8\",\n \"laravel 9\",\n \"s3\",\n \"sdk\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/aws/aws-sdk-php-laravel/issues\",\n \"source\": \"https://github.com/aws/aws-sdk-php-laravel/tree/3.10.0\"\n },\n \"time\": \"2025-02-26T22:25:56+00:00\"\n },\n {\n \"name\": \"bepsvpt/secure-headers\",\n \"version\": \"9.0.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/bepsvpt/secure-headers.git\",\n \"reference\": \"7efbc3d8b988051b5ff81c4cacd1d12e875528ed\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/bepsvpt/secure-headers/zipball/7efbc3d8b988051b5ff81c4cacd1d12e875528ed\",\n \"reference\": \"7efbc3d8b988051b5ff81c4cacd1d12e875528ed\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"ext-json\": \"*\",\n \"php\": \"^7.1 || ^8.0\"\n },\n \"require-dev\": {\n \"ergebnis/composer-normalize\": \"^2.42\",\n \"ext-xdebug\": \"*\",\n \"laravel/pint\": \"^1.14\",\n \"orchestra/testbench\": \"^3.1 || ^4.18 || ^5.20 || ^6.43 || ^7.41 || ^8.22 || ^9.0\",\n \"phpstan/phpstan\": \"^1.10\",\n \"phpunit/phpunit\": \"^5.7 || ^6.5 || ^7.5 || ^8.5 || ^9.6 || ^10.5\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"laravel\": {\n \"providers\": [\n \"Bepsvpt\\\\SecureHeaders\\\\SecureHeadersServiceProvider\"\n ]\n }\n },\n \"autoload\": {\n \"files\": [\n \"src/helpers.php\"\n ],\n \"psr-4\": {\n \"Bepsvpt\\\\SecureHeaders\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"bepsvpt\",\n \"email\": \"6ibrl@cpp.tw\"\n }\n ],\n \"description\": \"Add security related headers to HTTP response. The package includes Service Providers for easy Laravel integration.\",\n \"homepage\": \"https://github.com/bepsvpt/secure-headers\",\n \"keywords\": [\n \"clear-site-data\",\n \"content-security-policy\",\n \"csp\",\n \"except-ct\",\n \"feature-policy\",\n \"header\",\n \"hsts\",\n \"https\",\n \"laravel\",\n \"permissions-policy\",\n \"referrer-policy\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/bepsvpt/secure-headers/issues\",\n \"source\": \"https://github.com/bepsvpt/secure-headers/tree/9.0.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://opencollective.com/secure-headers\",\n \"type\": \"open_collective\"\n }\n ],\n \"time\": \"2025-01-18T07:18:04+00:00\"\n },\n {\n \"name\": \"brick/math\",\n \"version\": \"0.14.8\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/brick/math.git\",\n \"reference\": \"63422359a44b7f06cae63c3b429b59e8efcc0629\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/brick/math/zipball/63422359a44b7f06cae63c3b429b59e8efcc0629\",\n \"reference\": \"63422359a44b7f06cae63c3b429b59e8efcc0629\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \"^8.2\"\n },\n \"require-dev\": {\n \"php-coveralls/php-coveralls\": \"^2.2\",\n \"phpstan/phpstan\": \"2.1.22\",\n \"phpunit/phpunit\": \"^11.5\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Brick\\\\Math\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"description\": \"Arbitrary-precision arithmetic library\",\n \"keywords\": [\n \"Arbitrary-precision\",\n \"BigInteger\",\n \"BigRational\",\n \"arithmetic\",\n \"bigdecimal\",\n \"bignum\",\n \"bignumber\",\n \"brick\",\n \"decimal\",\n \"integer\",\n \"math\",\n \"mathematics\",\n \"rational\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/brick/math/issues\",\n \"source\": \"https://github.com/brick/math/tree/0.14.8\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/BenMorel\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2026-02-10T14:33:43+00:00\"\n },\n {\n \"name\": \"carbonphp/carbon-doctrine-types\",\n \"version\": \"3.2.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/CarbonPHP/carbon-doctrine-types.git\",\n \"reference\": \"18ba5ddfec8976260ead6e866180bd5d2f71aa1d\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/CarbonPHP/carbon-doctrine-types/zipball/18ba5ddfec8976260ead6e866180bd5d2f71aa1d\",\n \"reference\": \"18ba5ddfec8976260ead6e866180bd5d2f71aa1d\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \"^8.1\"\n },\n \"conflict\": {\n \"doctrine/dbal\": \"<4.0.0 || >=5.0.0\"\n },\n \"require-dev\": {\n \"doctrine/dbal\": \"^4.0.0\",\n \"nesbot/carbon\": \"^2.71.0 || ^3.0.0\",\n \"phpunit/phpunit\": \"^10.3\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Carbon\\\\Doctrine\\\\\": \"src/Carbon/Doctrine/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"KyleKatarn\",\n \"email\": \"kylekatarnls@gmail.com\"\n }\n ],\n \"description\": \"Types to use Carbon in Doctrine\",\n \"keywords\": [\n \"carbon\",\n \"date\",\n \"datetime\",\n \"doctrine\",\n \"time\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/CarbonPHP/carbon-doctrine-types/issues\",\n \"source\": \"https://github.com/CarbonPHP/carbon-doctrine-types/tree/3.2.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/kylekatarnls\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://opencollective.com/Carbon\",\n \"type\": \"open_collective\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/nesbot/carbon\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2024-02-09T16:56:22+00:00\"\n },\n {\n \"name\": \"chadhutchins/oauth2-slack\",\n \"version\": \"1.2.2\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/chadhutchins/oauth2-slack.git\",\n \"reference\": \"f738c0ed2695208353ee95b6e24e2d1ae412843a\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/chadhutchins/oauth2-slack/zipball/f738c0ed2695208353ee95b6e24e2d1ae412843a\",\n \"reference\": \"f738c0ed2695208353ee95b6e24e2d1ae412843a\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"league/oauth2-client\": \"1.*|2.*\",\n \"php\": \">=5.6.0\"\n },\n \"require-dev\": {\n \"mockery/mockery\": \"~0.9\",\n \"phpunit/phpunit\": \"5.6\",\n \"squizlabs/php_codesniffer\": \"~2.0\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Chadhutchins\\\\OAuth2\\\\Client\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Adam Paterson\",\n \"email\": \"hello@adampaterson.co.uk\"\n },\n {\n \"name\": \"Chad Hutchins\",\n \"email\": \"hutchins.chad@gmail.com\"\n }\n ],\n \"description\": \"Slack OAuth 2.0 Client Provider for The PHP League OAuth2-Client\",\n \"keywords\": [\n \"Authentication\",\n \"SSO\",\n \"authorization\",\n \"identity\",\n \"idp\",\n \"oauth\",\n \"oauth2\",\n \"single sign on\",\n \"slack\",\n \"slack api\"\n ],\n \"support\": {\n \"source\": \"https://github.com/chadhutchins/oauth2-slack/tree/1.2.2\"\n },\n \"time\": \"2020-11-23T15:41:35+00:00\"\n },\n {\n \"name\": \"chaseconey/laravel-datadog-helper\",\n \"version\": \"1.3.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/chaseconey/laravel-datadog-helper.git\",\n \"reference\": \"7219004fa87bcf226d5d5f1d268a555eef3d3a4b\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/chaseconey/laravel-datadog-helper/zipball/7219004fa87bcf226d5d5f1d268a555eef3d3a4b\",\n \"reference\": \"7219004fa87bcf226d5d5f1d268a555eef3d3a4b\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"datadog/php-datadogstatsd\": \"^1.4.0\",\n \"illuminate/support\": \">=5.1\",\n \"php\": \">=5.4.0\"\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \"~4.0||~5.0\",\n \"scrutinizer/ocular\": \"~1.1\",\n \"squizlabs/php_codesniffer\": \"~2.3\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"laravel\": {\n \"aliases\": {\n \"Datadog\": \"ChaseConey\\\\LaravelDatadogHelper\\\\Datadog\"\n },\n \"providers\": [\n \"ChaseConey\\\\LaravelDatadogHelper\\\\LaravelDatadogHelperServiceProvider\"\n ]\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"ChaseConey\\\\LaravelDatadogHelper\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Chase Coney\",\n \"email\": \"chasiepoo@gmail.com\",\n \"homepage\": \"http://chaseconey.com\",\n \"role\": \"Developer\"\n }\n ],\n \"description\": \"A Laravel Datadog helper package.\",\n \"homepage\": \"https://github.com/chaseconey/laravel-datadog-helper\",\n \"keywords\": [\n \"chaseconey\",\n \"laravel-datadog-helper\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/chaseconey/laravel-datadog-helper/issues\",\n \"source\": \"https://github.com/chaseconey/laravel-datadog-helper/tree/1.3.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/chaseconey\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2025-07-28T21:50:15+00:00\"\n },\n {\n \"name\": \"chrisyue/php-m3u8\",\n \"version\": \"4.0.3\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/chrisyue/php-m3u8.git\",\n \"reference\": \"122745bda7c2cfcedf6b2893b48a028f87109717\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/chrisyue/php-m3u8/zipball/122745bda7c2cfcedf6b2893b48a028f87109717\",\n \"reference\": \"122745bda7c2cfcedf6b2893b48a028f87109717\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=7.4\"\n },\n \"require-dev\": {\n \"friendsofphp/php-cs-fixer\": \"^3\",\n \"phpunit/phpunit\": \"^8\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Chrisyue\\\\PhpM3u8\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"chrisyue\",\n \"email\": \"blizzchris@gmail.com\",\n \"homepage\": \"https://chrisyue.com\"\n }\n ],\n \"description\": \"PHP M3U8 parser / dumper\",\n \"homepage\": \"http://chrisyue.com\",\n \"keywords\": [\n \"dumper\",\n \"m3u8\",\n \"parser\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/chrisyue/php-m3u8/issues\",\n \"source\": \"https://github.com/chrisyue/php-m3u8/tree/4.0.3\"\n },\n \"time\": \"2022-05-23T12:03:05+00:00\"\n },\n {\n \"name\": \"clue/stream-filter\",\n \"version\": \"v1.7.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/clue/stream-filter.git\",\n \"reference\": \"049509fef80032cb3f051595029ab75b49a3c2f7\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/clue/stream-filter/zipball/049509fef80032cb3f051595029ab75b49a3c2f7\",\n \"reference\": \"049509fef80032cb3f051595029ab75b49a3c2f7\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=5.3\"\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \"^9.6 || ^5.7 || ^4.8.36\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"files\": [\n \"src/functions_include.php\"\n ],\n \"psr-4\": {\n \"Clue\\\\StreamFilter\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Christian Lück\",\n \"email\": \"christian@clue.engineering\"\n }\n ],\n \"description\": \"A simple and modern approach to stream filtering in PHP\",\n \"homepage\": \"https://github.com/clue/stream-filter\",\n \"keywords\": [\n \"bucket brigade\",\n \"callback\",\n \"filter\",\n \"php_user_filter\",\n \"stream\",\n \"stream_filter_append\",\n \"stream_filter_register\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/clue/stream-filter/issues\",\n \"source\": \"https://github.com/clue/stream-filter/tree/v1.7.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://clue.engineering/support\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/clue\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2023-12-20T15:40:13+00:00\"\n },\n {\n \"name\": \"composer/semver\",\n \"version\": \"3.4.4\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/composer/semver.git\",\n \"reference\": \"198166618906cb2de69b95d7d47e5fa8aa1b2b95\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/composer/semver/zipball/198166618906cb2de69b95d7d47e5fa8aa1b2b95\",\n \"reference\": \"198166618906cb2de69b95d7d47e5fa8aa1b2b95\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \"^5.3.2 || ^7.0 || ^8.0\"\n },\n \"require-dev\": {\n \"phpstan/phpstan\": \"^1.11\",\n \"symfony/phpunit-bridge\": \"^3 || ^7\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-main\": \"3.x-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Composer\\\\Semver\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Nils Adermann\",\n \"email\": \"naderman@naderman.de\",\n \"homepage\": \"http://www.naderman.de\"\n },\n {\n \"name\": \"Jordi Boggiano\",\n \"email\": \"j.boggiano@seld.be\",\n \"homepage\": \"http://seld.be\"\n },\n {\n \"name\": \"Rob Bast\",\n \"email\": \"rob.bast@gmail.com\",\n \"homepage\": \"http://robbast.nl\"\n }\n ],\n \"description\": \"Semver library that offers utilities, version constraint parsing and validation.\",\n \"keywords\": [\n \"semantic\",\n \"semver\",\n \"validation\",\n \"versioning\"\n ],\n \"support\": {\n \"irc\": \"ircs://irc.libera.chat:6697/composer\",\n \"issues\": \"https://github.com/composer/semver/issues\",\n \"source\": \"https://github.com/composer/semver/tree/3.4.4\"\n },\n \"funding\": [\n {\n \"url\": \"https://packagist.com\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/composer\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2025-08-20T19:15:30+00:00\"\n },\n {\n \"name\": \"daniti/oauth2-pipedrive\",\n \"version\": \"dev-master\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/jiminny/oauth2-pipedrive.git\",\n \"reference\": \"e8b269cfe30ea92817acd0dc3efc9da54fe390bf\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/jiminny/oauth2-pipedrive/zipball/e8b269cfe30ea92817acd0dc3efc9da54fe390bf\",\n \"reference\": \"e8b269cfe30ea92817acd0dc3efc9da54fe390bf\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"league/oauth2-client\": \"^2.3\"\n },\n \"default-branch\": true,\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Daniti\\\\OAuth2\\\\Client\\\\Provider\\\\\": \"src/\"\n }\n },\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Daniele Timo\",\n \"email\": \"dani@danieletimo.com\"\n }\n ],\n \"description\": \"Pipedrive OAuth 2.0 client provider for PHP League OAuth2 Client\",\n \"support\": {\n \"source\": \"https://github.com/jiminny/oauth2-pipedrive/tree/master\",\n \"issues\": \"https://github.com/jiminny/oauth2-pipedrive/issues\"\n },\n \"time\": \"2021-03-15T17:10:01+00:00\"\n },\n {\n \"name\": \"datadog/php-datadogstatsd\",\n \"version\": \"1.7.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/DataDog/php-datadogstatsd.git\",\n \"reference\": \"f0d61f11e01780ef7d96daed9781c7db9311a568\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/DataDog/php-datadogstatsd/zipball/f0d61f11e01780ef7d96daed9781c7db9311a568\",\n \"reference\": \"f0d61f11e01780ef7d96daed9781c7db9311a568\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"ext-sockets\": \"*\",\n \"php\": \">=5.6.0\"\n },\n \"require-dev\": {\n \"mikey179/vfsstream\": \"^1.6\",\n \"squizlabs/php_codesniffer\": \"^3.3\",\n \"yoast/phpunit-polyfills\": \"^1.0.1\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"DataDog\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Alex Corley\",\n \"email\": \"anthroprose@gmail.com\",\n \"role\": \"Developer\"\n },\n {\n \"name\": \"Datadog\",\n \"email\": \"dev@datadoghq.com\",\n \"role\": \"Developer\"\n }\n ],\n \"description\": \"An extremely simple PHP datadogstatsd client\",\n \"homepage\": \"https://www.datadoghq.com/\",\n \"keywords\": [\n \"DataDog\",\n \"check\",\n \"error-reporting\",\n \"health\",\n \"logging\",\n \"monitoring\",\n \"statsd\"\n ],\n \"support\": {\n \"chat\": \"https://chat.datadoghq.com/\",\n \"email\": \"package@datadoghq.com\",\n \"irc\": \"irc://irc.freenode.net/datadog\",\n \"issues\": \"https://github.com/DataDog/php-datadogstatsd/issues\",\n \"source\": \"https://github.com/DataDog/php-datadogstatsd\"\n },\n \"time\": \"2025-08-25T15:42:11+00:00\"\n },\n {\n \"name\": \"defuse/php-encryption\",\n \"version\": \"v2.4.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/defuse/php-encryption.git\",\n \"reference\": \"f53396c2d34225064647a05ca76c1da9d99e5828\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/defuse/php-encryption/zipball/f53396c2d34225064647a05ca76c1da9d99e5828\",\n \"reference\": \"f53396c2d34225064647a05ca76c1da9d99e5828\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"ext-openssl\": \"*\",\n \"paragonie/random_compat\": \">= 2\",\n \"php\": \">=5.6.0\"\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \"^5|^6|^7|^8|^9|^10\",\n \"yoast/phpunit-polyfills\": \"^2.0.0\"\n },\n \"bin\": [\n \"bin/generate-defuse-key\"\n ],\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Defuse\\\\Crypto\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Taylor Hornby\",\n \"email\": \"taylor@defuse.ca\",\n \"homepage\": \"https://defuse.ca/\"\n },\n {\n \"name\": \"Scott Arciszewski\",\n \"email\": \"info@paragonie.com\",\n \"homepage\": \"https://paragonie.com\"\n }\n ],\n \"description\": \"Secure PHP Encryption Library\",\n \"keywords\": [\n \"aes\",\n \"authenticated encryption\",\n \"cipher\",\n \"crypto\",\n \"cryptography\",\n \"encrypt\",\n \"encryption\",\n \"openssl\",\n \"security\",\n \"symmetric key cryptography\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/defuse/php-encryption/issues\",\n \"source\": \"https://github.com/defuse/php-encryption/tree/v2.4.0\"\n },\n \"time\": \"2023-06-19T06:10:36+00:00\"\n },\n {\n \"name\": \"devio/pipedrive\",\n \"version\": \"2.17.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/IsraelOrtuno/pipedrive.git\",\n \"reference\": \"7d3edfb12487b50046b0a91b1bd7dbe4002200e5\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/IsraelOrtuno/pipedrive/zipball/7d3edfb12487b50046b0a91b1bd7dbe4002200e5\",\n \"reference\": \"7d3edfb12487b50046b0a91b1bd7dbe4002200e5\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"guzzlehttp/guzzle\": \"~7.0|~6.0|~5.0|~4.0\",\n \"illuminate/support\": \">=4.0\",\n \"laravel/helpers\": \"^1.0\"\n },\n \"require-dev\": {\n \"phpspec/phpspec\": \"^2.4\",\n \"symfony/var-dumper\": \"^2.7\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"laravel\": {\n \"aliases\": {\n \"Pipedrive\": \"Devio\\\\Pipedrive\\\\PipedriveFacade\"\n },\n \"providers\": [\n \"Devio\\\\Pipedrive\\\\PipedriveServiceProvider\"\n ]\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Devio\\\\Pipedrive\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Israel Ortuño\",\n \"email\": \"ai.ortuno@gmail.com\"\n }\n ],\n \"description\": \"Complete Pipedrive API client for PHP and/or Laravel\",\n \"keywords\": [\n \"api\",\n \"client\",\n \"laravel\",\n \"pipedrive\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/IsraelOrtuno/pipedrive/issues\",\n \"source\": \"https://github.com/IsraelOrtuno/pipedrive/tree/2.17.0\"\n },\n \"time\": \"2024-11-10T18:47:25+00:00\"\n },\n {\n \"name\": \"dflydev/dot-access-data\",\n \"version\": \"v3.0.3\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/dflydev/dflydev-dot-access-data.git\",\n \"reference\": \"a23a2bf4f31d3518f3ecb38660c95715dfead60f\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/dflydev/dflydev-dot-access-data/zipball/a23a2bf4f31d3518f3ecb38660c95715dfead60f\",\n \"reference\": \"a23a2bf4f31d3518f3ecb38660c95715dfead60f\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \"^7.1 || ^8.0\"\n },\n \"require-dev\": {\n \"phpstan/phpstan\": \"^0.12.42\",\n \"phpunit/phpunit\": \"^7.5 || ^8.5 || ^9.3\",\n \"scrutinizer/ocular\": \"1.6.0\",\n \"squizlabs/php_codesniffer\": \"^3.5\",\n \"vimeo/psalm\": \"^4.0.0\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-main\": \"3.x-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Dflydev\\\\DotAccessData\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Dragonfly Development Inc.\",\n \"email\": \"info@dflydev.com\",\n \"homepage\": \"http://dflydev.com\"\n },\n {\n \"name\": \"Beau Simensen\",\n \"email\": \"beau@dflydev.com\",\n \"homepage\": \"http://beausimensen.com\"\n },\n {\n \"name\": \"Carlos Frutos\",\n \"email\": \"carlos@kiwing.it\",\n \"homepage\": \"https://github.com/cfrutos\"\n },\n {\n \"name\": \"Colin O'Dell\",\n \"email\": \"colinodell@gmail.com\",\n \"homepage\": \"https://www.colinodell.com\"\n }\n ],\n \"description\": \"Given a deep data structure, access data by dot notation.\",\n \"homepage\": \"https://github.com/dflydev/dflydev-dot-access-data\",\n \"keywords\": [\n \"access\",\n \"data\",\n \"dot\",\n \"notation\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/dflydev/dflydev-dot-access-data/issues\",\n \"source\": \"https://github.com/dflydev/dflydev-dot-access-data/tree/v3.0.3\"\n },\n \"time\": \"2024-07-08T12:26:09+00:00\"\n },\n {\n \"name\": \"doctrine/annotations\",\n \"version\": \"2.0.2\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/doctrine/annotations.git\",\n \"reference\": \"901c2ee5d26eb64ff43c47976e114bf00843acf7\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/doctrine/annotations/zipball/901c2ee5d26eb64ff43c47976e114bf00843acf7\",\n \"reference\": \"901c2ee5d26eb64ff43c47976e114bf00843acf7\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"doctrine/lexer\": \"^2 || ^3\",\n \"ext-tokenizer\": \"*\",\n \"php\": \"^7.2 || ^8.0\",\n \"psr/cache\": \"^1 || ^2 || ^3\"\n },\n \"require-dev\": {\n \"doctrine/cache\": \"^2.0\",\n \"doctrine/coding-standard\": \"^10\",\n \"phpstan/phpstan\": \"^1.10.28\",\n \"phpunit/phpunit\": \"^7.5 || ^8.5 || ^9.5\",\n \"symfony/cache\": \"^5.4 || ^6.4 || ^7\",\n \"vimeo/psalm\": \"^4.30 || ^5.14\"\n },\n \"suggest\": {\n \"php\": \"PHP 8.0 or higher comes with attributes, a native replacement for annotations\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Doctrine\\\\Common\\\\Annotations\\\\\": \"lib/Doctrine/Common/Annotations\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Guilherme Blanco\",\n \"email\": \"guilhermeblanco@gmail.com\"\n },\n {\n \"name\": \"Roman Borschel\",\n \"email\": \"roman@code-factory.org\"\n },\n {\n \"name\": \"Benjamin Eberlei\",\n \"email\": \"kontakt@beberlei.de\"\n },\n {\n \"name\": \"Jonathan Wage\",\n \"email\": \"jonwage@gmail.com\"\n },\n {\n \"name\": \"Johannes Schmitt\",\n \"email\": \"schmittjoh@gmail.com\"\n }\n ],\n \"description\": \"Docblock Annotations Parser\",\n \"homepage\": \"https://www.doctrine-project.org/projects/annotations.html\",\n \"keywords\": [\n \"annotations\",\n \"docblock\",\n \"parser\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/doctrine/annotations/issues\",\n \"source\": \"https://github.com/doctrine/annotations/tree/2.0.2\"\n },\n \"abandoned\": true,\n \"time\": \"2024-09-05T10:17:24+00:00\"\n },\n {\n \"name\": \"doctrine/dbal\",\n \"version\": \"4.4.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/doctrine/dbal.git\",\n \"reference\": \"3d544473fb93f5c25b483ea4f4ce99f8c4d9d44c\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/doctrine/dbal/zipball/3d544473fb93f5c25b483ea4f4ce99f8c4d9d44c\",\n \"reference\": \"3d544473fb93f5c25b483ea4f4ce99f8c4d9d44c\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"doctrine/deprecations\": \"^1.1.5\",\n \"php\": \"^8.2\",\n \"psr/cache\": \"^1|^2|^3\",\n \"psr/log\": \"^1|^2|^3\"\n },\n \"require-dev\": {\n \"doctrine/coding-standard\": \"14.0.0\",\n \"fig/log-test\": \"^1\",\n \"jetbrains/phpstorm-stubs\": \"2023.2\",\n \"phpstan/phpstan\": \"2.1.30\",\n \"phpstan/phpstan-phpunit\": \"2.0.7\",\n \"phpstan/phpstan-strict-rules\": \"^2\",\n \"phpunit/phpunit\": \"11.5.23\",\n \"slevomat/coding-standard\": \"8.24.0\",\n \"squizlabs/php_codesniffer\": \"4.0.0\",\n \"symfony/cache\": \"^6.3.8|^7.0|^8.0\",\n \"symfony/console\": \"^5.4|^6.3|^7.0|^8.0\"\n },\n \"suggest\": {\n \"symfony/console\": \"For helpful console commands such as SQL execution and import of files.\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Doctrine\\\\DBAL\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Guilherme Blanco\",\n \"email\": \"guilhermeblanco@gmail.com\"\n },\n {\n \"name\": \"Roman Borschel\",\n \"email\": \"roman@code-factory.org\"\n },\n {\n \"name\": \"Benjamin Eberlei\",\n \"email\": \"kontakt@beberlei.de\"\n },\n {\n \"name\": \"Jonathan Wage\",\n \"email\": \"jonwage@gmail.com\"\n }\n ],\n \"description\": \"Powerful PHP database abstraction layer (DBAL) with many features for database schema introspection and management.\",\n \"homepage\": \"https://www.doctrine-project.org/projects/dbal.html\",\n \"keywords\": [\n \"abstraction\",\n \"database\",\n \"db2\",\n \"dbal\",\n \"mariadb\",\n \"mssql\",\n \"mysql\",\n \"oci8\",\n \"oracle\",\n \"pdo\",\n \"pgsql\",\n \"postgresql\",\n \"queryobject\",\n \"sasql\",\n \"sql\",\n \"sqlite\",\n \"sqlserver\",\n \"sqlsrv\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/doctrine/dbal/issues\",\n \"source\": \"https://github.com/doctrine/dbal/tree/4.4.1\"\n },\n \"funding\": [\n {\n \"url\": \"https://www.doctrine-project.org/sponsorship.html\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://www.patreon.com/phpdoctrine\",\n \"type\": \"patreon\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/doctrine%2Fdbal\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2025-12-04T10:11:03+00:00\"\n },\n {\n \"name\": \"doctrine/deprecations\",\n \"version\": \"1.1.6\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/doctrine/deprecations.git\",\n \"reference\": \"d4fe3e6fd9bb9e72557a19674f44d8ac7db4c6ca\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/doctrine/deprecations/zipball/d4fe3e6fd9bb9e72557a19674f44d8ac7db4c6ca\",\n \"reference\": \"d4fe3e6fd9bb9e72557a19674f44d8ac7db4c6ca\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \"^7.1 || ^8.0\"\n },\n \"conflict\": {\n \"phpunit/phpunit\": \"<=7.5 || >=14\"\n },\n \"require-dev\": {\n \"doctrine/coding-standard\": \"^9 || ^12 || ^14\",\n \"phpstan/phpstan\": \"1.4.10 || 2.1.30\",\n \"phpstan/phpstan-phpunit\": \"^1.0 || ^2\",\n \"phpunit/phpunit\": \"^7.5 || ^8.5 || ^9.6 || ^10.5 || ^11.5 || ^12.4 || ^13.0\",\n \"psr/log\": \"^1 || ^2 || ^3\"\n },\n \"suggest\": {\n \"psr/log\": \"Allows logging deprecations via PSR-3 logger implementation\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Doctrine\\\\Deprecations\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"description\": \"A small layer on top of trigger_error(E_USER_DEPRECATED) or PSR-3 logging with options to disable all deprecations or selectively for packages.\",\n \"homepage\": \"https://www.doctrine-project.org/\",\n \"support\": {\n \"issues\": \"https://github.com/doctrine/deprecations/issues\",\n \"source\": \"https://github.com/doctrine/deprecations/tree/1.1.6\"\n },\n \"time\": \"2026-02-07T07:09:04+00:00\"\n },\n {\n \"name\": \"doctrine/inflector\",\n \"version\": \"2.1.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/doctrine/inflector.git\",\n \"reference\": \"6d6c96277ea252fc1304627204c3d5e6e15faa3b\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/doctrine/inflector/zipball/6d6c96277ea252fc1304627204c3d5e6e15faa3b\",\n \"reference\": \"6d6c96277ea252fc1304627204c3d5e6e15faa3b\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \"^7.2 || ^8.0\"\n },\n \"require-dev\": {\n \"doctrine/coding-standard\": \"^12.0 || ^13.0\",\n \"phpstan/phpstan\": \"^1.12 || ^2.0\",\n \"phpstan/phpstan-phpunit\": \"^1.4 || ^2.0\",\n \"phpstan/phpstan-strict-rules\": \"^1.6 || ^2.0\",\n \"phpunit/phpunit\": \"^8.5 || ^12.2\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Doctrine\\\\Inflector\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Guilherme Blanco\",\n \"email\": \"guilhermeblanco@gmail.com\"\n },\n {\n \"name\": \"Roman Borschel\",\n \"email\": \"roman@code-factory.org\"\n },\n {\n \"name\": \"Benjamin Eberlei\",\n \"email\": \"kontakt@beberlei.de\"\n },\n {\n \"name\": \"Jonathan Wage\",\n \"email\": \"jonwage@gmail.com\"\n },\n {\n \"name\": \"Johannes Schmitt\",\n \"email\": \"schmittjoh@gmail.com\"\n }\n ],\n \"description\": \"PHP Doctrine Inflector is a small library that can perform string manipulations with regard to upper/lowercase and singular/plural forms of words.\",\n \"homepage\": \"https://www.doctrine-project.org/projects/inflector.html\",\n \"keywords\": [\n \"inflection\",\n \"inflector\",\n \"lowercase\",\n \"manipulation\",\n \"php\",\n \"plural\",\n \"singular\",\n \"strings\",\n \"uppercase\",\n \"words\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/doctrine/inflector/issues\",\n \"source\": \"https://github.com/doctrine/inflector/tree/2.1.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://www.doctrine-project.org/sponsorship.html\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://www.patreon.com/phpdoctrine\",\n \"type\": \"patreon\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/doctrine%2Finflector\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2025-08-10T19:31:58+00:00\"\n },\n {\n \"name\": \"doctrine/lexer\",\n \"version\": \"3.0.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/doctrine/lexer.git\",\n \"reference\": \"31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/doctrine/lexer/zipball/31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd\",\n \"reference\": \"31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \"^8.1\"\n },\n \"require-dev\": {\n \"doctrine/coding-standard\": \"^12\",\n \"phpstan/phpstan\": \"^1.10\",\n \"phpunit/phpunit\": \"^10.5\",\n \"psalm/plugin-phpunit\": \"^0.18.3\",\n \"vimeo/psalm\": \"^5.21\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Doctrine\\\\Common\\\\Lexer\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Guilherme Blanco\",\n \"email\": \"guilhermeblanco@gmail.com\"\n },\n {\n \"name\": \"Roman Borschel\",\n \"email\": \"roman@code-factory.org\"\n },\n {\n \"name\": \"Johannes Schmitt\",\n \"email\": \"schmittjoh@gmail.com\"\n }\n ],\n \"description\": \"PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.\",\n \"homepage\": \"https://www.doctrine-project.org/projects/lexer.html\",\n \"keywords\": [\n \"annotations\",\n \"docblock\",\n \"lexer\",\n \"parser\",\n \"php\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/doctrine/lexer/issues\",\n \"source\": \"https://github.com/doctrine/lexer/tree/3.0.1\"\n },\n \"funding\": [\n {\n \"url\": \"https://www.doctrine-project.org/sponsorship.html\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://www.patreon.com/phpdoctrine\",\n \"type\": \"patreon\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/doctrine%2Flexer\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2024-02-05T11:56:58+00:00\"\n },\n {\n \"name\": \"dragonmantank/cron-expression\",\n \"version\": \"v3.6.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/dragonmantank/cron-expression.git\",\n \"reference\": \"d61a8a9604ec1f8c3d150d09db6ce98b32675013\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/dragonmantank/cron-expression/zipball/d61a8a9604ec1f8c3d150d09db6ce98b32675013\",\n \"reference\": \"d61a8a9604ec1f8c3d150d09db6ce98b32675013\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \"^8.2|^8.3|^8.4|^8.5\"\n },\n \"replace\": {\n \"mtdowling/cron-expression\": \"^1.0\"\n },\n \"require-dev\": {\n \"phpstan/extension-installer\": \"^1.4.3\",\n \"phpstan/phpstan\": \"^1.12.32|^2.1.31\",\n \"phpunit/phpunit\": \"^8.5.48|^9.0\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"3.x-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Cron\\\\\": \"src/Cron/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Chris Tankersley\",\n \"email\": \"chris@ctankersley.com\",\n \"homepage\": \"https://github.com/dragonmantank\"\n }\n ],\n \"description\": \"CRON for PHP: Calculate the next or previous run date and determine if a CRON expression is due\",\n \"keywords\": [\n \"cron\",\n \"schedule\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/dragonmantank/cron-expression/issues\",\n \"source\": \"https://github.com/dragonmantank/cron-expression/tree/v3.6.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/dragonmantank\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2025-10-31T18:51:33+00:00\"\n },\n {\n \"name\": \"egulias/email-validator\",\n \"version\": \"4.0.4\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/egulias/EmailValidator.git\",\n \"reference\": \"d42c8731f0624ad6bdc8d3e5e9a4524f68801cfa\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/egulias/EmailValidator/zipball/d42c8731f0624ad6bdc8d3e5e9a4524f68801cfa\",\n \"reference\": \"d42c8731f0624ad6bdc8d3e5e9a4524f68801cfa\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"doctrine/lexer\": \"^2.0 || ^3.0\",\n \"php\": \">=8.1\",\n \"symfony/polyfill-intl-idn\": \"^1.26\"\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \"^10.2\",\n \"vimeo/psalm\": \"^5.12\"\n },\n \"suggest\": {\n \"ext-intl\": \"PHP Internationalization Libraries are required to use the SpoofChecking validation\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"4.0.x-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Egulias\\\\EmailValidator\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Eduardo Gulias Davis\"\n }\n ],\n \"description\": \"A library for validating emails against several RFCs\",\n \"homepage\": \"https://github.com/egulias/EmailValidator\",\n \"keywords\": [\n \"email\",\n \"emailvalidation\",\n \"emailvalidator\",\n \"validation\",\n \"validator\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/egulias/EmailValidator/issues\",\n \"source\": \"https://github.com/egulias/EmailValidator/tree/4.0.4\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/egulias\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2025-03-06T22:45:56+00:00\"\n },\n {\n \"name\": \"elasticsearch/elasticsearch\",\n \"version\": \"v7.17.3\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/elastic/elasticsearch-php.git\",\n \"reference\": \"b8a60b4136ee31117d1aa1b19879530eb6d11efb\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/elastic/elasticsearch-php/zipball/b8a60b4136ee31117d1aa1b19879530eb6d11efb\",\n \"reference\": \"b8a60b4136ee31117d1aa1b19879530eb6d11efb\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"ext-json\": \">=1.3.7\",\n \"ezimuel/ringphp\": \"^1.1.2\",\n \"php\": \"^7.3 || ^8.0\",\n \"psr/log\": \"^1|^2|^3\"\n },\n \"require-dev\": {\n \"ext-yaml\": \"*\",\n \"ext-zip\": \"*\",\n \"mockery/mockery\": \"^1.2\",\n \"phpstan/phpstan\": \"^1.10\",\n \"phpunit/phpunit\": \"^9.3\",\n \"squizlabs/php_codesniffer\": \"^3.4\",\n \"symfony/finder\": \"~4.0\"\n },\n \"suggest\": {\n \"ext-curl\": \"*\",\n \"monolog/monolog\": \"Allows for client-level logging and tracing\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"files\": [\n \"src/autoload.php\"\n ],\n \"psr-4\": {\n \"Elasticsearch\\\\\": \"src/Elasticsearch/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"Apache-2.0\",\n \"LGPL-2.1-only\"\n ],\n \"authors\": [\n {\n \"name\": \"Zachary Tong\"\n },\n {\n \"name\": \"Enrico Zimuel\"\n }\n ],\n \"description\": \"PHP Client for Elasticsearch\",\n \"keywords\": [\n \"client\",\n \"elasticsearch\",\n \"search\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/elastic/elasticsearch-php/issues\",\n \"source\": \"https://github.com/elastic/elasticsearch-php/tree/v7.17.3\"\n },\n \"time\": \"2025-07-14T09:07:02+00:00\"\n },\n {\n \"name\": \"erusev/parsedown\",\n \"version\": \"1.7.4\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/erusev/parsedown.git\",\n \"reference\": \"cb17b6477dfff935958ba01325f2e8a2bfa6dab3\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/erusev/parsedown/zipball/cb17b6477dfff935958ba01325f2e8a2bfa6dab3\",\n \"reference\": \"cb17b6477dfff935958ba01325f2e8a2bfa6dab3\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"ext-mbstring\": \"*\",\n \"php\": \">=5.3.0\"\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \"^4.8.35\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-0\": {\n \"Parsedown\": \"\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Emanuil Rusev\",\n \"email\": \"hello@erusev.com\",\n \"homepage\": \"http://erusev.com\"\n }\n ],\n \"description\": \"Parser for Markdown.\",\n \"homepage\": \"http://parsedown.org\",\n \"keywords\": [\n \"markdown\",\n \"parser\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/erusev/parsedown/issues\",\n \"source\": \"https://github.com/erusev/parsedown/tree/1.7.x\"\n },\n \"time\": \"2019-12-30T22:54:17+00:00\"\n },\n {\n \"name\": \"evenement/evenement\",\n \"version\": \"v3.0.2\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/igorw/evenement.git\",\n \"reference\": \"0a16b0d71ab13284339abb99d9d2bd813640efbc\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/igorw/evenement/zipball/0a16b0d71ab13284339abb99d9d2bd813640efbc\",\n \"reference\": \"0a16b0d71ab13284339abb99d9d2bd813640efbc\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=7.0\"\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \"^9 || ^6\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Evenement\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Igor Wiedler\",\n \"email\": \"igor@wiedler.ch\"\n }\n ],\n \"description\": \"Événement is a very simple event dispatching library for PHP\",\n \"keywords\": [\n \"event-dispatcher\",\n \"event-emitter\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/igorw/evenement/issues\",\n \"source\": \"https://github.com/igorw/evenement/tree/v3.0.2\"\n },\n \"time\": \"2023-08-08T05:53:35+00:00\"\n },\n {\n \"name\": \"ezimuel/guzzlestreams\",\n \"version\": \"4.1.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/ezimuel/guzzlestreams.git\",\n \"reference\": \"903161be81e9f497cc42fb7db982404a4e6441b0\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/ezimuel/guzzlestreams/zipball/903161be81e9f497cc42fb7db982404a4e6441b0\",\n \"reference\": \"903161be81e9f497cc42fb7db982404a4e6441b0\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=7.4.0\"\n },\n \"require-dev\": {\n \"phpstan/phpstan\": \"^2.1\",\n \"phpunit/phpunit\": \"~9.0\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"3.0-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"GuzzleHttp\\\\Stream\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Michael Dowling\",\n \"email\": \"mtdowling@gmail.com\",\n \"homepage\": \"https://github.com/mtdowling\"\n }\n ],\n \"description\": \"Fork of guzzle/streams (abandoned) to be used with elasticsearch-php\",\n \"homepage\": \"http://guzzlephp.org/\",\n \"keywords\": [\n \"Guzzle\",\n \"stream\"\n ],\n \"support\": {\n \"source\": \"https://github.com/ezimuel/guzzlestreams/tree/4.1.0\"\n },\n \"time\": \"2025-08-05T06:44:46+00:00\"\n },\n {\n \"name\": \"ezimuel/ringphp\",\n \"version\": \"1.4.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/ezimuel/ringphp.git\",\n \"reference\": \"bc983599ec7add50c00e420e867c403c8ed16ae7\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/ezimuel/ringphp/zipball/bc983599ec7add50c00e420e867c403c8ed16ae7\",\n \"reference\": \"bc983599ec7add50c00e420e867c403c8ed16ae7\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"ezimuel/guzzlestreams\": \"^3.0.1 || ^4.0.0\",\n \"php\": \">=5.4.0\",\n \"react/promise\": \"^2.0 || ^3.0\"\n },\n \"replace\": {\n \"guzzlehttp/ringphp\": \"self.version\"\n },\n \"require-dev\": {\n \"ext-curl\": \"*\",\n \"phpunit/phpunit\": \"~9.0\"\n },\n \"suggest\": {\n \"ext-curl\": \"Guzzle will use specific adapters if cURL is present\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"1.1-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"GuzzleHttp\\\\Ring\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Michael Dowling\",\n \"email\": \"mtdowling@gmail.com\",\n \"homepage\": \"https://github.com/mtdowling\"\n }\n ],\n \"description\": \"Fork of guzzle/RingPHP (abandoned) to be used with elasticsearch-php\",\n \"support\": {\n \"source\": \"https://github.com/ezimuel/ringphp/tree/1.4.0\"\n },\n \"time\": \"2025-08-07T09:30:38+00:00\"\n },\n {\n \"name\": \"fakerphp/faker\",\n \"version\": \"v1.24.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/FakerPHP/Faker.git\",\n \"reference\": \"e0ee18eb1e6dc3cda3ce9fd97e5a0689a88a64b5\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/FakerPHP/Faker/zipball/e0ee18eb1e6dc3cda3ce9fd97e5a0689a88a64b5\",\n \"reference\": \"e0ee18eb1e6dc3cda3ce9fd97e5a0689a88a64b5\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \"^7.4 || ^8.0\",\n \"psr/container\": \"^1.0 || ^2.0\",\n \"symfony/deprecation-contracts\": \"^2.2 || ^3.0\"\n },\n \"conflict\": {\n \"fzaninotto/faker\": \"*\"\n },\n \"require-dev\": {\n \"bamarni/composer-bin-plugin\": \"^1.4.1\",\n \"doctrine/persistence\": \"^1.3 || ^2.0\",\n \"ext-intl\": \"*\",\n \"phpunit/phpunit\": \"^9.5.26\",\n \"symfony/phpunit-bridge\": \"^5.4.16\"\n },\n \"suggest\": {\n \"doctrine/orm\": \"Required to use Faker\\\\ORM\\\\Doctrine\",\n \"ext-curl\": \"Required by Faker\\\\Provider\\\\Image to download images.\",\n \"ext-dom\": \"Required by Faker\\\\Provider\\\\HtmlLorem for generating random HTML.\",\n \"ext-iconv\": \"Required by Faker\\\\Provider\\\\ru_RU\\\\Text::realText() for generating real Russian text.\",\n \"ext-mbstring\": \"Required for multibyte Unicode string functionality.\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Faker\\\\\": \"src/Faker/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"François Zaninotto\"\n }\n ],\n \"description\": \"Faker is a PHP library that generates fake data for you.\",\n \"keywords\": [\n \"data\",\n \"faker\",\n \"fixtures\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/FakerPHP/Faker/issues\",\n \"source\": \"https://github.com/FakerPHP/Faker/tree/v1.24.1\"\n },\n \"time\": \"2024-11-21T13:46:39+00:00\"\n },\n {\n \"name\": \"firebase/php-jwt\",\n \"version\": \"v7.0.3\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/firebase/php-jwt.git\",\n \"reference\": \"28aa0694bcfdfa5e2959c394d5a1ee7a5083629e\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/firebase/php-jwt/zipball/28aa0694bcfdfa5e2959c394d5a1ee7a5083629e\",\n \"reference\": \"28aa0694bcfdfa5e2959c394d5a1ee7a5083629e\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \"^8.0\"\n },\n \"require-dev\": {\n \"guzzlehttp/guzzle\": \"^7.4\",\n \"phpspec/prophecy-phpunit\": \"^2.0\",\n \"phpunit/phpunit\": \"^9.5\",\n \"psr/cache\": \"^2.0||^3.0\",\n \"psr/http-client\": \"^1.0\",\n \"psr/http-factory\": \"^1.0\"\n },\n \"suggest\": {\n \"ext-sodium\": \"Support EdDSA (Ed25519) signatures\",\n \"paragonie/sodium_compat\": \"Support EdDSA (Ed25519) signatures when libsodium is not present\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Firebase\\\\JWT\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"BSD-3-Clause\"\n ],\n \"authors\": [\n {\n \"name\": \"Neuman Vong\",\n \"email\": \"neuman+pear@twilio.com\",\n \"role\": \"Developer\"\n },\n {\n \"name\": \"Anant Narayanan\",\n \"email\": \"anant@php.net\",\n \"role\": \"Developer\"\n }\n ],\n \"description\": \"A simple library to encode and decode JSON Web Tokens (JWT) in PHP. Should conform to the current spec.\",\n \"homepage\": \"https://github.com/firebase/php-jwt\",\n \"keywords\": [\n \"jwt\",\n \"php\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/firebase/php-jwt/issues\",\n \"source\": \"https://github.com/firebase/php-jwt/tree/v7.0.3\"\n },\n \"time\": \"2026-02-25T22:16:40+00:00\"\n },\n {\n \"name\": \"flipboxdigital/oauth2-hubspot\",\n \"version\": \"1.0.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/flipbox/oauth2-hubspot.git\",\n \"reference\": \"4e7def2ee4505dfc206cfa1969fa7ed2b2f89af8\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/flipbox/oauth2-hubspot/zipball/4e7def2ee4505dfc206cfa1969fa7ed2b2f89af8\",\n \"reference\": \"4e7def2ee4505dfc206cfa1969fa7ed2b2f89af8\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"league/oauth2-client\": \"^2.0\"\n },\n \"require-dev\": {\n \"mockery/mockery\": \"~0.9\",\n \"phpunit/phpunit\": \"~4.0\",\n \"squizlabs/php_codesniffer\": \"~2.0\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"1.0.x-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Flipbox\\\\OAuth2\\\\Client\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"description\": \"HubSpot OAuth 2.0 Client Provider for The PHP League OAuth2-Client\",\n \"keywords\": [\n \"authorisation\",\n \"authorization\",\n \"client\",\n \"hubspot\",\n \"oauth\",\n \"oauth2\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/flipbox/oauth2-hubspot/issues\",\n \"source\": \"https://github.com/flipbox/oauth2-hubspot/tree/develop\"\n },\n \"time\": \"2018-07-09T15:15:59+00:00\"\n },\n {\n \"name\": \"fruitcake/php-cors\",\n \"version\": \"v1.4.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/fruitcake/php-cors.git\",\n \"reference\": \"38aaa6c3fd4c157ffe2a4d10aa8b9b16ba8de379\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/fruitcake/php-cors/zipball/38aaa6c3fd4c157ffe2a4d10aa8b9b16ba8de379\",\n \"reference\": \"38aaa6c3fd4c157ffe2a4d10aa8b9b16ba8de379\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \"^8.1\",\n \"symfony/http-foundation\": \"^5.4|^6.4|^7.3|^8\"\n },\n \"require-dev\": {\n \"phpstan/phpstan\": \"^2\",\n \"phpunit/phpunit\": \"^9\",\n \"squizlabs/php_codesniffer\": \"^4\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"1.3-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Fruitcake\\\\Cors\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Fruitcake\",\n \"homepage\": \"https://fruitcake.nl\"\n },\n {\n \"name\": \"Barryvdh\",\n \"email\": \"barryvdh@gmail.com\"\n }\n ],\n \"description\": \"Cross-origin resource sharing library for the Symfony HttpFoundation\",\n \"homepage\": \"https://github.com/fruitcake/php-cors\",\n \"keywords\": [\n \"cors\",\n \"laravel\",\n \"symfony\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/fruitcake/php-cors/issues\",\n \"source\": \"https://github.com/fruitcake/php-cors/tree/v1.4.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://fruitcake.nl\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/barryvdh\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2025-12-03T09:33:47+00:00\"\n },\n {\n \"name\": \"giggsey/libphonenumber-for-php\",\n \"version\": \"8.13.55\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/giggsey/libphonenumber-for-php.git\",\n \"reference\": \"6e28b3d53cf96d7f41c83d9b80b6021ecbd00537\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/giggsey/libphonenumber-for-php/zipball/6e28b3d53cf96d7f41c83d9b80b6021ecbd00537\",\n \"reference\": \"6e28b3d53cf96d7f41c83d9b80b6021ecbd00537\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"giggsey/locale\": \"^2.0\",\n \"php\": \"^7.4|^8.0\",\n \"symfony/polyfill-mbstring\": \"^1.17\"\n },\n \"replace\": {\n \"giggsey/libphonenumber-for-php-lite\": \"self.version\"\n },\n \"require-dev\": {\n \"friendsofphp/php-cs-fixer\": \"^3.64\",\n \"pear/pear-core-minimal\": \"^1.10\",\n \"pear/pear_exception\": \"^1.0\",\n \"pear/versioncontrol_git\": \"^0.7\",\n \"phing/phing\": \"^3.0\",\n \"php-coveralls/php-coveralls\": \"^2.0\",\n \"phpunit/phpunit\": \"^9.6\",\n \"symfony/console\": \"^v5.2\",\n \"symfony/var-exporter\": \"^5.2\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"8.x-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"libphonenumber\\\\\": \"src/\"\n },\n \"exclude-from-classmap\": [\n \"/src/data/\",\n \"/src/carrier/data/\",\n \"/src/geocoding/data/\",\n \"/src/timezone/data/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"Apache-2.0\"\n ],\n \"authors\": [\n {\n \"name\": \"Joshua Gigg\",\n \"email\": \"giggsey@gmail.com\",\n \"homepage\": \"https://giggsey.com/\"\n }\n ],\n \"description\": \"PHP Port of Google's libphonenumber\",\n \"homepage\": \"https://github.com/giggsey/libphonenumber-for-php\",\n \"keywords\": [\n \"geocoding\",\n \"geolocation\",\n \"libphonenumber\",\n \"mobile\",\n \"phonenumber\",\n \"validation\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/giggsey/libphonenumber-for-php/issues\",\n \"source\": \"https://github.com/giggsey/libphonenumber-for-php\"\n },\n \"time\": \"2025-02-14T08:14:08+00:00\"\n },\n {\n \"name\": \"giggsey/locale\",\n \"version\": \"2.8.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/giggsey/Locale.git\",\n \"reference\": \"1cd8b3ad2d43e04f4c2c6a240495af44780f809b\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/giggsey/Locale/zipball/1cd8b3ad2d43e04f4c2c6a240495af44780f809b\",\n \"reference\": \"1cd8b3ad2d43e04f4c2c6a240495af44780f809b\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \"^8.1\"\n },\n \"require-dev\": {\n \"ext-json\": \"*\",\n \"friendsofphp/php-cs-fixer\": \"^3.66\",\n \"pear/pear-core-minimal\": \"^1.10\",\n \"pear/pear_exception\": \"^1.0\",\n \"pear/versioncontrol_git\": \"^0.5\",\n \"phing/phing\": \"^2.17.4\",\n \"php-coveralls/php-coveralls\": \"^2.7\",\n \"phpunit/phpunit\": \"^10.5.45\",\n \"symfony/console\": \"^6.4\",\n \"symfony/filesystem\": \"6.4\",\n \"symfony/finder\": \"^6.4\",\n \"symfony/process\": \"^6.4\",\n \"symfony/var-exporter\": \"^6.4\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Giggsey\\\\Locale\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Joshua Gigg\",\n \"email\": \"giggsey@gmail.com\",\n \"homepage\": \"https://giggsey.com/\"\n }\n ],\n \"description\": \"Locale functions required by libphonenumber-for-php\",\n \"support\": {\n \"issues\": \"https://github.com/giggsey/Locale/issues\",\n \"source\": \"https://github.com/giggsey/Locale/tree/2.8.0\"\n },\n \"time\": \"2025-03-20T14:25:27+00:00\"\n },\n {\n \"name\": \"google/apiclient\",\n \"version\": \"v2.19.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/googleapis/google-api-php-client.git\",\n \"reference\": \"b18fa8aed7b2b2dd4bcce74e2c7d267e16007ea9\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/googleapis/google-api-php-client/zipball/b18fa8aed7b2b2dd4bcce74e2c7d267e16007ea9\",\n \"reference\": \"b18fa8aed7b2b2dd4bcce74e2c7d267e16007ea9\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"firebase/php-jwt\": \"^6.0||^7.0\",\n \"google/apiclient-services\": \"~0.350\",\n \"google/auth\": \"^1.37\",\n \"guzzlehttp/guzzle\": \"^7.4.5\",\n \"guzzlehttp/psr7\": \"^2.6\",\n \"monolog/monolog\": \"^2.9||^3.0\",\n \"php\": \"^8.1\",\n \"phpseclib/phpseclib\": \"^3.0.36\"\n },\n \"require-dev\": {\n \"cache/filesystem-adapter\": \"^1.1\",\n \"composer/composer\": \"^1.10.23\",\n \"phpcompatibility/php-compatibility\": \"^9.2\",\n \"phpspec/prophecy-phpunit\": \"^2.1\",\n \"phpunit/phpunit\": \"^9.6\",\n \"squizlabs/php_codesniffer\": \"^3.8\",\n \"symfony/css-selector\": \"~2.1\",\n \"symfony/dom-crawler\": \"~2.1\"\n },\n \"suggest\": {\n \"cache/filesystem-adapter\": \"For caching certs and tokens (using Google\\\\Client::setCache)\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-main\": \"2.x-dev\"\n }\n },\n \"autoload\": {\n \"files\": [\n \"src/aliases.php\"\n ],\n \"psr-4\": {\n \"Google\\\\\": \"src/\"\n },\n \"classmap\": [\n \"src/aliases.php\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"Apache-2.0\"\n ],\n \"description\": \"Client library for Google APIs\",\n \"homepage\": \"http://developers.google.com/api-client-library/php\",\n \"keywords\": [\n \"google\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/googleapis/google-api-php-client/issues\",\n \"source\": \"https://github.com/googleapis/google-api-php-client/tree/v2.19.0\"\n },\n \"time\": \"2026-01-09T19:59:47+00:00\"\n },\n {\n \"name\": \"google/apiclient-services\",\n \"version\": \"v0.435.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/googleapis/google-api-php-client-services.git\",\n \"reference\": \"1edf0f5f2876945c372366107b4d7a387b17a6b9\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/googleapis/google-api-php-client-services/zipball/1edf0f5f2876945c372366107b4d7a387b17a6b9\",\n \"reference\": \"1edf0f5f2876945c372366107b4d7a387b17a6b9\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \"^8.1\"\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \"^9.6\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"files\": [\n \"autoload.php\"\n ],\n \"psr-4\": {\n \"Google\\\\Service\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"Apache-2.0\"\n ],\n \"description\": \"Client library for Google APIs\",\n \"homepage\": \"http://developers.google.com/api-client-library/php\",\n \"keywords\": [\n \"google\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/googleapis/google-api-php-client-services/issues\",\n \"source\": \"https://github.com/googleapis/google-api-php-client-services/tree/v0.435.0\"\n },\n \"time\": \"2026-03-01T01:14:26+00:00\"\n },\n {\n \"name\": \"google/apps-meet\",\n \"version\": \"v0.5.3\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/googleapis/php-apps-meet.git\",\n \"reference\": \"2e186214b725f98ed58520d0ac170ec821d11f95\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/googleapis/php-apps-meet/zipball/2e186214b725f98ed58520d0ac170ec821d11f95\",\n \"reference\": \"2e186214b725f98ed58520d0ac170ec821d11f95\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"google/gax\": \"^1.38.0\",\n \"php\": \"^8.1\"\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \"^9.0\"\n },\n \"suggest\": {\n \"ext-grpc\": \"Enables use of gRPC, a universal high-performance RPC framework created by Google.\",\n \"ext-protobuf\": \"Provides a significant increase in throughput over the pure PHP protobuf implementation. See https://cloud.google.com/php/grpc for installation instructions.\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"component\": {\n \"id\": \"apps-meet\",\n \"path\": \"AppsMeet\",\n \"target\": \"googleapis/php-apps-meet\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Google\\\\Apps\\\\Meet\\\\\": \"src\",\n \"GPBMetadata\\\\Google\\\\Apps\\\\Meet\\\\\": \"metadata\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"Apache-2.0\"\n ],\n \"description\": \"Google Apps Meet Client for PHP\",\n \"support\": {\n \"source\": \"https://github.com/googleapis/php-apps-meet/tree/v0.5.3\"\n },\n \"time\": \"2026-01-23T22:57:13+00:00\"\n },\n {\n \"name\": \"google/auth\",\n \"version\": \"v1.50.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/googleapis/google-auth-library-php.git\",\n \"reference\": \"e1c26a718198e16d8a3c69b1cae136b73f959b0f\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/googleapis/google-auth-library-php/zipball/e1c26a718198e16d8a3c69b1cae136b73f959b0f\",\n \"reference\": \"e1c26a718198e16d8a3c69b1cae136b73f959b0f\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"firebase/php-jwt\": \"^6.0||^7.0\",\n \"guzzlehttp/guzzle\": \"^7.4.5\",\n \"guzzlehttp/psr7\": \"^2.4.5\",\n \"php\": \"^8.1\",\n \"psr/cache\": \"^2.0||^3.0\",\n \"psr/http-message\": \"^1.1||^2.0\",\n \"psr/log\": \"^3.0\"\n },\n \"require-dev\": {\n \"guzzlehttp/promises\": \"^2.0\",\n \"kelvinmo/simplejwt\": \"^1.1.0\",\n \"phpseclib/phpseclib\": \"^3.0.35\",\n \"phpspec/prophecy-phpunit\": \"^2.1\",\n \"phpunit/phpunit\": \"^9.6\",\n \"sebastian/comparator\": \">=1.2.3\",\n \"squizlabs/php_codesniffer\": \"^4.0\",\n \"symfony/filesystem\": \"^6.3||^7.3\",\n \"symfony/process\": \"^6.0||^7.0\",\n \"webmozart/assert\": \"^1.11||^2.0\"\n },\n \"suggest\": {\n \"phpseclib/phpseclib\": \"May be used in place of OpenSSL for signing strings or for token management. Please require version ^2.\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Google\\\\Auth\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"Apache-2.0\"\n ],\n \"description\": \"Google Auth Library for PHP\",\n \"homepage\": \"https://github.com/google/google-auth-library-php\",\n \"keywords\": [\n \"Authentication\",\n \"google\",\n \"oauth2\"\n ],\n \"support\": {\n \"docs\": \"https://cloud.google.com/php/docs/reference/auth/latest\",\n \"issues\": \"https://github.com/googleapis/google-auth-library-php/issues\",\n \"source\": \"https://github.com/googleapis/google-auth-library-php/tree/v1.50.0\"\n },\n \"time\": \"2026-01-08T21:33:57+00:00\"\n },\n {\n \"name\": \"google/common-protos\",\n \"version\": \"4.12.4\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/googleapis/common-protos-php.git\",\n \"reference\": \"0127156899af0df2681bd42024c60bd5360d64e3\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/googleapis/common-protos-php/zipball/0127156899af0df2681bd42024c60bd5360d64e3\",\n \"reference\": \"0127156899af0df2681bd42024c60bd5360d64e3\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"google/protobuf\": \"^4.31\",\n \"php\": \"^8.1\"\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \"^9.6\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"component\": {\n \"id\": \"common-protos\",\n \"path\": \"CommonProtos\",\n \"entry\": \"README.md\",\n \"target\": \"googleapis/common-protos-php.git\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Google\\\\Api\\\\\": \"src/Api\",\n \"Google\\\\Iam\\\\\": \"src/Iam\",\n \"Google\\\\Rpc\\\\\": \"src/Rpc\",\n \"Google\\\\Type\\\\\": \"src/Type\",\n \"Google\\\\Cloud\\\\\": \"src/Cloud\",\n \"GPBMetadata\\\\Google\\\\Api\\\\\": \"metadata/Api\",\n \"GPBMetadata\\\\Google\\\\Iam\\\\\": \"metadata/Iam\",\n \"GPBMetadata\\\\Google\\\\Rpc\\\\\": \"metadata/Rpc\",\n \"GPBMetadata\\\\Google\\\\Type\\\\\": \"metadata/Type\",\n \"GPBMetadata\\\\Google\\\\Cloud\\\\\": \"metadata/Cloud\",\n \"GPBMetadata\\\\Google\\\\Logging\\\\\": \"metadata/Logging\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"Apache-2.0\"\n ],\n \"description\": \"Google API Common Protos for PHP\",\n \"homepage\": \"https://github.com/googleapis/common-protos-php\",\n \"keywords\": [\n \"google\"\n ],\n \"support\": {\n \"source\": \"https://github.com/googleapis/common-protos-php/tree/v4.12.4\"\n },\n \"time\": \"2025-09-20T01:29:44+00:00\"\n },\n {\n \"name\": \"google/gax\",\n \"version\": \"v1.42.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/googleapis/gax-php.git\",\n \"reference\": \"ab334c4869f4f16b6112acc95972a97b81dbfdda\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/googleapis/gax-php/zipball/ab334c4869f4f16b6112acc95972a97b81dbfdda\",\n \"reference\": \"ab334c4869f4f16b6112acc95972a97b81dbfdda\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"google/auth\": \"^1.49\",\n \"google/common-protos\": \"^4.4\",\n \"google/grpc-gcp\": \"^0.4\",\n \"google/longrunning\": \"~0.4\",\n \"google/protobuf\": \"^4.31||^5.0\",\n \"grpc/grpc\": \"^1.13\",\n \"guzzlehttp/promises\": \"^2.0\",\n \"guzzlehttp/psr7\": \"^2.0\",\n \"php\": \"^8.1\",\n \"ramsey/uuid\": \"^4.0\"\n },\n \"conflict\": {\n \"ext-protobuf\": \"<4.31.0\"\n },\n \"require-dev\": {\n \"google/cloud-tools\": \"^0.16.1\",\n \"phpspec/prophecy-phpunit\": \"^2.1\",\n \"phpstan/phpstan\": \"^2.0\",\n \"phpunit/phpunit\": \"^9.6\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Google\\\\ApiCore\\\\\": \"src\",\n \"GPBMetadata\\\\ApiCore\\\\\": \"metadata/ApiCore\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"BSD-3-Clause\"\n ],\n \"description\": \"Google API Core for PHP\",\n \"homepage\": \"https://github.com/googleapis/gax-php\",\n \"keywords\": [\n \"google\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/googleapis/gax-php/issues\",\n \"source\": \"https://github.com/googleapis/gax-php/tree/v1.42.1\"\n },\n \"time\": \"2026-03-12T21:22:20+00:00\"\n },\n {\n \"name\": \"google/grpc-gcp\",\n \"version\": \"0.4.2\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/GoogleCloudPlatform/grpc-gcp-php.git\",\n \"reference\": \"1049c0c15b6a1789fdeb52af688a94d540932469\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/GoogleCloudPlatform/grpc-gcp-php/zipball/1049c0c15b6a1789fdeb52af688a94d540932469\",\n \"reference\": \"1049c0c15b6a1789fdeb52af688a94d540932469\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"google/auth\": \"^1.3\",\n \"google/protobuf\": \"^v3.25.3||^4.26.1||^5.0\",\n \"grpc/grpc\": \"^v1.13.0\",\n \"php\": \"^8.0\",\n \"psr/cache\": \"^1.0.1||^2.0.0||^3.0.0\"\n },\n \"require-dev\": {\n \"google/cloud-spanner\": \"^1.7\",\n \"phpunit/phpunit\": \"^9.0\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Grpc\\\\Gcp\\\\\": \"src/\"\n },\n \"classmap\": [\n \"src/generated/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"Apache-2.0\"\n ],\n \"description\": \"gRPC GCP library for channel management\",\n \"support\": {\n \"issues\": \"https://github.com/GoogleCloudPlatform/grpc-gcp-php/issues\",\n \"source\": \"https://github.com/GoogleCloudPlatform/grpc-gcp-php/tree/v0.4.2\"\n },\n \"time\": \"2026-03-12T22:56:09+00:00\"\n },\n {\n \"name\": \"google/longrunning\",\n \"version\": \"0.6.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/googleapis/php-longrunning.git\",\n \"reference\": \"226d3b5166eaa13754cc5e452b37872478e23375\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/googleapis/php-longrunning/zipball/226d3b5166eaa13754cc5e452b37872478e23375\",\n \"reference\": \"226d3b5166eaa13754cc5e452b37872478e23375\",\n \"shasum\": \"\"\n },\n \"require-dev\": {\n \"google/gax\": \"^1.38.0\",\n \"phpunit/phpunit\": \"^9.0\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"component\": {\n \"id\": \"longrunning\",\n \"path\": \"LongRunning\",\n \"entry\": null,\n \"target\": \"googleapis/php-longrunning\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Google\\\\LongRunning\\\\\": \"src/LongRunning\",\n \"Google\\\\ApiCore\\\\LongRunning\\\\\": \"src/ApiCore/LongRunning\",\n \"GPBMetadata\\\\Google\\\\Longrunning\\\\\": \"metadata/Longrunning\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"Apache-2.0\"\n ],\n \"description\": \"Google LongRunning Client for PHP\",\n \"support\": {\n \"source\": \"https://github.com/googleapis/php-longrunning/tree/v0.6.0\"\n },\n \"time\": \"2025-10-07T18:41:09+00:00\"\n },\n {\n \"name\": \"google/protobuf\",\n \"version\": \"v4.33.6\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/protocolbuffers/protobuf-php.git\",\n \"reference\": \"84b008c23915ed94536737eae46f41ba3bccfe67\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/protocolbuffers/protobuf-php/zipball/84b008c23915ed94536737eae46f41ba3bccfe67\",\n \"reference\": \"84b008c23915ed94536737eae46f41ba3bccfe67\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.1.0\"\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \">=10.5.62 <11.0.0\"\n },\n \"suggest\": {\n \"ext-bcmath\": \"Need to support JSON deserialization\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Google\\\\Protobuf\\\\\": \"src/Google/Protobuf\",\n \"GPBMetadata\\\\Google\\\\Protobuf\\\\\": \"src/GPBMetadata/Google/Protobuf\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"BSD-3-Clause\"\n ],\n \"description\": \"proto library for PHP\",\n \"homepage\": \"https://developers.google.com/protocol-buffers/\",\n \"keywords\": [\n \"proto\"\n ],\n \"support\": {\n \"source\": \"https://github.com/protocolbuffers/protobuf-php/tree/v4.33.6\"\n },\n \"time\": \"2026-03-18T17:32:05+00:00\"\n },\n {\n \"name\": \"graham-campbell/manager\",\n \"version\": \"v5.2.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/GrahamCampbell/Laravel-Manager.git\",\n \"reference\": \"b6a4172a32b931fe20c5c242251c8c98b2c79e41\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/GrahamCampbell/Laravel-Manager/zipball/b6a4172a32b931fe20c5c242251c8c98b2c79e41\",\n \"reference\": \"b6a4172a32b931fe20c5c242251c8c98b2c79e41\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"illuminate/contracts\": \"^8.75 || ^9.0 || ^10.0 || ^11.0 || ^12.0\",\n \"illuminate/support\": \"^8.75 || ^9.0 || ^10.0 || ^11.0 || ^12.0\",\n \"php\": \"^7.4.15 || ^8.0.2\"\n },\n \"require-dev\": {\n \"graham-campbell/analyzer\": \"^4.2.1 || ^5.0.0\",\n \"graham-campbell/testbench-core\": \"^4.2.1\",\n \"mockery/mockery\": \"^1.6.12\",\n \"phpunit/phpunit\": \"^9.6.22 || ^10.5.45 || ^11.5.10\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"GrahamCampbell\\\\Manager\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Graham Campbell\",\n \"email\": \"hello@gjcampbell.co.uk\",\n \"homepage\": \"https://github.com/GrahamCampbell\"\n }\n ],\n \"description\": \"Manager Provides Some Manager Functionality For Laravel\",\n \"keywords\": [\n \"Graham Campbell\",\n \"GrahamCampbell\",\n \"Laravel Manager\",\n \"Laravel-Manager\",\n \"connector\",\n \"framework\",\n \"interface\",\n \"laravel\",\n \"manager\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/GrahamCampbell/Laravel-Manager/issues\",\n \"source\": \"https://github.com/GrahamCampbell/Laravel-Manager/tree/v5.2.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/GrahamCampbell\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/graham-campbell/manager\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2025-03-02T20:18:37+00:00\"\n },\n {\n \"name\": \"graham-campbell/result-type\",\n \"version\": \"v1.1.4\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/GrahamCampbell/Result-Type.git\",\n \"reference\": \"e01f4a821471308ba86aa202fed6698b6b695e3b\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/GrahamCampbell/Result-Type/zipball/e01f4a821471308ba86aa202fed6698b6b695e3b\",\n \"reference\": \"e01f4a821471308ba86aa202fed6698b6b695e3b\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \"^7.2.5 || ^8.0\",\n \"phpoption/phpoption\": \"^1.9.5\"\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \"^8.5.41 || ^9.6.22 || ^10.5.45 || ^11.5.7\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"GrahamCampbell\\\\ResultType\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Graham Campbell\",\n \"email\": \"hello@gjcampbell.co.uk\",\n \"homepage\": \"https://github.com/GrahamCampbell\"\n }\n ],\n \"description\": \"An Implementation Of The Result Type\",\n \"keywords\": [\n \"Graham Campbell\",\n \"GrahamCampbell\",\n \"Result Type\",\n \"Result-Type\",\n \"result\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/GrahamCampbell/Result-Type/issues\",\n \"source\": \"https://github.com/GrahamCampbell/Result-Type/tree/v1.1.4\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/GrahamCampbell\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/graham-campbell/result-type\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2025-12-27T19:43:20+00:00\"\n },\n {\n \"name\": \"grpc/grpc\",\n \"version\": \"1.74.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/grpc/grpc-php.git\",\n \"reference\": \"32bf4dba256d60d395582fb6e4e8d3936bcdb713\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/grpc/grpc-php/zipball/32bf4dba256d60d395582fb6e4e8d3936bcdb713\",\n \"reference\": \"32bf4dba256d60d395582fb6e4e8d3936bcdb713\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=7.0.0\"\n },\n \"require-dev\": {\n \"google/auth\": \"^v1.3.0\"\n },\n \"suggest\": {\n \"ext-protobuf\": \"For better performance, install the protobuf C extension.\",\n \"google/protobuf\": \"To get started using grpc quickly, install the native protobuf library.\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Grpc\\\\\": \"src/lib/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"Apache-2.0\"\n ],\n \"description\": \"gRPC library for PHP\",\n \"homepage\": \"https://grpc.io\",\n \"keywords\": [\n \"rpc\"\n ],\n \"support\": {\n \"source\": \"https://github.com/grpc/grpc-php/tree/v1.74.0\"\n },\n \"time\": \"2025-07-24T20:02:16+00:00\"\n },\n {\n \"name\": \"guzzlehttp/guzzle\",\n \"version\": \"7.10.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/guzzle/guzzle.git\",\n \"reference\": \"b51ac707cfa420b7bfd4e4d5e510ba8008e822b4\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/guzzle/guzzle/zipball/b51ac707cfa420b7bfd4e4d5e510ba8008e822b4\",\n \"reference\": \"b51ac707cfa420b7bfd4e4d5e510ba8008e822b4\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"ext-json\": \"*\",\n \"guzzlehttp/promises\": \"^2.3\",\n \"guzzlehttp/psr7\": \"^2.8\",\n \"php\": \"^7.2.5 || ^8.0\",\n \"psr/http-client\": \"^1.0\",\n \"symfony/deprecation-contracts\": \"^2.2 || ^3.0\"\n },\n \"provide\": {\n \"psr/http-client-implementation\": \"1.0\"\n },\n \"require-dev\": {\n \"bamarni/composer-bin-plugin\": \"^1.8.2\",\n \"ext-curl\": \"*\",\n \"guzzle/client-integration-tests\": \"3.0.2\",\n \"php-http/message-factory\": \"^1.1\",\n \"phpunit/phpunit\": \"^8.5.39 || ^9.6.20\",\n \"psr/log\": \"^1.1 || ^2.0 || ^3.0\"\n },\n \"suggest\": {\n \"ext-curl\": \"Required for CURL handler support\",\n \"ext-intl\": \"Required for Internationalized Domain Name (IDN) support\",\n \"psr/log\": \"Required for using the Log middleware\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"bamarni-bin\": {\n \"bin-links\": true,\n \"forward-command\": false\n }\n },\n \"autoload\": {\n \"files\": [\n \"src/functions_include.php\"\n ],\n \"psr-4\": {\n \"GuzzleHttp\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Graham Campbell\",\n \"email\": \"hello@gjcampbell.co.uk\",\n \"homepage\": \"https://github.com/GrahamCampbell\"\n },\n {\n \"name\": \"Michael Dowling\",\n \"email\": \"mtdowling@gmail.com\",\n \"homepage\": \"https://github.com/mtdowling\"\n },\n {\n \"name\": \"Jeremy Lindblom\",\n \"email\": \"jeremeamia@gmail.com\",\n \"homepage\": \"https://github.com/jeremeamia\"\n },\n {\n \"name\": \"George Mponos\",\n \"email\": \"gmponos@gmail.com\",\n \"homepage\": \"https://github.com/gmponos\"\n },\n {\n \"name\": \"Tobias Nyholm\",\n \"email\": \"tobias.nyholm@gmail.com\",\n \"homepage\": \"https://github.com/Nyholm\"\n },\n {\n \"name\": \"Márk Sági-Kazár\",\n \"email\": \"mark.sagikazar@gmail.com\",\n \"homepage\": \"https://github.com/sagikazarmark\"\n },\n {\n \"name\": \"Tobias Schultze\",\n \"email\": \"webmaster@tubo-world.de\",\n \"homepage\": \"https://github.com/Tobion\"\n }\n ],\n \"description\": \"Guzzle is a PHP HTTP client library\",\n \"keywords\": [\n \"client\",\n \"curl\",\n \"framework\",\n \"http\",\n \"http client\",\n \"psr-18\",\n \"psr-7\",\n \"rest\",\n \"web service\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/guzzle/guzzle/issues\",\n \"source\": \"https://github.com/guzzle/guzzle/tree/7.10.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/GrahamCampbell\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://github.com/Nyholm\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/guzzlehttp/guzzle\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2025-08-23T22:36:01+00:00\"\n },\n {\n \"name\": \"guzzlehttp/promises\",\n \"version\": \"2.3.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/guzzle/promises.git\",\n \"reference\": \"481557b130ef3790cf82b713667b43030dc9c957\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/guzzle/promises/zipball/481557b130ef3790cf82b713667b43030dc9c957\",\n \"reference\": \"481557b130ef3790cf82b713667b43030dc9c957\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \"^7.2.5 || ^8.0\"\n },\n \"require-dev\": {\n \"bamarni/composer-bin-plugin\": \"^1.8.2\",\n \"phpunit/phpunit\": \"^8.5.44 || ^9.6.25\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"bamarni-bin\": {\n \"bin-links\": true,\n \"forward-command\": false\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"GuzzleHttp\\\\Promise\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Graham Campbell\",\n \"email\": \"hello@gjcampbell.co.uk\",\n \"homepage\": \"https://github.com/GrahamCampbell\"\n },\n {\n \"name\": \"Michael Dowling\",\n \"email\": \"mtdowling@gmail.com\",\n \"homepage\": \"https://github.com/mtdowling\"\n },\n {\n \"name\": \"Tobias Nyholm\",\n \"email\": \"tobias.nyholm@gmail.com\",\n \"homepage\": \"https://github.com/Nyholm\"\n },\n {\n \"name\": \"Tobias Schultze\",\n \"email\": \"webmaster@tubo-world.de\",\n \"homepage\": \"https://github.com/Tobion\"\n }\n ],\n \"description\": \"Guzzle promises library\",\n \"keywords\": [\n \"promise\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/guzzle/promises/issues\",\n \"source\": \"https://github.com/guzzle/promises/tree/2.3.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/GrahamCampbell\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://github.com/Nyholm\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/guzzlehttp/promises\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2025-08-22T14:34:08+00:00\"\n },\n {\n \"name\": \"guzzlehttp/psr7\",\n \"version\": \"2.9.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/guzzle/psr7.git\",\n \"reference\": \"7d0ed42f28e42d61352a7a79de682e5e67fec884\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/guzzle/psr7/zipball/7d0ed42f28e42d61352a7a79de682e5e67fec884\",\n \"reference\": \"7d0ed42f28e42d61352a7a79de682e5e67fec884\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \"^7.2.5 || ^8.0\",\n \"psr/http-factory\": \"^1.0\",\n \"psr/http-message\": \"^1.1 || ^2.0\",\n \"ralouphie/getallheaders\": \"^3.0\"\n },\n \"provide\": {\n \"psr/http-factory-implementation\": \"1.0\",\n \"psr/http-message-implementation\": \"1.0\"\n },\n \"require-dev\": {\n \"bamarni/composer-bin-plugin\": \"^1.8.2\",\n \"http-interop/http-factory-tests\": \"0.9.0\",\n \"jshttp/mime-db\": \"1.54.0.1\",\n \"phpunit/phpunit\": \"^8.5.44 || ^9.6.25\"\n },\n \"suggest\": {\n \"laminas/laminas-httphandlerrunner\": \"Emit PSR-7 responses\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"bamarni-bin\": {\n \"bin-links\": true,\n \"forward-command\": false\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"GuzzleHttp\\\\Psr7\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Graham Campbell\",\n \"email\": \"hello@gjcampbell.co.uk\",\n \"homepage\": \"https://github.com/GrahamCampbell\"\n },\n {\n \"name\": \"Michael Dowling\",\n \"email\": \"mtdowling@gmail.com\",\n \"homepage\": \"https://github.com/mtdowling\"\n },\n {\n \"name\": \"George Mponos\",\n \"email\": \"gmponos@gmail.com\",\n \"homepage\": \"https://github.com/gmponos\"\n },\n {\n \"name\": \"Tobias Nyholm\",\n \"email\": \"tobias.nyholm@gmail.com\",\n \"homepage\": \"https://github.com/Nyholm\"\n },\n {\n \"name\": \"Márk Sági-Kazár\",\n \"email\": \"mark.sagikazar@gmail.com\",\n \"homepage\": \"https://github.com/sagikazarmark\"\n },\n {\n \"name\": \"Tobias Schultze\",\n \"email\": \"webmaster@tubo-world.de\",\n \"homepage\": \"https://github.com/Tobion\"\n },\n {\n \"name\": \"Márk Sági-Kazár\",\n \"email\": \"mark.sagikazar@gmail.com\",\n \"homepage\": \"https://sagikazarmark.hu\"\n }\n ],\n \"description\": \"PSR-7 message implementation that also provides common utility methods\",\n \"keywords\": [\n \"http\",\n \"message\",\n \"psr-7\",\n \"request\",\n \"response\",\n \"stream\",\n \"uri\",\n \"url\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/guzzle/psr7/issues\",\n \"source\": \"https://github.com/guzzle/psr7/tree/2.9.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/GrahamCampbell\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://github.com/Nyholm\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/guzzlehttp/psr7\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2026-03-10T16:41:02+00:00\"\n },\n {\n \"name\": \"guzzlehttp/uri-template\",\n \"version\": \"v1.0.5\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/guzzle/uri-template.git\",\n \"reference\": \"4f4bbd4e7172148801e76e3decc1e559bdee34e1\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/guzzle/uri-template/zipball/4f4bbd4e7172148801e76e3decc1e559bdee34e1\",\n \"reference\": \"4f4bbd4e7172148801e76e3decc1e559bdee34e1\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \"^7.2.5 || ^8.0\",\n \"symfony/polyfill-php80\": \"^1.24\"\n },\n \"require-dev\": {\n \"bamarni/composer-bin-plugin\": \"^1.8.2\",\n \"phpunit/phpunit\": \"^8.5.44 || ^9.6.25\",\n \"uri-template/tests\": \"1.0.0\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"bamarni-bin\": {\n \"bin-links\": true,\n \"forward-command\": false\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"GuzzleHttp\\\\UriTemplate\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Graham Campbell\",\n \"email\": \"hello@gjcampbell.co.uk\",\n \"homepage\": \"https://github.com/GrahamCampbell\"\n },\n {\n \"name\": \"Michael Dowling\",\n \"email\": \"mtdowling@gmail.com\",\n \"homepage\": \"https://github.com/mtdowling\"\n },\n {\n \"name\": \"George Mponos\",\n \"email\": \"gmponos@gmail.com\",\n \"homepage\": \"https://github.com/gmponos\"\n },\n {\n \"name\": \"Tobias Nyholm\",\n \"email\": \"tobias.nyholm@gmail.com\",\n \"homepage\": \"https://github.com/Nyholm\"\n }\n ],\n \"description\": \"A polyfill class for uri_template of PHP\",\n \"keywords\": [\n \"guzzlehttp\",\n \"uri-template\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/guzzle/uri-template/issues\",\n \"source\": \"https://github.com/guzzle/uri-template/tree/v1.0.5\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/GrahamCampbell\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://github.com/Nyholm\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/guzzlehttp/uri-template\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2025-08-22T14:27:06+00:00\"\n },\n {\n \"name\": \"halaxa/json-machine\",\n \"version\": \"1.2.5\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/halaxa/json-machine.git\",\n \"reference\": \"d0f84abf79ac98145d478b66d2bcf363d706477c\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/halaxa/json-machine/zipball/d0f84abf79ac98145d478b66d2bcf363d706477c\",\n \"reference\": \"d0f84abf79ac98145d478b66d2bcf363d706477c\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \"7.2 - 8.4\"\n },\n \"require-dev\": {\n \"ext-json\": \"*\",\n \"friendsofphp/php-cs-fixer\": \"^3.0\",\n \"phpstan/phpstan\": \"^1.10\",\n \"phpunit/phpunit\": \"^8.0\"\n },\n \"suggest\": {\n \"ext-json\": \"To run JSON Machine out of the box without custom decoders.\",\n \"guzzlehttp/guzzle\": \"To run example with GuzzleHttp\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"files\": [\n \"src/functions.php\"\n ],\n \"psr-4\": {\n \"JsonMachine\\\\\": \"src/\"\n },\n \"exclude-from-classmap\": [\n \"src/autoloader.php\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"Apache-2.0\"\n ],\n \"authors\": [\n {\n \"name\": \"Filip Halaxa\",\n \"email\": \"filip@halaxa.cz\"\n }\n ],\n \"description\": \"Efficient, easy-to-use and fast JSON pull parser\",\n \"support\": {\n \"issues\": \"https://github.com/halaxa/json-machine/issues\",\n \"source\": \"https://github.com/halaxa/json-machine/tree/1.2.5\"\n },\n \"funding\": [\n {\n \"url\": \"https://ko-fi.com/G2G57KTE4\",\n \"type\": \"other\"\n }\n ],\n \"time\": \"2025-07-07T13:38:34+00:00\"\n },\n {\n \"name\": \"hashids/hashids\",\n \"version\": \"5.0.2\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/vinkla/hashids.git\",\n \"reference\": \"197171016b77ddf14e259e186559152eb3f8cf33\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/vinkla/hashids/zipball/197171016b77ddf14e259e186559152eb3f8cf33\",\n \"reference\": \"197171016b77ddf14e259e186559152eb3f8cf33\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"ext-mbstring\": \"*\",\n \"php\": \"^8.1\"\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \"^10.0\"\n },\n \"suggest\": {\n \"ext-bcmath\": \"Required to use BC Math arbitrary precision mathematics (*).\",\n \"ext-gmp\": \"Required to use GNU multiple precision mathematics (*).\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"5.0-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Hashids\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Ivan Akimov\",\n \"email\": \"ivan@barreleye.com\"\n },\n {\n \"name\": \"Vincent Klaiber\",\n \"email\": \"hello@doubledip.se\"\n }\n ],\n \"description\": \"Generate short, unique, non-sequential ids (like YouTube and Bitly) from numbers\",\n \"homepage\": \"https://hashids.org/php\",\n \"keywords\": [\n \"bitly\",\n \"decode\",\n \"encode\",\n \"hash\",\n \"hashid\",\n \"hashids\",\n \"ids\",\n \"obfuscate\",\n \"youtube\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/vinkla/hashids/issues\",\n \"source\": \"https://github.com/vinkla/hashids/tree/5.0.2\"\n },\n \"time\": \"2023-02-23T15:00:54+00:00\"\n },\n {\n \"name\": \"html2text/html2text\",\n \"version\": \"4.3.2\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/mtibben/html2text.git\",\n \"reference\": \"3b443cbe302b52eb5806a21a9dbd79524203970a\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/mtibben/html2text/zipball/3b443cbe302b52eb5806a21a9dbd79524203970a\",\n \"reference\": \"3b443cbe302b52eb5806a21a9dbd79524203970a\",\n \"shasum\": \"\"\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \"~4|^9.0\"\n },\n \"suggest\": {\n \"ext-mbstring\": \"For best performance\",\n \"symfony/polyfill-mbstring\": \"If you can't install ext-mbstring\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Html2Text\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"GPL-2.0-or-later\"\n ],\n \"description\": \"Converts HTML to formatted plain text\",\n \"support\": {\n \"issues\": \"https://github.com/mtibben/html2text/issues\",\n \"source\": \"https://github.com/mtibben/html2text/tree/4.3.2\"\n },\n \"time\": \"2024-08-20T02:43:29+00:00\"\n },\n {\n \"name\": \"hubspot/api-client\",\n \"version\": \"5.0.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/HubSpot/hubspot-api-php.git\",\n \"reference\": \"0ab677f8ee5cfa663787d76df95c211abb6419cf\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/HubSpot/hubspot-api-php/zipball/0ab677f8ee5cfa663787d76df95c211abb6419cf\",\n \"reference\": \"0ab677f8ee5cfa663787d76df95c211abb6419cf\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"ext-curl\": \"*\",\n \"ext-json\": \"*\",\n \"ext-mbstring\": \"*\",\n \"guzzlehttp/guzzle\": \"^7.3\",\n \"guzzlehttp/psr7\": \"^2.0\",\n \"php\": \">=7.3\"\n },\n \"require-dev\": {\n \"friendsofphp/php-cs-fixer\": \"~2.12\",\n \"phpspec/phpspec\": \"^6.1\",\n \"phpunit/phpunit\": \"^8.5\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"HubSpot\\\\\": \"lib/\",\n \"Hubspot\\\\Tests\\\\\": \"tests/\",\n \"HubSpot\\\\Client\\\\\": \"codegen/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"Apache-2.0\"\n ],\n \"authors\": [\n {\n \"name\": \"HubSpot\",\n \"homepage\": \"https://hubspot.com/\"\n }\n ],\n \"description\": \"Hubspot API client\",\n \"homepage\": \"https://hubspot.com/\",\n \"keywords\": [\n \"api\",\n \"hubspot\",\n \"php\",\n \"sdk\",\n \"swagger\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/HubSpot/hubspot-api-php/issues\",\n \"source\": \"https://github.com/HubSpot/hubspot-api-php/tree/5.0.0\"\n },\n \"time\": \"2021-12-15T09:31:18+00:00\"\n },\n {\n \"name\": \"hubspot/hubspot-php\",\n \"version\": \"5.5.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/HubSpot/hubspot-php.git\",\n \"reference\": \"2d37f7edce728851f78e1012d448abd3f42201dc\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/HubSpot/hubspot-php/zipball/2d37f7edce728851f78e1012d448abd3f42201dc\",\n \"reference\": \"2d37f7edce728851f78e1012d448abd3f42201dc\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"ext-json\": \"*\",\n \"guzzlehttp/guzzle\": \"^7.3\",\n \"php\": \">=7.3\",\n \"psr/http-message\": \"^1.1 || ^2.0\"\n },\n \"require-dev\": {\n \"friendsofphp/php-cs-fixer\": \"^3.4\",\n \"phpspec/phpspec\": \"^7.1\",\n \"phpunit/phpunit\": \"^9.5\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"files\": [\n \"src/helpers.php\"\n ],\n \"psr-4\": {\n \"SevenShores\\\\Hubspot\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"Apache-2.0\"\n ],\n \"authors\": [\n {\n \"name\": \"Ryan Winchester\",\n \"email\": \"fungku@gmail.com\",\n \"homepage\": \"http://ryanwinchester.ca\"\n }\n ],\n \"description\": \"HubSpot PHP API client\",\n \"keywords\": [\n \"api\",\n \"hubspot\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/HubSpot/hubspot-php/issues\",\n \"source\": \"https://github.com/HubSpot/hubspot-php/tree/v5.5.0\"\n },\n \"time\": \"2025-06-26T14:43:12+00:00\"\n },\n {\n \"name\": \"intercom/intercom-php\",\n \"version\": \"v4.5.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/intercom/intercom-php.git\",\n \"reference\": \"2a7024440427caf5f0d563d46eb01b1a86b4e0c6\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/intercom/intercom-php/zipball/2a7024440427caf5f0d563d46eb01b1a86b4e0c6\",\n \"reference\": \"2a7024440427caf5f0d563d46eb01b1a86b4e0c6\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"ext-json\": \"*\",\n \"php\": \">= 7.1\",\n \"php-http/client-common\": \"^1.9 || ^2.0\",\n \"php-http/client-implementation\": \"^1.0\",\n \"php-http/discovery\": \"^1.4\",\n \"php-http/httplug\": \"^1.0 || ^2.0\",\n \"php-http/message\": \"^1.7\",\n \"psr/http-message\": \"^1.0 || ^2.0\"\n },\n \"require-dev\": {\n \"nyholm/psr7\": \"^1.6.1\",\n \"php-http/mock-client\": \"^1.4\",\n \"phpunit/phpunit\": \"^7.5 || ^8.5 || ^9.3\",\n \"squizlabs/php_codesniffer\": \"^3.1\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Intercom\\\\\": [\n \"src\"\n ]\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"Apache-2.0\"\n ],\n \"authors\": [\n {\n \"name\": \"Intercom Platform Team\",\n \"homepage\": \"https://www.intercom.com\"\n }\n ],\n \"description\": \"Intercom API client built on top of HTTPlug\",\n \"keywords\": [\n \"Guzzle\",\n \"api\",\n \"intercom\",\n \"intercom.io\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/intercom/intercom-php/issues\",\n \"source\": \"https://github.com/intercom/intercom-php\"\n },\n \"time\": \"2025-02-25T14:22:32+00:00\"\n },\n {\n \"name\": \"intervention/gif\",\n \"version\": \"4.2.2\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/Intervention/gif.git\",\n \"reference\": \"5999eac6a39aa760fb803bc809e8909ee67b451a\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/Intervention/gif/zipball/5999eac6a39aa760fb803bc809e8909ee67b451a\",\n \"reference\": \"5999eac6a39aa760fb803bc809e8909ee67b451a\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \"^8.1\"\n },\n \"require-dev\": {\n \"phpstan/phpstan\": \"^2.1\",\n \"phpunit/phpunit\": \"^10.0 || ^11.0 || ^12.0\",\n \"slevomat/coding-standard\": \"~8.0\",\n \"squizlabs/php_codesniffer\": \"^3.8\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Intervention\\\\Gif\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Oliver Vogel\",\n \"email\": \"oliver@intervention.io\",\n \"homepage\": \"https://intervention.io/\"\n }\n ],\n \"description\": \"Native PHP GIF Encoder/Decoder\",\n \"homepage\": \"https://github.com/intervention/gif\",\n \"keywords\": [\n \"animation\",\n \"gd\",\n \"gif\",\n \"image\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/Intervention/gif/issues\",\n \"source\": \"https://github.com/Intervention/gif/tree/4.2.2\"\n },\n \"funding\": [\n {\n \"url\": \"https://paypal.me/interventionio\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/Intervention\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://ko-fi.com/interventionphp\",\n \"type\": \"ko_fi\"\n }\n ],\n \"time\": \"2025-03-29T07:46:21+00:00\"\n },\n {\n \"name\": \"intervention/image\",\n \"version\": \"3.11.4\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/Intervention/image.git\",\n \"reference\": \"8c49eb21a6d2572532d1bc425964264f3e496846\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/Intervention/image/zipball/8c49eb21a6d2572532d1bc425964264f3e496846\",\n \"reference\": \"8c49eb21a6d2572532d1bc425964264f3e496846\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"ext-mbstring\": \"*\",\n \"intervention/gif\": \"^4.2\",\n \"php\": \"^8.1\"\n },\n \"require-dev\": {\n \"mockery/mockery\": \"^1.6\",\n \"phpstan/phpstan\": \"^2.1\",\n \"phpunit/phpunit\": \"^10.0 || ^11.0 || ^12.0\",\n \"slevomat/coding-standard\": \"~8.0\",\n \"squizlabs/php_codesniffer\": \"^3.8\"\n },\n \"suggest\": {\n \"ext-exif\": \"Recommended to be able to read EXIF data properly.\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Intervention\\\\Image\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Oliver Vogel\",\n \"email\": \"oliver@intervention.io\",\n \"homepage\": \"https://intervention.io/\"\n }\n ],\n \"description\": \"PHP image manipulation\",\n \"homepage\": \"https://image.intervention.io/\",\n \"keywords\": [\n \"gd\",\n \"image\",\n \"imagick\",\n \"resize\",\n \"thumbnail\",\n \"watermark\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/Intervention/image/issues\",\n \"source\": \"https://github.com/Intervention/image/tree/3.11.4\"\n },\n \"funding\": [\n {\n \"url\": \"https://paypal.me/interventionio\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/Intervention\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://ko-fi.com/interventionphp\",\n \"type\": \"ko_fi\"\n }\n ],\n \"time\": \"2025-07-30T13:13:19+00:00\"\n },\n {\n \"name\": \"jakeasmith/http_build_url\",\n \"version\": \"1.0.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/jakeasmith/http_build_url.git\",\n \"reference\": \"93c273e77cb1edead0cf8bcf8cd2003428e74e37\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/jakeasmith/http_build_url/zipball/93c273e77cb1edead0cf8bcf8cd2003428e74e37\",\n \"reference\": \"93c273e77cb1edead0cf8bcf8cd2003428e74e37\",\n \"shasum\": \"\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"files\": [\n \"src/http_build_url.php\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Jake A. Smith\",\n \"email\": \"theman@jakeasmith.com\"\n }\n ],\n \"description\": \"Provides functionality for http_build_url() to environments without pecl_http.\",\n \"support\": {\n \"issues\": \"https://github.com/jakeasmith/http_build_url/issues\",\n \"source\": \"https://github.com/jakeasmith/http_build_url\"\n },\n \"time\": \"2017-05-01T15:36:40+00:00\"\n },\n {\n \"name\": \"jane-php/json-schema-runtime\",\n \"version\": \"v7.9.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/janephp/json-schema-runtime.git\",\n \"reference\": \"ddb82546a1fa29456fb9acaa3c1a299beb0b40b1\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/janephp/json-schema-runtime/zipball/ddb82546a1fa29456fb9acaa3c1a299beb0b40b1\",\n \"reference\": \"ddb82546a1fa29456fb9acaa3c1a299beb0b40b1\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"ext-json\": \"*\",\n \"league/uri\": \"^6.7.2 || ^7.4\",\n \"php\": \"^8.0\",\n \"php-jsonpointer/php-jsonpointer\": \"^3.0 || ^4.0\",\n \"symfony/serializer\": \"^5.4 || ^6.4 || ^7.0\",\n \"symfony/yaml\": \"^5.4 || ^6.4 || ^7.0\"\n },\n \"conflict\": {\n \"symfony/framework-bundle\": \"5.1.0\"\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \"^8.5\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-next\": \"7-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Jane\\\\Component\\\\JsonSchemaRuntime\\\\\": \"\"\n },\n \"exclude-from-classmap\": [\n \"/Tests/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Joel Wurtz\",\n \"email\": \"jwurtz@jolicode.com\"\n },\n {\n \"name\": \"Baptiste Leduc\",\n \"email\": \"baptiste.leduc@gmail.com\"\n }\n ],\n \"description\": \"Jane runtime Library\",\n \"support\": {\n \"source\": \"https://github.com/janephp/json-schema-runtime/tree/v7.9.0\"\n },\n \"time\": \"2025-04-04T09:35:19+00:00\"\n },\n {\n \"name\": \"jane-php/open-api-runtime\",\n \"version\": \"v7.9.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/janephp/open-api-runtime.git\",\n \"reference\": \"bf05ecae7096ccb3bd115fadb9b612e26c702d56\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/janephp/open-api-runtime/zipball/bf05ecae7096ccb3bd115fadb9b612e26c702d56\",\n \"reference\": \"bf05ecae7096ccb3bd115fadb9b612e26c702d56\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"jane-php/json-schema-runtime\": \"^7.0\",\n \"nyholm/psr7\": \"^1.8\",\n \"php\": \"^8.0\",\n \"php-http/client-common\": \"^2.0\",\n \"php-http/discovery\": \"^1.6\",\n \"php-http/multipart-stream-builder\": \"^1.0\",\n \"psr/http-client\": \"^1.0\",\n \"psr/http-factory\": \"^1.0\",\n \"symfony/options-resolver\": \"^5.4 || ^6.4 || ^7.0\"\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \"^8.5\",\n \"symfony/serializer\": \"^5.4 || ^6.4 || ^7.0\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-next\": \"7-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Jane\\\\Component\\\\OpenApiRuntime\\\\\": \"\"\n },\n \"exclude-from-classmap\": [\n \"/Tests/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Joel Wurtz\",\n \"email\": \"jwurtz@jolicode.com\"\n },\n {\n \"name\": \"Baptiste Leduc\",\n \"email\": \"baptiste.leduc@gmail.com\"\n }\n ],\n \"description\": \"Jane OpenAPI Runtime Library, dependencies and utility class for a library generated by jane/openapi\",\n \"support\": {\n \"source\": \"https://github.com/janephp/open-api-runtime/tree/v7.9.0\"\n },\n \"time\": \"2025-04-17T14:07:07+00:00\"\n },\n {\n \"name\": \"jdavidbakr/cloudfront-proxies\",\n \"version\": \"1.7\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/jdavidbakr/CloudfrontProxies.git\",\n \"reference\": \"eb679f97f90d91afb16d201526cf6f5f48bea5f5\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/jdavidbakr/CloudfrontProxies/zipball/eb679f97f90d91afb16d201526cf6f5f48bea5f5\",\n \"reference\": \"eb679f97f90d91afb16d201526cf6f5f48bea5f5\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"guzzlehttp/guzzle\": \"^6.3|^7.0\",\n \"illuminate/support\": \"5.6.*|5.7.*|5.8.*|6.*|7.*|8.*|^9.0|^10.0|^11.0|^12.0\"\n },\n \"require-dev\": {\n \"mockery/mockery\": \"~1.0\",\n \"orchestra/testbench\": \"~3.0|~4.0|~5.0|~6.0|^7.0|^8.0|^9.0|^10.0\",\n \"phpunit/phpunit\": \"~7.0|~8.0|^9.0|^10.5|^11.5.3\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"laravel\": {\n \"providers\": [\n \"jdavidbakr\\\\CloudfrontProxies\\\\CloudfrontProxiesServiceProvider\"\n ]\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"jdavidbakr\\\\CloudfrontProxies\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"J David Baker\",\n \"email\": \"me@jdavidbaker.com\",\n \"homepage\": \"http://www.jdavidbaker.com\",\n \"role\": \"Developer\"\n }\n ],\n \"description\": \"Sets proxy settings for Cloudfront in a Laravel project\",\n \"keywords\": [\n \"cloudfront\",\n \"laravel\",\n \"trusted proxies\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/jdavidbakr/CloudfrontProxies/issues\",\n \"source\": \"https://github.com/jdavidbakr/CloudfrontProxies/tree/1.7\"\n },\n \"time\": \"2025-02-17T02:37:08+00:00\"\n },\n {\n \"name\": \"jean85/pretty-package-versions\",\n \"version\": \"2.1.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/Jean85/pretty-package-versions.git\",\n \"reference\": \"4d7aa5dab42e2a76d99559706022885de0e18e1a\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/Jean85/pretty-package-versions/zipball/4d7aa5dab42e2a76d99559706022885de0e18e1a\",\n \"reference\": \"4d7aa5dab42e2a76d99559706022885de0e18e1a\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"composer-runtime-api\": \"^2.1.0\",\n \"php\": \"^7.4|^8.0\"\n },\n \"require-dev\": {\n \"friendsofphp/php-cs-fixer\": \"^3.2\",\n \"jean85/composer-provided-replaced-stub-package\": \"^1.0\",\n \"phpstan/phpstan\": \"^2.0\",\n \"phpunit/phpunit\": \"^7.5|^8.5|^9.6\",\n \"rector/rector\": \"^2.0\",\n \"vimeo/psalm\": \"^4.3 || ^5.0\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"1.x-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Jean85\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Alessandro Lai\",\n \"email\": \"alessandro.lai85@gmail.com\"\n }\n ],\n \"description\": \"A library to get pretty versions strings of installed dependencies\",\n \"keywords\": [\n \"composer\",\n \"package\",\n \"release\",\n \"versions\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/Jean85/pretty-package-versions/issues\",\n \"source\": \"https://github.com/Jean85/pretty-package-versions/tree/2.1.1\"\n },\n \"time\": \"2025-03-19T14:43:43+00:00\"\n },\n {\n \"name\": \"jeremykendall/php-domain-parser\",\n \"version\": \"6.4.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/jeremykendall/php-domain-parser.git\",\n \"reference\": \"98401b32371fc1a75d93d4653d311b38e71f0d82\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/jeremykendall/php-domain-parser/zipball/98401b32371fc1a75d93d4653d311b38e71f0d82\",\n \"reference\": \"98401b32371fc1a75d93d4653d311b38e71f0d82\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"ext-filter\": \"*\",\n \"php\": \"^8.1\"\n },\n \"require-dev\": {\n \"friendsofphp/php-cs-fixer\": \"^3.65.0\",\n \"guzzlehttp/guzzle\": \"^7.9.2\",\n \"guzzlehttp/psr7\": \"^1.6 || ^2.7.0\",\n \"phpstan/phpstan\": \"^1.12.13\",\n \"phpstan/phpstan-phpunit\": \"^1.4.2\",\n \"phpstan/phpstan-strict-rules\": \"^1.6.1\",\n \"phpunit/phpunit\": \"^10.5.15 || ^11.5.1\",\n \"psr/http-factory\": \"^1.1.0\",\n \"psr/simple-cache\": \"^1.0.1 || ^2.0.0\",\n \"symfony/cache\": \"^v5.0.0 || ^6.4.16\",\n \"symfony/var-dumper\": \"^v6.4.18 || ^7.2\"\n },\n \"suggest\": {\n \"league/uri\": \"To parse and extract the host from an URL using a RFC3986/RFC3987 URI parser\",\n \"psr/http-client-implementation\": \"To use the storage functionality which depends on PSR-18\",\n \"psr/http-factory-implementation\": \"To use the storage functionality which depends on PSR-17\",\n \"psr/simple-cache-implementation\": \"To use the storage functionality which depends on PSR-16\",\n \"rowbot/url\": \"To parse and extract the host from an URL using a WHATWG URL parser\",\n \"symfony/polyfill-intl-idn\": \"to handle IDN host via the Symfony polyfill if ext-intl is not present\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"6.x-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Pdp\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Jeremy Kendall\",\n \"homepage\": \"https://about.me/jeremykendall\",\n \"role\": \"Developer\"\n },\n {\n \"name\": \"Ignace Nyamagana Butera\",\n \"homepage\": \"https://nyamsprod.com\",\n \"role\": \"Developer\"\n },\n {\n \"name\": \"Contributors\",\n \"homepage\": \"https://github.com/jeremykendall/php-domain-parser/graphs/contributors\"\n }\n ],\n \"description\": \"Public Suffix List and IANA Root Zone Database based Domain parsing implemented in PHP.\",\n \"homepage\": \"https://github.com/jeremykendall/php-domain-parser\",\n \"keywords\": [\n \"PSL\",\n \"Public Suffix List\",\n \"Top Level Domains\",\n \"domain parsing\",\n \"iana\",\n \"icann\",\n \"idn\",\n \"tld\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/jeremykendall/php-domain-parser/issues\",\n \"source\": \"https://github.com/jeremykendall/php-domain-parser\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/sponsors/nyamsprod\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2025-04-26T11:19:48+00:00\"\n },\n {\n \"name\": \"jiminny/oauth2-aircall\",\n \"version\": \"dev-master\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/jiminny/oauth2-aircall.git\",\n \"reference\": \"36870d8edc5882e1990af8836c6a72c65b48ec97\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/jiminny/oauth2-aircall/zipball/36870d8edc5882e1990af8836c6a72c65b48ec97\",\n \"reference\": \"36870d8edc5882e1990af8836c6a72c65b48ec97\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"guzzlehttp/guzzle\": \"^7.8\",\n \"league/oauth2-client\": \"^2.7\"\n },\n \"default-branch\": true,\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"1.0.x-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Jiminny\\\\OAuth2\\\\Client\\\\\": \"src/\"\n }\n },\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"James Graham\",\n \"email\": \"james.graham@jiminny.com\",\n \"homepage\": \"https://github.com/jamesgraham\"\n }\n ],\n \"description\": \"Aircall OAuth 2.0 Client Provider for The PHP League OAuth2-Client\",\n \"keywords\": [\n \"aircall\",\n \"authorisation\",\n \"authorization\",\n \"client\",\n \"oauth\",\n \"oauth2\"\n ],\n \"support\": {\n \"source\": \"https://github.com/jiminny/oauth2-aircall/tree/master\",\n \"issues\": \"https://github.com/jiminny/oauth2-aircall/issues\"\n },\n \"time\": \"2024-03-01T10:50:42+00:00\"\n },\n {\n \"name\": \"jiminny/oauth2-bullhorn\",\n \"version\": \"0.2.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/jiminny/oauth2-bullhorn.git\",\n \"reference\": \"3ff72e57684a7ef60616165fec5edeae6bdf8f6e\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/jiminny/oauth2-bullhorn/zipball/3ff72e57684a7ef60616165fec5edeae6bdf8f6e\",\n \"reference\": \"3ff72e57684a7ef60616165fec5edeae6bdf8f6e\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"league/oauth2-client\": \"^2.0\",\n \"php\": \"^7.2 || ^8.0\"\n },\n \"require-dev\": {\n \"friendsofphp/php-cs-fixer\": \"^2.18\",\n \"phpunit/phpunit\": \"^9.5\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Jiminny\\\\OAuth2\\\\Client\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Alexander Marinov\",\n \"email\": \"alex.g.marinov@gmail.com\"\n }\n ],\n \"description\": \"Bullhorn OAuth 2.0 Client Provider for The PHP League OAuth2-Client\",\n \"keywords\": [\n \"Authentication\",\n \"authorization\",\n \"bullhorn\",\n \"client\",\n \"oauth\",\n \"oauth2\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/jiminny/oauth2-bullhorn/issues\",\n \"source\": \"https://github.com/jiminny/oauth2-bullhorn/tree/0.2.0\"\n },\n \"time\": \"2021-08-27T12:35:31+00:00\"\n },\n {\n \"name\": \"jiminny/oauth2-dialpad\",\n \"version\": \"dev-master\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/jiminny/oauth2-dialpad.git\",\n \"reference\": \"10ca76bdee7875faf55017e7f17ab12c5934a33a\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/jiminny/oauth2-dialpad/zipball/10ca76bdee7875faf55017e7f17ab12c5934a33a\",\n \"reference\": \"10ca76bdee7875faf55017e7f17ab12c5934a33a\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"guzzlehttp/guzzle\": \"^7.8\",\n \"league/oauth2-client\": \"^2.7\"\n },\n \"require-dev\": {\n \"mockery/mockery\": \"~0.9\",\n \"phpunit/phpunit\": \"~4.0\",\n \"squizlabs/php_codesniffer\": \"~2.0\"\n },\n \"default-branch\": true,\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"1.0.x-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Jiminny\\\\OAuth2\\\\Client\\\\\": \"src/\"\n }\n },\n \"autoload-dev\": {\n \"psr-4\": {\n \"Jiminny\\\\OAuth2\\\\Client\\\\Test\\\\\": \"tests/src/\"\n }\n },\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"James Graham\",\n \"email\": \"james.graham@jiminny.com\",\n \"homepage\": \"https://github.com/jamesgraham\"\n }\n ],\n \"description\": \"Dialpad OAuth 2.0 Client Provider for The PHP League OAuth2-Client\",\n \"keywords\": [\n \"authorisation\",\n \"authorization\",\n \"client\",\n \"dialpad\",\n \"oauth\",\n \"oauth2\"\n ],\n \"support\": {\n \"source\": \"https://github.com/jiminny/oauth2-dialpad/tree/master\",\n \"issues\": \"https://github.com/jiminny/oauth2-dialpad/issues\"\n },\n \"time\": \"2023-10-11T11:13:28+00:00\"\n },\n {\n \"name\": \"jiminny/oauth2-salesloft\",\n \"version\": \"dev-master\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/jiminny/oauth2-salesloft.git\",\n \"reference\": \"53dfbcdf768920cfba018b2e0c7a47fb90289720\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/jiminny/oauth2-salesloft/zipball/53dfbcdf768920cfba018b2e0c7a47fb90289720\",\n \"reference\": \"53dfbcdf768920cfba018b2e0c7a47fb90289720\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"league/oauth2-client\": \"^2.7\"\n },\n \"require-dev\": {\n \"mockery/mockery\": \"~0.9\",\n \"phpunit/phpunit\": \"~4.0\",\n \"squizlabs/php_codesniffer\": \"~2.0\"\n },\n \"default-branch\": true,\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"1.0.x-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Jiminny\\\\OAuth2\\\\Client\\\\\": \"src/\"\n }\n },\n \"autoload-dev\": {\n \"psr-4\": {\n \"Jiminny\\\\OAuth2\\\\Client\\\\Test\\\\\": \"tests/src/\"\n }\n },\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"James Graham\",\n \"email\": \"james.graham@jiminny.com\",\n \"homepage\": \"https://github.com/jamesgraham\"\n }\n ],\n \"description\": \"Salesloft OAuth 2.0 Client Provider for The PHP League OAuth2-Client\",\n \"keywords\": [\n \"authorisation\",\n \"authorization\",\n \"client\",\n \"oauth\",\n \"oauth2\",\n \"salesloft\"\n ],\n \"support\": {\n \"source\": \"https://github.com/jiminny/oauth2-salesloft/tree/master\",\n \"issues\": \"https://github.com/jiminny/oauth2-salesloft/issues\"\n },\n \"time\": \"2023-10-11T11:14:12+00:00\"\n },\n {\n \"name\": \"jolicode/slack-php-api\",\n \"version\": \"v4.8.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/jolicode/slack-php-api.git\",\n \"reference\": \"59e617a0176f5d9579dc0ee935c8aeaa0e74c31c\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/jolicode/slack-php-api/zipball/59e617a0176f5d9579dc0ee935c8aeaa0e74c31c\",\n \"reference\": \"59e617a0176f5d9579dc0ee935c8aeaa0e74c31c\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"ext-curl\": \"*\",\n \"jane-php/open-api-runtime\": \"^7.7\",\n \"php\": \">=8.0\",\n \"php-http/client-common\": \"^1.9 || ^2.0\",\n \"php-http/discovery\": \"^1.11\",\n \"php-http/multipart-stream-builder\": \"^1.1\",\n \"psr/http-client-implementation\": \"*\"\n },\n \"conflict\": {\n \"php-http/httplug\": \"< 2.0\"\n },\n \"require-dev\": {\n \"friendsofphp/php-cs-fixer\": \"^3.2.2\",\n \"jane-php/open-api-2\": \"~v7.6.0\",\n \"nyholm/psr7\": \"^1.2\",\n \"opis/json-schema\": \"^1.0\",\n \"symfony/console\": \"^6.0 || ^7.0\",\n \"symfony/http-client\": \"^6.0 || ^7.0\",\n \"symfony/phpunit-bridge\": \"^6.0 || ^7.0\",\n \"symfony/process\": \"^6.0 || ^7.0\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"JoliCode\\\\Slack\\\\\": \"src/\",\n \"JoliCode\\\\Slack\\\\Api\\\\\": \"generated/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Loïck Piera\",\n \"email\": \"pyrech@gmail.com\"\n },\n {\n \"name\": \"JoliCode\",\n \"email\": \"coucou@jolicode.com\"\n }\n ],\n \"description\": \"An up to date PHP client for Slack's API\",\n \"keywords\": [\n \"api\",\n \"client\",\n \"openapi\",\n \"sdk\",\n \"slack\",\n \"slackapi\",\n \"swagger\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/jolicode/slack-php-api/issues\",\n \"source\": \"https://github.com/jolicode/slack-php-api/tree/v4.8.0\"\n },\n \"time\": \"2025-04-01T15:55:35+00:00\"\n },\n {\n \"name\": \"kalnoy/nestedset\",\n \"version\": \"v6.0.6\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/lazychaser/laravel-nestedset.git\",\n \"reference\": \"3cfc56a9759fb592bc903056166bfc0867f9e679\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/lazychaser/laravel-nestedset/zipball/3cfc56a9759fb592bc903056166bfc0867f9e679\",\n \"reference\": \"3cfc56a9759fb592bc903056166bfc0867f9e679\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"illuminate/database\": \"^7.0|^8.0|^9.0|^10.0|^11.0|^12.0\",\n \"illuminate/events\": \"^7.0|^8.0|^9.0|^10.0|^11.0|^12.0\",\n \"illuminate/support\": \"^7.0|^8.0|^9.0|^10.0|^11.0|^12.0\",\n \"php\": \"^8.0\"\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \"7.*|8.*|9.*|^10.5\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"laravel\": {\n \"providers\": [\n \"Kalnoy\\\\Nestedset\\\\NestedSetServiceProvider\"\n ]\n },\n \"branch-alias\": {\n \"dev-master\": \"v5.0.x-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Kalnoy\\\\Nestedset\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Alexander Kalnoy\",\n \"email\": \"lazychaser@gmail.com\"\n }\n ],\n \"description\": \"Nested Set Model for Laravel 5.7 and up\",\n \"keywords\": [\n \"database\",\n \"hierarchy\",\n \"laravel\",\n \"nested sets\",\n \"nsm\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/lazychaser/laravel-nestedset/issues\",\n \"source\": \"https://github.com/lazychaser/laravel-nestedset/tree/v6.0.6\"\n },\n \"time\": \"2025-04-22T19:38:02+00:00\"\n },\n {\n \"name\": \"kkszymanowski/traitor\",\n \"version\": \"1.1.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/KKSzymanowski/Traitor.git\",\n \"reference\": \"97d12e2b045fcc4e132fed5ddee3b1dcff409989\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/KKSzymanowski/Traitor/zipball/97d12e2b045fcc4e132fed5ddee3b1dcff409989\",\n \"reference\": \"97d12e2b045fcc4e132fed5ddee3b1dcff409989\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"nikic/php-parser\": \"^1.0|^2.0|^3.0|^4.0|^5.0\",\n \"php\": \">=5.4\"\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \"8.*\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Traitor\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Kuba Szymanowski\",\n \"email\": \"kuba.szymanowski@inf24.pl\"\n }\n ],\n \"description\": \"Add a trait use statement to existing PHP class\",\n \"keywords\": [\n \"add\",\n \"php\",\n \"trait\"\n ],\n \"support\": {\n \"email\": \"kuba.szymanowski@inf24.pl\",\n \"issues\": \"https://github.com/kkszymanowski/traitor/issues\",\n \"source\": \"https://github.com/kkszymanowski/traitor\"\n },\n \"time\": \"2024-01-29T09:23:11+00:00\"\n },\n {\n \"name\": \"laravel/framework\",\n \"version\": \"v12.54.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/laravel/framework.git\",\n \"reference\": \"325497463e7599cd14224c422c6e5dd2fe832868\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/laravel/framework/zipball/325497463e7599cd14224c422c6e5dd2fe832868\",\n \"reference\": \"325497463e7599cd14224c422c6e5dd2fe832868\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"brick/math\": \"^0.11|^0.12|^0.13|^0.14\",\n \"composer-runtime-api\": \"^2.2\",\n \"doctrine/inflector\": \"^2.0.5\",\n \"dragonmantank/cron-expression\": \"^3.4\",\n \"egulias/email-validator\": \"^3.2.1|^4.0\",\n \"ext-ctype\": \"*\",\n \"ext-filter\": \"*\",\n \"ext-hash\": \"*\",\n \"ext-mbstring\": \"*\",\n \"ext-openssl\": \"*\",\n \"ext-session\": \"*\",\n \"ext-tokenizer\": \"*\",\n \"fruitcake/php-cors\": \"^1.3\",\n \"guzzlehttp/guzzle\": \"^7.8.2\",\n \"guzzlehttp/uri-template\": \"^1.0\",\n \"laravel/prompts\": \"^0.3.0\",\n \"laravel/serializable-closure\": \"^1.3|^2.0\",\n \"league/commonmark\": \"^2.8.1\",\n \"league/flysystem\": \"^3.25.1\",\n \"league/flysystem-local\": \"^3.25.1\",\n \"league/uri\": \"^7.5.1\",\n \"monolog/monolog\": \"^3.0\",\n \"nesbot/carbon\": \"^3.8.4\",\n \"nunomaduro/termwind\": \"^2.0\",\n \"php\": \"^8.2\",\n \"psr/container\": \"^1.1.1|^2.0.1\",\n \"psr/log\": \"^1.0|^2.0|^3.0\",\n \"psr/simple-cache\": \"^1.0|^2.0|^3.0\",\n \"ramsey/uuid\": \"^4.7\",\n \"symfony/console\": \"^7.2.0\",\n \"symfony/error-handler\": \"^7.2.0\",\n \"symfony/finder\": \"^7.2.0\",\n \"symfony/http-foundation\": \"^7.2.0\",\n \"symfony/http-kernel\": \"^7.2.0\",\n \"symfony/mailer\": \"^7.2.0\",\n \"symfony/mime\": \"^7.2.0\",\n \"symfony/polyfill-php83\": \"^1.33\",\n \"symfony/polyfill-php84\": \"^1.33\",\n \"symfony/polyfill-php85\": \"^1.33\",\n \"symfony/process\": \"^7.2.0\",\n \"symfony/routing\": \"^7.2.0\",\n \"symfony/uid\": \"^7.2.0\",\n \"symfony/var-dumper\": \"^7.2.0\",\n \"tijsverkoyen/css-to-inline-styles\": \"^2.2.5\",\n \"vlucas/phpdotenv\": \"^5.6.1\",\n \"voku/portable-ascii\": \"^2.0.2\"\n },\n \"conflict\": {\n \"tightenco/collect\": \"<5.5.33\"\n },\n \"provide\": {\n \"psr/container-implementation\": \"1.1|2.0\",\n \"psr/log-implementation\": \"1.0|2.0|3.0\",\n \"psr/simple-cache-implementation\": \"1.0|2.0|3.0\"\n },\n \"replace\": {\n \"illuminate/auth\": \"self.version\",\n \"illuminate/broadcasting\": \"self.version\",\n \"illuminate/bus\": \"self.version\",\n \"illuminate/cache\": \"self.version\",\n \"illuminate/collections\": \"self.version\",\n \"illuminate/concurrency\": \"self.version\",\n \"illuminate/conditionable\": \"self.version\",\n \"illuminate/config\": \"self.version\",\n \"illuminate/console\": \"self.version\",\n \"illuminate/container\": \"self.version\",\n \"illuminate/contracts\": \"self.version\",\n \"illuminate/cookie\": \"self.version\",\n \"illuminate/database\": \"self.version\",\n \"illuminate/encryption\": \"self.version\",\n \"illuminate/events\": \"self.version\",\n \"illuminate/filesystem\": \"self.version\",\n \"illuminate/hashing\": \"self.version\",\n \"illuminate/http\": \"self.version\",\n \"illuminate/json-schema\": \"self.version\",\n \"illuminate/log\": \"self.version\",\n \"illuminate/macroable\": \"self.version\",\n \"illuminate/mail\": \"self.version\",\n \"illuminate/notifications\": \"self.version\",\n \"illuminate/pagination\": \"self.version\",\n \"illuminate/pipeline\": \"self.version\",\n \"illuminate/process\": \"self.version\",\n \"illuminate/queue\": \"self.version\",\n \"illuminate/redis\": \"self.version\",\n \"illuminate/reflection\": \"self.version\",\n \"illuminate/routing\": \"self.version\",\n \"illuminate/session\": \"self.version\",\n \"illuminate/support\": \"self.version\",\n \"illuminate/testing\": \"self.version\",\n \"illuminate/translation\": \"self.version\",\n \"illuminate/validation\": \"self.version\",\n \"illuminate/view\": \"self.version\",\n \"spatie/once\": \"*\"\n },\n \"require-dev\": {\n \"ably/ably-php\": \"^1.0\",\n \"aws/aws-sdk-php\": \"^3.322.9\",\n \"ext-gmp\": \"*\",\n \"fakerphp/faker\": \"^1.24\",\n \"guzzlehttp/promises\": \"^2.0.3\",\n \"guzzlehttp/psr7\": \"^2.4\",\n \"laravel/pint\": \"^1.18\",\n \"league/flysystem-aws-s3-v3\": \"^3.25.1\",\n \"league/flysystem-ftp\": \"^3.25.1\",\n \"league/flysystem-path-prefixing\": \"^3.25.1\",\n \"league/flysystem-read-only\": \"^3.25.1\",\n \"league/flysystem-sftp-v3\": \"^3.25.1\",\n \"mockery/mockery\": \"^1.6.10\",\n \"opis/json-schema\": \"^2.4.1\",\n \"orchestra/testbench-core\": \"^10.9.0\",\n \"pda/pheanstalk\": \"^5.0.6|^7.0.0\",\n \"php-http/discovery\": \"^1.15\",\n \"phpstan/phpstan\": \"^2.0\",\n \"phpunit/phpunit\": \"^10.5.35|^11.5.3|^12.0.1\",\n \"predis/predis\": \"^2.3|^3.0\",\n \"resend/resend-php\": \"^0.10.0|^1.0\",\n \"symfony/cache\": \"^7.2.0\",\n \"symfony/http-client\": \"^7.2.0\",\n \"symfony/psr-http-message-bridge\": \"^7.2.0\",\n \"symfony/translation\": \"^7.2.0\"\n },\n \"suggest\": {\n \"ably/ably-php\": \"Required to use the Ably broadcast driver (^1.0).\",\n \"aws/aws-sdk-php\": \"Required to use the SQS queue driver, DynamoDb failed job storage, and SES mail driver (^3.322.9).\",\n \"brianium/paratest\": \"Required to run tests in parallel (^7.0|^8.0).\",\n \"ext-apcu\": \"Required to use the APC cache driver.\",\n \"ext-fileinfo\": \"Required to use the Filesystem class.\",\n \"ext-ftp\": \"Required to use the Flysystem FTP driver.\",\n \"ext-gd\": \"Required to use Illuminate\\\\Http\\\\Testing\\\\FileFactory::image().\",\n \"ext-memcached\": \"Required to use the memcache cache driver.\",\n \"ext-pcntl\": \"Required to use all features of the queue worker and console signal trapping.\",\n \"ext-pdo\": \"Required to use all database features.\",\n \"ext-posix\": \"Required to use all features of the queue worker.\",\n \"ext-redis\": \"Required to use the Redis cache and queue drivers (^4.0|^5.0|^6.0).\",\n \"fakerphp/faker\": \"Required to generate fake data using the fake() helper (^1.23).\",\n \"filp/whoops\": \"Required for friendly error pages in development (^2.14.3).\",\n \"laravel/tinker\": \"Required to use the tinker console command (^2.0).\",\n \"league/flysystem-aws-s3-v3\": \"Required to use the Flysystem S3 driver (^3.25.1).\",\n \"league/flysystem-ftp\": \"Required to use the Flysystem FTP driver (^3.25.1).\",\n \"league/flysystem-path-prefixing\": \"Required to use the scoped driver (^3.25.1).\",\n \"league/flysystem-read-only\": \"Required to use read-only disks (^3.25.1)\",\n \"league/flysystem-sftp-v3\": \"Required to use the Flysystem SFTP driver (^3.25.1).\",\n \"mockery/mockery\": \"Required to use mocking (^1.6).\",\n \"pda/pheanstalk\": \"Required to use the beanstalk queue driver (^5.0).\",\n \"php-http/discovery\": \"Required to use PSR-7 bridging features (^1.15).\",\n \"phpunit/phpunit\": \"Required to use assertions and run tests (^10.5.35|^11.5.3|^12.0.1).\",\n \"predis/predis\": \"Required to use the predis connector (^2.3|^3.0).\",\n \"psr/http-message\": \"Required to allow Storage::put to accept a StreamInterface (^1.0).\",\n \"pusher/pusher-php-server\": \"Required to use the Pusher broadcast driver (^6.0|^7.0).\",\n \"resend/resend-php\": \"Required to enable support for the Resend mail transport (^0.10.0|^1.0).\",\n \"symfony/cache\": \"Required to PSR-6 cache bridge (^7.2).\",\n \"symfony/filesystem\": \"Required to enable support for relative symbolic links (^7.2).\",\n \"symfony/http-client\": \"Required to enable support for the Symfony API mail transports (^7.2).\",\n \"symfony/mailgun-mailer\": \"Required to enable support for the Mailgun mail transport (^7.2).\",\n \"symfony/postmark-mailer\": \"Required to enable support for the Postmark mail transport (^7.2).\",\n \"symfony/psr-http-message-bridge\": \"Required to use PSR-7 bridging features (^7.2).\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"12.x-dev\"\n }\n },\n \"autoload\": {\n \"files\": [\n \"src/Illuminate/Collections/functions.php\",\n \"src/Illuminate/Collections/helpers.php\",\n \"src/Illuminate/Events/functions.php\",\n \"src/Illuminate/Filesystem/functions.php\",\n \"src/Illuminate/Foundation/helpers.php\",\n \"src/Illuminate/Log/functions.php\",\n \"src/Illuminate/Reflection/helpers.php\",\n \"src/Illuminate/Support/functions.php\",\n \"src/Illuminate/Support/helpers.php\"\n ],\n \"psr-4\": {\n \"Illuminate\\\\\": \"src/Illuminate/\",\n \"Illuminate\\\\Support\\\\\": [\n \"src/Illuminate/Macroable/\",\n \"src/Illuminate/Collections/\",\n \"src/Illuminate/Conditionable/\",\n \"src/Illuminate/Reflection/\"\n ]\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Taylor Otwell\",\n \"email\": \"taylor@laravel.com\"\n }\n ],\n \"description\": \"The Laravel Framework.\",\n \"homepage\": \"https://laravel.com\",\n \"keywords\": [\n \"framework\",\n \"laravel\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/laravel/framework/issues\",\n \"source\": \"https://github.com/laravel/framework\"\n },\n \"time\": \"2026-03-10T20:25:56+00:00\"\n },\n {\n \"name\": \"laravel/helpers\",\n \"version\": \"v1.8.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/laravel/helpers.git\",\n \"reference\": \"d0094b4bc4364560c8ee3a9e956596d760d4afab\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/laravel/helpers/zipball/d0094b4bc4364560c8ee3a9e956596d760d4afab\",\n \"reference\": \"d0094b4bc4364560c8ee3a9e956596d760d4afab\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"illuminate/support\": \"~5.8.0|^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0\",\n \"php\": \"^7.2.0|^8.0\"\n },\n \"require-dev\": {\n \"phpstan/phpstan\": \"^1.10\",\n \"phpunit/phpunit\": \"^7.0|^8.0|^9.0|^10.0\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"1.x-dev\"\n }\n },\n \"autoload\": {\n \"files\": [\n \"src/helpers.php\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Taylor Otwell\",\n \"email\": \"taylor@laravel.com\"\n },\n {\n \"name\": \"Dries Vints\",\n \"email\": \"dries@laravel.com\"\n }\n ],\n \"description\": \"Provides backwards compatibility for helpers in the latest Laravel release.\",\n \"keywords\": [\n \"helpers\",\n \"laravel\"\n ],\n \"support\": {\n \"source\": \"https://github.com/laravel/helpers/tree/v1.8.1\"\n },\n \"time\": \"2025-09-02T15:31:25+00:00\"\n },\n {\n \"name\": \"laravel/passport\",\n \"version\": \"v13.7.4\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/laravel/passport.git\",\n \"reference\": \"16c45794c6a6176792fdf555f986aa1b944d9081\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/laravel/passport/zipball/16c45794c6a6176792fdf555f986aa1b944d9081\",\n \"reference\": \"16c45794c6a6176792fdf555f986aa1b944d9081\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"ext-json\": \"*\",\n \"ext-openssl\": \"*\",\n \"firebase/php-jwt\": \"^6.4|^7.0\",\n \"illuminate/auth\": \"^11.35|^12.0|^13.0\",\n \"illuminate/console\": \"^11.35|^12.0|^13.0\",\n \"illuminate/container\": \"^11.35|^12.0|^13.0\",\n \"illuminate/contracts\": \"^11.35|^12.0|^13.0\",\n \"illuminate/cookie\": \"^11.35|^12.0|^13.0\",\n \"illuminate/database\": \"^11.35|^12.0|^13.0\",\n \"illuminate/encryption\": \"^11.35|^12.0|^13.0\",\n \"illuminate/http\": \"^11.35|^12.0|^13.0\",\n \"illuminate/support\": \"^11.35|^12.0|^13.0\",\n \"league/oauth2-server\": \"^9.2\",\n \"php\": \"^8.2\",\n \"php-http/discovery\": \"^1.20\",\n \"phpseclib/phpseclib\": \"^3.0\",\n \"psr/http-factory-implementation\": \"*\",\n \"symfony/console\": \"^7.1|^8.0\",\n \"symfony/psr-http-message-bridge\": \"^7.1|^8.0\"\n },\n \"require-dev\": {\n \"orchestra/testbench\": \"^9.15|^10.8|^11.0\",\n \"phpstan/phpstan\": \"^2.0\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"laravel\": {\n \"providers\": [\n \"Laravel\\\\Passport\\\\PassportServiceProvider\"\n ]\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Laravel\\\\Passport\\\\\": \"src/\",\n \"Laravel\\\\Passport\\\\Database\\\\Factories\\\\\": \"database/factories/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Taylor Otwell\",\n \"email\": \"taylor@laravel.com\"\n }\n ],\n \"description\": \"Laravel Passport provides OAuth2 server support to Laravel.\",\n \"keywords\": [\n \"laravel\",\n \"oauth\",\n \"passport\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/laravel/passport/issues\",\n \"source\": \"https://github.com/laravel/passport\"\n },\n \"time\": \"2026-04-09T13:39:45+00:00\"\n },\n {\n \"name\": \"laravel/prompts\",\n \"version\": \"v0.3.14\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/laravel/prompts.git\",\n \"reference\": \"9f0e371244eedfe2ebeaa72c79c54bb5df6e0176\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/laravel/prompts/zipball/9f0e371244eedfe2ebeaa72c79c54bb5df6e0176\",\n \"reference\": \"9f0e371244eedfe2ebeaa72c79c54bb5df6e0176\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"composer-runtime-api\": \"^2.2\",\n \"ext-mbstring\": \"*\",\n \"php\": \"^8.1\",\n \"symfony/console\": \"^6.2|^7.0|^8.0\"\n },\n \"conflict\": {\n \"illuminate/console\": \">=10.17.0 <10.25.0\",\n \"laravel/framework\": \">=10.17.0 <10.25.0\"\n },\n \"require-dev\": {\n \"illuminate/collections\": \"^10.0|^11.0|^12.0|^13.0\",\n \"mockery/mockery\": \"^1.5\",\n \"pestphp/pest\": \"^2.3|^3.4|^4.0\",\n \"phpstan/phpstan\": \"^1.12.28\",\n \"phpstan/phpstan-mockery\": \"^1.1.3\"\n },\n \"suggest\": {\n \"ext-pcntl\": \"Required for the spinner to be animated.\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-main\": \"0.3.x-dev\"\n }\n },\n \"autoload\": {\n \"files\": [\n \"src/helpers.php\"\n ],\n \"psr-4\": {\n \"Laravel\\\\Prompts\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"description\": \"Add beautiful and user-friendly forms to your command-line applications.\",\n \"support\": {\n \"issues\": \"https://github.com/laravel/prompts/issues\",\n \"source\": \"https://github.com/laravel/prompts/tree/v0.3.14\"\n },\n \"time\": \"2026-03-01T09:02:38+00:00\"\n },\n {\n \"name\": \"laravel/serializable-closure\",\n \"version\": \"v2.0.10\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/laravel/serializable-closure.git\",\n \"reference\": \"870fc81d2f879903dfc5b60bf8a0f94a1609e669\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/laravel/serializable-closure/zipball/870fc81d2f879903dfc5b60bf8a0f94a1609e669\",\n \"reference\": \"870fc81d2f879903dfc5b60bf8a0f94a1609e669\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \"^8.1\"\n },\n \"require-dev\": {\n \"illuminate/support\": \"^10.0|^11.0|^12.0|^13.0\",\n \"nesbot/carbon\": \"^2.67|^3.0\",\n \"pestphp/pest\": \"^2.36|^3.0|^4.0\",\n \"phpstan/phpstan\": \"^2.0\",\n \"symfony/var-dumper\": \"^6.2.0|^7.0.0|^8.0.0\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"2.x-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Laravel\\\\SerializableClosure\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Taylor Otwell\",\n \"email\": \"taylor@laravel.com\"\n },\n {\n \"name\": \"Nuno Maduro\",\n \"email\": \"nuno@laravel.com\"\n }\n ],\n \"description\": \"Laravel Serializable Closure provides an easy and secure way to serialize closures in PHP.\",\n \"keywords\": [\n \"closure\",\n \"laravel\",\n \"serializable\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/laravel/serializable-closure/issues\",\n \"source\": \"https://github.com/laravel/serializable-closure\"\n },\n \"time\": \"2026-02-20T19:59:49+00:00\"\n },\n {\n \"name\": \"laravel/slack-notification-channel\",\n \"version\": \"v3.6.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/laravel/slack-notification-channel.git\",\n \"reference\": \"642677a57490eebccb7e9fb666f5a5379c6e3459\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/laravel/slack-notification-channel/zipball/642677a57490eebccb7e9fb666f5a5379c6e3459\",\n \"reference\": \"642677a57490eebccb7e9fb666f5a5379c6e3459\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"guzzlehttp/guzzle\": \"^7.0\",\n \"illuminate/http\": \"^9.0|^10.0|^11.0|^12.0\",\n \"illuminate/notifications\": \"^9.0|^10.0|^11.0|^12.0\",\n \"illuminate/support\": \"^9.0|^10.0|^11.0|^12.0\",\n \"php\": \"^8.0\"\n },\n \"require-dev\": {\n \"mockery/mockery\": \"^1.0\",\n \"orchestra/testbench\": \"^7.0|^8.0|^9.0|^10.0\",\n \"phpstan/phpstan\": \"^1.10\",\n \"phpunit/phpunit\": \"^9.0|^10.4|^11.5\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"laravel\": {\n \"providers\": [\n \"Illuminate\\\\Notifications\\\\SlackChannelServiceProvider\"\n ]\n },\n \"branch-alias\": {\n \"dev-master\": \"3.x-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Illuminate\\\\Notifications\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Taylor Otwell\",\n \"email\": \"taylor@laravel.com\"\n }\n ],\n \"description\": \"Slack Notification Channel for laravel.\",\n \"keywords\": [\n \"laravel\",\n \"notifications\",\n \"slack\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/laravel/slack-notification-channel/issues\",\n \"source\": \"https://github.com/laravel/slack-notification-channel/tree/v3.6.0\"\n },\n \"time\": \"2025-06-26T16:51:38+00:00\"\n },\n {\n \"name\": \"laravel/tinker\",\n \"version\": \"v2.10.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/laravel/tinker.git\",\n \"reference\": \"22177cc71807d38f2810c6204d8f7183d88a57d3\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/laravel/tinker/zipball/22177cc71807d38f2810c6204d8f7183d88a57d3\",\n \"reference\": \"22177cc71807d38f2810c6204d8f7183d88a57d3\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"illuminate/console\": \"^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0\",\n \"illuminate/contracts\": \"^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0\",\n \"illuminate/support\": \"^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0\",\n \"php\": \"^7.2.5|^8.0\",\n \"psy/psysh\": \"^0.11.1|^0.12.0\",\n \"symfony/var-dumper\": \"^4.3.4|^5.0|^6.0|^7.0\"\n },\n \"require-dev\": {\n \"mockery/mockery\": \"~1.3.3|^1.4.2\",\n \"phpstan/phpstan\": \"^1.10\",\n \"phpunit/phpunit\": \"^8.5.8|^9.3.3|^10.0\"\n },\n \"suggest\": {\n \"illuminate/database\": \"The Illuminate Database package (^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0).\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"laravel\": {\n \"providers\": [\n \"Laravel\\\\Tinker\\\\TinkerServiceProvider\"\n ]\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Laravel\\\\Tinker\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Taylor Otwell\",\n \"email\": \"taylor@laravel.com\"\n }\n ],\n \"description\": \"Powerful REPL for the Laravel framework.\",\n \"keywords\": [\n \"REPL\",\n \"Tinker\",\n \"laravel\",\n \"psysh\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/laravel/tinker/issues\",\n \"source\": \"https://github.com/laravel/tinker/tree/v2.10.1\"\n },\n \"time\": \"2025-01-27T14:24:01+00:00\"\n },\n {\n \"name\": \"laravel/ui\",\n \"version\": \"v4.6.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/laravel/ui.git\",\n \"reference\": \"7d6ffa38d79f19c9b3e70a751a9af845e8f41d88\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/laravel/ui/zipball/7d6ffa38d79f19c9b3e70a751a9af845e8f41d88\",\n \"reference\": \"7d6ffa38d79f19c9b3e70a751a9af845e8f41d88\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"illuminate/console\": \"^9.21|^10.0|^11.0|^12.0\",\n \"illuminate/filesystem\": \"^9.21|^10.0|^11.0|^12.0\",\n \"illuminate/support\": \"^9.21|^10.0|^11.0|^12.0\",\n \"illuminate/validation\": \"^9.21|^10.0|^11.0|^12.0\",\n \"php\": \"^8.0\",\n \"symfony/console\": \"^6.0|^7.0\"\n },\n \"require-dev\": {\n \"orchestra/testbench\": \"^7.35|^8.15|^9.0|^10.0\",\n \"phpunit/phpunit\": \"^9.3|^10.4|^11.5\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"laravel\": {\n \"providers\": [\n \"Laravel\\\\Ui\\\\UiServiceProvider\"\n ]\n },\n \"branch-alias\": {\n \"dev-master\": \"4.x-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Laravel\\\\Ui\\\\\": \"src/\",\n \"Illuminate\\\\Foundation\\\\Auth\\\\\": \"auth-backend/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Taylor Otwell\",\n \"email\": \"taylor@laravel.com\"\n }\n ],\n \"description\": \"Laravel UI utilities and presets.\",\n \"keywords\": [\n \"laravel\",\n \"ui\"\n ],\n \"support\": {\n \"source\": \"https://github.com/laravel/ui/tree/v4.6.1\"\n },\n \"time\": \"2025-01-28T15:15:29+00:00\"\n },\n {\n \"name\": \"laravolt/avatar\",\n \"version\": \"6.3.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/laravolt/avatar.git\",\n \"reference\": \"dea77b6fbff08f38e744a9e23855369c8270f2aa\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/laravolt/avatar/zipball/dea77b6fbff08f38e744a9e23855369c8270f2aa\",\n \"reference\": \"dea77b6fbff08f38e744a9e23855369c8270f2aa\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"illuminate/cache\": \"^10.0|^11.0|^12.0\",\n \"illuminate/support\": \"^10.0|^11.0|^12.0\",\n \"intervention/image\": \"^3.4\",\n \"php\": \">=8.2\"\n },\n \"require-dev\": {\n \"mockery/mockery\": \"^1.6.7\",\n \"pestphp/pest\": \"^2.34|^3.7\",\n \"pestphp/pest-plugin-type-coverage\": \"^2.8|^3.3\",\n \"php-coveralls/php-coveralls\": \"^2.1\",\n \"phpunit/phpunit\": \"^11.5.3\",\n \"roave/security-advisories\": \"dev-latest\"\n },\n \"suggest\": {\n \"ext-gd\": \"Needed to support image manipulation\",\n \"ext-imagick\": \"Needed to support image manipulation, better than GD\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"laravel\": {\n \"aliases\": {\n \"Avatar\": \"Laravolt\\\\Avatar\\\\Facade\"\n },\n \"providers\": [\n \"Laravolt\\\\Avatar\\\\ServiceProvider\"\n ]\n },\n \"branch-alias\": {\n \"dev-master\": \"6.0-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Laravolt\\\\Avatar\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Bayu Hendra Winata\",\n \"email\": \"uyab.exe@gmail.com\",\n \"homepage\": \"https://laravolt.dev\",\n \"role\": \"Developer\"\n }\n ],\n \"description\": \"Turn name, email, and any other string into initial-based avatar or gravatar.\",\n \"homepage\": \"https://github.com/laravolt/avatar\",\n \"keywords\": [\n \"avatar\",\n \"gravatar\",\n \"laravel\",\n \"laravolt\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/laravolt/avatar/issues\",\n \"source\": \"https://github.com/laravolt/avatar/tree/6.3.1\"\n },\n \"funding\": [\n {\n \"url\": \"https://paypal.me/bayuhendra\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://ko-fi.com/bayuhendra\",\n \"type\": \"ko_fi\"\n },\n {\n \"url\": \"https://www.patreon.com/uyab\",\n \"type\": \"patreon\"\n }\n ],\n \"time\": \"2025-08-27T08:20:27+00:00\"\n },\n {\n \"name\": \"lcobucci/clock\",\n \"version\": \"3.5.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/lcobucci/clock.git\",\n \"reference\": \"a3139d9e97d47826f27e6a17bb63f13621f86058\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/lcobucci/clock/zipball/a3139d9e97d47826f27e6a17bb63f13621f86058\",\n \"reference\": \"a3139d9e97d47826f27e6a17bb63f13621f86058\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \"~8.3.0 || ~8.4.0 || ~8.5.0\",\n \"psr/clock\": \"^1.0\"\n },\n \"provide\": {\n \"psr/clock-implementation\": \"1.0\"\n },\n \"require-dev\": {\n \"infection/infection\": \"^0.31\",\n \"lcobucci/coding-standard\": \"^11.2.0\",\n \"phpstan/extension-installer\": \"^1.3.1\",\n \"phpstan/phpstan\": \"^2.0.0\",\n \"phpstan/phpstan-deprecation-rules\": \"^2.0.0\",\n \"phpstan/phpstan-phpunit\": \"^2.0.0\",\n \"phpstan/phpstan-strict-rules\": \"^2.0.0\",\n \"phpunit/phpunit\": \"^12.0.0\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Lcobucci\\\\Clock\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Luís Cobucci\",\n \"email\": \"lcobucci@gmail.com\"\n }\n ],\n \"description\": \"Yet another clock abstraction\",\n \"support\": {\n \"issues\": \"https://github.com/lcobucci/clock/issues\",\n \"source\": \"https://github.com/lcobucci/clock/tree/3.5.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/lcobucci\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://www.patreon.com/lcobucci\",\n \"type\": \"patreon\"\n }\n ],\n \"time\": \"2025-10-27T09:03:17+00:00\"\n },\n {\n \"name\": \"lcobucci/jwt\",\n \"version\": \"5.6.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/lcobucci/jwt.git\",\n \"reference\": \"bb3e9f21e4196e8afc41def81ef649c164bca25e\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/lcobucci/jwt/zipball/bb3e9f21e4196e8afc41def81ef649c164bca25e\",\n \"reference\": \"bb3e9f21e4196e8afc41def81ef649c164bca25e\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"ext-openssl\": \"*\",\n \"ext-sodium\": \"*\",\n \"php\": \"~8.2.0 || ~8.3.0 || ~8.4.0 || ~8.5.0\",\n \"psr/clock\": \"^1.0\"\n },\n \"require-dev\": {\n \"infection/infection\": \"^0.29\",\n \"lcobucci/clock\": \"^3.2\",\n \"lcobucci/coding-standard\": \"^11.0\",\n \"phpbench/phpbench\": \"^1.2\",\n \"phpstan/extension-installer\": \"^1.2\",\n \"phpstan/phpstan\": \"^1.10.7\",\n \"phpstan/phpstan-deprecation-rules\": \"^1.1.3\",\n \"phpstan/phpstan-phpunit\": \"^1.3.10\",\n \"phpstan/phpstan-strict-rules\": \"^1.5.0\",\n \"phpunit/phpunit\": \"^11.1\"\n },\n \"suggest\": {\n \"lcobucci/clock\": \">= 3.2\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Lcobucci\\\\JWT\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"BSD-3-Clause\"\n ],\n \"authors\": [\n {\n \"name\": \"Luís Cobucci\",\n \"email\": \"lcobucci@gmail.com\",\n \"role\": \"Developer\"\n }\n ],\n \"description\": \"A simple library to work with JSON Web Token and JSON Web Signature\",\n \"keywords\": [\n \"JWS\",\n \"jwt\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/lcobucci/jwt/issues\",\n \"source\": \"https://github.com/lcobucci/jwt/tree/5.6.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/lcobucci\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://www.patreon.com/lcobucci\",\n \"type\": \"patreon\"\n }\n ],\n \"time\": \"2025-10-17T11:30:53+00:00\"\n },\n {\n \"name\": \"league/commonmark\",\n \"version\": \"2.8.2\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/thephpleague/commonmark.git\",\n \"reference\": \"59fb075d2101740c337c7216e3f32b36c204218b\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/thephpleague/commonmark/zipball/59fb075d2101740c337c7216e3f32b36c204218b\",\n \"reference\": \"59fb075d2101740c337c7216e3f32b36c204218b\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"ext-mbstring\": \"*\",\n \"league/config\": \"^1.1.1\",\n \"php\": \"^7.4 || ^8.0\",\n \"psr/event-dispatcher\": \"^1.0\",\n \"symfony/deprecation-contracts\": \"^2.1 || ^3.0\",\n \"symfony/polyfill-php80\": \"^1.16\"\n },\n \"require-dev\": {\n \"cebe/markdown\": \"^1.0\",\n \"commonmark/cmark\": \"0.31.1\",\n \"commonmark/commonmark.js\": \"0.31.1\",\n \"composer/package-versions-deprecated\": \"^1.8\",\n \"embed/embed\": \"^4.4\",\n \"erusev/parsedown\": \"^1.0\",\n \"ext-json\": \"*\",\n \"github/gfm\": \"0.29.0\",\n \"michelf/php-markdown\": \"^1.4 || ^2.0\",\n \"nyholm/psr7\": \"^1.5\",\n \"phpstan/phpstan\": \"^1.8.2\",\n \"phpunit/phpunit\": \"^9.5.21 || ^10.5.9 || ^11.0.0\",\n \"scrutinizer/ocular\": \"^1.8.1\",\n \"symfony/finder\": \"^5.3 | ^6.0 | ^7.0 || ^8.0\",\n \"symfony/process\": \"^5.4 | ^6.0 | ^7.0 || ^8.0\",\n \"symfony/yaml\": \"^2.3 | ^3.0 | ^4.0 | ^5.0 | ^6.0 | ^7.0 || ^8.0\",\n \"unleashedtech/php-coding-standard\": \"^3.1.1\",\n \"vimeo/psalm\": \"^4.24.0 || ^5.0.0 || ^6.0.0\"\n },\n \"suggest\": {\n \"symfony/yaml\": \"v2.3+ required if using the Front Matter extension\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-main\": \"2.9-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"League\\\\CommonMark\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"BSD-3-Clause\"\n ],\n \"authors\": [\n {\n \"name\": \"Colin O'Dell\",\n \"email\": \"colinodell@gmail.com\",\n \"homepage\": \"https://www.colinodell.com\",\n \"role\": \"Lead Developer\"\n }\n ],\n \"description\": \"Highly-extensible PHP Markdown parser which fully supports the CommonMark spec and GitHub-Flavored Markdown (GFM)\",\n \"homepage\": \"https://commonmark.thephpleague.com\",\n \"keywords\": [\n \"commonmark\",\n \"flavored\",\n \"gfm\",\n \"github\",\n \"github-flavored\",\n \"markdown\",\n \"md\",\n \"parser\"\n ],\n \"support\": {\n \"docs\": \"https://commonmark.thephpleague.com/\",\n \"forum\": \"https://github.com/thephpleague/commonmark/discussions\",\n \"issues\": \"https://github.com/thephpleague/commonmark/issues\",\n \"rss\": \"https://github.com/thephpleague/commonmark/releases.atom\",\n \"source\": \"https://github.com/thephpleague/commonmark\"\n },\n \"funding\": [\n {\n \"url\": \"https://www.colinodell.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://www.paypal.me/colinpodell/10.00\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/colinodell\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/league/commonmark\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2026-03-19T13:16:38+00:00\"\n },\n {\n \"name\": \"league/config\",\n \"version\": \"v1.2.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/thephpleague/config.git\",\n \"reference\": \"754b3604fb2984c71f4af4a9cbe7b57f346ec1f3\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/thephpleague/config/zipball/754b3604fb2984c71f4af4a9cbe7b57f346ec1f3\",\n \"reference\": \"754b3604fb2984c71f4af4a9cbe7b57f346ec1f3\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"dflydev/dot-access-data\": \"^3.0.1\",\n \"nette/schema\": \"^1.2\",\n \"php\": \"^7.4 || ^8.0\"\n },\n \"require-dev\": {\n \"phpstan/phpstan\": \"^1.8.2\",\n \"phpunit/phpunit\": \"^9.5.5\",\n \"scrutinizer/ocular\": \"^1.8.1\",\n \"unleashedtech/php-coding-standard\": \"^3.1\",\n \"vimeo/psalm\": \"^4.7.3\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-main\": \"1.2-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"League\\\\Config\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"BSD-3-Clause\"\n ],\n \"authors\": [\n {\n \"name\": \"Colin O'Dell\",\n \"email\": \"colinodell@gmail.com\",\n \"homepage\": \"https://www.colinodell.com\",\n \"role\": \"Lead Developer\"\n }\n ],\n \"description\": \"Define configuration arrays with strict schemas and access values with dot notation\",\n \"homepage\": \"https://config.thephpleague.com\",\n \"keywords\": [\n \"array\",\n \"config\",\n \"configuration\",\n \"dot\",\n \"dot-access\",\n \"nested\",\n \"schema\"\n ],\n \"support\": {\n \"docs\": \"https://config.thephpleague.com/\",\n \"issues\": \"https://github.com/thephpleague/config/issues\",\n \"rss\": \"https://github.com/thephpleague/config/releases.atom\",\n \"source\": \"https://github.com/thephpleague/config\"\n },\n \"funding\": [\n {\n \"url\": \"https://www.colinodell.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://www.paypal.me/colinpodell/10.00\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/colinodell\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2022-12-11T20:36:23+00:00\"\n },\n {\n \"name\": \"league/event\",\n \"version\": \"3.0.3\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/thephpleague/event.git\",\n \"reference\": \"ec38ff7ea10cad7d99a79ac937fbcffb9334c210\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/thephpleague/event/zipball/ec38ff7ea10cad7d99a79ac937fbcffb9334c210\",\n \"reference\": \"ec38ff7ea10cad7d99a79ac937fbcffb9334c210\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=7.2.0\",\n \"psr/event-dispatcher\": \"^1.0\"\n },\n \"provide\": {\n \"psr/event-dispatcher-implementation\": \"1.0\"\n },\n \"require-dev\": {\n \"friendsofphp/php-cs-fixer\": \"^2.16\",\n \"phpstan/phpstan\": \"^0.12.45\",\n \"phpunit/phpunit\": \"^8.5\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"3.0-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"League\\\\Event\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Frank de Jonge\",\n \"email\": \"info@frenky.net\"\n }\n ],\n \"description\": \"Event package\",\n \"keywords\": [\n \"emitter\",\n \"event\",\n \"listener\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/thephpleague/event/issues\",\n \"source\": \"https://github.com/thephpleague/event/tree/3.0.3\"\n },\n \"time\": \"2024-09-04T16:06:53+00:00\"\n },\n {\n \"name\": \"league/flysystem\",\n \"version\": \"3.32.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/thephpleague/flysystem.git\",\n \"reference\": \"254b1595b16b22dbddaaef9ed6ca9fdac4956725\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/thephpleague/flysystem/zipball/254b1595b16b22dbddaaef9ed6ca9fdac4956725\",\n \"reference\": \"254b1595b16b22dbddaaef9ed6ca9fdac4956725\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"league/flysystem-local\": \"^3.0.0\",\n \"league/mime-type-detection\": \"^1.0.0\",\n \"php\": \"^8.0.2\"\n },\n \"conflict\": {\n \"async-aws/core\": \"<1.19.0\",\n \"async-aws/s3\": \"<1.14.0\",\n \"aws/aws-sdk-php\": \"3.209.31 || 3.210.0\",\n \"guzzlehttp/guzzle\": \"<7.0\",\n \"guzzlehttp/ringphp\": \"<1.1.1\",\n \"phpseclib/phpseclib\": \"3.0.15\",\n \"symfony/http-client\": \"<5.2\"\n },\n \"require-dev\": {\n \"async-aws/s3\": \"^1.5 || ^2.0\",\n \"async-aws/simple-s3\": \"^1.1 || ^2.0\",\n \"aws/aws-sdk-php\": \"^3.295.10\",\n \"composer/semver\": \"^3.0\",\n \"ext-fileinfo\": \"*\",\n \"ext-ftp\": \"*\",\n \"ext-mongodb\": \"^1.3|^2\",\n \"ext-zip\": \"*\",\n \"friendsofphp/php-cs-fixer\": \"^3.5\",\n \"google/cloud-storage\": \"^1.23\",\n \"guzzlehttp/psr7\": \"^2.6\",\n \"microsoft/azure-storage-blob\": \"^1.1\",\n \"mongodb/mongodb\": \"^1.2|^2\",\n \"phpseclib/phpseclib\": \"^3.0.36\",\n \"phpstan/phpstan\": \"^1.10\",\n \"phpunit/phpunit\": \"^9.5.11|^10.0\",\n \"sabre/dav\": \"^4.6.0\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"League\\\\Flysystem\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Frank de Jonge\",\n \"email\": \"info@frankdejonge.nl\"\n }\n ],\n \"description\": \"File storage abstraction for PHP\",\n \"keywords\": [\n \"WebDAV\",\n \"aws\",\n \"cloud\",\n \"file\",\n \"files\",\n \"filesystem\",\n \"filesystems\",\n \"ftp\",\n \"s3\",\n \"sftp\",\n \"storage\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/thephpleague/flysystem/issues\",\n \"source\": \"https://github.com/thephpleague/flysystem/tree/3.32.0\"\n },\n \"time\": \"2026-02-25T17:01:41+00:00\"\n },\n {\n \"name\": \"league/flysystem-aws-s3-v3\",\n \"version\": \"3.29.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/thephpleague/flysystem-aws-s3-v3.git\",\n \"reference\": \"c6ff6d4606e48249b63f269eba7fabdb584e76a9\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/thephpleague/flysystem-aws-s3-v3/zipball/c6ff6d4606e48249b63f269eba7fabdb584e76a9\",\n \"reference\": \"c6ff6d4606e48249b63f269eba7fabdb584e76a9\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"aws/aws-sdk-php\": \"^3.295.10\",\n \"league/flysystem\": \"^3.10.0\",\n \"league/mime-type-detection\": \"^1.0.0\",\n \"php\": \"^8.0.2\"\n },\n \"conflict\": {\n \"guzzlehttp/guzzle\": \"<7.0\",\n \"guzzlehttp/ringphp\": \"<1.1.1\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"League\\\\Flysystem\\\\AwsS3V3\\\\\": \"\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Frank de Jonge\",\n \"email\": \"info@frankdejonge.nl\"\n }\n ],\n \"description\": \"AWS S3 filesystem adapter for Flysystem.\",\n \"keywords\": [\n \"Flysystem\",\n \"aws\",\n \"file\",\n \"files\",\n \"filesystem\",\n \"s3\",\n \"storage\"\n ],\n \"support\": {\n \"source\": \"https://github.com/thephpleague/flysystem-aws-s3-v3/tree/3.29.0\"\n },\n \"time\": \"2024-08-17T13:10:48+00:00\"\n },\n {\n \"name\": \"league/flysystem-local\",\n \"version\": \"3.31.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/thephpleague/flysystem-local.git\",\n \"reference\": \"2f669db18a4c20c755c2bb7d3a7b0b2340488079\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/thephpleague/flysystem-local/zipball/2f669db18a4c20c755c2bb7d3a7b0b2340488079\",\n \"reference\": \"2f669db18a4c20c755c2bb7d3a7b0b2340488079\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"ext-fileinfo\": \"*\",\n \"league/flysystem\": \"^3.0.0\",\n \"league/mime-type-detection\": \"^1.0.0\",\n \"php\": \"^8.0.2\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"League\\\\Flysystem\\\\Local\\\\\": \"\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Frank de Jonge\",\n \"email\": \"info@frankdejonge.nl\"\n }\n ],\n \"description\": \"Local filesystem adapter for Flysystem.\",\n \"keywords\": [\n \"Flysystem\",\n \"file\",\n \"files\",\n \"filesystem\",\n \"local\"\n ],\n \"support\": {\n \"source\": \"https://github.com/thephpleague/flysystem-local/tree/3.31.0\"\n },\n \"time\": \"2026-01-23T15:30:45+00:00\"\n },\n {\n \"name\": \"league/fractal\",\n \"version\": \"0.20.2\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/thephpleague/fractal.git\",\n \"reference\": \"573ca2e0e348a7fe573a3e8fbc29a6588ece8c4e\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/thephpleague/fractal/zipball/573ca2e0e348a7fe573a3e8fbc29a6588ece8c4e\",\n \"reference\": \"573ca2e0e348a7fe573a3e8fbc29a6588ece8c4e\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=7.4\"\n },\n \"require-dev\": {\n \"doctrine/orm\": \"^2.5\",\n \"illuminate/contracts\": \"~5.0\",\n \"laminas/laminas-paginator\": \"~2.12\",\n \"mockery/mockery\": \"^1.3\",\n \"pagerfanta/pagerfanta\": \"~1.0.0|~4.0.0\",\n \"phpstan/phpstan\": \"^1.4\",\n \"phpunit/phpunit\": \"^9.5\",\n \"squizlabs/php_codesniffer\": \"~3.4\",\n \"vimeo/psalm\": \"^4.30\"\n },\n \"suggest\": {\n \"illuminate/pagination\": \"The Illuminate Pagination component.\",\n \"laminas/laminas-paginator\": \"Laminas Framework Paginator\",\n \"pagerfanta/pagerfanta\": \"Pagerfanta Paginator\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"0.20.x-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"League\\\\Fractal\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Phil Sturgeon\",\n \"email\": \"me@philsturgeon.uk\",\n \"homepage\": \"http://philsturgeon.uk/\",\n \"role\": \"Developer\"\n }\n ],\n \"description\": \"Handle the output of complex data structures ready for API output.\",\n \"homepage\": \"http://fractal.thephpleague.com/\",\n \"keywords\": [\n \"api\",\n \"json\",\n \"league\",\n \"rest\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/thephpleague/fractal/issues\",\n \"source\": \"https://github.com/thephpleague/fractal/tree/0.20.2\"\n },\n \"time\": \"2025-02-14T21:33:14+00:00\"\n },\n {\n \"name\": \"league/mime-type-detection\",\n \"version\": \"1.16.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/thephpleague/mime-type-detection.git\",\n \"reference\": \"2d6702ff215bf922936ccc1ad31007edc76451b9\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/thephpleague/mime-type-detection/zipball/2d6702ff215bf922936ccc1ad31007edc76451b9\",\n \"reference\": \"2d6702ff215bf922936ccc1ad31007edc76451b9\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"ext-fileinfo\": \"*\",\n \"php\": \"^7.4 || ^8.0\"\n },\n \"require-dev\": {\n \"friendsofphp/php-cs-fixer\": \"^3.2\",\n \"phpstan/phpstan\": \"^0.12.68\",\n \"phpunit/phpunit\": \"^8.5.8 || ^9.3 || ^10.0\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"League\\\\MimeTypeDetection\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Frank de Jonge\",\n \"email\": \"info@frankdejonge.nl\"\n }\n ],\n \"description\": \"Mime-type detection for Flysystem\",\n \"support\": {\n \"issues\": \"https://github.com/thephpleague/mime-type-detection/issues\",\n \"source\": \"https://github.com/thephpleague/mime-type-detection/tree/1.16.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/frankdejonge\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/league/flysystem\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2024-09-21T08:32:55+00:00\"\n },\n {\n \"name\": \"league/oauth2-client\",\n \"version\": \"2.9.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/thephpleague/oauth2-client.git\",\n \"reference\": \"26e8c5da4f3d78cede7021e09b1330a0fc093d5e\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/thephpleague/oauth2-client/zipball/26e8c5da4f3d78cede7021e09b1330a0fc093d5e\",\n \"reference\": \"26e8c5da4f3d78cede7021e09b1330a0fc093d5e\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"ext-json\": \"*\",\n \"guzzlehttp/guzzle\": \"^6.5.8 || ^7.4.5\",\n \"php\": \"^7.1 || >=8.0.0 <8.6.0\"\n },\n \"require-dev\": {\n \"mockery/mockery\": \"^1.3.5\",\n \"php-parallel-lint/php-parallel-lint\": \"^1.4\",\n \"phpunit/phpunit\": \"^7 || ^8 || ^9 || ^10 || ^11\",\n \"squizlabs/php_codesniffer\": \"^3.11\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"League\\\\OAuth2\\\\Client\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Alex Bilbie\",\n \"email\": \"hello@alexbilbie.com\",\n \"homepage\": \"http://www.alexbilbie.com\",\n \"role\": \"Developer\"\n },\n {\n \"name\": \"Woody Gilk\",\n \"homepage\": \"https://github.com/shadowhand\",\n \"role\": \"Contributor\"\n }\n ],\n \"description\": \"OAuth 2.0 Client Library\",\n \"keywords\": [\n \"Authentication\",\n \"SSO\",\n \"authorization\",\n \"identity\",\n \"idp\",\n \"oauth\",\n \"oauth2\",\n \"single sign on\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/thephpleague/oauth2-client/issues\",\n \"source\": \"https://github.com/thephpleague/oauth2-client/tree/2.9.0\"\n },\n \"time\": \"2025-11-25T22:17:17+00:00\"\n },\n {\n \"name\": \"league/oauth2-google\",\n \"version\": \"4.0.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/thephpleague/oauth2-google.git\",\n \"reference\": \"1b01ba18ba31b29e88771e3e0979e5c91d4afe76\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/thephpleague/oauth2-google/zipball/1b01ba18ba31b29e88771e3e0979e5c91d4afe76\",\n \"reference\": \"1b01ba18ba31b29e88771e3e0979e5c91d4afe76\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"league/oauth2-client\": \"^2.0\",\n \"php\": \"^7.3 || ^8.0\"\n },\n \"require-dev\": {\n \"eloquent/phony-phpunit\": \"^6.0 || ^7.1\",\n \"phpunit/phpunit\": \"^8.0 || ^9.0\",\n \"squizlabs/php_codesniffer\": \"^3.0\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"League\\\\OAuth2\\\\Client\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Woody Gilk\",\n \"email\": \"hello@shadowhand.com\",\n \"homepage\": \"https://shadowhand.com\"\n }\n ],\n \"description\": \"Google OAuth 2.0 Client Provider for The PHP League OAuth2-Client\",\n \"keywords\": [\n \"Authentication\",\n \"authorization\",\n \"client\",\n \"google\",\n \"oauth\",\n \"oauth2\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/thephpleague/oauth2-google/issues\",\n \"source\": \"https://github.com/thephpleague/oauth2-google/tree/4.0.1\"\n },\n \"time\": \"2023-03-17T15:20:52+00:00\"\n },\n {\n \"name\": \"league/oauth2-linkedin\",\n \"version\": \"5.1.2\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/thephpleague/oauth2-linkedin.git\",\n \"reference\": \"f9ab661ca37884067ca286412b6c17304d3c2fac\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/thephpleague/oauth2-linkedin/zipball/f9ab661ca37884067ca286412b6c17304d3c2fac\",\n \"reference\": \"f9ab661ca37884067ca286412b6c17304d3c2fac\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"league/oauth2-client\": \"^2.0\"\n },\n \"require-dev\": {\n \"ext-json\": \"*\",\n \"mockery/mockery\": \"~0.9\",\n \"phpunit/phpunit\": \"~4.0\",\n \"squizlabs/php_codesniffer\": \"~2.0\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"1.0.x-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"League\\\\OAuth2\\\\Client\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Steven Maguire\",\n \"email\": \"stevenmaguire@gmail.com\",\n \"homepage\": \"https://github.com/stevenmaguire\"\n }\n ],\n \"description\": \"LinkedIn OAuth 2.0 Client Provider for The PHP League OAuth2-Client\",\n \"keywords\": [\n \"authorisation\",\n \"authorization\",\n \"client\",\n \"linkedin\",\n \"oauth\",\n \"oauth2\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/thephpleague/oauth2-linkedin/issues\",\n \"source\": \"https://github.com/thephpleague/oauth2-linkedin/tree/5.1.2\"\n },\n \"time\": \"2020-04-20T13:59:44+00:00\"\n },\n {\n \"name\": \"league/oauth2-server\",\n \"version\": \"9.3.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/thephpleague/oauth2-server.git\",\n \"reference\": \"d8e2f39f645a82b207bbac441694d6e6079357cb\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/thephpleague/oauth2-server/zipball/d8e2f39f645a82b207bbac441694d6e6079357cb\",\n \"reference\": \"d8e2f39f645a82b207bbac441694d6e6079357cb\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"defuse/php-encryption\": \"^2.4\",\n \"ext-json\": \"*\",\n \"ext-openssl\": \"*\",\n \"lcobucci/clock\": \"^2.3 || ^3.0\",\n \"lcobucci/jwt\": \"^5.0\",\n \"league/event\": \"^3.0\",\n \"league/uri\": \"^7.0\",\n \"php\": \"~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0 || ~8.5.0\",\n \"psr/http-message\": \"^2.0\",\n \"psr/http-server-middleware\": \"^1.0\"\n },\n \"replace\": {\n \"league/oauth2server\": \"*\",\n \"lncd/oauth2\": \"*\"\n },\n \"require-dev\": {\n \"laminas/laminas-diactoros\": \"^3.5\",\n \"php-parallel-lint/php-parallel-lint\": \"^1.3.2\",\n \"phpstan/extension-installer\": \"^1.3.1\",\n \"phpstan/phpstan\": \"^1.12|^2.0\",\n \"phpstan/phpstan-deprecation-rules\": \"^1.1.4|^2.0\",\n \"phpstan/phpstan-phpunit\": \"^1.3.15|^2.0\",\n \"phpstan/phpstan-strict-rules\": \"^1.5.2|^2.0\",\n \"phpunit/phpunit\": \"^10.5|^11.5|^12.0\",\n \"roave/security-advisories\": \"dev-master\",\n \"slevomat/coding-standard\": \"^8.14.1\",\n \"squizlabs/php_codesniffer\": \"^3.8\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"League\\\\OAuth2\\\\Server\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Alex Bilbie\",\n \"email\": \"hello@alexbilbie.com\",\n \"homepage\": \"http://www.alexbilbie.com\",\n \"role\": \"Developer\"\n },\n {\n \"name\": \"Andy Millington\",\n \"email\": \"andrew@noexceptions.io\",\n \"homepage\": \"https://www.noexceptions.io\",\n \"role\": \"Developer\"\n }\n ],\n \"description\": \"A lightweight and powerful OAuth 2.0 authorization and resource server library with support for all the core specification grants. This library will allow you to secure your API with OAuth and allow your applications users to approve apps that want to access their data from your API.\",\n \"homepage\": \"https://oauth2.thephpleague.com/\",\n \"keywords\": [\n \"Authentication\",\n \"api\",\n \"auth\",\n \"authorisation\",\n \"authorization\",\n \"oauth\",\n \"oauth 2\",\n \"oauth 2.0\",\n \"oauth2\",\n \"protect\",\n \"resource\",\n \"secure\",\n \"server\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/thephpleague/oauth2-server/issues\",\n \"source\": \"https://github.com/thephpleague/oauth2-server/tree/9.3.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/sephster\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2025-11-25T22:51:15+00:00\"\n },\n {\n \"name\": \"league/statsd\",\n \"version\": \"2.0.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/thephpleague/statsd.git\",\n \"reference\": \"e9829dc87a089a88a8645560b9c7432813440a67\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/thephpleague/statsd/zipball/e9829dc87a089a88a8645560b9c7432813440a67\",\n \"reference\": \"e9829dc87a089a88a8645560b9c7432813440a67\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \"^7.4 || ^8.0\"\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \"^9.5\",\n \"squizlabs/php_codesniffer\": \"^3.6\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"laravel\": {\n \"aliases\": {\n \"Statsd\": \"League\\\\StatsD\\\\Laravel5\\\\Facade\\\\StatsdFacade\"\n },\n \"providers\": [\n \"League\\\\StatsD\\\\Laravel5\\\\Provider\\\\StatsdServiceProvider\"\n ]\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"League\\\\StatsD\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Marc Qualie\",\n \"email\": \"marc@marcqualie.com\",\n \"homepage\": \"http://marcqualie.com\",\n \"role\": \"Developer\"\n }\n ],\n \"description\": \"A simple library for working with StatsD in PHP.\",\n \"homepage\": \"https://github.com/thephpleague/statsd\",\n \"keywords\": [\n \"graphite\",\n \"library\",\n \"statsd\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/thephpleague/statsd/issues\",\n \"source\": \"https://github.com/thephpleague/statsd/tree/2.0.0\"\n },\n \"time\": \"2022-01-15T03:21:44+00:00\"\n },\n {\n \"name\": \"league/uri\",\n \"version\": \"7.8.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/thephpleague/uri.git\",\n \"reference\": \"4436c6ec8d458e4244448b069cc572d088230b76\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/thephpleague/uri/zipball/4436c6ec8d458e4244448b069cc572d088230b76\",\n \"reference\": \"4436c6ec8d458e4244448b069cc572d088230b76\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"league/uri-interfaces\": \"^7.8\",\n \"php\": \"^8.1\",\n \"psr/http-factory\": \"^1\"\n },\n \"conflict\": {\n \"league/uri-schemes\": \"^1.0\"\n },\n \"suggest\": {\n \"ext-bcmath\": \"to improve IPV4 host parsing\",\n \"ext-dom\": \"to convert the URI into an HTML anchor tag\",\n \"ext-fileinfo\": \"to create Data URI from file contennts\",\n \"ext-gmp\": \"to improve IPV4 host parsing\",\n \"ext-intl\": \"to handle IDN host with the best performance\",\n \"ext-uri\": \"to use the PHP native URI class\",\n \"jeremykendall/php-domain-parser\": \"to further parse the URI host and resolve its Public Suffix and Top Level Domain\",\n \"league/uri-components\": \"to provide additional tools to manipulate URI objects components\",\n \"league/uri-polyfill\": \"to backport the PHP URI extension for older versions of PHP\",\n \"php-64bit\": \"to improve IPV4 host parsing\",\n \"rowbot/url\": \"to handle URLs using the WHATWG URL Living Standard specification\",\n \"symfony/polyfill-intl-idn\": \"to handle IDN host via the Symfony polyfill if ext-intl is not present\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"7.x-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"League\\\\Uri\\\\\": \"\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Ignace Nyamagana Butera\",\n \"email\": \"nyamsprod@gmail.com\",\n \"homepage\": \"https://nyamsprod.com\"\n }\n ],\n \"description\": \"URI manipulation library\",\n \"homepage\": \"https://uri.thephpleague.com\",\n \"keywords\": [\n \"URN\",\n \"data-uri\",\n \"file-uri\",\n \"ftp\",\n \"hostname\",\n \"http\",\n \"https\",\n \"middleware\",\n \"parse_str\",\n \"parse_url\",\n \"psr-7\",\n \"query-string\",\n \"querystring\",\n \"rfc2141\",\n \"rfc3986\",\n \"rfc3987\",\n \"rfc6570\",\n \"rfc8141\",\n \"uri\",\n \"uri-template\",\n \"url\",\n \"ws\"\n ],\n \"support\": {\n \"docs\": \"https://uri.thephpleague.com\",\n \"forum\": \"https://thephpleague.slack.com\",\n \"issues\": \"https://github.com/thephpleague/uri-src/issues\",\n \"source\": \"https://github.com/thephpleague/uri/tree/7.8.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/sponsors/nyamsprod\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2026-01-14T17:24:56+00:00\"\n },\n {\n \"name\": \"league/uri-interfaces\",\n \"version\": \"7.8.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/thephpleague/uri-interfaces.git\",\n \"reference\": \"c5c5cd056110fc8afaba29fa6b72a43ced42acd4\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/thephpleague/uri-interfaces/zipball/c5c5cd056110fc8afaba29fa6b72a43ced42acd4\",\n \"reference\": \"c5c5cd056110fc8afaba29fa6b72a43ced42acd4\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"ext-filter\": \"*\",\n \"php\": \"^8.1\",\n \"psr/http-message\": \"^1.1 || ^2.0\"\n },\n \"suggest\": {\n \"ext-bcmath\": \"to improve IPV4 host parsing\",\n \"ext-gmp\": \"to improve IPV4 host parsing\",\n \"ext-intl\": \"to handle IDN host with the best performance\",\n \"php-64bit\": \"to improve IPV4 host parsing\",\n \"rowbot/url\": \"to handle URLs using the WHATWG URL Living Standard specification\",\n \"symfony/polyfill-intl-idn\": \"to handle IDN host via the Symfony polyfill if ext-intl is not present\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"7.x-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"League\\\\Uri\\\\\": \"\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Ignace Nyamagana Butera\",\n \"email\": \"nyamsprod@gmail.com\",\n \"homepage\": \"https://nyamsprod.com\"\n }\n ],\n \"description\": \"Common tools for parsing and resolving RFC3987/RFC3986 URI\",\n \"homepage\": \"https://uri.thephpleague.com\",\n \"keywords\": [\n \"data-uri\",\n \"file-uri\",\n \"ftp\",\n \"hostname\",\n \"http\",\n \"https\",\n \"parse_str\",\n \"parse_url\",\n \"psr-7\",\n \"query-string\",\n \"querystring\",\n \"rfc3986\",\n \"rfc3987\",\n \"rfc6570\",\n \"uri\",\n \"url\",\n \"ws\"\n ],\n \"support\": {\n \"docs\": \"https://uri.thephpleague.com\",\n \"forum\": \"https://thephpleague.slack.com\",\n \"issues\": \"https://github.com/thephpleague/uri-src/issues\",\n \"source\": \"https://github.com/thephpleague/uri-interfaces/tree/7.8.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/sponsors/nyamsprod\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2026-01-15T06:54:53+00:00\"\n },\n {\n \"name\": \"markrogoyski/math-php\",\n \"version\": \"v2.11.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/markrogoyski/math-php.git\",\n \"reference\": \"ae499f31513821a62f3d2fb8c6f0d3a333e8b591\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/markrogoyski/math-php/zipball/ae499f31513821a62f3d2fb8c6f0d3a333e8b591\",\n \"reference\": \"ae499f31513821a62f3d2fb8c6f0d3a333e8b591\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"ext-json\": \"*\",\n \"php\": \">=7.2.0\"\n },\n \"require-dev\": {\n \"php-coveralls/php-coveralls\": \"^2.0\",\n \"php-parallel-lint/php-parallel-lint\": \"^1.2\",\n \"phploc/phploc\": \"*\",\n \"phpmd/phpmd\": \"^2.6\",\n \"phpstan/phpstan\": \"^1.10\",\n \"phpunit/phpunit\": \"^8.5\",\n \"squizlabs/php_codesniffer\": \"3.*\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"MathPHP\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Mark Rogoyski\",\n \"email\": \"mark@rogoyski.com\",\n \"homepage\": \"https://github.com/markrogoyski\",\n \"role\": \"Lead developer\"\n },\n {\n \"name\": \"Kevin Nowaczyk\",\n \"homepage\": \"https://github.com/Beakerboy\",\n \"role\": \"Developer\"\n },\n {\n \"name\": \"MathPHP Community of Contributors\",\n \"homepage\": \"https://github.com/markrogoyski/math-php/graphs/contributors\"\n }\n ],\n \"description\": \"Math Library for PHP. Features descriptive statistics and regressions; Continuous and discrete probability distributions; Linear algebra with matrices and vectors, Numerical analysis; special mathematical functions; Algebra\",\n \"homepage\": \"https://github.com/markrogoyski/math-php/\",\n \"keywords\": [\n \"algebra\",\n \"combinatorics\",\n \"distributions\",\n \"linear algebra\",\n \"math\",\n \"mathematics\",\n \"matrix\",\n \"numerical analysis\",\n \"probability\",\n \"regressions\",\n \"statistics\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/markrogoyski/math-php/issues\",\n \"source\": \"https://github.com/markrogoyski/math-php/tree/v2.11.0\"\n },\n \"time\": \"2025-01-26T20:16:06+00:00\"\n },\n {\n \"name\": \"masterminds/html5\",\n \"version\": \"2.10.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/Masterminds/html5-php.git\",\n \"reference\": \"fcf91eb64359852f00d921887b219479b4f21251\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/Masterminds/html5-php/zipball/fcf91eb64359852f00d921887b219479b4f21251\",\n \"reference\": \"fcf91eb64359852f00d921887b219479b4f21251\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"ext-dom\": \"*\",\n \"php\": \">=5.3.0\"\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \"^4.8.35 || ^5.7.21 || ^6 || ^7 || ^8 || ^9\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"2.7-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Masterminds\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Matt Butcher\",\n \"email\": \"technosophos@gmail.com\"\n },\n {\n \"name\": \"Matt Farina\",\n \"email\": \"matt@mattfarina.com\"\n },\n {\n \"name\": \"Asmir Mustafic\",\n \"email\": \"goetas@gmail.com\"\n }\n ],\n \"description\": \"An HTML5 parser and serializer.\",\n \"homepage\": \"http://masterminds.github.io/html5-php\",\n \"keywords\": [\n \"HTML5\",\n \"dom\",\n \"html\",\n \"parser\",\n \"querypath\",\n \"serializer\",\n \"xml\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/Masterminds/html5-php/issues\",\n \"source\": \"https://github.com/Masterminds/html5-php/tree/2.10.0\"\n },\n \"time\": \"2025-07-25T09:04:22+00:00\"\n },\n {\n \"name\": \"microsoft/kiota-abstractions\",\n \"version\": \"1.5.2\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/microsoft/kiota-abstractions-php.git\",\n \"reference\": \"dd22152c9497b5dedcefcf9025691c6db40c23b3\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/microsoft/kiota-abstractions-php/zipball/dd22152c9497b5dedcefcf9025691c6db40c23b3\",\n \"reference\": \"dd22152c9497b5dedcefcf9025691c6db40c23b3\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"doctrine/annotations\": \"^1.13 || ^2.0\",\n \"open-telemetry/sdk\": \"^1.0.0\",\n \"php\": \"^7.4 || ^8.0\",\n \"php-http/promise\": \"~1.2.0\",\n \"psr/http-message\": \"^1.1 || ^2.0\",\n \"ramsey/uuid\": \"^4.2.3\",\n \"stduritemplate/stduritemplate\": \"^0.0.53 || ^0.0.54 || ^0.0.55 || ^0.0.56 || ^0.0.57 || ^0.0.59 || ^1.0.0 || ^2.0.0\"\n },\n \"require-dev\": {\n \"phpstan/phpstan\": \"^1.12.16\",\n \"phpunit/phpunit\": \"^9.6.22\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Microsoft\\\\Kiota\\\\Abstractions\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Microsoft Graph Client Tooling\",\n \"email\": \"graphtooling@service.microsoft.com\",\n \"role\": \"Developer\"\n }\n ],\n \"description\": \"Abstractions for Kiota\",\n \"support\": {\n \"source\": \"https://github.com/microsoft/kiota-abstractions-php/tree/1.5.2\"\n },\n \"time\": \"2025-12-18T13:14:21+00:00\"\n },\n {\n \"name\": \"microsoft/kiota-authentication-phpleague\",\n \"version\": \"1.5.2\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/microsoft/kiota-authentication-phpleague-php.git\",\n \"reference\": \"7766da482a86ccae8629a947cb0d21d160b6d18b\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/microsoft/kiota-authentication-phpleague-php/zipball/7766da482a86ccae8629a947cb0d21d160b6d18b\",\n \"reference\": \"7766da482a86ccae8629a947cb0d21d160b6d18b\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"ext-json\": \"*\",\n \"ext-openssl\": \"*\",\n \"firebase/php-jwt\": \"^6 || ^7\",\n \"league/oauth2-client\": \"^2.6.1\",\n \"microsoft/kiota-abstractions\": \"^1.5.2\",\n \"php\": \"^7.4 || ^8.0\",\n \"ramsey/uuid\": \"^4.2.3\"\n },\n \"require-dev\": {\n \"phpstan/phpstan\": \"^1.12.16\",\n \"phpunit/phpunit\": \"^9.6.22\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Microsoft\\\\Kiota\\\\Authentication\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Microsoft Graph Client Tooling\",\n \"email\": \"graphtooling@service.microsoft.com\"\n }\n ],\n \"description\": \"Authentication provider for Kiota using the PHP League OAuth 2.0 client to authenticate against the Microsoft Identity platform\",\n \"support\": {\n \"source\": \"https://github.com/microsoft/kiota-authentication-phpleague-php/tree/1.5.2\"\n },\n \"time\": \"2025-12-18T13:55:33+00:00\"\n },\n {\n \"name\": \"microsoft/kiota-http-guzzle\",\n \"version\": \"1.5.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/microsoft/kiota-http-guzzle-php.git\",\n \"reference\": \"adb261be0bf44d69fac670db262e0d2006a55c01\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/microsoft/kiota-http-guzzle-php/zipball/adb261be0bf44d69fac670db262e0d2006a55c01\",\n \"reference\": \"adb261be0bf44d69fac670db262e0d2006a55c01\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"ext-json\": \"*\",\n \"ext-zlib\": \"*\",\n \"guzzlehttp/guzzle\": \"^7.4.5\",\n \"microsoft/kiota-abstractions\": \"^1.5.1\",\n \"php\": \"^7.4 || ^8.0\"\n },\n \"require-dev\": {\n \"phpstan/phpstan\": \"^1.12.16\",\n \"phpunit/phpunit\": \"^9.6.22\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Microsoft\\\\Kiota\\\\Http\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Microsoft Graph Client Tooling\",\n \"email\": \"graphtooling@service.microsoft.com\"\n }\n ],\n \"description\": \"Kiota HTTP Request Adapter implementation\",\n \"support\": {\n \"source\": \"https://github.com/microsoft/kiota-http-guzzle-php/tree/1.5.1\"\n },\n \"time\": \"2025-10-08T16:48:12+00:00\"\n },\n {\n \"name\": \"microsoft/kiota-serialization-form\",\n \"version\": \"1.5.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/microsoft/kiota-serialization-form-php.git\",\n \"reference\": \"2820f4070a8eef3df89c46ec9e657b1427800c99\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/microsoft/kiota-serialization-form-php/zipball/2820f4070a8eef3df89c46ec9e657b1427800c99\",\n \"reference\": \"2820f4070a8eef3df89c46ec9e657b1427800c99\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"ext-json\": \"*\",\n \"guzzlehttp/psr7\": \"^1.6 || ^2\",\n \"microsoft/kiota-abstractions\": \"^1.5.1\",\n \"php\": \"^7.4 || ^8.0\"\n },\n \"require-dev\": {\n \"phpstan/phpstan\": \"^1.12.16\",\n \"phpunit/phpunit\": \"^9.6.22\",\n \"roave/security-advisories\": \"dev-latest\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Microsoft\\\\Kiota\\\\Serialization\\\\Form\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Microsoft Graph Client Tooling\",\n \"email\": \"graphtooling@service.microsoft.com\",\n \"role\": \"Developer\"\n }\n ],\n \"description\": \"Form implementation of Kiota abstractions serialization.\",\n \"support\": {\n \"source\": \"https://github.com/microsoft/kiota-serialization-form-php/tree/1.5.1\"\n },\n \"time\": \"2025-10-08T16:47:34+00:00\"\n },\n {\n \"name\": \"microsoft/kiota-serialization-json\",\n \"version\": \"1.5.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/microsoft/kiota-serialization-json-php.git\",\n \"reference\": \"8537f9e53d5c5aed303e87a35e4d2a253468aac6\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/microsoft/kiota-serialization-json-php/zipball/8537f9e53d5c5aed303e87a35e4d2a253468aac6\",\n \"reference\": \"8537f9e53d5c5aed303e87a35e4d2a253468aac6\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"ext-json\": \"*\",\n \"guzzlehttp/psr7\": \"^1.6 || ^2\",\n \"microsoft/kiota-abstractions\": \"^1.5.1\",\n \"php\": \"^7.4 || ^8.0\"\n },\n \"require-dev\": {\n \"phpstan/phpstan\": \"^1.12.16\",\n \"phpunit/phpunit\": \"^9.6.22\",\n \"roave/security-advisories\": \"dev-latest\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Microsoft\\\\Kiota\\\\Serialization\\\\Json\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Microsoft Graph Client Tooling\",\n \"email\": \"graphtooling@service.microsoft.com\",\n \"role\": \"Developer\"\n }\n ],\n \"description\": \"Implementation of Kiota serialization abstractions using Json.\",\n \"support\": {\n \"source\": \"https://github.com/microsoft/kiota-serialization-json-php/tree/1.5.1\"\n },\n \"time\": \"2025-10-08T16:47:11+00:00\"\n },\n {\n \"name\": \"microsoft/kiota-serialization-multipart\",\n \"version\": \"1.5.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/microsoft/kiota-serialization-multipart-php.git\",\n \"reference\": \"28ad890e9b1602ea1681e8d933edd3c78287e729\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/microsoft/kiota-serialization-multipart-php/zipball/28ad890e9b1602ea1681e8d933edd3c78287e729\",\n \"reference\": \"28ad890e9b1602ea1681e8d933edd3c78287e729\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"ext-json\": \"*\",\n \"guzzlehttp/psr7\": \"^1.6 || ^2\",\n \"microsoft/kiota-abstractions\": \"^1.5.1\",\n \"php\": \"^7.4 || ^8.0\"\n },\n \"require-dev\": {\n \"phpstan/phpstan\": \"^1.12.16\",\n \"phpunit/phpunit\": \"^9.6.22\",\n \"roave/security-advisories\": \"dev-latest\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Microsoft\\\\Kiota\\\\Serialization\\\\Multipart\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Microsoft Graph Client Tooling\",\n \"email\": \"graphtooling@service.microsoft.com\",\n \"role\": \"Developer\"\n }\n ],\n \"description\": \"Multipart implementation of Kiota abstractions serialization.\",\n \"support\": {\n \"source\": \"https://github.com/microsoft/kiota-serialization-multipart-php/tree/1.5.1\"\n },\n \"time\": \"2025-10-08T16:47:45+00:00\"\n },\n {\n \"name\": \"microsoft/kiota-serialization-text\",\n \"version\": \"1.5.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/microsoft/kiota-serialization-text-php.git\",\n \"reference\": \"257afebadf347f47284fdaa28849f7187bafb6e6\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/microsoft/kiota-serialization-text-php/zipball/257afebadf347f47284fdaa28849f7187bafb6e6\",\n \"reference\": \"257afebadf347f47284fdaa28849f7187bafb6e6\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"guzzlehttp/psr7\": \"^1.6 || ^2\",\n \"microsoft/kiota-abstractions\": \"^1.5.1\",\n \"php\": \"^7.4 || ^8.0\"\n },\n \"require-dev\": {\n \"phpstan/phpstan\": \"^1.12.16\",\n \"phpunit/phpunit\": \"^9.6.22\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Microsoft\\\\Kiota\\\\Serialization\\\\Text\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Microsoft Graph Client Tooling\",\n \"email\": \"graphtooling@service.microsoft.com\"\n }\n ],\n \"description\": \"Implementation of Serialization Abstractions for text/plain content\",\n \"support\": {\n \"source\": \"https://github.com/microsoft/kiota-serialization-text-php/tree/1.5.1\"\n },\n \"time\": \"2025-10-08T16:46:20+00:00\"\n },\n {\n \"name\": \"microsoft/microsoft-graph\",\n \"version\": \"v2.51.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/microsoftgraph/msgraph-sdk-php.git\",\n \"reference\": \"d77461fb5142d38e2e5313296937b8a771410c34\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/microsoftgraph/msgraph-sdk-php/zipball/d77461fb5142d38e2e5313296937b8a771410c34\",\n \"reference\": \"d77461fb5142d38e2e5313296937b8a771410c34\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"microsoft/microsoft-graph-core\": \"^2.2.1\",\n \"php\": \"^8.0 || ^7.4\"\n },\n \"require-dev\": {\n \"phpstan/phpstan\": \"^0.12.90 || ^1.0.0\",\n \"phpunit/phpunit\": \"^8.0 || ^9.0\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Microsoft\\\\Graph\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Microsoft Graph Client Tooling\",\n \"email\": \"graphtooling@service.microsoft.com\",\n \"role\": \"Developer\"\n }\n ],\n \"description\": \"The Microsoft Graph SDK for PHP\",\n \"homepage\": \"https://developer.microsoft.com/en-us/graph\",\n \"support\": {\n \"issues\": \"https://github.com/microsoftgraph/msgraph-sdk-php/issues\",\n \"source\": \"https://github.com/microsoftgraph/msgraph-sdk-php/tree/v2.51.0\"\n },\n \"time\": \"2025-11-20T01:20:23+00:00\"\n },\n {\n \"name\": \"microsoft/microsoft-graph-core\",\n \"version\": \"v2.3.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/microsoftgraph/msgraph-sdk-php-core.git\",\n \"reference\": \"783111f9e81db9da20cc2dbd48aa1876b500ba15\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/microsoftgraph/msgraph-sdk-php-core/zipball/783111f9e81db9da20cc2dbd48aa1876b500ba15\",\n \"reference\": \"783111f9e81db9da20cc2dbd48aa1876b500ba15\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"ext-json\": \"*\",\n \"microsoft/kiota-authentication-phpleague\": \"^1.5.0\",\n \"microsoft/kiota-http-guzzle\": \"^1.5.0\",\n \"microsoft/kiota-serialization-form\": \"^1.5.0\",\n \"microsoft/kiota-serialization-json\": \"^1.5.0\",\n \"microsoft/kiota-serialization-multipart\": \"^1.5.0\",\n \"microsoft/kiota-serialization-text\": \"^1.5.0\",\n \"php\": \"^8.0 || ^7.4\"\n },\n \"require-dev\": {\n \"mikey179/vfsstream\": \"^1.2\",\n \"phpstan/phpstan\": \"^0.12.90 || ^1.0.0\",\n \"phpunit/phpunit\": \"^9.0\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Microsoft\\\\Graph\\\\Core\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Microsoft Graph Client Tooling\",\n \"email\": \"graphtooling@service.microsoft.com\",\n \"role\": \"Developer\"\n }\n ],\n \"description\": \"The Microsoft Graph Core SDK for PHP\",\n \"homepage\": \"https://developer.microsoft.com/en-us/graph\",\n \"support\": {\n \"issues\": \"https://github.com/microsoftgraph/msgraph-sdk-php-core/issues\",\n \"source\": \"https://github.com/microsoftgraph/msgraph-sdk-php-core/tree/v2.3.1\"\n },\n \"time\": \"2025-03-18T14:27:59+00:00\"\n },\n {\n \"name\": \"monolog/monolog\",\n \"version\": \"3.10.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/Seldaek/monolog.git\",\n \"reference\": \"b321dd6749f0bf7189444158a3ce785cc16d69b0\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/Seldaek/monolog/zipball/b321dd6749f0bf7189444158a3ce785cc16d69b0\",\n \"reference\": \"b321dd6749f0bf7189444158a3ce785cc16d69b0\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.1\",\n \"psr/log\": \"^2.0 || ^3.0\"\n },\n \"provide\": {\n \"psr/log-implementation\": \"3.0.0\"\n },\n \"require-dev\": {\n \"aws/aws-sdk-php\": \"^3.0\",\n \"doctrine/couchdb\": \"~1.0@dev\",\n \"elasticsearch/elasticsearch\": \"^7 || ^8\",\n \"ext-json\": \"*\",\n \"graylog2/gelf-php\": \"^1.4.2 || ^2.0\",\n \"guzzlehttp/guzzle\": \"^7.4.5\",\n \"guzzlehttp/psr7\": \"^2.2\",\n \"mongodb/mongodb\": \"^1.8 || ^2.0\",\n \"php-amqplib/php-amqplib\": \"~2.4 || ^3\",\n \"php-console/php-console\": \"^3.1.8\",\n \"phpstan/phpstan\": \"^2\",\n \"phpstan/phpstan-deprecation-rules\": \"^2\",\n \"phpstan/phpstan-strict-rules\": \"^2\",\n \"phpunit/phpunit\": \"^10.5.17 || ^11.0.7\",\n \"predis/predis\": \"^1.1 || ^2\",\n \"rollbar/rollbar\": \"^4.0\",\n \"ruflin/elastica\": \"^7 || ^8\",\n \"symfony/mailer\": \"^5.4 || ^6\",\n \"symfony/mime\": \"^5.4 || ^6\"\n },\n \"suggest\": {\n \"aws/aws-sdk-php\": \"Allow sending log messages to AWS services like DynamoDB\",\n \"doctrine/couchdb\": \"Allow sending log messages to a CouchDB server\",\n \"elasticsearch/elasticsearch\": \"Allow sending log messages to an Elasticsearch server via official client\",\n \"ext-amqp\": \"Allow sending log messages to an AMQP server (1.0+ required)\",\n \"ext-curl\": \"Required to send log messages using the IFTTTHandler, the LogglyHandler, the SendGridHandler, the SlackWebhookHandler or the TelegramBotHandler\",\n \"ext-mbstring\": \"Allow to work properly with unicode symbols\",\n \"ext-mongodb\": \"Allow sending log messages to a MongoDB server (via driver)\",\n \"ext-openssl\": \"Required to send log messages using SSL\",\n \"ext-sockets\": \"Allow sending log messages to a Syslog server (via UDP driver)\",\n \"graylog2/gelf-php\": \"Allow sending log messages to a GrayLog2 server\",\n \"mongodb/mongodb\": \"Allow sending log messages to a MongoDB server (via library)\",\n \"php-amqplib/php-amqplib\": \"Allow sending log messages to an AMQP server using php-amqplib\",\n \"rollbar/rollbar\": \"Allow sending log messages to Rollbar\",\n \"ruflin/elastica\": \"Allow sending log messages to an Elastic Search server\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-main\": \"3.x-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Monolog\\\\\": \"src/Monolog\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Jordi Boggiano\",\n \"email\": \"j.boggiano@seld.be\",\n \"homepage\": \"https://seld.be\"\n }\n ],\n \"description\": \"Sends your logs to files, sockets, inboxes, databases and various web services\",\n \"homepage\": \"https://github.com/Seldaek/monolog\",\n \"keywords\": [\n \"log\",\n \"logging\",\n \"psr-3\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/Seldaek/monolog/issues\",\n \"source\": \"https://github.com/Seldaek/monolog/tree/3.10.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/Seldaek\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/monolog/monolog\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2026-01-02T08:56:05+00:00\"\n },\n {\n \"name\": \"mtdowling/jmespath.php\",\n \"version\": \"2.8.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/jmespath/jmespath.php.git\",\n \"reference\": \"a2a865e05d5f420b50cc2f85bb78d565db12a6bc\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/jmespath/jmespath.php/zipball/a2a865e05d5f420b50cc2f85bb78d565db12a6bc\",\n \"reference\": \"a2a865e05d5f420b50cc2f85bb78d565db12a6bc\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \"^7.2.5 || ^8.0\",\n \"symfony/polyfill-mbstring\": \"^1.17\"\n },\n \"require-dev\": {\n \"composer/xdebug-handler\": \"^3.0.3\",\n \"phpunit/phpunit\": \"^8.5.33\"\n },\n \"bin\": [\n \"bin/jp.php\"\n ],\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"2.8-dev\"\n }\n },\n \"autoload\": {\n \"files\": [\n \"src/JmesPath.php\"\n ],\n \"psr-4\": {\n \"JmesPath\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Graham Campbell\",\n \"email\": \"hello@gjcampbell.co.uk\",\n \"homepage\": \"https://github.com/GrahamCampbell\"\n },\n {\n \"name\": \"Michael Dowling\",\n \"email\": \"mtdowling@gmail.com\",\n \"homepage\": \"https://github.com/mtdowling\"\n }\n ],\n \"description\": \"Declaratively specify how to extract elements from a JSON document\",\n \"keywords\": [\n \"json\",\n \"jsonpath\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/jmespath/jmespath.php/issues\",\n \"source\": \"https://github.com/jmespath/jmespath.php/tree/2.8.0\"\n },\n \"time\": \"2024-09-04T18:46:31+00:00\"\n },\n {\n \"name\": \"nesbot/carbon\",\n \"version\": \"3.11.3\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/CarbonPHP/carbon.git\",\n \"reference\": \"6a7e652845bb018c668220c2a545aded8594fbbf\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/CarbonPHP/carbon/zipball/6a7e652845bb018c668220c2a545aded8594fbbf\",\n \"reference\": \"6a7e652845bb018c668220c2a545aded8594fbbf\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"carbonphp/carbon-doctrine-types\": \"<100.0\",\n \"ext-json\": \"*\",\n \"php\": \"^8.1\",\n \"psr/clock\": \"^1.0\",\n \"symfony/clock\": \"^6.3.12 || ^7.0 || ^8.0\",\n \"symfony/polyfill-mbstring\": \"^1.0\",\n \"symfony/translation\": \"^4.4.18 || ^5.2.1 || ^6.0 || ^7.0 || ^8.0\"\n },\n \"provide\": {\n \"psr/clock-implementation\": \"1.0\"\n },\n \"require-dev\": {\n \"doctrine/dbal\": \"^3.6.3 || ^4.0\",\n \"doctrine/orm\": \"^2.15.2 || ^3.0\",\n \"friendsofphp/php-cs-fixer\": \"^v3.87.1\",\n \"kylekatarnls/multi-tester\": \"^2.5.3\",\n \"phpmd/phpmd\": \"^2.15.0\",\n \"phpstan/extension-installer\": \"^1.4.3\",\n \"phpstan/phpstan\": \"^2.1.22\",\n \"phpunit/phpunit\": \"^10.5.53\",\n \"squizlabs/php_codesniffer\": \"^3.13.4 || ^4.0.0\"\n },\n \"bin\": [\n \"bin/carbon\"\n ],\n \"type\": \"library\",\n \"extra\": {\n \"laravel\": {\n \"providers\": [\n \"Carbon\\\\Laravel\\\\ServiceProvider\"\n ]\n },\n \"phpstan\": {\n \"includes\": [\n \"extension.neon\"\n ]\n },\n \"branch-alias\": {\n \"dev-2.x\": \"2.x-dev\",\n \"dev-master\": \"3.x-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Carbon\\\\\": \"src/Carbon/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Brian Nesbitt\",\n \"email\": \"brian@nesbot.com\",\n \"homepage\": \"https://markido.com\"\n },\n {\n \"name\": \"kylekatarnls\",\n \"homepage\": \"https://github.com/kylekatarnls\"\n }\n ],\n \"description\": \"An API extension for DateTime that supports 281 different languages.\",\n \"homepage\": \"https://carbonphp.github.io/carbon/\",\n \"keywords\": [\n \"date\",\n \"datetime\",\n \"time\"\n ],\n \"support\": {\n \"docs\": \"https://carbonphp.github.io/carbon/guide/getting-started/introduction.html\",\n \"issues\": \"https://github.com/CarbonPHP/carbon/issues\",\n \"source\": \"https://github.com/CarbonPHP/carbon\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/sponsors/kylekatarnls\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://opencollective.com/Carbon#sponsor\",\n \"type\": \"opencollective\"\n },\n {\n \"url\": \"https://tidelift.com/subscription/pkg/packagist-nesbot-carbon?utm_source=packagist-nesbot-carbon&utm_medium=referral&utm_campaign=readme\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2026-03-11T17:23:39+00:00\"\n },\n {\n \"name\": \"nette/caching\",\n \"version\": \"v3.4.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/nette/caching.git\",\n \"reference\": \"a1c13221b350d0db0a2bd4a77c1e7b65e0aa065d\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/nette/caching/zipball/a1c13221b350d0db0a2bd4a77c1e7b65e0aa065d\",\n \"reference\": \"a1c13221b350d0db0a2bd4a77c1e7b65e0aa065d\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"nette/utils\": \"^4.0\",\n \"php\": \"8.1 - 8.5\"\n },\n \"conflict\": {\n \"latte/latte\": \"<3.0.12\"\n },\n \"require-dev\": {\n \"latte/latte\": \"^3.0.12\",\n \"nette/di\": \"^3.1 || ^4.0\",\n \"nette/tester\": \"^2.4\",\n \"phpstan/phpstan-nette\": \"^2.0@stable\",\n \"psr/simple-cache\": \"^2.0 || ^3.0\",\n \"tracy/tracy\": \"^2.9\"\n },\n \"suggest\": {\n \"ext-pdo_sqlite\": \"to use SQLiteStorage or SQLiteJournal\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"3.4-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Nette\\\\\": \"src\"\n },\n \"classmap\": [\n \"src/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"BSD-3-Clause\",\n \"GPL-2.0-only\",\n \"GPL-3.0-only\"\n ],\n \"authors\": [\n {\n \"name\": \"David Grudl\",\n \"homepage\": \"https://davidgrudl.com\"\n },\n {\n \"name\": \"Nette Community\",\n \"homepage\": \"https://nette.org/contributors\"\n }\n ],\n \"description\": \"⏱ Nette Caching: library with easy-to-use API and many cache backends.\",\n \"homepage\": \"https://nette.org\",\n \"keywords\": [\n \"cache\",\n \"journal\",\n \"memcached\",\n \"nette\",\n \"sqlite\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/nette/caching/issues\",\n \"source\": \"https://github.com/nette/caching/tree/v3.4.0\"\n },\n \"time\": \"2025-08-06T23:05:08+00:00\"\n },\n {\n \"name\": \"nette/schema\",\n \"version\": \"v1.3.5\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/nette/schema.git\",\n \"reference\": \"f0ab1a3cda782dbc5da270d28545236aa80c4002\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/nette/schema/zipball/f0ab1a3cda782dbc5da270d28545236aa80c4002\",\n \"reference\": \"f0ab1a3cda782dbc5da270d28545236aa80c4002\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"nette/utils\": \"^4.0\",\n \"php\": \"8.1 - 8.5\"\n },\n \"require-dev\": {\n \"nette/phpstan-rules\": \"^1.0\",\n \"nette/tester\": \"^2.6\",\n \"phpstan/extension-installer\": \"^1.4@stable\",\n \"phpstan/phpstan\": \"^2.1.39@stable\",\n \"tracy/tracy\": \"^2.8\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"1.3-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Nette\\\\\": \"src\"\n },\n \"classmap\": [\n \"src/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"BSD-3-Clause\",\n \"GPL-2.0-only\",\n \"GPL-3.0-only\"\n ],\n \"authors\": [\n {\n \"name\": \"David Grudl\",\n \"homepage\": \"https://davidgrudl.com\"\n },\n {\n \"name\": \"Nette Community\",\n \"homepage\": \"https://nette.org/contributors\"\n }\n ],\n \"description\": \"📐 Nette Schema: validating data structures against a given Schema.\",\n \"homepage\": \"https://nette.org\",\n \"keywords\": [\n \"config\",\n \"nette\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/nette/schema/issues\",\n \"source\": \"https://github.com/nette/schema/tree/v1.3.5\"\n },\n \"time\": \"2026-02-23T03:47:12+00:00\"\n },\n {\n \"name\": \"nette/utils\",\n \"version\": \"v4.1.3\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/nette/utils.git\",\n \"reference\": \"bb3ea637e3d131d72acc033cfc2746ee893349fe\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/nette/utils/zipball/bb3ea637e3d131d72acc033cfc2746ee893349fe\",\n \"reference\": \"bb3ea637e3d131d72acc033cfc2746ee893349fe\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \"8.2 - 8.5\"\n },\n \"conflict\": {\n \"nette/finder\": \"<3\",\n \"nette/schema\": \"<1.2.2\"\n },\n \"require-dev\": {\n \"jetbrains/phpstorm-attributes\": \"^1.2\",\n \"nette/phpstan-rules\": \"^1.0\",\n \"nette/tester\": \"^2.5\",\n \"phpstan/extension-installer\": \"^1.4@stable\",\n \"phpstan/phpstan\": \"^2.1@stable\",\n \"tracy/tracy\": \"^2.9\"\n },\n \"suggest\": {\n \"ext-gd\": \"to use Image\",\n \"ext-iconv\": \"to use Strings::webalize(), toAscii(), chr() and reverse()\",\n \"ext-intl\": \"to use Strings::webalize(), toAscii(), normalize() and compare()\",\n \"ext-json\": \"to use Nette\\\\Utils\\\\Json\",\n \"ext-mbstring\": \"to use Strings::lower() etc...\",\n \"ext-tokenizer\": \"to use Nette\\\\Utils\\\\Reflection::getUseStatements()\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"4.1-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Nette\\\\\": \"src\"\n },\n \"classmap\": [\n \"src/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"BSD-3-Clause\",\n \"GPL-2.0-only\",\n \"GPL-3.0-only\"\n ],\n \"authors\": [\n {\n \"name\": \"David Grudl\",\n \"homepage\": \"https://davidgrudl.com\"\n },\n {\n \"name\": \"Nette Community\",\n \"homepage\": \"https://nette.org/contributors\"\n }\n ],\n \"description\": \"🛠 Nette Utils: lightweight utilities for string & array manipulation, image handling, safe JSON encoding/decoding, validation, slug or strong password generating etc.\",\n \"homepage\": \"https://nette.org\",\n \"keywords\": [\n \"array\",\n \"core\",\n \"datetime\",\n \"images\",\n \"json\",\n \"nette\",\n \"paginator\",\n \"password\",\n \"slugify\",\n \"string\",\n \"unicode\",\n \"utf-8\",\n \"utility\",\n \"validation\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/nette/utils/issues\",\n \"source\": \"https://github.com/nette/utils/tree/v4.1.3\"\n },\n \"time\": \"2026-02-13T03:05:33+00:00\"\n },\n {\n \"name\": \"nikic/php-parser\",\n \"version\": \"v5.7.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/nikic/PHP-Parser.git\",\n \"reference\": \"dca41cd15c2ac9d055ad70dbfd011130757d1f82\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/nikic/PHP-Parser/zipball/dca41cd15c2ac9d055ad70dbfd011130757d1f82\",\n \"reference\": \"dca41cd15c2ac9d055ad70dbfd011130757d1f82\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"ext-ctype\": \"*\",\n \"ext-json\": \"*\",\n \"ext-tokenizer\": \"*\",\n \"php\": \">=7.4\"\n },\n \"require-dev\": {\n \"ircmaxell/php-yacc\": \"^0.0.7\",\n \"phpunit/phpunit\": \"^9.0\"\n },\n \"bin\": [\n \"bin/php-parse\"\n ],\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"5.x-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"PhpParser\\\\\": \"lib/PhpParser\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"BSD-3-Clause\"\n ],\n \"authors\": [\n {\n \"name\": \"Nikita Popov\"\n }\n ],\n \"description\": \"A PHP parser written in PHP\",\n \"keywords\": [\n \"parser\",\n \"php\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/nikic/PHP-Parser/issues\",\n \"source\": \"https://github.com/nikic/PHP-Parser/tree/v5.7.0\"\n },\n \"time\": \"2025-12-06T11:56:16+00:00\"\n },\n {\n \"name\": \"nunomaduro/termwind\",\n \"version\": \"v2.4.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/nunomaduro/termwind.git\",\n \"reference\": \"712a31b768f5daea284c2169a7d227031001b9a8\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/nunomaduro/termwind/zipball/712a31b768f5daea284c2169a7d227031001b9a8\",\n \"reference\": \"712a31b768f5daea284c2169a7d227031001b9a8\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"ext-mbstring\": \"*\",\n \"php\": \"^8.2\",\n \"symfony/console\": \"^7.4.4 || ^8.0.4\"\n },\n \"require-dev\": {\n \"illuminate/console\": \"^11.47.0\",\n \"laravel/pint\": \"^1.27.1\",\n \"mockery/mockery\": \"^1.6.12\",\n \"pestphp/pest\": \"^2.36.0 || ^3.8.4 || ^4.3.2\",\n \"phpstan/phpstan\": \"^1.12.32\",\n \"phpstan/phpstan-strict-rules\": \"^1.6.2\",\n \"symfony/var-dumper\": \"^7.3.5 || ^8.0.4\",\n \"thecodingmachine/phpstan-strict-rules\": \"^1.0.0\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"laravel\": {\n \"providers\": [\n \"Termwind\\\\Laravel\\\\TermwindServiceProvider\"\n ]\n },\n \"branch-alias\": {\n \"dev-2.x\": \"2.x-dev\"\n }\n },\n \"autoload\": {\n \"files\": [\n \"src/Functions.php\"\n ],\n \"psr-4\": {\n \"Termwind\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Nuno Maduro\",\n \"email\": \"enunomaduro@gmail.com\"\n }\n ],\n \"description\": \"It's like Tailwind CSS, but for the console.\",\n \"keywords\": [\n \"cli\",\n \"console\",\n \"css\",\n \"package\",\n \"php\",\n \"style\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/nunomaduro/termwind/issues\",\n \"source\": \"https://github.com/nunomaduro/termwind/tree/v2.4.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://www.paypal.com/paypalme/enunomaduro\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/nunomaduro\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://github.com/xiCO2k\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2026-02-16T23:10:27+00:00\"\n },\n {\n \"name\": \"nyholm/dsn\",\n \"version\": \"2.0.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/Nyholm/dsn.git\",\n \"reference\": \"9445621b426bac8c0ca161db8cd700da00a4e618\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/Nyholm/dsn/zipball/9445621b426bac8c0ca161db8cd700da00a4e618\",\n \"reference\": \"9445621b426bac8c0ca161db8cd700da00a4e618\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=7.1\"\n },\n \"require-dev\": {\n \"symfony/phpunit-bridge\": \"^5.1\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"2.0-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Nyholm\\\\Dsn\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Tobias Nyholm\",\n \"email\": \"tobias.nyholm@gmail.com\"\n }\n ],\n \"description\": \"Parse your DSN strings in a powerful and flexible way\",\n \"homepage\": \"http://tnyholm.se\",\n \"keywords\": [\n \"database\",\n \"dsn\",\n \"dsn parser\",\n \"parser\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/Nyholm/dsn/issues\",\n \"source\": \"https://github.com/Nyholm/dsn/tree/2.0.1\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/Nyholm\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2021-11-18T09:23:29+00:00\"\n },\n {\n \"name\": \"nyholm/psr7\",\n \"version\": \"1.8.2\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/Nyholm/psr7.git\",\n \"reference\": \"a71f2b11690f4b24d099d6b16690a90ae14fc6f3\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/Nyholm/psr7/zipball/a71f2b11690f4b24d099d6b16690a90ae14fc6f3\",\n \"reference\": \"a71f2b11690f4b24d099d6b16690a90ae14fc6f3\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=7.2\",\n \"psr/http-factory\": \"^1.0\",\n \"psr/http-message\": \"^1.1 || ^2.0\"\n },\n \"provide\": {\n \"php-http/message-factory-implementation\": \"1.0\",\n \"psr/http-factory-implementation\": \"1.0\",\n \"psr/http-message-implementation\": \"1.0\"\n },\n \"require-dev\": {\n \"http-interop/http-factory-tests\": \"^0.9\",\n \"php-http/message-factory\": \"^1.0\",\n \"php-http/psr7-integration-tests\": \"^1.0\",\n \"phpunit/phpunit\": \"^7.5 || ^8.5 || ^9.4\",\n \"symfony/error-handler\": \"^4.4\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"1.8-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Nyholm\\\\Psr7\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Tobias Nyholm\",\n \"email\": \"tobias.nyholm@gmail.com\"\n },\n {\n \"name\": \"Martijn van der Ven\",\n \"email\": \"martijn@vanderven.se\"\n }\n ],\n \"description\": \"A fast PHP7 implementation of PSR-7\",\n \"homepage\": \"https://tnyholm.se\",\n \"keywords\": [\n \"psr-17\",\n \"psr-7\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/Nyholm/psr7/issues\",\n \"source\": \"https://github.com/Nyholm/psr7/tree/1.8.2\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/Zegnat\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://github.com/nyholm\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2024-09-09T07:06:30+00:00\"\n },\n {\n \"name\": \"nyholm/psr7-server\",\n \"version\": \"1.1.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/Nyholm/psr7-server.git\",\n \"reference\": \"4335801d851f554ca43fa6e7d2602141538854dc\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/Nyholm/psr7-server/zipball/4335801d851f554ca43fa6e7d2602141538854dc\",\n \"reference\": \"4335801d851f554ca43fa6e7d2602141538854dc\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \"^7.1 || ^8.0\",\n \"psr/http-factory\": \"^1.0\",\n \"psr/http-message\": \"^1.0 || ^2.0\"\n },\n \"require-dev\": {\n \"nyholm/nsa\": \"^1.1\",\n \"nyholm/psr7\": \"^1.3\",\n \"phpunit/phpunit\": \"^7.0 || ^8.5 || ^9.3\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Nyholm\\\\Psr7Server\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Tobias Nyholm\",\n \"email\": \"tobias.nyholm@gmail.com\"\n },\n {\n \"name\": \"Martijn van der Ven\",\n \"email\": \"martijn@vanderven.se\"\n }\n ],\n \"description\": \"Helper classes to handle PSR-7 server requests\",\n \"homepage\": \"http://tnyholm.se\",\n \"keywords\": [\n \"psr-17\",\n \"psr-7\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/Nyholm/psr7-server/issues\",\n \"source\": \"https://github.com/Nyholm/psr7-server/tree/1.1.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/Zegnat\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://github.com/nyholm\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2023-11-08T09:30:43+00:00\"\n },\n {\n \"name\": \"onelogin/php-saml\",\n \"version\": \"4.3.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/SAML-Toolkits/php-saml.git\",\n \"reference\": \"b009f160e4ac11f49366a45e0d45706b48429353\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/SAML-Toolkits/php-saml/zipball/b009f160e4ac11f49366a45e0d45706b48429353\",\n \"reference\": \"b009f160e4ac11f49366a45e0d45706b48429353\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=7.3\",\n \"robrichards/xmlseclibs\": \">=3.1.4\"\n },\n \"require-dev\": {\n \"pdepend/pdepend\": \"^2.8.0\",\n \"php-coveralls/php-coveralls\": \"^2.0\",\n \"phploc/phploc\": \"^4.0 || ^5.0 || ^6.0 || ^7.0\",\n \"phpunit/phpunit\": \"^9.5\",\n \"sebastian/phpcpd\": \"^4.0 || ^5.0 || ^6.0 \",\n \"squizlabs/php_codesniffer\": \"^3.5.8\"\n },\n \"suggest\": {\n \"ext-curl\": \"Install curl lib to be able to use the IdPMetadataParser for parsing remote XMLs\",\n \"ext-dom\": \"Install xml lib\",\n \"ext-openssl\": \"Install openssl lib in order to handle with x509 certs (require to support sign and encryption)\",\n \"ext-zlib\": \"Install zlib\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"OneLogin\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"description\": \"PHP SAML Toolkit\",\n \"homepage\": \"https://github.com/SAML-Toolkits/php-saml\",\n \"keywords\": [\n \"Federation\",\n \"SAML2\",\n \"SSO\",\n \"identity\",\n \"saml\"\n ],\n \"support\": {\n \"email\": \"sixto.martin.garcia@gmail.com\",\n \"issues\": \"https://github.com/onelogin/SAML-Toolkits/issues\",\n \"source\": \"https://github.com/onelogin/SAML-Toolkits/\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/SAML-Toolkits\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2025-12-09T10:50:49+00:00\"\n },\n {\n \"name\": \"open-telemetry/api\",\n \"version\": \"1.8.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/opentelemetry-php/api.git\",\n \"reference\": \"df5197c6fd0ddd8e9883b87de042d9341300e2ad\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/opentelemetry-php/api/zipball/df5197c6fd0ddd8e9883b87de042d9341300e2ad\",\n \"reference\": \"df5197c6fd0ddd8e9883b87de042d9341300e2ad\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"open-telemetry/context\": \"^1.4\",\n \"php\": \"^8.1\",\n \"psr/log\": \"^1.1|^2.0|^3.0\",\n \"symfony/polyfill-php82\": \"^1.26\"\n },\n \"conflict\": {\n \"open-telemetry/sdk\": \"<=1.11\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"spi\": {\n \"OpenTelemetry\\\\API\\\\Instrumentation\\\\AutoInstrumentation\\\\HookManagerInterface\": [\n \"OpenTelemetry\\\\API\\\\Instrumentation\\\\AutoInstrumentation\\\\ExtensionHookManager\"\n ]\n },\n \"branch-alias\": {\n \"dev-main\": \"1.8.x-dev\"\n }\n },\n \"autoload\": {\n \"files\": [\n \"Trace/functions.php\"\n ],\n \"psr-4\": {\n \"OpenTelemetry\\\\API\\\\\": \".\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"Apache-2.0\"\n ],\n \"authors\": [\n {\n \"name\": \"opentelemetry-php contributors\",\n \"homepage\": \"https://github.com/open-telemetry/opentelemetry-php/graphs/contributors\"\n }\n ],\n \"description\": \"API for OpenTelemetry PHP.\",\n \"keywords\": [\n \"Metrics\",\n \"api\",\n \"apm\",\n \"logging\",\n \"opentelemetry\",\n \"otel\",\n \"tracing\"\n ],\n \"support\": {\n \"chat\": \"https://app.slack.com/client/T08PSQ7BQ/C01NFPCV44V\",\n \"docs\": \"https://opentelemetry.io/docs/languages/php\",\n \"issues\": \"https://github.com/open-telemetry/opentelemetry-php/issues\",\n \"source\": \"https://github.com/open-telemetry/opentelemetry-php\"\n },\n \"time\": \"2026-01-21T04:14:03+00:00\"\n },\n {\n \"name\": \"open-telemetry/context\",\n \"version\": \"1.4.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/opentelemetry-php/context.git\",\n \"reference\": \"d4c4470b541ce72000d18c339cfee633e4c8e0cf\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/opentelemetry-php/context/zipball/d4c4470b541ce72000d18c339cfee633e4c8e0cf\",\n \"reference\": \"d4c4470b541ce72000d18c339cfee633e4c8e0cf\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \"^8.1\",\n \"symfony/polyfill-php82\": \"^1.26\"\n },\n \"suggest\": {\n \"ext-ffi\": \"To allow context switching in Fibers\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-main\": \"1.0.x-dev\"\n }\n },\n \"autoload\": {\n \"files\": [\n \"fiber/initialize_fiber_handler.php\"\n ],\n \"psr-4\": {\n \"OpenTelemetry\\\\Context\\\\\": \".\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"Apache-2.0\"\n ],\n \"authors\": [\n {\n \"name\": \"opentelemetry-php contributors\",\n \"homepage\": \"https://github.com/open-telemetry/opentelemetry-php/graphs/contributors\"\n }\n ],\n \"description\": \"Context implementation for OpenTelemetry PHP.\",\n \"keywords\": [\n \"Context\",\n \"opentelemetry\",\n \"otel\"\n ],\n \"support\": {\n \"chat\": \"https://app.slack.com/client/T08PSQ7BQ/C01NFPCV44V\",\n \"docs\": \"https://opentelemetry.io/docs/php\",\n \"issues\": \"https://github.com/open-telemetry/opentelemetry-php/issues\",\n \"source\": \"https://github.com/open-telemetry/opentelemetry-php\"\n },\n \"time\": \"2025-09-19T00:05:49+00:00\"\n },\n {\n \"name\": \"open-telemetry/sdk\",\n \"version\": \"1.13.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/opentelemetry-php/sdk.git\",\n \"reference\": \"c76f91203bf7ef98ab3f4e0a82ca21699af185e1\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/opentelemetry-php/sdk/zipball/c76f91203bf7ef98ab3f4e0a82ca21699af185e1\",\n \"reference\": \"c76f91203bf7ef98ab3f4e0a82ca21699af185e1\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"ext-json\": \"*\",\n \"nyholm/psr7-server\": \"^1.1\",\n \"open-telemetry/api\": \"^1.7\",\n \"open-telemetry/context\": \"^1.4\",\n \"open-telemetry/sem-conv\": \"^1.0\",\n \"php\": \"^8.1\",\n \"php-http/discovery\": \"^1.14\",\n \"psr/http-client\": \"^1.0\",\n \"psr/http-client-implementation\": \"^1.0\",\n \"psr/http-factory-implementation\": \"^1.0\",\n \"psr/http-message\": \"^1.0.1|^2.0\",\n \"psr/log\": \"^1.1|^2.0|^3.0\",\n \"ramsey/uuid\": \"^3.0 || ^4.0\",\n \"symfony/polyfill-mbstring\": \"^1.23\",\n \"symfony/polyfill-php82\": \"^1.26\",\n \"tbachert/spi\": \"^1.0.5\"\n },\n \"suggest\": {\n \"ext-gmp\": \"To support unlimited number of synchronous metric readers\",\n \"ext-mbstring\": \"To increase performance of string operations\",\n \"open-telemetry/sdk-configuration\": \"File-based OpenTelemetry SDK configuration\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"spi\": {\n \"OpenTelemetry\\\\API\\\\Configuration\\\\ConfigEnv\\\\EnvComponentLoader\": [\n \"OpenTelemetry\\\\API\\\\Instrumentation\\\\Configuration\\\\General\\\\ConfigEnv\\\\EnvComponentLoaderHttpConfig\",\n \"OpenTelemetry\\\\API\\\\Instrumentation\\\\Configuration\\\\General\\\\ConfigEnv\\\\EnvComponentLoaderPeerConfig\"\n ],\n \"OpenTelemetry\\\\SDK\\\\Common\\\\Configuration\\\\Resolver\\\\ResolverInterface\": [\n \"OpenTelemetry\\\\SDK\\\\Common\\\\Configuration\\\\Resolver\\\\SdkConfigurationResolver\"\n ],\n \"OpenTelemetry\\\\API\\\\Instrumentation\\\\AutoInstrumentation\\\\HookManagerInterface\": [\n \"OpenTelemetry\\\\API\\\\Instrumentation\\\\AutoInstrumentation\\\\ExtensionHookManager\"\n ]\n },\n \"branch-alias\": {\n \"dev-main\": \"1.12.x-dev\"\n }\n },\n \"autoload\": {\n \"files\": [\n \"Common/Util/functions.php\",\n \"Logs/Exporter/_register.php\",\n \"Metrics/MetricExporter/_register.php\",\n \"Propagation/_register.php\",\n \"Trace/SpanExporter/_register.php\",\n \"Common/Dev/Compatibility/_load.php\",\n \"_autoload.php\"\n ],\n \"psr-4\": {\n \"OpenTelemetry\\\\SDK\\\\\": \".\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"Apache-2.0\"\n ],\n \"authors\": [\n {\n \"name\": \"opentelemetry-php contributors\",\n \"homepage\": \"https://github.com/open-telemetry/opentelemetry-php/graphs/contributors\"\n }\n ],\n \"description\": \"SDK for OpenTelemetry PHP.\",\n \"keywords\": [\n \"Metrics\",\n \"apm\",\n \"logging\",\n \"opentelemetry\",\n \"otel\",\n \"sdk\",\n \"tracing\"\n ],\n \"support\": {\n \"chat\": \"https://app.slack.com/client/T08PSQ7BQ/C01NFPCV44V\",\n \"docs\": \"https://opentelemetry.io/docs/languages/php\",\n \"issues\": \"https://github.com/open-telemetry/opentelemetry-php/issues\",\n \"source\": \"https://github.com/open-telemetry/opentelemetry-php\"\n },\n \"time\": \"2026-01-28T11:38:11+00:00\"\n },\n {\n \"name\": \"open-telemetry/sem-conv\",\n \"version\": \"1.38.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/opentelemetry-php/sem-conv.git\",\n \"reference\": \"e613bc640a407def4991b8a936a9b27edd9a3240\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/opentelemetry-php/sem-conv/zipball/e613bc640a407def4991b8a936a9b27edd9a3240\",\n \"reference\": \"e613bc640a407def4991b8a936a9b27edd9a3240\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \"^8.0\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-main\": \"1.x-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"OpenTelemetry\\\\SemConv\\\\\": \".\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"Apache-2.0\"\n ],\n \"authors\": [\n {\n \"name\": \"opentelemetry-php contributors\",\n \"homepage\": \"https://github.com/open-telemetry/opentelemetry-php/graphs/contributors\"\n }\n ],\n \"description\": \"Semantic conventions for OpenTelemetry PHP.\",\n \"keywords\": [\n \"Metrics\",\n \"apm\",\n \"logging\",\n \"opentelemetry\",\n \"otel\",\n \"semantic conventions\",\n \"semconv\",\n \"tracing\"\n ],\n \"support\": {\n \"chat\": \"https://app.slack.com/client/T08PSQ7BQ/C01NFPCV44V\",\n \"docs\": \"https://opentelemetry.io/docs/languages/php\",\n \"issues\": \"https://github.com/open-telemetry/opentelemetry-php/issues\",\n \"source\": \"https://github.com/open-telemetry/opentelemetry-php\"\n },\n \"time\": \"2026-01-21T04:14:03+00:00\"\n },\n {\n \"name\": \"paragonie/constant_time_encoding\",\n \"version\": \"v3.1.3\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/paragonie/constant_time_encoding.git\",\n \"reference\": \"d5b01a39b3415c2cd581d3bd3a3575c1ebbd8e77\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/paragonie/constant_time_encoding/zipball/d5b01a39b3415c2cd581d3bd3a3575c1ebbd8e77\",\n \"reference\": \"d5b01a39b3415c2cd581d3bd3a3575c1ebbd8e77\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \"^8\"\n },\n \"require-dev\": {\n \"infection/infection\": \"^0\",\n \"nikic/php-fuzzer\": \"^0\",\n \"phpunit/phpunit\": \"^9|^10|^11\",\n \"vimeo/psalm\": \"^4|^5|^6\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"ParagonIE\\\\ConstantTime\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Paragon Initiative Enterprises\",\n \"email\": \"security@paragonie.com\",\n \"homepage\": \"https://paragonie.com\",\n \"role\": \"Maintainer\"\n },\n {\n \"name\": \"Steve 'Sc00bz' Thomas\",\n \"email\": \"steve@tobtu.com\",\n \"homepage\": \"https://www.tobtu.com\",\n \"role\": \"Original Developer\"\n }\n ],\n \"description\": \"Constant-time Implementations of RFC 4648 Encoding (Base-64, Base-32, Base-16)\",\n \"keywords\": [\n \"base16\",\n \"base32\",\n \"base32_decode\",\n \"base32_encode\",\n \"base64\",\n \"base64_decode\",\n \"base64_encode\",\n \"bin2hex\",\n \"encoding\",\n \"hex\",\n \"hex2bin\",\n \"rfc4648\"\n ],\n \"support\": {\n \"email\": \"info@paragonie.com\",\n \"issues\": \"https://github.com/paragonie/constant_time_encoding/issues\",\n \"source\": \"https://github.com/paragonie/constant_time_encoding\"\n },\n \"time\": \"2025-09-24T15:06:41+00:00\"\n },\n {\n \"name\": \"paragonie/random_compat\",\n \"version\": \"v9.99.100\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/paragonie/random_compat.git\",\n \"reference\": \"996434e5492cb4c3edcb9168db6fbb1359ef965a\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/paragonie/random_compat/zipball/996434e5492cb4c3edcb9168db6fbb1359ef965a\",\n \"reference\": \"996434e5492cb4c3edcb9168db6fbb1359ef965a\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">= 7\"\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \"4.*|5.*\",\n \"vimeo/psalm\": \"^1\"\n },\n \"suggest\": {\n \"ext-libsodium\": \"Provides a modern crypto API that can be used to generate random bytes.\"\n },\n \"type\": \"library\",\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Paragon Initiative Enterprises\",\n \"email\": \"security@paragonie.com\",\n \"homepage\": \"https://paragonie.com\"\n }\n ],\n \"description\": \"PHP 5.x polyfill for random_bytes() and random_int() from PHP 7\",\n \"keywords\": [\n \"csprng\",\n \"polyfill\",\n \"pseudorandom\",\n \"random\"\n ],\n \"support\": {\n \"email\": \"info@paragonie.com\",\n \"issues\": \"https://github.com/paragonie/random_compat/issues\",\n \"source\": \"https://github.com/paragonie/random_compat\"\n },\n \"time\": \"2020-10-15T08:29:30+00:00\"\n },\n {\n \"name\": \"paragonie/sodium_compat\",\n \"version\": \"v1.24.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/paragonie/sodium_compat.git\",\n \"reference\": \"2cb48f26130919f92f30650bdcc30e6f4ebe45ac\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/paragonie/sodium_compat/zipball/2cb48f26130919f92f30650bdcc30e6f4ebe45ac\",\n \"reference\": \"2cb48f26130919f92f30650bdcc30e6f4ebe45ac\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"paragonie/random_compat\": \">=1\",\n \"php\": \"^5.2.4|^5.3|^5.4|^5.5|^5.6|^7|^8\"\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \"^3|^4|^5|^6|^7|^8|^9\"\n },\n \"suggest\": {\n \"ext-libsodium\": \"PHP < 7.0: Better performance, password hashing (Argon2i), secure memory management (memzero), and better security.\",\n \"ext-sodium\": \"PHP >= 7.0: Better performance, password hashing (Argon2i), secure memory management (memzero), and better security.\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"files\": [\n \"autoload.php\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"ISC\"\n ],\n \"authors\": [\n {\n \"name\": \"Paragon Initiative Enterprises\",\n \"email\": \"security@paragonie.com\"\n },\n {\n \"name\": \"Frank Denis\",\n \"email\": \"jedisct1@pureftpd.org\"\n }\n ],\n \"description\": \"Pure PHP implementation of libsodium; uses the PHP extension if it exists\",\n \"keywords\": [\n \"Authentication\",\n \"BLAKE2b\",\n \"ChaCha20\",\n \"ChaCha20-Poly1305\",\n \"Chapoly\",\n \"Curve25519\",\n \"Ed25519\",\n \"EdDSA\",\n \"Edwards-curve Digital Signature Algorithm\",\n \"Elliptic Curve Diffie-Hellman\",\n \"Poly1305\",\n \"Pure-PHP cryptography\",\n \"RFC 7748\",\n \"RFC 8032\",\n \"Salpoly\",\n \"Salsa20\",\n \"X25519\",\n \"XChaCha20-Poly1305\",\n \"XSalsa20-Poly1305\",\n \"Xchacha20\",\n \"Xsalsa20\",\n \"aead\",\n \"cryptography\",\n \"ecdh\",\n \"elliptic curve\",\n \"elliptic curve cryptography\",\n \"encryption\",\n \"libsodium\",\n \"php\",\n \"public-key cryptography\",\n \"secret-key cryptography\",\n \"side-channel resistant\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/paragonie/sodium_compat/issues\",\n \"source\": \"https://github.com/paragonie/sodium_compat/tree/v1.24.0\"\n },\n \"time\": \"2025-12-30T16:16:35+00:00\"\n },\n {\n \"name\": \"phlib/sms-length\",\n \"version\": \"2.0.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/phlib/sms-length.git\",\n \"reference\": \"8fcb9908c52a9f5e6d7c4e6646e32f539f0fd63b\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/phlib/sms-length/zipball/8fcb9908c52a9f5e6d7c4e6646e32f539f0fd63b\",\n \"reference\": \"8fcb9908c52a9f5e6d7c4e6646e32f539f0fd63b\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"ext-mbstring\": \"*\",\n \"php\": \"^7.3|^8.0\"\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \"^9\",\n \"symplify/easy-coding-standard\": \"^9\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Phlib\\\\SmsLength\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"LGPL-3.0\"\n ],\n \"authors\": [\n {\n \"name\": \"Chris Minett\",\n \"role\": \"developer\"\n }\n ],\n \"description\": \"SMS Length calculations, using GSM 03.38 and GSM 03.40\",\n \"keywords\": [\n \"gsm\",\n \"length\",\n \"message\",\n \"size\",\n \"sms\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/phlib/sms-length/issues\",\n \"source\": \"https://github.com/phlib/sms-length/tree/2.0.1\"\n },\n \"time\": \"2022-06-26T04:31:23+00:00\"\n },\n {\n \"name\": \"php-di/invoker\",\n \"version\": \"2.3.7\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/PHP-DI/Invoker.git\",\n \"reference\": \"3c1ddfdef181431fbc4be83378f6d036d59e81e1\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/PHP-DI/Invoker/zipball/3c1ddfdef181431fbc4be83378f6d036d59e81e1\",\n \"reference\": \"3c1ddfdef181431fbc4be83378f6d036d59e81e1\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=7.3\",\n \"psr/container\": \"^1.0|^2.0\"\n },\n \"require-dev\": {\n \"athletic/athletic\": \"~0.1.8\",\n \"mnapoli/hard-mode\": \"~0.3.0\",\n \"phpunit/phpunit\": \"^9.0 || ^10 || ^11 || ^12\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Invoker\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"description\": \"Generic and extensible callable invoker\",\n \"homepage\": \"https://github.com/PHP-DI/Invoker\",\n \"keywords\": [\n \"callable\",\n \"dependency\",\n \"dependency-injection\",\n \"injection\",\n \"invoke\",\n \"invoker\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/PHP-DI/Invoker/issues\",\n \"source\": \"https://github.com/PHP-DI/Invoker/tree/2.3.7\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/mnapoli\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2025-08-30T10:22:22+00:00\"\n },\n {\n \"name\": \"php-di/php-di\",\n \"version\": \"7.1.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/PHP-DI/PHP-DI.git\",\n \"reference\": \"f88054cc052e40dbe7b383c8817c19442d480352\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/PHP-DI/PHP-DI/zipball/f88054cc052e40dbe7b383c8817c19442d480352\",\n \"reference\": \"f88054cc052e40dbe7b383c8817c19442d480352\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"laravel/serializable-closure\": \"^1.0 || ^2.0\",\n \"php\": \">=8.0\",\n \"php-di/invoker\": \"^2.0\",\n \"psr/container\": \"^1.1 || ^2.0\"\n },\n \"provide\": {\n \"psr/container-implementation\": \"^1.0\"\n },\n \"require-dev\": {\n \"friendsofphp/php-cs-fixer\": \"^3\",\n \"friendsofphp/proxy-manager-lts\": \"^1\",\n \"mnapoli/phpunit-easymock\": \"^1.3\",\n \"phpunit/phpunit\": \"^9.6 || ^10 || ^11\",\n \"vimeo/psalm\": \"^5|^6\"\n },\n \"suggest\": {\n \"friendsofphp/proxy-manager-lts\": \"Install it if you want to use lazy injection (version ^1)\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"files\": [\n \"src/functions.php\"\n ],\n \"psr-4\": {\n \"DI\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"description\": \"The dependency injection container for humans\",\n \"homepage\": \"https://php-di.org/\",\n \"keywords\": [\n \"PSR-11\",\n \"container\",\n \"container-interop\",\n \"dependency injection\",\n \"di\",\n \"ioc\",\n \"psr11\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/PHP-DI/PHP-DI/issues\",\n \"source\": \"https://github.com/PHP-DI/PHP-DI/tree/7.1.1\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/mnapoli\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/php-di/php-di\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2025-08-16T11:10:48+00:00\"\n },\n {\n \"name\": \"php-ffmpeg/php-ffmpeg\",\n \"version\": \"v1.3.2\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/PHP-FFMpeg/PHP-FFMpeg.git\",\n \"reference\": \"8e74bdc07ad200da7a6cfb21ec2652875e4368e0\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/PHP-FFMpeg/PHP-FFMpeg/zipball/8e74bdc07ad200da7a6cfb21ec2652875e4368e0\",\n \"reference\": \"8e74bdc07ad200da7a6cfb21ec2652875e4368e0\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"evenement/evenement\": \"^3.0\",\n \"php\": \"^8.0 || ^8.1 || ^8.2 || ^8.3 || ^8.4\",\n \"psr/log\": \"^1.0 || ^2.0 || ^3.0\",\n \"spatie/temporary-directory\": \"^2.0\",\n \"symfony/cache\": \"^5.4 || ^6.0 || ^7.0\",\n \"symfony/process\": \"^5.4 || ^6.0 || ^7.0\"\n },\n \"require-dev\": {\n \"mockery/mockery\": \"^1.5\",\n \"phpunit/phpunit\": \"^9.5.10 || ^10.0\"\n },\n \"suggest\": {\n \"php-ffmpeg/extras\": \"A compilation of common audio & video drivers for PHP-FFMpeg\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"FFMpeg\\\\\": \"src/FFMpeg\",\n \"Alchemy\\\\BinaryDriver\\\\\": \"src/Alchemy/BinaryDriver\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Romain Neutron\",\n \"email\": \"imprec@gmail.com\",\n \"homepage\": \"http://www.lickmychip.com/\"\n },\n {\n \"name\": \"Phraseanet Team\",\n \"email\": \"info@alchemy.fr\",\n \"homepage\": \"http://www.phraseanet.com/\"\n },\n {\n \"name\": \"Patrik Karisch\",\n \"email\": \"patrik@karisch.guru\",\n \"homepage\": \"http://www.karisch.guru\"\n },\n {\n \"name\": \"Romain Biard\",\n \"email\": \"romain.biard@gmail.com\",\n \"homepage\": \"https://www.strime.io/\"\n },\n {\n \"name\": \"Jens Hausdorf\",\n \"email\": \"hello@jens-hausdorf.de\",\n \"homepage\": \"https://jens-hausdorf.de\"\n },\n {\n \"name\": \"Pascal Baljet\",\n \"email\": \"pascal@protone.media\",\n \"homepage\": \"https://protone.media\"\n }\n ],\n \"description\": \"FFMpeg PHP, an Object Oriented library to communicate with AVconv / ffmpeg\",\n \"keywords\": [\n \"audio\",\n \"audio processing\",\n \"avconv\",\n \"avprobe\",\n \"ffmpeg\",\n \"ffprobe\",\n \"video\",\n \"video processing\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/PHP-FFMpeg/PHP-FFMpeg/issues\",\n \"source\": \"https://github.com/PHP-FFMpeg/PHP-FFMpeg/tree/v1.3.2\"\n },\n \"time\": \"2025-04-01T20:36:46+00:00\"\n },\n {\n \"name\": \"php-http/client-common\",\n \"version\": \"2.7.2\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/php-http/client-common.git\",\n \"reference\": \"0cfe9858ab9d3b213041b947c881d5b19ceeca46\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/php-http/client-common/zipball/0cfe9858ab9d3b213041b947c881d5b19ceeca46\",\n \"reference\": \"0cfe9858ab9d3b213041b947c881d5b19ceeca46\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \"^7.1 || ^8.0\",\n \"php-http/httplug\": \"^2.0\",\n \"php-http/message\": \"^1.6\",\n \"psr/http-client\": \"^1.0\",\n \"psr/http-factory\": \"^1.0\",\n \"psr/http-message\": \"^1.0 || ^2.0\",\n \"symfony/options-resolver\": \"~4.0.15 || ~4.1.9 || ^4.2.1 || ^5.0 || ^6.0 || ^7.0\",\n \"symfony/polyfill-php80\": \"^1.17\"\n },\n \"require-dev\": {\n \"doctrine/instantiator\": \"^1.1\",\n \"guzzlehttp/psr7\": \"^1.4\",\n \"nyholm/psr7\": \"^1.2\",\n \"phpspec/phpspec\": \"^5.1 || ^6.3 || ^7.1\",\n \"phpspec/prophecy\": \"^1.10.2\",\n \"phpunit/phpunit\": \"^7.5.20 || ^8.5.33 || ^9.6.7\"\n },\n \"suggest\": {\n \"ext-json\": \"To detect JSON responses with the ContentTypePlugin\",\n \"ext-libxml\": \"To detect XML responses with the ContentTypePlugin\",\n \"php-http/cache-plugin\": \"PSR-6 Cache plugin\",\n \"php-http/logger-plugin\": \"PSR-3 Logger plugin\",\n \"php-http/stopwatch-plugin\": \"Symfony Stopwatch plugin\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Http\\\\Client\\\\Common\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Márk Sági-Kazár\",\n \"email\": \"mark.sagikazar@gmail.com\"\n }\n ],\n \"description\": \"Common HTTP Client implementations and tools for HTTPlug\",\n \"homepage\": \"http://httplug.io\",\n \"keywords\": [\n \"client\",\n \"common\",\n \"http\",\n \"httplug\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/php-http/client-common/issues\",\n \"source\": \"https://github.com/php-http/client-common/tree/2.7.2\"\n },\n \"time\": \"2024-09-24T06:21:48+00:00\"\n },\n {\n \"name\": \"php-http/curl-client\",\n \"version\": \"2.3.3\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/php-http/curl-client.git\",\n \"reference\": \"f3eb48d266341afec0229a7a37a03521d3646b81\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/php-http/curl-client/zipball/f3eb48d266341afec0229a7a37a03521d3646b81\",\n \"reference\": \"f3eb48d266341afec0229a7a37a03521d3646b81\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"ext-curl\": \"*\",\n \"php\": \"^7.4 || ^8.0\",\n \"php-http/discovery\": \"^1.6\",\n \"php-http/httplug\": \"^2.0\",\n \"php-http/message\": \"^1.2\",\n \"psr/http-client\": \"^1.0\",\n \"psr/http-factory-implementation\": \"^1.0\",\n \"symfony/options-resolver\": \"^3.4 || ^4.0 || ^5.0 || ^6.0 || ^7.0\"\n },\n \"provide\": {\n \"php-http/async-client-implementation\": \"1.0\",\n \"php-http/client-implementation\": \"1.0\",\n \"psr/http-client-implementation\": \"1.0\"\n },\n \"require-dev\": {\n \"guzzlehttp/psr7\": \"^2.0\",\n \"laminas/laminas-diactoros\": \"^2.0 || ^3.0\",\n \"php-http/client-integration-tests\": \"^3.0\",\n \"php-http/message-factory\": \"^1.1\",\n \"phpunit/phpunit\": \"^7.5 || ^9.4\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Http\\\\Client\\\\Curl\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Михаил Красильников\",\n \"email\": \"m.krasilnikov@yandex.ru\"\n }\n ],\n \"description\": \"PSR-18 and HTTPlug Async client with cURL\",\n \"homepage\": \"http://php-http.org\",\n \"keywords\": [\n \"curl\",\n \"http\",\n \"psr-18\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/php-http/curl-client/issues\",\n \"source\": \"https://github.com/php-http/curl-client/tree/2.3.3\"\n },\n \"time\": \"2024-10-31T07:36:58+00:00\"\n },\n {\n \"name\": \"php-http/discovery\",\n \"version\": \"1.20.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/php-http/discovery.git\",\n \"reference\": \"82fe4c73ef3363caed49ff8dd1539ba06044910d\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/php-http/discovery/zipball/82fe4c73ef3363caed49ff8dd1539ba06044910d\",\n \"reference\": \"82fe4c73ef3363caed49ff8dd1539ba06044910d\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"composer-plugin-api\": \"^1.0|^2.0\",\n \"php\": \"^7.1 || ^8.0\"\n },\n \"conflict\": {\n \"nyholm/psr7\": \"<1.0\",\n \"zendframework/zend-diactoros\": \"*\"\n },\n \"provide\": {\n \"php-http/async-client-implementation\": \"*\",\n \"php-http/client-implementation\": \"*\",\n \"psr/http-client-implementation\": \"*\",\n \"psr/http-factory-implementation\": \"*\",\n \"psr/http-message-implementation\": \"*\"\n },\n \"require-dev\": {\n \"composer/composer\": \"^1.0.2|^2.0\",\n \"graham-campbell/phpspec-skip-example-extension\": \"^5.0\",\n \"php-http/httplug\": \"^1.0 || ^2.0\",\n \"php-http/message-factory\": \"^1.0\",\n \"phpspec/phpspec\": \"^5.1 || ^6.1 || ^7.3\",\n \"sebastian/comparator\": \"^3.0.5 || ^4.0.8\",\n \"symfony/phpunit-bridge\": \"^6.4.4 || ^7.0.1\"\n },\n \"type\": \"composer-plugin\",\n \"extra\": {\n \"class\": \"Http\\\\Discovery\\\\Composer\\\\Plugin\",\n \"plugin-optional\": true\n },\n \"autoload\": {\n \"psr-4\": {\n \"Http\\\\Discovery\\\\\": \"src/\"\n },\n \"exclude-from-classmap\": [\n \"src/Composer/Plugin.php\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Márk Sági-Kazár\",\n \"email\": \"mark.sagikazar@gmail.com\"\n }\n ],\n \"description\": \"Finds and installs PSR-7, PSR-17, PSR-18 and HTTPlug implementations\",\n \"homepage\": \"http://php-http.org\",\n \"keywords\": [\n \"adapter\",\n \"client\",\n \"discovery\",\n \"factory\",\n \"http\",\n \"message\",\n \"psr17\",\n \"psr7\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/php-http/discovery/issues\",\n \"source\": \"https://github.com/php-http/discovery/tree/1.20.0\"\n },\n \"time\": \"2024-10-02T11:20:13+00:00\"\n },\n {\n \"name\": \"php-http/httplug\",\n \"version\": \"2.4.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/php-http/httplug.git\",\n \"reference\": \"5cad731844891a4c282f3f3e1b582c46839d22f4\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/php-http/httplug/zipball/5cad731844891a4c282f3f3e1b582c46839d22f4\",\n \"reference\": \"5cad731844891a4c282f3f3e1b582c46839d22f4\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \"^7.1 || ^8.0\",\n \"php-http/promise\": \"^1.1\",\n \"psr/http-client\": \"^1.0\",\n \"psr/http-message\": \"^1.0 || ^2.0\"\n },\n \"require-dev\": {\n \"friends-of-phpspec/phpspec-code-coverage\": \"^4.1 || ^5.0 || ^6.0\",\n \"phpspec/phpspec\": \"^5.1 || ^6.0 || ^7.0\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Http\\\\Client\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Eric GELOEN\",\n \"email\": \"geloen.eric@gmail.com\"\n },\n {\n \"name\": \"Márk Sági-Kazár\",\n \"email\": \"mark.sagikazar@gmail.com\",\n \"homepage\": \"https://sagikazarmark.hu\"\n }\n ],\n \"description\": \"HTTPlug, the HTTP client abstraction for PHP\",\n \"homepage\": \"http://httplug.io\",\n \"keywords\": [\n \"client\",\n \"http\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/php-http/httplug/issues\",\n \"source\": \"https://github.com/php-http/httplug/tree/2.4.1\"\n },\n \"time\": \"2024-09-23T11:39:58+00:00\"\n },\n {\n \"name\": \"php-http/message\",\n \"version\": \"1.16.2\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/php-http/message.git\",\n \"reference\": \"06dd5e8562f84e641bf929bfe699ee0f5ce8080a\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/php-http/message/zipball/06dd5e8562f84e641bf929bfe699ee0f5ce8080a\",\n \"reference\": \"06dd5e8562f84e641bf929bfe699ee0f5ce8080a\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"clue/stream-filter\": \"^1.5\",\n \"php\": \"^7.2 || ^8.0\",\n \"psr/http-message\": \"^1.1 || ^2.0\"\n },\n \"provide\": {\n \"php-http/message-factory-implementation\": \"1.0\"\n },\n \"require-dev\": {\n \"ergebnis/composer-normalize\": \"^2.6\",\n \"ext-zlib\": \"*\",\n \"guzzlehttp/psr7\": \"^1.0 || ^2.0\",\n \"laminas/laminas-diactoros\": \"^2.0 || ^3.0\",\n \"php-http/message-factory\": \"^1.0.2\",\n \"phpspec/phpspec\": \"^5.1 || ^6.3 || ^7.1\",\n \"slim/slim\": \"^3.0\"\n },\n \"suggest\": {\n \"ext-zlib\": \"Used with compressor/decompressor streams\",\n \"guzzlehttp/psr7\": \"Used with Guzzle PSR-7 Factories\",\n \"laminas/laminas-diactoros\": \"Used with Diactoros Factories\",\n \"slim/slim\": \"Used with Slim Framework PSR-7 implementation\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"files\": [\n \"src/filters.php\"\n ],\n \"psr-4\": {\n \"Http\\\\Message\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Márk Sági-Kazár\",\n \"email\": \"mark.sagikazar@gmail.com\"\n }\n ],\n \"description\": \"HTTP Message related tools\",\n \"homepage\": \"http://php-http.org\",\n \"keywords\": [\n \"http\",\n \"message\",\n \"psr-7\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/php-http/message/issues\",\n \"source\": \"https://github.com/php-http/message/tree/1.16.2\"\n },\n \"time\": \"2024-10-02T11:34:13+00:00\"\n },\n {\n \"name\": \"php-http/multipart-stream-builder\",\n \"version\": \"1.4.2\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/php-http/multipart-stream-builder.git\",\n \"reference\": \"10086e6de6f53489cca5ecc45b6f468604d3460e\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/php-http/multipart-stream-builder/zipball/10086e6de6f53489cca5ecc45b6f468604d3460e\",\n \"reference\": \"10086e6de6f53489cca5ecc45b6f468604d3460e\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \"^7.1 || ^8.0\",\n \"php-http/discovery\": \"^1.15\",\n \"psr/http-factory-implementation\": \"^1.0\"\n },\n \"require-dev\": {\n \"nyholm/psr7\": \"^1.0\",\n \"php-http/message\": \"^1.5\",\n \"php-http/message-factory\": \"^1.0.2\",\n \"phpunit/phpunit\": \"^7.5.15 || ^8.5 || ^9.3\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Http\\\\Message\\\\MultipartStream\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Tobias Nyholm\",\n \"email\": \"tobias.nyholm@gmail.com\"\n }\n ],\n \"description\": \"A builder class that help you create a multipart stream\",\n \"homepage\": \"http://php-http.org\",\n \"keywords\": [\n \"factory\",\n \"http\",\n \"message\",\n \"multipart stream\",\n \"stream\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/php-http/multipart-stream-builder/issues\",\n \"source\": \"https://github.com/php-http/multipart-stream-builder/tree/1.4.2\"\n },\n \"time\": \"2024-09-04T13:22:54+00:00\"\n },\n {\n \"name\": \"php-http/promise\",\n \"version\": \"1.2.2\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/php-http/promise.git\",\n \"reference\": \"b81bdf5a8e82a065fd73eb82919f28e0ac4d2a1b\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/php-http/promise/zipball/b81bdf5a8e82a065fd73eb82919f28e0ac4d2a1b\",\n \"reference\": \"b81bdf5a8e82a065fd73eb82919f28e0ac4d2a1b\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \"^7.1 || ^8.0\"\n },\n \"require-dev\": {\n \"friends-of-phpspec/phpspec-code-coverage\": \"^4.3.2 || ^6.3\",\n \"phpspec/phpspec\": \"^5.1.2 || ^6.2 || ^7.4\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Http\\\\Promise\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Joel Wurtz\",\n \"email\": \"joel.wurtz@gmail.com\"\n },\n {\n \"name\": \"Márk Sági-Kazár\",\n \"email\": \"mark.sagikazar@gmail.com\"\n }\n ],\n \"description\": \"Promise used for asynchronous HTTP requests\",\n \"homepage\": \"http://httplug.io\",\n \"keywords\": [\n \"promise\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/php-http/promise/issues\",\n \"source\": \"https://github.com/php-http/promise/tree/1.2.2\"\n },\n \"time\": \"2025-11-08T15:23:07+00:00\"\n },\n {\n \"name\": \"php-jsonpointer/php-jsonpointer\",\n \"version\": \"v4.0.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/raphaelstolt/php-jsonpointer.git\",\n \"reference\": \"fd50fc1aecd80dedb5bc59c9a1d70d4cfec7933b\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/raphaelstolt/php-jsonpointer/zipball/fd50fc1aecd80dedb5bc59c9a1d70d4cfec7933b\",\n \"reference\": \"fd50fc1aecd80dedb5bc59c9a1d70d4cfec7933b\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=7.4\"\n },\n \"require-dev\": {\n \"friendsofphp/php-cs-fixer\": \"^3.0\",\n \"phpunit/phpunit\": \"8.*\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"2.0.x-dev\"\n }\n },\n \"autoload\": {\n \"psr-0\": {\n \"Rs\\\\Json\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Raphael Stolt\",\n \"email\": \"raphael.stolt@gmail.com\",\n \"homepage\": \"http://raphaelstolt.blogspot.com/\"\n }\n ],\n \"description\": \"Implementation of JSON Pointer (http://tools.ietf.org/html/rfc6901)\",\n \"homepage\": \"https://github.com/raphaelstolt/php-jsonpointer\",\n \"keywords\": [\n \"json\",\n \"json pointer\",\n \"json traversal\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/raphaelstolt/php-jsonpointer/issues\",\n \"source\": \"https://github.com/raphaelstolt/php-jsonpointer/tree/v4.0.0\"\n },\n \"time\": \"2022-01-11T14:28:07+00:00\"\n },\n {\n \"name\": \"phpoption/phpoption\",\n \"version\": \"1.9.5\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/schmittjoh/php-option.git\",\n \"reference\": \"75365b91986c2405cf5e1e012c5595cd487a98be\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/schmittjoh/php-option/zipball/75365b91986c2405cf5e1e012c5595cd487a98be\",\n \"reference\": \"75365b91986c2405cf5e1e012c5595cd487a98be\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \"^7.2.5 || ^8.0\"\n },\n \"require-dev\": {\n \"bamarni/composer-bin-plugin\": \"^1.8.2\",\n \"phpunit/phpunit\": \"^8.5.44 || ^9.6.25 || ^10.5.53 || ^11.5.34\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"bamarni-bin\": {\n \"bin-links\": true,\n \"forward-command\": false\n },\n \"branch-alias\": {\n \"dev-master\": \"1.9-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"PhpOption\\\\\": \"src/PhpOption/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"Apache-2.0\"\n ],\n \"authors\": [\n {\n \"name\": \"Johannes M. Schmitt\",\n \"email\": \"schmittjoh@gmail.com\",\n \"homepage\": \"https://github.com/schmittjoh\"\n },\n {\n \"name\": \"Graham Campbell\",\n \"email\": \"hello@gjcampbell.co.uk\",\n \"homepage\": \"https://github.com/GrahamCampbell\"\n }\n ],\n \"description\": \"Option Type for PHP\",\n \"keywords\": [\n \"language\",\n \"option\",\n \"php\",\n \"type\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/schmittjoh/php-option/issues\",\n \"source\": \"https://github.com/schmittjoh/php-option/tree/1.9.5\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/GrahamCampbell\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/phpoption/phpoption\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2025-12-27T19:41:33+00:00\"\n },\n {\n \"name\": \"phpseclib/phpseclib\",\n \"version\": \"3.0.51\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/phpseclib/phpseclib.git\",\n \"reference\": \"d59c94077f9c9915abb51ddb52ce85188ece1748\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/phpseclib/phpseclib/zipball/d59c94077f9c9915abb51ddb52ce85188ece1748\",\n \"reference\": \"d59c94077f9c9915abb51ddb52ce85188ece1748\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"paragonie/constant_time_encoding\": \"^1|^2|^3\",\n \"paragonie/random_compat\": \"^1.4|^2.0|^9.99.99\",\n \"php\": \">=5.6.1\"\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \"*\"\n },\n \"suggest\": {\n \"ext-dom\": \"Install the DOM extension to load XML formatted public keys.\",\n \"ext-gmp\": \"Install the GMP (GNU Multiple Precision) extension in order to speed up arbitrary precision integer arithmetic operations.\",\n \"ext-libsodium\": \"SSH2/SFTP can make use of some algorithms provided by the libsodium-php extension.\",\n \"ext-mcrypt\": \"Install the Mcrypt extension in order to speed up a few other cryptographic operations.\",\n \"ext-openssl\": \"Install the OpenSSL extension in order to speed up a wide variety of cryptographic operations.\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"files\": [\n \"phpseclib/bootstrap.php\"\n ],\n \"psr-4\": {\n \"phpseclib3\\\\\": \"phpseclib/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Jim Wigginton\",\n \"email\": \"terrafrost@php.net\",\n \"role\": \"Lead Developer\"\n },\n {\n \"name\": \"Patrick Monnerat\",\n \"email\": \"pm@datasphere.ch\",\n \"role\": \"Developer\"\n },\n {\n \"name\": \"Andreas Fischer\",\n \"email\": \"bantu@phpbb.com\",\n \"role\": \"Developer\"\n },\n {\n \"name\": \"Hans-Jürgen Petrich\",\n \"email\": \"petrich@tronic-media.com\",\n \"role\": \"Developer\"\n },\n {\n \"name\": \"Graham Campbell\",\n \"email\": \"graham@alt-three.com\",\n \"role\": \"Developer\"\n }\n ],\n \"description\": \"PHP Secure Communications Library - Pure-PHP implementations of RSA, AES, SSH2, SFTP, X.509 etc.\",\n \"homepage\": \"http://phpseclib.sourceforge.net\",\n \"keywords\": [\n \"BigInteger\",\n \"aes\",\n \"asn.1\",\n \"asn1\",\n \"blowfish\",\n \"crypto\",\n \"cryptography\",\n \"encryption\",\n \"rsa\",\n \"security\",\n \"sftp\",\n \"signature\",\n \"signing\",\n \"ssh\",\n \"twofish\",\n \"x.509\",\n \"x509\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/phpseclib/phpseclib/issues\",\n \"source\": \"https://github.com/phpseclib/phpseclib/tree/3.0.51\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/terrafrost\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://www.patreon.com/phpseclib\",\n \"type\": \"patreon\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/phpseclib/phpseclib\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2026-04-10T01:33:53+00:00\"\n },\n {\n \"name\": \"propaganistas/laravel-phone\",\n \"version\": \"5.3.6\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/Propaganistas/Laravel-Phone.git\",\n \"reference\": \"89f26e8336cf8f8041609148b4fef752f0bd720e\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/Propaganistas/Laravel-Phone/zipball/89f26e8336cf8f8041609148b4fef752f0bd720e\",\n \"reference\": \"89f26e8336cf8f8041609148b4fef752f0bd720e\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"giggsey/libphonenumber-for-php-lite\": \"^8.13.35|^9.0.0\",\n \"illuminate/contracts\": \"^10.0|^11.0|^12.0\",\n \"illuminate/support\": \"^10.0|^11.0|^12.0\",\n \"illuminate/validation\": \"^10.0|^11.0|^12.0\",\n \"php\": \"^8.1\"\n },\n \"require-dev\": {\n \"laravel/pint\": \"^1.14\",\n \"orchestra/testbench\": \"*\",\n \"phpunit/phpunit\": \"^10.5|^11.5.3\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"laravel\": {\n \"providers\": [\n \"Propaganistas\\\\LaravelPhone\\\\PhoneServiceProvider\"\n ]\n }\n },\n \"autoload\": {\n \"files\": [\n \"src/helpers.php\"\n ],\n \"psr-4\": {\n \"Propaganistas\\\\LaravelPhone\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Propaganistas\",\n \"email\": \"Propaganistas@users.noreply.github.com\"\n }\n ],\n \"description\": \"Adds phone number functionality to Laravel based on Google's libphonenumber API.\",\n \"keywords\": [\n \"laravel\",\n \"libphonenumber\",\n \"phone\",\n \"validation\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/Propaganistas/Laravel-Phone/issues\",\n \"source\": \"https://github.com/Propaganistas/Laravel-Phone/tree/5.3.6\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/Propaganistas\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2025-03-21T09:07:26+00:00\"\n },\n {\n \"name\": \"psr/cache\",\n \"version\": \"3.0.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/php-fig/cache.git\",\n \"reference\": \"aa5030cfa5405eccfdcb1083ce040c2cb8d253bf\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/php-fig/cache/zipball/aa5030cfa5405eccfdcb1083ce040c2cb8d253bf\",\n \"reference\": \"aa5030cfa5405eccfdcb1083ce040c2cb8d253bf\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.0.0\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"1.0.x-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Psr\\\\Cache\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"PHP-FIG\",\n \"homepage\": \"https://www.php-fig.org/\"\n }\n ],\n \"description\": \"Common interface for caching libraries\",\n \"keywords\": [\n \"cache\",\n \"psr\",\n \"psr-6\"\n ],\n \"support\": {\n \"source\": \"https://github.com/php-fig/cache/tree/3.0.0\"\n },\n \"time\": \"2021-02-03T23:26:27+00:00\"\n },\n {\n \"name\": \"psr/clock\",\n \"version\": \"1.0.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/php-fig/clock.git\",\n \"reference\": \"e41a24703d4560fd0acb709162f73b8adfc3aa0d\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/php-fig/clock/zipball/e41a24703d4560fd0acb709162f73b8adfc3aa0d\",\n \"reference\": \"e41a24703d4560fd0acb709162f73b8adfc3aa0d\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \"^7.0 || ^8.0\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Psr\\\\Clock\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"PHP-FIG\",\n \"homepage\": \"https://www.php-fig.org/\"\n }\n ],\n \"description\": \"Common interface for reading the clock.\",\n \"homepage\": \"https://github.com/php-fig/clock\",\n \"keywords\": [\n \"clock\",\n \"now\",\n \"psr\",\n \"psr-20\",\n \"time\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/php-fig/clock/issues\",\n \"source\": \"https://github.com/php-fig/clock/tree/1.0.0\"\n },\n \"time\": \"2022-11-25T14:36:26+00:00\"\n },\n {\n \"name\": \"psr/container\",\n \"version\": \"2.0.2\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/php-fig/container.git\",\n \"reference\": \"c71ecc56dfe541dbd90c5360474fbc405f8d5963\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963\",\n \"reference\": \"c71ecc56dfe541dbd90c5360474fbc405f8d5963\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=7.4.0\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"2.0.x-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Psr\\\\Container\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"PHP-FIG\",\n \"homepage\": \"https://www.php-fig.org/\"\n }\n ],\n \"description\": \"Common Container Interface (PHP FIG PSR-11)\",\n \"homepage\": \"https://github.com/php-fig/container\",\n \"keywords\": [\n \"PSR-11\",\n \"container\",\n \"container-interface\",\n \"container-interop\",\n \"psr\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/php-fig/container/issues\",\n \"source\": \"https://github.com/php-fig/container/tree/2.0.2\"\n },\n \"time\": \"2021-11-05T16:47:00+00:00\"\n },\n {\n \"name\": \"psr/event-dispatcher\",\n \"version\": \"1.0.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/php-fig/event-dispatcher.git\",\n \"reference\": \"dbefd12671e8a14ec7f180cab83036ed26714bb0\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0\",\n \"reference\": \"dbefd12671e8a14ec7f180cab83036ed26714bb0\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=7.2.0\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"1.0.x-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Psr\\\\EventDispatcher\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"PHP-FIG\",\n \"homepage\": \"http://www.php-fig.org/\"\n }\n ],\n \"description\": \"Standard interfaces for event handling.\",\n \"keywords\": [\n \"events\",\n \"psr\",\n \"psr-14\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/php-fig/event-dispatcher/issues\",\n \"source\": \"https://github.com/php-fig/event-dispatcher/tree/1.0.0\"\n },\n \"time\": \"2019-01-08T18:20:26+00:00\"\n },\n {\n \"name\": \"psr/http-client\",\n \"version\": \"1.0.3\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/php-fig/http-client.git\",\n \"reference\": \"bb5906edc1c324c9a05aa0873d40117941e5fa90\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/php-fig/http-client/zipball/bb5906edc1c324c9a05aa0873d40117941e5fa90\",\n \"reference\": \"bb5906edc1c324c9a05aa0873d40117941e5fa90\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \"^7.0 || ^8.0\",\n \"psr/http-message\": \"^1.0 || ^2.0\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"1.0.x-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Psr\\\\Http\\\\Client\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"PHP-FIG\",\n \"homepage\": \"https://www.php-fig.org/\"\n }\n ],\n \"description\": \"Common interface for HTTP clients\",\n \"homepage\": \"https://github.com/php-fig/http-client\",\n \"keywords\": [\n \"http\",\n \"http-client\",\n \"psr\",\n \"psr-18\"\n ],\n \"support\": {\n \"source\": \"https://github.com/php-fig/http-client\"\n },\n \"time\": \"2023-09-23T14:17:50+00:00\"\n },\n {\n \"name\": \"psr/http-factory\",\n \"version\": \"1.1.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/php-fig/http-factory.git\",\n \"reference\": \"2b4765fddfe3b508ac62f829e852b1501d3f6e8a\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/php-fig/http-factory/zipball/2b4765fddfe3b508ac62f829e852b1501d3f6e8a\",\n \"reference\": \"2b4765fddfe3b508ac62f829e852b1501d3f6e8a\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=7.1\",\n \"psr/http-message\": \"^1.0 || ^2.0\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"1.0.x-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Psr\\\\Http\\\\Message\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"PHP-FIG\",\n \"homepage\": \"https://www.php-fig.org/\"\n }\n ],\n \"description\": \"PSR-17: Common interfaces for PSR-7 HTTP message factories\",\n \"keywords\": [\n \"factory\",\n \"http\",\n \"message\",\n \"psr\",\n \"psr-17\",\n \"psr-7\",\n \"request\",\n \"response\"\n ],\n \"support\": {\n \"source\": \"https://github.com/php-fig/http-factory\"\n },\n \"time\": \"2024-04-15T12:06:14+00:00\"\n },\n {\n \"name\": \"psr/http-message\",\n \"version\": \"2.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/php-fig/http-message.git\",\n \"reference\": \"402d35bcb92c70c026d1a6a9883f06b2ead23d71\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/php-fig/http-message/zipball/402d35bcb92c70c026d1a6a9883f06b2ead23d71\",\n \"reference\": \"402d35bcb92c70c026d1a6a9883f06b2ead23d71\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \"^7.2 || ^8.0\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"2.0.x-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Psr\\\\Http\\\\Message\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"PHP-FIG\",\n \"homepage\": \"https://www.php-fig.org/\"\n }\n ],\n \"description\": \"Common interface for HTTP messages\",\n \"homepage\": \"https://github.com/php-fig/http-message\",\n \"keywords\": [\n \"http\",\n \"http-message\",\n \"psr\",\n \"psr-7\",\n \"request\",\n \"response\"\n ],\n \"support\": {\n \"source\": \"https://github.com/php-fig/http-message/tree/2.0\"\n },\n \"time\": \"2023-04-04T09:54:51+00:00\"\n },\n {\n \"name\": \"psr/http-server-handler\",\n \"version\": \"1.0.2\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/php-fig/http-server-handler.git\",\n \"reference\": \"84c4fb66179be4caaf8e97bd239203245302e7d4\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/php-fig/http-server-handler/zipball/84c4fb66179be4caaf8e97bd239203245302e7d4\",\n \"reference\": \"84c4fb66179be4caaf8e97bd239203245302e7d4\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=7.0\",\n \"psr/http-message\": \"^1.0 || ^2.0\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"1.0.x-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Psr\\\\Http\\\\Server\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"PHP-FIG\",\n \"homepage\": \"https://www.php-fig.org/\"\n }\n ],\n \"description\": \"Common interface for HTTP server-side request handler\",\n \"keywords\": [\n \"handler\",\n \"http\",\n \"http-interop\",\n \"psr\",\n \"psr-15\",\n \"psr-7\",\n \"request\",\n \"response\",\n \"server\"\n ],\n \"support\": {\n \"source\": \"https://github.com/php-fig/http-server-handler/tree/1.0.2\"\n },\n \"time\": \"2023-04-10T20:06:20+00:00\"\n },\n {\n \"name\": \"psr/http-server-middleware\",\n \"version\": \"1.0.2\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/php-fig/http-server-middleware.git\",\n \"reference\": \"c1481f747daaa6a0782775cd6a8c26a1bf4a3829\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/php-fig/http-server-middleware/zipball/c1481f747daaa6a0782775cd6a8c26a1bf4a3829\",\n \"reference\": \"c1481f747daaa6a0782775cd6a8c26a1bf4a3829\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=7.0\",\n \"psr/http-message\": \"^1.0 || ^2.0\",\n \"psr/http-server-handler\": \"^1.0\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"1.0.x-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Psr\\\\Http\\\\Server\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"PHP-FIG\",\n \"homepage\": \"https://www.php-fig.org/\"\n }\n ],\n \"description\": \"Common interface for HTTP server-side middleware\",\n \"keywords\": [\n \"http\",\n \"http-interop\",\n \"middleware\",\n \"psr\",\n \"psr-15\",\n \"psr-7\",\n \"request\",\n \"response\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/php-fig/http-server-middleware/issues\",\n \"source\": \"https://github.com/php-fig/http-server-middleware/tree/1.0.2\"\n },\n \"time\": \"2023-04-11T06:14:47+00:00\"\n },\n {\n \"name\": \"psr/log\",\n \"version\": \"3.0.2\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/php-fig/log.git\",\n \"reference\": \"f16e1d5863e37f8d8c2a01719f5b34baa2b714d3\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/php-fig/log/zipball/f16e1d5863e37f8d8c2a01719f5b34baa2b714d3\",\n \"reference\": \"f16e1d5863e37f8d8c2a01719f5b34baa2b714d3\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.0.0\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"3.x-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Psr\\\\Log\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"PHP-FIG\",\n \"homepage\": \"https://www.php-fig.org/\"\n }\n ],\n \"description\": \"Common interface for logging libraries\",\n \"homepage\": \"https://github.com/php-fig/log\",\n \"keywords\": [\n \"log\",\n \"psr\",\n \"psr-3\"\n ],\n \"support\": {\n \"source\": \"https://github.com/php-fig/log/tree/3.0.2\"\n },\n \"time\": \"2024-09-11T13:17:53+00:00\"\n },\n {\n \"name\": \"psr/simple-cache\",\n \"version\": \"3.0.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/php-fig/simple-cache.git\",\n \"reference\": \"764e0b3939f5ca87cb904f570ef9be2d78a07865\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/php-fig/simple-cache/zipball/764e0b3939f5ca87cb904f570ef9be2d78a07865\",\n \"reference\": \"764e0b3939f5ca87cb904f570ef9be2d78a07865\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.0.0\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"3.0.x-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Psr\\\\SimpleCache\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"PHP-FIG\",\n \"homepage\": \"https://www.php-fig.org/\"\n }\n ],\n \"description\": \"Common interfaces for simple caching\",\n \"keywords\": [\n \"cache\",\n \"caching\",\n \"psr\",\n \"psr-16\",\n \"simple-cache\"\n ],\n \"support\": {\n \"source\": \"https://github.com/php-fig/simple-cache/tree/3.0.0\"\n },\n \"time\": \"2021-10-29T13:26:27+00:00\"\n },\n {\n \"name\": \"psy/psysh\",\n \"version\": \"v0.12.21\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/bobthecow/psysh.git\",\n \"reference\": \"4821fab5b7cd8c49a673a9fd5754dc9162bb9e97\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/bobthecow/psysh/zipball/4821fab5b7cd8c49a673a9fd5754dc9162bb9e97\",\n \"reference\": \"4821fab5b7cd8c49a673a9fd5754dc9162bb9e97\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"ext-json\": \"*\",\n \"ext-tokenizer\": \"*\",\n \"nikic/php-parser\": \"^5.0 || ^4.0\",\n \"php\": \"^8.0 || ^7.4\",\n \"symfony/console\": \"^8.0 || ^7.0 || ^6.0 || ^5.0 || ^4.0 || ^3.4\",\n \"symfony/var-dumper\": \"^8.0 || ^7.0 || ^6.0 || ^5.0 || ^4.0 || ^3.4\"\n },\n \"conflict\": {\n \"symfony/console\": \"4.4.37 || 5.3.14 || 5.3.15 || 5.4.3 || 5.4.4 || 6.0.3 || 6.0.4\"\n },\n \"require-dev\": {\n \"bamarni/composer-bin-plugin\": \"^1.2\",\n \"composer/class-map-generator\": \"^1.6\"\n },\n \"suggest\": {\n \"composer/class-map-generator\": \"Improved tab completion performance with better class discovery.\",\n \"ext-pcntl\": \"Enabling the PCNTL extension makes PsySH a lot happier :)\",\n \"ext-posix\": \"If you have PCNTL, you'll want the POSIX extension as well.\"\n },\n \"bin\": [\n \"bin/psysh\"\n ],\n \"type\": \"library\",\n \"extra\": {\n \"bamarni-bin\": {\n \"bin-links\": false,\n \"forward-command\": false\n },\n \"branch-alias\": {\n \"dev-main\": \"0.12.x-dev\"\n }\n },\n \"autoload\": {\n \"files\": [\n \"src/functions.php\"\n ],\n \"psr-4\": {\n \"Psy\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Justin Hileman\",\n \"email\": \"justin@justinhileman.info\"\n }\n ],\n \"description\": \"An interactive shell for modern PHP.\",\n \"homepage\": \"https://psysh.org\",\n \"keywords\": [\n \"REPL\",\n \"console\",\n \"interactive\",\n \"shell\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/bobthecow/psysh/issues\",\n \"source\": \"https://github.com/bobthecow/psysh/tree/v0.12.21\"\n },\n \"time\": \"2026-03-06T21:21:28+00:00\"\n },\n {\n \"name\": \"pubnub/pubnub\",\n \"version\": \"6.3.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/pubnub/php.git\",\n \"reference\": \"26de0a59dda29f1246378995f96c4f95f6d64980\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/pubnub/php/zipball/26de0a59dda29f1246378995f96c4f95f6d64980\",\n \"reference\": \"26de0a59dda29f1246378995f96c4f95f6d64980\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \"^7.4|>=8.0\",\n \"psr/log\": \"^1.1|^2.0|^3.0\",\n \"rmccue/requests\": \"^2.0\"\n },\n \"require-dev\": {\n \"monolog/monolog\": \"^2.9 || ^3.0\",\n \"phpstan/phpstan\": \"^1.8\",\n \"phpunit/phpunit\": \"^9.5\",\n \"squizlabs/php_codesniffer\": \"^3.7\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"PubNub\\\\\": \"src/PubNub\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"proprietary\"\n ],\n \"authors\": [\n {\n \"name\": \"PubNub\",\n \"email\": \"support@pubnub.com\"\n }\n ],\n \"description\": \"This is the official PubNub PHP SDK repository.\",\n \"homepage\": \"http://www.pubnub.com/\",\n \"keywords\": [\n \"ajax\",\n \"api\",\n \"push\",\n \"real time\",\n \"real-time\",\n \"realtime\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/pubnub/php/issues\",\n \"source\": \"https://github.com/pubnub/php/tree/v6.3.0\"\n },\n \"time\": \"2024-06-19T07:31:01+00:00\"\n },\n {\n \"name\": \"pusher/pusher-php-server\",\n \"version\": \"7.2.3\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/pusher/pusher-http-php.git\",\n \"reference\": \"416e68dd5f640175ad5982131c42a7a666d1d8e9\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/pusher/pusher-http-php/zipball/416e68dd5f640175ad5982131c42a7a666d1d8e9\",\n \"reference\": \"416e68dd5f640175ad5982131c42a7a666d1d8e9\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"ext-curl\": \"*\",\n \"ext-json\": \"*\",\n \"guzzlehttp/guzzle\": \"^7.2\",\n \"paragonie/sodium_compat\": \"^1.6\",\n \"php\": \"^7.3|^8.0\",\n \"psr/log\": \"^1.0|^2.0|^3.0\"\n },\n \"require-dev\": {\n \"overtrue/phplint\": \"^2.3\",\n \"phpunit/phpunit\": \"^9.3\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"5.0-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Pusher\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"description\": \"Library for interacting with the Pusher REST API\",\n \"keywords\": [\n \"events\",\n \"messaging\",\n \"php-pusher-server\",\n \"publish\",\n \"push\",\n \"pusher\",\n \"real time\",\n \"real-time\",\n \"realtime\",\n \"rest\",\n \"trigger\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/pusher/pusher-http-php/issues\",\n \"source\": \"https://github.com/pusher/pusher-http-php/tree/7.2.3\"\n },\n \"time\": \"2023-05-17T16:00:06+00:00\"\n },\n {\n \"name\": \"ralouphie/getallheaders\",\n \"version\": \"3.0.3\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/ralouphie/getallheaders.git\",\n \"reference\": \"120b605dfeb996808c31b6477290a714d356e822\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822\",\n \"reference\": \"120b605dfeb996808c31b6477290a714d356e822\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=5.6\"\n },\n \"require-dev\": {\n \"php-coveralls/php-coveralls\": \"^2.1\",\n \"phpunit/phpunit\": \"^5 || ^6.5\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"files\": [\n \"src/getallheaders.php\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Ralph Khattar\",\n \"email\": \"ralph.khattar@gmail.com\"\n }\n ],\n \"description\": \"A polyfill for getallheaders.\",\n \"support\": {\n \"issues\": \"https://github.com/ralouphie/getallheaders/issues\",\n \"source\": \"https://github.com/ralouphie/getallheaders/tree/develop\"\n },\n \"time\": \"2019-03-08T08:55:37+00:00\"\n },\n {\n \"name\": \"ramsey/collection\",\n \"version\": \"2.1.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/ramsey/collection.git\",\n \"reference\": \"344572933ad0181accbf4ba763e85a0306a8c5e2\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/ramsey/collection/zipball/344572933ad0181accbf4ba763e85a0306a8c5e2\",\n \"reference\": \"344572933ad0181accbf4ba763e85a0306a8c5e2\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \"^8.1\"\n },\n \"require-dev\": {\n \"captainhook/plugin-composer\": \"^5.3\",\n \"ergebnis/composer-normalize\": \"^2.45\",\n \"fakerphp/faker\": \"^1.24\",\n \"hamcrest/hamcrest-php\": \"^2.0\",\n \"jangregor/phpstan-prophecy\": \"^2.1\",\n \"mockery/mockery\": \"^1.6\",\n \"php-parallel-lint/php-console-highlighter\": \"^1.0\",\n \"php-parallel-lint/php-parallel-lint\": \"^1.4\",\n \"phpspec/prophecy-phpunit\": \"^2.3\",\n \"phpstan/extension-installer\": \"^1.4\",\n \"phpstan/phpstan\": \"^2.1\",\n \"phpstan/phpstan-mockery\": \"^2.0\",\n \"phpstan/phpstan-phpunit\": \"^2.0\",\n \"phpunit/phpunit\": \"^10.5\",\n \"ramsey/coding-standard\": \"^2.3\",\n \"ramsey/conventional-commits\": \"^1.6\",\n \"roave/security-advisories\": \"dev-latest\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"captainhook\": {\n \"force-install\": true\n },\n \"ramsey/conventional-commits\": {\n \"configFile\": \"conventional-commits.json\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Ramsey\\\\Collection\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Ben Ramsey\",\n \"email\": \"ben@benramsey.com\",\n \"homepage\": \"https://benramsey.com\"\n }\n ],\n \"description\": \"A PHP library for representing and manipulating collections.\",\n \"keywords\": [\n \"array\",\n \"collection\",\n \"hash\",\n \"map\",\n \"queue\",\n \"set\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/ramsey/collection/issues\",\n \"source\": \"https://github.com/ramsey/collection/tree/2.1.1\"\n },\n \"time\": \"2025-03-22T05:38:12+00:00\"\n },\n {\n \"name\": \"ramsey/uuid\",\n \"version\": \"4.9.2\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/ramsey/uuid.git\",\n \"reference\": \"8429c78ca35a09f27565311b98101e2826affde0\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/ramsey/uuid/zipball/8429c78ca35a09f27565311b98101e2826affde0\",\n \"reference\": \"8429c78ca35a09f27565311b98101e2826affde0\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"brick/math\": \"^0.8.16 || ^0.9 || ^0.10 || ^0.11 || ^0.12 || ^0.13 || ^0.14\",\n \"php\": \"^8.0\",\n \"ramsey/collection\": \"^1.2 || ^2.0\"\n },\n \"replace\": {\n \"rhumsaa/uuid\": \"self.version\"\n },\n \"require-dev\": {\n \"captainhook/captainhook\": \"^5.25\",\n \"captainhook/plugin-composer\": \"^5.3\",\n \"dealerdirect/phpcodesniffer-composer-installer\": \"^1.0\",\n \"ergebnis/composer-normalize\": \"^2.47\",\n \"mockery/mockery\": \"^1.6\",\n \"paragonie/random-lib\": \"^2\",\n \"php-mock/php-mock\": \"^2.6\",\n \"php-mock/php-mock-mockery\": \"^1.5\",\n \"php-parallel-lint/php-parallel-lint\": \"^1.4.0\",\n \"phpbench/phpbench\": \"^1.2.14\",\n \"phpstan/extension-installer\": \"^1.4\",\n \"phpstan/phpstan\": \"^2.1\",\n \"phpstan/phpstan-mockery\": \"^2.0\",\n \"phpstan/phpstan-phpunit\": \"^2.0\",\n \"phpunit/phpunit\": \"^9.6\",\n \"slevomat/coding-standard\": \"^8.18\",\n \"squizlabs/php_codesniffer\": \"^3.13\"\n },\n \"suggest\": {\n \"ext-bcmath\": \"Enables faster math with arbitrary-precision integers using BCMath.\",\n \"ext-gmp\": \"Enables faster math with arbitrary-precision integers using GMP.\",\n \"ext-uuid\": \"Enables the use of PeclUuidTimeGenerator and PeclUuidRandomGenerator.\",\n \"paragonie/random-lib\": \"Provides RandomLib for use with the RandomLibAdapter\",\n \"ramsey/uuid-doctrine\": \"Allows the use of Ramsey\\\\Uuid\\\\Uuid as Doctrine field type.\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"captainhook\": {\n \"force-install\": true\n }\n },\n \"autoload\": {\n \"files\": [\n \"src/functions.php\"\n ],\n \"psr-4\": {\n \"Ramsey\\\\Uuid\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"description\": \"A PHP library for generating and working with universally unique identifiers (UUIDs).\",\n \"keywords\": [\n \"guid\",\n \"identifier\",\n \"uuid\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/ramsey/uuid/issues\",\n \"source\": \"https://github.com/ramsey/uuid/tree/4.9.2\"\n },\n \"time\": \"2025-12-14T04:43:48+00:00\"\n },\n {\n \"name\": \"ratchet/pawl\",\n \"version\": \"v0.4.3\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/ratchetphp/Pawl.git\",\n \"reference\": \"2c582373c78271de32cb04c755c4c0db7e09c9c0\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/ratchetphp/Pawl/zipball/2c582373c78271de32cb04c755c4c0db7e09c9c0\",\n \"reference\": \"2c582373c78271de32cb04c755c4c0db7e09c9c0\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"evenement/evenement\": \"^3.0 || ^2.0\",\n \"guzzlehttp/psr7\": \"^2.0\",\n \"php\": \">=7.4\",\n \"ratchet/rfc6455\": \"^0.3.1 || ^0.4.0\",\n \"react/socket\": \"^1.9\"\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \"^9.3 || ^5.7 || ^4.8\"\n },\n \"suggest\": {\n \"reactivex/rxphp\": \"~2.0\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"files\": [\n \"src/functions_include.php\"\n ],\n \"psr-4\": {\n \"Ratchet\\\\Client\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"description\": \"Asynchronous WebSocket client\",\n \"keywords\": [\n \"Ratchet\",\n \"async\",\n \"client\",\n \"websocket\",\n \"websocket client\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/ratchetphp/Pawl/issues\",\n \"source\": \"https://github.com/ratchetphp/Pawl/tree/v0.4.3\"\n },\n \"time\": \"2025-03-19T16:47:38+00:00\"\n },\n {\n \"name\": \"ratchet/rfc6455\",\n \"version\": \"v0.4.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/ratchetphp/RFC6455.git\",\n \"reference\": \"859d95f85dda0912c6d5b936d036d044e3af47ef\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/ratchetphp/RFC6455/zipball/859d95f85dda0912c6d5b936d036d044e3af47ef\",\n \"reference\": \"859d95f85dda0912c6d5b936d036d044e3af47ef\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=7.4\",\n \"psr/http-factory-implementation\": \"^1.0\",\n \"symfony/polyfill-php80\": \"^1.15\"\n },\n \"require-dev\": {\n \"guzzlehttp/psr7\": \"^2.7\",\n \"phpunit/phpunit\": \"^9.5\",\n \"react/socket\": \"^1.3\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Ratchet\\\\RFC6455\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Chris Boden\",\n \"email\": \"cboden@gmail.com\",\n \"role\": \"Developer\"\n },\n {\n \"name\": \"Matt Bonneau\",\n \"role\": \"Developer\"\n }\n ],\n \"description\": \"RFC6455 WebSocket protocol handler\",\n \"homepage\": \"http://socketo.me\",\n \"keywords\": [\n \"WebSockets\",\n \"rfc6455\",\n \"websocket\"\n ],\n \"support\": {\n \"chat\": \"https://gitter.im/reactphp/reactphp\",\n \"issues\": \"https://github.com/ratchetphp/RFC6455/issues\",\n \"source\": \"https://github.com/ratchetphp/RFC6455/tree/v0.4.0\"\n },\n \"time\": \"2025-02-24T01:18:22+00:00\"\n },\n {\n \"name\": \"react/cache\",\n \"version\": \"v1.2.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/reactphp/cache.git\",\n \"reference\": \"d47c472b64aa5608225f47965a484b75c7817d5b\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/reactphp/cache/zipball/d47c472b64aa5608225f47965a484b75c7817d5b\",\n \"reference\": \"d47c472b64aa5608225f47965a484b75c7817d5b\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=5.3.0\",\n \"react/promise\": \"^3.0 || ^2.0 || ^1.1\"\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \"^9.5 || ^5.7 || ^4.8.35\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"React\\\\Cache\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Christian Lück\",\n \"email\": \"christian@clue.engineering\",\n \"homepage\": \"https://clue.engineering/\"\n },\n {\n \"name\": \"Cees-Jan Kiewiet\",\n \"email\": \"reactphp@ceesjankiewiet.nl\",\n \"homepage\": \"https://wyrihaximus.net/\"\n },\n {\n \"name\": \"Jan Sorgalla\",\n \"email\": \"jsorgalla@gmail.com\",\n \"homepage\": \"https://sorgalla.com/\"\n },\n {\n \"name\": \"Chris Boden\",\n \"email\": \"cboden@gmail.com\",\n \"homepage\": \"https://cboden.dev/\"\n }\n ],\n \"description\": \"Async, Promise-based cache interface for ReactPHP\",\n \"keywords\": [\n \"cache\",\n \"caching\",\n \"promise\",\n \"reactphp\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/reactphp/cache/issues\",\n \"source\": \"https://github.com/reactphp/cache/tree/v1.2.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://opencollective.com/reactphp\",\n \"type\": \"open_collective\"\n }\n ],\n \"time\": \"2022-11-30T15:59:55+00:00\"\n },\n {\n \"name\": \"react/dns\",\n \"version\": \"v1.13.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/reactphp/dns.git\",\n \"reference\": \"eb8ae001b5a455665c89c1df97f6fb682f8fb0f5\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/reactphp/dns/zipball/eb8ae001b5a455665c89c1df97f6fb682f8fb0f5\",\n \"reference\": \"eb8ae001b5a455665c89c1df97f6fb682f8fb0f5\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=5.3.0\",\n \"react/cache\": \"^1.0 || ^0.6 || ^0.5\",\n \"react/event-loop\": \"^1.2\",\n \"react/promise\": \"^3.2 || ^2.7 || ^1.2.1\"\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \"^9.6 || ^5.7 || ^4.8.36\",\n \"react/async\": \"^4.3 || ^3 || ^2\",\n \"react/promise-timer\": \"^1.11\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"React\\\\Dns\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Christian Lück\",\n \"email\": \"christian@clue.engineering\",\n \"homepage\": \"https://clue.engineering/\"\n },\n {\n \"name\": \"Cees-Jan Kiewiet\",\n \"email\": \"reactphp@ceesjankiewiet.nl\",\n \"homepage\": \"https://wyrihaximus.net/\"\n },\n {\n \"name\": \"Jan Sorgalla\",\n \"email\": \"jsorgalla@gmail.com\",\n \"homepage\": \"https://sorgalla.com/\"\n },\n {\n \"name\": \"Chris Boden\",\n \"email\": \"cboden@gmail.com\",\n \"homepage\": \"https://cboden.dev/\"\n }\n ],\n \"description\": \"Async DNS resolver for ReactPHP\",\n \"keywords\": [\n \"async\",\n \"dns\",\n \"dns-resolver\",\n \"reactphp\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/reactphp/dns/issues\",\n \"source\": \"https://github.com/reactphp/dns/tree/v1.13.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://opencollective.com/reactphp\",\n \"type\": \"open_collective\"\n }\n ],\n \"time\": \"2024-06-13T14:18:03+00:00\"\n },\n {\n \"name\": \"react/event-loop\",\n \"version\": \"v1.5.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/reactphp/event-loop.git\",\n \"reference\": \"bbe0bd8c51ffc05ee43f1729087ed3bdf7d53354\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/reactphp/event-loop/zipball/bbe0bd8c51ffc05ee43f1729087ed3bdf7d53354\",\n \"reference\": \"bbe0bd8c51ffc05ee43f1729087ed3bdf7d53354\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=5.3.0\"\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \"^9.6 || ^5.7 || ^4.8.36\"\n },\n \"suggest\": {\n \"ext-pcntl\": \"For signal handling support when using the StreamSelectLoop\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"React\\\\EventLoop\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Christian Lück\",\n \"email\": \"christian@clue.engineering\",\n \"homepage\": \"https://clue.engineering/\"\n },\n {\n \"name\": \"Cees-Jan Kiewiet\",\n \"email\": \"reactphp@ceesjankiewiet.nl\",\n \"homepage\": \"https://wyrihaximus.net/\"\n },\n {\n \"name\": \"Jan Sorgalla\",\n \"email\": \"jsorgalla@gmail.com\",\n \"homepage\": \"https://sorgalla.com/\"\n },\n {\n \"name\": \"Chris Boden\",\n \"email\": \"cboden@gmail.com\",\n \"homepage\": \"https://cboden.dev/\"\n }\n ],\n \"description\": \"ReactPHP's core reactor event loop that libraries can use for evented I/O.\",\n \"keywords\": [\n \"asynchronous\",\n \"event-loop\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/reactphp/event-loop/issues\",\n \"source\": \"https://github.com/reactphp/event-loop/tree/v1.5.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://opencollective.com/reactphp\",\n \"type\": \"open_collective\"\n }\n ],\n \"time\": \"2023-11-13T13:48:05+00:00\"\n },\n {\n \"name\": \"react/promise\",\n \"version\": \"v3.3.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/reactphp/promise.git\",\n \"reference\": \"23444f53a813a3296c1368bb104793ce8d88f04a\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/reactphp/promise/zipball/23444f53a813a3296c1368bb104793ce8d88f04a\",\n \"reference\": \"23444f53a813a3296c1368bb104793ce8d88f04a\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=7.1.0\"\n },\n \"require-dev\": {\n \"phpstan/phpstan\": \"1.12.28 || 1.4.10\",\n \"phpunit/phpunit\": \"^9.6 || ^7.5\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"files\": [\n \"src/functions_include.php\"\n ],\n \"psr-4\": {\n \"React\\\\Promise\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Jan Sorgalla\",\n \"email\": \"jsorgalla@gmail.com\",\n \"homepage\": \"https://sorgalla.com/\"\n },\n {\n \"name\": \"Christian Lück\",\n \"email\": \"christian@clue.engineering\",\n \"homepage\": \"https://clue.engineering/\"\n },\n {\n \"name\": \"Cees-Jan Kiewiet\",\n \"email\": \"reactphp@ceesjankiewiet.nl\",\n \"homepage\": \"https://wyrihaximus.net/\"\n },\n {\n \"name\": \"Chris Boden\",\n \"email\": \"cboden@gmail.com\",\n \"homepage\": \"https://cboden.dev/\"\n }\n ],\n \"description\": \"A lightweight implementation of CommonJS Promises/A for PHP\",\n \"keywords\": [\n \"promise\",\n \"promises\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/reactphp/promise/issues\",\n \"source\": \"https://github.com/reactphp/promise/tree/v3.3.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://opencollective.com/reactphp\",\n \"type\": \"open_collective\"\n }\n ],\n \"time\": \"2025-08-19T18:57:03+00:00\"\n },\n {\n \"name\": \"react/socket\",\n \"version\": \"v1.16.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/reactphp/socket.git\",\n \"reference\": \"23e4ff33ea3e160d2d1f59a0e6050e4b0fb0eac1\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/reactphp/socket/zipball/23e4ff33ea3e160d2d1f59a0e6050e4b0fb0eac1\",\n \"reference\": \"23e4ff33ea3e160d2d1f59a0e6050e4b0fb0eac1\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"evenement/evenement\": \"^3.0 || ^2.0 || ^1.0\",\n \"php\": \">=5.3.0\",\n \"react/dns\": \"^1.13\",\n \"react/event-loop\": \"^1.2\",\n \"react/promise\": \"^3.2 || ^2.6 || ^1.2.1\",\n \"react/stream\": \"^1.4\"\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \"^9.6 || ^5.7 || ^4.8.36\",\n \"react/async\": \"^4.3 || ^3.3 || ^2\",\n \"react/promise-stream\": \"^1.4\",\n \"react/promise-timer\": \"^1.11\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"React\\\\Socket\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Christian Lück\",\n \"email\": \"christian@clue.engineering\",\n \"homepage\": \"https://clue.engineering/\"\n },\n {\n \"name\": \"Cees-Jan Kiewiet\",\n \"email\": \"reactphp@ceesjankiewiet.nl\",\n \"homepage\": \"https://wyrihaximus.net/\"\n },\n {\n \"name\": \"Jan Sorgalla\",\n \"email\": \"jsorgalla@gmail.com\",\n \"homepage\": \"https://sorgalla.com/\"\n },\n {\n \"name\": \"Chris Boden\",\n \"email\": \"cboden@gmail.com\",\n \"homepage\": \"https://cboden.dev/\"\n }\n ],\n \"description\": \"Async, streaming plaintext TCP/IP and secure TLS socket server and client connections for ReactPHP\",\n \"keywords\": [\n \"Connection\",\n \"Socket\",\n \"async\",\n \"reactphp\",\n \"stream\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/reactphp/socket/issues\",\n \"source\": \"https://github.com/reactphp/socket/tree/v1.16.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://opencollective.com/reactphp\",\n \"type\": \"open_collective\"\n }\n ],\n \"time\": \"2024-07-26T10:38:09+00:00\"\n },\n {\n \"name\": \"react/stream\",\n \"version\": \"v1.4.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/reactphp/stream.git\",\n \"reference\": \"1e5b0acb8fe55143b5b426817155190eb6f5b18d\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/reactphp/stream/zipball/1e5b0acb8fe55143b5b426817155190eb6f5b18d\",\n \"reference\": \"1e5b0acb8fe55143b5b426817155190eb6f5b18d\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"evenement/evenement\": \"^3.0 || ^2.0 || ^1.0\",\n \"php\": \">=5.3.8\",\n \"react/event-loop\": \"^1.2\"\n },\n \"require-dev\": {\n \"clue/stream-filter\": \"~1.2\",\n \"phpunit/phpunit\": \"^9.6 || ^5.7 || ^4.8.36\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"React\\\\Stream\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Christian Lück\",\n \"email\": \"christian@clue.engineering\",\n \"homepage\": \"https://clue.engineering/\"\n },\n {\n \"name\": \"Cees-Jan Kiewiet\",\n \"email\": \"reactphp@ceesjankiewiet.nl\",\n \"homepage\": \"https://wyrihaximus.net/\"\n },\n {\n \"name\": \"Jan Sorgalla\",\n \"email\": \"jsorgalla@gmail.com\",\n \"homepage\": \"https://sorgalla.com/\"\n },\n {\n \"name\": \"Chris Boden\",\n \"email\": \"cboden@gmail.com\",\n \"homepage\": \"https://cboden.dev/\"\n }\n ],\n \"description\": \"Event-driven readable and writable streams for non-blocking I/O in ReactPHP\",\n \"keywords\": [\n \"event-driven\",\n \"io\",\n \"non-blocking\",\n \"pipe\",\n \"reactphp\",\n \"readable\",\n \"stream\",\n \"writable\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/reactphp/stream/issues\",\n \"source\": \"https://github.com/reactphp/stream/tree/v1.4.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://opencollective.com/reactphp\",\n \"type\": \"open_collective\"\n }\n ],\n \"time\": \"2024-06-11T12:45:25+00:00\"\n },\n {\n \"name\": \"ringcentral/ringcentral-php\",\n \"version\": \"3.0.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/ringcentral/ringcentral-php.git\",\n \"reference\": \"3e47c19ef8d4f995f085fbc31927ce7704826ebb\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/ringcentral/ringcentral-php/zipball/3e47c19ef8d4f995f085fbc31927ce7704826ebb\",\n \"reference\": \"3e47c19ef8d4f995f085fbc31927ce7704826ebb\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"ext-curl\": \"*\",\n \"ext-json\": \"*\",\n \"guzzlehttp/guzzle\": \"^6.3.3|^7.4.1\",\n \"guzzlehttp/psr7\": \"^2.1.0\",\n \"php\": \">=7.2\",\n \"pubnub/pubnub\": \"^4.7.0|^6.0\",\n \"ratchet/pawl\": \"^0.4.1\",\n \"symfony/event-dispatcher\": \"^2|^3|^4|^5|^6\"\n },\n \"require-dev\": {\n \"macfja/phar-builder\": \"^0.2.8\",\n \"php-coveralls/php-coveralls\": \"^2.1\",\n \"phpunit/phpunit\": \"^7.5.12|^8.0|^9.0\",\n \"react/async\": \"^3.0\"\n },\n \"suggest\": {\n \"ext-openssl\": \"to decrypt PubNub messages\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"phar-builder\": {\n \"name\": \"ringcentral.phar\",\n \"include\": [],\n \"excluded\": [\n \"vendor/bin\"\n ],\n \"output-dir\": \"./dist\",\n \"compression\": \"gzip\",\n \"entry-point\": \"./vendor/autoload.php\",\n \"include-dev\": false,\n \"skip-shebang\": true\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"RingCentral\\\\SDK\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Kirill Konshin\",\n \"email\": \"kirill.konshin@ringcentral.com\"\n },\n {\n \"name\": \"Byrne Reese\",\n \"email\": \"byrne.reese@ringcentral.com\"\n }\n ],\n \"description\": \"RingCentral Platform PHP SDK\",\n \"homepage\": \"http://developers.ringcentral.com\",\n \"keywords\": [\n \"api\",\n \"connect\",\n \"php\",\n \"platform\",\n \"ringcentral\",\n \"sdk\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/ringcentral/ringcentral-php/issues\",\n \"source\": \"https://github.com/ringcentral/ringcentral-php/tree/3.0.0\"\n },\n \"time\": \"2023-05-31T09:14:02+00:00\"\n },\n {\n \"name\": \"rmccue/requests\",\n \"version\": \"v2.0.15\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/WordPress/Requests.git\",\n \"reference\": \"877cd66169755899682f1595e057334b40d9d149\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/WordPress/Requests/zipball/877cd66169755899682f1595e057334b40d9d149\",\n \"reference\": \"877cd66169755899682f1595e057334b40d9d149\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"ext-json\": \"*\",\n \"php\": \">=5.6\"\n },\n \"require-dev\": {\n \"dealerdirect/phpcodesniffer-composer-installer\": \"^0.7\",\n \"php-parallel-lint/php-console-highlighter\": \"^0.5.0\",\n \"php-parallel-lint/php-parallel-lint\": \"^1.3.1\",\n \"phpcompatibility/php-compatibility\": \"^9.0\",\n \"requests/test-server\": \"dev-main\",\n \"roave/security-advisories\": \"dev-latest\",\n \"squizlabs/php_codesniffer\": \"^3.6\",\n \"wp-coding-standards/wpcs\": \"^2.0\",\n \"yoast/phpunit-polyfills\": \"^1.0.0\"\n },\n \"suggest\": {\n \"art4/requests-psr18-adapter\": \"For using Requests as a PSR-18 HTTP Client\",\n \"ext-curl\": \"For improved performance\",\n \"ext-openssl\": \"For secure transport support\",\n \"ext-zlib\": \"For improved performance when decompressing encoded streams\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"files\": [\n \"library/Deprecated.php\"\n ],\n \"psr-4\": {\n \"WpOrg\\\\Requests\\\\\": \"src/\"\n },\n \"classmap\": [\n \"library/Requests.php\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"ISC\"\n ],\n \"authors\": [\n {\n \"name\": \"Ryan McCue\",\n \"homepage\": \"https://rmccue.io/\"\n },\n {\n \"name\": \"Alain Schlesser\",\n \"homepage\": \"https://github.com/schlessera\"\n },\n {\n \"name\": \"Juliette Reinders Folmer\",\n \"homepage\": \"https://github.com/jrfnl\"\n },\n {\n \"name\": \"Contributors\",\n \"homepage\": \"https://github.com/WordPress/Requests/graphs/contributors\"\n }\n ],\n \"description\": \"A HTTP library written in PHP, for human beings.\",\n \"homepage\": \"https://requests.ryanmccue.info/\",\n \"keywords\": [\n \"curl\",\n \"fsockopen\",\n \"http\",\n \"idna\",\n \"ipv6\",\n \"iri\",\n \"sockets\"\n ],\n \"support\": {\n \"docs\": \"https://requests.ryanmccue.info/\",\n \"issues\": \"https://github.com/WordPress/Requests/issues\",\n \"source\": \"https://github.com/WordPress/Requests\"\n },\n \"time\": \"2025-01-21T10:13:31+00:00\"\n },\n {\n \"name\": \"robrichards/xmlseclibs\",\n \"version\": \"3.1.5\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/robrichards/xmlseclibs.git\",\n \"reference\": \"03062be78178cbb5e8f605cd255dc32a14981f92\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/robrichards/xmlseclibs/zipball/03062be78178cbb5e8f605cd255dc32a14981f92\",\n \"reference\": \"03062be78178cbb5e8f605cd255dc32a14981f92\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"ext-openssl\": \"*\",\n \"php\": \">= 5.4\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"RobRichards\\\\XMLSecLibs\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"BSD-3-Clause\"\n ],\n \"description\": \"A PHP library for XML Security\",\n \"homepage\": \"https://github.com/robrichards/xmlseclibs\",\n \"keywords\": [\n \"security\",\n \"signature\",\n \"xml\",\n \"xmldsig\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/robrichards/xmlseclibs/issues\",\n \"source\": \"https://github.com/robrichards/xmlseclibs/tree/3.1.5\"\n },\n \"time\": \"2026-03-13T10:31:56+00:00\"\n },\n {\n \"name\": \"ruflin/elastica\",\n \"version\": \"7.3.2\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/ruflin/Elastica.git\",\n \"reference\": \"84ba137678707a1aa4242d12bad891dc38fa2608\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/ruflin/Elastica/zipball/84ba137678707a1aa4242d12bad891dc38fa2608\",\n \"reference\": \"84ba137678707a1aa4242d12bad891dc38fa2608\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"elasticsearch/elasticsearch\": \"^7.10\",\n \"ext-json\": \"*\",\n \"nyholm/dsn\": \"^2.0.0\",\n \"php\": \"^7.2 || ^8.0\",\n \"psr/log\": \"^1.0 || ^2.0 || ^3.0\",\n \"symfony/deprecation-contracts\": \"^2.2 || ^3.0\",\n \"symfony/polyfill-php73\": \"^1.19\"\n },\n \"require-dev\": {\n \"aws/aws-sdk-php\": \"^3.155\",\n \"guzzlehttp/guzzle\": \"^6.3 || ^7.2\",\n \"phpstan/phpstan\": \"^1.5\",\n \"phpstan/phpstan-phpunit\": \"^1.1\",\n \"phpunit/phpunit\": \"^8.5.8 || ^9.4\",\n \"symfony/phpunit-bridge\": \"^6.0\"\n },\n \"suggest\": {\n \"aws/aws-sdk-php\": \"Allow using IAM authentication with Amazon ElasticSearch Service\",\n \"guzzlehttp/guzzle\": \"Allow using guzzle as transport\",\n \"monolog/monolog\": \"Logging request\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"7.0.x-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Elastica\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Nicolas Ruflin\",\n \"homepage\": \"http://ruflin.com/\"\n }\n ],\n \"description\": \"Elasticsearch Client\",\n \"homepage\": \"http://elastica.io/\",\n \"keywords\": [\n \"client\",\n \"search\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/ruflin/Elastica/issues\",\n \"source\": \"https://github.com/ruflin/Elastica/tree/7.3.2\"\n },\n \"time\": \"2024-03-11T14:11:50+00:00\"\n },\n {\n \"name\": \"santigarcor/laratrust\",\n \"version\": \"8.5.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/santigarcor/laratrust.git\",\n \"reference\": \"33229272952f2cb61593b67a68aff43c99a0e4f0\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/santigarcor/laratrust/zipball/33229272952f2cb61593b67a68aff43c99a0e4f0\",\n \"reference\": \"33229272952f2cb61593b67a68aff43c99a0e4f0\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"kkszymanowski/traitor\": \"^1.0\",\n \"laravel/framework\": \"^10.0|^11.0|^12.0\",\n \"php\": \">=8.1\"\n },\n \"require-dev\": {\n \"mockery/mockery\": \"^1.3.2\",\n \"orchestra/testbench\": \"^8.0|^9.0|^10.0\",\n \"phpunit/phpunit\": \"^8.4|^9.0|^10.5|^11.5.3\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"laravel\": {\n \"aliases\": {\n \"Laratrust\": \"Laratrust\\\\LaratrustFacade\"\n },\n \"providers\": [\n \"Laratrust\\\\LaratrustServiceProvider\"\n ]\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Laratrust\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Santiago Garcia\",\n \"homepage\": \"http://santigarcor.me\"\n }\n ],\n \"description\": \"This package provides a flexible way to add Role-based Permissions to Laravel\",\n \"keywords\": [\n \"Teams\",\n \"acl\",\n \"authorization\",\n \"laratrust\",\n \"laravel\",\n \"multiusers\",\n \"permissions\",\n \"php\",\n \"rbac\",\n \"roles\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/santigarcor/laratrust/issues\",\n \"source\": \"https://github.com/santigarcor/laratrust/tree/8.5.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/santigarcor\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2025-06-02T14:29:05+00:00\"\n },\n {\n \"name\": \"sentry/sentry\",\n \"version\": \"4.13.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/getsentry/sentry-php.git\",\n \"reference\": \"b54a0eaedfc27fc2da587e64455a66cd29cd3c4d\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/getsentry/sentry-php/zipball/b54a0eaedfc27fc2da587e64455a66cd29cd3c4d\",\n \"reference\": \"b54a0eaedfc27fc2da587e64455a66cd29cd3c4d\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"ext-curl\": \"*\",\n \"ext-json\": \"*\",\n \"ext-mbstring\": \"*\",\n \"guzzlehttp/psr7\": \"^1.8.4|^2.1.1\",\n \"jean85/pretty-package-versions\": \"^1.5|^2.0.4\",\n \"php\": \"^7.2|^8.0\",\n \"psr/log\": \"^1.0|^2.0|^3.0\",\n \"symfony/options-resolver\": \"^4.4.30|^5.0.11|^6.0|^7.0\"\n },\n \"conflict\": {\n \"raven/raven\": \"*\"\n },\n \"require-dev\": {\n \"friendsofphp/php-cs-fixer\": \"^3.4\",\n \"guzzlehttp/promises\": \"^2.0.3\",\n \"guzzlehttp/psr7\": \"^1.8.4|^2.1.1\",\n \"monolog/monolog\": \"^1.6|^2.0|^3.0\",\n \"phpbench/phpbench\": \"^1.0\",\n \"phpstan/phpstan\": \"^1.3\",\n \"phpunit/phpunit\": \"^8.5|^9.6\",\n \"symfony/phpunit-bridge\": \"^5.2|^6.0|^7.0\",\n \"vimeo/psalm\": \"^4.17\"\n },\n \"suggest\": {\n \"monolog/monolog\": \"Allow sending log messages to Sentry by using the included Monolog handler.\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"files\": [\n \"src/functions.php\"\n ],\n \"psr-4\": {\n \"Sentry\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Sentry\",\n \"email\": \"accounts@sentry.io\"\n }\n ],\n \"description\": \"PHP SDK for Sentry (http://sentry.io)\",\n \"homepage\": \"http://sentry.io\",\n \"keywords\": [\n \"crash-reporting\",\n \"crash-reports\",\n \"error-handler\",\n \"error-monitoring\",\n \"log\",\n \"logging\",\n \"profiling\",\n \"sentry\",\n \"tracing\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/getsentry/sentry-php/issues\",\n \"source\": \"https://github.com/getsentry/sentry-php/tree/4.13.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://sentry.io/\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://sentry.io/pricing/\",\n \"type\": \"custom\"\n }\n ],\n \"time\": \"2025-06-10T15:39:27+00:00\"\n },\n {\n \"name\": \"sentry/sentry-laravel\",\n \"version\": \"4.13.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/getsentry/sentry-laravel.git\",\n \"reference\": \"d232ac494258e0d50a77c575a5af5f1a426d3f87\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/getsentry/sentry-laravel/zipball/d232ac494258e0d50a77c575a5af5f1a426d3f87\",\n \"reference\": \"d232ac494258e0d50a77c575a5af5f1a426d3f87\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"illuminate/support\": \"^6.0 | ^7.0 | ^8.0 | ^9.0 | ^10.0 | ^11.0 | ^12.0\",\n \"nyholm/psr7\": \"^1.0\",\n \"php\": \"^7.2 | ^8.0\",\n \"sentry/sentry\": \"^4.10\",\n \"symfony/psr-http-message-bridge\": \"^1.0 | ^2.0 | ^6.0 | ^7.0\"\n },\n \"require-dev\": {\n \"friendsofphp/php-cs-fixer\": \"^3.11\",\n \"guzzlehttp/guzzle\": \"^7.2\",\n \"laravel/folio\": \"^1.1\",\n \"laravel/framework\": \"^6.0 | ^7.0 | ^8.0 | ^9.0 | ^10.0 | ^11.0 | ^12.0\",\n \"livewire/livewire\": \"^2.0 | ^3.0\",\n \"mockery/mockery\": \"^1.3\",\n \"orchestra/testbench\": \"^4.7 | ^5.1 | ^6.0 | ^7.0 | ^8.0 | ^9.0 | ^10.0\",\n \"phpstan/phpstan\": \"^1.10\",\n \"phpunit/phpunit\": \"^8.4 | ^9.3 | ^10.4 | ^11.5\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"laravel\": {\n \"aliases\": {\n \"Sentry\": \"Sentry\\\\Laravel\\\\Facade\"\n },\n \"providers\": [\n \"Sentry\\\\Laravel\\\\ServiceProvider\",\n \"Sentry\\\\Laravel\\\\Tracing\\\\ServiceProvider\"\n ]\n }\n },\n \"autoload\": {\n \"psr-0\": {\n \"Sentry\\\\Laravel\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Sentry\",\n \"email\": \"accounts@sentry.io\"\n }\n ],\n \"description\": \"Laravel SDK for Sentry (https://sentry.io)\",\n \"homepage\": \"https://sentry.io\",\n \"keywords\": [\n \"crash-reporting\",\n \"crash-reports\",\n \"error-handler\",\n \"error-monitoring\",\n \"laravel\",\n \"log\",\n \"logging\",\n \"profiling\",\n \"sentry\",\n \"tracing\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/getsentry/sentry-laravel/issues\",\n \"source\": \"https://github.com/getsentry/sentry-laravel/tree/4.13.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://sentry.io/\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://sentry.io/pricing/\",\n \"type\": \"custom\"\n }\n ],\n \"time\": \"2025-02-18T10:09:29+00:00\"\n },\n {\n \"name\": \"shiftonelabs/laravel-sqs-fifo-queue\",\n \"version\": \"3.0.3\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/shiftonelabs/laravel-sqs-fifo-queue.git\",\n \"reference\": \"ef10d55db6a93243b8ea3789590f46a0567e44f6\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/shiftonelabs/laravel-sqs-fifo-queue/zipball/ef10d55db6a93243b8ea3789590f46a0567e44f6\",\n \"reference\": \"ef10d55db6a93243b8ea3789590f46a0567e44f6\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"aws/aws-sdk-php\": \"~3.0\",\n \"illuminate/queue\": \">=9.0\",\n \"illuminate/support\": \">=9.0\",\n \"php\": \">=8.0.2\",\n \"ramsey/uuid\": \">=4.2.2\"\n },\n \"require-dev\": {\n \"illuminate/mail\": \">=9.0\",\n \"illuminate/notifications\": \">=9.0\",\n \"mockery/mockery\": \"~1.3\",\n \"phpunit/phpunit\": \"~9.3 || ~10.0\",\n \"shiftonelabs/codesniffer-standard\": \"0.*\",\n \"squizlabs/php_codesniffer\": \"3.*\",\n \"vlucas/phpdotenv\": \"~5.4\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"laravel\": {\n \"providers\": [\n \"ShiftOneLabs\\\\LaravelSqsFifoQueue\\\\LaravelSqsFifoQueueServiceProvider\"\n ]\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"ShiftOneLabs\\\\LaravelSqsFifoQueue\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Patrick Carlo-Hickman\",\n \"email\": \"patrick@shiftonelabs.com\"\n }\n ],\n \"description\": \"Adds a Laravel queue driver for Amazon SQS FIFO queues.\",\n \"homepage\": \"https://github.com/shiftonelabs/laravel-sqs-fifo-queue\",\n \"keywords\": [\n \"aws\",\n \"fifo\",\n \"illuminate\",\n \"laravel\",\n \"lumen\",\n \"queue\",\n \"sqs\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/shiftonelabs/laravel-sqs-fifo-queue/issues\",\n \"source\": \"https://github.com/shiftonelabs/laravel-sqs-fifo-queue\"\n },\n \"time\": \"2024-09-21T22:48:23+00:00\"\n },\n {\n \"name\": \"spatie/backtrace\",\n \"version\": \"1.8.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/spatie/backtrace.git\",\n \"reference\": \"8c0f16a59ae35ec8c62d85c3c17585158f430110\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/spatie/backtrace/zipball/8c0f16a59ae35ec8c62d85c3c17585158f430110\",\n \"reference\": \"8c0f16a59ae35ec8c62d85c3c17585158f430110\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \"^7.3 || ^8.0\"\n },\n \"require-dev\": {\n \"ext-json\": \"*\",\n \"laravel/serializable-closure\": \"^1.3 || ^2.0\",\n \"phpunit/phpunit\": \"^9.3 || ^11.4.3\",\n \"spatie/phpunit-snapshot-assertions\": \"^4.2 || ^5.1.6\",\n \"symfony/var-dumper\": \"^5.1 || ^6.0 || ^7.0\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Spatie\\\\Backtrace\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Freek Van de Herten\",\n \"email\": \"freek@spatie.be\",\n \"homepage\": \"https://spatie.be\",\n \"role\": \"Developer\"\n }\n ],\n \"description\": \"A better backtrace\",\n \"homepage\": \"https://github.com/spatie/backtrace\",\n \"keywords\": [\n \"Backtrace\",\n \"spatie\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/spatie/backtrace/issues\",\n \"source\": \"https://github.com/spatie/backtrace/tree/1.8.1\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/sponsors/spatie\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://spatie.be/open-source/support-us\",\n \"type\": \"other\"\n }\n ],\n \"time\": \"2025-08-26T08:22:30+00:00\"\n },\n {\n \"name\": \"spatie/error-solutions\",\n \"version\": \"1.1.3\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/spatie/error-solutions.git\",\n \"reference\": \"e495d7178ca524f2dd0fe6a1d99a1e608e1c9936\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/spatie/error-solutions/zipball/e495d7178ca524f2dd0fe6a1d99a1e608e1c9936\",\n \"reference\": \"e495d7178ca524f2dd0fe6a1d99a1e608e1c9936\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \"^8.0\"\n },\n \"require-dev\": {\n \"illuminate/broadcasting\": \"^10.0|^11.0|^12.0\",\n \"illuminate/cache\": \"^10.0|^11.0|^12.0\",\n \"illuminate/support\": \"^10.0|^11.0|^12.0\",\n \"livewire/livewire\": \"^2.11|^3.5.20\",\n \"openai-php/client\": \"^0.10.1\",\n \"orchestra/testbench\": \"8.22.3|^9.0|^10.0\",\n \"pestphp/pest\": \"^2.20|^3.0\",\n \"phpstan/phpstan\": \"^2.1\",\n \"psr/simple-cache\": \"^3.0\",\n \"psr/simple-cache-implementation\": \"^3.0\",\n \"spatie/ray\": \"^1.28\",\n \"symfony/cache\": \"^5.4|^6.0|^7.0\",\n \"symfony/process\": \"^5.4|^6.0|^7.0\",\n \"vlucas/phpdotenv\": \"^5.5\"\n },\n \"suggest\": {\n \"openai-php/client\": \"Require get solutions from OpenAI\",\n \"simple-cache-implementation\": \"To cache solutions from OpenAI\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Spatie\\\\Ignition\\\\\": \"legacy/ignition\",\n \"Spatie\\\\ErrorSolutions\\\\\": \"src\",\n \"Spatie\\\\LaravelIgnition\\\\\": \"legacy/laravel-ignition\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Ruben Van Assche\",\n \"email\": \"ruben@spatie.be\",\n \"role\": \"Developer\"\n }\n ],\n \"description\": \"This is my package error-solutions\",\n \"homepage\": \"https://github.com/spatie/error-solutions\",\n \"keywords\": [\n \"error-solutions\",\n \"spatie\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/spatie/error-solutions/issues\",\n \"source\": \"https://github.com/spatie/error-solutions/tree/1.1.3\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/Spatie\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2025-02-14T12:29:50+00:00\"\n },\n {\n \"name\": \"spatie/flare-client-php\",\n \"version\": \"1.10.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/spatie/flare-client-php.git\",\n \"reference\": \"bf1716eb98bd689451b071548ae9e70738dce62f\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/spatie/flare-client-php/zipball/bf1716eb98bd689451b071548ae9e70738dce62f\",\n \"reference\": \"bf1716eb98bd689451b071548ae9e70738dce62f\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"illuminate/pipeline\": \"^8.0|^9.0|^10.0|^11.0|^12.0\",\n \"php\": \"^8.0\",\n \"spatie/backtrace\": \"^1.6.1\",\n \"symfony/http-foundation\": \"^5.2|^6.0|^7.0\",\n \"symfony/mime\": \"^5.2|^6.0|^7.0\",\n \"symfony/process\": \"^5.2|^6.0|^7.0\",\n \"symfony/var-dumper\": \"^5.2|^6.0|^7.0\"\n },\n \"require-dev\": {\n \"dms/phpunit-arraysubset-asserts\": \"^0.5.0\",\n \"pestphp/pest\": \"^1.20|^2.0\",\n \"phpstan/extension-installer\": \"^1.1\",\n \"phpstan/phpstan-deprecation-rules\": \"^1.0\",\n \"phpstan/phpstan-phpunit\": \"^1.0\",\n \"spatie/pest-plugin-snapshots\": \"^1.0|^2.0\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-main\": \"1.3.x-dev\"\n }\n },\n \"autoload\": {\n \"files\": [\n \"src/helpers.php\"\n ],\n \"psr-4\": {\n \"Spatie\\\\FlareClient\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"description\": \"Send PHP errors to Flare\",\n \"homepage\": \"https://github.com/spatie/flare-client-php\",\n \"keywords\": [\n \"exception\",\n \"flare\",\n \"reporting\",\n \"spatie\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/spatie/flare-client-php/issues\",\n \"source\": \"https://github.com/spatie/flare-client-php/tree/1.10.1\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/spatie\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2025-02-14T13:42:06+00:00\"\n },\n {\n \"name\": \"spatie/fractalistic\",\n \"version\": \"2.11.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/spatie/fractalistic.git\",\n \"reference\": \"046c535f30b31a9356fc034ce75e8ee74614ed4f\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/spatie/fractalistic/zipball/046c535f30b31a9356fc034ce75e8ee74614ed4f\",\n \"reference\": \"046c535f30b31a9356fc034ce75e8ee74614ed4f\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"league/fractal\": \"^0.20.1\",\n \"php\": \"^7.4|^8.0\"\n },\n \"require-dev\": {\n \"illuminate/pagination\": \"~5.3.0|~5.4.0|^9.0\",\n \"pestphp/pest\": \"^1.22\",\n \"phpunit/phpunit\": \"^9.0\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Spatie\\\\Fractalistic\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Freek Van der Herten\",\n \"email\": \"freek@spatie.be\",\n \"homepage\": \"https://spatie.be\",\n \"role\": \"Developer\"\n }\n ],\n \"description\": \"A developer friendly wrapper around Fractal\",\n \"homepage\": \"https://github.com/spatie/fractalistic\",\n \"keywords\": [\n \"api\",\n \"fractal\",\n \"fractalistic\",\n \"spatie\",\n \"transform\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/spatie/fractalistic/issues\",\n \"source\": \"https://github.com/spatie/fractalistic/tree/2.11.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/spatie\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2025-01-27T09:52:33+00:00\"\n },\n {\n \"name\": \"spatie/ignition\",\n \"version\": \"1.15.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/spatie/ignition.git\",\n \"reference\": \"31f314153020aee5af3537e507fef892ffbf8c85\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/spatie/ignition/zipball/31f314153020aee5af3537e507fef892ffbf8c85\",\n \"reference\": \"31f314153020aee5af3537e507fef892ffbf8c85\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"ext-json\": \"*\",\n \"ext-mbstring\": \"*\",\n \"php\": \"^8.0\",\n \"spatie/error-solutions\": \"^1.0\",\n \"spatie/flare-client-php\": \"^1.7\",\n \"symfony/console\": \"^5.4|^6.0|^7.0\",\n \"symfony/var-dumper\": \"^5.4|^6.0|^7.0\"\n },\n \"require-dev\": {\n \"illuminate/cache\": \"^9.52|^10.0|^11.0|^12.0\",\n \"mockery/mockery\": \"^1.4\",\n \"pestphp/pest\": \"^1.20|^2.0\",\n \"phpstan/extension-installer\": \"^1.1\",\n \"phpstan/phpstan-deprecation-rules\": \"^1.0\",\n \"phpstan/phpstan-phpunit\": \"^1.0\",\n \"psr/simple-cache-implementation\": \"*\",\n \"symfony/cache\": \"^5.4|^6.0|^7.0\",\n \"symfony/process\": \"^5.4|^6.0|^7.0\",\n \"vlucas/phpdotenv\": \"^5.5\"\n },\n \"suggest\": {\n \"openai-php/client\": \"Require get solutions from OpenAI\",\n \"simple-cache-implementation\": \"To cache solutions from OpenAI\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-main\": \"1.5.x-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Spatie\\\\Ignition\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Spatie\",\n \"email\": \"info@spatie.be\",\n \"role\": \"Developer\"\n }\n ],\n \"description\": \"A beautiful error page for PHP applications.\",\n \"homepage\": \"https://flareapp.io/ignition\",\n \"keywords\": [\n \"error\",\n \"flare\",\n \"laravel\",\n \"page\"\n ],\n \"support\": {\n \"docs\": \"https://flareapp.io/docs/ignition-for-laravel/introduction\",\n \"forum\": \"https://twitter.com/flareappio\",\n \"issues\": \"https://github.com/spatie/ignition/issues\",\n \"source\": \"https://github.com/spatie/ignition\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/spatie\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2025-02-21T14:31:39+00:00\"\n },\n {\n \"name\": \"spatie/laravel-fractal\",\n \"version\": \"6.3.2\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/spatie/laravel-fractal.git\",\n \"reference\": \"d078aa670233100e1309a0a7096c42f5b605ef29\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/spatie/laravel-fractal/zipball/d078aa670233100e1309a0a7096c42f5b605ef29\",\n \"reference\": \"d078aa670233100e1309a0a7096c42f5b605ef29\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"illuminate/contracts\": \"^8.0|^9.0|^10.0|^11.0|^12.0\",\n \"illuminate/support\": \"^8.0|^9.0|^10.0|^11.0|^12.0\",\n \"league/fractal\": \"^0.20.1|^0.20\",\n \"nesbot/carbon\": \"^2.63|^3.0\",\n \"php\": \"^8.0\",\n \"spatie/fractalistic\": \"^2.9.5|^2.9\",\n \"spatie/laravel-package-tools\": \"^1.11\"\n },\n \"require-dev\": {\n \"ext-json\": \"*\",\n \"orchestra/testbench\": \"^7.0|^8.0|^9.0|^10.0\",\n \"pestphp/pest\": \"^1.22|^2.34|^3.0\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"laravel\": {\n \"aliases\": {\n \"Fractal\": \"Spatie\\\\Fractal\\\\Facades\\\\Fractal\"\n },\n \"providers\": [\n \"Spatie\\\\Fractal\\\\FractalServiceProvider\"\n ]\n }\n },\n \"autoload\": {\n \"files\": [\n \"src/helpers.php\"\n ],\n \"psr-4\": {\n \"Spatie\\\\Fractal\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Freek Van der Herten\",\n \"email\": \"freek@spatie.be\",\n \"homepage\": \"https://spatie.be\",\n \"role\": \"Developer\"\n }\n ],\n \"description\": \"An easy to use Fractal integration for Laravel applications\",\n \"homepage\": \"https://github.com/spatie/laravel-fractal\",\n \"keywords\": [\n \"api\",\n \"fractal\",\n \"laravel\",\n \"laravel-fractal\",\n \"lumen\",\n \"spatie\",\n \"transform\"\n ],\n \"support\": {\n \"source\": \"https://github.com/spatie/laravel-fractal/tree/6.3.2\"\n },\n \"funding\": [\n {\n \"url\": \"https://spatie.be/open-source/support-us\",\n \"type\": \"custom\"\n }\n ],\n \"time\": \"2025-02-14T10:43:50+00:00\"\n },\n {\n \"name\": \"spatie/laravel-ignition\",\n \"version\": \"2.9.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/spatie/laravel-ignition.git\",\n \"reference\": \"1baee07216d6748ebd3a65ba97381b051838707a\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/spatie/laravel-ignition/zipball/1baee07216d6748ebd3a65ba97381b051838707a\",\n \"reference\": \"1baee07216d6748ebd3a65ba97381b051838707a\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"ext-curl\": \"*\",\n \"ext-json\": \"*\",\n \"ext-mbstring\": \"*\",\n \"illuminate/support\": \"^10.0|^11.0|^12.0\",\n \"php\": \"^8.1\",\n \"spatie/ignition\": \"^1.15\",\n \"symfony/console\": \"^6.2.3|^7.0\",\n \"symfony/var-dumper\": \"^6.2.3|^7.0\"\n },\n \"require-dev\": {\n \"livewire/livewire\": \"^2.11|^3.3.5\",\n \"mockery/mockery\": \"^1.5.1\",\n \"openai-php/client\": \"^0.8.1|^0.10\",\n \"orchestra/testbench\": \"8.22.3|^9.0|^10.0\",\n \"pestphp/pest\": \"^2.34|^3.7\",\n \"phpstan/extension-installer\": \"^1.3.1\",\n \"phpstan/phpstan-deprecation-rules\": \"^1.1.1|^2.0\",\n \"phpstan/phpstan-phpunit\": \"^1.3.16|^2.0\",\n \"vlucas/phpdotenv\": \"^5.5\"\n },\n \"suggest\": {\n \"openai-php/client\": \"Require get solutions from OpenAI\",\n \"psr/simple-cache-implementation\": \"Needed to cache solutions from OpenAI\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"laravel\": {\n \"aliases\": {\n \"Flare\": \"Spatie\\\\LaravelIgnition\\\\Facades\\\\Flare\"\n },\n \"providers\": [\n \"Spatie\\\\LaravelIgnition\\\\IgnitionServiceProvider\"\n ]\n }\n },\n \"autoload\": {\n \"files\": [\n \"src/helpers.php\"\n ],\n \"psr-4\": {\n \"Spatie\\\\LaravelIgnition\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Spatie\",\n \"email\": \"info@spatie.be\",\n \"role\": \"Developer\"\n }\n ],\n \"description\": \"A beautiful error page for Laravel applications.\",\n \"homepage\": \"https://flareapp.io/ignition\",\n \"keywords\": [\n \"error\",\n \"flare\",\n \"laravel\",\n \"page\"\n ],\n \"support\": {\n \"docs\": \"https://flareapp.io/docs/ignition-for-laravel/introduction\",\n \"forum\": \"https://twitter.com/flareappio\",\n \"issues\": \"https://github.com/spatie/laravel-ignition/issues\",\n \"source\": \"https://github.com/spatie/laravel-ignition\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/spatie\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2025-02-20T13:13:55+00:00\"\n },\n {\n \"name\": \"spatie/laravel-package-tools\",\n \"version\": \"1.92.7\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/spatie/laravel-package-tools.git\",\n \"reference\": \"f09a799850b1ed765103a4f0b4355006360c49a5\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/spatie/laravel-package-tools/zipball/f09a799850b1ed765103a4f0b4355006360c49a5\",\n \"reference\": \"f09a799850b1ed765103a4f0b4355006360c49a5\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"illuminate/contracts\": \"^9.28|^10.0|^11.0|^12.0\",\n \"php\": \"^8.0\"\n },\n \"require-dev\": {\n \"mockery/mockery\": \"^1.5\",\n \"orchestra/testbench\": \"^7.7|^8.0|^9.0|^10.0\",\n \"pestphp/pest\": \"^1.23|^2.1|^3.1\",\n \"phpunit/php-code-coverage\": \"^9.0|^10.0|^11.0\",\n \"phpunit/phpunit\": \"^9.5.24|^10.5|^11.5\",\n \"spatie/pest-plugin-test-time\": \"^1.1|^2.2\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Spatie\\\\LaravelPackageTools\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Freek Van der Herten\",\n \"email\": \"freek@spatie.be\",\n \"role\": \"Developer\"\n }\n ],\n \"description\": \"Tools for creating Laravel packages\",\n \"homepage\": \"https://github.com/spatie/laravel-package-tools\",\n \"keywords\": [\n \"laravel-package-tools\",\n \"spatie\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/spatie/laravel-package-tools/issues\",\n \"source\": \"https://github.com/spatie/laravel-package-tools/tree/1.92.7\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/spatie\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2025-07-17T15:46:43+00:00\"\n },\n {\n \"name\": \"spatie/laravel-webhook-server\",\n \"version\": \"3.8.3\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/spatie/laravel-webhook-server.git\",\n \"reference\": \"e3d8f24030bbb4087867cd0be681c028736b772f\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/spatie/laravel-webhook-server/zipball/e3d8f24030bbb4087867cd0be681c028736b772f\",\n \"reference\": \"e3d8f24030bbb4087867cd0be681c028736b772f\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"ext-json\": \"*\",\n \"guzzlehttp/guzzle\": \"^6.3|^7.3\",\n \"illuminate/bus\": \"^8.50|^9.0|^10.0|^11.0|^12.0\",\n \"illuminate/queue\": \"^8.50|^9.0|^10.0|^11.0|^12.0\",\n \"illuminate/support\": \"^8.50|^9.0|^10.0|^11.0|^12.0\",\n \"php\": \"^8.0\",\n \"spatie/laravel-package-tools\": \"^1.11\"\n },\n \"require-dev\": {\n \"mockery/mockery\": \"^1.4.3\",\n \"orchestra/testbench\": \"^6.19|^7.0|^8.0|^10.0\",\n \"pestphp/pest\": \"^1.22|^2.0|^3.0\",\n \"pestphp/pest-plugin-laravel\": \"^1.3|^2.0|^3.0\",\n \"spatie/test-time\": \"^1.2.2\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"laravel\": {\n \"providers\": [\n \"Spatie\\\\WebhookServer\\\\WebhookServerServiceProvider\"\n ]\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Spatie\\\\WebhookServer\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Freek Van der Herten\",\n \"email\": \"freek@spatie.be\",\n \"homepage\": \"https://spatie.be\",\n \"role\": \"Developer\"\n }\n ],\n \"description\": \"Send webhooks in Laravel apps\",\n \"homepage\": \"https://github.com/spatie/laravel-webhook-server\",\n \"keywords\": [\n \"laravel-webhook-server\",\n \"server\",\n \"spatie\",\n \"webhook\"\n ],\n \"support\": {\n \"source\": \"https://github.com/spatie/laravel-webhook-server/tree/3.8.3\"\n },\n \"funding\": [\n {\n \"url\": \"https://spatie.be/open-source/support-us\",\n \"type\": \"custom\"\n }\n ],\n \"time\": \"2025-02-14T12:55:41+00:00\"\n },\n {\n \"name\": \"spatie/temporary-directory\",\n \"version\": \"2.3.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/spatie/temporary-directory.git\",\n \"reference\": \"580eddfe9a0a41a902cac6eeb8f066b42e65a32b\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/spatie/temporary-directory/zipball/580eddfe9a0a41a902cac6eeb8f066b42e65a32b\",\n \"reference\": \"580eddfe9a0a41a902cac6eeb8f066b42e65a32b\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \"^8.0\"\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \"^9.5\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Spatie\\\\TemporaryDirectory\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Alex Vanderbist\",\n \"email\": \"alex@spatie.be\",\n \"homepage\": \"https://spatie.be\",\n \"role\": \"Developer\"\n }\n ],\n \"description\": \"Easily create, use and destroy temporary directories\",\n \"homepage\": \"https://github.com/spatie/temporary-directory\",\n \"keywords\": [\n \"php\",\n \"spatie\",\n \"temporary-directory\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/spatie/temporary-directory/issues\",\n \"source\": \"https://github.com/spatie/temporary-directory/tree/2.3.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://spatie.be/open-source/support-us\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/spatie\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2025-01-13T13:04:43+00:00\"\n },\n {\n \"name\": \"staudenmeir/belongs-to-through\",\n \"version\": \"v2.17\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/staudenmeir/belongs-to-through.git\",\n \"reference\": \"e45460f8eecd882e5daea2af8f948d7596c20ba0\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/staudenmeir/belongs-to-through/zipball/e45460f8eecd882e5daea2af8f948d7596c20ba0\",\n \"reference\": \"e45460f8eecd882e5daea2af8f948d7596c20ba0\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"illuminate/database\": \"^12.0\",\n \"php\": \"^8.2\"\n },\n \"require-dev\": {\n \"barryvdh/laravel-ide-helper\": \"^3.0\",\n \"larastan/larastan\": \"^3.0\",\n \"laravel/framework\": \"^12.0\",\n \"mockery/mockery\": \"^1.5.1\",\n \"orchestra/testbench-core\": \"^10.0\",\n \"phpunit/phpunit\": \"^11.0\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"laravel\": {\n \"providers\": [\n \"Staudenmeir\\\\BelongsToThrough\\\\IdeHelperServiceProvider\"\n ]\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Znck\\\\Eloquent\\\\\": \"src/\",\n \"Staudenmeir\\\\BelongsToThrough\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Rahul Kadyan\",\n \"email\": \"hi@znck.me\"\n },\n {\n \"name\": \"Jonas Staudenmeir\",\n \"email\": \"mail@jonas-staudenmeir.de\"\n }\n ],\n \"description\": \"Laravel Eloquent BelongsToThrough relationships\",\n \"support\": {\n \"issues\": \"https://github.com/staudenmeir/belongs-to-through/issues\",\n \"source\": \"https://github.com/staudenmeir/belongs-to-through/tree/v2.17\"\n },\n \"funding\": [\n {\n \"url\": \"https://paypal.me/JonasStaudenmeir\",\n \"type\": \"custom\"\n }\n ],\n \"time\": \"2025-02-20T19:24:03+00:00\"\n },\n {\n \"name\": \"stduritemplate/stduritemplate\",\n \"version\": \"2.0.8\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/std-uritemplate/std-uritemplate-php.git\",\n \"reference\": \"4c08308d512d5f349acdd415800f011300f7cf98\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/std-uritemplate/std-uritemplate-php/zipball/4c08308d512d5f349acdd415800f011300f7cf98\",\n \"reference\": \"4c08308d512d5f349acdd415800f011300f7cf98\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \"^7.4 || ^8.0\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"StdUriTemplate\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"Apache-2.0\"\n ],\n \"authors\": [\n {\n \"name\": \"Andrea Peruffo\",\n \"email\": \"andrea.peruffo1982@gmail.com\"\n }\n ],\n \"description\": \"Std UriTemplate, RFC 6570 implementation\",\n \"support\": {\n \"source\": \"https://github.com/std-uritemplate/std-uritemplate-php/tree/2.0.8\"\n },\n \"time\": \"2025-10-16T15:52:12+00:00\"\n },\n {\n \"name\": \"stevenmaguire/oauth2-salesforce\",\n \"version\": \"2.0.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/stevenmaguire/oauth2-salesforce.git\",\n \"reference\": \"37e1a2a59240e14b1f95d416a4f8d3d57199822b\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/stevenmaguire/oauth2-salesforce/zipball/37e1a2a59240e14b1f95d416a4f8d3d57199822b\",\n \"reference\": \"37e1a2a59240e14b1f95d416a4f8d3d57199822b\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"league/oauth2-client\": \"^2.0\"\n },\n \"require-dev\": {\n \"mockery/mockery\": \"~0.9\",\n \"phpunit/phpunit\": \"~4.0\",\n \"squizlabs/php_codesniffer\": \"~2.0\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"1.0.x-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Stevenmaguire\\\\OAuth2\\\\Client\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Steven Maguire\",\n \"email\": \"stevenmaguire@gmail.com\",\n \"homepage\": \"https://github.com/stevenmaguire\"\n }\n ],\n \"description\": \"Salesforce OAuth 2.0 Client Provider for The PHP League OAuth2-Client\",\n \"keywords\": [\n \"authorisation\",\n \"authorization\",\n \"client\",\n \"oauth\",\n \"oauth2\",\n \"salesforce\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/stevenmaguire/oauth2-salesforce/issues\",\n \"source\": \"https://github.com/stevenmaguire/oauth2-salesforce/tree/master\"\n },\n \"time\": \"2017-02-03T19:23:57+00:00\"\n },\n {\n \"name\": \"symfony/cache\",\n \"version\": \"v7.3.2\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/cache.git\",\n \"reference\": \"6621a2bee5373e3e972b2ae5dbedd5ac899d8cb6\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/cache/zipball/6621a2bee5373e3e972b2ae5dbedd5ac899d8cb6\",\n \"reference\": \"6621a2bee5373e3e972b2ae5dbedd5ac899d8cb6\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.2\",\n \"psr/cache\": \"^2.0|^3.0\",\n \"psr/log\": \"^1.1|^2|^3\",\n \"symfony/cache-contracts\": \"^3.6\",\n \"symfony/deprecation-contracts\": \"^2.5|^3.0\",\n \"symfony/service-contracts\": \"^2.5|^3\",\n \"symfony/var-exporter\": \"^6.4|^7.0\"\n },\n \"conflict\": {\n \"doctrine/dbal\": \"<3.6\",\n \"symfony/dependency-injection\": \"<6.4\",\n \"symfony/http-kernel\": \"<6.4\",\n \"symfony/var-dumper\": \"<6.4\"\n },\n \"provide\": {\n \"psr/cache-implementation\": \"2.0|3.0\",\n \"psr/simple-cache-implementation\": \"1.0|2.0|3.0\",\n \"symfony/cache-implementation\": \"1.1|2.0|3.0\"\n },\n \"require-dev\": {\n \"cache/integration-tests\": \"dev-master\",\n \"doctrine/dbal\": \"^3.6|^4\",\n \"predis/predis\": \"^1.1|^2.0\",\n \"psr/simple-cache\": \"^1.0|^2.0|^3.0\",\n \"symfony/clock\": \"^6.4|^7.0\",\n \"symfony/config\": \"^6.4|^7.0\",\n \"symfony/dependency-injection\": \"^6.4|^7.0\",\n \"symfony/filesystem\": \"^6.4|^7.0\",\n \"symfony/http-kernel\": \"^6.4|^7.0\",\n \"symfony/messenger\": \"^6.4|^7.0\",\n \"symfony/var-dumper\": \"^6.4|^7.0\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Symfony\\\\Component\\\\Cache\\\\\": \"\"\n },\n \"classmap\": [\n \"Traits/ValueWrapper.php\"\n ],\n \"exclude-from-classmap\": [\n \"/Tests/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Nicolas Grekas\",\n \"email\": \"p@tchwork.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Provides extended PSR-6, PSR-16 (and tags) implementations\",\n \"homepage\": \"https://symfony.com\",\n \"keywords\": [\n \"caching\",\n \"psr6\"\n ],\n \"support\": {\n \"source\": \"https://github.com/symfony/cache/tree/v7.3.2\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://github.com/nicolas-grekas\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2025-07-30T17:13:41+00:00\"\n },\n {\n \"name\": \"symfony/cache-contracts\",\n \"version\": \"v3.6.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/cache-contracts.git\",\n \"reference\": \"5d68a57d66910405e5c0b63d6f0af941e66fc868\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/cache-contracts/zipball/5d68a57d66910405e5c0b63d6f0af941e66fc868\",\n \"reference\": \"5d68a57d66910405e5c0b63d6f0af941e66fc868\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.1\",\n \"psr/cache\": \"^3.0\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"thanks\": {\n \"url\": \"https://github.com/symfony/contracts\",\n \"name\": \"symfony/contracts\"\n },\n \"branch-alias\": {\n \"dev-main\": \"3.6-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Symfony\\\\Contracts\\\\Cache\\\\\": \"\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Nicolas Grekas\",\n \"email\": \"p@tchwork.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Generic abstractions related to caching\",\n \"homepage\": \"https://symfony.com\",\n \"keywords\": [\n \"abstractions\",\n \"contracts\",\n \"decoupling\",\n \"interfaces\",\n \"interoperability\",\n \"standards\"\n ],\n \"support\": {\n \"source\": \"https://github.com/symfony/cache-contracts/tree/v3.6.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2025-03-13T15:25:07+00:00\"\n },\n {\n \"name\": \"symfony/clock\",\n \"version\": \"v7.4.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/clock.git\",\n \"reference\": \"9169f24776edde469914c1e7a1442a50f7a4e110\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/clock/zipball/9169f24776edde469914c1e7a1442a50f7a4e110\",\n \"reference\": \"9169f24776edde469914c1e7a1442a50f7a4e110\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.2\",\n \"psr/clock\": \"^1.0\",\n \"symfony/polyfill-php83\": \"^1.28\"\n },\n \"provide\": {\n \"psr/clock-implementation\": \"1.0\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"files\": [\n \"Resources/now.php\"\n ],\n \"psr-4\": {\n \"Symfony\\\\Component\\\\Clock\\\\\": \"\"\n },\n \"exclude-from-classmap\": [\n \"/Tests/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Nicolas Grekas\",\n \"email\": \"p@tchwork.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Decouples applications from the system clock\",\n \"homepage\": \"https://symfony.com\",\n \"keywords\": [\n \"clock\",\n \"psr20\",\n \"time\"\n ],\n \"support\": {\n \"source\": \"https://github.com/symfony/clock/tree/v7.4.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://github.com/nicolas-grekas\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2025-11-12T15:39:26+00:00\"\n },\n {\n \"name\": \"symfony/console\",\n \"version\": \"v7.4.7\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/console.git\",\n \"reference\": \"e1e6770440fb9c9b0cf725f81d1361ad1835329d\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/console/zipball/e1e6770440fb9c9b0cf725f81d1361ad1835329d\",\n \"reference\": \"e1e6770440fb9c9b0cf725f81d1361ad1835329d\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.2\",\n \"symfony/deprecation-contracts\": \"^2.5|^3\",\n \"symfony/polyfill-mbstring\": \"~1.0\",\n \"symfony/service-contracts\": \"^2.5|^3\",\n \"symfony/string\": \"^7.2|^8.0\"\n },\n \"conflict\": {\n \"symfony/dependency-injection\": \"<6.4\",\n \"symfony/dotenv\": \"<6.4\",\n \"symfony/event-dispatcher\": \"<6.4\",\n \"symfony/lock\": \"<6.4\",\n \"symfony/process\": \"<6.4\"\n },\n \"provide\": {\n \"psr/log-implementation\": \"1.0|2.0|3.0\"\n },\n \"require-dev\": {\n \"psr/log\": \"^1|^2|^3\",\n \"symfony/config\": \"^6.4|^7.0|^8.0\",\n \"symfony/dependency-injection\": \"^6.4|^7.0|^8.0\",\n \"symfony/event-dispatcher\": \"^6.4|^7.0|^8.0\",\n \"symfony/http-foundation\": \"^6.4|^7.0|^8.0\",\n \"symfony/http-kernel\": \"^6.4|^7.0|^8.0\",\n \"symfony/lock\": \"^6.4|^7.0|^8.0\",\n \"symfony/messenger\": \"^6.4|^7.0|^8.0\",\n \"symfony/process\": \"^6.4|^7.0|^8.0\",\n \"symfony/stopwatch\": \"^6.4|^7.0|^8.0\",\n \"symfony/var-dumper\": \"^6.4|^7.0|^8.0\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Symfony\\\\Component\\\\Console\\\\\": \"\"\n },\n \"exclude-from-classmap\": [\n \"/Tests/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Fabien Potencier\",\n \"email\": \"fabien@symfony.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Eases the creation of beautiful and testable command line interfaces\",\n \"homepage\": \"https://symfony.com\",\n \"keywords\": [\n \"cli\",\n \"command-line\",\n \"console\",\n \"terminal\"\n ],\n \"support\": {\n \"source\": \"https://github.com/symfony/console/tree/v7.4.7\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://github.com/nicolas-grekas\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2026-03-06T14:06:20+00:00\"\n },\n {\n \"name\": \"symfony/css-selector\",\n \"version\": \"v7.4.6\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/css-selector.git\",\n \"reference\": \"2e7c52c647b406e2107dd867db424a4dbac91864\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/css-selector/zipball/2e7c52c647b406e2107dd867db424a4dbac91864\",\n \"reference\": \"2e7c52c647b406e2107dd867db424a4dbac91864\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.2\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Symfony\\\\Component\\\\CssSelector\\\\\": \"\"\n },\n \"exclude-from-classmap\": [\n \"/Tests/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Fabien Potencier\",\n \"email\": \"fabien@symfony.com\"\n },\n {\n \"name\": \"Jean-François Simon\",\n \"email\": \"jeanfrancois.simon@sensiolabs.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Converts CSS selectors to XPath expressions\",\n \"homepage\": \"https://symfony.com\",\n \"support\": {\n \"source\": \"https://github.com/symfony/css-selector/tree/v7.4.6\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://github.com/nicolas-grekas\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2026-02-17T07:53:42+00:00\"\n },\n {\n \"name\": \"symfony/debug\",\n \"version\": \"v4.4.44\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/debug.git\",\n \"reference\": \"1a692492190773c5310bc7877cb590c04c2f05be\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/debug/zipball/1a692492190773c5310bc7877cb590c04c2f05be\",\n \"reference\": \"1a692492190773c5310bc7877cb590c04c2f05be\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=7.1.3\",\n \"psr/log\": \"^1|^2|^3\"\n },\n \"conflict\": {\n \"symfony/http-kernel\": \"<3.4\"\n },\n \"require-dev\": {\n \"symfony/http-kernel\": \"^3.4|^4.0|^5.0\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Symfony\\\\Component\\\\Debug\\\\\": \"\"\n },\n \"exclude-from-classmap\": [\n \"/Tests/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Fabien Potencier\",\n \"email\": \"fabien@symfony.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Provides tools to ease debugging PHP code\",\n \"homepage\": \"https://symfony.com\",\n \"support\": {\n \"source\": \"https://github.com/symfony/debug/tree/v4.4.44\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"abandoned\": \"symfony/error-handler\",\n \"time\": \"2022-07-28T16:29:46+00:00\"\n },\n {\n \"name\": \"symfony/deprecation-contracts\",\n \"version\": \"v3.6.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/deprecation-contracts.git\",\n \"reference\": \"63afe740e99a13ba87ec199bb07bbdee937a5b62\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/deprecation-contracts/zipball/63afe740e99a13ba87ec199bb07bbdee937a5b62\",\n \"reference\": \"63afe740e99a13ba87ec199bb07bbdee937a5b62\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.1\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"thanks\": {\n \"url\": \"https://github.com/symfony/contracts\",\n \"name\": \"symfony/contracts\"\n },\n \"branch-alias\": {\n \"dev-main\": \"3.6-dev\"\n }\n },\n \"autoload\": {\n \"files\": [\n \"function.php\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Nicolas Grekas\",\n \"email\": \"p@tchwork.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"A generic function and convention to trigger deprecation notices\",\n \"homepage\": \"https://symfony.com\",\n \"support\": {\n \"source\": \"https://github.com/symfony/deprecation-contracts/tree/v3.6.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2024-09-25T14:21:43+00:00\"\n },\n {\n \"name\": \"symfony/dom-crawler\",\n \"version\": \"v7.3.3\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/dom-crawler.git\",\n \"reference\": \"efa076ea0eeff504383ff0dcf827ea5ce15690ba\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/dom-crawler/zipball/efa076ea0eeff504383ff0dcf827ea5ce15690ba\",\n \"reference\": \"efa076ea0eeff504383ff0dcf827ea5ce15690ba\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"masterminds/html5\": \"^2.6\",\n \"php\": \">=8.2\",\n \"symfony/polyfill-ctype\": \"~1.8\",\n \"symfony/polyfill-mbstring\": \"~1.0\"\n },\n \"require-dev\": {\n \"symfony/css-selector\": \"^6.4|^7.0\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Symfony\\\\Component\\\\DomCrawler\\\\\": \"\"\n },\n \"exclude-from-classmap\": [\n \"/Tests/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Fabien Potencier\",\n \"email\": \"fabien@symfony.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Eases DOM navigation for HTML and XML documents\",\n \"homepage\": \"https://symfony.com\",\n \"support\": {\n \"source\": \"https://github.com/symfony/dom-crawler/tree/v7.3.3\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://github.com/nicolas-grekas\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2025-08-06T20:13:54+00:00\"\n },\n {\n \"name\": \"symfony/error-handler\",\n \"version\": \"v7.4.4\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/error-handler.git\",\n \"reference\": \"8da531f364ddfee53e36092a7eebbbd0b775f6b8\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/error-handler/zipball/8da531f364ddfee53e36092a7eebbbd0b775f6b8\",\n \"reference\": \"8da531f364ddfee53e36092a7eebbbd0b775f6b8\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.2\",\n \"psr/log\": \"^1|^2|^3\",\n \"symfony/polyfill-php85\": \"^1.32\",\n \"symfony/var-dumper\": \"^6.4|^7.0|^8.0\"\n },\n \"conflict\": {\n \"symfony/deprecation-contracts\": \"<2.5\",\n \"symfony/http-kernel\": \"<6.4\"\n },\n \"require-dev\": {\n \"symfony/console\": \"^6.4|^7.0|^8.0\",\n \"symfony/deprecation-contracts\": \"^2.5|^3\",\n \"symfony/http-kernel\": \"^6.4|^7.0|^8.0\",\n \"symfony/serializer\": \"^6.4|^7.0|^8.0\",\n \"symfony/webpack-encore-bundle\": \"^1.0|^2.0\"\n },\n \"bin\": [\n \"Resources/bin/patch-type-declarations\"\n ],\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Symfony\\\\Component\\\\ErrorHandler\\\\\": \"\"\n },\n \"exclude-from-classmap\": [\n \"/Tests/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Fabien Potencier\",\n \"email\": \"fabien@symfony.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Provides tools to manage errors and ease debugging PHP code\",\n \"homepage\": \"https://symfony.com\",\n \"support\": {\n \"source\": \"https://github.com/symfony/error-handler/tree/v7.4.4\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://github.com/nicolas-grekas\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2026-01-20T16:42:42+00:00\"\n },\n {\n \"name\": \"symfony/event-dispatcher\",\n \"version\": \"v6.4.32\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/event-dispatcher.git\",\n \"reference\": \"99d7e101826e6610606b9433248f80c1997cd20b\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/event-dispatcher/zipball/99d7e101826e6610606b9433248f80c1997cd20b\",\n \"reference\": \"99d7e101826e6610606b9433248f80c1997cd20b\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.1\",\n \"symfony/event-dispatcher-contracts\": \"^2.5|^3\"\n },\n \"conflict\": {\n \"symfony/dependency-injection\": \"<5.4\",\n \"symfony/service-contracts\": \"<2.5\"\n },\n \"provide\": {\n \"psr/event-dispatcher-implementation\": \"1.0\",\n \"symfony/event-dispatcher-implementation\": \"2.0|3.0\"\n },\n \"require-dev\": {\n \"psr/log\": \"^1|^2|^3\",\n \"symfony/config\": \"^5.4|^6.0|^7.0\",\n \"symfony/dependency-injection\": \"^5.4|^6.0|^7.0\",\n \"symfony/error-handler\": \"^5.4|^6.0|^7.0\",\n \"symfony/expression-language\": \"^5.4|^6.0|^7.0\",\n \"symfony/http-foundation\": \"^5.4|^6.0|^7.0\",\n \"symfony/service-contracts\": \"^2.5|^3\",\n \"symfony/stopwatch\": \"^5.4|^6.0|^7.0\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Symfony\\\\Component\\\\EventDispatcher\\\\\": \"\"\n },\n \"exclude-from-classmap\": [\n \"/Tests/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Fabien Potencier\",\n \"email\": \"fabien@symfony.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Provides tools that allow your application components to communicate with each other by dispatching events and listening to them\",\n \"homepage\": \"https://symfony.com\",\n \"support\": {\n \"source\": \"https://github.com/symfony/event-dispatcher/tree/v6.4.32\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://github.com/nicolas-grekas\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2026-01-05T11:13:48+00:00\"\n },\n {\n \"name\": \"symfony/event-dispatcher-contracts\",\n \"version\": \"v3.6.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/event-dispatcher-contracts.git\",\n \"reference\": \"59eb412e93815df44f05f342958efa9f46b1e586\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/59eb412e93815df44f05f342958efa9f46b1e586\",\n \"reference\": \"59eb412e93815df44f05f342958efa9f46b1e586\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.1\",\n \"psr/event-dispatcher\": \"^1\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"thanks\": {\n \"url\": \"https://github.com/symfony/contracts\",\n \"name\": \"symfony/contracts\"\n },\n \"branch-alias\": {\n \"dev-main\": \"3.6-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Symfony\\\\Contracts\\\\EventDispatcher\\\\\": \"\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Nicolas Grekas\",\n \"email\": \"p@tchwork.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Generic abstractions related to dispatching event\",\n \"homepage\": \"https://symfony.com\",\n \"keywords\": [\n \"abstractions\",\n \"contracts\",\n \"decoupling\",\n \"interfaces\",\n \"interoperability\",\n \"standards\"\n ],\n \"support\": {\n \"source\": \"https://github.com/symfony/event-dispatcher-contracts/tree/v3.6.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2024-09-25T14:21:43+00:00\"\n },\n {\n \"name\": \"symfony/expression-language\",\n \"version\": \"v7.3.2\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/expression-language.git\",\n \"reference\": \"32d2d19c62e58767e6552166c32fb259975d2b23\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/expression-language/zipball/32d2d19c62e58767e6552166c32fb259975d2b23\",\n \"reference\": \"32d2d19c62e58767e6552166c32fb259975d2b23\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.2\",\n \"symfony/cache\": \"^6.4|^7.0\",\n \"symfony/deprecation-contracts\": \"^2.5|^3\",\n \"symfony/service-contracts\": \"^2.5|^3\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Symfony\\\\Component\\\\ExpressionLanguage\\\\\": \"\"\n },\n \"exclude-from-classmap\": [\n \"/Tests/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Fabien Potencier\",\n \"email\": \"fabien@symfony.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Provides an engine that can compile and evaluate expressions\",\n \"homepage\": \"https://symfony.com\",\n \"support\": {\n \"source\": \"https://github.com/symfony/expression-language/tree/v7.3.2\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://github.com/nicolas-grekas\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2025-07-10T08:29:33+00:00\"\n },\n {\n \"name\": \"symfony/filesystem\",\n \"version\": \"v7.3.2\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/filesystem.git\",\n \"reference\": \"edcbb768a186b5c3f25d0643159a787d3e63b7fd\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/filesystem/zipball/edcbb768a186b5c3f25d0643159a787d3e63b7fd\",\n \"reference\": \"edcbb768a186b5c3f25d0643159a787d3e63b7fd\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.2\",\n \"symfony/polyfill-ctype\": \"~1.8\",\n \"symfony/polyfill-mbstring\": \"~1.8\"\n },\n \"require-dev\": {\n \"symfony/process\": \"^6.4|^7.0\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Symfony\\\\Component\\\\Filesystem\\\\\": \"\"\n },\n \"exclude-from-classmap\": [\n \"/Tests/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Fabien Potencier\",\n \"email\": \"fabien@symfony.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Provides basic utilities for the filesystem\",\n \"homepage\": \"https://symfony.com\",\n \"support\": {\n \"source\": \"https://github.com/symfony/filesystem/tree/v7.3.2\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://github.com/nicolas-grekas\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2025-07-07T08:17:47+00:00\"\n },\n {\n \"name\": \"symfony/finder\",\n \"version\": \"v7.4.6\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/finder.git\",\n \"reference\": \"8655bf1076b7a3a346cb11413ffdabff50c7ffcf\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/finder/zipball/8655bf1076b7a3a346cb11413ffdabff50c7ffcf\",\n \"reference\": \"8655bf1076b7a3a346cb11413ffdabff50c7ffcf\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.2\"\n },\n \"require-dev\": {\n \"symfony/filesystem\": \"^6.4|^7.0|^8.0\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Symfony\\\\Component\\\\Finder\\\\\": \"\"\n },\n \"exclude-from-classmap\": [\n \"/Tests/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Fabien Potencier\",\n \"email\": \"fabien@symfony.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Finds files and directories via an intuitive fluent interface\",\n \"homepage\": \"https://symfony.com\",\n \"support\": {\n \"source\": \"https://github.com/symfony/finder/tree/v7.4.6\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://github.com/nicolas-grekas\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2026-01-29T09:40:50+00:00\"\n },\n {\n \"name\": \"symfony/http-client\",\n \"version\": \"v7.3.3\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/http-client.git\",\n \"reference\": \"333b9bd7639cbdaecd25a3a48a9d2dcfaa86e019\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/http-client/zipball/333b9bd7639cbdaecd25a3a48a9d2dcfaa86e019\",\n \"reference\": \"333b9bd7639cbdaecd25a3a48a9d2dcfaa86e019\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.2\",\n \"psr/log\": \"^1|^2|^3\",\n \"symfony/deprecation-contracts\": \"^2.5|^3\",\n \"symfony/http-client-contracts\": \"~3.4.4|^3.5.2\",\n \"symfony/polyfill-php83\": \"^1.29\",\n \"symfony/service-contracts\": \"^2.5|^3\"\n },\n \"conflict\": {\n \"amphp/amp\": \"<2.5\",\n \"amphp/socket\": \"<1.1\",\n \"php-http/discovery\": \"<1.15\",\n \"symfony/http-foundation\": \"<6.4\"\n },\n \"provide\": {\n \"php-http/async-client-implementation\": \"*\",\n \"php-http/client-implementation\": \"*\",\n \"psr/http-client-implementation\": \"1.0\",\n \"symfony/http-client-implementation\": \"3.0\"\n },\n \"require-dev\": {\n \"amphp/http-client\": \"^4.2.1|^5.0\",\n \"amphp/http-tunnel\": \"^1.0|^2.0\",\n \"guzzlehttp/promises\": \"^1.4|^2.0\",\n \"nyholm/psr7\": \"^1.0\",\n \"php-http/httplug\": \"^1.0|^2.0\",\n \"psr/http-client\": \"^1.0\",\n \"symfony/amphp-http-client-meta\": \"^1.0|^2.0\",\n \"symfony/dependency-injection\": \"^6.4|^7.0\",\n \"symfony/http-kernel\": \"^6.4|^7.0\",\n \"symfony/messenger\": \"^6.4|^7.0\",\n \"symfony/process\": \"^6.4|^7.0\",\n \"symfony/rate-limiter\": \"^6.4|^7.0\",\n \"symfony/stopwatch\": \"^6.4|^7.0\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Symfony\\\\Component\\\\HttpClient\\\\\": \"\"\n },\n \"exclude-from-classmap\": [\n \"/Tests/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Nicolas Grekas\",\n \"email\": \"p@tchwork.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Provides powerful methods to fetch HTTP resources synchronously or asynchronously\",\n \"homepage\": \"https://symfony.com\",\n \"keywords\": [\n \"http\"\n ],\n \"support\": {\n \"source\": \"https://github.com/symfony/http-client/tree/v7.3.3\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://github.com/nicolas-grekas\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2025-08-27T07:45:05+00:00\"\n },\n {\n \"name\": \"symfony/http-client-contracts\",\n \"version\": \"v3.6.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/http-client-contracts.git\",\n \"reference\": \"75d7043853a42837e68111812f4d964b01e5101c\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/http-client-contracts/zipball/75d7043853a42837e68111812f4d964b01e5101c\",\n \"reference\": \"75d7043853a42837e68111812f4d964b01e5101c\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.1\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"thanks\": {\n \"url\": \"https://github.com/symfony/contracts\",\n \"name\": \"symfony/contracts\"\n },\n \"branch-alias\": {\n \"dev-main\": \"3.6-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Symfony\\\\Contracts\\\\HttpClient\\\\\": \"\"\n },\n \"exclude-from-classmap\": [\n \"/Test/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Nicolas Grekas\",\n \"email\": \"p@tchwork.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Generic abstractions related to HTTP clients\",\n \"homepage\": \"https://symfony.com\",\n \"keywords\": [\n \"abstractions\",\n \"contracts\",\n \"decoupling\",\n \"interfaces\",\n \"interoperability\",\n \"standards\"\n ],\n \"support\": {\n \"source\": \"https://github.com/symfony/http-client-contracts/tree/v3.6.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2025-04-29T11:18:49+00:00\"\n },\n {\n \"name\": \"symfony/http-foundation\",\n \"version\": \"v7.4.7\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/http-foundation.git\",\n \"reference\": \"f94b3e7b7dafd40e666f0c9ff2084133bae41e81\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/http-foundation/zipball/f94b3e7b7dafd40e666f0c9ff2084133bae41e81\",\n \"reference\": \"f94b3e7b7dafd40e666f0c9ff2084133bae41e81\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.2\",\n \"symfony/deprecation-contracts\": \"^2.5|^3\",\n \"symfony/polyfill-mbstring\": \"^1.1\"\n },\n \"conflict\": {\n \"doctrine/dbal\": \"<3.6\",\n \"symfony/cache\": \"<6.4.12|>=7.0,<7.1.5\"\n },\n \"require-dev\": {\n \"doctrine/dbal\": \"^3.6|^4\",\n \"predis/predis\": \"^1.1|^2.0\",\n \"symfony/cache\": \"^6.4.12|^7.1.5|^8.0\",\n \"symfony/clock\": \"^6.4|^7.0|^8.0\",\n \"symfony/dependency-injection\": \"^6.4|^7.0|^8.0\",\n \"symfony/expression-language\": \"^6.4|^7.0|^8.0\",\n \"symfony/http-kernel\": \"^6.4|^7.0|^8.0\",\n \"symfony/mime\": \"^6.4|^7.0|^8.0\",\n \"symfony/rate-limiter\": \"^6.4|^7.0|^8.0\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Symfony\\\\Component\\\\HttpFoundation\\\\\": \"\"\n },\n \"exclude-from-classmap\": [\n \"/Tests/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Fabien Potencier\",\n \"email\": \"fabien@symfony.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Defines an object-oriented layer for the HTTP specification\",\n \"homepage\": \"https://symfony.com\",\n \"support\": {\n \"source\": \"https://github.com/symfony/http-foundation/tree/v7.4.7\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://github.com/nicolas-grekas\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2026-03-06T13:15:18+00:00\"\n },\n {\n \"name\": \"symfony/http-kernel\",\n \"version\": \"v7.2.9\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/http-kernel.git\",\n \"reference\": \"d0cc0295c9c2fd5e053fee2b2a143001f2d0c33c\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/http-kernel/zipball/d0cc0295c9c2fd5e053fee2b2a143001f2d0c33c\",\n \"reference\": \"d0cc0295c9c2fd5e053fee2b2a143001f2d0c33c\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.2\",\n \"psr/log\": \"^1|^2|^3\",\n \"symfony/deprecation-contracts\": \"^2.5|^3\",\n \"symfony/error-handler\": \"^6.4|^7.0\",\n \"symfony/event-dispatcher\": \"^6.4|^7.0\",\n \"symfony/http-foundation\": \"^6.4|^7.0\",\n \"symfony/polyfill-ctype\": \"^1.8\"\n },\n \"conflict\": {\n \"symfony/browser-kit\": \"<6.4\",\n \"symfony/cache\": \"<6.4\",\n \"symfony/config\": \"<6.4\",\n \"symfony/console\": \"<6.4\",\n \"symfony/dependency-injection\": \"<6.4\",\n \"symfony/doctrine-bridge\": \"<6.4\",\n \"symfony/form\": \"<6.4\",\n \"symfony/http-client\": \"<6.4\",\n \"symfony/http-client-contracts\": \"<2.5\",\n \"symfony/mailer\": \"<6.4\",\n \"symfony/messenger\": \"<6.4\",\n \"symfony/translation\": \"<6.4\",\n \"symfony/translation-contracts\": \"<2.5\",\n \"symfony/twig-bridge\": \"<6.4\",\n \"symfony/validator\": \"<6.4\",\n \"symfony/var-dumper\": \"<6.4\",\n \"twig/twig\": \"<3.12\"\n },\n \"provide\": {\n \"psr/log-implementation\": \"1.0|2.0|3.0\"\n },\n \"require-dev\": {\n \"psr/cache\": \"^1.0|^2.0|^3.0\",\n \"symfony/browser-kit\": \"^6.4|^7.0\",\n \"symfony/clock\": \"^6.4|^7.0\",\n \"symfony/config\": \"^6.4|^7.0\",\n \"symfony/console\": \"^6.4|^7.0\",\n \"symfony/css-selector\": \"^6.4|^7.0\",\n \"symfony/dependency-injection\": \"^6.4|^7.0\",\n \"symfony/dom-crawler\": \"^6.4|^7.0\",\n \"symfony/expression-language\": \"^6.4|^7.0\",\n \"symfony/finder\": \"^6.4|^7.0\",\n \"symfony/http-client-contracts\": \"^2.5|^3\",\n \"symfony/process\": \"^6.4|^7.0\",\n \"symfony/property-access\": \"^7.1\",\n \"symfony/routing\": \"^6.4|^7.0\",\n \"symfony/serializer\": \"^7.1\",\n \"symfony/stopwatch\": \"^6.4|^7.0\",\n \"symfony/translation\": \"^6.4|^7.0\",\n \"symfony/translation-contracts\": \"^2.5|^3\",\n \"symfony/uid\": \"^6.4|^7.0\",\n \"symfony/validator\": \"^6.4|^7.0\",\n \"symfony/var-dumper\": \"^6.4|^7.0\",\n \"symfony/var-exporter\": \"^6.4|^7.0\",\n \"twig/twig\": \"^3.12\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Symfony\\\\Component\\\\HttpKernel\\\\\": \"\"\n },\n \"exclude-from-classmap\": [\n \"/Tests/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Fabien Potencier\",\n \"email\": \"fabien@symfony.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Provides a structured process for converting a Request into a Response\",\n \"homepage\": \"https://symfony.com\",\n \"support\": {\n \"source\": \"https://github.com/symfony/http-kernel/tree/v7.2.9\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://github.com/nicolas-grekas\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2025-07-31T09:36:38+00:00\"\n },\n {\n \"name\": \"symfony/mailer\",\n \"version\": \"v7.4.6\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/mailer.git\",\n \"reference\": \"b02726f39a20bc65e30364f5c750c4ddbf1f58e9\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/mailer/zipball/b02726f39a20bc65e30364f5c750c4ddbf1f58e9\",\n \"reference\": \"b02726f39a20bc65e30364f5c750c4ddbf1f58e9\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"egulias/email-validator\": \"^2.1.10|^3|^4\",\n \"php\": \">=8.2\",\n \"psr/event-dispatcher\": \"^1\",\n \"psr/log\": \"^1|^2|^3\",\n \"symfony/event-dispatcher\": \"^6.4|^7.0|^8.0\",\n \"symfony/mime\": \"^7.2|^8.0\",\n \"symfony/service-contracts\": \"^2.5|^3\"\n },\n \"conflict\": {\n \"symfony/http-client-contracts\": \"<2.5\",\n \"symfony/http-kernel\": \"<6.4\",\n \"symfony/messenger\": \"<6.4\",\n \"symfony/mime\": \"<6.4\",\n \"symfony/twig-bridge\": \"<6.4\"\n },\n \"require-dev\": {\n \"symfony/console\": \"^6.4|^7.0|^8.0\",\n \"symfony/http-client\": \"^6.4|^7.0|^8.0\",\n \"symfony/messenger\": \"^6.4|^7.0|^8.0\",\n \"symfony/twig-bridge\": \"^6.4|^7.0|^8.0\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Symfony\\\\Component\\\\Mailer\\\\\": \"\"\n },\n \"exclude-from-classmap\": [\n \"/Tests/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Fabien Potencier\",\n \"email\": \"fabien@symfony.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Helps sending emails\",\n \"homepage\": \"https://symfony.com\",\n \"support\": {\n \"source\": \"https://github.com/symfony/mailer/tree/v7.4.6\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://github.com/nicolas-grekas\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2026-02-25T16:50:00+00:00\"\n },\n {\n \"name\": \"symfony/mime\",\n \"version\": \"v7.4.7\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/mime.git\",\n \"reference\": \"da5ab4fde3f6c88ab06e96185b9922f48b677cd1\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/mime/zipball/da5ab4fde3f6c88ab06e96185b9922f48b677cd1\",\n \"reference\": \"da5ab4fde3f6c88ab06e96185b9922f48b677cd1\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.2\",\n \"symfony/deprecation-contracts\": \"^2.5|^3\",\n \"symfony/polyfill-intl-idn\": \"^1.10\",\n \"symfony/polyfill-mbstring\": \"^1.0\"\n },\n \"conflict\": {\n \"egulias/email-validator\": \"~3.0.0\",\n \"phpdocumentor/reflection-docblock\": \"<5.2|>=7\",\n \"phpdocumentor/type-resolver\": \"<1.5.1\",\n \"symfony/mailer\": \"<6.4\",\n \"symfony/serializer\": \"<6.4.3|>7.0,<7.0.3\"\n },\n \"require-dev\": {\n \"egulias/email-validator\": \"^2.1.10|^3.1|^4\",\n \"league/html-to-markdown\": \"^5.0\",\n \"phpdocumentor/reflection-docblock\": \"^5.2|^6.0\",\n \"symfony/dependency-injection\": \"^6.4|^7.0|^8.0\",\n \"symfony/process\": \"^6.4|^7.0|^8.0\",\n \"symfony/property-access\": \"^6.4|^7.0|^8.0\",\n \"symfony/property-info\": \"^6.4|^7.0|^8.0\",\n \"symfony/serializer\": \"^6.4.3|^7.0.3|^8.0\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Symfony\\\\Component\\\\Mime\\\\\": \"\"\n },\n \"exclude-from-classmap\": [\n \"/Tests/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Fabien Potencier\",\n \"email\": \"fabien@symfony.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Allows manipulating MIME messages\",\n \"homepage\": \"https://symfony.com\",\n \"keywords\": [\n \"mime\",\n \"mime-type\"\n ],\n \"support\": {\n \"source\": \"https://github.com/symfony/mime/tree/v7.4.7\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://github.com/nicolas-grekas\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2026-03-05T15:24:09+00:00\"\n },\n {\n \"name\": \"symfony/options-resolver\",\n \"version\": \"v7.3.3\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/options-resolver.git\",\n \"reference\": \"0ff2f5c3df08a395232bbc3c2eb7e84912df911d\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/options-resolver/zipball/0ff2f5c3df08a395232bbc3c2eb7e84912df911d\",\n \"reference\": \"0ff2f5c3df08a395232bbc3c2eb7e84912df911d\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.2\",\n \"symfony/deprecation-contracts\": \"^2.5|^3\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Symfony\\\\Component\\\\OptionsResolver\\\\\": \"\"\n },\n \"exclude-from-classmap\": [\n \"/Tests/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Fabien Potencier\",\n \"email\": \"fabien@symfony.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Provides an improved replacement for the array_replace PHP function\",\n \"homepage\": \"https://symfony.com\",\n \"keywords\": [\n \"config\",\n \"configuration\",\n \"options\"\n ],\n \"support\": {\n \"source\": \"https://github.com/symfony/options-resolver/tree/v7.3.3\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://github.com/nicolas-grekas\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2025-08-05T10:16:07+00:00\"\n },\n {\n \"name\": \"symfony/polyfill-ctype\",\n \"version\": \"v1.33.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/polyfill-ctype.git\",\n \"reference\": \"a3cc8b044a6ea513310cbd48ef7333b384945638\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/polyfill-ctype/zipball/a3cc8b044a6ea513310cbd48ef7333b384945638\",\n \"reference\": \"a3cc8b044a6ea513310cbd48ef7333b384945638\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=7.2\"\n },\n \"provide\": {\n \"ext-ctype\": \"*\"\n },\n \"suggest\": {\n \"ext-ctype\": \"For best performance\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"thanks\": {\n \"url\": \"https://github.com/symfony/polyfill\",\n \"name\": \"symfony/polyfill\"\n }\n },\n \"autoload\": {\n \"files\": [\n \"bootstrap.php\"\n ],\n \"psr-4\": {\n \"Symfony\\\\Polyfill\\\\Ctype\\\\\": \"\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Gert de Pagter\",\n \"email\": \"BackEndTea@gmail.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Symfony polyfill for ctype functions\",\n \"homepage\": \"https://symfony.com\",\n \"keywords\": [\n \"compatibility\",\n \"ctype\",\n \"polyfill\",\n \"portable\"\n ],\n \"support\": {\n \"source\": \"https://github.com/symfony/polyfill-ctype/tree/v1.33.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://github.com/nicolas-grekas\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2024-09-09T11:45:10+00:00\"\n },\n {\n \"name\": \"symfony/polyfill-iconv\",\n \"version\": \"v1.33.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/polyfill-iconv.git\",\n \"reference\": \"5f3b930437ae03ae5dff61269024d8ea1b3774aa\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/polyfill-iconv/zipball/5f3b930437ae03ae5dff61269024d8ea1b3774aa\",\n \"reference\": \"5f3b930437ae03ae5dff61269024d8ea1b3774aa\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=7.2\"\n },\n \"provide\": {\n \"ext-iconv\": \"*\"\n },\n \"suggest\": {\n \"ext-iconv\": \"For best performance\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"thanks\": {\n \"url\": \"https://github.com/symfony/polyfill\",\n \"name\": \"symfony/polyfill\"\n }\n },\n \"autoload\": {\n \"files\": [\n \"bootstrap.php\"\n ],\n \"psr-4\": {\n \"Symfony\\\\Polyfill\\\\Iconv\\\\\": \"\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Nicolas Grekas\",\n \"email\": \"p@tchwork.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Symfony polyfill for the Iconv extension\",\n \"homepage\": \"https://symfony.com\",\n \"keywords\": [\n \"compatibility\",\n \"iconv\",\n \"polyfill\",\n \"portable\",\n \"shim\"\n ],\n \"support\": {\n \"source\": \"https://github.com/symfony/polyfill-iconv/tree/v1.33.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://github.com/nicolas-grekas\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2024-09-17T14:58:18+00:00\"\n },\n {\n \"name\": \"symfony/polyfill-intl-grapheme\",\n \"version\": \"v1.33.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/polyfill-intl-grapheme.git\",\n \"reference\": \"380872130d3a5dd3ace2f4010d95125fde5d5c70\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/380872130d3a5dd3ace2f4010d95125fde5d5c70\",\n \"reference\": \"380872130d3a5dd3ace2f4010d95125fde5d5c70\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=7.2\"\n },\n \"suggest\": {\n \"ext-intl\": \"For best performance\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"thanks\": {\n \"url\": \"https://github.com/symfony/polyfill\",\n \"name\": \"symfony/polyfill\"\n }\n },\n \"autoload\": {\n \"files\": [\n \"bootstrap.php\"\n ],\n \"psr-4\": {\n \"Symfony\\\\Polyfill\\\\Intl\\\\Grapheme\\\\\": \"\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Nicolas Grekas\",\n \"email\": \"p@tchwork.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Symfony polyfill for intl's grapheme_* functions\",\n \"homepage\": \"https://symfony.com\",\n \"keywords\": [\n \"compatibility\",\n \"grapheme\",\n \"intl\",\n \"polyfill\",\n \"portable\",\n \"shim\"\n ],\n \"support\": {\n \"source\": \"https://github.com/symfony/polyfill-intl-grapheme/tree/v1.33.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://github.com/nicolas-grekas\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2025-06-27T09:58:17+00:00\"\n },\n {\n \"name\": \"symfony/polyfill-intl-idn\",\n \"version\": \"v1.33.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/polyfill-intl-idn.git\",\n \"reference\": \"9614ac4d8061dc257ecc64cba1b140873dce8ad3\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/9614ac4d8061dc257ecc64cba1b140873dce8ad3\",\n \"reference\": \"9614ac4d8061dc257ecc64cba1b140873dce8ad3\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=7.2\",\n \"symfony/polyfill-intl-normalizer\": \"^1.10\"\n },\n \"suggest\": {\n \"ext-intl\": \"For best performance\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"thanks\": {\n \"url\": \"https://github.com/symfony/polyfill\",\n \"name\": \"symfony/polyfill\"\n }\n },\n \"autoload\": {\n \"files\": [\n \"bootstrap.php\"\n ],\n \"psr-4\": {\n \"Symfony\\\\Polyfill\\\\Intl\\\\Idn\\\\\": \"\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Laurent Bassin\",\n \"email\": \"laurent@bassin.info\"\n },\n {\n \"name\": \"Trevor Rowbotham\",\n \"email\": \"trevor.rowbotham@pm.me\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions\",\n \"homepage\": \"https://symfony.com\",\n \"keywords\": [\n \"compatibility\",\n \"idn\",\n \"intl\",\n \"polyfill\",\n \"portable\",\n \"shim\"\n ],\n \"support\": {\n \"source\": \"https://github.com/symfony/polyfill-intl-idn/tree/v1.33.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://github.com/nicolas-grekas\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2024-09-10T14:38:51+00:00\"\n },\n {\n \"name\": \"symfony/polyfill-intl-normalizer\",\n \"version\": \"v1.33.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/polyfill-intl-normalizer.git\",\n \"reference\": \"3833d7255cc303546435cb650316bff708a1c75c\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/3833d7255cc303546435cb650316bff708a1c75c\",\n \"reference\": \"3833d7255cc303546435cb650316bff708a1c75c\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=7.2\"\n },\n \"suggest\": {\n \"ext-intl\": \"For best performance\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"thanks\": {\n \"url\": \"https://github.com/symfony/polyfill\",\n \"name\": \"symfony/polyfill\"\n }\n },\n \"autoload\": {\n \"files\": [\n \"bootstrap.php\"\n ],\n \"psr-4\": {\n \"Symfony\\\\Polyfill\\\\Intl\\\\Normalizer\\\\\": \"\"\n },\n \"classmap\": [\n \"Resources/stubs\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Nicolas Grekas\",\n \"email\": \"p@tchwork.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Symfony polyfill for intl's Normalizer class and related functions\",\n \"homepage\": \"https://symfony.com\",\n \"keywords\": [\n \"compatibility\",\n \"intl\",\n \"normalizer\",\n \"polyfill\",\n \"portable\",\n \"shim\"\n ],\n \"support\": {\n \"source\": \"https://github.com/symfony/polyfill-intl-normalizer/tree/v1.33.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://github.com/nicolas-grekas\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2024-09-09T11:45:10+00:00\"\n },\n {\n \"name\": \"symfony/polyfill-mbstring\",\n \"version\": \"v1.33.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/polyfill-mbstring.git\",\n \"reference\": \"6d857f4d76bd4b343eac26d6b539585d2bc56493\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/polyfill-mbstring/zipball/6d857f4d76bd4b343eac26d6b539585d2bc56493\",\n \"reference\": \"6d857f4d76bd4b343eac26d6b539585d2bc56493\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"ext-iconv\": \"*\",\n \"php\": \">=7.2\"\n },\n \"provide\": {\n \"ext-mbstring\": \"*\"\n },\n \"suggest\": {\n \"ext-mbstring\": \"For best performance\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"thanks\": {\n \"url\": \"https://github.com/symfony/polyfill\",\n \"name\": \"symfony/polyfill\"\n }\n },\n \"autoload\": {\n \"files\": [\n \"bootstrap.php\"\n ],\n \"psr-4\": {\n \"Symfony\\\\Polyfill\\\\Mbstring\\\\\": \"\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Nicolas Grekas\",\n \"email\": \"p@tchwork.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Symfony polyfill for the Mbstring extension\",\n \"homepage\": \"https://symfony.com\",\n \"keywords\": [\n \"compatibility\",\n \"mbstring\",\n \"polyfill\",\n \"portable\",\n \"shim\"\n ],\n \"support\": {\n \"source\": \"https://github.com/symfony/polyfill-mbstring/tree/v1.33.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://github.com/nicolas-grekas\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2024-12-23T08:48:59+00:00\"\n },\n {\n \"name\": \"symfony/polyfill-php73\",\n \"version\": \"v1.33.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/polyfill-php73.git\",\n \"reference\": \"0f68c03565dcaaf25a890667542e8bd75fe7e5bb\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/polyfill-php73/zipball/0f68c03565dcaaf25a890667542e8bd75fe7e5bb\",\n \"reference\": \"0f68c03565dcaaf25a890667542e8bd75fe7e5bb\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=7.2\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"thanks\": {\n \"url\": \"https://github.com/symfony/polyfill\",\n \"name\": \"symfony/polyfill\"\n }\n },\n \"autoload\": {\n \"files\": [\n \"bootstrap.php\"\n ],\n \"psr-4\": {\n \"Symfony\\\\Polyfill\\\\Php73\\\\\": \"\"\n },\n \"classmap\": [\n \"Resources/stubs\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Nicolas Grekas\",\n \"email\": \"p@tchwork.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions\",\n \"homepage\": \"https://symfony.com\",\n \"keywords\": [\n \"compatibility\",\n \"polyfill\",\n \"portable\",\n \"shim\"\n ],\n \"support\": {\n \"source\": \"https://github.com/symfony/polyfill-php73/tree/v1.33.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://github.com/nicolas-grekas\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2024-09-09T11:45:10+00:00\"\n },\n {\n \"name\": \"symfony/polyfill-php80\",\n \"version\": \"v1.33.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/polyfill-php80.git\",\n \"reference\": \"0cc9dd0f17f61d8131e7df6b84bd344899fe2608\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/polyfill-php80/zipball/0cc9dd0f17f61d8131e7df6b84bd344899fe2608\",\n \"reference\": \"0cc9dd0f17f61d8131e7df6b84bd344899fe2608\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=7.2\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"thanks\": {\n \"url\": \"https://github.com/symfony/polyfill\",\n \"name\": \"symfony/polyfill\"\n }\n },\n \"autoload\": {\n \"files\": [\n \"bootstrap.php\"\n ],\n \"psr-4\": {\n \"Symfony\\\\Polyfill\\\\Php80\\\\\": \"\"\n },\n \"classmap\": [\n \"Resources/stubs\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Ion Bazan\",\n \"email\": \"ion.bazan@gmail.com\"\n },\n {\n \"name\": \"Nicolas Grekas\",\n \"email\": \"p@tchwork.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions\",\n \"homepage\": \"https://symfony.com\",\n \"keywords\": [\n \"compatibility\",\n \"polyfill\",\n \"portable\",\n \"shim\"\n ],\n \"support\": {\n \"source\": \"https://github.com/symfony/polyfill-php80/tree/v1.33.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://github.com/nicolas-grekas\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2025-01-02T08:10:11+00:00\"\n },\n {\n \"name\": \"symfony/polyfill-php82\",\n \"version\": \"v1.33.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/polyfill-php82.git\",\n \"reference\": \"5d2ed36f7734637dacc025f179698031951b1692\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/polyfill-php82/zipball/5d2ed36f7734637dacc025f179698031951b1692\",\n \"reference\": \"5d2ed36f7734637dacc025f179698031951b1692\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=7.2\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"thanks\": {\n \"url\": \"https://github.com/symfony/polyfill\",\n \"name\": \"symfony/polyfill\"\n }\n },\n \"autoload\": {\n \"files\": [\n \"bootstrap.php\"\n ],\n \"psr-4\": {\n \"Symfony\\\\Polyfill\\\\Php82\\\\\": \"\"\n },\n \"classmap\": [\n \"Resources/stubs\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Nicolas Grekas\",\n \"email\": \"p@tchwork.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Symfony polyfill backporting some PHP 8.2+ features to lower PHP versions\",\n \"homepage\": \"https://symfony.com\",\n \"keywords\": [\n \"compatibility\",\n \"polyfill\",\n \"portable\",\n \"shim\"\n ],\n \"support\": {\n \"source\": \"https://github.com/symfony/polyfill-php82/tree/v1.33.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://github.com/nicolas-grekas\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2024-09-09T11:45:10+00:00\"\n },\n {\n \"name\": \"symfony/polyfill-php83\",\n \"version\": \"v1.33.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/polyfill-php83.git\",\n \"reference\": \"17f6f9a6b1735c0f163024d959f700cfbc5155e5\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/polyfill-php83/zipball/17f6f9a6b1735c0f163024d959f700cfbc5155e5\",\n \"reference\": \"17f6f9a6b1735c0f163024d959f700cfbc5155e5\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=7.2\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"thanks\": {\n \"url\": \"https://github.com/symfony/polyfill\",\n \"name\": \"symfony/polyfill\"\n }\n },\n \"autoload\": {\n \"files\": [\n \"bootstrap.php\"\n ],\n \"psr-4\": {\n \"Symfony\\\\Polyfill\\\\Php83\\\\\": \"\"\n },\n \"classmap\": [\n \"Resources/stubs\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Nicolas Grekas\",\n \"email\": \"p@tchwork.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Symfony polyfill backporting some PHP 8.3+ features to lower PHP versions\",\n \"homepage\": \"https://symfony.com\",\n \"keywords\": [\n \"compatibility\",\n \"polyfill\",\n \"portable\",\n \"shim\"\n ],\n \"support\": {\n \"source\": \"https://github.com/symfony/polyfill-php83/tree/v1.33.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://github.com/nicolas-grekas\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2025-07-08T02:45:35+00:00\"\n },\n {\n \"name\": \"symfony/polyfill-php84\",\n \"version\": \"v1.33.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/polyfill-php84.git\",\n \"reference\": \"d8ced4d875142b6a7426000426b8abc631d6b191\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/polyfill-php84/zipball/d8ced4d875142b6a7426000426b8abc631d6b191\",\n \"reference\": \"d8ced4d875142b6a7426000426b8abc631d6b191\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=7.2\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"thanks\": {\n \"url\": \"https://github.com/symfony/polyfill\",\n \"name\": \"symfony/polyfill\"\n }\n },\n \"autoload\": {\n \"files\": [\n \"bootstrap.php\"\n ],\n \"psr-4\": {\n \"Symfony\\\\Polyfill\\\\Php84\\\\\": \"\"\n },\n \"classmap\": [\n \"Resources/stubs\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Nicolas Grekas\",\n \"email\": \"p@tchwork.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Symfony polyfill backporting some PHP 8.4+ features to lower PHP versions\",\n \"homepage\": \"https://symfony.com\",\n \"keywords\": [\n \"compatibility\",\n \"polyfill\",\n \"portable\",\n \"shim\"\n ],\n \"support\": {\n \"source\": \"https://github.com/symfony/polyfill-php84/tree/v1.33.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://github.com/nicolas-grekas\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2025-06-24T13:30:11+00:00\"\n },\n {\n \"name\": \"symfony/polyfill-php85\",\n \"version\": \"v1.33.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/polyfill-php85.git\",\n \"reference\": \"d4e5fcd4ab3d998ab16c0db48e6cbb9a01993f91\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/polyfill-php85/zipball/d4e5fcd4ab3d998ab16c0db48e6cbb9a01993f91\",\n \"reference\": \"d4e5fcd4ab3d998ab16c0db48e6cbb9a01993f91\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=7.2\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"thanks\": {\n \"url\": \"https://github.com/symfony/polyfill\",\n \"name\": \"symfony/polyfill\"\n }\n },\n \"autoload\": {\n \"files\": [\n \"bootstrap.php\"\n ],\n \"psr-4\": {\n \"Symfony\\\\Polyfill\\\\Php85\\\\\": \"\"\n },\n \"classmap\": [\n \"Resources/stubs\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Nicolas Grekas\",\n \"email\": \"p@tchwork.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Symfony polyfill backporting some PHP 8.5+ features to lower PHP versions\",\n \"homepage\": \"https://symfony.com\",\n \"keywords\": [\n \"compatibility\",\n \"polyfill\",\n \"portable\",\n \"shim\"\n ],\n \"support\": {\n \"source\": \"https://github.com/symfony/polyfill-php85/tree/v1.33.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://github.com/nicolas-grekas\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2025-06-23T16:12:55+00:00\"\n },\n {\n \"name\": \"symfony/polyfill-uuid\",\n \"version\": \"v1.33.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/polyfill-uuid.git\",\n \"reference\": \"21533be36c24be3f4b1669c4725c7d1d2bab4ae2\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/polyfill-uuid/zipball/21533be36c24be3f4b1669c4725c7d1d2bab4ae2\",\n \"reference\": \"21533be36c24be3f4b1669c4725c7d1d2bab4ae2\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=7.2\"\n },\n \"provide\": {\n \"ext-uuid\": \"*\"\n },\n \"suggest\": {\n \"ext-uuid\": \"For best performance\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"thanks\": {\n \"url\": \"https://github.com/symfony/polyfill\",\n \"name\": \"symfony/polyfill\"\n }\n },\n \"autoload\": {\n \"files\": [\n \"bootstrap.php\"\n ],\n \"psr-4\": {\n \"Symfony\\\\Polyfill\\\\Uuid\\\\\": \"\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Grégoire Pineau\",\n \"email\": \"lyrixx@lyrixx.info\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Symfony polyfill for uuid functions\",\n \"homepage\": \"https://symfony.com\",\n \"keywords\": [\n \"compatibility\",\n \"polyfill\",\n \"portable\",\n \"uuid\"\n ],\n \"support\": {\n \"source\": \"https://github.com/symfony/polyfill-uuid/tree/v1.33.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://github.com/nicolas-grekas\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2024-09-09T11:45:10+00:00\"\n },\n {\n \"name\": \"symfony/postmark-mailer\",\n \"version\": \"v7.3.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/postmark-mailer.git\",\n \"reference\": \"71ac001f8bc2ac36cc0bbea3fd6f4a4087d0cec0\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/postmark-mailer/zipball/71ac001f8bc2ac36cc0bbea3fd6f4a4087d0cec0\",\n \"reference\": \"71ac001f8bc2ac36cc0bbea3fd6f4a4087d0cec0\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.2\",\n \"psr/event-dispatcher\": \"^1\",\n \"symfony/mailer\": \"^7.2\"\n },\n \"conflict\": {\n \"symfony/http-foundation\": \"<6.4\"\n },\n \"require-dev\": {\n \"symfony/http-client\": \"^6.4|^7.0\",\n \"symfony/webhook\": \"^6.4|^7.0\"\n },\n \"type\": \"symfony-mailer-bridge\",\n \"autoload\": {\n \"psr-4\": {\n \"Symfony\\\\Component\\\\Mailer\\\\Bridge\\\\Postmark\\\\\": \"\"\n },\n \"exclude-from-classmap\": [\n \"/Tests/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Fabien Potencier\",\n \"email\": \"fabien@symfony.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Symfony Postmark Mailer Bridge\",\n \"homepage\": \"https://symfony.com\",\n \"support\": {\n \"source\": \"https://github.com/symfony/postmark-mailer/tree/v7.3.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2025-04-30T07:52:47+00:00\"\n },\n {\n \"name\": \"symfony/process\",\n \"version\": \"v7.4.5\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/process.git\",\n \"reference\": \"608476f4604102976d687c483ac63a79ba18cc97\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/process/zipball/608476f4604102976d687c483ac63a79ba18cc97\",\n \"reference\": \"608476f4604102976d687c483ac63a79ba18cc97\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.2\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Symfony\\\\Component\\\\Process\\\\\": \"\"\n },\n \"exclude-from-classmap\": [\n \"/Tests/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Fabien Potencier\",\n \"email\": \"fabien@symfony.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Executes commands in sub-processes\",\n \"homepage\": \"https://symfony.com\",\n \"support\": {\n \"source\": \"https://github.com/symfony/process/tree/v7.4.5\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://github.com/nicolas-grekas\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2026-01-26T15:07:59+00:00\"\n },\n {\n \"name\": \"symfony/property-access\",\n \"version\": \"v7.3.3\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/property-access.git\",\n \"reference\": \"4a4389e5c8bd1d0320d80a23caa6a1ac71cb81a7\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/property-access/zipball/4a4389e5c8bd1d0320d80a23caa6a1ac71cb81a7\",\n \"reference\": \"4a4389e5c8bd1d0320d80a23caa6a1ac71cb81a7\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.2\",\n \"symfony/property-info\": \"^6.4|^7.0\"\n },\n \"require-dev\": {\n \"symfony/cache\": \"^6.4|^7.0\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Symfony\\\\Component\\\\PropertyAccess\\\\\": \"\"\n },\n \"exclude-from-classmap\": [\n \"/Tests/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Fabien Potencier\",\n \"email\": \"fabien@symfony.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Provides functions to read and write from/to an object or array using a simple string notation\",\n \"homepage\": \"https://symfony.com\",\n \"keywords\": [\n \"access\",\n \"array\",\n \"extraction\",\n \"index\",\n \"injection\",\n \"object\",\n \"property\",\n \"property-path\",\n \"reflection\"\n ],\n \"support\": {\n \"source\": \"https://github.com/symfony/property-access/tree/v7.3.3\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://github.com/nicolas-grekas\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2025-08-04T15:15:28+00:00\"\n },\n {\n \"name\": \"symfony/property-info\",\n \"version\": \"v7.3.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/property-info.git\",\n \"reference\": \"90586acbf2a6dd13bee4f09f09111c8bd4773970\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/property-info/zipball/90586acbf2a6dd13bee4f09f09111c8bd4773970\",\n \"reference\": \"90586acbf2a6dd13bee4f09f09111c8bd4773970\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.2\",\n \"symfony/deprecation-contracts\": \"^2.5|^3\",\n \"symfony/string\": \"^6.4|^7.0\",\n \"symfony/type-info\": \"~7.2.8|^7.3.1\"\n },\n \"conflict\": {\n \"phpdocumentor/reflection-docblock\": \"<5.2\",\n \"phpdocumentor/type-resolver\": \"<1.5.1\",\n \"symfony/cache\": \"<6.4\",\n \"symfony/dependency-injection\": \"<6.4\",\n \"symfony/serializer\": \"<6.4\"\n },\n \"require-dev\": {\n \"phpdocumentor/reflection-docblock\": \"^5.2\",\n \"phpstan/phpdoc-parser\": \"^1.0|^2.0\",\n \"symfony/cache\": \"^6.4|^7.0\",\n \"symfony/dependency-injection\": \"^6.4|^7.0\",\n \"symfony/serializer\": \"^6.4|^7.0\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Symfony\\\\Component\\\\PropertyInfo\\\\\": \"\"\n },\n \"exclude-from-classmap\": [\n \"/Tests/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Kévin Dunglas\",\n \"email\": \"dunglas@gmail.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Extracts information about PHP class' properties using metadata of popular sources\",\n \"homepage\": \"https://symfony.com\",\n \"keywords\": [\n \"doctrine\",\n \"phpdoc\",\n \"property\",\n \"symfony\",\n \"type\",\n \"validator\"\n ],\n \"support\": {\n \"source\": \"https://github.com/symfony/property-info/tree/v7.3.1\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2025-06-27T19:55:54+00:00\"\n },\n {\n \"name\": \"symfony/psr-http-message-bridge\",\n \"version\": \"v7.4.4\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/psr-http-message-bridge.git\",\n \"reference\": \"929ffe10bbfbb92e711ac3818d416f9daffee067\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/psr-http-message-bridge/zipball/929ffe10bbfbb92e711ac3818d416f9daffee067\",\n \"reference\": \"929ffe10bbfbb92e711ac3818d416f9daffee067\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.2\",\n \"psr/http-message\": \"^1.0|^2.0\",\n \"symfony/http-foundation\": \"^6.4|^7.0|^8.0\"\n },\n \"conflict\": {\n \"php-http/discovery\": \"<1.15\",\n \"symfony/http-kernel\": \"<6.4\"\n },\n \"require-dev\": {\n \"nyholm/psr7\": \"^1.1\",\n \"php-http/discovery\": \"^1.15\",\n \"psr/log\": \"^1.1.4|^2|^3\",\n \"symfony/browser-kit\": \"^6.4|^7.0|^8.0\",\n \"symfony/config\": \"^6.4|^7.0|^8.0\",\n \"symfony/event-dispatcher\": \"^6.4|^7.0|^8.0\",\n \"symfony/framework-bundle\": \"^6.4.13|^7.1.6|^8.0\",\n \"symfony/http-kernel\": \"^6.4.13|^7.1.6|^8.0\",\n \"symfony/runtime\": \"^6.4.13|^7.1.6|^8.0\"\n },\n \"type\": \"symfony-bridge\",\n \"autoload\": {\n \"psr-4\": {\n \"Symfony\\\\Bridge\\\\PsrHttpMessage\\\\\": \"\"\n },\n \"exclude-from-classmap\": [\n \"/Tests/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Fabien Potencier\",\n \"email\": \"fabien@symfony.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"PSR HTTP message bridge\",\n \"homepage\": \"https://symfony.com\",\n \"keywords\": [\n \"http\",\n \"http-message\",\n \"psr-17\",\n \"psr-7\"\n ],\n \"support\": {\n \"source\": \"https://github.com/symfony/psr-http-message-bridge/tree/v7.4.4\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://github.com/nicolas-grekas\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2026-01-03T23:30:35+00:00\"\n },\n {\n \"name\": \"symfony/routing\",\n \"version\": \"v7.4.6\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/routing.git\",\n \"reference\": \"238d749c56b804b31a9bf3e26519d93b65a60938\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/routing/zipball/238d749c56b804b31a9bf3e26519d93b65a60938\",\n \"reference\": \"238d749c56b804b31a9bf3e26519d93b65a60938\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.2\",\n \"symfony/deprecation-contracts\": \"^2.5|^3\"\n },\n \"conflict\": {\n \"symfony/config\": \"<6.4\",\n \"symfony/dependency-injection\": \"<6.4\",\n \"symfony/yaml\": \"<6.4\"\n },\n \"require-dev\": {\n \"psr/log\": \"^1|^2|^3\",\n \"symfony/config\": \"^6.4|^7.0|^8.0\",\n \"symfony/dependency-injection\": \"^6.4|^7.0|^8.0\",\n \"symfony/expression-language\": \"^6.4|^7.0|^8.0\",\n \"symfony/http-foundation\": \"^6.4|^7.0|^8.0\",\n \"symfony/yaml\": \"^6.4|^7.0|^8.0\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Symfony\\\\Component\\\\Routing\\\\\": \"\"\n },\n \"exclude-from-classmap\": [\n \"/Tests/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Fabien Potencier\",\n \"email\": \"fabien@symfony.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Maps an HTTP request to a set of configuration variables\",\n \"homepage\": \"https://symfony.com\",\n \"keywords\": [\n \"router\",\n \"routing\",\n \"uri\",\n \"url\"\n ],\n \"support\": {\n \"source\": \"https://github.com/symfony/routing/tree/v7.4.6\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://github.com/nicolas-grekas\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2026-02-25T16:50:00+00:00\"\n },\n {\n \"name\": \"symfony/serializer\",\n \"version\": \"v7.3.3\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/serializer.git\",\n \"reference\": \"5608b04d8daaf29432d76ecc618b0fac169c2dfb\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/serializer/zipball/5608b04d8daaf29432d76ecc618b0fac169c2dfb\",\n \"reference\": \"5608b04d8daaf29432d76ecc618b0fac169c2dfb\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.2\",\n \"symfony/deprecation-contracts\": \"^2.5|^3\",\n \"symfony/polyfill-ctype\": \"~1.8\",\n \"symfony/polyfill-php84\": \"^1.30\"\n },\n \"conflict\": {\n \"phpdocumentor/reflection-docblock\": \"<3.2.2\",\n \"phpdocumentor/type-resolver\": \"<1.4.0\",\n \"symfony/dependency-injection\": \"<6.4\",\n \"symfony/property-access\": \"<6.4\",\n \"symfony/property-info\": \"<6.4\",\n \"symfony/uid\": \"<6.4\",\n \"symfony/validator\": \"<6.4\",\n \"symfony/yaml\": \"<6.4\"\n },\n \"require-dev\": {\n \"phpdocumentor/reflection-docblock\": \"^3.2|^4.0|^5.0\",\n \"phpstan/phpdoc-parser\": \"^1.0|^2.0\",\n \"seld/jsonlint\": \"^1.10\",\n \"symfony/cache\": \"^6.4|^7.0\",\n \"symfony/config\": \"^6.4|^7.0\",\n \"symfony/console\": \"^6.4|^7.0\",\n \"symfony/dependency-injection\": \"^7.2\",\n \"symfony/error-handler\": \"^6.4|^7.0\",\n \"symfony/filesystem\": \"^6.4|^7.0\",\n \"symfony/form\": \"^6.4|^7.0\",\n \"symfony/http-foundation\": \"^6.4|^7.0\",\n \"symfony/http-kernel\": \"^6.4|^7.0\",\n \"symfony/messenger\": \"^6.4|^7.0\",\n \"symfony/mime\": \"^6.4|^7.0\",\n \"symfony/property-access\": \"^6.4|^7.0\",\n \"symfony/property-info\": \"^6.4|^7.0\",\n \"symfony/translation-contracts\": \"^2.5|^3\",\n \"symfony/type-info\": \"^7.1.8\",\n \"symfony/uid\": \"^6.4|^7.0\",\n \"symfony/validator\": \"^6.4|^7.0\",\n \"symfony/var-dumper\": \"^6.4|^7.0\",\n \"symfony/var-exporter\": \"^6.4|^7.0\",\n \"symfony/yaml\": \"^6.4|^7.0\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Symfony\\\\Component\\\\Serializer\\\\\": \"\"\n },\n \"exclude-from-classmap\": [\n \"/Tests/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Fabien Potencier\",\n \"email\": \"fabien@symfony.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Handles serializing and deserializing data structures, including object graphs, into array structures or other formats like XML and JSON.\",\n \"homepage\": \"https://symfony.com\",\n \"support\": {\n \"source\": \"https://github.com/symfony/serializer/tree/v7.3.3\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://github.com/nicolas-grekas\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2025-08-27T11:34:33+00:00\"\n },\n {\n \"name\": \"symfony/service-contracts\",\n \"version\": \"v3.6.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/service-contracts.git\",\n \"reference\": \"45112560a3ba2d715666a509a0bc9521d10b6c43\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/service-contracts/zipball/45112560a3ba2d715666a509a0bc9521d10b6c43\",\n \"reference\": \"45112560a3ba2d715666a509a0bc9521d10b6c43\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.1\",\n \"psr/container\": \"^1.1|^2.0\",\n \"symfony/deprecation-contracts\": \"^2.5|^3\"\n },\n \"conflict\": {\n \"ext-psr\": \"<1.1|>=2\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"thanks\": {\n \"url\": \"https://github.com/symfony/contracts\",\n \"name\": \"symfony/contracts\"\n },\n \"branch-alias\": {\n \"dev-main\": \"3.6-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Symfony\\\\Contracts\\\\Service\\\\\": \"\"\n },\n \"exclude-from-classmap\": [\n \"/Test/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Nicolas Grekas\",\n \"email\": \"p@tchwork.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Generic abstractions related to writing services\",\n \"homepage\": \"https://symfony.com\",\n \"keywords\": [\n \"abstractions\",\n \"contracts\",\n \"decoupling\",\n \"interfaces\",\n \"interoperability\",\n \"standards\"\n ],\n \"support\": {\n \"source\": \"https://github.com/symfony/service-contracts/tree/v3.6.1\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://github.com/nicolas-grekas\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2025-07-15T11:30:57+00:00\"\n },\n {\n \"name\": \"symfony/string\",\n \"version\": \"v7.4.6\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/string.git\",\n \"reference\": \"9f209231affa85aa930a5e46e6eb03381424b30b\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/string/zipball/9f209231affa85aa930a5e46e6eb03381424b30b\",\n \"reference\": \"9f209231affa85aa930a5e46e6eb03381424b30b\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.2\",\n \"symfony/deprecation-contracts\": \"^2.5|^3.0\",\n \"symfony/polyfill-ctype\": \"~1.8\",\n \"symfony/polyfill-intl-grapheme\": \"~1.33\",\n \"symfony/polyfill-intl-normalizer\": \"~1.0\",\n \"symfony/polyfill-mbstring\": \"~1.0\"\n },\n \"conflict\": {\n \"symfony/translation-contracts\": \"<2.5\"\n },\n \"require-dev\": {\n \"symfony/emoji\": \"^7.1|^8.0\",\n \"symfony/http-client\": \"^6.4|^7.0|^8.0\",\n \"symfony/intl\": \"^6.4|^7.0|^8.0\",\n \"symfony/translation-contracts\": \"^2.5|^3.0\",\n \"symfony/var-exporter\": \"^6.4|^7.0|^8.0\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"files\": [\n \"Resources/functions.php\"\n ],\n \"psr-4\": {\n \"Symfony\\\\Component\\\\String\\\\\": \"\"\n },\n \"exclude-from-classmap\": [\n \"/Tests/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Nicolas Grekas\",\n \"email\": \"p@tchwork.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way\",\n \"homepage\": \"https://symfony.com\",\n \"keywords\": [\n \"grapheme\",\n \"i18n\",\n \"string\",\n \"unicode\",\n \"utf-8\",\n \"utf8\"\n ],\n \"support\": {\n \"source\": \"https://github.com/symfony/string/tree/v7.4.6\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://github.com/nicolas-grekas\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2026-02-09T09:33:46+00:00\"\n },\n {\n \"name\": \"symfony/translation\",\n \"version\": \"v7.4.6\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/translation.git\",\n \"reference\": \"1888cf064399868af3784b9e043240f1d89d25ce\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/translation/zipball/1888cf064399868af3784b9e043240f1d89d25ce\",\n \"reference\": \"1888cf064399868af3784b9e043240f1d89d25ce\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.2\",\n \"symfony/deprecation-contracts\": \"^2.5|^3\",\n \"symfony/polyfill-mbstring\": \"~1.0\",\n \"symfony/translation-contracts\": \"^2.5.3|^3.3\"\n },\n \"conflict\": {\n \"nikic/php-parser\": \"<5.0\",\n \"symfony/config\": \"<6.4\",\n \"symfony/console\": \"<6.4\",\n \"symfony/dependency-injection\": \"<6.4\",\n \"symfony/http-client-contracts\": \"<2.5\",\n \"symfony/http-kernel\": \"<6.4\",\n \"symfony/service-contracts\": \"<2.5\",\n \"symfony/twig-bundle\": \"<6.4\",\n \"symfony/yaml\": \"<6.4\"\n },\n \"provide\": {\n \"symfony/translation-implementation\": \"2.3|3.0\"\n },\n \"require-dev\": {\n \"nikic/php-parser\": \"^5.0\",\n \"psr/log\": \"^1|^2|^3\",\n \"symfony/config\": \"^6.4|^7.0|^8.0\",\n \"symfony/console\": \"^6.4|^7.0|^8.0\",\n \"symfony/dependency-injection\": \"^6.4|^7.0|^8.0\",\n \"symfony/finder\": \"^6.4|^7.0|^8.0\",\n \"symfony/http-client-contracts\": \"^2.5|^3.0\",\n \"symfony/http-kernel\": \"^6.4|^7.0|^8.0\",\n \"symfony/intl\": \"^6.4|^7.0|^8.0\",\n \"symfony/polyfill-intl-icu\": \"^1.21\",\n \"symfony/routing\": \"^6.4|^7.0|^8.0\",\n \"symfony/service-contracts\": \"^2.5|^3\",\n \"symfony/yaml\": \"^6.4|^7.0|^8.0\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"files\": [\n \"Resources/functions.php\"\n ],\n \"psr-4\": {\n \"Symfony\\\\Component\\\\Translation\\\\\": \"\"\n },\n \"exclude-from-classmap\": [\n \"/Tests/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Fabien Potencier\",\n \"email\": \"fabien@symfony.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Provides tools to internationalize your application\",\n \"homepage\": \"https://symfony.com\",\n \"support\": {\n \"source\": \"https://github.com/symfony/translation/tree/v7.4.6\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://github.com/nicolas-grekas\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2026-02-17T07:53:42+00:00\"\n },\n {\n \"name\": \"symfony/translation-contracts\",\n \"version\": \"v3.6.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/translation-contracts.git\",\n \"reference\": \"65a8bc82080447fae78373aa10f8d13b38338977\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/translation-contracts/zipball/65a8bc82080447fae78373aa10f8d13b38338977\",\n \"reference\": \"65a8bc82080447fae78373aa10f8d13b38338977\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.1\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"thanks\": {\n \"url\": \"https://github.com/symfony/contracts\",\n \"name\": \"symfony/contracts\"\n },\n \"branch-alias\": {\n \"dev-main\": \"3.6-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Symfony\\\\Contracts\\\\Translation\\\\\": \"\"\n },\n \"exclude-from-classmap\": [\n \"/Test/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Nicolas Grekas\",\n \"email\": \"p@tchwork.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Generic abstractions related to translation\",\n \"homepage\": \"https://symfony.com\",\n \"keywords\": [\n \"abstractions\",\n \"contracts\",\n \"decoupling\",\n \"interfaces\",\n \"interoperability\",\n \"standards\"\n ],\n \"support\": {\n \"source\": \"https://github.com/symfony/translation-contracts/tree/v3.6.1\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://github.com/nicolas-grekas\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2025-07-15T13:41:35+00:00\"\n },\n {\n \"name\": \"symfony/type-info\",\n \"version\": \"v7.3.3\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/type-info.git\",\n \"reference\": \"aa64b58ed04517d4d730202dd035895743c23273\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/type-info/zipball/aa64b58ed04517d4d730202dd035895743c23273\",\n \"reference\": \"aa64b58ed04517d4d730202dd035895743c23273\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.2\",\n \"psr/container\": \"^1.1|^2.0\",\n \"symfony/deprecation-contracts\": \"^2.5|^3\"\n },\n \"conflict\": {\n \"phpstan/phpdoc-parser\": \"<1.30\"\n },\n \"require-dev\": {\n \"phpstan/phpdoc-parser\": \"^1.30|^2.0\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Symfony\\\\Component\\\\TypeInfo\\\\\": \"\"\n },\n \"exclude-from-classmap\": [\n \"/Tests/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Mathias Arlaud\",\n \"email\": \"mathias.arlaud@gmail.com\"\n },\n {\n \"name\": \"Baptiste LEDUC\",\n \"email\": \"baptiste.leduc@gmail.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Extracts PHP types information.\",\n \"homepage\": \"https://symfony.com\",\n \"keywords\": [\n \"PHPStan\",\n \"phpdoc\",\n \"symfony\",\n \"type\"\n ],\n \"support\": {\n \"source\": \"https://github.com/symfony/type-info/tree/v7.3.3\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://github.com/nicolas-grekas\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2025-08-28T09:38:04+00:00\"\n },\n {\n \"name\": \"symfony/uid\",\n \"version\": \"v7.4.4\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/uid.git\",\n \"reference\": \"7719ce8aba76be93dfe249192f1fbfa52c588e36\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/uid/zipball/7719ce8aba76be93dfe249192f1fbfa52c588e36\",\n \"reference\": \"7719ce8aba76be93dfe249192f1fbfa52c588e36\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.2\",\n \"symfony/polyfill-uuid\": \"^1.15\"\n },\n \"require-dev\": {\n \"symfony/console\": \"^6.4|^7.0|^8.0\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Symfony\\\\Component\\\\Uid\\\\\": \"\"\n },\n \"exclude-from-classmap\": [\n \"/Tests/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Grégoire Pineau\",\n \"email\": \"lyrixx@lyrixx.info\"\n },\n {\n \"name\": \"Nicolas Grekas\",\n \"email\": \"p@tchwork.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Provides an object-oriented API to generate and represent UIDs\",\n \"homepage\": \"https://symfony.com\",\n \"keywords\": [\n \"UID\",\n \"ulid\",\n \"uuid\"\n ],\n \"support\": {\n \"source\": \"https://github.com/symfony/uid/tree/v7.4.4\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://github.com/nicolas-grekas\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2026-01-03T23:30:35+00:00\"\n },\n {\n \"name\": \"symfony/var-dumper\",\n \"version\": \"v7.4.6\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/var-dumper.git\",\n \"reference\": \"045321c440ac18347b136c63d2e9bf28a2dc0291\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/var-dumper/zipball/045321c440ac18347b136c63d2e9bf28a2dc0291\",\n \"reference\": \"045321c440ac18347b136c63d2e9bf28a2dc0291\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.2\",\n \"symfony/deprecation-contracts\": \"^2.5|^3\",\n \"symfony/polyfill-mbstring\": \"~1.0\"\n },\n \"conflict\": {\n \"symfony/console\": \"<6.4\"\n },\n \"require-dev\": {\n \"symfony/console\": \"^6.4|^7.0|^8.0\",\n \"symfony/http-kernel\": \"^6.4|^7.0|^8.0\",\n \"symfony/process\": \"^6.4|^7.0|^8.0\",\n \"symfony/uid\": \"^6.4|^7.0|^8.0\",\n \"twig/twig\": \"^3.12\"\n },\n \"bin\": [\n \"Resources/bin/var-dump-server\"\n ],\n \"type\": \"library\",\n \"autoload\": {\n \"files\": [\n \"Resources/functions/dump.php\"\n ],\n \"psr-4\": {\n \"Symfony\\\\Component\\\\VarDumper\\\\\": \"\"\n },\n \"exclude-from-classmap\": [\n \"/Tests/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Nicolas Grekas\",\n \"email\": \"p@tchwork.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Provides mechanisms for walking through any arbitrary PHP variable\",\n \"homepage\": \"https://symfony.com\",\n \"keywords\": [\n \"debug\",\n \"dump\"\n ],\n \"support\": {\n \"source\": \"https://github.com/symfony/var-dumper/tree/v7.4.6\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://github.com/nicolas-grekas\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2026-02-15T10:53:20+00:00\"\n },\n {\n \"name\": \"symfony/var-exporter\",\n \"version\": \"v7.3.3\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/var-exporter.git\",\n \"reference\": \"d4dfcd2a822cbedd7612eb6fbd260e46f87b7137\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/var-exporter/zipball/d4dfcd2a822cbedd7612eb6fbd260e46f87b7137\",\n \"reference\": \"d4dfcd2a822cbedd7612eb6fbd260e46f87b7137\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.2\",\n \"symfony/deprecation-contracts\": \"^2.5|^3\"\n },\n \"require-dev\": {\n \"symfony/property-access\": \"^6.4|^7.0\",\n \"symfony/serializer\": \"^6.4|^7.0\",\n \"symfony/var-dumper\": \"^6.4|^7.0\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Symfony\\\\Component\\\\VarExporter\\\\\": \"\"\n },\n \"exclude-from-classmap\": [\n \"/Tests/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Nicolas Grekas\",\n \"email\": \"p@tchwork.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Allows exporting any serializable PHP data structure to plain PHP code\",\n \"homepage\": \"https://symfony.com\",\n \"keywords\": [\n \"clone\",\n \"construct\",\n \"export\",\n \"hydrate\",\n \"instantiate\",\n \"lazy-loading\",\n \"proxy\",\n \"serialize\"\n ],\n \"support\": {\n \"source\": \"https://github.com/symfony/var-exporter/tree/v7.3.3\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://github.com/nicolas-grekas\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2025-08-18T13:10:53+00:00\"\n },\n {\n \"name\": \"symfony/workflow\",\n \"version\": \"v7.3.2\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/workflow.git\",\n \"reference\": \"3d45024478161e563264a97895d9be5e6d7fb152\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/workflow/zipball/3d45024478161e563264a97895d9be5e6d7fb152\",\n \"reference\": \"3d45024478161e563264a97895d9be5e6d7fb152\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.2\",\n \"symfony/deprecation-contracts\": \"2.5|^3\"\n },\n \"conflict\": {\n \"symfony/event-dispatcher\": \"<6.4\"\n },\n \"require-dev\": {\n \"psr/log\": \"^1|^2|^3\",\n \"symfony/config\": \"^6.4|^7.0\",\n \"symfony/dependency-injection\": \"^6.4|^7.0\",\n \"symfony/error-handler\": \"^6.4|^7.0\",\n \"symfony/event-dispatcher\": \"^6.4|^7.0\",\n \"symfony/expression-language\": \"^6.4|^7.0\",\n \"symfony/http-kernel\": \"^6.4|^7.0\",\n \"symfony/security-core\": \"^6.4|^7.0\",\n \"symfony/stopwatch\": \"^6.4|^7.0\",\n \"symfony/validator\": \"^6.4|^7.0\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Symfony\\\\Component\\\\Workflow\\\\\": \"\"\n },\n \"exclude-from-classmap\": [\n \"/Tests/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Fabien Potencier\",\n \"email\": \"fabien@symfony.com\"\n },\n {\n \"name\": \"Grégoire Pineau\",\n \"email\": \"lyrixx@lyrixx.info\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Provides tools for managing a workflow or finite state machine\",\n \"homepage\": \"https://symfony.com\",\n \"keywords\": [\n \"petrinet\",\n \"place\",\n \"state\",\n \"statemachine\",\n \"transition\",\n \"workflow\"\n ],\n \"support\": {\n \"source\": \"https://github.com/symfony/workflow/tree/v7.3.2\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://github.com/nicolas-grekas\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2025-07-15T17:58:03+00:00\"\n },\n {\n \"name\": \"symfony/yaml\",\n \"version\": \"v7.3.3\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/yaml.git\",\n \"reference\": \"d4f4a66866fe2451f61296924767280ab5732d9d\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/yaml/zipball/d4f4a66866fe2451f61296924767280ab5732d9d\",\n \"reference\": \"d4f4a66866fe2451f61296924767280ab5732d9d\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.2\",\n \"symfony/deprecation-contracts\": \"^2.5|^3.0\",\n \"symfony/polyfill-ctype\": \"^1.8\"\n },\n \"conflict\": {\n \"symfony/console\": \"<6.4\"\n },\n \"require-dev\": {\n \"symfony/console\": \"^6.4|^7.0\"\n },\n \"bin\": [\n \"Resources/bin/yaml-lint\"\n ],\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Symfony\\\\Component\\\\Yaml\\\\\": \"\"\n },\n \"exclude-from-classmap\": [\n \"/Tests/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Fabien Potencier\",\n \"email\": \"fabien@symfony.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Loads and dumps YAML files\",\n \"homepage\": \"https://symfony.com\",\n \"support\": {\n \"source\": \"https://github.com/symfony/yaml/tree/v7.3.3\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://github.com/nicolas-grekas\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2025-08-27T11:34:33+00:00\"\n },\n {\n \"name\": \"tbachert/spi\",\n \"version\": \"v1.0.5\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/Nevay/spi.git\",\n \"reference\": \"e7078767866d0a9e0f91d3f9d42a832df5e39002\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/Nevay/spi/zipball/e7078767866d0a9e0f91d3f9d42a832df5e39002\",\n \"reference\": \"e7078767866d0a9e0f91d3f9d42a832df5e39002\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"composer-plugin-api\": \"^2.0\",\n \"composer/semver\": \"^1.0 || ^2.0 || ^3.0\",\n \"php\": \"^8.1\"\n },\n \"require-dev\": {\n \"composer/composer\": \"^2.0\",\n \"infection/infection\": \"^0.27.9\",\n \"phpunit/phpunit\": \"^10.5\",\n \"psalm/phar\": \"^5.18\"\n },\n \"type\": \"composer-plugin\",\n \"extra\": {\n \"class\": \"Nevay\\\\SPI\\\\Composer\\\\Plugin\",\n \"branch-alias\": {\n \"dev-main\": \"1.0.x-dev\"\n },\n \"plugin-optional\": true\n },\n \"autoload\": {\n \"psr-4\": {\n \"Nevay\\\\SPI\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"Apache-2.0\"\n ],\n \"description\": \"Service provider loading facility\",\n \"keywords\": [\n \"service provider\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/Nevay/spi/issues\",\n \"source\": \"https://github.com/Nevay/spi/tree/v1.0.5\"\n },\n \"time\": \"2025-06-29T15:42:06+00:00\"\n },\n {\n \"name\": \"tecnickcom/tcpdf\",\n \"version\": \"6.11.2\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/tecnickcom/TCPDF.git\",\n \"reference\": \"e1e2ade18e574e963473f53271591edd8c0033ec\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/tecnickcom/TCPDF/zipball/e1e2ade18e574e963473f53271591edd8c0033ec\",\n \"reference\": \"e1e2ade18e574e963473f53271591edd8c0033ec\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"ext-curl\": \"*\",\n \"php\": \">=7.1.0\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"classmap\": [\n \"config\",\n \"include\",\n \"tcpdf.php\",\n \"tcpdf_barcodes_1d.php\",\n \"tcpdf_barcodes_2d.php\",\n \"include/tcpdf_colors.php\",\n \"include/tcpdf_filters.php\",\n \"include/tcpdf_font_data.php\",\n \"include/tcpdf_fonts.php\",\n \"include/tcpdf_images.php\",\n \"include/tcpdf_static.php\",\n \"include/barcodes/datamatrix.php\",\n \"include/barcodes/pdf417.php\",\n \"include/barcodes/qrcode.php\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"LGPL-3.0-or-later\"\n ],\n \"authors\": [\n {\n \"name\": \"Nicola Asuni\",\n \"email\": \"info@tecnick.com\",\n \"role\": \"lead\"\n }\n ],\n \"description\": \"TCPDF is a PHP class for generating PDF documents and barcodes.\",\n \"homepage\": \"http://www.tcpdf.org/\",\n \"keywords\": [\n \"PDFD32000-2008\",\n \"TCPDF\",\n \"barcodes\",\n \"datamatrix\",\n \"pdf\",\n \"pdf417\",\n \"qrcode\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/tecnickcom/TCPDF/issues\",\n \"source\": \"https://github.com/tecnickcom/TCPDF/tree/6.11.2\"\n },\n \"funding\": [\n {\n \"url\": \"https://www.paypal.com/donate/?hosted_button_id=NZUEC5XS8MFBJ\",\n \"type\": \"custom\"\n }\n ],\n \"time\": \"2026-03-03T08:58:10+00:00\"\n },\n {\n \"name\": \"thenetworg/oauth2-azure\",\n \"version\": \"dev-master\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/TheNetworg/oauth2-azure.git\",\n \"reference\": \"06f1aa023e18cc3ea80df6410c7c2dc5502a3655\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/TheNetworg/oauth2-azure/zipball/06f1aa023e18cc3ea80df6410c7c2dc5502a3655\",\n \"reference\": \"06f1aa023e18cc3ea80df6410c7c2dc5502a3655\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"ext-json\": \"*\",\n \"ext-openssl\": \"*\",\n \"firebase/php-jwt\": \"~3.0||~4.0||~5.0||~6.0||~7.0\",\n \"league/oauth2-client\": \"~2.0\",\n \"php\": \"^7.1|^8.0\"\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \"^9.6\"\n },\n \"default-branch\": true,\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"TheNetworg\\\\OAuth2\\\\Client\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Jan Hajek\",\n \"email\": \"jan.hajek@thenetw.org\",\n \"homepage\": \"https://thenetw.org\"\n }\n ],\n \"description\": \"Azure Active Directory OAuth 2.0 Client Provider for The PHP League OAuth2-Client\",\n \"keywords\": [\n \"SSO\",\n \"aad\",\n \"authorization\",\n \"azure\",\n \"azure active directory\",\n \"client\",\n \"microsoft\",\n \"oauth\",\n \"oauth2\",\n \"windows azure\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/TheNetworg/oauth2-azure/issues\",\n \"source\": \"https://github.com/TheNetworg/oauth2-azure/tree/master\"\n },\n \"time\": \"2026-02-26T08:05:57+00:00\"\n },\n {\n \"name\": \"tijsverkoyen/css-to-inline-styles\",\n \"version\": \"v2.4.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/tijsverkoyen/CssToInlineStyles.git\",\n \"reference\": \"f0292ccf0ec75843d65027214426b6b163b48b41\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/tijsverkoyen/CssToInlineStyles/zipball/f0292ccf0ec75843d65027214426b6b163b48b41\",\n \"reference\": \"f0292ccf0ec75843d65027214426b6b163b48b41\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"ext-dom\": \"*\",\n \"ext-libxml\": \"*\",\n \"php\": \"^7.4 || ^8.0\",\n \"symfony/css-selector\": \"^5.4 || ^6.0 || ^7.0 || ^8.0\"\n },\n \"require-dev\": {\n \"phpstan/phpstan\": \"^2.0\",\n \"phpstan/phpstan-phpunit\": \"^2.0\",\n \"phpunit/phpunit\": \"^8.5.21 || ^9.5.10\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"2.x-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"TijsVerkoyen\\\\CssToInlineStyles\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"BSD-3-Clause\"\n ],\n \"authors\": [\n {\n \"name\": \"Tijs Verkoyen\",\n \"email\": \"css_to_inline_styles@verkoyen.eu\",\n \"role\": \"Developer\"\n }\n ],\n \"description\": \"CssToInlineStyles is a class that enables you to convert HTML-pages/files into HTML-pages/files with inline styles. This is very useful when you're sending emails.\",\n \"homepage\": \"https://github.com/tijsverkoyen/CssToInlineStyles\",\n \"support\": {\n \"issues\": \"https://github.com/tijsverkoyen/CssToInlineStyles/issues\",\n \"source\": \"https://github.com/tijsverkoyen/CssToInlineStyles/tree/v2.4.0\"\n },\n \"time\": \"2025-12-02T11:56:42+00:00\"\n },\n {\n \"name\": \"tmannherz/oauth2-ringcentral\",\n \"version\": \"dev-master\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/jiminny/oauth2-ringcentral.git\",\n \"reference\": \"80082612910485dcb9b1ff3f5fa21190494e4b1c\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/jiminny/oauth2-ringcentral/zipball/80082612910485dcb9b1ff3f5fa21190494e4b1c\",\n \"reference\": \"80082612910485dcb9b1ff3f5fa21190494e4b1c\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"league/oauth2-client\": \"^2.5.0\",\n \"php\": \">=5.5.0\"\n },\n \"default-branch\": true,\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"TMannherz\\\\OAuth2\\\\Client\\\\\": \"src/\"\n }\n },\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Todd Mannherz\",\n \"email\": \"todd.mannherz@gmail.com\"\n }\n ],\n \"description\": \"RingCentral OAuth 2.0 Client Provider for The PHP League OAuth2-Client\",\n \"keywords\": [\n \"authentication\",\n \"authorization\",\n \"identity\",\n \"idp\",\n \"oauth\",\n \"oauth2\",\n \"ring central\",\n \"ringcentral\",\n \"ringcentral api\",\n \"single sign on\",\n \"sso\"\n ],\n \"support\": {\n \"source\": \"https://github.com/jiminny/oauth2-ringcentral/tree/master\"\n },\n \"time\": \"2021-03-23T16:37:32+00:00\"\n },\n {\n \"name\": \"twilio/sdk\",\n \"version\": \"8.9.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/twilio/twilio-php\",\n \"reference\": \"7bae72d9066055e714d8b20d0440149068490c43\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/twilio/twilio-php/zipball/7bae72d9066055e714d8b20d0440149068490c43\",\n \"reference\": \"7bae72d9066055e714d8b20d0440149068490c43\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=7.1.0\"\n },\n \"require-dev\": {\n \"friendsofphp/php-cs-fixer\": \"^3.0\",\n \"guzzlehttp/guzzle\": \"^6.3 || ^7.0\",\n \"phpunit/phpunit\": \">=7.0 < 10\"\n },\n \"suggest\": {\n \"guzzlehttp/guzzle\": \"An HTTP client to execute the API requests\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Twilio\\\\\": \"src/Twilio/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Twilio API Team\",\n \"email\": \"api@twilio.com\"\n }\n ],\n \"description\": \"A PHP wrapper for Twilio's API\",\n \"homepage\": \"https://github.com/twilio/twilio-php\",\n \"keywords\": [\n \"api\",\n \"sms\",\n \"twilio\"\n ],\n \"time\": \"2025-12-03T11:18:57+00:00\"\n },\n {\n \"name\": \"vanderlee/php-sentence\",\n \"version\": \"1.0.8\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/vanderlee/php-sentence.git\",\n \"reference\": \"3febfae719c7dfbb51800ec1cfcab35eb3260b7d\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/vanderlee/php-sentence/zipball/3febfae719c7dfbb51800ec1cfcab35eb3260b7d\",\n \"reference\": \"3febfae719c7dfbb51800ec1cfcab35eb3260b7d\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"ext-ctype\": \"*\",\n \"ext-mbstring\": \"*\",\n \"php\": \">=5.4.0\"\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \"^3.6.12\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Vanderlee\\\\Sentence\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"description\": \"Simple text sentence splitting and counting. Supports at least english, german and dutch, possibly more.\",\n \"homepage\": \"https://github.com/vanderlee/php-sentence.git\",\n \"keywords\": [\n \"boundary\",\n \"count\",\n \"disambiguation\",\n \"segmentation\",\n \"sentence\",\n \"split\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/vanderlee/php-sentence/issues\",\n \"source\": \"https://github.com/vanderlee/php-sentence\"\n },\n \"time\": \"2024-04-11T09:45:10+00:00\"\n },\n {\n \"name\": \"vinkla/hashids\",\n \"version\": \"13.0.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/vinkla/laravel-hashids.git\",\n \"reference\": \"f59ebf0d223b4986c4bdc76e6e694bf6056f8a0a\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/vinkla/laravel-hashids/zipball/f59ebf0d223b4986c4bdc76e6e694bf6056f8a0a\",\n \"reference\": \"f59ebf0d223b4986c4bdc76e6e694bf6056f8a0a\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"graham-campbell/manager\": \"^5.2\",\n \"hashids/hashids\": \"^5.0\",\n \"illuminate/contracts\": \"^12.0\",\n \"illuminate/support\": \"^12.0\",\n \"php\": \"^8.2\"\n },\n \"require-dev\": {\n \"graham-campbell/analyzer\": \"^5.0\",\n \"graham-campbell/testbench\": \"^6.1\",\n \"mockery/mockery\": \"^1.6.6\",\n \"phpunit/phpunit\": \"^11.5\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"laravel\": {\n \"aliases\": {\n \"Hashids\": \"Vinkla\\\\Hashids\\\\Facades\\\\Hashids\"\n },\n \"providers\": [\n \"Vinkla\\\\Hashids\\\\HashidsServiceProvider\"\n ]\n },\n \"branch-alias\": {\n \"dev-master\": \"12.0-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Vinkla\\\\Hashids\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Vincent Klaiber\",\n \"homepage\": \"https://github.com/vinkla\"\n }\n ],\n \"description\": \"A Hashids bridge for Laravel\",\n \"keywords\": [\n \"hashids\",\n \"laravel\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/vinkla/laravel-hashids/issues\",\n \"source\": \"https://github.com/vinkla/laravel-hashids/tree/13.0.0\"\n },\n \"time\": \"2025-03-02T21:39:35+00:00\"\n },\n {\n \"name\": \"vlucas/phpdotenv\",\n \"version\": \"v5.6.3\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/vlucas/phpdotenv.git\",\n \"reference\": \"955e7815d677a3eaa7075231212f2110983adecc\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/vlucas/phpdotenv/zipball/955e7815d677a3eaa7075231212f2110983adecc\",\n \"reference\": \"955e7815d677a3eaa7075231212f2110983adecc\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"ext-pcre\": \"*\",\n \"graham-campbell/result-type\": \"^1.1.4\",\n \"php\": \"^7.2.5 || ^8.0\",\n \"phpoption/phpoption\": \"^1.9.5\",\n \"symfony/polyfill-ctype\": \"^1.26\",\n \"symfony/polyfill-mbstring\": \"^1.26\",\n \"symfony/polyfill-php80\": \"^1.26\"\n },\n \"require-dev\": {\n \"bamarni/composer-bin-plugin\": \"^1.8.2\",\n \"ext-filter\": \"*\",\n \"phpunit/phpunit\": \"^8.5.34 || ^9.6.13 || ^10.4.2\"\n },\n \"suggest\": {\n \"ext-filter\": \"Required to use the boolean validator.\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"bamarni-bin\": {\n \"bin-links\": true,\n \"forward-command\": false\n },\n \"branch-alias\": {\n \"dev-master\": \"5.6-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Dotenv\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"BSD-3-Clause\"\n ],\n \"authors\": [\n {\n \"name\": \"Graham Campbell\",\n \"email\": \"hello@gjcampbell.co.uk\",\n \"homepage\": \"https://github.com/GrahamCampbell\"\n },\n {\n \"name\": \"Vance Lucas\",\n \"email\": \"vance@vancelucas.com\",\n \"homepage\": \"https://github.com/vlucas\"\n }\n ],\n \"description\": \"Loads environment variables from `.env` to `getenv()`, `$_ENV` and `$_SERVER` automagically.\",\n \"keywords\": [\n \"dotenv\",\n \"env\",\n \"environment\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/vlucas/phpdotenv/issues\",\n \"source\": \"https://github.com/vlucas/phpdotenv/tree/v5.6.3\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/GrahamCampbell\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/vlucas/phpdotenv\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2025-12-27T19:49:13+00:00\"\n },\n {\n \"name\": \"voku/portable-ascii\",\n \"version\": \"2.0.3\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/voku/portable-ascii.git\",\n \"reference\": \"b1d923f88091c6bf09699efcd7c8a1b1bfd7351d\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/voku/portable-ascii/zipball/b1d923f88091c6bf09699efcd7c8a1b1bfd7351d\",\n \"reference\": \"b1d923f88091c6bf09699efcd7c8a1b1bfd7351d\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=7.0.0\"\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \"~6.0 || ~7.0 || ~9.0\"\n },\n \"suggest\": {\n \"ext-intl\": \"Use Intl for transliterator_transliterate() support\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"voku\\\\\": \"src/voku/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Lars Moelleken\",\n \"homepage\": \"https://www.moelleken.org/\"\n }\n ],\n \"description\": \"Portable ASCII library - performance optimized (ascii) string functions for php.\",\n \"homepage\": \"https://github.com/voku/portable-ascii\",\n \"keywords\": [\n \"ascii\",\n \"clean\",\n \"php\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/voku/portable-ascii/issues\",\n \"source\": \"https://github.com/voku/portable-ascii/tree/2.0.3\"\n },\n \"funding\": [\n {\n \"url\": \"https://www.paypal.me/moelleken\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/voku\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://opencollective.com/portable-ascii\",\n \"type\": \"open_collective\"\n },\n {\n \"url\": \"https://www.patreon.com/voku\",\n \"type\": \"patreon\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/voku/portable-ascii\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2024-11-21T01:49:47+00:00\"\n },\n {\n \"name\": \"wildbit/postmark-php\",\n \"version\": \"v6.1.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/ActiveCampaign/postmark-php.git\",\n \"reference\": \"9ba4ed06f607ae1cc7976fa507cd22dab395b078\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/ActiveCampaign/postmark-php/zipball/9ba4ed06f607ae1cc7976fa507cd22dab395b078\",\n \"reference\": \"9ba4ed06f607ae1cc7976fa507cd22dab395b078\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"guzzlehttp/guzzle\": \"^7.8\",\n \"php\": \"~8.1 || ~8.2|| ~8.3 || ~8.4\"\n },\n \"require-dev\": {\n \"friendsofphp/php-cs-fixer\": \"^3.40\",\n \"phpstan/phpstan\": \"^1.10\",\n \"phpunit/phpunit\": \"^9\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-0\": {\n \"Postmark\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"description\": \"The officially supported client for Postmark (http://postmarkapp.com)\",\n \"support\": {\n \"issues\": \"https://github.com/ActiveCampaign/postmark-php/issues\",\n \"source\": \"https://github.com/ActiveCampaign/postmark-php/tree/v6.1.0\"\n },\n \"time\": \"2025-06-25T20:23:19+00:00\"\n },\n {\n \"name\": \"willdurand/email-reply-parser\",\n \"version\": \"2.10.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/willdurand/EmailReplyParser.git\",\n \"reference\": \"f25f8c6c3cb876112e3857eb3da15e38e44e4725\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/willdurand/EmailReplyParser/zipball/f25f8c6c3cb876112e3857eb3da15e38e44e4725\",\n \"reference\": \"f25f8c6c3cb876112e3857eb3da15e38e44e4725\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=7.4.0\"\n },\n \"require-dev\": {\n \"symfony/phpunit-bridge\": \"^5.0\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"2.8-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"EmailReplyParser\\\\\": \"src/EmailReplyParser\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"William Durand\",\n \"email\": \"will+git@drnd.me\"\n }\n ],\n \"description\": \"Port of the cool GitHub's EmailReplyParser library in PHP\",\n \"keywords\": [\n \"email\",\n \"reply-parser\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/willdurand/EmailReplyParser/issues\",\n \"source\": \"https://github.com/willdurand/EmailReplyParser/tree/2.10.0\"\n },\n \"time\": \"2022-01-30T20:56:36+00:00\"\n },\n {\n \"name\": \"zbateson/mail-mime-parser\",\n \"version\": \"3.0.4\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/zbateson/mail-mime-parser.git\",\n \"reference\": \"f0ccec9290a5b9cf014d7b7ea3401d2a4a626e9a\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/zbateson/mail-mime-parser/zipball/f0ccec9290a5b9cf014d7b7ea3401d2a4a626e9a\",\n \"reference\": \"f0ccec9290a5b9cf014d7b7ea3401d2a4a626e9a\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"guzzlehttp/psr7\": \"^2.5\",\n \"php\": \">=8.0\",\n \"php-di/php-di\": \"^6.0|^7.0\",\n \"psr/log\": \"^1|^2|^3\",\n \"zbateson/mb-wrapper\": \"^2.0\",\n \"zbateson/stream-decorators\": \"^2.1\"\n },\n \"require-dev\": {\n \"friendsofphp/php-cs-fixer\": \"*\",\n \"monolog/monolog\": \"^2|^3\",\n \"phpstan/phpstan\": \"*\",\n \"phpunit/phpunit\": \"^9.6\"\n },\n \"suggest\": {\n \"ext-iconv\": \"For best support/performance\",\n \"ext-mbstring\": \"For best support/performance\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"ZBateson\\\\MailMimeParser\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"BSD-2-Clause\"\n ],\n \"authors\": [\n {\n \"name\": \"Zaahid Bateson\"\n },\n {\n \"name\": \"Contributors\",\n \"homepage\": \"https://github.com/zbateson/mail-mime-parser/graphs/contributors\"\n }\n ],\n \"description\": \"MIME email message parser\",\n \"homepage\": \"https://mail-mime-parser.org\",\n \"keywords\": [\n \"MimeMailParser\",\n \"email\",\n \"mail\",\n \"mailparse\",\n \"mime\",\n \"mimeparse\",\n \"parser\",\n \"php-imap\"\n ],\n \"support\": {\n \"docs\": \"https://mail-mime-parser.org/#usage-guide\",\n \"issues\": \"https://github.com/zbateson/mail-mime-parser/issues\",\n \"source\": \"https://github.com/zbateson/mail-mime-parser\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/zbateson\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2025-09-03T17:18:36+00:00\"\n },\n {\n \"name\": \"zbateson/mb-wrapper\",\n \"version\": \"2.0.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/zbateson/mb-wrapper.git\",\n \"reference\": \"50a14c0c9537f978a61cde9fdc192a0267cc9cff\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/zbateson/mb-wrapper/zipball/50a14c0c9537f978a61cde9fdc192a0267cc9cff\",\n \"reference\": \"50a14c0c9537f978a61cde9fdc192a0267cc9cff\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.0\",\n \"symfony/polyfill-iconv\": \"^1.9\",\n \"symfony/polyfill-mbstring\": \"^1.9\"\n },\n \"require-dev\": {\n \"friendsofphp/php-cs-fixer\": \"*\",\n \"phpstan/phpstan\": \"*\",\n \"phpunit/phpunit\": \"^9.6|^10.0\"\n },\n \"suggest\": {\n \"ext-iconv\": \"For best support/performance\",\n \"ext-mbstring\": \"For best support/performance\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"ZBateson\\\\MbWrapper\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"BSD-2-Clause\"\n ],\n \"authors\": [\n {\n \"name\": \"Zaahid Bateson\"\n }\n ],\n \"description\": \"Wrapper for mbstring with fallback to iconv for encoding conversion and string manipulation\",\n \"keywords\": [\n \"charset\",\n \"encoding\",\n \"http\",\n \"iconv\",\n \"mail\",\n \"mb\",\n \"mb_convert_encoding\",\n \"mbstring\",\n \"mime\",\n \"multibyte\",\n \"string\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/zbateson/mb-wrapper/issues\",\n \"source\": \"https://github.com/zbateson/mb-wrapper/tree/2.0.1\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/zbateson\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2024-12-20T22:05:33+00:00\"\n },\n {\n \"name\": \"zbateson/stream-decorators\",\n \"version\": \"2.1.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/zbateson/stream-decorators.git\",\n \"reference\": \"32a2a62fb0f26313395c996ebd658d33c3f9c4e5\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/zbateson/stream-decorators/zipball/32a2a62fb0f26313395c996ebd658d33c3f9c4e5\",\n \"reference\": \"32a2a62fb0f26313395c996ebd658d33c3f9c4e5\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"guzzlehttp/psr7\": \"^2.5\",\n \"php\": \">=8.0\",\n \"zbateson/mb-wrapper\": \"^2.0\"\n },\n \"require-dev\": {\n \"friendsofphp/php-cs-fixer\": \"*\",\n \"phpstan/phpstan\": \"*\",\n \"phpunit/phpunit\": \"^9.6|^10.0\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"ZBateson\\\\StreamDecorators\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"BSD-2-Clause\"\n ],\n \"authors\": [\n {\n \"name\": \"Zaahid Bateson\"\n }\n ],\n \"description\": \"PHP psr7 stream decorators for mime message part streams\",\n \"keywords\": [\n \"base64\",\n \"charset\",\n \"decorators\",\n \"mail\",\n \"mime\",\n \"psr7\",\n \"quoted-printable\",\n \"stream\",\n \"uuencode\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/zbateson/stream-decorators/issues\",\n \"source\": \"https://github.com/zbateson/stream-decorators/tree/2.1.1\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/zbateson\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2024-04-29T21:42:39+00:00\"\n }\n ],\n \"packages-dev\": [\n {\n \"name\": \"amphp/amp\",\n \"version\": \"v3.1.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/amphp/amp.git\",\n \"reference\": \"fa0ab33a6f47a82929c38d03ca47ebb71086a93f\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/amphp/amp/zipball/fa0ab33a6f47a82929c38d03ca47ebb71086a93f\",\n \"reference\": \"fa0ab33a6f47a82929c38d03ca47ebb71086a93f\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.1\",\n \"revolt/event-loop\": \"^1 || ^0.2\"\n },\n \"require-dev\": {\n \"amphp/php-cs-fixer-config\": \"^2\",\n \"phpunit/phpunit\": \"^9\",\n \"psalm/phar\": \"5.23.1\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"files\": [\n \"src/functions.php\",\n \"src/Future/functions.php\",\n \"src/Internal/functions.php\"\n ],\n \"psr-4\": {\n \"Amp\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Aaron Piotrowski\",\n \"email\": \"aaron@trowski.com\"\n },\n {\n \"name\": \"Bob Weinand\",\n \"email\": \"bobwei9@hotmail.com\"\n },\n {\n \"name\": \"Niklas Keller\",\n \"email\": \"me@kelunik.com\"\n },\n {\n \"name\": \"Daniel Lowrey\",\n \"email\": \"rdlowrey@php.net\"\n }\n ],\n \"description\": \"A non-blocking concurrency framework for PHP applications.\",\n \"homepage\": \"https://amphp.org/amp\",\n \"keywords\": [\n \"async\",\n \"asynchronous\",\n \"awaitable\",\n \"concurrency\",\n \"event\",\n \"event-loop\",\n \"future\",\n \"non-blocking\",\n \"promise\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/amphp/amp/issues\",\n \"source\": \"https://github.com/amphp/amp/tree/v3.1.1\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/amphp\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2025-08-27T21:42:00+00:00\"\n },\n {\n \"name\": \"amphp/byte-stream\",\n \"version\": \"v2.1.2\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/amphp/byte-stream.git\",\n \"reference\": \"55a6bd071aec26fa2a3e002618c20c35e3df1b46\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/amphp/byte-stream/zipball/55a6bd071aec26fa2a3e002618c20c35e3df1b46\",\n \"reference\": \"55a6bd071aec26fa2a3e002618c20c35e3df1b46\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"amphp/amp\": \"^3\",\n \"amphp/parser\": \"^1.1\",\n \"amphp/pipeline\": \"^1\",\n \"amphp/serialization\": \"^1\",\n \"amphp/sync\": \"^2\",\n \"php\": \">=8.1\",\n \"revolt/event-loop\": \"^1 || ^0.2.3\"\n },\n \"require-dev\": {\n \"amphp/php-cs-fixer-config\": \"^2\",\n \"amphp/phpunit-util\": \"^3\",\n \"phpunit/phpunit\": \"^9\",\n \"psalm/phar\": \"5.22.1\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"files\": [\n \"src/functions.php\",\n \"src/Internal/functions.php\"\n ],\n \"psr-4\": {\n \"Amp\\\\ByteStream\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Aaron Piotrowski\",\n \"email\": \"aaron@trowski.com\"\n },\n {\n \"name\": \"Niklas Keller\",\n \"email\": \"me@kelunik.com\"\n }\n ],\n \"description\": \"A stream abstraction to make working with non-blocking I/O simple.\",\n \"homepage\": \"https://amphp.org/byte-stream\",\n \"keywords\": [\n \"amp\",\n \"amphp\",\n \"async\",\n \"io\",\n \"non-blocking\",\n \"stream\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/amphp/byte-stream/issues\",\n \"source\": \"https://github.com/amphp/byte-stream/tree/v2.1.2\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/amphp\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2025-03-16T17:10:27+00:00\"\n },\n {\n \"name\": \"amphp/cache\",\n \"version\": \"v2.0.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/amphp/cache.git\",\n \"reference\": \"46912e387e6aa94933b61ea1ead9cf7540b7797c\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/amphp/cache/zipball/46912e387e6aa94933b61ea1ead9cf7540b7797c\",\n \"reference\": \"46912e387e6aa94933b61ea1ead9cf7540b7797c\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"amphp/amp\": \"^3\",\n \"amphp/serialization\": \"^1\",\n \"amphp/sync\": \"^2\",\n \"php\": \">=8.1\",\n \"revolt/event-loop\": \"^1 || ^0.2\"\n },\n \"require-dev\": {\n \"amphp/php-cs-fixer-config\": \"^2\",\n \"amphp/phpunit-util\": \"^3\",\n \"phpunit/phpunit\": \"^9\",\n \"psalm/phar\": \"^5.4\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Amp\\\\Cache\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Niklas Keller\",\n \"email\": \"me@kelunik.com\"\n },\n {\n \"name\": \"Aaron Piotrowski\",\n \"email\": \"aaron@trowski.com\"\n },\n {\n \"name\": \"Daniel Lowrey\",\n \"email\": \"rdlowrey@php.net\"\n }\n ],\n \"description\": \"A fiber-aware cache API based on Amp and Revolt.\",\n \"homepage\": \"https://amphp.org/cache\",\n \"support\": {\n \"issues\": \"https://github.com/amphp/cache/issues\",\n \"source\": \"https://github.com/amphp/cache/tree/v2.0.1\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/amphp\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2024-04-19T03:38:06+00:00\"\n },\n {\n \"name\": \"amphp/dns\",\n \"version\": \"v2.4.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/amphp/dns.git\",\n \"reference\": \"78eb3db5fc69bf2fc0cb503c4fcba667bc223c71\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/amphp/dns/zipball/78eb3db5fc69bf2fc0cb503c4fcba667bc223c71\",\n \"reference\": \"78eb3db5fc69bf2fc0cb503c4fcba667bc223c71\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"amphp/amp\": \"^3\",\n \"amphp/byte-stream\": \"^2\",\n \"amphp/cache\": \"^2\",\n \"amphp/parser\": \"^1\",\n \"amphp/process\": \"^2\",\n \"daverandom/libdns\": \"^2.0.2\",\n \"ext-filter\": \"*\",\n \"ext-json\": \"*\",\n \"php\": \">=8.1\",\n \"revolt/event-loop\": \"^1 || ^0.2\"\n },\n \"require-dev\": {\n \"amphp/php-cs-fixer-config\": \"^2\",\n \"amphp/phpunit-util\": \"^3\",\n \"phpunit/phpunit\": \"^9\",\n \"psalm/phar\": \"5.20\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"files\": [\n \"src/functions.php\"\n ],\n \"psr-4\": {\n \"Amp\\\\Dns\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Chris Wright\",\n \"email\": \"addr@daverandom.com\"\n },\n {\n \"name\": \"Daniel Lowrey\",\n \"email\": \"rdlowrey@php.net\"\n },\n {\n \"name\": \"Bob Weinand\",\n \"email\": \"bobwei9@hotmail.com\"\n },\n {\n \"name\": \"Niklas Keller\",\n \"email\": \"me@kelunik.com\"\n },\n {\n \"name\": \"Aaron Piotrowski\",\n \"email\": \"aaron@trowski.com\"\n }\n ],\n \"description\": \"Async DNS resolution for Amp.\",\n \"homepage\": \"https://github.com/amphp/dns\",\n \"keywords\": [\n \"amp\",\n \"amphp\",\n \"async\",\n \"client\",\n \"dns\",\n \"resolve\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/amphp/dns/issues\",\n \"source\": \"https://github.com/amphp/dns/tree/v2.4.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/amphp\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2025-01-19T15:43:40+00:00\"\n },\n {\n \"name\": \"amphp/parallel\",\n \"version\": \"v2.3.2\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/amphp/parallel.git\",\n \"reference\": \"321b45ae771d9c33a068186b24117e3cd1c48dce\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/amphp/parallel/zipball/321b45ae771d9c33a068186b24117e3cd1c48dce\",\n \"reference\": \"321b45ae771d9c33a068186b24117e3cd1c48dce\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"amphp/amp\": \"^3\",\n \"amphp/byte-stream\": \"^2\",\n \"amphp/cache\": \"^2\",\n \"amphp/parser\": \"^1\",\n \"amphp/pipeline\": \"^1\",\n \"amphp/process\": \"^2\",\n \"amphp/serialization\": \"^1\",\n \"amphp/socket\": \"^2\",\n \"amphp/sync\": \"^2\",\n \"php\": \">=8.1\",\n \"revolt/event-loop\": \"^1\"\n },\n \"require-dev\": {\n \"amphp/php-cs-fixer-config\": \"^2\",\n \"amphp/phpunit-util\": \"^3\",\n \"phpunit/phpunit\": \"^9\",\n \"psalm/phar\": \"^5.18\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"files\": [\n \"src/Context/functions.php\",\n \"src/Context/Internal/functions.php\",\n \"src/Ipc/functions.php\",\n \"src/Worker/functions.php\"\n ],\n \"psr-4\": {\n \"Amp\\\\Parallel\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Aaron Piotrowski\",\n \"email\": \"aaron@trowski.com\"\n },\n {\n \"name\": \"Niklas Keller\",\n \"email\": \"me@kelunik.com\"\n },\n {\n \"name\": \"Stephen Coakley\",\n \"email\": \"me@stephencoakley.com\"\n }\n ],\n \"description\": \"Parallel processing component for Amp.\",\n \"homepage\": \"https://github.com/amphp/parallel\",\n \"keywords\": [\n \"async\",\n \"asynchronous\",\n \"concurrent\",\n \"multi-processing\",\n \"multi-threading\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/amphp/parallel/issues\",\n \"source\": \"https://github.com/amphp/parallel/tree/v2.3.2\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/amphp\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2025-08-27T21:55:40+00:00\"\n },\n {\n \"name\": \"amphp/parser\",\n \"version\": \"v1.1.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/amphp/parser.git\",\n \"reference\": \"3cf1f8b32a0171d4b1bed93d25617637a77cded7\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/amphp/parser/zipball/3cf1f8b32a0171d4b1bed93d25617637a77cded7\",\n \"reference\": \"3cf1f8b32a0171d4b1bed93d25617637a77cded7\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=7.4\"\n },\n \"require-dev\": {\n \"amphp/php-cs-fixer-config\": \"^2\",\n \"phpunit/phpunit\": \"^9\",\n \"psalm/phar\": \"^5.4\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Amp\\\\Parser\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Aaron Piotrowski\",\n \"email\": \"aaron@trowski.com\"\n },\n {\n \"name\": \"Niklas Keller\",\n \"email\": \"me@kelunik.com\"\n }\n ],\n \"description\": \"A generator parser to make streaming parsers simple.\",\n \"homepage\": \"https://github.com/amphp/parser\",\n \"keywords\": [\n \"async\",\n \"non-blocking\",\n \"parser\",\n \"stream\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/amphp/parser/issues\",\n \"source\": \"https://github.com/amphp/parser/tree/v1.1.1\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/amphp\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2024-03-21T19:16:53+00:00\"\n },\n {\n \"name\": \"amphp/pipeline\",\n \"version\": \"v1.2.3\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/amphp/pipeline.git\",\n \"reference\": \"7b52598c2e9105ebcddf247fc523161581930367\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/amphp/pipeline/zipball/7b52598c2e9105ebcddf247fc523161581930367\",\n \"reference\": \"7b52598c2e9105ebcddf247fc523161581930367\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"amphp/amp\": \"^3\",\n \"php\": \">=8.1\",\n \"revolt/event-loop\": \"^1\"\n },\n \"require-dev\": {\n \"amphp/php-cs-fixer-config\": \"^2\",\n \"amphp/phpunit-util\": \"^3\",\n \"phpunit/phpunit\": \"^9\",\n \"psalm/phar\": \"^5.18\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Amp\\\\Pipeline\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Aaron Piotrowski\",\n \"email\": \"aaron@trowski.com\"\n },\n {\n \"name\": \"Niklas Keller\",\n \"email\": \"me@kelunik.com\"\n }\n ],\n \"description\": \"Asynchronous iterators and operators.\",\n \"homepage\": \"https://amphp.org/pipeline\",\n \"keywords\": [\n \"amp\",\n \"amphp\",\n \"async\",\n \"io\",\n \"iterator\",\n \"non-blocking\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/amphp/pipeline/issues\",\n \"source\": \"https://github.com/amphp/pipeline/tree/v1.2.3\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/amphp\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2025-03-16T16:33:53+00:00\"\n },\n {\n \"name\": \"amphp/process\",\n \"version\": \"v2.0.3\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/amphp/process.git\",\n \"reference\": \"52e08c09dec7511d5fbc1fb00d3e4e79fc77d58d\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/amphp/process/zipball/52e08c09dec7511d5fbc1fb00d3e4e79fc77d58d\",\n \"reference\": \"52e08c09dec7511d5fbc1fb00d3e4e79fc77d58d\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"amphp/amp\": \"^3\",\n \"amphp/byte-stream\": \"^2\",\n \"amphp/sync\": \"^2\",\n \"php\": \">=8.1\",\n \"revolt/event-loop\": \"^1 || ^0.2\"\n },\n \"require-dev\": {\n \"amphp/php-cs-fixer-config\": \"^2\",\n \"amphp/phpunit-util\": \"^3\",\n \"phpunit/phpunit\": \"^9\",\n \"psalm/phar\": \"^5.4\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"files\": [\n \"src/functions.php\"\n ],\n \"psr-4\": {\n \"Amp\\\\Process\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Bob Weinand\",\n \"email\": \"bobwei9@hotmail.com\"\n },\n {\n \"name\": \"Aaron Piotrowski\",\n \"email\": \"aaron@trowski.com\"\n },\n {\n \"name\": \"Niklas Keller\",\n \"email\": \"me@kelunik.com\"\n }\n ],\n \"description\": \"A fiber-aware process manager based on Amp and Revolt.\",\n \"homepage\": \"https://amphp.org/process\",\n \"support\": {\n \"issues\": \"https://github.com/amphp/process/issues\",\n \"source\": \"https://github.com/amphp/process/tree/v2.0.3\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/amphp\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2024-04-19T03:13:44+00:00\"\n },\n {\n \"name\": \"amphp/serialization\",\n \"version\": \"v1.0.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/amphp/serialization.git\",\n \"reference\": \"693e77b2fb0b266c3c7d622317f881de44ae94a1\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/amphp/serialization/zipball/693e77b2fb0b266c3c7d622317f881de44ae94a1\",\n \"reference\": \"693e77b2fb0b266c3c7d622317f881de44ae94a1\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=7.1\"\n },\n \"require-dev\": {\n \"amphp/php-cs-fixer-config\": \"dev-master\",\n \"phpunit/phpunit\": \"^9 || ^8 || ^7\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"files\": [\n \"src/functions.php\"\n ],\n \"psr-4\": {\n \"Amp\\\\Serialization\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Aaron Piotrowski\",\n \"email\": \"aaron@trowski.com\"\n },\n {\n \"name\": \"Niklas Keller\",\n \"email\": \"me@kelunik.com\"\n }\n ],\n \"description\": \"Serialization tools for IPC and data storage in PHP.\",\n \"homepage\": \"https://github.com/amphp/serialization\",\n \"keywords\": [\n \"async\",\n \"asynchronous\",\n \"serialization\",\n \"serialize\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/amphp/serialization/issues\",\n \"source\": \"https://github.com/amphp/serialization/tree/master\"\n },\n \"time\": \"2020-03-25T21:39:07+00:00\"\n },\n {\n \"name\": \"amphp/socket\",\n \"version\": \"v2.3.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/amphp/socket.git\",\n \"reference\": \"58e0422221825b79681b72c50c47a930be7bf1e1\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/amphp/socket/zipball/58e0422221825b79681b72c50c47a930be7bf1e1\",\n \"reference\": \"58e0422221825b79681b72c50c47a930be7bf1e1\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"amphp/amp\": \"^3\",\n \"amphp/byte-stream\": \"^2\",\n \"amphp/dns\": \"^2\",\n \"ext-openssl\": \"*\",\n \"kelunik/certificate\": \"^1.1\",\n \"league/uri\": \"^6.5 | ^7\",\n \"league/uri-interfaces\": \"^2.3 | ^7\",\n \"php\": \">=8.1\",\n \"revolt/event-loop\": \"^1 || ^0.2\"\n },\n \"require-dev\": {\n \"amphp/php-cs-fixer-config\": \"^2\",\n \"amphp/phpunit-util\": \"^3\",\n \"amphp/process\": \"^2\",\n \"phpunit/phpunit\": \"^9\",\n \"psalm/phar\": \"5.20\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"files\": [\n \"src/functions.php\",\n \"src/Internal/functions.php\",\n \"src/SocketAddress/functions.php\"\n ],\n \"psr-4\": {\n \"Amp\\\\Socket\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Daniel Lowrey\",\n \"email\": \"rdlowrey@gmail.com\"\n },\n {\n \"name\": \"Aaron Piotrowski\",\n \"email\": \"aaron@trowski.com\"\n },\n {\n \"name\": \"Niklas Keller\",\n \"email\": \"me@kelunik.com\"\n }\n ],\n \"description\": \"Non-blocking socket connection / server implementations based on Amp and Revolt.\",\n \"homepage\": \"https://github.com/amphp/socket\",\n \"keywords\": [\n \"amp\",\n \"async\",\n \"encryption\",\n \"non-blocking\",\n \"sockets\",\n \"tcp\",\n \"tls\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/amphp/socket/issues\",\n \"source\": \"https://github.com/amphp/socket/tree/v2.3.1\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/amphp\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2024-04-21T14:33:03+00:00\"\n },\n {\n \"name\": \"amphp/sync\",\n \"version\": \"v2.3.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/amphp/sync.git\",\n \"reference\": \"217097b785130d77cfcc58ff583cf26cd1770bf1\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/amphp/sync/zipball/217097b785130d77cfcc58ff583cf26cd1770bf1\",\n \"reference\": \"217097b785130d77cfcc58ff583cf26cd1770bf1\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"amphp/amp\": \"^3\",\n \"amphp/pipeline\": \"^1\",\n \"amphp/serialization\": \"^1\",\n \"php\": \">=8.1\",\n \"revolt/event-loop\": \"^1 || ^0.2\"\n },\n \"require-dev\": {\n \"amphp/php-cs-fixer-config\": \"^2\",\n \"amphp/phpunit-util\": \"^3\",\n \"phpunit/phpunit\": \"^9\",\n \"psalm/phar\": \"5.23\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"files\": [\n \"src/functions.php\"\n ],\n \"psr-4\": {\n \"Amp\\\\Sync\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Aaron Piotrowski\",\n \"email\": \"aaron@trowski.com\"\n },\n {\n \"name\": \"Niklas Keller\",\n \"email\": \"me@kelunik.com\"\n },\n {\n \"name\": \"Stephen Coakley\",\n \"email\": \"me@stephencoakley.com\"\n }\n ],\n \"description\": \"Non-blocking synchronization primitives for PHP based on Amp and Revolt.\",\n \"homepage\": \"https://github.com/amphp/sync\",\n \"keywords\": [\n \"async\",\n \"asynchronous\",\n \"mutex\",\n \"semaphore\",\n \"synchronization\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/amphp/sync/issues\",\n \"source\": \"https://github.com/amphp/sync/tree/v2.3.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/amphp\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2024-08-03T19:31:26+00:00\"\n },\n {\n \"name\": \"barryvdh/laravel-debugbar\",\n \"version\": \"v3.16.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/barryvdh/laravel-debugbar.git\",\n \"reference\": \"f265cf5e38577d42311f1a90d619bcd3740bea23\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/barryvdh/laravel-debugbar/zipball/f265cf5e38577d42311f1a90d619bcd3740bea23\",\n \"reference\": \"f265cf5e38577d42311f1a90d619bcd3740bea23\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"illuminate/routing\": \"^9|^10|^11|^12\",\n \"illuminate/session\": \"^9|^10|^11|^12\",\n \"illuminate/support\": \"^9|^10|^11|^12\",\n \"php\": \"^8.1\",\n \"php-debugbar/php-debugbar\": \"~2.2.0\",\n \"symfony/finder\": \"^6|^7\"\n },\n \"require-dev\": {\n \"mockery/mockery\": \"^1.3.3\",\n \"orchestra/testbench-dusk\": \"^7|^8|^9|^10\",\n \"phpunit/phpunit\": \"^9.5.10|^10|^11\",\n \"squizlabs/php_codesniffer\": \"^3.5\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"laravel\": {\n \"aliases\": {\n \"Debugbar\": \"Barryvdh\\\\Debugbar\\\\Facades\\\\Debugbar\"\n },\n \"providers\": [\n \"Barryvdh\\\\Debugbar\\\\ServiceProvider\"\n ]\n },\n \"branch-alias\": {\n \"dev-master\": \"3.16-dev\"\n }\n },\n \"autoload\": {\n \"files\": [\n \"src/helpers.php\"\n ],\n \"psr-4\": {\n \"Barryvdh\\\\Debugbar\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Barry vd. Heuvel\",\n \"email\": \"barryvdh@gmail.com\"\n }\n ],\n \"description\": \"PHP Debugbar integration for Laravel\",\n \"keywords\": [\n \"debug\",\n \"debugbar\",\n \"dev\",\n \"laravel\",\n \"profiler\",\n \"webprofiler\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/barryvdh/laravel-debugbar/issues\",\n \"source\": \"https://github.com/barryvdh/laravel-debugbar/tree/v3.16.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://fruitcake.nl\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/barryvdh\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2025-07-14T11:56:43+00:00\"\n },\n {\n \"name\": \"barryvdh/laravel-ide-helper\",\n \"version\": \"v3.6.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/barryvdh/laravel-ide-helper.git\",\n \"reference\": \"8d00250cba25728373e92c1d8dcebcbf64623d29\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/barryvdh/laravel-ide-helper/zipball/8d00250cba25728373e92c1d8dcebcbf64623d29\",\n \"reference\": \"8d00250cba25728373e92c1d8dcebcbf64623d29\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"barryvdh/reflection-docblock\": \"^2.4\",\n \"composer/class-map-generator\": \"^1.0\",\n \"ext-json\": \"*\",\n \"illuminate/console\": \"^11.15 || ^12\",\n \"illuminate/database\": \"^11.15 || ^12\",\n \"illuminate/filesystem\": \"^11.15 || ^12\",\n \"illuminate/support\": \"^11.15 || ^12\",\n \"php\": \"^8.2\"\n },\n \"require-dev\": {\n \"ext-pdo_sqlite\": \"*\",\n \"friendsofphp/php-cs-fixer\": \"^3\",\n \"illuminate/config\": \"^11.15 || ^12\",\n \"illuminate/view\": \"^11.15 || ^12\",\n \"mockery/mockery\": \"^1.4\",\n \"orchestra/testbench\": \"^9.2 || ^10\",\n \"phpunit/phpunit\": \"^10.5 || ^11.5.3\",\n \"spatie/phpunit-snapshot-assertions\": \"^4 || ^5\",\n \"vimeo/psalm\": \"^5.4\",\n \"vlucas/phpdotenv\": \"^5\"\n },\n \"suggest\": {\n \"illuminate/events\": \"Required for automatic helper generation (^6|^7|^8|^9|^10|^11).\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"laravel\": {\n \"providers\": [\n \"Barryvdh\\\\LaravelIdeHelper\\\\IdeHelperServiceProvider\"\n ]\n },\n \"branch-alias\": {\n \"dev-master\": \"3.5-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Barryvdh\\\\LaravelIdeHelper\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Barry vd. Heuvel\",\n \"email\": \"barryvdh@gmail.com\"\n }\n ],\n \"description\": \"Laravel IDE Helper, generates correct PHPDocs for all Facade classes, to improve auto-completion.\",\n \"keywords\": [\n \"autocomplete\",\n \"codeintel\",\n \"dev\",\n \"helper\",\n \"ide\",\n \"laravel\",\n \"netbeans\",\n \"phpdoc\",\n \"phpstorm\",\n \"sublime\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/barryvdh/laravel-ide-helper/issues\",\n \"source\": \"https://github.com/barryvdh/laravel-ide-helper/tree/v3.6.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://fruitcake.nl\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/barryvdh\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2025-07-17T20:11:57+00:00\"\n },\n {\n \"name\": \"barryvdh/reflection-docblock\",\n \"version\": \"v2.4.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/barryvdh/ReflectionDocBlock.git\",\n \"reference\": \"d103774cbe7e94ddee7e4870f97f727b43fe7201\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/barryvdh/ReflectionDocBlock/zipball/d103774cbe7e94ddee7e4870f97f727b43fe7201\",\n \"reference\": \"d103774cbe7e94ddee7e4870f97f727b43fe7201\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=7.1\"\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \"^8.5.14|^9\"\n },\n \"suggest\": {\n \"dflydev/markdown\": \"~1.0\",\n \"erusev/parsedown\": \"~1.0\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"2.3.x-dev\"\n }\n },\n \"autoload\": {\n \"psr-0\": {\n \"Barryvdh\": [\n \"src/\"\n ]\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Mike van Riel\",\n \"email\": \"mike.vanriel@naenius.com\"\n }\n ],\n \"support\": {\n \"source\": \"https://github.com/barryvdh/ReflectionDocBlock/tree/v2.4.0\"\n },\n \"time\": \"2025-07-17T06:07:30+00:00\"\n },\n {\n \"name\": \"brianium/paratest\",\n \"version\": \"v7.8.4\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/paratestphp/paratest.git\",\n \"reference\": \"130a9bf0e269ee5f5b320108f794ad03e275cad4\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/paratestphp/paratest/zipball/130a9bf0e269ee5f5b320108f794ad03e275cad4\",\n \"reference\": \"130a9bf0e269ee5f5b320108f794ad03e275cad4\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"ext-dom\": \"*\",\n \"ext-pcre\": \"*\",\n \"ext-reflection\": \"*\",\n \"ext-simplexml\": \"*\",\n \"fidry/cpu-core-counter\": \"^1.2.0\",\n \"jean85/pretty-package-versions\": \"^2.1.1\",\n \"php\": \"~8.2.0 || ~8.3.0 || ~8.4.0\",\n \"phpunit/php-code-coverage\": \"^11.0.10\",\n \"phpunit/php-file-iterator\": \"^5.1.0\",\n \"phpunit/php-timer\": \"^7.0.1\",\n \"phpunit/phpunit\": \"^11.5.24\",\n \"sebastian/environment\": \"^7.2.1\",\n \"symfony/console\": \"^6.4.22 || ^7.3.0\",\n \"symfony/process\": \"^6.4.20 || ^7.3.0\"\n },\n \"require-dev\": {\n \"doctrine/coding-standard\": \"^12.0.0\",\n \"ext-pcov\": \"*\",\n \"ext-posix\": \"*\",\n \"phpstan/phpstan\": \"^2.1.17\",\n \"phpstan/phpstan-deprecation-rules\": \"^2.0.3\",\n \"phpstan/phpstan-phpunit\": \"^2.0.6\",\n \"phpstan/phpstan-strict-rules\": \"^2.0.4\",\n \"squizlabs/php_codesniffer\": \"^3.13.2\",\n \"symfony/filesystem\": \"^6.4.13 || ^7.3.0\"\n },\n \"bin\": [\n \"bin/paratest\",\n \"bin/paratest_for_phpstorm\"\n ],\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"ParaTest\\\\\": [\n \"src/\"\n ]\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Brian Scaturro\",\n \"email\": \"scaturrob@gmail.com\",\n \"role\": \"Developer\"\n },\n {\n \"name\": \"Filippo Tessarotto\",\n \"email\": \"zoeslam@gmail.com\",\n \"role\": \"Developer\"\n }\n ],\n \"description\": \"Parallel testing for PHP\",\n \"homepage\": \"https://github.com/paratestphp/paratest\",\n \"keywords\": [\n \"concurrent\",\n \"parallel\",\n \"phpunit\",\n \"testing\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/paratestphp/paratest/issues\",\n \"source\": \"https://github.com/paratestphp/paratest/tree/v7.8.4\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/sponsors/Slamdunk\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://paypal.me/filippotessarotto\",\n \"type\": \"paypal\"\n }\n ],\n \"time\": \"2025-06-23T06:07:21+00:00\"\n },\n {\n \"name\": \"browserstack/browserstack-local\",\n \"version\": \"v1.1.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/browserstack/browserstack-local-php.git\",\n \"reference\": \"491c6e31960ce8111d2cb70cb84d03e73f270dbb\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/browserstack/browserstack-local-php/zipball/491c6e31960ce8111d2cb70cb84d03e73f270dbb\",\n \"reference\": \"491c6e31960ce8111d2cb70cb84d03e73f270dbb\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=5.3.19\"\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \"4.6.*\"\n },\n \"suggest\": {\n \"phpdocumentor/phpdocumentor\": \"2.*\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"BrowserStack\\\\\": \"lib/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"description\": \"PHP bindings for BrowserStack Local\",\n \"homepage\": \"https://github.com/browserstack/browserstack-local-php\",\n \"keywords\": [\n \"BrowserStack\",\n \"browserstacklocal\",\n \"local\",\n \"php\",\n \"selenium\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/browserstack/browserstack-local-php/issues\",\n \"source\": \"https://github.com/browserstack/browserstack-local-php\"\n },\n \"time\": \"2016-09-19T13:39:06+00:00\"\n },\n {\n \"name\": \"clue/ndjson-react\",\n \"version\": \"v1.3.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/clue/reactphp-ndjson.git\",\n \"reference\": \"392dc165fce93b5bb5c637b67e59619223c931b0\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/clue/reactphp-ndjson/zipball/392dc165fce93b5bb5c637b67e59619223c931b0\",\n \"reference\": \"392dc165fce93b5bb5c637b67e59619223c931b0\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=5.3\",\n \"react/stream\": \"^1.2\"\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \"^9.5 || ^5.7 || ^4.8.35\",\n \"react/event-loop\": \"^1.2\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Clue\\\\React\\\\NDJson\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Christian Lück\",\n \"email\": \"christian@clue.engineering\"\n }\n ],\n \"description\": \"Streaming newline-delimited JSON (NDJSON) parser and encoder for ReactPHP.\",\n \"homepage\": \"https://github.com/clue/reactphp-ndjson\",\n \"keywords\": [\n \"NDJSON\",\n \"json\",\n \"jsonlines\",\n \"newline\",\n \"reactphp\",\n \"streaming\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/clue/reactphp-ndjson/issues\",\n \"source\": \"https://github.com/clue/reactphp-ndjson/tree/v1.3.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://clue.engineering/support\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/clue\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2022-12-23T10:58:28+00:00\"\n },\n {\n \"name\": \"colinodell/json5\",\n \"version\": \"v3.0.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/colinodell/json5.git\",\n \"reference\": \"5724d21bc5c910c2560af1b8915f0cc0163579c8\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/colinodell/json5/zipball/5724d21bc5c910c2560af1b8915f0cc0163579c8\",\n \"reference\": \"5724d21bc5c910c2560af1b8915f0cc0163579c8\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"ext-json\": \"*\",\n \"ext-mbstring\": \"*\",\n \"php\": \"^8.0\"\n },\n \"require-dev\": {\n \"mikehaertl/php-shellcommand\": \"^1.7.0\",\n \"phpstan/phpstan\": \"^1.10.57\",\n \"scrutinizer/ocular\": \"^1.9\",\n \"squizlabs/php_codesniffer\": \"^3.8.1\",\n \"symfony/finder\": \"^6.0|^7.0\",\n \"symfony/phpunit-bridge\": \"^7.0.3\"\n },\n \"bin\": [\n \"bin/json5\"\n ],\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-main\": \"4.0-dev\"\n }\n },\n \"autoload\": {\n \"files\": [\n \"src/global.php\"\n ],\n \"psr-4\": {\n \"ColinODell\\\\Json5\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Colin O'Dell\",\n \"email\": \"colinodell@gmail.com\",\n \"homepage\": \"https://www.colinodell.com\",\n \"role\": \"Developer\"\n }\n ],\n \"description\": \"UTF-8 compatible JSON5 parser for PHP\",\n \"homepage\": \"https://github.com/colinodell/json5\",\n \"keywords\": [\n \"JSON5\",\n \"json\",\n \"json5_decode\",\n \"json_decode\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/colinodell/json5/issues\",\n \"source\": \"https://github.com/colinodell/json5/tree/v3.0.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://www.colinodell.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://www.paypal.me/colinpodell/10.00\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/colinodell\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://www.patreon.com/colinodell\",\n \"type\": \"patreon\"\n }\n ],\n \"time\": \"2024-02-09T13:06:12+00:00\"\n },\n {\n \"name\": \"composer/class-map-generator\",\n \"version\": \"1.6.2\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/composer/class-map-generator.git\",\n \"reference\": \"ba9f089655d4cdd64e762a6044f411ccdaec0076\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/composer/class-map-generator/zipball/ba9f089655d4cdd64e762a6044f411ccdaec0076\",\n \"reference\": \"ba9f089655d4cdd64e762a6044f411ccdaec0076\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"composer/pcre\": \"^2.1 || ^3.1\",\n \"php\": \"^7.2 || ^8.0\",\n \"symfony/finder\": \"^4.4 || ^5.3 || ^6 || ^7\"\n },\n \"require-dev\": {\n \"phpstan/phpstan\": \"^1.12 || ^2\",\n \"phpstan/phpstan-deprecation-rules\": \"^1 || ^2\",\n \"phpstan/phpstan-phpunit\": \"^1 || ^2\",\n \"phpstan/phpstan-strict-rules\": \"^1.1 || ^2\",\n \"phpunit/phpunit\": \"^8\",\n \"symfony/filesystem\": \"^5.4 || ^6\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-main\": \"1.x-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Composer\\\\ClassMapGenerator\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Jordi Boggiano\",\n \"email\": \"j.boggiano@seld.be\",\n \"homepage\": \"https://seld.be\"\n }\n ],\n \"description\": \"Utilities to scan PHP code and generate class maps.\",\n \"keywords\": [\n \"classmap\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/composer/class-map-generator/issues\",\n \"source\": \"https://github.com/composer/class-map-generator/tree/1.6.2\"\n },\n \"funding\": [\n {\n \"url\": \"https://packagist.com\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/composer\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2025-08-20T18:52:43+00:00\"\n },\n {\n \"name\": \"composer/pcre\",\n \"version\": \"3.3.2\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/composer/pcre.git\",\n \"reference\": \"b2bed4734f0cc156ee1fe9c0da2550420d99a21e\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/composer/pcre/zipball/b2bed4734f0cc156ee1fe9c0da2550420d99a21e\",\n \"reference\": \"b2bed4734f0cc156ee1fe9c0da2550420d99a21e\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \"^7.4 || ^8.0\"\n },\n \"conflict\": {\n \"phpstan/phpstan\": \"<1.11.10\"\n },\n \"require-dev\": {\n \"phpstan/phpstan\": \"^1.12 || ^2\",\n \"phpstan/phpstan-strict-rules\": \"^1 || ^2\",\n \"phpunit/phpunit\": \"^8 || ^9\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"phpstan\": {\n \"includes\": [\n \"extension.neon\"\n ]\n },\n \"branch-alias\": {\n \"dev-main\": \"3.x-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Composer\\\\Pcre\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Jordi Boggiano\",\n \"email\": \"j.boggiano@seld.be\",\n \"homepage\": \"http://seld.be\"\n }\n ],\n \"description\": \"PCRE wrapping library that offers type-safe preg_* replacements.\",\n \"keywords\": [\n \"PCRE\",\n \"preg\",\n \"regex\",\n \"regular expression\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/composer/pcre/issues\",\n \"source\": \"https://github.com/composer/pcre/tree/3.3.2\"\n },\n \"funding\": [\n {\n \"url\": \"https://packagist.com\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/composer\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/composer/composer\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2024-11-12T16:29:46+00:00\"\n },\n {\n \"name\": \"composer/xdebug-handler\",\n \"version\": \"3.0.5\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/composer/xdebug-handler.git\",\n \"reference\": \"6c1925561632e83d60a44492e0b344cf48ab85ef\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/composer/xdebug-handler/zipball/6c1925561632e83d60a44492e0b344cf48ab85ef\",\n \"reference\": \"6c1925561632e83d60a44492e0b344cf48ab85ef\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"composer/pcre\": \"^1 || ^2 || ^3\",\n \"php\": \"^7.2.5 || ^8.0\",\n \"psr/log\": \"^1 || ^2 || ^3\"\n },\n \"require-dev\": {\n \"phpstan/phpstan\": \"^1.0\",\n \"phpstan/phpstan-strict-rules\": \"^1.1\",\n \"phpunit/phpunit\": \"^8.5 || ^9.6 || ^10.5\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Composer\\\\XdebugHandler\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"John Stevenson\",\n \"email\": \"john-stevenson@blueyonder.co.uk\"\n }\n ],\n \"description\": \"Restarts a process without Xdebug.\",\n \"keywords\": [\n \"Xdebug\",\n \"performance\"\n ],\n \"support\": {\n \"irc\": \"ircs://irc.libera.chat:6697/composer\",\n \"issues\": \"https://github.com/composer/xdebug-handler/issues\",\n \"source\": \"https://github.com/composer/xdebug-handler/tree/3.0.5\"\n },\n \"funding\": [\n {\n \"url\": \"https://packagist.com\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/composer\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/composer/composer\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2024-05-06T16:37:16+00:00\"\n },\n {\n \"name\": \"daverandom/libdns\",\n \"version\": \"v2.1.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/DaveRandom/LibDNS.git\",\n \"reference\": \"b84c94e8fe6b7ee4aecfe121bfe3b6177d303c8a\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/DaveRandom/LibDNS/zipball/b84c94e8fe6b7ee4aecfe121bfe3b6177d303c8a\",\n \"reference\": \"b84c94e8fe6b7ee4aecfe121bfe3b6177d303c8a\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"ext-ctype\": \"*\",\n \"php\": \">=7.1\"\n },\n \"suggest\": {\n \"ext-intl\": \"Required for IDN support\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"files\": [\n \"src/functions.php\"\n ],\n \"psr-4\": {\n \"LibDNS\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"description\": \"DNS protocol implementation written in pure PHP\",\n \"keywords\": [\n \"dns\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/DaveRandom/LibDNS/issues\",\n \"source\": \"https://github.com/DaveRandom/LibDNS/tree/v2.1.0\"\n },\n \"time\": \"2024-04-12T12:12:48+00:00\"\n },\n {\n \"name\": \"dnoegel/php-xdg-base-dir\",\n \"version\": \"v0.1.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/dnoegel/php-xdg-base-dir.git\",\n \"reference\": \"8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/dnoegel/php-xdg-base-dir/zipball/8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd\",\n \"reference\": \"8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=5.3.2\"\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \"~7.0|~6.0|~5.0|~4.8.35\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"XdgBaseDir\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"description\": \"implementation of xdg base directory specification for php\",\n \"support\": {\n \"issues\": \"https://github.com/dnoegel/php-xdg-base-dir/issues\",\n \"source\": \"https://github.com/dnoegel/php-xdg-base-dir/tree/v0.1.1\"\n },\n \"time\": \"2019-12-04T15:06:13+00:00\"\n },\n {\n \"name\": \"felixfbecker/advanced-json-rpc\",\n \"version\": \"v3.2.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/felixfbecker/php-advanced-json-rpc.git\",\n \"reference\": \"b5f37dbff9a8ad360ca341f3240dc1c168b45447\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/felixfbecker/php-advanced-json-rpc/zipball/b5f37dbff9a8ad360ca341f3240dc1c168b45447\",\n \"reference\": \"b5f37dbff9a8ad360ca341f3240dc1c168b45447\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"netresearch/jsonmapper\": \"^1.0 || ^2.0 || ^3.0 || ^4.0\",\n \"php\": \"^7.1 || ^8.0\",\n \"phpdocumentor/reflection-docblock\": \"^4.3.4 || ^5.0.0\"\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \"^7.0 || ^8.0\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"AdvancedJsonRpc\\\\\": \"lib/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"ISC\"\n ],\n \"authors\": [\n {\n \"name\": \"Felix Becker\",\n \"email\": \"felix.b@outlook.com\"\n }\n ],\n \"description\": \"A more advanced JSONRPC implementation\",\n \"support\": {\n \"issues\": \"https://github.com/felixfbecker/php-advanced-json-rpc/issues\",\n \"source\": \"https://github.com/felixfbecker/php-advanced-json-rpc/tree/v3.2.1\"\n },\n \"time\": \"2021-06-11T22:34:44+00:00\"\n },\n {\n \"name\": \"felixfbecker/language-server-protocol\",\n \"version\": \"v1.5.3\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/felixfbecker/php-language-server-protocol.git\",\n \"reference\": \"a9e113dbc7d849e35b8776da39edaf4313b7b6c9\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/felixfbecker/php-language-server-protocol/zipball/a9e113dbc7d849e35b8776da39edaf4313b7b6c9\",\n \"reference\": \"a9e113dbc7d849e35b8776da39edaf4313b7b6c9\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=7.1\"\n },\n \"require-dev\": {\n \"phpstan/phpstan\": \"*\",\n \"squizlabs/php_codesniffer\": \"^3.1\",\n \"vimeo/psalm\": \"^4.0\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"1.x-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"LanguageServerProtocol\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"ISC\"\n ],\n \"authors\": [\n {\n \"name\": \"Felix Becker\",\n \"email\": \"felix.b@outlook.com\"\n }\n ],\n \"description\": \"PHP classes for the Language Server Protocol\",\n \"keywords\": [\n \"language\",\n \"microsoft\",\n \"php\",\n \"server\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/felixfbecker/php-language-server-protocol/issues\",\n \"source\": \"https://github.com/felixfbecker/php-language-server-protocol/tree/v1.5.3\"\n },\n \"time\": \"2024-04-30T00:40:11+00:00\"\n },\n {\n \"name\": \"fidry/cpu-core-counter\",\n \"version\": \"1.3.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/theofidry/cpu-core-counter.git\",\n \"reference\": \"db9508f7b1474469d9d3c53b86f817e344732678\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/theofidry/cpu-core-counter/zipball/db9508f7b1474469d9d3c53b86f817e344732678\",\n \"reference\": \"db9508f7b1474469d9d3c53b86f817e344732678\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \"^7.2 || ^8.0\"\n },\n \"require-dev\": {\n \"fidry/makefile\": \"^0.2.0\",\n \"fidry/php-cs-fixer-config\": \"^1.1.2\",\n \"phpstan/extension-installer\": \"^1.2.0\",\n \"phpstan/phpstan\": \"^2.0\",\n \"phpstan/phpstan-deprecation-rules\": \"^2.0.0\",\n \"phpstan/phpstan-phpunit\": \"^2.0\",\n \"phpstan/phpstan-strict-rules\": \"^2.0\",\n \"phpunit/phpunit\": \"^8.5.31 || ^9.5.26\",\n \"webmozarts/strict-phpunit\": \"^7.5\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Fidry\\\\CpuCoreCounter\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Théo FIDRY\",\n \"email\": \"theo.fidry@gmail.com\"\n }\n ],\n \"description\": \"Tiny utility to get the number of CPU cores.\",\n \"keywords\": [\n \"CPU\",\n \"core\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/theofidry/cpu-core-counter/issues\",\n \"source\": \"https://github.com/theofidry/cpu-core-counter/tree/1.3.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/theofidry\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2025-08-14T07:29:31+00:00\"\n },\n {\n \"name\": \"filp/whoops\",\n \"version\": \"2.18.4\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/filp/whoops.git\",\n \"reference\": \"d2102955e48b9fd9ab24280a7ad12ed552752c4d\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/filp/whoops/zipball/d2102955e48b9fd9ab24280a7ad12ed552752c4d\",\n \"reference\": \"d2102955e48b9fd9ab24280a7ad12ed552752c4d\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \"^7.1 || ^8.0\",\n \"psr/log\": \"^1.0.1 || ^2.0 || ^3.0\"\n },\n \"require-dev\": {\n \"mockery/mockery\": \"^1.0\",\n \"phpunit/phpunit\": \"^7.5.20 || ^8.5.8 || ^9.3.3\",\n \"symfony/var-dumper\": \"^4.0 || ^5.0\"\n },\n \"suggest\": {\n \"symfony/var-dumper\": \"Pretty print complex values better with var-dumper available\",\n \"whoops/soap\": \"Formats errors as SOAP responses\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"2.7-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Whoops\\\\\": \"src/Whoops/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Filipe Dobreira\",\n \"homepage\": \"https://github.com/filp\",\n \"role\": \"Developer\"\n }\n ],\n \"description\": \"php error handling for cool kids\",\n \"homepage\": \"https://filp.github.io/whoops/\",\n \"keywords\": [\n \"error\",\n \"exception\",\n \"handling\",\n \"library\",\n \"throwable\",\n \"whoops\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/filp/whoops/issues\",\n \"source\": \"https://github.com/filp/whoops/tree/2.18.4\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/denis-sokolov\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2025-08-08T12:00:00+00:00\"\n },\n {\n \"name\": \"friendsofphp/php-cs-fixer\",\n \"version\": \"v3.87.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git\",\n \"reference\": \"2f5170365e2a422d0c5421f9c8818b2c078105f6\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/2f5170365e2a422d0c5421f9c8818b2c078105f6\",\n \"reference\": \"2f5170365e2a422d0c5421f9c8818b2c078105f6\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"clue/ndjson-react\": \"^1.3\",\n \"composer/semver\": \"^3.4\",\n \"composer/xdebug-handler\": \"^3.0.5\",\n \"ext-filter\": \"*\",\n \"ext-hash\": \"*\",\n \"ext-json\": \"*\",\n \"ext-tokenizer\": \"*\",\n \"fidry/cpu-core-counter\": \"^1.3\",\n \"php\": \"^7.4 || ^8.0\",\n \"react/child-process\": \"^0.6.6\",\n \"react/event-loop\": \"^1.5\",\n \"react/promise\": \"^3.3\",\n \"react/socket\": \"^1.16\",\n \"react/stream\": \"^1.4\",\n \"sebastian/diff\": \"^4.0.6 || ^5.1.1 || ^6.0.2 || ^7.0\",\n \"symfony/console\": \"^5.4.47 || ^6.4.24 || ^7.0\",\n \"symfony/event-dispatcher\": \"^5.4.45 || ^6.4.24 || ^7.0\",\n \"symfony/filesystem\": \"^5.4.45 || ^6.4.24 || ^7.0\",\n \"symfony/finder\": \"^5.4.45 || ^6.4.24 || ^7.0\",\n \"symfony/options-resolver\": \"^5.4.45 || ^6.4.24 || ^7.0\",\n \"symfony/polyfill-mbstring\": \"^1.33\",\n \"symfony/polyfill-php80\": \"^1.33\",\n \"symfony/polyfill-php81\": \"^1.33\",\n \"symfony/process\": \"^5.4.47 || ^6.4.24 || ^7.2\",\n \"symfony/stopwatch\": \"^5.4.45 || ^6.4.24 || ^7.0\"\n },\n \"require-dev\": {\n \"facile-it/paraunit\": \"^1.3.1 || ^2.7\",\n \"infection/infection\": \"^0.29.14\",\n \"justinrainbow/json-schema\": \"^6.5\",\n \"keradus/cli-executor\": \"^2.2\",\n \"mikey179/vfsstream\": \"^1.6.12\",\n \"php-coveralls/php-coveralls\": \"^2.8\",\n \"php-cs-fixer/phpunit-constraint-isidenticalstring\": \"^1.6\",\n \"php-cs-fixer/phpunit-constraint-xmlmatchesxsd\": \"^1.6\",\n \"phpunit/phpunit\": \"^9.6.25 || ^10.5.53 || ^11.5.34\",\n \"symfony/polyfill-php84\": \"^1.33\",\n \"symfony/var-dumper\": \"^5.4.48 || ^6.4.24 || ^7.3.2\",\n \"symfony/yaml\": \"^5.4.45 || ^6.4.24 || ^7.3.2\"\n },\n \"suggest\": {\n \"ext-dom\": \"For handling output formats in XML\",\n \"ext-mbstring\": \"For handling non-UTF8 characters.\"\n },\n \"bin\": [\n \"php-cs-fixer\"\n ],\n \"type\": \"application\",\n \"autoload\": {\n \"psr-4\": {\n \"PhpCsFixer\\\\\": \"src/\"\n },\n \"exclude-from-classmap\": [\n \"src/Fixer/Internal/*\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Fabien Potencier\",\n \"email\": \"fabien@symfony.com\"\n },\n {\n \"name\": \"Dariusz Rumiński\",\n \"email\": \"dariusz.ruminski@gmail.com\"\n }\n ],\n \"description\": \"A tool to automatically fix PHP code style\",\n \"keywords\": [\n \"Static code analysis\",\n \"fixer\",\n \"standards\",\n \"static analysis\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/issues\",\n \"source\": \"https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.87.1\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/keradus\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2025-09-02T15:27:36+00:00\"\n },\n {\n \"name\": \"hamcrest/hamcrest-php\",\n \"version\": \"v2.1.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/hamcrest/hamcrest-php.git\",\n \"reference\": \"f8b1c0173b22fa6ec77a81fe63e5b01eba7e6487\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/hamcrest/hamcrest-php/zipball/f8b1c0173b22fa6ec77a81fe63e5b01eba7e6487\",\n \"reference\": \"f8b1c0173b22fa6ec77a81fe63e5b01eba7e6487\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \"^7.4|^8.0\"\n },\n \"replace\": {\n \"cordoval/hamcrest-php\": \"*\",\n \"davedevelopment/hamcrest-php\": \"*\",\n \"kodova/hamcrest-php\": \"*\"\n },\n \"require-dev\": {\n \"phpunit/php-file-iterator\": \"^1.4 || ^2.0 || ^3.0\",\n \"phpunit/phpunit\": \"^4.8.36 || ^5.7 || ^6.5 || ^7.0 || ^8.0 || ^9.0\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"2.1-dev\"\n }\n },\n \"autoload\": {\n \"classmap\": [\n \"hamcrest\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"BSD-3-Clause\"\n ],\n \"description\": \"This is the PHP port of Hamcrest Matchers\",\n \"keywords\": [\n \"test\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/hamcrest/hamcrest-php/issues\",\n \"source\": \"https://github.com/hamcrest/hamcrest-php/tree/v2.1.1\"\n },\n \"time\": \"2025-04-30T06:54:44+00:00\"\n },\n {\n \"name\": \"iamcal/sql-parser\",\n \"version\": \"v0.6\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/iamcal/SQLParser.git\",\n \"reference\": \"947083e2dca211a6f12fb1beb67a01e387de9b62\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/iamcal/SQLParser/zipball/947083e2dca211a6f12fb1beb67a01e387de9b62\",\n \"reference\": \"947083e2dca211a6f12fb1beb67a01e387de9b62\",\n \"shasum\": \"\"\n },\n \"require-dev\": {\n \"php-coveralls/php-coveralls\": \"^1.0\",\n \"phpunit/phpunit\": \"^5|^6|^7|^8|^9\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"iamcal\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Cal Henderson\",\n \"email\": \"cal@iamcal.com\"\n }\n ],\n \"description\": \"MySQL schema parser\",\n \"support\": {\n \"issues\": \"https://github.com/iamcal/SQLParser/issues\",\n \"source\": \"https://github.com/iamcal/SQLParser/tree/v0.6\"\n },\n \"time\": \"2025-03-17T16:59:46+00:00\"\n },\n {\n \"name\": \"infection/abstract-testframework-adapter\",\n \"version\": \"0.5.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/infection/abstract-testframework-adapter.git\",\n \"reference\": \"18925e20d15d1a5995bb85c9dc09e8751e1e069b\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/infection/abstract-testframework-adapter/zipball/18925e20d15d1a5995bb85c9dc09e8751e1e069b\",\n \"reference\": \"18925e20d15d1a5995bb85c9dc09e8751e1e069b\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \"^7.4 || ^8.0\"\n },\n \"require-dev\": {\n \"ergebnis/composer-normalize\": \"^2.8\",\n \"friendsofphp/php-cs-fixer\": \"^2.17\",\n \"phpunit/phpunit\": \"^9.5\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Infection\\\\AbstractTestFramework\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"BSD-3-Clause\"\n ],\n \"authors\": [\n {\n \"name\": \"Maks Rafalko\",\n \"email\": \"maks.rafalko@gmail.com\"\n }\n ],\n \"description\": \"Abstract Test Framework Adapter for Infection\",\n \"support\": {\n \"issues\": \"https://github.com/infection/abstract-testframework-adapter/issues\",\n \"source\": \"https://github.com/infection/abstract-testframework-adapter/tree/0.5.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/infection\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://opencollective.com/infection\",\n \"type\": \"open_collective\"\n }\n ],\n \"time\": \"2021-08-17T18:49:12+00:00\"\n },\n {\n \"name\": \"infection/extension-installer\",\n \"version\": \"0.1.2\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/infection/extension-installer.git\",\n \"reference\": \"9b351d2910b9a23ab4815542e93d541e0ca0cdcf\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/infection/extension-installer/zipball/9b351d2910b9a23ab4815542e93d541e0ca0cdcf\",\n \"reference\": \"9b351d2910b9a23ab4815542e93d541e0ca0cdcf\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"composer-plugin-api\": \"^1.1 || ^2.0\"\n },\n \"require-dev\": {\n \"composer/composer\": \"^1.9 || ^2.0\",\n \"friendsofphp/php-cs-fixer\": \"^2.18, <2.19\",\n \"infection/infection\": \"^0.15.2\",\n \"php-coveralls/php-coveralls\": \"^2.4\",\n \"phpstan/extension-installer\": \"^1.0\",\n \"phpstan/phpstan\": \"^0.12.10\",\n \"phpstan/phpstan-phpunit\": \"^0.12.6\",\n \"phpstan/phpstan-strict-rules\": \"^0.12.2\",\n \"phpstan/phpstan-webmozart-assert\": \"^0.12.2\",\n \"phpunit/phpunit\": \"^9.5\",\n \"vimeo/psalm\": \"^4.8\"\n },\n \"type\": \"composer-plugin\",\n \"extra\": {\n \"class\": \"Infection\\\\ExtensionInstaller\\\\Plugin\"\n },\n \"autoload\": {\n \"psr-4\": {\n \"Infection\\\\ExtensionInstaller\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"BSD-3-Clause\"\n ],\n \"authors\": [\n {\n \"name\": \"Maks Rafalko\",\n \"email\": \"maks.rafalko@gmail.com\"\n }\n ],\n \"description\": \"Infection Extension Installer\",\n \"support\": {\n \"issues\": \"https://github.com/infection/extension-installer/issues\",\n \"source\": \"https://github.com/infection/extension-installer/tree/0.1.2\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/infection\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://opencollective.com/infection\",\n \"type\": \"open_collective\"\n }\n ],\n \"time\": \"2021-10-20T22:08:34+00:00\"\n },\n {\n \"name\": \"infection/include-interceptor\",\n \"version\": \"0.2.5\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/infection/include-interceptor.git\",\n \"reference\": \"0cc76d95a79d9832d74e74492b0a30139904bdf7\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/infection/include-interceptor/zipball/0cc76d95a79d9832d74e74492b0a30139904bdf7\",\n \"reference\": \"0cc76d95a79d9832d74e74492b0a30139904bdf7\",\n \"shasum\": \"\"\n },\n \"require-dev\": {\n \"friendsofphp/php-cs-fixer\": \"^2.16\",\n \"infection/infection\": \"^0.15.0\",\n \"phan/phan\": \"^2.4 || ^3\",\n \"php-coveralls/php-coveralls\": \"^2.2\",\n \"phpstan/phpstan\": \"^0.12.8\",\n \"phpunit/phpunit\": \"^8.5\",\n \"vimeo/psalm\": \"^3.8\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Infection\\\\StreamWrapper\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"BSD-3-Clause\"\n ],\n \"authors\": [\n {\n \"name\": \"Maks Rafalko\",\n \"email\": \"maks.rafalko@gmail.com\"\n }\n ],\n \"description\": \"Stream Wrapper: Include Interceptor. Allows to replace included (autoloaded) file with another one.\",\n \"support\": {\n \"issues\": \"https://github.com/infection/include-interceptor/issues\",\n \"source\": \"https://github.com/infection/include-interceptor/tree/0.2.5\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/infection\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://opencollective.com/infection\",\n \"type\": \"open_collective\"\n }\n ],\n \"time\": \"2021-08-09T10:03:57+00:00\"\n },\n {\n \"name\": \"infection/infection\",\n \"version\": \"0.29.14\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/infection/infection.git\",\n \"reference\": \"feea2a48a8aeedd3a4d2105167b41a46f0e568a3\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/infection/infection/zipball/feea2a48a8aeedd3a4d2105167b41a46f0e568a3\",\n \"reference\": \"feea2a48a8aeedd3a4d2105167b41a46f0e568a3\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"colinodell/json5\": \"^2.2 || ^3.0\",\n \"composer-runtime-api\": \"^2.0\",\n \"composer/xdebug-handler\": \"^2.0 || ^3.0\",\n \"ext-dom\": \"*\",\n \"ext-json\": \"*\",\n \"ext-libxml\": \"*\",\n \"ext-mbstring\": \"*\",\n \"fidry/cpu-core-counter\": \"^0.4.0 || ^0.5.0 || ^1.0\",\n \"infection/abstract-testframework-adapter\": \"^0.5.0\",\n \"infection/extension-installer\": \"^0.1.0\",\n \"infection/include-interceptor\": \"^0.2.5\",\n \"infection/mutator\": \"^0.4\",\n \"justinrainbow/json-schema\": \"^5.3 || ^6.0\",\n \"nikic/php-parser\": \"^5.3\",\n \"ondram/ci-detector\": \"^4.1.0\",\n \"php\": \"^8.2\",\n \"sanmai/later\": \"^0.1.1\",\n \"sanmai/pipeline\": \"^5.1 || ^6\",\n \"sebastian/diff\": \"^3.0.2 || ^4.0 || ^5.0 || ^6.0 || ^7.0\",\n \"symfony/console\": \"^6.4 || ^7.0\",\n \"symfony/filesystem\": \"^6.4 || ^7.0\",\n \"symfony/finder\": \"^6.4 || ^7.0\",\n \"symfony/process\": \"^6.4 || ^7.0\",\n \"thecodingmachine/safe\": \"^v3.0\",\n \"webmozart/assert\": \"^1.11\"\n },\n \"conflict\": {\n \"antecedent/patchwork\": \"<2.1.25\",\n \"dg/bypass-finals\": \"<1.4.1\",\n \"phpunit/php-code-coverage\": \">9,<9.1.4 || >9.2.17,<9.2.21\"\n },\n \"require-dev\": {\n \"ext-simplexml\": \"*\",\n \"fidry/makefile\": \"^1.0\",\n \"phpstan/extension-installer\": \"^1.4\",\n \"phpstan/phpstan\": \"^2.1\",\n \"phpstan/phpstan-phpunit\": \"^2.0\",\n \"phpstan/phpstan-strict-rules\": \"^2.0\",\n \"phpstan/phpstan-webmozart-assert\": \"^2.0\",\n \"phpunit/phpunit\": \"^11.5\",\n \"rector/rector\": \"^2.0\",\n \"sidz/phpstan-rules\": \"^0.5.1\",\n \"symfony/yaml\": \"^6.4 || ^7.0\",\n \"thecodingmachine/phpstan-safe-rule\": \"^1.4\"\n },\n \"bin\": [\n \"bin/infection\"\n ],\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Infection\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"BSD-3-Clause\"\n ],\n \"authors\": [\n {\n \"name\": \"Maks Rafalko\",\n \"email\": \"maks.rafalko@gmail.com\",\n \"homepage\": \"https://twitter.com/maks_rafalko\"\n },\n {\n \"name\": \"Oleg Zhulnev\",\n \"homepage\": \"https://github.com/sidz\"\n },\n {\n \"name\": \"Gert de Pagter\",\n \"homepage\": \"https://github.com/BackEndTea\"\n },\n {\n \"name\": \"Théo FIDRY\",\n \"email\": \"theo.fidry@gmail.com\",\n \"homepage\": \"https://twitter.com/tfidry\"\n },\n {\n \"name\": \"Alexey Kopytko\",\n \"email\": \"alexey@kopytko.com\",\n \"homepage\": \"https://www.alexeykopytko.com\"\n },\n {\n \"name\": \"Andreas Möller\",\n \"email\": \"am@localheinz.com\",\n \"homepage\": \"https://localheinz.com\"\n }\n ],\n \"description\": \"Infection is a Mutation Testing framework for PHP. The mutation adequacy score can be used to measure the effectiveness of a test set in terms of its ability to detect faults.\",\n \"keywords\": [\n \"coverage\",\n \"mutant\",\n \"mutation framework\",\n \"mutation testing\",\n \"testing\",\n \"unit testing\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/infection/infection/issues\",\n \"source\": \"https://github.com/infection/infection/tree/0.29.14\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/infection\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://opencollective.com/infection\",\n \"type\": \"open_collective\"\n }\n ],\n \"time\": \"2025-03-02T18:49:12+00:00\"\n },\n {\n \"name\": \"infection/mutator\",\n \"version\": \"0.4.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/infection/mutator.git\",\n \"reference\": \"3c976d721b02b32f851ee4e15d553ef1e9186d1d\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/infection/mutator/zipball/3c976d721b02b32f851ee4e15d553ef1e9186d1d\",\n \"reference\": \"3c976d721b02b32f851ee4e15d553ef1e9186d1d\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"nikic/php-parser\": \"^5.0\"\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \"^9.6 || ^10\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Infection\\\\Mutator\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"BSD-3-Clause\"\n ],\n \"authors\": [\n {\n \"name\": \"Maks Rafalko\",\n \"email\": \"maks.rafalko@gmail.com\"\n }\n ],\n \"description\": \"Mutator interface to implement custom mutators (mutation operators) for Infection\",\n \"support\": {\n \"issues\": \"https://github.com/infection/mutator/issues\",\n \"source\": \"https://github.com/infection/mutator/tree/0.4.1\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/infection\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://opencollective.com/infection\",\n \"type\": \"open_collective\"\n }\n ],\n \"time\": \"2025-04-29T08:19:52+00:00\"\n },\n {\n \"name\": \"jasonmccreary/laravel-test-assertions\",\n \"version\": \"v2.8.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/jasonmccreary/laravel-test-assertions.git\",\n \"reference\": \"4e0542af0a49d72247b353092f9e79128e3615db\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/jasonmccreary/laravel-test-assertions/zipball/4e0542af0a49d72247b353092f9e79128e3615db\",\n \"reference\": \"4e0542af0a49d72247b353092f9e79128e3615db\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"illuminate/testing\": \"^11.0|^12.0\",\n \"mockery/mockery\": \"^1.4.4\",\n \"php\": \"^8.1\",\n \"phpunit/phpunit\": \"^10.1|^11.0|^12.0\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"laravel\": {\n \"providers\": [\n \"JMac\\\\Testing\\\\AdditionalAssertionsServiceProvider\"\n ]\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"JMac\\\\Testing\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Jason McCreary\",\n \"email\": \"jason@pureconcepts.net\"\n }\n ],\n \"description\": \"A set of helpful assertions when testing Laravel applications.\",\n \"support\": {\n \"issues\": \"https://github.com/jasonmccreary/laravel-test-assertions/issues\",\n \"source\": \"https://github.com/jasonmccreary/laravel-test-assertions/tree/v2.8.0\"\n },\n \"time\": \"2025-04-10T20:19:59+00:00\"\n },\n {\n \"name\": \"justinrainbow/json-schema\",\n \"version\": \"6.5.2\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/jsonrainbow/json-schema.git\",\n \"reference\": \"ac0d369c09653cf7af561f6d91a705bc617a87b8\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/jsonrainbow/json-schema/zipball/ac0d369c09653cf7af561f6d91a705bc617a87b8\",\n \"reference\": \"ac0d369c09653cf7af561f6d91a705bc617a87b8\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"ext-json\": \"*\",\n \"marc-mabe/php-enum\": \"^4.0\",\n \"php\": \"^7.2 || ^8.0\"\n },\n \"require-dev\": {\n \"friendsofphp/php-cs-fixer\": \"3.3.0\",\n \"json-schema/json-schema-test-suite\": \"^23.2\",\n \"marc-mabe/php-enum-phpstan\": \"^2.0\",\n \"phpspec/prophecy\": \"^1.19\",\n \"phpstan/phpstan\": \"^1.12\",\n \"phpunit/phpunit\": \"^8.5\"\n },\n \"bin\": [\n \"bin/validate-json\"\n ],\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"6.x-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"JsonSchema\\\\\": \"src/JsonSchema/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Bruno Prieto Reis\",\n \"email\": \"bruno.p.reis@gmail.com\"\n },\n {\n \"name\": \"Justin Rainbow\",\n \"email\": \"justin.rainbow@gmail.com\"\n },\n {\n \"name\": \"Igor Wiedler\",\n \"email\": \"igor@wiedler.ch\"\n },\n {\n \"name\": \"Robert Schönthal\",\n \"email\": \"seroscho@googlemail.com\"\n }\n ],\n \"description\": \"A library to validate a json schema.\",\n \"homepage\": \"https://github.com/jsonrainbow/json-schema\",\n \"keywords\": [\n \"json\",\n \"schema\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/jsonrainbow/json-schema/issues\",\n \"source\": \"https://github.com/jsonrainbow/json-schema/tree/6.5.2\"\n },\n \"time\": \"2025-09-09T09:42:27+00:00\"\n },\n {\n \"name\": \"kelunik/certificate\",\n \"version\": \"v1.1.3\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/kelunik/certificate.git\",\n \"reference\": \"7e00d498c264d5eb4f78c69f41c8bd6719c0199e\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/kelunik/certificate/zipball/7e00d498c264d5eb4f78c69f41c8bd6719c0199e\",\n \"reference\": \"7e00d498c264d5eb4f78c69f41c8bd6719c0199e\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"ext-openssl\": \"*\",\n \"php\": \">=7.0\"\n },\n \"require-dev\": {\n \"amphp/php-cs-fixer-config\": \"^2\",\n \"phpunit/phpunit\": \"^6 | 7 | ^8 | ^9\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"1.x-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Kelunik\\\\Certificate\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Niklas Keller\",\n \"email\": \"me@kelunik.com\"\n }\n ],\n \"description\": \"Access certificate details and transform between different formats.\",\n \"keywords\": [\n \"DER\",\n \"certificate\",\n \"certificates\",\n \"openssl\",\n \"pem\",\n \"x509\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/kelunik/certificate/issues\",\n \"source\": \"https://github.com/kelunik/certificate/tree/v1.1.3\"\n },\n \"time\": \"2023-02-03T21:26:53+00:00\"\n },\n {\n \"name\": \"larastan/larastan\",\n \"version\": \"v3.6.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/larastan/larastan.git\",\n \"reference\": \"3c223047e374befd1b64959784685d6ecccf66aa\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/larastan/larastan/zipball/3c223047e374befd1b64959784685d6ecccf66aa\",\n \"reference\": \"3c223047e374befd1b64959784685d6ecccf66aa\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"ext-json\": \"*\",\n \"iamcal/sql-parser\": \"^0.6.0\",\n \"illuminate/console\": \"^11.44.2 || ^12.4.1\",\n \"illuminate/container\": \"^11.44.2 || ^12.4.1\",\n \"illuminate/contracts\": \"^11.44.2 || ^12.4.1\",\n \"illuminate/database\": \"^11.44.2 || ^12.4.1\",\n \"illuminate/http\": \"^11.44.2 || ^12.4.1\",\n \"illuminate/pipeline\": \"^11.44.2 || ^12.4.1\",\n \"illuminate/support\": \"^11.44.2 || ^12.4.1\",\n \"php\": \"^8.2\",\n \"phpstan/phpstan\": \"^2.1.11\"\n },\n \"require-dev\": {\n \"doctrine/coding-standard\": \"^13\",\n \"laravel/framework\": \"^11.44.2 || ^12.7.2\",\n \"mockery/mockery\": \"^1.6.12\",\n \"nikic/php-parser\": \"^5.4\",\n \"orchestra/canvas\": \"^v9.2.2 || ^10.0.1\",\n \"orchestra/testbench-core\": \"^9.12.0 || ^10.1\",\n \"phpstan/phpstan-deprecation-rules\": \"^2.0.1\",\n \"phpunit/phpunit\": \"^10.5.35 || ^11.5.15\"\n },\n \"suggest\": {\n \"orchestra/testbench\": \"Using Larastan for analysing a package needs Testbench\"\n },\n \"type\": \"phpstan-extension\",\n \"extra\": {\n \"phpstan\": {\n \"includes\": [\n \"extension.neon\"\n ]\n },\n \"branch-alias\": {\n \"dev-master\": \"3.0-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Larastan\\\\Larastan\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Can Vural\",\n \"email\": \"can9119@gmail.com\"\n }\n ],\n \"description\": \"Larastan - Discover bugs in your code without running it. A phpstan/phpstan extension for Laravel\",\n \"keywords\": [\n \"PHPStan\",\n \"code analyse\",\n \"code analysis\",\n \"larastan\",\n \"laravel\",\n \"package\",\n \"php\",\n \"static analysis\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/larastan/larastan/issues\",\n \"source\": \"https://github.com/larastan/larastan/tree/v3.6.1\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/canvural\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2025-08-25T07:24:56+00:00\"\n },\n {\n \"name\": \"maglnet/composer-require-checker\",\n \"version\": \"4.16.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/maglnet/ComposerRequireChecker.git\",\n \"reference\": \"2449a6298a0c39d940287d5d3afaf05a6f80fd0c\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/maglnet/ComposerRequireChecker/zipball/2449a6298a0c39d940287d5d3afaf05a6f80fd0c\",\n \"reference\": \"2449a6298a0c39d940287d5d3afaf05a6f80fd0c\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"composer-runtime-api\": \"^2.0.0\",\n \"ext-phar\": \"*\",\n \"nikic/php-parser\": \"^5.4.0\",\n \"php\": \"~8.2.0 || ~8.3.0 || ~8.4.0\",\n \"symfony/console\": \"^6.4.1 || ^7.0.1\",\n \"webmozart/assert\": \"^1.11.0\",\n \"webmozart/glob\": \"^4.7.0\"\n },\n \"require-dev\": {\n \"doctrine/coding-standard\": \"^12.0.0\",\n \"ext-zend-opcache\": \"*\",\n \"phing/phing\": \"^3.0.1\",\n \"phpstan/phpstan\": \"^2.1.2\",\n \"phpunit/phpunit\": \"^11.5.7\",\n \"psalm/plugin-phpunit\": \"^0.19.2\",\n \"roave/infection-static-analysis-plugin\": \"^1.36.0\",\n \"spatie/temporary-directory\": \"^2.3.0\",\n \"vimeo/psalm\": \"^6.4.0\"\n },\n \"bin\": [\n \"bin/composer-require-checker\"\n ],\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"2.1-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"ComposerRequireChecker\\\\\": \"src/ComposerRequireChecker\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Marco Pivetta\",\n \"email\": \"ocramius@gmail.com\",\n \"homepage\": \"http://ocramius.github.io/\"\n },\n {\n \"name\": \"Matthias Glaub\",\n \"email\": \"magl@magl.net\",\n \"homepage\": \"http://magl.net\"\n }\n ],\n \"description\": \"CLI tool to analyze composer dependencies and verify that no unknown symbols are used in the sources of a package\",\n \"homepage\": \"https://github.com/maglnet/ComposerRequireChecker\",\n \"keywords\": [\n \"cli\",\n \"composer\",\n \"dependency\",\n \"imports\",\n \"require\",\n \"requirements\",\n \"static analysis\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/maglnet/ComposerRequireChecker/issues\",\n \"source\": \"https://github.com/maglnet/ComposerRequireChecker/tree/4.16.1\"\n },\n \"time\": \"2025-02-07T09:09:45+00:00\"\n },\n {\n \"name\": \"marc-mabe/php-enum\",\n \"version\": \"v4.7.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/marc-mabe/php-enum.git\",\n \"reference\": \"7159809e5cfa041dca28e61f7f7ae58063aae8ed\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/marc-mabe/php-enum/zipball/7159809e5cfa041dca28e61f7f7ae58063aae8ed\",\n \"reference\": \"7159809e5cfa041dca28e61f7f7ae58063aae8ed\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"ext-reflection\": \"*\",\n \"php\": \"^7.1 | ^8.0\"\n },\n \"require-dev\": {\n \"phpbench/phpbench\": \"^0.16.10 || ^1.0.4\",\n \"phpstan/phpstan\": \"^1.3.1\",\n \"phpunit/phpunit\": \"^7.5.20 | ^8.5.22 | ^9.5.11\",\n \"vimeo/psalm\": \"^4.17.0 | ^5.26.1\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-3.x\": \"3.2-dev\",\n \"dev-master\": \"4.7-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"MabeEnum\\\\\": \"src/\"\n },\n \"classmap\": [\n \"stubs/Stringable.php\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"BSD-3-Clause\"\n ],\n \"authors\": [\n {\n \"name\": \"Marc Bennewitz\",\n \"email\": \"dev@mabe.berlin\",\n \"homepage\": \"https://mabe.berlin/\",\n \"role\": \"Lead\"\n }\n ],\n \"description\": \"Simple and fast implementation of enumerations with native PHP\",\n \"homepage\": \"https://github.com/marc-mabe/php-enum\",\n \"keywords\": [\n \"enum\",\n \"enum-map\",\n \"enum-set\",\n \"enumeration\",\n \"enumerator\",\n \"enummap\",\n \"enumset\",\n \"map\",\n \"set\",\n \"type\",\n \"type-hint\",\n \"typehint\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/marc-mabe/php-enum/issues\",\n \"source\": \"https://github.com/marc-mabe/php-enum/tree/v4.7.1\"\n },\n \"time\": \"2024-11-28T04:54:44+00:00\"\n },\n {\n \"name\": \"mockery/mockery\",\n \"version\": \"1.6.12\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/mockery/mockery.git\",\n \"reference\": \"1f4efdd7d3beafe9807b08156dfcb176d18f1699\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/mockery/mockery/zipball/1f4efdd7d3beafe9807b08156dfcb176d18f1699\",\n \"reference\": \"1f4efdd7d3beafe9807b08156dfcb176d18f1699\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"hamcrest/hamcrest-php\": \"^2.0.1\",\n \"lib-pcre\": \">=7.0\",\n \"php\": \">=7.3\"\n },\n \"conflict\": {\n \"phpunit/phpunit\": \"<8.0\"\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \"^8.5 || ^9.6.17\",\n \"symplify/easy-coding-standard\": \"^12.1.14\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"files\": [\n \"library/helpers.php\",\n \"library/Mockery.php\"\n ],\n \"psr-4\": {\n \"Mockery\\\\\": \"library/Mockery\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"BSD-3-Clause\"\n ],\n \"authors\": [\n {\n \"name\": \"Pádraic Brady\",\n \"email\": \"padraic.brady@gmail.com\",\n \"homepage\": \"https://github.com/padraic\",\n \"role\": \"Author\"\n },\n {\n \"name\": \"Dave Marshall\",\n \"email\": \"dave.marshall@atstsolutions.co.uk\",\n \"homepage\": \"https://davedevelopment.co.uk\",\n \"role\": \"Developer\"\n },\n {\n \"name\": \"Nathanael Esayeas\",\n \"email\": \"nathanael.esayeas@protonmail.com\",\n \"homepage\": \"https://github.com/ghostwriter\",\n \"role\": \"Lead Developer\"\n }\n ],\n \"description\": \"Mockery is a simple yet flexible PHP mock object framework\",\n \"homepage\": \"https://github.com/mockery/mockery\",\n \"keywords\": [\n \"BDD\",\n \"TDD\",\n \"library\",\n \"mock\",\n \"mock objects\",\n \"mockery\",\n \"stub\",\n \"test\",\n \"test double\",\n \"testing\"\n ],\n \"support\": {\n \"docs\": \"https://docs.mockery.io/\",\n \"issues\": \"https://github.com/mockery/mockery/issues\",\n \"rss\": \"https://github.com/mockery/mockery/releases.atom\",\n \"security\": \"https://github.com/mockery/mockery/security/advisories\",\n \"source\": \"https://github.com/mockery/mockery\"\n },\n \"time\": \"2024-05-16T03:13:13+00:00\"\n },\n {\n \"name\": \"myclabs/deep-copy\",\n \"version\": \"1.13.4\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/myclabs/DeepCopy.git\",\n \"reference\": \"07d290f0c47959fd5eed98c95ee5602db07e0b6a\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/myclabs/DeepCopy/zipball/07d290f0c47959fd5eed98c95ee5602db07e0b6a\",\n \"reference\": \"07d290f0c47959fd5eed98c95ee5602db07e0b6a\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \"^7.1 || ^8.0\"\n },\n \"conflict\": {\n \"doctrine/collections\": \"<1.6.8\",\n \"doctrine/common\": \"<2.13.3 || >=3 <3.2.2\"\n },\n \"require-dev\": {\n \"doctrine/collections\": \"^1.6.8\",\n \"doctrine/common\": \"^2.13.3 || ^3.2.2\",\n \"phpspec/prophecy\": \"^1.10\",\n \"phpunit/phpunit\": \"^7.5.20 || ^8.5.23 || ^9.5.13\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"files\": [\n \"src/DeepCopy/deep_copy.php\"\n ],\n \"psr-4\": {\n \"DeepCopy\\\\\": \"src/DeepCopy/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"description\": \"Create deep copies (clones) of your objects\",\n \"keywords\": [\n \"clone\",\n \"copy\",\n \"duplicate\",\n \"object\",\n \"object graph\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/myclabs/DeepCopy/issues\",\n \"source\": \"https://github.com/myclabs/DeepCopy/tree/1.13.4\"\n },\n \"funding\": [\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/myclabs/deep-copy\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2025-08-01T08:46:24+00:00\"\n },\n {\n \"name\": \"netresearch/jsonmapper\",\n \"version\": \"v4.5.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/cweiske/jsonmapper.git\",\n \"reference\": \"8e76efb98ee8b6afc54687045e1b8dba55ac76e5\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/cweiske/jsonmapper/zipball/8e76efb98ee8b6afc54687045e1b8dba55ac76e5\",\n \"reference\": \"8e76efb98ee8b6afc54687045e1b8dba55ac76e5\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"ext-json\": \"*\",\n \"ext-pcre\": \"*\",\n \"ext-reflection\": \"*\",\n \"ext-spl\": \"*\",\n \"php\": \">=7.1\"\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \"~7.5 || ~8.0 || ~9.0 || ~10.0\",\n \"squizlabs/php_codesniffer\": \"~3.5\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-0\": {\n \"JsonMapper\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"OSL-3.0\"\n ],\n \"authors\": [\n {\n \"name\": \"Christian Weiske\",\n \"email\": \"cweiske@cweiske.de\",\n \"homepage\": \"http://github.com/cweiske/jsonmapper/\",\n \"role\": \"Developer\"\n }\n ],\n \"description\": \"Map nested JSON structures onto PHP classes\",\n \"support\": {\n \"email\": \"cweiske@cweiske.de\",\n \"issues\": \"https://github.com/cweiske/jsonmapper/issues\",\n \"source\": \"https://github.com/cweiske/jsonmapper/tree/v4.5.0\"\n },\n \"time\": \"2024-09-08T10:13:13+00:00\"\n },\n {\n \"name\": \"nunomaduro/collision\",\n \"version\": \"v8.8.2\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/nunomaduro/collision.git\",\n \"reference\": \"60207965f9b7b7a4ce15a0f75d57f9dadb105bdb\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/nunomaduro/collision/zipball/60207965f9b7b7a4ce15a0f75d57f9dadb105bdb\",\n \"reference\": \"60207965f9b7b7a4ce15a0f75d57f9dadb105bdb\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"filp/whoops\": \"^2.18.1\",\n \"nunomaduro/termwind\": \"^2.3.1\",\n \"php\": \"^8.2.0\",\n \"symfony/console\": \"^7.3.0\"\n },\n \"conflict\": {\n \"laravel/framework\": \"<11.44.2 || >=13.0.0\",\n \"phpunit/phpunit\": \"<11.5.15 || >=13.0.0\"\n },\n \"require-dev\": {\n \"brianium/paratest\": \"^7.8.3\",\n \"larastan/larastan\": \"^3.4.2\",\n \"laravel/framework\": \"^11.44.2 || ^12.18\",\n \"laravel/pint\": \"^1.22.1\",\n \"laravel/sail\": \"^1.43.1\",\n \"laravel/sanctum\": \"^4.1.1\",\n \"laravel/tinker\": \"^2.10.1\",\n \"orchestra/testbench-core\": \"^9.12.0 || ^10.4\",\n \"pestphp/pest\": \"^3.8.2\",\n \"sebastian/environment\": \"^7.2.1 || ^8.0\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"laravel\": {\n \"providers\": [\n \"NunoMaduro\\\\Collision\\\\Adapters\\\\Laravel\\\\CollisionServiceProvider\"\n ]\n },\n \"branch-alias\": {\n \"dev-8.x\": \"8.x-dev\"\n }\n },\n \"autoload\": {\n \"files\": [\n \"./src/Adapters/Phpunit/Autoload.php\"\n ],\n \"psr-4\": {\n \"NunoMaduro\\\\Collision\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Nuno Maduro\",\n \"email\": \"enunomaduro@gmail.com\"\n }\n ],\n \"description\": \"Cli error handling for console/command-line PHP applications.\",\n \"keywords\": [\n \"artisan\",\n \"cli\",\n \"command-line\",\n \"console\",\n \"dev\",\n \"error\",\n \"handling\",\n \"laravel\",\n \"laravel-zero\",\n \"php\",\n \"symfony\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/nunomaduro/collision/issues\",\n \"source\": \"https://github.com/nunomaduro/collision\"\n },\n \"funding\": [\n {\n \"url\": \"https://www.paypal.com/paypalme/enunomaduro\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/nunomaduro\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://www.patreon.com/nunomaduro\",\n \"type\": \"patreon\"\n }\n ],\n \"time\": \"2025-06-25T02:12:12+00:00\"\n },\n {\n \"name\": \"ondram/ci-detector\",\n \"version\": \"4.2.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/OndraM/ci-detector.git\",\n \"reference\": \"8b0223b5ed235fd377c75fdd1bfcad05c0f168b8\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/OndraM/ci-detector/zipball/8b0223b5ed235fd377c75fdd1bfcad05c0f168b8\",\n \"reference\": \"8b0223b5ed235fd377c75fdd1bfcad05c0f168b8\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \"^7.4 || ^8.0\"\n },\n \"require-dev\": {\n \"ergebnis/composer-normalize\": \"^2.13.2\",\n \"lmc/coding-standard\": \"^3.0.0\",\n \"php-parallel-lint/php-parallel-lint\": \"^1.2\",\n \"phpstan/extension-installer\": \"^1.1.0\",\n \"phpstan/phpstan\": \"^1.2.0\",\n \"phpstan/phpstan-phpunit\": \"^1.0.0\",\n \"phpunit/phpunit\": \"^9.6.13\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"OndraM\\\\CiDetector\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Ondřej Machulda\",\n \"email\": \"ondrej.machulda@gmail.com\"\n }\n ],\n \"description\": \"Detect continuous integration environment and provide unified access to properties of current build\",\n \"keywords\": [\n \"CircleCI\",\n \"Codeship\",\n \"Wercker\",\n \"adapter\",\n \"appveyor\",\n \"aws\",\n \"aws codebuild\",\n \"azure\",\n \"azure devops\",\n \"azure pipelines\",\n \"bamboo\",\n \"bitbucket\",\n \"buddy\",\n \"ci-info\",\n \"codebuild\",\n \"continuous integration\",\n \"continuousphp\",\n \"devops\",\n \"drone\",\n \"github\",\n \"gitlab\",\n \"interface\",\n \"jenkins\",\n \"pipelines\",\n \"sourcehut\",\n \"teamcity\",\n \"travis\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/OndraM/ci-detector/issues\",\n \"source\": \"https://github.com/OndraM/ci-detector/tree/4.2.0\"\n },\n \"time\": \"2024-03-12T13:22:30+00:00\"\n },\n {\n \"name\": \"phar-io/manifest\",\n \"version\": \"2.0.4\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/phar-io/manifest.git\",\n \"reference\": \"54750ef60c58e43759730615a392c31c80e23176\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/phar-io/manifest/zipball/54750ef60c58e43759730615a392c31c80e23176\",\n \"reference\": \"54750ef60c58e43759730615a392c31c80e23176\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"ext-dom\": \"*\",\n \"ext-libxml\": \"*\",\n \"ext-phar\": \"*\",\n \"ext-xmlwriter\": \"*\",\n \"phar-io/version\": \"^3.0.1\",\n \"php\": \"^7.2 || ^8.0\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"2.0.x-dev\"\n }\n },\n \"autoload\": {\n \"classmap\": [\n \"src/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"BSD-3-Clause\"\n ],\n \"authors\": [\n {\n \"name\": \"Arne Blankerts\",\n \"email\": \"arne@blankerts.de\",\n \"role\": \"Developer\"\n },\n {\n \"name\": \"Sebastian Heuer\",\n \"email\": \"sebastian@phpeople.de\",\n \"role\": \"Developer\"\n },\n {\n \"name\": \"Sebastian Bergmann\",\n \"email\": \"sebastian@phpunit.de\",\n \"role\": \"Developer\"\n }\n ],\n \"description\": \"Component for reading phar.io manifest information from a PHP Archive (PHAR)\",\n \"support\": {\n \"issues\": \"https://github.com/phar-io/manifest/issues\",\n \"source\": \"https://github.com/phar-io/manifest/tree/2.0.4\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/theseer\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2024-03-03T12:33:53+00:00\"\n },\n {\n \"name\": \"phar-io/version\",\n \"version\": \"3.2.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/phar-io/version.git\",\n \"reference\": \"4f7fd7836c6f332bb2933569e566a0d6c4cbed74\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74\",\n \"reference\": \"4f7fd7836c6f332bb2933569e566a0d6c4cbed74\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \"^7.2 || ^8.0\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"classmap\": [\n \"src/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"BSD-3-Clause\"\n ],\n \"authors\": [\n {\n \"name\": \"Arne Blankerts\",\n \"email\": \"arne@blankerts.de\",\n \"role\": \"Developer\"\n },\n {\n \"name\": \"Sebastian Heuer\",\n \"email\": \"sebastian@phpeople.de\",\n \"role\": \"Developer\"\n },\n {\n \"name\": \"Sebastian Bergmann\",\n \"email\": \"sebastian@phpunit.de\",\n \"role\": \"Developer\"\n }\n ],\n \"description\": \"Library for handling version information and constraints\",\n \"support\": {\n \"issues\": \"https://github.com/phar-io/version/issues\",\n \"source\": \"https://github.com/phar-io/version/tree/3.2.1\"\n },\n \"time\": \"2022-02-21T01:04:05+00:00\"\n },\n {\n \"name\": \"php-debugbar/php-debugbar\",\n \"version\": \"v2.2.4\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/php-debugbar/php-debugbar.git\",\n \"reference\": \"3146d04671f51f69ffec2a4207ac3bdcf13a9f35\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/php-debugbar/php-debugbar/zipball/3146d04671f51f69ffec2a4207ac3bdcf13a9f35\",\n \"reference\": \"3146d04671f51f69ffec2a4207ac3bdcf13a9f35\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \"^8\",\n \"psr/log\": \"^1|^2|^3\",\n \"symfony/var-dumper\": \"^4|^5|^6|^7\"\n },\n \"replace\": {\n \"maximebf/debugbar\": \"self.version\"\n },\n \"require-dev\": {\n \"dbrekelmans/bdi\": \"^1\",\n \"phpunit/phpunit\": \"^8|^9\",\n \"symfony/panther\": \"^1|^2.1\",\n \"twig/twig\": \"^1.38|^2.7|^3.0\"\n },\n \"suggest\": {\n \"kriswallsmith/assetic\": \"The best way to manage assets\",\n \"monolog/monolog\": \"Log using Monolog\",\n \"predis/predis\": \"Redis storage\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"2.1-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"DebugBar\\\\\": \"src/DebugBar/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Maxime Bouroumeau-Fuseau\",\n \"email\": \"maxime.bouroumeau@gmail.com\",\n \"homepage\": \"http://maximebf.com\"\n },\n {\n \"name\": \"Barry vd. Heuvel\",\n \"email\": \"barryvdh@gmail.com\"\n }\n ],\n \"description\": \"Debug bar in the browser for php application\",\n \"homepage\": \"https://github.com/php-debugbar/php-debugbar\",\n \"keywords\": [\n \"debug\",\n \"debug bar\",\n \"debugbar\",\n \"dev\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/php-debugbar/php-debugbar/issues\",\n \"source\": \"https://github.com/php-debugbar/php-debugbar/tree/v2.2.4\"\n },\n \"time\": \"2025-07-22T14:01:30+00:00\"\n },\n {\n \"name\": \"phpdocumentor/reflection-common\",\n \"version\": \"2.2.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/phpDocumentor/ReflectionCommon.git\",\n \"reference\": \"1d01c49d4ed62f25aa84a747ad35d5a16924662b\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b\",\n \"reference\": \"1d01c49d4ed62f25aa84a747ad35d5a16924662b\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \"^7.2 || ^8.0\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-2.x\": \"2.x-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"phpDocumentor\\\\Reflection\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Jaap van Otterdijk\",\n \"email\": \"opensource@ijaap.nl\"\n }\n ],\n \"description\": \"Common reflection classes used by phpdocumentor to reflect the code structure\",\n \"homepage\": \"http://www.phpdoc.org\",\n \"keywords\": [\n \"FQSEN\",\n \"phpDocumentor\",\n \"phpdoc\",\n \"reflection\",\n \"static analysis\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/phpDocumentor/ReflectionCommon/issues\",\n \"source\": \"https://github.com/phpDocumentor/ReflectionCommon/tree/2.x\"\n },\n \"time\": \"2020-06-27T09:03:43+00:00\"\n },\n {\n \"name\": \"phpdocumentor/reflection-docblock\",\n \"version\": \"5.6.3\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/phpDocumentor/ReflectionDocBlock.git\",\n \"reference\": \"94f8051919d1b0369a6bcc7931d679a511c03fe9\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/94f8051919d1b0369a6bcc7931d679a511c03fe9\",\n \"reference\": \"94f8051919d1b0369a6bcc7931d679a511c03fe9\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"doctrine/deprecations\": \"^1.1\",\n \"ext-filter\": \"*\",\n \"php\": \"^7.4 || ^8.0\",\n \"phpdocumentor/reflection-common\": \"^2.2\",\n \"phpdocumentor/type-resolver\": \"^1.7\",\n \"phpstan/phpdoc-parser\": \"^1.7|^2.0\",\n \"webmozart/assert\": \"^1.9.1\"\n },\n \"require-dev\": {\n \"mockery/mockery\": \"~1.3.5 || ~1.6.0\",\n \"phpstan/extension-installer\": \"^1.1\",\n \"phpstan/phpstan\": \"^1.8\",\n \"phpstan/phpstan-mockery\": \"^1.1\",\n \"phpstan/phpstan-webmozart-assert\": \"^1.2\",\n \"phpunit/phpunit\": \"^9.5\",\n \"psalm/phar\": \"^5.26\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"5.x-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"phpDocumentor\\\\Reflection\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Mike van Riel\",\n \"email\": \"me@mikevanriel.com\"\n },\n {\n \"name\": \"Jaap van Otterdijk\",\n \"email\": \"opensource@ijaap.nl\"\n }\n ],\n \"description\": \"With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.\",\n \"support\": {\n \"issues\": \"https://github.com/phpDocumentor/ReflectionDocBlock/issues\",\n \"source\": \"https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.6.3\"\n },\n \"time\": \"2025-08-01T19:43:32+00:00\"\n },\n {\n \"name\": \"phpdocumentor/type-resolver\",\n \"version\": \"1.10.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/phpDocumentor/TypeResolver.git\",\n \"reference\": \"679e3ce485b99e84c775d28e2e96fade9a7fb50a\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/679e3ce485b99e84c775d28e2e96fade9a7fb50a\",\n \"reference\": \"679e3ce485b99e84c775d28e2e96fade9a7fb50a\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"doctrine/deprecations\": \"^1.0\",\n \"php\": \"^7.3 || ^8.0\",\n \"phpdocumentor/reflection-common\": \"^2.0\",\n \"phpstan/phpdoc-parser\": \"^1.18|^2.0\"\n },\n \"require-dev\": {\n \"ext-tokenizer\": \"*\",\n \"phpbench/phpbench\": \"^1.2\",\n \"phpstan/extension-installer\": \"^1.1\",\n \"phpstan/phpstan\": \"^1.8\",\n \"phpstan/phpstan-phpunit\": \"^1.1\",\n \"phpunit/phpunit\": \"^9.5\",\n \"rector/rector\": \"^0.13.9\",\n \"vimeo/psalm\": \"^4.25\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-1.x\": \"1.x-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"phpDocumentor\\\\Reflection\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Mike van Riel\",\n \"email\": \"me@mikevanriel.com\"\n }\n ],\n \"description\": \"A PSR-5 based resolver of Class names, Types and Structural Element Names\",\n \"support\": {\n \"issues\": \"https://github.com/phpDocumentor/TypeResolver/issues\",\n \"source\": \"https://github.com/phpDocumentor/TypeResolver/tree/1.10.0\"\n },\n \"time\": \"2024-11-09T15:12:26+00:00\"\n },\n {\n \"name\": \"phpstan/phpdoc-parser\",\n \"version\": \"2.3.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/phpstan/phpdoc-parser.git\",\n \"reference\": \"1e0cd5370df5dd2e556a36b9c62f62e555870495\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/phpstan/phpdoc-parser/zipball/1e0cd5370df5dd2e556a36b9c62f62e555870495\",\n \"reference\": \"1e0cd5370df5dd2e556a36b9c62f62e555870495\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \"^7.4 || ^8.0\"\n },\n \"require-dev\": {\n \"doctrine/annotations\": \"^2.0\",\n \"nikic/php-parser\": \"^5.3.0\",\n \"php-parallel-lint/php-parallel-lint\": \"^1.2\",\n \"phpstan/extension-installer\": \"^1.0\",\n \"phpstan/phpstan\": \"^2.0\",\n \"phpstan/phpstan-phpunit\": \"^2.0\",\n \"phpstan/phpstan-strict-rules\": \"^2.0\",\n \"phpunit/phpunit\": \"^9.6\",\n \"symfony/process\": \"^5.2\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"PHPStan\\\\PhpDocParser\\\\\": [\n \"src/\"\n ]\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"description\": \"PHPDoc parser with support for nullable, intersection and generic types\",\n \"support\": {\n \"issues\": \"https://github.com/phpstan/phpdoc-parser/issues\",\n \"source\": \"https://github.com/phpstan/phpdoc-parser/tree/2.3.0\"\n },\n \"time\": \"2025-08-30T15:50:23+00:00\"\n },\n {\n \"name\": \"phpstan/phpstan\",\n \"version\": \"2.1.22\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/phpstan/phpstan.git\",\n \"reference\": \"41600c8379eb5aee63e9413fe9e97273e25d57e4\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/phpstan/phpstan/zipball/41600c8379eb5aee63e9413fe9e97273e25d57e4\",\n \"reference\": \"41600c8379eb5aee63e9413fe9e97273e25d57e4\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \"^7.4|^8.0\"\n },\n \"conflict\": {\n \"phpstan/phpstan-shim\": \"*\"\n },\n \"bin\": [\n \"phpstan\",\n \"phpstan.phar\"\n ],\n \"type\": \"library\",\n \"autoload\": {\n \"files\": [\n \"bootstrap.php\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"description\": \"PHPStan - PHP Static Analysis Tool\",\n \"keywords\": [\n \"dev\",\n \"static analysis\"\n ],\n \"support\": {\n \"docs\": \"https://phpstan.org/user-guide/getting-started\",\n \"forum\": \"https://github.com/phpstan/phpstan/discussions\",\n \"issues\": \"https://github.com/phpstan/phpstan/issues\",\n \"security\": \"https://github.com/phpstan/phpstan/security/policy\",\n \"source\": \"https://github.com/phpstan/phpstan-src\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/ondrejmirtes\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://github.com/phpstan\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2025-08-04T19:17:37+00:00\"\n },\n {\n \"name\": \"phpunit/php-code-coverage\",\n \"version\": \"11.0.12\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/sebastianbergmann/php-code-coverage.git\",\n \"reference\": \"2c1ed04922802c15e1de5d7447b4856de949cf56\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/2c1ed04922802c15e1de5d7447b4856de949cf56\",\n \"reference\": \"2c1ed04922802c15e1de5d7447b4856de949cf56\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"ext-dom\": \"*\",\n \"ext-libxml\": \"*\",\n \"ext-xmlwriter\": \"*\",\n \"nikic/php-parser\": \"^5.7.0\",\n \"php\": \">=8.2\",\n \"phpunit/php-file-iterator\": \"^5.1.0\",\n \"phpunit/php-text-template\": \"^4.0.1\",\n \"sebastian/code-unit-reverse-lookup\": \"^4.0.1\",\n \"sebastian/complexity\": \"^4.0.1\",\n \"sebastian/environment\": \"^7.2.1\",\n \"sebastian/lines-of-code\": \"^3.0.1\",\n \"sebastian/version\": \"^5.0.2\",\n \"theseer/tokenizer\": \"^1.3.1\"\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \"^11.5.46\"\n },\n \"suggest\": {\n \"ext-pcov\": \"PHP extension that provides line coverage\",\n \"ext-xdebug\": \"PHP extension that provides line coverage as well as branch and path coverage\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-main\": \"11.0.x-dev\"\n }\n },\n \"autoload\": {\n \"classmap\": [\n \"src/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"BSD-3-Clause\"\n ],\n \"authors\": [\n {\n \"name\": \"Sebastian Bergmann\",\n \"email\": \"sebastian@phpunit.de\",\n \"role\": \"lead\"\n }\n ],\n \"description\": \"Library that provides collection, processing, and rendering functionality for PHP code coverage information.\",\n \"homepage\": \"https://github.com/sebastianbergmann/php-code-coverage\",\n \"keywords\": [\n \"coverage\",\n \"testing\",\n \"xunit\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/sebastianbergmann/php-code-coverage/issues\",\n \"security\": \"https://github.com/sebastianbergmann/php-code-coverage/security/policy\",\n \"source\": \"https://github.com/sebastianbergmann/php-code-coverage/tree/11.0.12\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/sebastianbergmann\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://liberapay.com/sebastianbergmann\",\n \"type\": \"liberapay\"\n },\n {\n \"url\": \"https://thanks.dev/u/gh/sebastianbergmann\",\n \"type\": \"thanks_dev\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/phpunit/php-code-coverage\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2025-12-24T07:01:01+00:00\"\n },\n {\n \"name\": \"phpunit/php-file-iterator\",\n \"version\": \"5.1.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/sebastianbergmann/php-file-iterator.git\",\n \"reference\": \"2f3a64888c814fc235386b7387dd5b5ed92ad903\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/2f3a64888c814fc235386b7387dd5b5ed92ad903\",\n \"reference\": \"2f3a64888c814fc235386b7387dd5b5ed92ad903\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.2\"\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \"^11.3\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-main\": \"5.1-dev\"\n }\n },\n \"autoload\": {\n \"classmap\": [\n \"src/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"BSD-3-Clause\"\n ],\n \"authors\": [\n {\n \"name\": \"Sebastian Bergmann\",\n \"email\": \"sebastian@phpunit.de\",\n \"role\": \"lead\"\n }\n ],\n \"description\": \"FilterIterator implementation that filters files based on a list of suffixes.\",\n \"homepage\": \"https://github.com/sebastianbergmann/php-file-iterator/\",\n \"keywords\": [\n \"filesystem\",\n \"iterator\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/sebastianbergmann/php-file-iterator/issues\",\n \"security\": \"https://github.com/sebastianbergmann/php-file-iterator/security/policy\",\n \"source\": \"https://github.com/sebastianbergmann/php-file-iterator/tree/5.1.1\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/sebastianbergmann\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://liberapay.com/sebastianbergmann\",\n \"type\": \"liberapay\"\n },\n {\n \"url\": \"https://thanks.dev/u/gh/sebastianbergmann\",\n \"type\": \"thanks_dev\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/phpunit/php-file-iterator\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2026-02-02T13:52:54+00:00\"\n },\n {\n \"name\": \"phpunit/php-invoker\",\n \"version\": \"5.0.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/sebastianbergmann/php-invoker.git\",\n \"reference\": \"c1ca3814734c07492b3d4c5f794f4b0995333da2\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/c1ca3814734c07492b3d4c5f794f4b0995333da2\",\n \"reference\": \"c1ca3814734c07492b3d4c5f794f4b0995333da2\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.2\"\n },\n \"require-dev\": {\n \"ext-pcntl\": \"*\",\n \"phpunit/phpunit\": \"^11.0\"\n },\n \"suggest\": {\n \"ext-pcntl\": \"*\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-main\": \"5.0-dev\"\n }\n },\n \"autoload\": {\n \"classmap\": [\n \"src/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"BSD-3-Clause\"\n ],\n \"authors\": [\n {\n \"name\": \"Sebastian Bergmann\",\n \"email\": \"sebastian@phpunit.de\",\n \"role\": \"lead\"\n }\n ],\n \"description\": \"Invoke callables with a timeout\",\n \"homepage\": \"https://github.com/sebastianbergmann/php-invoker/\",\n \"keywords\": [\n \"process\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/sebastianbergmann/php-invoker/issues\",\n \"security\": \"https://github.com/sebastianbergmann/php-invoker/security/policy\",\n \"source\": \"https://github.com/sebastianbergmann/php-invoker/tree/5.0.1\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/sebastianbergmann\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2024-07-03T05:07:44+00:00\"\n },\n {\n \"name\": \"phpunit/php-text-template\",\n \"version\": \"4.0.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/sebastianbergmann/php-text-template.git\",\n \"reference\": \"3e0404dc6b300e6bf56415467ebcb3fe4f33e964\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/3e0404dc6b300e6bf56415467ebcb3fe4f33e964\",\n \"reference\": \"3e0404dc6b300e6bf56415467ebcb3fe4f33e964\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.2\"\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \"^11.0\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-main\": \"4.0-dev\"\n }\n },\n \"autoload\": {\n \"classmap\": [\n \"src/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"BSD-3-Clause\"\n ],\n \"authors\": [\n {\n \"name\": \"Sebastian Bergmann\",\n \"email\": \"sebastian@phpunit.de\",\n \"role\": \"lead\"\n }\n ],\n \"description\": \"Simple template engine.\",\n \"homepage\": \"https://github.com/sebastianbergmann/php-text-template/\",\n \"keywords\": [\n \"template\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/sebastianbergmann/php-text-template/issues\",\n \"security\": \"https://github.com/sebastianbergmann/php-text-template/security/policy\",\n \"source\": \"https://github.com/sebastianbergmann/php-text-template/tree/4.0.1\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/sebastianbergmann\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2024-07-03T05:08:43+00:00\"\n },\n {\n \"name\": \"phpunit/php-timer\",\n \"version\": \"7.0.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/sebastianbergmann/php-timer.git\",\n \"reference\": \"3b415def83fbcb41f991d9ebf16ae4ad8b7837b3\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/sebastianbergmann/php-timer/zipball/3b415def83fbcb41f991d9ebf16ae4ad8b7837b3\",\n \"reference\": \"3b415def83fbcb41f991d9ebf16ae4ad8b7837b3\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.2\"\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \"^11.0\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-main\": \"7.0-dev\"\n }\n },\n \"autoload\": {\n \"classmap\": [\n \"src/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"BSD-3-Clause\"\n ],\n \"authors\": [\n {\n \"name\": \"Sebastian Bergmann\",\n \"email\": \"sebastian@phpunit.de\",\n \"role\": \"lead\"\n }\n ],\n \"description\": \"Utility class for timing\",\n \"homepage\": \"https://github.com/sebastianbergmann/php-timer/\",\n \"keywords\": [\n \"timer\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/sebastianbergmann/php-timer/issues\",\n \"security\": \"https://github.com/sebastianbergmann/php-timer/security/policy\",\n \"source\": \"https://github.com/sebastianbergmann/php-timer/tree/7.0.1\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/sebastianbergmann\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2024-07-03T05:09:35+00:00\"\n },\n {\n \"name\": \"phpunit/phpunit\",\n \"version\": \"11.5.55\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/sebastianbergmann/phpunit.git\",\n \"reference\": \"adc7262fccc12de2b30f12a8aa0b33775d814f00\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/sebastianbergmann/phpunit/zipball/adc7262fccc12de2b30f12a8aa0b33775d814f00\",\n \"reference\": \"adc7262fccc12de2b30f12a8aa0b33775d814f00\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"ext-dom\": \"*\",\n \"ext-json\": \"*\",\n \"ext-libxml\": \"*\",\n \"ext-mbstring\": \"*\",\n \"ext-xml\": \"*\",\n \"ext-xmlwriter\": \"*\",\n \"myclabs/deep-copy\": \"^1.13.4\",\n \"phar-io/manifest\": \"^2.0.4\",\n \"phar-io/version\": \"^3.2.1\",\n \"php\": \">=8.2\",\n \"phpunit/php-code-coverage\": \"^11.0.12\",\n \"phpunit/php-file-iterator\": \"^5.1.1\",\n \"phpunit/php-invoker\": \"^5.0.1\",\n \"phpunit/php-text-template\": \"^4.0.1\",\n \"phpunit/php-timer\": \"^7.0.1\",\n \"sebastian/cli-parser\": \"^3.0.2\",\n \"sebastian/code-unit\": \"^3.0.3\",\n \"sebastian/comparator\": \"^6.3.3\",\n \"sebastian/diff\": \"^6.0.2\",\n \"sebastian/environment\": \"^7.2.1\",\n \"sebastian/exporter\": \"^6.3.2\",\n \"sebastian/global-state\": \"^7.0.2\",\n \"sebastian/object-enumerator\": \"^6.0.1\",\n \"sebastian/recursion-context\": \"^6.0.3\",\n \"sebastian/type\": \"^5.1.3\",\n \"sebastian/version\": \"^5.0.2\",\n \"staabm/side-effects-detector\": \"^1.0.5\"\n },\n \"suggest\": {\n \"ext-soap\": \"To be able to generate mocks based on WSDL files\"\n },\n \"bin\": [\n \"phpunit\"\n ],\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-main\": \"11.5-dev\"\n }\n },\n \"autoload\": {\n \"files\": [\n \"src/Framework/Assert/Functions.php\"\n ],\n \"classmap\": [\n \"src/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"BSD-3-Clause\"\n ],\n \"authors\": [\n {\n \"name\": \"Sebastian Bergmann\",\n \"email\": \"sebastian@phpunit.de\",\n \"role\": \"lead\"\n }\n ],\n \"description\": \"The PHP Unit Testing framework.\",\n \"homepage\": \"https://phpunit.de/\",\n \"keywords\": [\n \"phpunit\",\n \"testing\",\n \"xunit\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/sebastianbergmann/phpunit/issues\",\n \"security\": \"https://github.com/sebastianbergmann/phpunit/security/policy\",\n \"source\": \"https://github.com/sebastianbergmann/phpunit/tree/11.5.55\"\n },\n \"funding\": [\n {\n \"url\": \"https://phpunit.de/sponsors.html\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/sebastianbergmann\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://liberapay.com/sebastianbergmann\",\n \"type\": \"liberapay\"\n },\n {\n \"url\": \"https://thanks.dev/u/gh/sebastianbergmann\",\n \"type\": \"thanks_dev\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/phpunit/phpunit\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2026-02-18T12:37:06+00:00\"\n },\n {\n \"name\": \"react/child-process\",\n \"version\": \"v0.6.6\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/reactphp/child-process.git\",\n \"reference\": \"1721e2b93d89b745664353b9cfc8f155ba8a6159\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/reactphp/child-process/zipball/1721e2b93d89b745664353b9cfc8f155ba8a6159\",\n \"reference\": \"1721e2b93d89b745664353b9cfc8f155ba8a6159\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"evenement/evenement\": \"^3.0 || ^2.0 || ^1.0\",\n \"php\": \">=5.3.0\",\n \"react/event-loop\": \"^1.2\",\n \"react/stream\": \"^1.4\"\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \"^9.6 || ^5.7 || ^4.8.36\",\n \"react/socket\": \"^1.16\",\n \"sebastian/environment\": \"^5.0 || ^3.0 || ^2.0 || ^1.0\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"React\\\\ChildProcess\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Christian Lück\",\n \"email\": \"christian@clue.engineering\",\n \"homepage\": \"https://clue.engineering/\"\n },\n {\n \"name\": \"Cees-Jan Kiewiet\",\n \"email\": \"reactphp@ceesjankiewiet.nl\",\n \"homepage\": \"https://wyrihaximus.net/\"\n },\n {\n \"name\": \"Jan Sorgalla\",\n \"email\": \"jsorgalla@gmail.com\",\n \"homepage\": \"https://sorgalla.com/\"\n },\n {\n \"name\": \"Chris Boden\",\n \"email\": \"cboden@gmail.com\",\n \"homepage\": \"https://cboden.dev/\"\n }\n ],\n \"description\": \"Event-driven library for executing child processes with ReactPHP.\",\n \"keywords\": [\n \"event-driven\",\n \"process\",\n \"reactphp\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/reactphp/child-process/issues\",\n \"source\": \"https://github.com/reactphp/child-process/tree/v0.6.6\"\n },\n \"funding\": [\n {\n \"url\": \"https://opencollective.com/reactphp\",\n \"type\": \"open_collective\"\n }\n ],\n \"time\": \"2025-01-01T16:37:48+00:00\"\n },\n {\n \"name\": \"revolt/event-loop\",\n \"version\": \"v1.0.7\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/revoltphp/event-loop.git\",\n \"reference\": \"09bf1bf7f7f574453efe43044b06fafe12216eb3\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/revoltphp/event-loop/zipball/09bf1bf7f7f574453efe43044b06fafe12216eb3\",\n \"reference\": \"09bf1bf7f7f574453efe43044b06fafe12216eb3\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.1\"\n },\n \"require-dev\": {\n \"ext-json\": \"*\",\n \"jetbrains/phpstorm-stubs\": \"^2019.3\",\n \"phpunit/phpunit\": \"^9\",\n \"psalm/phar\": \"^5.15\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-main\": \"1.x-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Revolt\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Aaron Piotrowski\",\n \"email\": \"aaron@trowski.com\"\n },\n {\n \"name\": \"Cees-Jan Kiewiet\",\n \"email\": \"ceesjank@gmail.com\"\n },\n {\n \"name\": \"Christian Lück\",\n \"email\": \"christian@clue.engineering\"\n },\n {\n \"name\": \"Niklas Keller\",\n \"email\": \"me@kelunik.com\"\n }\n ],\n \"description\": \"Rock-solid event loop for concurrent PHP applications.\",\n \"keywords\": [\n \"async\",\n \"asynchronous\",\n \"concurrency\",\n \"event\",\n \"event-loop\",\n \"non-blocking\",\n \"scheduler\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/revoltphp/event-loop/issues\",\n \"source\": \"https://github.com/revoltphp/event-loop/tree/v1.0.7\"\n },\n \"time\": \"2025-01-25T19:27:39+00:00\"\n },\n {\n \"name\": \"sanmai/later\",\n \"version\": \"0.1.7\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/sanmai/later.git\",\n \"reference\": \"72a82d783864bca90412d8a26c1878f8981fee97\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/sanmai/later/zipball/72a82d783864bca90412d8a26c1878f8981fee97\",\n \"reference\": \"72a82d783864bca90412d8a26c1878f8981fee97\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.2\"\n },\n \"require-dev\": {\n \"ergebnis/composer-normalize\": \"^2.8\",\n \"friendsofphp/php-cs-fixer\": \"^3.35.1\",\n \"infection/infection\": \">=0.27.6\",\n \"phan/phan\": \">=2\",\n \"php-coveralls/php-coveralls\": \"^2.0\",\n \"phpstan/phpstan\": \">=1.4.5\",\n \"phpunit/phpunit\": \">=9.5 <10\",\n \"vimeo/psalm\": \">=2\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-main\": \"0.1.x-dev\"\n }\n },\n \"autoload\": {\n \"files\": [\n \"src/functions.php\"\n ],\n \"psr-4\": {\n \"Later\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"Apache-2.0\"\n ],\n \"authors\": [\n {\n \"name\": \"Alexey Kopytko\",\n \"email\": \"alexey@kopytko.com\"\n }\n ],\n \"description\": \"Later: deferred wrapper object\",\n \"support\": {\n \"issues\": \"https://github.com/sanmai/later/issues\",\n \"source\": \"https://github.com/sanmai/later/tree/0.1.7\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/sanmai\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2025-05-11T01:48:00+00:00\"\n },\n {\n \"name\": \"sanmai/pipeline\",\n \"version\": \"6.22\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/sanmai/pipeline.git\",\n \"reference\": \"fb8d0c23b4ef085315a36d397fafa052203020ce\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/sanmai/pipeline/zipball/fb8d0c23b4ef085315a36d397fafa052203020ce\",\n \"reference\": \"fb8d0c23b4ef085315a36d397fafa052203020ce\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.2\"\n },\n \"require-dev\": {\n \"ergebnis/composer-normalize\": \"^2.8\",\n \"esi/phpunit-coverage-check\": \">2\",\n \"friendsofphp/php-cs-fixer\": \"^3.17\",\n \"infection/infection\": \">=0.30.3\",\n \"league/pipeline\": \"^0.3 || ^1.0\",\n \"php-coveralls/php-coveralls\": \"^2.4.1\",\n \"phpstan/extension-installer\": \"^1.4\",\n \"phpstan/phpstan\": \"^2\",\n \"phpunit/phpunit\": \">=9.4 <12\",\n \"sanmai/phpstan-rules\": \"^0.3.0\",\n \"sanmai/phpunit-double-colon-syntax\": \"^0.1.1\",\n \"vimeo/psalm\": \">=2\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-main\": \"v6.x-dev\"\n }\n },\n \"autoload\": {\n \"files\": [\n \"src/functions.php\"\n ],\n \"psr-4\": {\n \"Pipeline\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"Apache-2.0\"\n ],\n \"authors\": [\n {\n \"name\": \"Alexey Kopytko\",\n \"email\": \"alexey@kopytko.com\"\n }\n ],\n \"description\": \"General-purpose collections pipeline\",\n \"support\": {\n \"issues\": \"https://github.com/sanmai/pipeline/issues\",\n \"source\": \"https://github.com/sanmai/pipeline/tree/6.22\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/sanmai\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2025-07-22T09:07:07+00:00\"\n },\n {\n \"name\": \"sebastian/cli-parser\",\n \"version\": \"3.0.2\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/sebastianbergmann/cli-parser.git\",\n \"reference\": \"15c5dd40dc4f38794d383bb95465193f5e0ae180\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/15c5dd40dc4f38794d383bb95465193f5e0ae180\",\n \"reference\": \"15c5dd40dc4f38794d383bb95465193f5e0ae180\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.2\"\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \"^11.0\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-main\": \"3.0-dev\"\n }\n },\n \"autoload\": {\n \"classmap\": [\n \"src/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"BSD-3-Clause\"\n ],\n \"authors\": [\n {\n \"name\": \"Sebastian Bergmann\",\n \"email\": \"sebastian@phpunit.de\",\n \"role\": \"lead\"\n }\n ],\n \"description\": \"Library for parsing CLI options\",\n \"homepage\": \"https://github.com/sebastianbergmann/cli-parser\",\n \"support\": {\n \"issues\": \"https://github.com/sebastianbergmann/cli-parser/issues\",\n \"security\": \"https://github.com/sebastianbergmann/cli-parser/security/policy\",\n \"source\": \"https://github.com/sebastianbergmann/cli-parser/tree/3.0.2\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/sebastianbergmann\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2024-07-03T04:41:36+00:00\"\n },\n {\n \"name\": \"sebastian/code-unit\",\n \"version\": \"3.0.3\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/sebastianbergmann/code-unit.git\",\n \"reference\": \"54391c61e4af8078e5b276ab082b6d3c54c9ad64\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/sebastianbergmann/code-unit/zipball/54391c61e4af8078e5b276ab082b6d3c54c9ad64\",\n \"reference\": \"54391c61e4af8078e5b276ab082b6d3c54c9ad64\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.2\"\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \"^11.5\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-main\": \"3.0-dev\"\n }\n },\n \"autoload\": {\n \"classmap\": [\n \"src/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"BSD-3-Clause\"\n ],\n \"authors\": [\n {\n \"name\": \"Sebastian Bergmann\",\n \"email\": \"sebastian@phpunit.de\",\n \"role\": \"lead\"\n }\n ],\n \"description\": \"Collection of value objects that represent the PHP code units\",\n \"homepage\": \"https://github.com/sebastianbergmann/code-unit\",\n \"support\": {\n \"issues\": \"https://github.com/sebastianbergmann/code-unit/issues\",\n \"security\": \"https://github.com/sebastianbergmann/code-unit/security/policy\",\n \"source\": \"https://github.com/sebastianbergmann/code-unit/tree/3.0.3\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/sebastianbergmann\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2025-03-19T07:56:08+00:00\"\n },\n {\n \"name\": \"sebastian/code-unit-reverse-lookup\",\n \"version\": \"4.0.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/sebastianbergmann/code-unit-reverse-lookup.git\",\n \"reference\": \"183a9b2632194febd219bb9246eee421dad8d45e\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/183a9b2632194febd219bb9246eee421dad8d45e\",\n \"reference\": \"183a9b2632194febd219bb9246eee421dad8d45e\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.2\"\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \"^11.0\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-main\": \"4.0-dev\"\n }\n },\n \"autoload\": {\n \"classmap\": [\n \"src/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"BSD-3-Clause\"\n ],\n \"authors\": [\n {\n \"name\": \"Sebastian Bergmann\",\n \"email\": \"sebastian@phpunit.de\"\n }\n ],\n \"description\": \"Looks up which function or method a line of code belongs to\",\n \"homepage\": \"https://github.com/sebastianbergmann/code-unit-reverse-lookup/\",\n \"support\": {\n \"issues\": \"https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues\",\n \"security\": \"https://github.com/sebastianbergmann/code-unit-reverse-lookup/security/policy\",\n \"source\": \"https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/4.0.1\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/sebastianbergmann\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2024-07-03T04:45:54+00:00\"\n },\n {\n \"name\": \"sebastian/comparator\",\n \"version\": \"6.3.3\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/sebastianbergmann/comparator.git\",\n \"reference\": \"2c95e1e86cb8dd41beb8d502057d1081ccc8eca9\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/sebastianbergmann/comparator/zipball/2c95e1e86cb8dd41beb8d502057d1081ccc8eca9\",\n \"reference\": \"2c95e1e86cb8dd41beb8d502057d1081ccc8eca9\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"ext-dom\": \"*\",\n \"ext-mbstring\": \"*\",\n \"php\": \">=8.2\",\n \"sebastian/diff\": \"^6.0\",\n \"sebastian/exporter\": \"^6.0\"\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \"^11.4\"\n },\n \"suggest\": {\n \"ext-bcmath\": \"For comparing BcMath\\\\Number objects\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-main\": \"6.3-dev\"\n }\n },\n \"autoload\": {\n \"classmap\": [\n \"src/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"BSD-3-Clause\"\n ],\n \"authors\": [\n {\n \"name\": \"Sebastian Bergmann\",\n \"email\": \"sebastian@phpunit.de\"\n },\n {\n \"name\": \"Jeff Welch\",\n \"email\": \"whatthejeff@gmail.com\"\n },\n {\n \"name\": \"Volker Dusch\",\n \"email\": \"github@wallbash.com\"\n },\n {\n \"name\": \"Bernhard Schussek\",\n \"email\": \"bschussek@2bepublished.at\"\n }\n ],\n \"description\": \"Provides the functionality to compare PHP values for equality\",\n \"homepage\": \"https://github.com/sebastianbergmann/comparator\",\n \"keywords\": [\n \"comparator\",\n \"compare\",\n \"equality\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/sebastianbergmann/comparator/issues\",\n \"security\": \"https://github.com/sebastianbergmann/comparator/security/policy\",\n \"source\": \"https://github.com/sebastianbergmann/comparator/tree/6.3.3\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/sebastianbergmann\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://liberapay.com/sebastianbergmann\",\n \"type\": \"liberapay\"\n },\n {\n \"url\": \"https://thanks.dev/u/gh/sebastianbergmann\",\n \"type\": \"thanks_dev\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/sebastian/comparator\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2026-01-24T09:26:40+00:00\"\n },\n {\n \"name\": \"sebastian/complexity\",\n \"version\": \"4.0.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/sebastianbergmann/complexity.git\",\n \"reference\": \"ee41d384ab1906c68852636b6de493846e13e5a0\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/sebastianbergmann/complexity/zipball/ee41d384ab1906c68852636b6de493846e13e5a0\",\n \"reference\": \"ee41d384ab1906c68852636b6de493846e13e5a0\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"nikic/php-parser\": \"^5.0\",\n \"php\": \">=8.2\"\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \"^11.0\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-main\": \"4.0-dev\"\n }\n },\n \"autoload\": {\n \"classmap\": [\n \"src/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"BSD-3-Clause\"\n ],\n \"authors\": [\n {\n \"name\": \"Sebastian Bergmann\",\n \"email\": \"sebastian@phpunit.de\",\n \"role\": \"lead\"\n }\n ],\n \"description\": \"Library for calculating the complexity of PHP code units\",\n \"homepage\": \"https://github.com/sebastianbergmann/complexity\",\n \"support\": {\n \"issues\": \"https://github.com/sebastianbergmann/complexity/issues\",\n \"security\": \"https://github.com/sebastianbergmann/complexity/security/policy\",\n \"source\": \"https://github.com/sebastianbergmann/complexity/tree/4.0.1\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/sebastianbergmann\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2024-07-03T04:49:50+00:00\"\n },\n {\n \"name\": \"sebastian/diff\",\n \"version\": \"6.0.2\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/sebastianbergmann/diff.git\",\n \"reference\": \"b4ccd857127db5d41a5b676f24b51371d76d8544\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/sebastianbergmann/diff/zipball/b4ccd857127db5d41a5b676f24b51371d76d8544\",\n \"reference\": \"b4ccd857127db5d41a5b676f24b51371d76d8544\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.2\"\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \"^11.0\",\n \"symfony/process\": \"^4.2 || ^5\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-main\": \"6.0-dev\"\n }\n },\n \"autoload\": {\n \"classmap\": [\n \"src/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"BSD-3-Clause\"\n ],\n \"authors\": [\n {\n \"name\": \"Sebastian Bergmann\",\n \"email\": \"sebastian@phpunit.de\"\n },\n {\n \"name\": \"Kore Nordmann\",\n \"email\": \"mail@kore-nordmann.de\"\n }\n ],\n \"description\": \"Diff implementation\",\n \"homepage\": \"https://github.com/sebastianbergmann/diff\",\n \"keywords\": [\n \"diff\",\n \"udiff\",\n \"unidiff\",\n \"unified diff\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/sebastianbergmann/diff/issues\",\n \"security\": \"https://github.com/sebastianbergmann/diff/security/policy\",\n \"source\": \"https://github.com/sebastianbergmann/diff/tree/6.0.2\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/sebastianbergmann\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2024-07-03T04:53:05+00:00\"\n },\n {\n \"name\": \"sebastian/environment\",\n \"version\": \"7.2.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/sebastianbergmann/environment.git\",\n \"reference\": \"a5c75038693ad2e8d4b6c15ba2403532647830c4\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/sebastianbergmann/environment/zipball/a5c75038693ad2e8d4b6c15ba2403532647830c4\",\n \"reference\": \"a5c75038693ad2e8d4b6c15ba2403532647830c4\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.2\"\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \"^11.3\"\n },\n \"suggest\": {\n \"ext-posix\": \"*\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-main\": \"7.2-dev\"\n }\n },\n \"autoload\": {\n \"classmap\": [\n \"src/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"BSD-3-Clause\"\n ],\n \"authors\": [\n {\n \"name\": \"Sebastian Bergmann\",\n \"email\": \"sebastian@phpunit.de\"\n }\n ],\n \"description\": \"Provides functionality to handle HHVM/PHP environments\",\n \"homepage\": \"https://github.com/sebastianbergmann/environment\",\n \"keywords\": [\n \"Xdebug\",\n \"environment\",\n \"hhvm\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/sebastianbergmann/environment/issues\",\n \"security\": \"https://github.com/sebastianbergmann/environment/security/policy\",\n \"source\": \"https://github.com/sebastianbergmann/environment/tree/7.2.1\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/sebastianbergmann\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://liberapay.com/sebastianbergmann\",\n \"type\": \"liberapay\"\n },\n {\n \"url\": \"https://thanks.dev/u/gh/sebastianbergmann\",\n \"type\": \"thanks_dev\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/sebastian/environment\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2025-05-21T11:55:47+00:00\"\n },\n {\n \"name\": \"sebastian/exporter\",\n \"version\": \"6.3.2\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/sebastianbergmann/exporter.git\",\n \"reference\": \"70a298763b40b213ec087c51c739efcaa90bcd74\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/sebastianbergmann/exporter/zipball/70a298763b40b213ec087c51c739efcaa90bcd74\",\n \"reference\": \"70a298763b40b213ec087c51c739efcaa90bcd74\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"ext-mbstring\": \"*\",\n \"php\": \">=8.2\",\n \"sebastian/recursion-context\": \"^6.0\"\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \"^11.3\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-main\": \"6.3-dev\"\n }\n },\n \"autoload\": {\n \"classmap\": [\n \"src/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"BSD-3-Clause\"\n ],\n \"authors\": [\n {\n \"name\": \"Sebastian Bergmann\",\n \"email\": \"sebastian@phpunit.de\"\n },\n {\n \"name\": \"Jeff Welch\",\n \"email\": \"whatthejeff@gmail.com\"\n },\n {\n \"name\": \"Volker Dusch\",\n \"email\": \"github@wallbash.com\"\n },\n {\n \"name\": \"Adam Harvey\",\n \"email\": \"aharvey@php.net\"\n },\n {\n \"name\": \"Bernhard Schussek\",\n \"email\": \"bschussek@gmail.com\"\n }\n ],\n \"description\": \"Provides the functionality to export PHP variables for visualization\",\n \"homepage\": \"https://www.github.com/sebastianbergmann/exporter\",\n \"keywords\": [\n \"export\",\n \"exporter\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/sebastianbergmann/exporter/issues\",\n \"security\": \"https://github.com/sebastianbergmann/exporter/security/policy\",\n \"source\": \"https://github.com/sebastianbergmann/exporter/tree/6.3.2\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/sebastianbergmann\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://liberapay.com/sebastianbergmann\",\n \"type\": \"liberapay\"\n },\n {\n \"url\": \"https://thanks.dev/u/gh/sebastianbergmann\",\n \"type\": \"thanks_dev\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/sebastian/exporter\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2025-09-24T06:12:51+00:00\"\n },\n {\n \"name\": \"sebastian/global-state\",\n \"version\": \"7.0.2\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/sebastianbergmann/global-state.git\",\n \"reference\": \"3be331570a721f9a4b5917f4209773de17f747d7\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/sebastianbergmann/global-state/zipball/3be331570a721f9a4b5917f4209773de17f747d7\",\n \"reference\": \"3be331570a721f9a4b5917f4209773de17f747d7\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.2\",\n \"sebastian/object-reflector\": \"^4.0\",\n \"sebastian/recursion-context\": \"^6.0\"\n },\n \"require-dev\": {\n \"ext-dom\": \"*\",\n \"phpunit/phpunit\": \"^11.0\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-main\": \"7.0-dev\"\n }\n },\n \"autoload\": {\n \"classmap\": [\n \"src/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"BSD-3-Clause\"\n ],\n \"authors\": [\n {\n \"name\": \"Sebastian Bergmann\",\n \"email\": \"sebastian@phpunit.de\"\n }\n ],\n \"description\": \"Snapshotting of global state\",\n \"homepage\": \"https://www.github.com/sebastianbergmann/global-state\",\n \"keywords\": [\n \"global state\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/sebastianbergmann/global-state/issues\",\n \"security\": \"https://github.com/sebastianbergmann/global-state/security/policy\",\n \"source\": \"https://github.com/sebastianbergmann/global-state/tree/7.0.2\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/sebastianbergmann\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2024-07-03T04:57:36+00:00\"\n },\n {\n \"name\": \"sebastian/lines-of-code\",\n \"version\": \"3.0.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/sebastianbergmann/lines-of-code.git\",\n \"reference\": \"d36ad0d782e5756913e42ad87cb2890f4ffe467a\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/d36ad0d782e5756913e42ad87cb2890f4ffe467a\",\n \"reference\": \"d36ad0d782e5756913e42ad87cb2890f4ffe467a\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"nikic/php-parser\": \"^5.0\",\n \"php\": \">=8.2\"\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \"^11.0\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-main\": \"3.0-dev\"\n }\n },\n \"autoload\": {\n \"classmap\": [\n \"src/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"BSD-3-Clause\"\n ],\n \"authors\": [\n {\n \"name\": \"Sebastian Bergmann\",\n \"email\": \"sebastian@phpunit.de\",\n \"role\": \"lead\"\n }\n ],\n \"description\": \"Library for counting the lines of code in PHP source code\",\n \"homepage\": \"https://github.com/sebastianbergmann/lines-of-code\",\n \"support\": {\n \"issues\": \"https://github.com/sebastianbergmann/lines-of-code/issues\",\n \"security\": \"https://github.com/sebastianbergmann/lines-of-code/security/policy\",\n \"source\": \"https://github.com/sebastianbergmann/lines-of-code/tree/3.0.1\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/sebastianbergmann\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2024-07-03T04:58:38+00:00\"\n },\n {\n \"name\": \"sebastian/object-enumerator\",\n \"version\": \"6.0.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/sebastianbergmann/object-enumerator.git\",\n \"reference\": \"f5b498e631a74204185071eb41f33f38d64608aa\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/f5b498e631a74204185071eb41f33f38d64608aa\",\n \"reference\": \"f5b498e631a74204185071eb41f33f38d64608aa\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.2\",\n \"sebastian/object-reflector\": \"^4.0\",\n \"sebastian/recursion-context\": \"^6.0\"\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \"^11.0\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-main\": \"6.0-dev\"\n }\n },\n \"autoload\": {\n \"classmap\": [\n \"src/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"BSD-3-Clause\"\n ],\n \"authors\": [\n {\n \"name\": \"Sebastian Bergmann\",\n \"email\": \"sebastian@phpunit.de\"\n }\n ],\n \"description\": \"Traverses array structures and object graphs to enumerate all referenced objects\",\n \"homepage\": \"https://github.com/sebastianbergmann/object-enumerator/\",\n \"support\": {\n \"issues\": \"https://github.com/sebastianbergmann/object-enumerator/issues\",\n \"security\": \"https://github.com/sebastianbergmann/object-enumerator/security/policy\",\n \"source\": \"https://github.com/sebastianbergmann/object-enumerator/tree/6.0.1\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/sebastianbergmann\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2024-07-03T05:00:13+00:00\"\n },\n {\n \"name\": \"sebastian/object-reflector\",\n \"version\": \"4.0.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/sebastianbergmann/object-reflector.git\",\n \"reference\": \"6e1a43b411b2ad34146dee7524cb13a068bb35f9\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/6e1a43b411b2ad34146dee7524cb13a068bb35f9\",\n \"reference\": \"6e1a43b411b2ad34146dee7524cb13a068bb35f9\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.2\"\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \"^11.0\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-main\": \"4.0-dev\"\n }\n },\n \"autoload\": {\n \"classmap\": [\n \"src/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"BSD-3-Clause\"\n ],\n \"authors\": [\n {\n \"name\": \"Sebastian Bergmann\",\n \"email\": \"sebastian@phpunit.de\"\n }\n ],\n \"description\": \"Allows reflection of object attributes, including inherited and non-public ones\",\n \"homepage\": \"https://github.com/sebastianbergmann/object-reflector/\",\n \"support\": {\n \"issues\": \"https://github.com/sebastianbergmann/object-reflector/issues\",\n \"security\": \"https://github.com/sebastianbergmann/object-reflector/security/policy\",\n \"source\": \"https://github.com/sebastianbergmann/object-reflector/tree/4.0.1\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/sebastianbergmann\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2024-07-03T05:01:32+00:00\"\n },\n {\n \"name\": \"sebastian/recursion-context\",\n \"version\": \"6.0.3\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/sebastianbergmann/recursion-context.git\",\n \"reference\": \"f6458abbf32a6c8174f8f26261475dc133b3d9dc\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/f6458abbf32a6c8174f8f26261475dc133b3d9dc\",\n \"reference\": \"f6458abbf32a6c8174f8f26261475dc133b3d9dc\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.2\"\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \"^11.3\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-main\": \"6.0-dev\"\n }\n },\n \"autoload\": {\n \"classmap\": [\n \"src/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"BSD-3-Clause\"\n ],\n \"authors\": [\n {\n \"name\": \"Sebastian Bergmann\",\n \"email\": \"sebastian@phpunit.de\"\n },\n {\n \"name\": \"Jeff Welch\",\n \"email\": \"whatthejeff@gmail.com\"\n },\n {\n \"name\": \"Adam Harvey\",\n \"email\": \"aharvey@php.net\"\n }\n ],\n \"description\": \"Provides functionality to recursively process PHP variables\",\n \"homepage\": \"https://github.com/sebastianbergmann/recursion-context\",\n \"support\": {\n \"issues\": \"https://github.com/sebastianbergmann/recursion-context/issues\",\n \"security\": \"https://github.com/sebastianbergmann/recursion-context/security/policy\",\n \"source\": \"https://github.com/sebastianbergmann/recursion-context/tree/6.0.3\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/sebastianbergmann\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://liberapay.com/sebastianbergmann\",\n \"type\": \"liberapay\"\n },\n {\n \"url\": \"https://thanks.dev/u/gh/sebastianbergmann\",\n \"type\": \"thanks_dev\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/sebastian/recursion-context\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2025-08-13T04:42:22+00:00\"\n },\n {\n \"name\": \"sebastian/type\",\n \"version\": \"5.1.3\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/sebastianbergmann/type.git\",\n \"reference\": \"f77d2d4e78738c98d9a68d2596fe5e8fa380f449\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/sebastianbergmann/type/zipball/f77d2d4e78738c98d9a68d2596fe5e8fa380f449\",\n \"reference\": \"f77d2d4e78738c98d9a68d2596fe5e8fa380f449\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.2\"\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \"^11.3\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-main\": \"5.1-dev\"\n }\n },\n \"autoload\": {\n \"classmap\": [\n \"src/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"BSD-3-Clause\"\n ],\n \"authors\": [\n {\n \"name\": \"Sebastian Bergmann\",\n \"email\": \"sebastian@phpunit.de\",\n \"role\": \"lead\"\n }\n ],\n \"description\": \"Collection of value objects that represent the types of the PHP type system\",\n \"homepage\": \"https://github.com/sebastianbergmann/type\",\n \"support\": {\n \"issues\": \"https://github.com/sebastianbergmann/type/issues\",\n \"security\": \"https://github.com/sebastianbergmann/type/security/policy\",\n \"source\": \"https://github.com/sebastianbergmann/type/tree/5.1.3\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/sebastianbergmann\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://liberapay.com/sebastianbergmann\",\n \"type\": \"liberapay\"\n },\n {\n \"url\": \"https://thanks.dev/u/gh/sebastianbergmann\",\n \"type\": \"thanks_dev\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/sebastian/type\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2025-08-09T06:55:48+00:00\"\n },\n {\n \"name\": \"sebastian/version\",\n \"version\": \"5.0.2\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/sebastianbergmann/version.git\",\n \"reference\": \"c687e3387b99f5b03b6caa64c74b63e2936ff874\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/sebastianbergmann/version/zipball/c687e3387b99f5b03b6caa64c74b63e2936ff874\",\n \"reference\": \"c687e3387b99f5b03b6caa64c74b63e2936ff874\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.2\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-main\": \"5.0-dev\"\n }\n },\n \"autoload\": {\n \"classmap\": [\n \"src/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"BSD-3-Clause\"\n ],\n \"authors\": [\n {\n \"name\": \"Sebastian Bergmann\",\n \"email\": \"sebastian@phpunit.de\",\n \"role\": \"lead\"\n }\n ],\n \"description\": \"Library that helps with managing the version number of Git-hosted PHP projects\",\n \"homepage\": \"https://github.com/sebastianbergmann/version\",\n \"support\": {\n \"issues\": \"https://github.com/sebastianbergmann/version/issues\",\n \"security\": \"https://github.com/sebastianbergmann/version/security/policy\",\n \"source\": \"https://github.com/sebastianbergmann/version/tree/5.0.2\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/sebastianbergmann\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2024-10-09T05:16:32+00:00\"\n },\n {\n \"name\": \"spatie/array-to-xml\",\n \"version\": \"3.4.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/spatie/array-to-xml.git\",\n \"reference\": \"7dcfc67d60b0272926dabad1ec01f6b8a5fb5e67\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/spatie/array-to-xml/zipball/7dcfc67d60b0272926dabad1ec01f6b8a5fb5e67\",\n \"reference\": \"7dcfc67d60b0272926dabad1ec01f6b8a5fb5e67\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"ext-dom\": \"*\",\n \"php\": \"^8.0\"\n },\n \"require-dev\": {\n \"mockery/mockery\": \"^1.2\",\n \"pestphp/pest\": \"^1.21\",\n \"spatie/pest-plugin-snapshots\": \"^1.1\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-main\": \"3.x-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Spatie\\\\ArrayToXml\\\\\": \"src\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Freek Van der Herten\",\n \"email\": \"freek@spatie.be\",\n \"homepage\": \"https://freek.dev\",\n \"role\": \"Developer\"\n }\n ],\n \"description\": \"Convert an array to xml\",\n \"homepage\": \"https://github.com/spatie/array-to-xml\",\n \"keywords\": [\n \"array\",\n \"convert\",\n \"xml\"\n ],\n \"support\": {\n \"source\": \"https://github.com/spatie/array-to-xml/tree/3.4.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://spatie.be/open-source/support-us\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/spatie\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2024-12-16T12:45:15+00:00\"\n },\n {\n \"name\": \"staabm/side-effects-detector\",\n \"version\": \"1.0.5\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/staabm/side-effects-detector.git\",\n \"reference\": \"d8334211a140ce329c13726d4a715adbddd0a163\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/staabm/side-effects-detector/zipball/d8334211a140ce329c13726d4a715adbddd0a163\",\n \"reference\": \"d8334211a140ce329c13726d4a715adbddd0a163\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"ext-tokenizer\": \"*\",\n \"php\": \"^7.4 || ^8.0\"\n },\n \"require-dev\": {\n \"phpstan/extension-installer\": \"^1.4.3\",\n \"phpstan/phpstan\": \"^1.12.6\",\n \"phpunit/phpunit\": \"^9.6.21\",\n \"symfony/var-dumper\": \"^5.4.43\",\n \"tomasvotruba/type-coverage\": \"1.0.0\",\n \"tomasvotruba/unused-public\": \"1.0.0\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"classmap\": [\n \"lib/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"description\": \"A static analysis tool to detect side effects in PHP code\",\n \"keywords\": [\n \"static analysis\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/staabm/side-effects-detector/issues\",\n \"source\": \"https://github.com/staabm/side-effects-detector/tree/1.0.5\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/staabm\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2024-10-20T05:08:20+00:00\"\n },\n {\n \"name\": \"symfony/phpunit-bridge\",\n \"version\": \"v7.3.3\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/phpunit-bridge.git\",\n \"reference\": \"7954e563ed14f924593169f6c4645d58d9d9ac77\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/phpunit-bridge/zipball/7954e563ed14f924593169f6c4645d58d9d9ac77\",\n \"reference\": \"7954e563ed14f924593169f6c4645d58d9d9ac77\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=7.2.5\"\n },\n \"conflict\": {\n \"phpunit/phpunit\": \"<7.5|9.1.2\"\n },\n \"require-dev\": {\n \"symfony/deprecation-contracts\": \"^2.5|^3.0\",\n \"symfony/error-handler\": \"^5.4|^6.4|^7.0\",\n \"symfony/polyfill-php81\": \"^1.27\"\n },\n \"bin\": [\n \"bin/simple-phpunit\"\n ],\n \"type\": \"symfony-bridge\",\n \"extra\": {\n \"thanks\": {\n \"url\": \"https://github.com/sebastianbergmann/phpunit\",\n \"name\": \"phpunit/phpunit\"\n }\n },\n \"autoload\": {\n \"files\": [\n \"bootstrap.php\"\n ],\n \"psr-4\": {\n \"Symfony\\\\Bridge\\\\PhpUnit\\\\\": \"\"\n },\n \"exclude-from-classmap\": [\n \"/Tests/\",\n \"/bin/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Nicolas Grekas\",\n \"email\": \"p@tchwork.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Provides utilities for PHPUnit, especially user deprecation notices management\",\n \"homepage\": \"https://symfony.com\",\n \"keywords\": [\n \"testing\"\n ],\n \"support\": {\n \"source\": \"https://github.com/symfony/phpunit-bridge/tree/v7.3.3\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://github.com/nicolas-grekas\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2025-08-04T15:15:28+00:00\"\n },\n {\n \"name\": \"symfony/polyfill-php81\",\n \"version\": \"v1.33.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/polyfill-php81.git\",\n \"reference\": \"4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/polyfill-php81/zipball/4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c\",\n \"reference\": \"4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=7.2\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"thanks\": {\n \"url\": \"https://github.com/symfony/polyfill\",\n \"name\": \"symfony/polyfill\"\n }\n },\n \"autoload\": {\n \"files\": [\n \"bootstrap.php\"\n ],\n \"psr-4\": {\n \"Symfony\\\\Polyfill\\\\Php81\\\\\": \"\"\n },\n \"classmap\": [\n \"Resources/stubs\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Nicolas Grekas\",\n \"email\": \"p@tchwork.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Symfony polyfill backporting some PHP 8.1+ features to lower PHP versions\",\n \"homepage\": \"https://symfony.com\",\n \"keywords\": [\n \"compatibility\",\n \"polyfill\",\n \"portable\",\n \"shim\"\n ],\n \"support\": {\n \"source\": \"https://github.com/symfony/polyfill-php81/tree/v1.33.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://github.com/nicolas-grekas\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2024-09-09T11:45:10+00:00\"\n },\n {\n \"name\": \"symfony/stopwatch\",\n \"version\": \"v7.3.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/symfony/stopwatch.git\",\n \"reference\": \"5a49289e2b308214c8b9c2fda4ea454d8b8ad7cd\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/symfony/stopwatch/zipball/5a49289e2b308214c8b9c2fda4ea454d8b8ad7cd\",\n \"reference\": \"5a49289e2b308214c8b9c2fda4ea454d8b8ad7cd\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \">=8.2\",\n \"symfony/service-contracts\": \"^2.5|^3\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"psr-4\": {\n \"Symfony\\\\Component\\\\Stopwatch\\\\\": \"\"\n },\n \"exclude-from-classmap\": [\n \"/Tests/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Fabien Potencier\",\n \"email\": \"fabien@symfony.com\"\n },\n {\n \"name\": \"Symfony Community\",\n \"homepage\": \"https://symfony.com/contributors\"\n }\n ],\n \"description\": \"Provides a way to profile code\",\n \"homepage\": \"https://symfony.com\",\n \"support\": {\n \"source\": \"https://github.com/symfony/stopwatch/tree/v7.3.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://symfony.com/sponsor\",\n \"type\": \"custom\"\n },\n {\n \"url\": \"https://github.com/fabpot\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://tidelift.com/funding/github/packagist/symfony/symfony\",\n \"type\": \"tidelift\"\n }\n ],\n \"time\": \"2025-02-24T10:49:57+00:00\"\n },\n {\n \"name\": \"thecodingmachine/safe\",\n \"version\": \"v3.3.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/thecodingmachine/safe.git\",\n \"reference\": \"2cdd579eeaa2e78e51c7509b50cc9fb89a956236\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/thecodingmachine/safe/zipball/2cdd579eeaa2e78e51c7509b50cc9fb89a956236\",\n \"reference\": \"2cdd579eeaa2e78e51c7509b50cc9fb89a956236\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \"^8.1\"\n },\n \"require-dev\": {\n \"php-parallel-lint/php-parallel-lint\": \"^1.4\",\n \"phpstan/phpstan\": \"^2\",\n \"phpunit/phpunit\": \"^10\",\n \"squizlabs/php_codesniffer\": \"^3.2\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"files\": [\n \"lib/special_cases.php\",\n \"generated/apache.php\",\n \"generated/apcu.php\",\n \"generated/array.php\",\n \"generated/bzip2.php\",\n \"generated/calendar.php\",\n \"generated/classobj.php\",\n \"generated/com.php\",\n \"generated/cubrid.php\",\n \"generated/curl.php\",\n \"generated/datetime.php\",\n \"generated/dir.php\",\n \"generated/eio.php\",\n \"generated/errorfunc.php\",\n \"generated/exec.php\",\n \"generated/fileinfo.php\",\n \"generated/filesystem.php\",\n \"generated/filter.php\",\n \"generated/fpm.php\",\n \"generated/ftp.php\",\n \"generated/funchand.php\",\n \"generated/gettext.php\",\n \"generated/gmp.php\",\n \"generated/gnupg.php\",\n \"generated/hash.php\",\n \"generated/ibase.php\",\n \"generated/ibmDb2.php\",\n \"generated/iconv.php\",\n \"generated/image.php\",\n \"generated/imap.php\",\n \"generated/info.php\",\n \"generated/inotify.php\",\n \"generated/json.php\",\n \"generated/ldap.php\",\n \"generated/libxml.php\",\n \"generated/lzf.php\",\n \"generated/mailparse.php\",\n \"generated/mbstring.php\",\n \"generated/misc.php\",\n \"generated/mysql.php\",\n \"generated/mysqli.php\",\n \"generated/network.php\",\n \"generated/oci8.php\",\n \"generated/opcache.php\",\n \"generated/openssl.php\",\n \"generated/outcontrol.php\",\n \"generated/pcntl.php\",\n \"generated/pcre.php\",\n \"generated/pgsql.php\",\n \"generated/posix.php\",\n \"generated/ps.php\",\n \"generated/pspell.php\",\n \"generated/readline.php\",\n \"generated/rnp.php\",\n \"generated/rpminfo.php\",\n \"generated/rrd.php\",\n \"generated/sem.php\",\n \"generated/session.php\",\n \"generated/shmop.php\",\n \"generated/sockets.php\",\n \"generated/sodium.php\",\n \"generated/solr.php\",\n \"generated/spl.php\",\n \"generated/sqlsrv.php\",\n \"generated/ssdeep.php\",\n \"generated/ssh2.php\",\n \"generated/stream.php\",\n \"generated/strings.php\",\n \"generated/swoole.php\",\n \"generated/uodbc.php\",\n \"generated/uopz.php\",\n \"generated/url.php\",\n \"generated/var.php\",\n \"generated/xdiff.php\",\n \"generated/xml.php\",\n \"generated/xmlrpc.php\",\n \"generated/yaml.php\",\n \"generated/yaz.php\",\n \"generated/zip.php\",\n \"generated/zlib.php\"\n ],\n \"classmap\": [\n \"lib/DateTime.php\",\n \"lib/DateTimeImmutable.php\",\n \"lib/Exceptions/\",\n \"generated/Exceptions/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"description\": \"PHP core functions that throw exceptions instead of returning FALSE on error\",\n \"support\": {\n \"issues\": \"https://github.com/thecodingmachine/safe/issues\",\n \"source\": \"https://github.com/thecodingmachine/safe/tree/v3.3.0\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/OskarStark\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://github.com/shish\",\n \"type\": \"github\"\n },\n {\n \"url\": \"https://github.com/staabm\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2025-05-14T06:15:44+00:00\"\n },\n {\n \"name\": \"theseer/tokenizer\",\n \"version\": \"1.3.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/theseer/tokenizer.git\",\n \"reference\": \"b7489ce515e168639d17feec34b8847c326b0b3c\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/theseer/tokenizer/zipball/b7489ce515e168639d17feec34b8847c326b0b3c\",\n \"reference\": \"b7489ce515e168639d17feec34b8847c326b0b3c\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"ext-dom\": \"*\",\n \"ext-tokenizer\": \"*\",\n \"ext-xmlwriter\": \"*\",\n \"php\": \"^7.2 || ^8.0\"\n },\n \"type\": \"library\",\n \"autoload\": {\n \"classmap\": [\n \"src/\"\n ]\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"BSD-3-Clause\"\n ],\n \"authors\": [\n {\n \"name\": \"Arne Blankerts\",\n \"email\": \"arne@blankerts.de\",\n \"role\": \"Developer\"\n }\n ],\n \"description\": \"A small library for converting tokenized PHP source code into XML and potentially other formats\",\n \"support\": {\n \"issues\": \"https://github.com/theseer/tokenizer/issues\",\n \"source\": \"https://github.com/theseer/tokenizer/tree/1.3.1\"\n },\n \"funding\": [\n {\n \"url\": \"https://github.com/theseer\",\n \"type\": \"github\"\n }\n ],\n \"time\": \"2025-11-17T20:03:58+00:00\"\n },\n {\n \"name\": \"vimeo/psalm\",\n \"version\": \"6.5.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/vimeo/psalm.git\",\n \"reference\": \"38fc8444edf0cebc9205296ee6e30e906ade783b\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/vimeo/psalm/zipball/38fc8444edf0cebc9205296ee6e30e906ade783b\",\n \"reference\": \"38fc8444edf0cebc9205296ee6e30e906ade783b\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"amphp/amp\": \"^3\",\n \"amphp/byte-stream\": \"^2\",\n \"amphp/parallel\": \"^2.3\",\n \"composer-runtime-api\": \"^2\",\n \"composer/semver\": \"^1.4 || ^2.0 || ^3.0\",\n \"composer/xdebug-handler\": \"^2.0 || ^3.0\",\n \"dnoegel/php-xdg-base-dir\": \"^0.1.1\",\n \"ext-ctype\": \"*\",\n \"ext-dom\": \"*\",\n \"ext-json\": \"*\",\n \"ext-libxml\": \"*\",\n \"ext-mbstring\": \"*\",\n \"ext-simplexml\": \"*\",\n \"ext-tokenizer\": \"*\",\n \"felixfbecker/advanced-json-rpc\": \"^3.1\",\n \"felixfbecker/language-server-protocol\": \"^1.5.3\",\n \"fidry/cpu-core-counter\": \"^0.4.1 || ^0.5.1 || ^1.0.0\",\n \"netresearch/jsonmapper\": \"^1.0 || ^2.0 || ^3.0 || ^4.0\",\n \"nikic/php-parser\": \"^5.0.0\",\n \"php\": \"~8.1.17 || ~8.2.4 || ~8.3.0 || ~8.4.0\",\n \"sebastian/diff\": \"^4.0 || ^5.0 || ^6.0 || ^7.0\",\n \"spatie/array-to-xml\": \"^2.17.0 || ^3.0\",\n \"symfony/console\": \"^6.0 || ^7.0\",\n \"symfony/filesystem\": \"^6.0 || ^7.0\"\n },\n \"provide\": {\n \"psalm/psalm\": \"self.version\"\n },\n \"require-dev\": {\n \"amphp/phpunit-util\": \"^3\",\n \"bamarni/composer-bin-plugin\": \"^1.4\",\n \"brianium/paratest\": \"^6.9\",\n \"dg/bypass-finals\": \"^1.5\",\n \"ext-curl\": \"*\",\n \"mockery/mockery\": \"^1.5\",\n \"nunomaduro/mock-final-classes\": \"^1.1\",\n \"php-parallel-lint/php-parallel-lint\": \"^1.2\",\n \"phpstan/phpdoc-parser\": \"^1.6\",\n \"phpunit/phpunit\": \"^9.6\",\n \"psalm/plugin-mockery\": \"^1.1\",\n \"psalm/plugin-phpunit\": \"^0.19\",\n \"slevomat/coding-standard\": \"^8.4\",\n \"squizlabs/php_codesniffer\": \"^3.6\",\n \"symfony/process\": \"^6.0 || ^7.0\"\n },\n \"suggest\": {\n \"ext-curl\": \"In order to send data to shepherd\",\n \"ext-igbinary\": \"^2.0.5 is required, used to serialize caching data\"\n },\n \"bin\": [\n \"psalm\",\n \"psalm-language-server\",\n \"psalm-plugin\",\n \"psalm-refactor\",\n \"psalm-review\",\n \"psalter\"\n ],\n \"type\": \"project\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-1.x\": \"1.x-dev\",\n \"dev-2.x\": \"2.x-dev\",\n \"dev-3.x\": \"3.x-dev\",\n \"dev-4.x\": \"4.x-dev\",\n \"dev-5.x\": \"5.x-dev\",\n \"dev-6.x\": \"6.x-dev\",\n \"dev-master\": \"7.x-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Psalm\\\\\": \"src/Psalm/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Matthew Brown\"\n },\n {\n \"name\": \"Daniil Gentili\",\n \"email\": \"daniil@daniil.it\"\n }\n ],\n \"description\": \"A static analysis tool for finding errors in PHP applications\",\n \"keywords\": [\n \"code\",\n \"inspection\",\n \"php\",\n \"static analysis\"\n ],\n \"support\": {\n \"docs\": \"https://psalm.dev/docs\",\n \"issues\": \"https://github.com/vimeo/psalm/issues\",\n \"source\": \"https://github.com/vimeo/psalm\"\n },\n \"time\": \"2025-02-07T20:42:25+00:00\"\n },\n {\n \"name\": \"webmozart/assert\",\n \"version\": \"1.12.1\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/webmozarts/assert.git\",\n \"reference\": \"9be6926d8b485f55b9229203f962b51ed377ba68\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/webmozarts/assert/zipball/9be6926d8b485f55b9229203f962b51ed377ba68\",\n \"reference\": \"9be6926d8b485f55b9229203f962b51ed377ba68\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"ext-ctype\": \"*\",\n \"ext-date\": \"*\",\n \"ext-filter\": \"*\",\n \"php\": \"^7.2 || ^8.0\"\n },\n \"suggest\": {\n \"ext-intl\": \"\",\n \"ext-simplexml\": \"\",\n \"ext-spl\": \"\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"1.10-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Webmozart\\\\Assert\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Bernhard Schussek\",\n \"email\": \"bschussek@gmail.com\"\n }\n ],\n \"description\": \"Assertions to validate method input/output with nice error messages.\",\n \"keywords\": [\n \"assert\",\n \"check\",\n \"validate\"\n ],\n \"support\": {\n \"issues\": \"https://github.com/webmozarts/assert/issues\",\n \"source\": \"https://github.com/webmozarts/assert/tree/1.12.1\"\n },\n \"time\": \"2025-10-29T15:56:20+00:00\"\n },\n {\n \"name\": \"webmozart/glob\",\n \"version\": \"4.7.0\",\n \"source\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/webmozarts/glob.git\",\n \"reference\": \"8a2842112d6916e61e0e15e316465b611f3abc17\"\n },\n \"dist\": {\n \"type\": \"zip\",\n \"url\": \"https://api.github.com/repos/webmozarts/glob/zipball/8a2842112d6916e61e0e15e316465b611f3abc17\",\n \"reference\": \"8a2842112d6916e61e0e15e316465b611f3abc17\",\n \"shasum\": \"\"\n },\n \"require\": {\n \"php\": \"^7.3 || ^8.0.0\"\n },\n \"require-dev\": {\n \"phpunit/phpunit\": \"^9.5\",\n \"symfony/filesystem\": \"^5.3\"\n },\n \"type\": \"library\",\n \"extra\": {\n \"branch-alias\": {\n \"dev-master\": \"4.1-dev\"\n }\n },\n \"autoload\": {\n \"psr-4\": {\n \"Webmozart\\\\Glob\\\\\": \"src/\"\n }\n },\n \"notification-url\": \"https://packagist.org/downloads/\",\n \"license\": [\n \"MIT\"\n ],\n \"authors\": [\n {\n \"name\": \"Bernhard Schussek\",\n \"email\": \"bschussek@gmail.com\"\n }\n ],\n \"description\": \"A PHP implementation of Ant's glob.\",\n \"support\": {\n \"issues\": \"https://github.com/webmozarts/glob/issues\",\n \"source\": \"https://github.com/webmozarts/glob/tree/4.7.0\"\n },\n \"time\": \"2024-03-07T20:33:40+00:00\"\n }\n ],\n \"aliases\": [],\n \"minimum-stability\": \"stable\",\n \"stability-flags\": {\n \"daniti/oauth2-pipedrive\": 20,\n \"jiminny/oauth2-aircall\": 20,\n \"jiminny/oauth2-dialpad\": 20,\n \"jiminny/oauth2-salesloft\": 20,\n \"thenetworg/oauth2-azure\": 20,\n \"tmannherz/oauth2-ringcentral\": 20\n },\n \"prefer-stable\": true,\n \"prefer-lowest\": false,\n \"platform\": {\n \"php\": \"^8.3\",\n \"ext-ctype\": \"*\",\n \"ext-curl\": \"*\",\n \"ext-date\": \"*\",\n \"ext-dom\": \"*\",\n \"ext-fileinfo\": \"*\",\n \"ext-filter\": \"*\",\n \"ext-gd\": \"*\",\n \"ext-gmp\": \"*\",\n \"ext-hash\": \"*\",\n \"ext-iconv\": \"*\",\n \"ext-igbinary\": \"*\",\n \"ext-imagick\": \"*\",\n \"ext-intl\": \"*\",\n \"ext-json\": \"*\",\n \"ext-libxml\": \"*\",\n \"ext-mailparse\": \"*\",\n \"ext-mbstring\": \"*\",\n \"ext-mysqlnd\": \"*\",\n \"ext-openssl\": \"*\",\n \"ext-pcntl\": \"*\",\n \"ext-pcre\": \"*\",\n \"ext-pdo\": \"*\",\n \"ext-pdo_mysql\": \"*\",\n \"ext-phar\": \"*\",\n \"ext-phpiredis\": \"*\",\n \"ext-posix\": \"*\",\n \"ext-readline\": \"*\",\n \"ext-redis\": \"*\",\n \"ext-reflection\": \"*\",\n \"ext-session\": \"*\",\n \"ext-simplexml\": \"*\",\n \"ext-sockets\": \"*\",\n \"ext-spl\": \"*\",\n \"ext-tokenizer\": \"*\",\n \"ext-xml\": \"*\",\n \"ext-xmlreader\": \"*\",\n \"ext-xmlwriter\": \"*\",\n \"ext-zend-opcache\": \"*\",\n \"ext-zip\": \"*\",\n \"ext-zlib\": \"*\",\n \"lib-curl\": \"*\",\n \"lib-curl-openssl\": \"*\",\n \"lib-curl-zlib\": \"*\",\n \"lib-date-timelib\": \"*\",\n \"lib-date-zoneinfo\": \"*\",\n \"lib-fileinfo-libmagic\": \"*\",\n \"lib-gd\": \"*\",\n \"lib-gd-freetype\": \"*\",\n \"lib-gd-libjpeg\": \"*\",\n \"lib-gd-libpng\": \"*\",\n \"lib-gmp\": \"*\",\n \"lib-icu\": \"*\",\n \"lib-icu-cldr\": \"*\",\n \"lib-icu-unicode\": \"*\",\n \"lib-imagick-imagemagick\": \"*\",\n \"lib-libxml\": \"*\",\n \"lib-mbstring-libmbfl\": \"*\",\n \"lib-mbstring-oniguruma\": \"*\",\n \"lib-openssl\": \"*\",\n \"lib-pcre\": \"*\",\n \"lib-pcre-unicode\": \"*\",\n \"lib-zip-libzip\": \"*\",\n \"lib-zlib\": \"*\"\n },\n \"platform-dev\": [],\n \"plugin-api-version\": \"2.6.0\"\n}","help_text":"","role_description":"text entry area","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"app/composer.lock at e4e0e6d46de855cb5293da5ea962719905804147 · jiminny/app","depth":7,"help_text":"","role_description":"text","subrole":"AXUnknown"}]...
|
-7214033087308426998
|
-7853867278024359421
|
visual_change
|
accessibility
|
NULL
|
Platform Sprint 2 Q2 - Platform Team - Scrum Board Platform Sprint 2 Q2 - Platform Team - Scrum Board - Jira
[SRD-6793] Les Mills activity types not pulling in - Jira
[SRD-6793] Les Mills activity types not pulling in - Jira
JY-20698 handle failed field sync on playbook import activity types by LakyLak · Pull Request #11988 · jiminny/app
JY-20698 handle failed field sync on playbook import activity types by LakyLak · Pull Request #11988 · jiminny/app
JY-20692 change confirmation parameter by LakyLak · Pull Request #11986 · jiminny/app
JY-20692 change confirmation parameter by LakyLak · Pull Request #11986 · jiminny/app
[JY-20543] AJ Reports > Tracking - Jira
[JY-20543] AJ Reports > Tracking - Jira
[JY-18909] [Part2] Automated reports with Ask Jiminny - Jira
[JY-18909] [Part2] Automated reports with Ask Jiminny - Jira
Ask Jiminny Reports by nikolay-yankov · Pull Request #11894 · jiminny/app
Ask Jiminny Reports by nikolay-yankov · Pull Request #11894 · jiminny/app
New Tab
New Tab
Product Growth Platform | Userpilot
Product Growth Platform | Userpilot
Userpilot | Logged-activity
Userpilot | Logged-activity
fix(security): composer dependency updates – 2026-04-15 by github-actions[bot] · Pull Request #11970 · jiminny/app
fix(security): composer dependency updates – 2026-04-15 by github-actions[bot] · Pull Request #11970 · jiminny/app
Pipelines - jiminny/app
Pipelines - jiminny/app
Feed — jiminny — Sentry
Feed — jiminny — Sentry
app/composer.lock at e4e0e6d46de855cb5293da5ea962719905804147 · jiminny/app
app/composer.lock at e4e0e6d46de855cb5293da5ea962719905804147 · jiminny/app
Close tab
New Tab
Customize sidebar
Open Google Gemini (⌃X)
Tabs from other devices
Open history (⇧⌘H)
Close bookmarks (⌘B)
Bookmarks
Bookmarks
Close sidebar
Search bookmarks
Skip to content
Skip to content
Open menu
Homepage (g then d)
jiminny
jiminny
app
app
Search or jump to…
Type
/
to search
Chat with Copilot
Open Copilot…
Create new...
Issues(g then i)
Pull requests
Repositories
You have unread notifications(g then n)
Open user navigation menu
Repository navigation
Repository navigation
Code
Code
Pull requests (31)
Pull requests
(
31
)
Agents
Agents
Actions
Actions
Wiki
Wiki
Security and quality (22)
Security and quality
(
22
)
Insights
Insights
Settings
Settings
Important update
Important update
On April 24 we'll start using GitHub Copilot interaction data for AI model training unless you opt out.
Review this update
Review this update
and manage your preferences in your
GitHub account settings
GitHub account settings
.
Dismiss banner
Collapse file tree
Collapse file tree
Files
Files
View file on default branch
e4e0e6d branch
e4e0e6d
Search this repository(forward slash)
Go to file
.circleci
.cursor
.github
.sonarlint
.vscode
app
bootstrap
config
contrib
database
docs
front-end
lang
node_modules
phpstan
public
resources
routes
scripts
storage
tests
.editorconfig
.env.circleci
.env.circleci-nightly
.env.local
.env.production
.env.production-eu
.env.qa
.env.qai
.env.staging
.gitattributes
.gitignore
.php-cs-fixer.dist.php
composer.lock
Breadcrumbs
Breadcrumbs
app
app
composer.lock
composer.lock
Copy path
More file actions
Latest commit
Latest commit
LakyLak
commits by LakyLak
LakyLak
Merge branch 'master' into secfix/composer-20260415
Merge branch 'master' into secfix/composer-20260415
success
Commit e4e0e6d
e4e0e6d
·
41 minutes ago
History
History
History
History
File metadata and controls
File metadata and controls
Code
Code
Blame
Blame
24187 lines (24187 loc) · 871 KB
Your organization can pay for GitHub Copilot
Ask Copilot about this file
Raw
Raw
Copy raw file
Download raw file
You must be on a branch to make or propose changes to this file
More edit options
Open symbols panel
{
"_readme": [
"This file locks the dependencies of your project to a known state",
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
"content-hash": "c5b624c7761f54da18d67e9d401dc59f",
"packages": [
{
"name": "24slides/laravel-saml2",
"version": "2.4.2",
"source": {
"type": "git",
"url": "https://github.com/24Slides/laravel-saml2.git",
"reference": "e7f4938586c65fbe1fdd91552c582cac745223b9"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/24Slides/laravel-saml2/zipball/e7f4938586c65fbe1fdd91552c582cac745223b9",
"reference": "e7f4938586c65fbe1fdd91552c582cac745223b9",
"shasum": ""
},
"require": {
"ext-openssl": "*",
"illuminate/console": "~5.5|^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0",
"illuminate/database": "~5.5|^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0",
"illuminate/support": "~5.4|^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0",
"onelogin/php-saml": "^3.0|^4.0",
"php": ">=7.1",
"ramsey/uuid": "^3.8|^4.0"
},
"require-dev": {
"mockery/mockery": "^0.9.9",
"phpunit/phpunit": "^7.5|^9.0",
"squizlabs/php_codesniffer": "^2.3"
},
"type": "library",
"extra": {
"laravel": {
"aliases": {
"Saml2": "Slides\\Saml2\\Facades\\Auth"
},
"providers": [
"Slides\\Saml2\\ServiceProvider"
]
},
"branch-aliases": {
"dev-master": "2.0.8-dev"
}
},
"autoload": {
"files": [
"src/helpers.php"
],
"psr-4": {
"Slides\\Saml2\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Artem Brezhnev",
"email": "[EMAIL]"
}
],
"description": "SAML2 Service Provider integration to your Laravel 5.4+ application, based on OneLogin toolkit",
"homepage": "https://github.com/24slides/laravel-saml2",
"keywords": [
"SAML2",
"SSO",
"laravel",
"onelogin",
"saml"
],
"support": {
"issues": "https://github.com/24Slides/laravel-saml2/issues",
"source": "https://github.com/24Slides/laravel-saml2/tree/2.4.2"
},
"time": "2025-03-12T12:39:37+00:00"
},
{
"name": "adam-paterson/oauth2-slack",
"version": "1.1.3",
"source": {
"type": "git",
"url": "https://github.com/adam-paterson/oauth2-slack.git",
"reference": "ccc329eb3036a89d110227a4137e15d4a5661678"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/adam-paterson/oauth2-slack/zipball/ccc329eb3036a89d110227a4137e15d4a5661678",
"reference": "ccc329eb3036a89d110227a4137e15d4a5661678",
"shasum": ""
},
"require": {
"league/oauth2-client": "1.*|2.*",
"php": ">=5.6.0"
},
"require-dev": {
"mockery/mockery": "~0.9",
"phpunit/phpunit": "5.6",
"squizlabs/php_codesniffer": "~2.0"
},
"type": "library",
"autoload": {
"psr-4": {
"AdamPaterson\\OAuth2\\Client\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Adam Paterson",
"email": "[EMAIL]"
}
],
"description": "Slack OAuth 2.0 Client Provider for The PHP League OAuth2-Client",
"keywords": [
"Authentication",
"SSO",
"authorization",
"identity",
"idp",
"oauth",
"oauth2",
"single sign on",
"slack",
"slack api"
],
"support": {
"issues": "https://github.com/adam-paterson/oauth2-slack/issues",
"source": "https://github.com/adam-paterson/oauth2-slack/tree/master"
},
"time": "2017-06-20T14:43:31+00:00"
},
{
"name": "asimlqt/php-google-spreadsheet-client",
"version": "v3.0.2",
"source": {
"type": "git",
"url": "https://github.com/asimlqt/php-google-spreadsheet-client.git",
"reference": "fb82cdc12e6cef559a8f1e42dc26e0905f565055"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/asimlqt/php-google-spreadsheet-client/zipball/fb82cdc12e6cef559a8f1e42dc26e0905f565055",
"reference": "fb82cdc12e6cef559a8f1e42dc26e0905f565055",
"shasum": ""
},
"require": {
"php": ">=5.6.0"
},
"require-dev": {
"phpunit/phpunit": "4.4.2"
},
"type": "library",
"autoload": {
"psr-4": {
"Google\\": "src/Google"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"Apache-2.0"
],
"authors": [
{
"name": "Asim Liaquat",
"email": "[EMAIL]",
"role": "Developer"
}
],
"description": "Google Spreadsheet PHP Client",
"homepage": "https://github.com/asimlqt/php-google-spreadsheet-client",
"keywords": [
"google",
"spreadsheet"
],
"support": {
"issues": "https://github.com/asimlqt/php-google-spreadsheet-client/issues",
"source": "https://github.com/asimlqt/php-google-spreadsheet-client/tree/v3.0.2"
},
"time": "2016-11-09T07:43:08+00:00"
},
{
"name": "aws/aws-crt-php",
"version": "v1.2.7",
"source": {
"type": "git",
"url": "https://github.com/awslabs/aws-crt-php.git",
"reference": "d71d9906c7bb63a28295447ba12e74723bd3730e"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/awslabs/aws-crt-php/zipball/d71d9906c7bb63a28295447ba12e74723bd3730e",
"reference": "d71d9906c7bb63a28295447ba12e74723bd3730e",
"shasum": ""
},
"require": {
"php": ">=5.5"
},
"require-dev": {
"phpunit/phpunit": "^4.8.35||^5.6.3||^9.5",
"yoast/phpunit-polyfills": "^1.0"
},
"suggest": {
"ext-awscrt": "Make sure you install awscrt native extension to use any of the functionality."
},
"type": "library",
"autoload": {
"classmap": [
"src/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"Apache-2.0"
],
"authors": [
{
"name": "AWS SDK Common Runtime Team",
"email": "[EMAIL]"
}
],
"description": "AWS Common Runtime for PHP",
"homepage": "https://github.com/awslabs/aws-crt-php",
"keywords": [
"amazon",
"aws",
"crt",
"sdk"
],
"support": {
"issues": "https://github.com/awslabs/aws-crt-php/issues",
"source": "https://github.com/awslabs/aws-crt-php/tree/v1.2.7"
},
"time": "2024-10-18T22:15:13+00:00"
},
{
"name": "aws/aws-sdk-php",
"version": "3.373.2",
"source": {
"type": "git",
"url": "https://github.com/aws/aws-sdk-php.git",
"reference": "483fba51c28b3a0c0647bf5100e0edca82090b18"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/483fba51c28b3a0c0647bf5100e0edca82090b18",
"reference": "483fba51c28b3a0c0647bf5100e0edca82090b18",
"shasum": ""
},
"require": {
"aws/aws-crt-php": "^1.2.3",
"ext-json": "*",
"ext-pcre": "*",
"ext-simplexml": "*",
"guzzlehttp/guzzle": "^7.4.5",
"guzzlehttp/promises": "^2.0",
"guzzlehttp/psr7": "^2.4.5",
"mtdowling/jmespath.php": "^2.8.0",
"php": ">=8.1",
"psr/http-message": "^1.0 || ^2.0",
"symfony/filesystem": "^v5.4.45 || ^v6.4.3 || ^v7.1.0 || ^v8.0.0"
},
"require-dev": {
"andrewsville/php-token-reflection": "^1.4",
"aws/aws-php-sns-message-validator": "~1.0",
"behat/behat": "~3.0",
"composer/composer": "^2.7.8",
"dms/phpunit-arraysubset-asserts": "^v0.5.0",
"doctrine/cache": "~1.4",
"ext-dom": "*",
"ext-openssl": "*",
"ext-sockets": "*",
"phpunit/phpunit": "^10.0",
"psr/cache": "^2.0 || ^3.0",
"psr/simple-cache": "^2.0 || ^3.0",
"sebastian/comparator": "^1.2.3 || ^4.0 || ^5.0",
"yoast/phpunit-polyfills": "^2.0"
},
"suggest": {
"aws/aws-php-sns-message-validator": "To validate incoming SNS notifications",
"doctrine/cache": "To use the DoctrineCacheAdapter",
"ext-curl": "To send requests using cURL",
"ext-openssl": "Allows working with CloudFront private distributions and verifying received SNS messages",
"ext-pcntl": "To use client-side monitoring",
"ext-sockets": "To use client-side monitoring"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "3.0-dev"
}
},
"autoload": {
"files": [
"src/functions.php"
],
"psr-4": {
"Aws\\": "src/"
},
"exclude-from-classmap": [
"src/data/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"Apache-2.0"
],
"authors": [
{
"name": "Amazon Web Services",
"homepage": "https://aws.amazon.com"
}
],
"description": "AWS SDK for PHP - Use Amazon Web Services in your PHP project",
"homepage": "https://aws.amazon.com/sdk-for-php",
"keywords": [
"amazon",
"aws",
"cloud",
"dynamodb",
"ec2",
"glacier",
"s3",
"sdk"
],
"support": {
"forum": "https://github.com/aws/aws-sdk-php/discussions",
"issues": "https://github.com/aws/aws-sdk-php/issues",
"source": "https://github.com/aws/aws-sdk-php/tree/3.373.2"
},
"time": "2026-03-13T18:08:30+00:00"
},
{
"name": "aws/aws-sdk-php-laravel",
"version": "3.10.0",
"source": {
"type": "git",
"url": "https://github.com/aws/aws-sdk-php-laravel.git",
"reference": "c1477b1efd43a61238090c0e8f1ede979573dd4b"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/aws/aws-sdk-php-laravel/zipball/c1477b1efd43a61238090c0e8f1ede979573dd4b",
"reference": "c1477b1efd43a61238090c0e8f1ede979573dd4b",
"shasum": ""
},
"require": {
"aws/aws-sdk-php": "^3.338.0",
"illuminate/support": "^6.0 || ^7.0 || ^8.0 || ^9.0 || ^10.0 || ^11.0 || ^12.0",
"php": ">=8.1"
},
"require-dev": {
"phpunit/phpunit": "^8.0 || ^9.0",
"vlucas/phpdotenv": "^1.0 || ^2.0 || ^3.0 || ^4.0 || ^5.0",
"yoast/phpunit-polyfills": "^1.0"
},
"suggest": {
"laravel/framework": "To test the Laravel bindings",
"laravel/lumen-framework": "To test the Lumen bindings"
},
"type": "library",
"extra": {
"laravel": {
"aliases": {
"AWS": "Aws\\Laravel\\AwsFacade"
},
"providers": [
"Aws\\Laravel\\AwsServiceProvider"
]
}
},
"autoload": {
"psr-4": {
"Aws\\Laravel\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"Apache-2.0"
],
"authors": [
{
"name": "Amazon Web Services",
"homepage": "http://aws.amazon.com"
}
],
"description": "A simple Laravel 6/7/8/9/10/11/12 service provider for including the AWS SDK for PHP.",
"homepage": "https://aws.amazon.com/sdk-for-php/",
"keywords": [
"amazon",
"aws",
"dynamodb",
"ec2",
"laravel",
"laravel 10",
"laravel 11",
"laravel 12",
"laravel 6",
"laravel 7",
"laravel 8",
"laravel 9",
"s3",
"sdk"
],
"support": {
"issues": "https://github.com/aws/aws-sdk-php-laravel/issues",
"source": "https://github.com/aws/aws-sdk-php-laravel/tree/3.10.0"
},
"time": "2025-02-26T22:25:56+00:00"
},
{
"name": "bepsvpt/secure-headers",
"version": "9.0.0",
"source": {
"type": "git",
"url": "https://github.com/bepsvpt/secure-headers.git",
"reference": "7efbc3d8b988051b5ff81c4cacd1d12e875528ed"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/bepsvpt/secure-headers/zipball/7efbc3d8b988051b5ff81c4cacd1d12e875528ed",
"reference": "7efbc3d8b988051b5ff81c4cacd1d12e875528ed",
"shasum": ""
},
"require": {
"ext-json": "*",
"php": "^7.1 || ^8.0"
},
"require-dev": {
"ergebnis/composer-normalize": "^2.42",
"ext-xdebug": "*",
"laravel/pint": "^1.14",
"orchestra/testbench": "^3.1 || ^4.18 || ^5.20 || ^6.43 || ^7.41 || ^8.22 || ^9.0",
"phpstan/phpstan": "^1.10",
"phpunit/phpunit": "^5.7 || ^6.5 || ^7.5 || ^8.5 || ^9.6 || ^10.5"
},
"type": "library",
"extra": {
"laravel": {
"providers": [
"Bepsvpt\\SecureHeaders\\SecureHeadersServiceProvider"
]
}
},
"autoload": {
"files": [
"src/helpers.php"
],
"psr-4": {
"Bepsvpt\\SecureHeaders\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "bepsvpt",
"email": "[EMAIL]"
}
],
"description": "Add security related headers to HTTP response. The package includes Service Providers for easy Laravel integration.",
"homepage": "https://github.com/bepsvpt/secure-headers",
"keywords": [
"clear-site-data",
"content-security-policy",
"csp",
"except-ct",
"feature-policy",
"header",
"hsts",
"https",
"laravel",
"permissions-policy",
"referrer-policy"
],
"support": {
"issues": "https://github.com/bepsvpt/secure-headers/issues",
"source": "https://github.com/bepsvpt/secure-headers/tree/9.0.0"
},
"funding": [
{
"url": "https://opencollective.com/secure-headers",
"type": "open_collective"
}
],
"time": "2025-01-18T07:18:04+00:00"
},
{
"name": "brick/math",
"version": "0.14.8",
"source": {
"type": "git",
"url": "https://github.com/brick/math.git",
"reference": "63422359a44b7f06cae63c3b429b59e8efcc0629"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/brick/math/zipball/63422359a44b7f06cae63c3b429b59e8efcc0629",
"reference": "63422359a44b7f06cae63c3b429b59e8efcc0629",
"shasum": ""
},
"require": {
"php": "^8.2"
},
"require-dev": {
"php-coveralls/php-coveralls": "^2.2",
"phpstan/phpstan": "2.1.22",
"phpunit/phpunit": "^11.5"
},
"type": "library",
"autoload": {
"psr-4": {
"Brick\\Math\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"description": "Arbitrary-precision arithmetic library",
"keywords": [
"Arbitrary-precision",
"BigInteger",
"BigRational",
"arithmetic",
"bigdecimal",
"bignum",
"bignumber",
"brick",
"decimal",
"integer",
"math",
"mathematics",
"rational"
],
"support": {
"issues": "https://github.com/brick/math/issues",
"source": "https://github.com/brick/math/tree/0.14.8"
},
"funding": [
{
"url": "https://github.com/BenMorel",
"type": "github"
}
],
"time": "2026-02-10T14:33:43+00:00"
},
{
"name": "carbonphp/carbon-doctrine-types",
"version": "3.2.0",
"source": {
"type": "git",
"url": "https://github.com/CarbonPHP/carbon-doctrine-types.git",
"reference": "18ba5ddfec8976260ead6e866180bd5d2f71aa1d"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/CarbonPHP/carbon-doctrine-types/zipball/18ba5ddfec8976260ead6e866180bd5d2f71aa1d",
"reference": "18ba5ddfec8976260ead6e866180bd5d2f71aa1d",
"shasum": ""
},
"require": {
"php": "^8.1"
},
"conflict": {
"doctrine/dbal": "<4.0.0 || >=5.0.0"
},
"require-dev": {
"doctrine/dbal": "^4.0.0",
"nesbot/carbon": "^2.71.0 || ^3.0.0",
"phpunit/phpunit": "^10.3"
},
"type": "library",
"autoload": {
"psr-4": {
"Carbon\\Doctrine\\": "src/Carbon/Doctrine/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "KyleKatarn",
"email": "[EMAIL]"
}
],
"description": "Types to use Carbon in Doctrine",
"keywords": [
"carbon",
"date",
"datetime",
"doctrine",
"time"
],
"support": {
"issues": "https://github.com/CarbonPHP/carbon-doctrine-types/issues",
"source": "https://github.com/CarbonPHP/carbon-doctrine-types/tree/3.2.0"
},
"funding": [
{
"url": "https://github.com/kylekatarnls",
"type": "github"
},
{
"url": "https://opencollective.com/Carbon",
"type": "open_collective"
},
{
"url": "https://tidelift.com/funding/github/packagist/nesbot/carbon",
"type": "tidelift"
}
],
"time": "2024-02-09T16:56:22+00:00"
},
{
"name": "chadhutchins/oauth2-slack",
"version": "1.2.2",
"source": {
"type": "git",
"url": "https://github.com/chadhutchins/oauth2-slack.git",
"reference": "f738c0ed2695208353ee95b6e24e2d1ae412843a"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/chadhutchins/oauth2-slack/zipball/f738c0ed2695208353ee95b6e24e2d1ae412843a",
"reference": "f738c0ed2695208353ee95b6e24e2d1ae412843a",
"shasum": ""
},
"require": {
"league/oauth2-client": "1.*|2.*",
"php": ">=5.6.0"
},
"require-dev": {
"mockery/mockery": "~0.9",
"phpunit/phpunit": "5.6",
"squizlabs/php_codesniffer": "~2.0"
},
"type": "library",
"autoload": {
"psr-4": {
"Chadhutchins\\OAuth2\\Client\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Adam Paterson",
"email": "[EMAIL]"
},
{
"name": "Chad Hutchins",
"email": "[EMAIL]"
}
],
"description": "Slack OAuth 2.0 Client Provider for The PHP League OAuth2-Client",
"keywords": [
"Authentication",
"SSO",
"authorization",
"identity",
"idp",
"oauth",
"oauth2",
"single sign on",
"slack",
"slack api"
],
"support": {
"source": "https://github.com/chadhutchins/oauth2-slack/tree/1.2.2"
},
"time": "2020-11-23T15:41:35+00:00"
},
{
"name": "chaseconey/laravel-datadog-helper",
"version": "1.3.0",
"source": {
"type": "git",
"url": "https://github.com/chaseconey/laravel-datadog-helper.git",
"reference": "7219004fa87bcf226d5d5f1d268a555eef3d3a4b"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/chaseconey/laravel-datadog-helper/zipball/7219004fa87bcf226d5d5f1d268a555eef3d3a4b",
"reference": "7219004fa87bcf226d5d5f1d268a555eef3d3a4b",
"shasum": ""
},
"require": {
"datadog/php-datadogstatsd": "^1.4.0",
"illuminate/support": ">=5.1",
"php": ">=5.4.0"
},
"require-dev": {
"phpunit/phpunit": "~4.0||~5.0",
"scrutinizer/ocular": "~1.1",
"squizlabs/php_codesniffer": "~2.3"
},
"type": "library",
"extra": {
"laravel": {
"aliases": {
"Datadog": "ChaseConey\\LaravelDatadogHelper\\Datadog"
},
"providers": [
"ChaseConey\\LaravelDatadogHelper\\LaravelDatadogHelperServiceProvider"
]
}
},
"autoload": {
"psr-4": {
"ChaseConey\\LaravelDatadogHelper\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Chase Coney",
"email": "[EMAIL]",
"homepage": "http://chaseconey.com",
"role": "Developer"
}
],
"description": "A Laravel Datadog helper package.",
"homepage": "https://github.com/chaseconey/laravel-datadog-helper",
"keywords": [
"chaseconey",
"laravel-datadog-helper"
],
"support": {
"issues": "https://github.com/chaseconey/laravel-datadog-helper/issues",
"source": "https://github.com/chaseconey/laravel-datadog-helper/tree/1.3.0"
},
"funding": [
{
"url": "https://github.com/chaseconey",
"type": "github"
}
],
"time": "2025-07-28T21:50:15+00:00"
},
{
"name": "chrisyue/php-m3u8",
"version": "4.0.3",
"source": {
"type": "git",
"url": "https://github.com/chrisyue/php-m3u8.git",
"reference": "122745bda7c2cfcedf6b2893b48a028f87109717"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/chrisyue/php-m3u8/zipball/122745bda7c2cfcedf6b2893b48a028f87109717",
"reference": "122745bda7c2cfcedf6b2893b48a028f87109717",
"shasum": ""
},
"require": {
"php": ">=7.4"
},
"require-dev": {
"friendsofphp/php-cs-fixer": "^3",
"phpunit/phpunit": "^8"
},
"type": "library",
"autoload": {
"psr-4": {
"Chrisyue\\PhpM3u8\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "chrisyue",
"email": "[EMAIL]",
"homepage": "https://chrisyue.com"
}
],
"description": "PHP M3U8 parser / dumper",
"homepage": "http://chrisyue.com",
"keywords": [
"dumper",
"m3u8",
"parser"
],
"support": {
"issues": "https://github.com/chrisyue/php-m3u8/issues",
"source": "https://github.com/chrisyue/php-m3u8/tree/4.0.3"
},
"time": "2022-05-23T12:03:05+00:00"
},
{
"name": "clue/stream-filter",
"version": "v1.7.0",
"source": {
"type": "git",
"url": "https://github.com/clue/stream-filter.git",
"reference": "049509fef80032cb3f051595029ab75b49a3c2f7"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/clue/stream-filter/zipball/049509fef80032cb3f051595029ab75b49a3c2f7",
"reference": "049509fef80032cb3f051595029ab75b49a3c2f7",
"shasum": ""
},
"require": {
"php": ">=5.3"
},
"require-dev": {
"phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36"
},
"type": "library",
"autoload": {
"files": [
"src/functions_include.php"
],
"psr-4": {
"Clue\\StreamFilter\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Christian Lück",
"email": "[EMAIL]"
}
],
"description": "A simple and modern approach to stream filtering in PHP",
"homepage": "https://github.com/clue/stream-filter",
"keywords": [
"bucket brigade",
"callback",
"filter",
"php_user_filter",
"stream",
"stream_filter_append",
"stream_filter_register"
],
"support": {
"issues": "https://github.com/clue/stream-filter/issues",
"source": "https://github.com/clue/stream-filter/tree/v1.7.0"
},
"funding": [
{
"url": "https://clue.engineering/support",
"type": "custom"
},
{
"url": "https://github.com/clue",
"type": "github"
}
],
"time": "2023-12-20T15:40:13+00:00"
},
{
"name": "composer/semver",
"version": "3.4.4",
"source": {
"type": "git",
"url": "https://github.com/composer/semver.git",
"reference": "198166618906cb2de69b95d7d47e5fa8aa1b2b95"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/composer/semver/zipball/198166618906cb2de69b95d7d47e5fa8aa1b2b95",
"reference": "198166618906cb2de69b95d7d47e5fa8aa1b2b95",
"shasum": ""
},
"require": {
"php": "^5.3.2 || ^7.0 || ^8.0"
},
"require-dev": {
"phpstan/phpstan": "^1.11",
"symfony/phpunit-bridge": "^3 || ^7"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-main": "3.x-dev"
}
},
"autoload": {
"psr-4": {
"Composer\\Semver\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Nils Adermann",
"email": "[EMAIL]",
"homepage": "http://www.naderman.de"
},
{
"name": "Jordi Boggiano",
"email": "[EMAIL]",
"homepage": "http://seld.be"
},
{
"name": "Rob Bast",
"email": "[EMAIL]",
"homepage": "http://robbast.nl"
}
],
"description": "Semver library that offers utilities, version constraint parsing and validation.",
"keywords": [
"semantic",
"semver",
"validation",
"versioning"
],
"support": {
"irc": "ircs://irc.libera.chat:6697/composer",
"issues": "https://github.com/composer/semver/issues",
"source": "https://github.com/composer/semver/tree/3.4.4"
},
"funding": [
{
"url": "https://packagist.com",
"type": "custom"
},
{
"url": "https://github.com/composer",
"type": "github"
}
],
"time": "2025-08-20T19:15:30+00:00"
},
{
"name": "daniti/oauth2-pipedrive",
"version": "dev-master",
"source": {
"type": "git",
"url": "https://github.com/jiminny/oauth2-pipedrive.git",
"reference": "e8b269cfe30ea92817acd0dc3efc9da54fe390bf"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/jiminny/oauth2-pipedrive/zipball/e8b269cfe30ea92817acd0dc3efc9da54fe390bf",
"reference": "e8b269cfe30ea92817acd0dc3efc9da54fe390bf",
"shasum": ""
},
"require": {
"league/oauth2-client": "^2.3"
},
"default-branch": true,
"type": "library",
"autoload": {
"psr-4": {
"Daniti\\OAuth2\\Client\\Provider\\": "src/"
}
},
"license": [
"MIT"
],
"authors": [
{
"name": "Daniele Timo",
"email": "[EMAIL]"
}
],
"description": "Pipedrive OAuth 2.0 client provider for PHP League OAuth2 Client",
"support": {
"source": "https://github.com/jiminny/oauth2-pipedrive/tree/master",
"issues": "https://github.com/jiminny/oauth2-pipedrive/issues"
},
"time": "2021-03-15T17:10:01+00:00"
},
{
"name": "datadog/php-datadogstatsd",
"version": "1.7.1",
"source": {
"type": "git",
"url": "https://github.com/DataDog/php-datadogstatsd.git",
"reference": "f0d61f11e01780ef7d96daed9781c7db9311a568"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/DataDog/php-datadogstatsd/zipball/f0d61f11e01780ef7d96daed9781c7db9311a568",
"reference": "f0d61f11e01780ef7d96daed9781c7db9311a568",
"shasum": ""
},
"require": {
"ext-sockets": "*",
"php": ">=5.6.0"
},
"require-dev": {
"mikey179/vfsstream": "^1.6",
"squizlabs/php_codesniffer": "^3.3",
"yoast/phpunit-polyfills": "^1.0.1"
},
"type": "library",
"autoload": {
"psr-4": {
"DataDog\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Alex Corley",
"email": "[EMAIL]",
"role": "Developer"
},
{
"name": "Datadog",
"email": "[EMAIL]",
"role": "Developer"
}
],
"description": "An extremely simple PHP datadogstatsd client",
"homepage": "https://www.datadoghq.com/",
"keywords": [
"DataDog",
"check",
"error-reporting",
"health",
"logging",
"monitoring",
"statsd"
],
"support": {
"chat": "https://chat.datadoghq.com/",
"email": "[EMAIL]",
"irc": "irc://irc.freenode.net/datadog",
"issues": "https://github.com/DataDog/php-datadogstatsd/issues",
"source": "https://github.com/DataDog/php-datadogstatsd"
},
"time": "2025-08-25T15:42:11+00:00"
},
{
"name": "defuse/php-encryption",
"version": "v2.4.0",
"source": {
"type": "git",
"url": "https://github.com/defuse/php-encryption.git",
"reference": "f53396c2d34225064647a05ca76c1da9d99e5828"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/defuse/php-encryption/zipball/f53396c2d34225064647a05ca76c1da9d99e5828",
"reference": "f53396c2d34225064647a05ca76c1da9d99e5828",
"shasum": ""
},
"require": {
"ext-openssl": "*",
"paragonie/random_compat": ">= 2",
"php": ">=5.6.0"
},
"require-dev": {
"phpunit/phpunit": "^5|^6|^7|^8|^9|^10",
"yoast/phpunit-polyfills": "^2.0.0"
},
"bin": [
"bin/generate-defuse-key"
],
"type": "library",
"autoload": {
"psr-4": {
"Defuse\\Crypto\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Taylor Hornby",
"email": "[EMAIL]",
"homepage": "https://defuse.ca/"
},
{
"name": "Scott Arciszewski",
"email": "[EMAIL]",
"homepage": "https://paragonie.com"
}
],
"description": "Secure PHP Encryption Library",
"keywords": [
"aes",
"authenticated encryption",
"cipher",
"crypto",
"cryptography",
"encrypt",
"encryption",
"openssl",
"security",
"symmetric key cryptography"
],
"support": {
"issues": "https://github.com/defuse/php-encryption/issues",
"source": "https://github.com/defuse/php-encryption/tree/v2.4.0"
},
"time": "2023-06-19T06:10:36+00:00"
},
{
"name": "devio/pipedrive",
"version": "2.17.0",
"source": {
"type": "git",
"url": "https://github.com/IsraelOrtuno/pipedrive.git",
"reference": "7d3edfb12487b50046b0a91b1bd7dbe4002200e5"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/IsraelOrtuno/pipedrive/zipball/7d3edfb12487b50046b0a91b1bd7dbe4002200e5",
"reference": "7d3edfb12487b50046b0a91b1bd7dbe4002200e5",
"shasum": ""
},
"require": {
"guzzlehttp/guzzle": "~7.0|~6.0|~5.0|~4.0",
"illuminate/support": ">=4.0",
"laravel/helpers": "^1.0"
},
"require-dev": {
"phpspec/phpspec": "^2.4",
"symfony/var-dumper": "^2.7"
},
"type": "library",
"extra": {
"laravel": {
"aliases": {
"Pipedrive": "Devio\\Pipedrive\\PipedriveFacade"
},
"providers": [
"Devio\\Pipedrive\\PipedriveServiceProvider"
]
}
},
"autoload": {
"psr-4": {
"Devio\\Pipedrive\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Israel Ortuño",
"email": "[EMAIL]"
}
],
"description": "Complete Pipedrive API client for PHP and/or Laravel",
"keywords": [
"api",
"client",
"laravel",
"pipedrive"
],
"support": {
"issues": "https://github.com/IsraelOrtuno/pipedrive/issues",
"source": "https://github.com/IsraelOrtuno/pipedrive/tree/2.17.0"
},
"time": "2024-11-10T18:47:25+00:00"
},
{
"name": "dflydev/dot-access-data",
"version": "v3.0.3",
"source": {
"type": "git",
"url": "https://github.com/dflydev/dflydev-dot-access-data.git",
"reference": "a23a2bf4f31d3518f3ecb38660c95715dfead60f"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/dflydev/dflydev-dot-access-data/zipball/a23a2bf4f31d3518f3ecb38660c95715dfead60f",
"reference": "a23a2bf4f31d3518f3ecb38660c95715dfead60f",
"shasum": ""
},
"require": {
"php": "^7.1 || ^8.0"
},
"require-dev": {
"phpstan/phpstan": "^0.12.42",
"phpunit/phpunit": "^7.5 || ^8.5 || ^9.3",
"scrutinizer/ocular": "1.6.0",
"squizlabs/php_codesniffer": "^3.5",
"vimeo/psalm": "^4.0.0"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-main": "3.x-dev"
}
},
"autoload": {
"psr-4": {
"Dflydev\\DotAccessData\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Dragonfly Development Inc.",
"email": "[EMAIL]",
"homepage": "http://dflydev.com"
},
{
"name": "Beau Simensen",
"email": "[EMAIL]",
"homepage": "http://beausimensen.com"
},
{
"name": "Carlos Frutos",
"email": "[EMAIL]",
"homepage": "https://github.com/cfrutos"
},
{
"name": "Colin O'Dell",
"email": "[EMAIL]",
"homepage": "https://www.colinodell.com"
}
],
"description": "Given a deep data structure, access data by dot notation.",
"homepage": "https://github.com/dflydev/dflydev-dot-access-data",
"keywords": [
"access",
"data",
"dot",
"notation"
],
"support": {
"issues": "https://github.com/dflydev/dflydev-dot-access-data/issues",
"source": "https://github.com/dflydev/dflydev-dot-access-data/tree/v3.0.3"
},
"time": "2024-07-08T12:26:09+00:00"
},
{
"name": "doctrine/annotations",
"version": "2.0.2",
"source": {
"type": "git",
"url": "https://github.com/doctrine/annotations.git",
"reference": "901c2ee5d26eb64ff43c47976e114bf00843acf7"
...
|
NULL
|
|
53406
|
NULL
|
0
|
2026-04-20T08:09:44.689682+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-20/1776 /Users/lukas/.screenpipe/data/data/2026-04-20/1776672584689_m2.jpg...
|
PhpStorm
|
faVsco.js – console [EU]
|
True
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
#11894 on JY-18909-automa Project: faVsco.js, menu
#11894 on JY-18909-automated-reports-ask-jiminny, menu
Start Listening for PHP Debug Connections
TrackAutomatedReportGeneratedEventTest
Run 'TrackAutomatedReportGeneratedEventTest'
Debug 'TrackAutomatedReportGeneratedEventTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Code changed:
Hide
Sync Changes
Hide This Notification
2
Previous Highlighted Error
Next Highlighted Error
<?php
namespace Jiminny\Listeners\Activities\Coaching\UserPilot;
use GuzzleHttp\Exception\GuzzleException;
use Jiminny\Events\Activities\Coaching\Shared;
use Jiminny\Listeners\Activities\UserPilotActivityListener;
class CreateSharedEvent extends UserPilotActivityListener
{
/**
* Handle the event.
*/
public function handle(Shared $event): void
{
// Don't attempt to run this on environments with UserPilot not configured.
if (config('services.userpilot.token') === null) {
return;
}
try {
$this->userPilotService->track(
$event->share->from,
'shared-activity',
$this->generatePayload($event->share->activity)
);
} catch (GuzzleException $e) {
// Retry later.
$this->release(3600);
}
}
}
Execute
Explain Plan
Browse Query History
View Parameters
Open Query Execution Settings…
In-Editor Results
Tx: Auto
Cancel Running Statements
Playground
jiminny
Sync Changes
Hide This Notification
Code changed:
Hide
27
9
23
3
105
Previous Highlighted Error
Next Highlighted Error...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"bounds":{"left":0.025930852,"top":0.019952115,"width":0.03856383,"height":0.025538707},"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"#11894 on JY-18909-automated-reports-ask-jiminny, menu","depth":5,"bounds":{"left":0.064494684,"top":0.019952115,"width":0.12732713,"height":0.025538707},"help_text":"Pull request #11894 exists for current branch JY-18909-automated-reports-ask-jiminny","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"bounds":{"left":0.796875,"top":0.019952115,"width":0.011303191,"height":0.025538707},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"TrackAutomatedReportGeneratedEventTest","depth":6,"bounds":{"left":0.8121675,"top":0.019952115,"width":0.103390954,"height":0.025538707},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run 'TrackAutomatedReportGeneratedEventTest'","depth":6,"bounds":{"left":0.9155585,"top":0.019952115,"width":0.011303191,"height":0.025538707},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'TrackAutomatedReportGeneratedEventTest'","depth":6,"bounds":{"left":0.9268617,"top":0.019952115,"width":0.011303191,"height":0.025538707},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"More Actions","depth":6,"bounds":{"left":0.9381649,"top":0.019952115,"width":0.011303191,"height":0.025538707},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JetBrains AI","depth":5,"bounds":{"left":0.96609044,"top":0.019952115,"width":0.011303191,"height":0.025538707},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Search Everywhere","depth":5,"bounds":{"left":0.9773936,"top":0.019952115,"width":0.011303191,"height":0.025538707},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"IDE and Project Settings","depth":5,"bounds":{"left":0.9886968,"top":0.019952115,"width":0.011303186,"height":0.025538707},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.042220745,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"2","depth":4,"bounds":{"left":0.3793218,"top":0.273743,"width":0.007978723,"height":0.015163607},"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.38896278,"top":0.27214685,"width":0.00731383,"height":0.018355945},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"bounds":{"left":0.3962766,"top":0.27214685,"width":0.006981383,"height":0.018355945},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"<?php\n\nnamespace Jiminny\\Listeners\\Activities\\Coaching\\UserPilot;\n\nuse GuzzleHttp\\Exception\\GuzzleException;\nuse Jiminny\\Events\\Activities\\Coaching\\Shared;\nuse Jiminny\\Listeners\\Activities\\UserPilotActivityListener;\n\nclass CreateSharedEvent extends UserPilotActivityListener\n{\n /**\n * Handle the event.\n */\n public function handle(Shared $event): void\n {\n // Don't attempt to run this on environments with UserPilot not configured.\n if (config('services.userpilot.token') === null) {\n return;\n }\n\n try {\n $this->userPilotService->track(\n $event->share->from,\n 'shared-activity',\n $this->generatePayload($event->share->activity)\n );\n } catch (GuzzleException $e) {\n // Retry later.\n $this->release(3600);\n }\n }\n}","depth":4,"bounds":{"left":0.13597074,"top":0.27055067,"width":0.26728722,"height":0.7086991},"value":"<?php\n\nnamespace Jiminny\\Listeners\\Activities\\Coaching\\UserPilot;\n\nuse GuzzleHttp\\Exception\\GuzzleException;\nuse Jiminny\\Events\\Activities\\Coaching\\Shared;\nuse Jiminny\\Listeners\\Activities\\UserPilotActivityListener;\n\nclass CreateSharedEvent extends UserPilotActivityListener\n{\n /**\n * Handle the event.\n */\n public function handle(Shared $event): void\n {\n // Don't attempt to run this on environments with UserPilot not configured.\n if (config('services.userpilot.token') === null) {\n return;\n }\n\n try {\n $this->userPilotService->track(\n $event->share->from,\n 'shared-activity',\n $this->generatePayload($event->share->activity)\n );\n } catch (GuzzleException $e) {\n // Retry later.\n $this->release(3600);\n }\n }\n}","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Execute","depth":4,"bounds":{"left":0.40492022,"top":0.09896249,"width":0.008643617,"height":0.01915403},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Explain Plan","depth":4,"bounds":{"left":0.41356382,"top":0.09896249,"width":0.008643617,"height":0.01915403},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Browse Query History","depth":4,"bounds":{"left":0.4245346,"top":0.09896249,"width":0.008643617,"height":0.01915403},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"View Parameters","depth":4,"bounds":{"left":0.4331782,"top":0.09896249,"width":0.008643617,"height":0.01915403},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Open Query Execution Settings…","depth":4,"bounds":{"left":0.4418218,"top":0.09896249,"width":0.008643617,"height":0.01915403},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"In-Editor Results","depth":4,"bounds":{"left":0.45279256,"top":0.09896249,"width":0.008643617,"height":0.01915403},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Tx: Auto","depth":4,"bounds":{"left":0.4637633,"top":0.09896249,"width":0.024268618,"height":0.01915403},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Cancel Running Statements","depth":4,"bounds":{"left":0.49035904,"top":0.09896249,"width":0.008643617,"height":0.01915403},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Playground","depth":4,"bounds":{"left":0.5013298,"top":0.09896249,"width":0.029587766,"height":0.01915403},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"jiminny","depth":4,"bounds":{"left":0.69913566,"top":0.09896249,"width":0.02825798,"height":0.01915403},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.042220745,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"27","depth":4,"bounds":{"left":0.6565825,"top":0.123703115,"width":0.009973404,"height":0.015163607},"role_description":"text"},{"role":"AXStaticText","text":"9","depth":4,"bounds":{"left":0.66855055,"top":0.123703115,"width":0.007978723,"height":0.015163607},"role_description":"text"},{"role":"AXStaticText","text":"23","depth":4,"bounds":{"left":0.67852396,"top":0.123703115,"width":0.010305851,"height":0.015163607},"role_description":"text"},{"role":"AXStaticText","text":"3","depth":4,"bounds":{"left":0.69082445,"top":0.123703115,"width":0.007978723,"height":0.015163607},"role_description":"text"},{"role":"AXStaticText","text":"105","depth":4,"bounds":{"left":0.70079786,"top":0.123703115,"width":0.011968086,"height":0.015163607},"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.7144282,"top":0.12210695,"width":0.00731383,"height":0.018355945},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"bounds":{"left":0.72174203,"top":0.12210695,"width":0.006981383,"height":0.018355945},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
5997440809594510594
|
-8939547950319987748
|
click
|
accessibility
|
NULL
|
Project: faVsco.js, menu
#11894 on JY-18909-automa Project: faVsco.js, menu
#11894 on JY-18909-automated-reports-ask-jiminny, menu
Start Listening for PHP Debug Connections
TrackAutomatedReportGeneratedEventTest
Run 'TrackAutomatedReportGeneratedEventTest'
Debug 'TrackAutomatedReportGeneratedEventTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Code changed:
Hide
Sync Changes
Hide This Notification
2
Previous Highlighted Error
Next Highlighted Error
<?php
namespace Jiminny\Listeners\Activities\Coaching\UserPilot;
use GuzzleHttp\Exception\GuzzleException;
use Jiminny\Events\Activities\Coaching\Shared;
use Jiminny\Listeners\Activities\UserPilotActivityListener;
class CreateSharedEvent extends UserPilotActivityListener
{
/**
* Handle the event.
*/
public function handle(Shared $event): void
{
// Don't attempt to run this on environments with UserPilot not configured.
if (config('services.userpilot.token') === null) {
return;
}
try {
$this->userPilotService->track(
$event->share->from,
'shared-activity',
$this->generatePayload($event->share->activity)
);
} catch (GuzzleException $e) {
// Retry later.
$this->release(3600);
}
}
}
Execute
Explain Plan
Browse Query History
View Parameters
Open Query Execution Settings…
In-Editor Results
Tx: Auto
Cancel Running Statements
Playground
jiminny
Sync Changes
Hide This Notification
Code changed:
Hide
27
9
23
3
105
Previous Highlighted Error
Next Highlighted Error...
|
NULL
|
|
53407
|
NULL
|
0
|
2026-04-20T08:09:44.691680+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-20/1776 /Users/lukas/.screenpipe/data/data/2026-04-20/1776672584691_m1.jpg...
|
PhpStorm
|
faVsco.js – console [EU]
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
#11894 on JY-18909-automa Project: faVsco.js, menu
#11894 on JY-18909-automated-reports-ask-jiminny, menu
Start Listening for PHP Debug Connections
TrackAutomatedReportGeneratedEventTest
Run 'TrackAutomatedReportGeneratedEventTest'
Debug 'TrackAutomatedReportGeneratedEventTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Code changed:
Hide
Sync Changes
Hide This Notification
2
Previous Highlighted Error
Next Highlighted Error
<?php
namespace Jiminny\Listeners\Activities\Coaching\UserPilot;
use GuzzleHttp\Exception\GuzzleException;
use Jiminny\Events\Activities\Coaching\Shared;
use Jiminny\Listeners\Activities\UserPilotActivityListener;
class CreateSharedEvent extends UserPilotActivityListener
{
/**
* Handle the event.
*/
public function handle(Shared $event): void
{
// Don't attempt to run this on environments with UserPilot not configured.
if (config('services.userpilot.token') === null) {
return;
}
try {
$this->userPilotService->track(
$event->share->from,
'shared-activity',
$this->generatePayload($event->share->activity)
);
} catch (GuzzleException $e) {
// Retry later.
$this->release(3600);
}
}
}
Execute
Explain Plan
Browse Query History
View Parameters
Open Query Execution Settings…
In-Editor Results
Tx: Auto
Cancel Running Statements
Playground
jiminny
Sync Changes
Hide This Notification
Code changed:
Hide
27
9
23
3
105
Previous Highlighted Error
Next Highlighted Error
SELECT * FROM team_features where team_id = 1;
SELECT * FROM teams WHERE name LIKE '%Vixio%'; # 340,270,11922
SELECT * FROM users WHERE team_id = 340; # 12015
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 340
and sa.provider = 'salesforce';
# and sa.provider = 'salesloft';
select * from crm_fields where crm_configuration_id = 270 and object_type = 'event';
# 125558 - Event Type - Event_Type__c
# 125552 - Event Status - Event_Status__c
SELECT * FROM sidekick_settings WHERE team_id = 340;
SELECT * FROM crm_field_values WHERE crm_field_id in (125552);
select * from activities where crm_configuration_id = 270
and type = 'conference' and crm_provider_id IS NOT NULL
and actual_start_time > '2024-09-16 09:00:00' order by scheduled_start_time;
SELECT * FROM activities WHERE id = 20871677;
SELECT * FROM crm_field_data WHERE activity_id = 20871677;
select * from crm_layouts where crm_configuration_id = 270;
select * from crm_layout_entities where crm_layout_id in (886,887);
SELECT * FROM crm_configurations WHERE id = 270;
select * from playbooks where team_id = 340; # 1514
select * from groups where team_id = 340;
SELECT * FROM crm_fields WHERE id IN (125393, 125401);
select g.name as 'team name', p.name as 'playbook name', f.label as 'activity type field' from groups g
join playbooks p on g.playbook_id = p.id
join crm_fields f on p.activity_field_id = f.id
where g.team_id = 340;
SELECT * FROM activities WHERE uuid_to_bin('0c180357-67d2-419e-a8c3-b832a3490770') = uuid; # 20448716
select * from crm_field_data where object_id = 20448716;
select * from activities where crm_configuration_id = 270 and provider = 'salesloft' order by id desc;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%CybSafe%'; # 343,273,12008
select * from opportunities where team_id = 343;
select * from opportunities where team_id = 343 and crm_provider_id = '18099102526';
select * from opportunities where team_id = 343 and account_id = 945217482;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 343
and sa.provider = 'hubspot';
select * from accounts where team_id = 343 order by name asc;
select * from stages where crm_configuration_id = 273 and type = 'opportunity';
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Voyado%'; # 353,283,12143
SELECT * FROM activities WHERE crm_configuration_id = 283 and account_id = 3777844 order by id desc;
SELECT * FROM accounts WHERE team_id = 353 AND name LIKE '%Salesloft%';
SELECT * FROM activities WHERE id = 20717903;
select * from participants where activity_id IN (20929172,20928605,20928468,20926272,20926271,20926270,20926269,20916499,20916454,20916436,20916435,20900015,20900014,20900013,20897312,20897243,20897241,20897237,20897232,20897229,20893648,20893231,20893230,20893229,20893228,20889784,20885039,20885038,20885037,20885036,20885035,20882728,20882708,20882703,20882702,20869828,20869811,20869806,20869801,20869799,20869798,20869796,20869795,20869794,20869761,20869760,20869759,20868688,20868687,20850340,20847195,20841710,20833967,20827021,20825307,20825305,20825297,20824615,20824400,20823927,20821760,20795588,20794233,20794057,20793710,20785811,20781789,20781394,20781307,20762651,20758453,20758282,20757323,20756643,20756636,20756629,20756627,20756606,20756605,20756604,20756603,20756602,20756600,20756599,20756598,20756595,20756594,20756589,20756587,20756577,20756573,20748918,20748386,20748385,20748384,20748383,20748382,20748381,20748380,20748379,20748377,20748375,20748373,20743301,20717905,20717904,20717903,20717901,20717899);
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 353
and sa.provider = 'salesforce';
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%modern world business solutions%'; # 345,275,12016, [EMAIL]
SELECT * FROM activities WHERE uuid_to_bin('3921d399-3fef-4609-a291-b0097a166d43') = uuid;
# id: 20940638, user: 12022, contact: 5305871
SELECT * FROM activity_summary_logs WHERE activity_id = 20940638;
select * from contacts where team_id = 345 and crm_provider_id = '30891432415' order by name asc; # 5305871
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 345
and sa.provider = 'hubspot';
select * from users where team_id = 345 and id = 12022;
SELECT * FROM crm_profiles WHERE user_id = 12022;
SELECT * FROM participants WHERE activity_id = 20940638;
SELECT * FROM users u
JOIN crm_profiles cp ON u.id = cp.user_id
WHERE u.team_id = 345;
select * from contacts where team_id = 345 and crm_provider_id = '30880813535' order by name desc; # 5305871
select * from team_features where team_id = 345;
SELECT * FROM activities WHERE uuid_to_bin('11701e2d-2f82-4dab-a616-1db4fad238df') = uuid; # 21115197
SELECT * FROM participants WHERE activity_id = 20897406;
SELECT * FROM activities WHERE uuid_to_bin('63ba55cd-1abc-447d-83da-0137000005b7') = uuid; # 20953912
SELECT * FROM activities WHERE crm_configuration_id = 275 and provider = 'ringcentral' and title like '%1252629100%';
SELECT * FROM activities WHERE id = 20946641;
SELECT * FROM crm_profiles WHERE user_id = 10211;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Lunio%'; # 120,97,10984, [EMAIL]
SELECT * FROM opportunities WHERE crm_configuration_id = 97 and crm_provider_id = '006N1000006c5PpIAI';
select * from stages where crm_configuration_id = 97 and type = 'opportunity';
select * from opportunities where team_id = 120;
select * from crm_configurations crm join teams t on crm.id = t.crm_id
where 1=1
AND t.current_billing_plan IS NOT NULL
AND crm.auto_sync_activity = 0
and crm.provider = 'hubspot';
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Exclaimer%'; # 270,205,10053,[EMAIL]
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 270
and sa.provider = 'salesforce';
SELECT * FROM activities WHERE uuid_to_bin('b54df794-2a9a-4957-8d80-09a600ead5f8') = uuid; # 21637956
SELECT * FROM crm_profiles WHERE user_id = 11446;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Cygnetise%'; # 372,300,12554, [EMAIL]
select * from playbooks where team_id = 372;
select * from crm_fields where crm_configuration_id = 300 and object_type = 'event'; # 141340
SELECT * FROM crm_field_values WHERE crm_field_id = 141340;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 372
and sa.provider = 'salesforce';
select * from crm_profiles where crm_configuration_id = 300;
SELECT * FROM crm_configurations WHERE team_id = 372;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Planday%'; # 291,242,11501,[EMAIL]
SELECT * FROM opportunities WHERE team_id = 291 and crm_provider_id = '006bG000005DO86QAG'; # 3207756
select * from crm_field_data where object_id = 3207756;
SELECT * FROM crm_fields WHERE id = 111834;
select f.id, f.crm_provider_id AS field_name, f.label, fd.object_id AS dealId, fd.value
FROM crm_fields f
JOIN crm_field_data fd ON f.id = fd.crm_field_id
WHERE f.crm_configuration_id = 242
AND f.object_type = 'opportunity'
AND fd.object_id IN (3207756)
ORDER BY fd.object_id, fd.updated_at;
SELECT * FROM crm_configurations WHERE auto_connect = 1;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Tour%'; # 187,209,8150,[EMAIL]
select * from group_deal_risk_types drgt join groups g on drgt.group_id = g.id
where g.team_id = 187;
select * from `groups` where team_id = 187;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 187
and sa.provider = 'salesforce';
# Destination - 98870 - Destination__c
# Stage - 79014 - StageName
# Land Arrangement - 98856 - Land_Arrangement__c
# Flight - 98848 - Flight__c
# Last activity date - 98812 - LastActivityDate
# Last modified date - 98809 - LastModifiedDate
# Last inbound mail timestamp - 99151 - Last_Inbound_Mail_Timestamp__c
# next call - 98864 - Next_Call__c
select * from crm_fields where crm_configuration_id = 209 and object_type = 'opportunity';
SELECT * FROM crm_layouts WHERE crm_configuration_id = 209;
SELECT * FROM crm_layout_entities WHERE crm_layout_id = 682;
select * from opportunities where team_id = 187 and name LIKE'%Muriel Sal%';
select * from opportunities where team_id = 187 and user_id = 9951 and is_closed = 0;
select * from activities where opportunity_id = 3538248;
SELECT * FROM crm_profiles WHERE user_id = 8150;
select * from deal_risks where opportunity_id = 3538248;
select * from teams where crm_id IS NULL;
SELECT opp.id AS opportunity_id,
u.group_id AS group_id,
MAX(
CASE
WHEN a.type IN ("sms-inbound", "sms-outbound") THEN a.created_at
ELSE a.actual_end_time
END) as last_date
FROM opportunities opp
left join activities a on a.opportunity_id = opp.id
inner join users u on opp.user_id = u.id
where opp.user_id IN (9951)
AND opp.is_closed = 0
and a.status IN ('completed', 'received', 'delivered') OR a.status IS NULL
group by opp.id;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Cybsafe%'; # 343,301,12008,[EMAIL]
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 343
and sa.provider = 'hubspot';
SELECT * FROM crm_profiles WHERE crm_configuration_id = 301;
SELECT * FROM contacts WHERE id = 6612363;
SELECT * FROM accounts WHERE id = 4235676;
SELECT * FROM opportunities WHERE crm_configuration_id = 301 and crm_provider_id = 32983784868;
select * from opportunity_stages where opportunity_id = 4503759;
# SELECT * FROM opportunities WHERE id = 4569937;
select * from activities where crm_configuration_id = 301;
SELECT * FROM activities WHERE uuid_to_bin('d3b2b28b-c3d0-4c2d-8ed0-eef42855278a') = uuid; # 26330370
SELECT * FROM participants WHERE activity_id = 26330370;
SELECT * FROM teams WHERE id = 375;
select * from playbooks where team_id = 375;
select * from stages where crm_configuration_id = 301 and type = 'opportunity';
select * from teams;
select * from contact_roles;
SELECT * FROM opportunities WHERE team_id = 343 and user_id = 12871 and close_date >= '2024-11-01';
select * from users u join crm_profiles cp on cp.user_id = u.id where u.team_id = 343;
SELECT * FROM crm_field_data WHERE object_id = 3771706;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 343
and sa.provider = 'hubspot';
SELECT * FROM crm_fields WHERE crm_configuration_id = 301 and object_type = 'opportunity'
and crm_provider_id LIKE "%traffic_light%";
SELECT * FROM crm_field_values WHERE crm_field_id IN (144020,144048,144111,144113,144126,144481,144508,144531);
SELECT fd.* FROM opportunities o
JOIN crm_field_data fd ON o.id = fd.object_id
WHERE o.team_id = 343
# and o.user_id IS NOT NULL
and fd.crm_field_id IN (144020,144048,144111,144113,144126,144481,144508,144531)
and fd.value != ''
order by value desc
# group by o.id
;
SELECT * FROM opportunities WHERE id = 3769843;
SELECT * FROM teams WHERE name LIKE '%Tour%'; # 187,209,8150, [EMAIL]
SELECT * FROM crm_layouts WHERE crm_configuration_id = 209;
SELECT * FROM crm_layout_entities WHERE crm_layout_id = 682;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Funding Circle%'; # 220,177,8603,[EMAIL]
SELECT * FROM activities WHERE uuid_to_bin('7a40e99b-3b37-4bb1-b983-325b81801c01') = uuid; # 23139839
SELECT * FROM opportunities WHERE id = 3855992;
SELECT * FROM users WHERE name LIKE '%Angus Pollard%'; # 8988
SELECT * FROM teams WHERE name LIKE '%Story Terrace%'; # 379, 307, 12894
SELECT * FROM crm_fields WHERE crm_configuration_id = 307 and object_type != 'opportunity';
select * from contacts where team_id = 379 and name like '%bebro%'; # 5874411, crm: 77229348507
SELECT * FROM crm_field_data WHERE object_id = 5874411;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 379
and sa.provider = 'hubspot';
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%mentio%'; # 117, 94, 6371, [EMAIL]
SELECT * FROM activities WHERE uuid_to_bin('82939311-1af0-4506-8546-21e8d1fdf2c1') = uuid;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Tourlane%'; # 187, 209, 8150, [EMAIL]
SELECT * FROM opportunities WHERE team_id = 187 and crm_provider_id = '006Se000008xfvNIAQ'; # 3537793
select * from generic_ai_prompts where subject_id = 3537793;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Lunio%'; # 120, 97, 10984, [EMAIL]
SELECT * FROM crm_configurations WHERE id = 97;
SELECT * FROM crm_layouts WHERE crm_configuration_id = 97;
SELECT * FROM crm_layout_entities WHERE crm_layout_id = 355;
SELECT * FROM crm_fields WHERE id = 32682;
select cfd.value, o.* from opportunities o
join crm_field_data cfd on o.id = cfd.object_id and cfd.crm_field_id = 32682
where team_id = 120
and cfd.value != ''
;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 120
and sa.provider = 'salesforce';
select * from opportunities where team_id = 120 and crm_provider_id = '006N1000007X8MAIA0';
SELECT * FROM crm_field_data WHERE object_id = 2313439;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE id = 410;
SELECT * FROM teams WHERE name LIKE '%Local Business Oxford%';
select * from scorecards where team_id = 410;
select * from scorecard_rules;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Funding%'; # 220, 177, 8603, [EMAIL]
select * from activities a
join opportunities o on a.opportunity_id = o.id
join users u on o.user_id = u.id
where a.crm_configuration_id = 177 and a.type LIKE '%email-out%'
# and a.actual_end_time > '2024-12-16 00:00:00'
# and o.remotely_created_at > '2024-12-01 00:00:00'
# and u.group_id = 1014
and u.id = 9021
order by a.id desc;
SELECT * FROM opportunities WHERE id in (3981384,4017346);
SELECT * FROM users WHERE team_id = 220 and id IN (8775, 11435);
select * from users where id = 9021;
select * from inboxes where user_id = 9021;
select * from inbox_emails where inbox_id = 1349 and email_date > '2024-12-18 00:00:00';
select * from email_messages where team_id = 220
and orig_date > '2024-12-16 00:00:00' and orig_date < '2024-12-19 00:00:00'
and subject LIKE '%Personal%'
# and 'from' = '[EMAIL]'
;
select * from activities a
join opportunities o on a.opportunity_id = o.id
where a.user_id = 9021 and a.type LIKE '%email-out%'
and a.actual_end_time > '2024-12-18 00:00:00'
and o.user_id IS NOT NULL
and o.remotely_created_at > '2024-12-01 00:00:00'
order by a.id desc;
SELECT * FROM opportunities WHERE team_id = 220 and name LIKE '%Right Car move Limited%' and id = 3966852;
select * from activities where crm_configuration_id = 177 and type LIKE '%email%' and opportunity_id = 3966852 order by id desc;
select * from team_settings where name IN ('useCloseDate');
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Hurree%'; # 104, 81, 6175, [EMAIL]
SELECT * FROM opportunities WHERE team_id = 104 and name = 'PropOp';
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 104
and sa.provider = 'hubspot';
select * from crm_configurations where last_synced_at > '2025-01-19 01:00:00'
select * from teams where crm_id IS NULL;
select t.name as 'team', u.name as 'owner', u.email, u.phone
from teams t
join activity_providers ap on t.id = ap.team_id
join users u on t.owner_id = u.id
where 1=1
and t.status = 'active'
and ap.is_enabled = 1
# and u.status = 1
and ap.provider = 'ms-teams';
select * from crm_configurations where provider = 'bullhorn'; # 344
SELECT * FROM teams WHERE id = 442; # 14293
select * from users where team_id = 442;
select * from social_accounts sa where sa.sociable_id = 14293;
select * from invitations where team_id = 442;
# [PASSWORD_DOTS]
SELECT * FROM users WHERE email LIKE '%[EMAIL]%'; # 14022
SELECT * FROM teams WHERE id = 429;
select * from opportunities where team_id = 429 and crm_provider_id IN (16157415775, 22246219645);
select * from activities where opportunity_id in (4340436,4353519);
select * from transcription where activity_id IN (25630961,25381771);
select * from generic_ai_prompts where subject_id IN (4353519);
SELECT
a.id as activity_id,
a.opportunity_id,
a.type as activity_type,
a.language,
CONCAT(a.title, a.description) AS mail_content,
e.from AS mail_from,
e.to AS mail_to,
e.subject AS mail_subject,
e.body AS mail_body,
p.type as prompt_type,
p.status as prompt_status,
p.content AS prompt_content,
a.actual_start_time as created_at
FROM activities a
LEFT JOIN ai_prompts p ON a.transcription_id = p.transcription_id AND p.deleted_at IS NULL
LEFT JOIN email_messages e ON a.id = e.activity_id
WHERE a.actual_start_time > '2024-01-01 00:00:00'
AND a.opportunity_id IN (4353519)
AND a.status IN ('completed', 'received', 'delivered')
AND a.deleted_at IS NULL
AND a.type NOT IN ('sms-inbound', 'sms-outbound')
ORDER BY a.opportunity_id ASC, a.id ASC;
SELECT * FROM users WHERE name LIKE '%George Fierstone%'; # 14293
SELECT * FROM teams WHERE id = 442;
SELECT * FROM crm_configurations WHERE id = 344;
select * from team_features where team_id = 442;
select * from groups where team_id = 442;
select * from playbooks where team_id = 442;
select * from playbook_categories where playbook_id = 1729;
select * from crm_fields where crm_configuration_id = 344 and id = 172024;
SELECT * FROM crm_field_values WHERE crm_field_id = 172024;
select * from crm_layouts where crm_configuration_id = 344;
select * from playbook_layouts where playbook_id = 1729;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Learning%'; # 260, 221, 9444
select s.*
# , s.sent_at, u.name, a.*
from activity_summary_logs s
inner join activities a on a.id = s.activity_id
inner join users u on u.id = a.user_id
where a.crm_configuration_id = 356
and s.sent_at > date_sub(now(), interval 60 day)
order by a.actual_end_time desc;
select * from activities a
# inner join activity_summary_logs s on s.activity_id = a.id
where a.crm_configuration_id = 356 and a.actual_end_time > date_sub(now(), interval 60 day)
# and a.crm_provider_id is not null
# and provider <> 'ringcentral'
and status = 'completed'
order by a.actual_end_time desc;
select * from teams order by id desc; # 17328, 32, 17830, [EMAIL]
SELECT * FROM users;
SELECT * FROM users where team_id = 260 and status = 1; # 201 - 150 active
SELECT * FROM teams WHERE id = 260;
select * from team_settings where team_id = 260;
select * from crm_configurations where team_id = 260;
SELECT * FROM crm_layouts WHERE crm_configuration_id = 356;
SELECT * FROM crm_layout_entities WHERE crm_layout_id = 1184;
select * from accounts where crm_configuration_id = 221 order by id desc; # 7000
select * from leads where crm_configuration_id = 221 order by id desc; # 0
select * from contacts where crm_configuration_id = 221 order by id desc; # 200 000
select * from opportunities where crm_configuration_id = 221 order by id desc; # 0
select * from crm_profiles where crm_configuration_id = 221 order by id desc; # 23
select * from crm_fields where crm_configuration_id = 221;
select * from crm_field_values where crm_field_id = 5302 order by id desc;
select * from crm_layouts where crm_configuration_id = 221 order by id desc;
select * from stages where crm_configuration_id = 221 order by id desc;
select * from accounts where crm_configuration_id = 356 order by id desc; # 7000
select * from leads where crm_configuration_id = 356 order by id desc; # 0
select * from contacts where crm_configuration_id = 356 order by id desc; # 200 000
select * from opportunities where crm_configuration_id = 356 order by id desc; # 0
select * from crm_profiles where crm_configuration_id = 356 order by id desc; # 23
select * from crm_fields where crm_configuration_id = 356;
select * from crm_field_values where crm_field_id = 5302 order by id desc;
select * from crm_layouts where crm_configuration_id = 356 order by id desc;
select * from stages where crm_configuration_id = 356 order by id desc;
select * from playbooks where team_id = 260 order by id desc; # 4 (2 deleted)
select * from groups where team_id = 260 order by id desc; # 27 groups, (2 deleted)
select * from playbook_layouts where playbook_id IN (1410,1409,1276,1254); # 4
select ce.* from calendars c
join users u on c.user_id = u.id
join calendar_events ce on c.id = ce.calendar_id
where u.team_id = 260
and (ce.start_time > '2025-02-21 00:00:00')
;
# calendar events 1207
#
select * from opportunities where team_id = 260;
SELECT * FROM crm_field_data WHERE object_id = 4696496;
select * from activities where crm_configuration_id = 356 and crm_provider_id IS NOT NULL;
select * from activities where crm_configuration_id IN (221) and provider NOT IN ('ms-teams', 'uploader', 'zoom-bot')
# and type = 'conference' and status = 'scheduled' and activities.is_internal = 0
and created_at > '2024-03-01 00:00:00'
order by id desc; # 880 000, ringcentral, avaya
SELECT * FROM participants WHERE activity_id = 26371744;
# all activities 942 000 +
# conference 7385 - scheduled 984 - external 343
select * from activities where id = 26321812;
select * from participants where activity_id = 26321812;
select * from participants where activity_id in (26414510,26414514,26414516,26414604,26414653,26414655);
select * from leads where id in (720428,689175,731546,645866,621037);
select * from users where id = 13841;
select * from opportunities where user_id = 9541;
select * from stages where id = 15900;
select * from accounts where
# id IN (4160055,5053725,4965303,4896434)
id in (4584518,3249934,3218025,3891133,3399450,4172999,4485161,3101785,4587203,3070816,2870343,2870341,3563940,4550846,3424464,3249963,2870342)
;
select * from activities where id = 26654935;
SELECT * FROM opportunities WHERE id = 4803458;
SELECT * FROM opportunities where team_id = 260 and user_id = 13841 AND stage_id = 15900;
SELECT id, uuid, provider, type, lead_id, account_id, contact_id, opportunity_id, stage_id, status, recording_state, title, actual_start_time, actual_end_time
FROM activities WHERE user_id = 13841 AND opportunity_id IN (4729783, 4731717, 4731726, 4732064, 4732849, 4803458, 4813213);
SELECT DISTINCT
o.id, o.stage_id, s.name, a.title,
a.*
FROM activities a
# INNER JOIN tracks t ON a.id = t.activity_id
INNER JOIN users u ON a.user_id = u.id
INNER JOIN teams team ON u.team_id = team.id
INNER JOIN groups g ON u.group_id = g.id
INNER JOIN opportunities o ON a.opportunity_id = o.id
INNER JOIN stages s ON o.stage_id = s.id
WHERE
a.crm_configuration_id = 356
AND a.status IN ('completed', 'failed')
AND a.recording_state != 'stopped'
# and a.user_id = 13841
AND u.uuid = uuid_to_bin('6f40e4b8-c340-4059-b4ac-1728e87ea99e')
AND team.uuid = uuid_to_bin('a607fba7-452e-4683-b2af-00d6cb52c93c')
AND g.uuid = uuid_to_bin('b5d69e40-24a0-4c16-810b-5fa462299f94')
AND a.type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')
# AND t.type IN ('audio', 'video')
AND (
(a.actual_start_time BETWEEN '2025-03-13 00:00:00' AND '2025-03-18 07:59:59')
OR
(
a.actual_start_time IS NULL
AND a.type IN ('sms-outbound', 'sms-inbound')
AND a.created_at BETWEEN '2025-03-13 00:00:00' AND '2025-03-18 07:59:59'
)
)
AND (
a.is_private = 0
OR (
a.is_private = 1
AND u.uuid = uuid_to_bin('6f40e4b8-c340-4059-b4ac-1728e87ea99e')
)
)
AND (
# s.id = 15900
s.uuid = uuid_to_bin('04ca1c26-c666-4268-a129-419c0acffd73')
OR s.uuid IS NULL -- Include records without opportunity stage
)
ORDER BY a.actual_end_time DESC;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Lead Forensics%'; # 190, 162, 8474, [EMAIL]
SELECT * FROM users WHERE team_id = 190;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 190
and sa.provider = 'hubspot';
select * from role_user where user_id = 8474;
select * from crm_configurations where provider = 'bullhorn';
SELECT * FROM opportunities WHERE uuid_to_bin('94578249-65ec-4205-90f2-7d1a7d5ab64a') = uuid;
SELECT * FROM users WHERE uuid_to_bin('26dbadeb-926f-4150-b11b-771b9d4c2f9a') = uuid;
SELECT * FROM opportunities WHERE id = 4732493;
select * from activities where opportunity_id = 4732493;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE id = 443; # 358, 14315, [EMAIL]
SELECT * FROM opportunities WHERE team_id = 443;
SELECT a.id, a.type, a.user_id, a.status, a.deleted_at, u.name, u.email, u.team_id as activity_team_id, u.status, u.deleted_at, t.name, t.status, s.team_id as stage_team_id
FROM activities AS a
JOIN stages AS s ON a.stage_id = s.id
JOIN users AS u ON u.id = a.user_id
JOIN teams AS t ON t.id = s.team_id
WHERE u.team_id <> s.team_id and t.id > 135;
SELECT
crm_configuration_id,
crm_provider_id,
COUNT(*) as duplicate_count,
GROUP_CONCAT(id) as stage_ids,
GROUP_CONCAT(name) as stage_names
FROM stages
GROUP BY crm_configuration_id, crm_provider_id
HAVING COUNT(*) > 1
ORDER BY duplicate_count DESC;
select * from stages where id IN (14898,14907);
select * from business_processes;
SELECT *
FROM crm_configurations
WHERE team_id IN (
SELECT team_id
FROM crm_configurations
GROUP BY team_id
HAVING COUNT(*) > 1
)
ORDER BY team_id;
SELECT *
FROM teams
WHERE crm_id IN (
SELECT crm_id
FROM teams
GROUP BY crm_id
HAVING COUNT(*) > 1
)
ORDER BY crm_id;
# [PASSWORD_DOTS]
select * from crm_configurations where provider = 'integration-app';
SELECT * FROM teams WHERE id = 443; # Correre Naturale 358 14315 [EMAIL]
select * from activities where crm_configuration_id = 358 order by actual_end_time desc;
select id, uuid, actual_end_time, crm_provider_id, is_internal, playbook_category_id, type, user_id, lead_id, contact_id, account_id, opportunity_id, status, title from activities where crm_configuration_id = 358 order by actual_end_time desc;
select * from team_features where team_id = 358;
select * from activity_summary_logs;
select * from teams where id = 406;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Sportfive%'; # 267, 202, 14637, [EMAIL]
select * from activities where crm_configuration_id = 202 order by actual_end_time desc;
SELECT * FROM users where id = 14637;
SELECT * FROM teams where id = 267;
SELECT * FROM groups where id = 1118;
select g.name, a.title, uuid_from_bin(a.uuid), a.external_id, a.status, a.recording_state, a.recording_reason_code, a.scheduled_start_time, a.scheduled_end_time, a.actual_start_time, a.actual_end_time from activities a
inner join users u on u.id = a.user_id
inner join groups g on g.id = u.group_id
where a.crm_configuration_id = 202
and a.is_internal = 0
and (a.scheduled_start_time between '2025-03-19 00:00:00' and '2025-03-21 00:00:00')
and a.type = 'conference'
and a.status != 'completed'
and a.external_id is not null
order by a.scheduled_start_time desc;
SELECT * FROM activities
WHERE crm_configuration_id = 202
AND status IN ('completed', 'failed')
AND recording_state != 'stopped'
AND type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')
AND (is_private = 0 OR user_id = 14637)
AND (
(
actual_start_time BETWEEN '2025-03-12 12:00:00' AND '2025-03-24 11:59:59'
) OR (
actual_start_time IS NULL
AND type IN ('sms-outbound', 'sms-inbound')
AND created_at BETWEEN '2025-03-12 12:00:00' AND '2025-03-24 11:59:59'
)
)
AND NOT EXISTS (
SELECT 1
FROM tracks
WHERE
tracks.activity_id = activities.id
AND tracks.type IN ('audio', 'video')
)
ORDER BY actual_end_time DESC;
SELECT DISTINCT
a.*
FROM activities a
INNER JOIN tracks t ON a.id = t.activity_id
INNER JOIN users u ON a.user_id = u.id
INNER JOIN teams team ON u.team_id = team.id
WHERE
a.crm_configuration_id = 202
AND a.status IN ('completed', 'failed')
AND a.recording_state != 'stopped'
# and a.user_id = 14637
AND a.type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')
# AND t.type IN ('audio', 'video')
AND (
(a.actual_start_time BETWEEN '2025-03-12 12:00:00' AND '2025-03-24 11:59:59')
OR
(
a.actual_start_time IS NULL
AND a.type IN ('sms-outbound', 'sms-inbound')
AND a.created_at BETWEEN '2025-03-12 12:00:00' AND '2025-03-24 11:59:59'
)
)
AND (
a.is_private = 0
OR (
a.is_private = 1
AND a.user_id = 14637
)
)
ORDER BY a.actual_end_time DESC
;
SELECT DISTINCT a.*
FROM activities a
INNER JOIN users u ON a.user_id = u.id
INNER JOIN teams t ON u.team_id = t.id
# INNER JOIN tracks tr ON a.id = tr.activity_id
# INNER JOIN groups g ON u.group_id = g.id
WHERE 1=1
AND t.id = 267
# AND t.uuid = uuid_to_bin('aed4927b-f1ea-499e-94c3-83762fd233e8')
AND a.status IN ('completed', 'failed')
AND a.recording_state != 'stopped'
AND a.type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')
# AND tr.type NOT IN ('audio', 'video')
AND (
a.is_private = 0
OR a.user_id = 14637
)
AND (
(a.actual_start_time BETWEEN '2025-03-19 00:00:00' AND '2025-03-21 23:59:59')
OR (
a.actual_start_time IS NULL
AND a.type IN ('sms-outbound', 'sms-inbound')
AND a.created_at BETWEEN '2025-03-19 00:00:00' AND '2025-03-21 23:59:59'
)
)
# and NOT EXISTS (
# SELECT 1
# FROM tracks t
# WHERE t.activity_id = a.id
# AND t.type IN ('audio', 'video')
# )
ORDER BY a.actual_end_time DESC;
SELECT * FROM tracks WHERE activity_id = 26485995;
select a.is_private, a.title, uuid_from_bin(a.uuid), a.external_id, a.status, a.recording_state, a.recording_reason_code, a.scheduled_start_time, a.scheduled_end_time, a.actual_start_time, a.actual_end_time from activities a
inner join users u on u.id = a.user_id
where a.crm_configuration_id = 202
# and a.is_internal = 0
and (a.actual_start_time between '2025-03-19 00:00:00' and '2025-03-21 00:00:00')
and a.type IN ("softphone","softphone-inbound","conference","sms-inbound")
and a.status IN ('completed', 'failed')
# and a.external_id is not null
order by a.actual_end_time desc;
select * from activities a where a.crm_configuration_id = 202
and a.actual_start_time between '2025-03-20 00:00:00' and '2025-03-21 00:00:00'
# AND a.type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')
select g.name, a.title, uuid_from_bin(a.uuid), a.external_id, a.status, a.recording_state, a.recording_reason_code, a.scheduled_start_time, a.scheduled_end_time, a.actual_start_time, a.actual_end_time from activities a
inner join users u on u.id = a.user_id
inner join groups g on g.id = u.group_id
where a.crm_configuration_id = 202
and a.is_internal = 0
and (a.scheduled_start_time between '2025-03-19 00:00:00' and '2025-03-21 00:00:00')
and a.type = 'conference'
and a.status != 'completed'
and a.external_id is not null
order by a.scheduled_start_time desc;
SELECT * FROM teams WHERE name LIKE '%Tourlane%';
SELECT * FROM crm_fields WHERE crm_configuration_id = 209 and object_type = 'opportunity';
SELECT * FROM crm_field_data WHERE crm_field_id = 98809;
select * from users where status = 1 AND timezone = 'MDT';
select * from opportunities where id = 3769814;
select * from deal_risks where opportunity_id = 3769814;
select cp.* from crm_profiles cp
join users u on cp.user_id = u.id
join crm_configurations crm on cp.crm_configuration_id = crm.id
where crm.provider = 'hubspot' AND u.status = 1 AND log_notes != 'none';
select * from crm_fields where id = 154575;
select * from team_features where feature = 'SUPPORTS_SYNC_MISSING_CALL_DISPOSITIONS';
SELECT * FROM teams WHERE id = 176; # crm 148
select * from activities where crm_configuration_id = 148 and provider = 'hubspot' order by id desc;
select * from activity_providers where provider = 'amazon-connect';
select * from crm_fields cf
join crm_configurations crm on crm.id = cf.crm_configuration_id
where crm.provider = 'hubspot' and cf.object_type IN ('account', 'contact');
# [PASSWORD_DOTS]
SELECT * FROM users WHERE id IN (15415, 15418);
SELECT * FROM groups WHERE id IN (1805,1806);
SELECT * FROM playbooks WHERE id = 1860;
SELECT * FROM playbook_categories WHERE id = 38634;
SELECT * FROM crm_fields WHERE id = 189962;
SELECT * FROM teams WHERE name = 'Pulsar Group'; # 472, 380, 15138 [EMAIL]
SELECT * FROM crm_profiles WHERE user_id = 15415;
SELECT * FROM social_accounts WHERE sociable_id = 15415 and provider = 'salesforce';
select * from sidekick_settings where team_id = 472;
SELECT * FROM activities WHERE uuid_to_bin('452c58c7-b87c-4fdd-953e-d7af185e9588') = uuid; # 28617536, user: 15418
SELECT * FROM activities WHERE uuid_to_bin('399114ee-d3a8-458c-bff5-5f654658db0a') = uuid; # 28344407, user: 15415
SELECT * FROM activities WHERE uuid_to_bin('f0aa567f-0ab1-4bbb-96aa-37dcf184676b') = uuid; # 28580288, user: 15415
SELECT * FROM activities WHERE uuid_to_bin('50c086b1-2770-4bca-b5ae-6bac22ec426b') = uuid; # 28566069, user: 15415
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%TeamTailor%'; # 109, 218, 13969, [EMAIL]
select * from crm_configurations where id = 218;
SELECT * FROM activities WHERE uuid_to_bin('e39b5857-7fdb-4f5a-951a-8d3ca69bb1b0') = uuid; # 28338765
SELECT * FROM users WHERE id IN (13232, 13230);
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 109
and sa.provider = 'salesforce';
0057R00000EPL5HQAX Inez Ekblad
1091cb81-5ea1-4951-a0ed-f00b568f0140 Triman Kaur
SELECT * FROM crm_profiles WHERE user_id IN (13232, 13230);
############################################################################################
SELECT * FROM activities WHERE uuid_to_bin('675eeaeb-5681-42db-90bc-54c07a604408') = uuid; # 28655939 00UVg00000FLvnSMAT
SELECT * FROM crm_field_data WHERE activity_id = 28655939;
SELECT * FROM crm_fields WHERE id IN (94491,94493,94498);
SELECT * FROM users WHERE id = 13658;
SELECT * FROM teams WHERE id = 109;
SELECT * FROM crm_configurations WHERE id = 218;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 109
and sa.provider = 'salesforce';
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Strengthscope%'; # 481, 390, 15420, [EMAIL]
SELECT * FROM stages WHERE crm_configuration_id = 390;
select * from business_processes where team_id = 481 and crm_configuration_id = 390;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 481
and sa.provider = 'salesforce';
SELECT * FROM users WHERE id = 15780; # team 462
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 462
and sa.provider = 'hubspot';
select * from teams where id = 495;
SELECT * FROM users WHERE id = 15794;
select * from social_accounts where sociable_id = 15794;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Flight%'; # 427, 333, 13752
SELECT * FROM accounts WHERE team_id = 427 and crm_provider_id = '668731000183444517';
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Group GTI%'; # 495, 407, 15794
SELECT * FROM activities WHERE crm_configuration_id = 407
and status = 'completed' and type = 'conference'
order by id desc;
select ru.*, pr.*, p.* from users u join role_user ru on ru.user_id = u.id
join permission_role pr on pr.role_id = ru.role_id
join permissions p on p.id = pr.permission_id
where team_id = 495 and p.name IN ('dial');
select * from permission_role;
select * from activities where crm_configuration_id = 407 and status = 'completed' order by id desc;
SELECT * FROM activities WHERE id = 29512773;
SELECT * FROM activities WHERE id IN (29042721,28991325,29002874);
SELECT al.* from activity_summary_logs al join activities a on a.id = al.activity_id
where a.crm_configuration_id = 407
# and a.id IN (29042721,28991325,29002874);
SELECT * FROM users WHERE id = 15794;
SELECT * FROM users WHERE team_id = 495;
SELECT * FROM social_accounts WHERE sociable_id = 15794;
SELECT * FROM opportunities WHERE team_id = 495 and name like '%OC:%';
SELECT * FROM contacts WHERE team_id = 495;
SELECT * FROM leads WHERE team_id = 495;
SELECT * FROM accounts WHERE team_id = 495;
SELECT * FROM crm_profiles WHERE crm_configuration_id = 407;
SELECT * FROM crm_fields WHERE crm_configuration_id = 407;
SELECT * FROM crm_configurations WHERE id = 407;
SELECT * FROM opportunities WHERE team_id = 495 and close_date BETWEEN '2025-06-01' AND '2025-07-01'
and user_id IS NOT NULL and is_closed = 1 and is_won = 1;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Hamilton Court FX LLP%'; # 249, 187, 10103
SELECT * FROM activities WHERE uuid_to_bin('4659c2bb-9a49-484e-9327-a3d66f1e028c') = uuid; # 28951064
SELECT * FROM crm_fields WHERE crm_configuration_id = 187 and object_type IN ('tasks', 'event');
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Checkstep%'; # 325, 256, 11753
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 325
and sa.provider = 'hubspot';
SELECT * FROM activities WHERE uuid_to_bin('7be372e2-1916-4d79-a2f3-ca3db1346db3') = uuid; # 28611085
SELECT * FROM activities WHERE uuid_to_bin('980f0336-840b-4185-a5a9-30cf8b0749a8') = uuid; # 28719733
SELECT * FROM activity_summary_logs where activity_id = 28719733;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Learning%'; # 260, 356, 9444
SELECT * FROM activity_summary_logs where sent_at BETWEEN '2025-06-09 11:38:00' AND '2025-06-09 11:40:00';
SELECT * FROM leads WHERE crm_configuration_id = 356 and crm_provider_id = '230045001502770504'; # 823630
select * from activities where crm_configuration_id = 356 and lead_id = 841732;
SELECT * from activity_summary_logs al join activities a on a.id = al.activity_id
where a.crm_configuration_id = 356;
select * from activities where crm_configuration_id = 356
and actual_end_time between '2025-06-09 11:00:00' and '2025-06-09 12:00:00'
order by id desc;
select * from accounts where crm_configuration_id = 356 and crm_provider_id = '230045001514403366' order by id desc;
select * from leads where crm_configuration_id = 356 and crm_provider_id = '230045001514275654' order by id desc;
select * from contacts where crm_configuration_id = 356 and crm_provider_id = '230045001514403366' order by id desc;
select * from opportunities where crm_configuration_id = 356 and crm_provider_id = '230045001514403366' order by id desc;
select * from team_features where team_id = 260;
select * from features where id IN (1,2,4,6,18,19,20,9,10,3,23,24,25,26,27);
SELECT * FROM activities WHERE uuid_to_bin('7be372e2-1916-4d79-a2f3-ca3db1346db3') = uuid;
select * from crm_fields;
select * from crm_layout_entities;
SELECT * FROM teams WHERE name LIKE '%Optable%';
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Teamtailor%'; # 109, 218, 13969
SELECT * FROM crm_configurations WHERE id = 218;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 109
and sa.provider = 'salesforce';
SELECT * FROM activities WHERE uuid_to_bin('675eeaeb-5681-42db-90bc-54c07a604408') = uuid; # 28655939
SELECT * FROM crm_field_data WHERE activity_id = 28655939;
SELECT * FROM crm_fields WHERE id in (94491,94493,94498);
select * from teams where crm_id IS NULL;
SELECT * FROM activities WHERE uuid_to_bin('71aa8a0c-9652-4ff6-bee7-d98ae60abef6') = uuid;
# [PASSWORD_DOTS]
select * from team_domains where team_id = 399;
SELECT * FROM teams WHERE name LIKE '%Rydoo%'; # 399, 318, 13207
select * from calendar_events where id = 5163781;
SELECT * FROM activities WHERE uuid_to_bin('be2cbc52-7fda-46a0-9ae0-25d9553eafc0') = uuid; # 29443896
SELECT * FROM participants WHERE activity_id = 29443896;
select * from contacts where crm_configuration_id = 318 and email = '[EMAIL]';
select * from leads where crm_configuration_id = 318 and email = '[EMAIL]';
select * from activities where user_id = 14937 order by created_at ;
select * from users where id = 14937;
select * from contacts where crm_configuration_id = 318 and email LIKE '%@strawberry.se';
select * from opportunities where crm_configuration_id = 318 and crm_provider_id = '006Sf00000D1WOAIA3';
select * from activities a join participants p on a.id = p.activity_id
where crm_configuration_id = 318 and a.updated_at > '2025-06-23T08:18:43Z';
# [PASSWORD_DOTS]
SELECT * FROM opportunities WHERE team_id = 379 and crm_provider_id = '39334518886';
SELECT * FROM opportunities WHERE team_id = 379 order by id desc;
SELECT * FROM teams WHERE id = 379;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 379 and sociable_id = 13852
and sa.provider = 'hubspot';
SELECT * FROM crm_configurations WHERE id = 307;
SELECT * FROM crm_layouts WHERE crm_configuration_id = 307;
SELECT * FROM crm_layout_entities WHERE crm_layout_id = 1027;
SELECT * FROM crm_fields WHERE crm_configuration_id = 307
and id IN (144750,144855,145158,155227);
SELECT * FROM activities;
select * from activities
where created_at > '2025-07-01 00:00:00'
# and created_at < '2025-08-01 00:00:00'
and type not in ('email-outbound', 'email-inbound')
and account_id is null
and contact_id is null
and lead_id is null
and opportunity_id is not null
;
SELECT * FROM activities WHERE id IN (25344155, 25344296, 25501909, 28692187);
SELECT * FROM crm_configurations WHERE id in (335,301,200);
select * from crm_fields where crm_configuration_id = 230 and crm_provider_id = 'Age2__c';
SELECT * FROM teams WHERE name LIKE '%Resights%';
select * from crm_fields where crm_configuration_id = 1 and object_type = 'opportunity';
select * from crm_configurations where provider = 'bullhorn'; # 344
select * from teams where id IN (442);
select * from activities
where crm_configuration_id = 177
and provider = 'amazon-connect'
order by id desc;
# and source <> 'gong';
select * from activity_providers where provider = 'amazon-connect';
SELECT * FROM activities WHERE uuid_to_bin('cec1993b-a7e5-4164-b74d-d680ea51d2f2') = uuid;
select * from crm_configurations where store_transcript = 1;
SELECT * FROM teams WHERE id IN (80);
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Sedna%'; # 277, 213, 12594
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 277
and sa.provider = 'salesforce';
select * from activities where crm_configuration_id = 213 and account_id = 2511502;
select * from crm_configurations where id = 213;
SELECT * FROM activities WHERE uuid_to_bin('35aa790a-8569-4544-8268-66f9a4a26804') = uuid; # 33981604
SELECT * FROM participants WHERE activity_id = 33981604;
SELECT * FROM crm_fields WHERE crm_configuration_id = 337 and object_type = 'task';
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 431
and sa.provider = 'salesforce';
SELECT * FROM activities WHERE uuid_to_bin('b5476c7d-19a8-491b-869d-676ea1e857b6') = uuid; # 33997223
select * from activity_summary_logs where activity_id = 33997223;
select * from activity_notes where activity_id = 33997223;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Abode%';
select * from features;
select * from teams t
where t.status = 'active'
and id NOT IN (select team_id from team_features where feature_id = 9)
;
select * from playbook_layouts where playbook_id = 1725;
SELECT * FROM activities WHERE uuid_to_bin('65cc283c-4849-49e6-927f-4c281c8fea19') = uuid; # 34297473
select * from teams where id = 318;
select * from crm_configurations where team_id = 318;
select * from playbooks where team_id = 318;
SELECT * FROM crm_layouts where crm_configuration_id = 381;
SELECT * FROM crm_layout_entities WHERE crm_layout_id = 1259;
SELECT * FROM crm_fields WHERE id IN (192938,192936,192939);
SELECT * FROM crm_layout_entities WHERE crm_layout_id = 1266;
SELECT * FROM crm_fields WHERE id IN (192980,192991,192997,192998,193064,193067);
SELECT * FROM activities WHERE uuid_to_bin('a902289b-285c-48eb-9cc2-6ad6c5d938f5') = uuid; # 34297533
SELECT * FROM crm_layout_entities WHERE crm_layout_id = 927;
SELECT * FROM crm_fields WHERE id IN (131668,131669,131670,131671,131676,131797);
SELECT * FROM teams WHERE name LIKE '%Peripass%'; # 351, 281, 12124
select * from crm_layouts where crm_configuration_id = 281;
SELECT * FROM crm_layout_entities WHERE crm_layout_id = 927;
select * from crm_fields where crm_configuration_id = 281 and id in (131668,131669,131670,131671,131676,131797);
select * from opportunities where crm_configuration_id = 281;
SELECT * FROM activities WHERE id IN (34211315, 34130075);
SELECT * FROM crm_field_data WHERE object_id IN (34211315, 34130075);
select cf.crm_configuration_id, cle.crm_layout_id, cle.id, cf.id from crm_field_data cfd
join crm...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"#11894 on JY-18909-automated-reports-ask-jiminny, menu","depth":5,"help_text":"Pull request #11894 exists for current branch JY-18909-automated-reports-ask-jiminny","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"TrackAutomatedReportGeneratedEventTest","depth":6,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run 'TrackAutomatedReportGeneratedEventTest'","depth":6,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'TrackAutomatedReportGeneratedEventTest'","depth":6,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"More Actions","depth":6,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JetBrains AI","depth":5,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Search Everywhere","depth":5,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"IDE and Project Settings","depth":5,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.088194445,"height":0.027777778},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"2","depth":4,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"<?php\n\nnamespace Jiminny\\Listeners\\Activities\\Coaching\\UserPilot;\n\nuse GuzzleHttp\\Exception\\GuzzleException;\nuse Jiminny\\Events\\Activities\\Coaching\\Shared;\nuse Jiminny\\Listeners\\Activities\\UserPilotActivityListener;\n\nclass CreateSharedEvent extends UserPilotActivityListener\n{\n /**\n * Handle the event.\n */\n public function handle(Shared $event): void\n {\n // Don't attempt to run this on environments with UserPilot not configured.\n if (config('services.userpilot.token') === null) {\n return;\n }\n\n try {\n $this->userPilotService->track(\n $event->share->from,\n 'shared-activity',\n $this->generatePayload($event->share->activity)\n );\n } catch (GuzzleException $e) {\n // Retry later.\n $this->release(3600);\n }\n }\n}","depth":4,"value":"<?php\n\nnamespace Jiminny\\Listeners\\Activities\\Coaching\\UserPilot;\n\nuse GuzzleHttp\\Exception\\GuzzleException;\nuse Jiminny\\Events\\Activities\\Coaching\\Shared;\nuse Jiminny\\Listeners\\Activities\\UserPilotActivityListener;\n\nclass CreateSharedEvent extends UserPilotActivityListener\n{\n /**\n * Handle the event.\n */\n public function handle(Shared $event): void\n {\n // Don't attempt to run this on environments with UserPilot not configured.\n if (config('services.userpilot.token') === null) {\n return;\n }\n\n try {\n $this->userPilotService->track(\n $event->share->from,\n 'shared-activity',\n $this->generatePayload($event->share->activity)\n );\n } catch (GuzzleException $e) {\n // Retry later.\n $this->release(3600);\n }\n }\n}","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Execute","depth":4,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Explain Plan","depth":4,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Browse Query History","depth":4,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"View Parameters","depth":4,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Open Query Execution Settings…","depth":4,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"In-Editor Results","depth":4,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Tx: Auto","depth":4,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Cancel Running Statements","depth":4,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Playground","depth":4,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"jiminny","depth":4,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.088194445,"height":0.027777778},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"27","depth":4,"role_description":"text"},{"role":"AXStaticText","text":"9","depth":4,"role_description":"text"},{"role":"AXStaticText","text":"23","depth":4,"role_description":"text"},{"role":"AXStaticText","text":"3","depth":4,"role_description":"text"},{"role":"AXStaticText","text":"105","depth":4,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"SELECT * FROM team_features where team_id = 1;\n\nSELECT * FROM teams WHERE name LIKE '%Vixio%'; # 340,270,11922\nSELECT * FROM users WHERE team_id = 340; # 12015\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 340\nand sa.provider = 'salesforce';\n# and sa.provider = 'salesloft';\n\nselect * from crm_fields where crm_configuration_id = 270 and object_type = 'event';\n# 125558 - Event Type - Event_Type__c\n# 125552 - Event Status - Event_Status__c\n\nSELECT * FROM sidekick_settings WHERE team_id = 340;\n\nSELECT * FROM crm_field_values WHERE crm_field_id in (125552);\n\nselect * from activities where crm_configuration_id = 270\nand type = 'conference' and crm_provider_id IS NOT NULL\nand actual_start_time > '2024-09-16 09:00:00' order by scheduled_start_time;\n\nSELECT * FROM activities WHERE id = 20871677;\nSELECT * FROM crm_field_data WHERE activity_id = 20871677;\n\nselect * from crm_layouts where crm_configuration_id = 270;\nselect * from crm_layout_entities where crm_layout_id in (886,887);\n\nSELECT * FROM crm_configurations WHERE id = 270;\n\nselect * from playbooks where team_id = 340; # 1514\nselect * from groups where team_id = 340;\nSELECT * FROM crm_fields WHERE id IN (125393, 125401);\n\nselect g.name as 'team name', p.name as 'playbook name', f.label as 'activity type field' from groups g\njoin playbooks p on g.playbook_id = p.id\njoin crm_fields f on p.activity_field_id = f.id\nwhere g.team_id = 340;\n\nSELECT * FROM activities WHERE uuid_to_bin('0c180357-67d2-419e-a8c3-b832a3490770') = uuid; # 20448716\nselect * from crm_field_data where object_id = 20448716;\n\nselect * from activities where crm_configuration_id = 270 and provider = 'salesloft' order by id desc;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%CybSafe%'; # 343,273,12008\nselect * from opportunities where team_id = 343;\nselect * from opportunities where team_id = 343 and crm_provider_id = '18099102526';\nselect * from opportunities where team_id = 343 and account_id = 945217482;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 343\nand sa.provider = 'hubspot';\n\nselect * from accounts where team_id = 343 order by name asc;\n\nselect * from stages where crm_configuration_id = 273 and type = 'opportunity';\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Voyado%'; # 353,283,12143\nSELECT * FROM activities WHERE crm_configuration_id = 283 and account_id = 3777844 order by id desc;\nSELECT * FROM accounts WHERE team_id = 353 AND name LIKE '%Salesloft%';\nSELECT * FROM activities WHERE id = 20717903;\n\nselect * from participants where activity_id IN (20929172,20928605,20928468,20926272,20926271,20926270,20926269,20916499,20916454,20916436,20916435,20900015,20900014,20900013,20897312,20897243,20897241,20897237,20897232,20897229,20893648,20893231,20893230,20893229,20893228,20889784,20885039,20885038,20885037,20885036,20885035,20882728,20882708,20882703,20882702,20869828,20869811,20869806,20869801,20869799,20869798,20869796,20869795,20869794,20869761,20869760,20869759,20868688,20868687,20850340,20847195,20841710,20833967,20827021,20825307,20825305,20825297,20824615,20824400,20823927,20821760,20795588,20794233,20794057,20793710,20785811,20781789,20781394,20781307,20762651,20758453,20758282,20757323,20756643,20756636,20756629,20756627,20756606,20756605,20756604,20756603,20756602,20756600,20756599,20756598,20756595,20756594,20756589,20756587,20756577,20756573,20748918,20748386,20748385,20748384,20748383,20748382,20748381,20748380,20748379,20748377,20748375,20748373,20743301,20717905,20717904,20717903,20717901,20717899);\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 353\nand sa.provider = 'salesforce';\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%modern world business solutions%'; # 345,275,12016, l.atkinson@mwbsolutions.co.uk\nSELECT * FROM activities WHERE uuid_to_bin('3921d399-3fef-4609-a291-b0097a166d43') = uuid;\n# id: 20940638, user: 12022, contact: 5305871\nSELECT * FROM activity_summary_logs WHERE activity_id = 20940638;\nselect * from contacts where team_id = 345 and crm_provider_id = '30891432415' order by name asc; # 5305871\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 345\nand sa.provider = 'hubspot';\n\nselect * from users where team_id = 345 and id = 12022;\nSELECT * FROM crm_profiles WHERE user_id = 12022;\nSELECT * FROM participants WHERE activity_id = 20940638;\nSELECT * FROM users u\nJOIN crm_profiles cp ON u.id = cp.user_id\nWHERE u.team_id = 345;\n\nselect * from contacts where team_id = 345 and crm_provider_id = '30880813535' order by name desc; # 5305871\n\nselect * from team_features where team_id = 345;\nSELECT * FROM activities WHERE uuid_to_bin('11701e2d-2f82-4dab-a616-1db4fad238df') = uuid; # 21115197\nSELECT * FROM participants WHERE activity_id = 20897406;\n\n\n\nSELECT * FROM activities WHERE uuid_to_bin('63ba55cd-1abc-447d-83da-0137000005b7') = uuid; # 20953912\nSELECT * FROM activities WHERE crm_configuration_id = 275 and provider = 'ringcentral' and title like '%1252629100%';\n\n\nSELECT * FROM activities WHERE id = 20946641;\nSELECT * FROM crm_profiles WHERE user_id = 10211;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Lunio%'; # 120,97,10984, triger@lunio.ai\nSELECT * FROM opportunities WHERE crm_configuration_id = 97 and crm_provider_id = '006N1000006c5PpIAI';\nselect * from stages where crm_configuration_id = 97 and type = 'opportunity';\nselect * from opportunities where team_id = 120;\n\n\nselect * from crm_configurations crm join teams t on crm.id = t.crm_id\nwhere 1=1\nAND t.current_billing_plan IS NOT NULL\nAND crm.auto_sync_activity = 0\nand crm.provider = 'hubspot';\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Exclaimer%'; # 270,205,10053,james.lewendon@exclaimer.com\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 270\nand sa.provider = 'salesforce';\nSELECT * FROM activities WHERE uuid_to_bin('b54df794-2a9a-4957-8d80-09a600ead5f8') = uuid; # 21637956\nSELECT * FROM crm_profiles WHERE user_id = 11446;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Cygnetise%'; # 372,300,12554, alex.chikly@cygnetise.com\nselect * from playbooks where team_id = 372;\nselect * from crm_fields where crm_configuration_id = 300 and object_type = 'event'; # 141340\nSELECT * FROM crm_field_values WHERE crm_field_id = 141340;\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 372\nand sa.provider = 'salesforce';\n\nselect * from crm_profiles where crm_configuration_id = 300;\nSELECT * FROM crm_configurations WHERE team_id = 372;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Planday%'; # 291,242,11501,mfa@planday.com\nSELECT * FROM opportunities WHERE team_id = 291 and crm_provider_id = '006bG000005DO86QAG'; # 3207756\nselect * from crm_field_data where object_id = 3207756;\nSELECT * FROM crm_fields WHERE id = 111834;\n\nselect f.id, f.crm_provider_id AS field_name, f.label, fd.object_id AS dealId, fd.value\nFROM crm_fields f\nJOIN crm_field_data fd ON f.id = fd.crm_field_id\nWHERE f.crm_configuration_id = 242\nAND f.object_type = 'opportunity'\nAND fd.object_id IN (3207756)\nORDER BY fd.object_id, fd.updated_at;\n\nSELECT * FROM crm_configurations WHERE auto_connect = 1;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Tour%'; # 187,209,8150,salesforce-admin@tourlane.com\nselect * from group_deal_risk_types drgt join groups g on drgt.group_id = g.id\nwhere g.team_id = 187;\n\nselect * from `groups` where team_id = 187;\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 187\nand sa.provider = 'salesforce';\n\n# Destination - 98870 - Destination__c\n# Stage - 79014 - StageName\n# Land Arrangement - 98856 - Land_Arrangement__c\n# Flight - 98848 - Flight__c\n# Last activity date - 98812 - LastActivityDate\n# Last modified date - 98809 - LastModifiedDate\n# Last inbound mail timestamp - 99151 - Last_Inbound_Mail_Timestamp__c\n# next call - 98864 - Next_Call__c\n\nselect * from crm_fields where crm_configuration_id = 209 and object_type = 'opportunity';\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 209;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 682;\n\nselect * from opportunities where team_id = 187 and name LIKE'%Muriel Sal%';\nselect * from opportunities where team_id = 187 and user_id = 9951 and is_closed = 0;\nselect * from activities where opportunity_id = 3538248;\n\nSELECT * FROM crm_profiles WHERE user_id = 8150;\n\nselect * from deal_risks where opportunity_id = 3538248;\n\nselect * from teams where crm_id IS NULL;\n\nSELECT opp.id AS opportunity_id,\n u.group_id AS group_id,\n MAX(\n CASE\n WHEN a.type IN (\"sms-inbound\", \"sms-outbound\") THEN a.created_at\n ELSE a.actual_end_time\n END) as last_date\nFROM opportunities opp\nleft join activities a on a.opportunity_id = opp.id\ninner join users u on opp.user_id = u.id\nwhere opp.user_id IN (9951)\n\nAND opp.is_closed = 0\nand a.status IN ('completed', 'received', 'delivered') OR a.status IS NULL\ngroup by opp.id;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Cybsafe%'; # 343,301,12008,polly.morphew@cybsafe.com\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 343\nand sa.provider = 'hubspot';\n\nSELECT * FROM crm_profiles WHERE crm_configuration_id = 301;\nSELECT * FROM contacts WHERE id = 6612363;\nSELECT * FROM accounts WHERE id = 4235676;\nSELECT * FROM opportunities WHERE crm_configuration_id = 301 and crm_provider_id = 32983784868;\nselect * from opportunity_stages where opportunity_id = 4503759;\n# SELECT * FROM opportunities WHERE id = 4569937;\n\nselect * from activities where crm_configuration_id = 301;\nSELECT * FROM activities WHERE uuid_to_bin('d3b2b28b-c3d0-4c2d-8ed0-eef42855278a') = uuid; # 26330370\nSELECT * FROM participants WHERE activity_id = 26330370;\n\nSELECT * FROM teams WHERE id = 375;\nselect * from playbooks where team_id = 375;\n\nselect * from stages where crm_configuration_id = 301 and type = 'opportunity';\n\nselect * from teams;\nselect * from contact_roles;\n\nSELECT * FROM opportunities WHERE team_id = 343 and user_id = 12871 and close_date >= '2024-11-01';\n\nselect * from users u join crm_profiles cp on cp.user_id = u.id where u.team_id = 343;\n\nSELECT * FROM crm_field_data WHERE object_id = 3771706;\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 343\nand sa.provider = 'hubspot';\n\nSELECT * FROM crm_fields WHERE crm_configuration_id = 301 and object_type = 'opportunity'\nand crm_provider_id LIKE \"%traffic_light%\";\nSELECT * FROM crm_field_values WHERE crm_field_id IN (144020,144048,144111,144113,144126,144481,144508,144531);\n\nSELECT fd.* FROM opportunities o\nJOIN crm_field_data fd ON o.id = fd.object_id\nWHERE o.team_id = 343\n# and o.user_id IS NOT NULL\nand fd.crm_field_id IN (144020,144048,144111,144113,144126,144481,144508,144531)\nand fd.value != ''\norder by value desc\n# group by o.id\n;\n\nSELECT * FROM opportunities WHERE id = 3769843;\n\nSELECT * FROM teams WHERE name LIKE '%Tour%'; # 187,209,8150, salesforce-admin@tourlane.com\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 209;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 682;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Funding Circle%'; # 220,177,8603,aswini.mishra@fundingcircle.com\nSELECT * FROM activities WHERE uuid_to_bin('7a40e99b-3b37-4bb1-b983-325b81801c01') = uuid; # 23139839\n\n\nSELECT * FROM opportunities WHERE id = 3855992;\n\nSELECT * FROM users WHERE name LIKE '%Angus Pollard%'; # 8988\n\nSELECT * FROM teams WHERE name LIKE '%Story Terrace%'; # 379, 307, 12894\nSELECT * FROM crm_fields WHERE crm_configuration_id = 307 and object_type != 'opportunity';\n\nselect * from contacts where team_id = 379 and name like '%bebro%'; # 5874411, crm: 77229348507\nSELECT * FROM crm_field_data WHERE object_id = 5874411;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 379\nand sa.provider = 'hubspot';\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%mentio%'; # 117, 94, 6371, nikhil.kumar@mention-me.com\nSELECT * FROM activities WHERE uuid_to_bin('82939311-1af0-4506-8546-21e8d1fdf2c1') = uuid;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Tourlane%'; # 187, 209, 8150, salesforce-admin@tourlane.com\nSELECT * FROM opportunities WHERE team_id = 187 and crm_provider_id = '006Se000008xfvNIAQ'; # 3537793\nselect * from generic_ai_prompts where subject_id = 3537793;\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Lunio%'; # 120, 97, 10984, triger@lunio.ai\nSELECT * FROM crm_configurations WHERE id = 97;\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 97;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 355;\nSELECT * FROM crm_fields WHERE id = 32682;\n\nselect cfd.value, o.* from opportunities o\njoin crm_field_data cfd on o.id = cfd.object_id and cfd.crm_field_id = 32682\nwhere team_id = 120\nand cfd.value != ''\n;\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 120\nand sa.provider = 'salesforce';\n\nselect * from opportunities where team_id = 120 and crm_provider_id = '006N1000007X8MAIA0';\nSELECT * FROM crm_field_data WHERE object_id = 2313439;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE id = 410;\nSELECT * FROM teams WHERE name LIKE '%Local Business Oxford%';\nselect * from scorecards where team_id = 410;\nselect * from scorecard_rules;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Funding%'; # 220, 177, 8603, aswini.mishra@fundingcircle.com\nselect * from activities a\njoin opportunities o on a.opportunity_id = o.id\njoin users u on o.user_id = u.id\nwhere a.crm_configuration_id = 177 and a.type LIKE '%email-out%'\n# and a.actual_end_time > '2024-12-16 00:00:00'\n# and o.remotely_created_at > '2024-12-01 00:00:00'\n# and u.group_id = 1014\nand u.id = 9021\norder by a.id desc;\nSELECT * FROM opportunities WHERE id in (3981384,4017346);\nSELECT * FROM users WHERE team_id = 220 and id IN (8775, 11435);\n\nselect * from users where id = 9021;\nselect * from inboxes where user_id = 9021;\n\nselect * from inbox_emails where inbox_id = 1349 and email_date > '2024-12-18 00:00:00';\n\nselect * from email_messages where team_id = 220\nand orig_date > '2024-12-16 00:00:00' and orig_date < '2024-12-19 00:00:00'\nand subject LIKE '%Personal%'\n# and 'from' = 'credit@fundingcircle.com'\n;\n\nselect * from activities a\njoin opportunities o on a.opportunity_id = o.id\nwhere a.user_id = 9021 and a.type LIKE '%email-out%'\nand a.actual_end_time > '2024-12-18 00:00:00'\nand o.user_id IS NOT NULL\nand o.remotely_created_at > '2024-12-01 00:00:00'\norder by a.id desc;\n\nSELECT * FROM opportunities WHERE team_id = 220 and name LIKE '%Right Car move Limited%' and id = 3966852;\nselect * from activities where crm_configuration_id = 177 and type LIKE '%email%' and opportunity_id = 3966852 order by id desc;\n\nselect * from team_settings where name IN ('useCloseDate');\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Hurree%'; # 104, 81, 6175, jfarrell@hurree.co\nSELECT * FROM opportunities WHERE team_id = 104 and name = 'PropOp';\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 104\nand sa.provider = 'hubspot';\n\nselect * from crm_configurations where last_synced_at > '2025-01-19 01:00:00'\nselect * from teams where crm_id IS NULL;\n\nselect t.name as 'team', u.name as 'owner', u.email, u.phone\nfrom teams t\njoin activity_providers ap on t.id = ap.team_id\njoin users u on t.owner_id = u.id\nwhere 1=1\n and t.status = 'active'\n and ap.is_enabled = 1\n# and u.status = 1\n and ap.provider = 'ms-teams';\n\nselect * from crm_configurations where provider = 'bullhorn'; # 344\nSELECT * FROM teams WHERE id = 442; # 14293\nselect * from users where team_id = 442;\nselect * from social_accounts sa where sa.sociable_id = 14293;\nselect * from invitations where team_id = 442;\n\n# ********************************************************************************************************\nSELECT * FROM users WHERE email LIKE '%nea.liikamaa@eletive.com%'; # 14022\nSELECT * FROM teams WHERE id = 429;\nselect * from opportunities where team_id = 429 and crm_provider_id IN (16157415775, 22246219645);\nselect * from activities where opportunity_id in (4340436,4353519);\n\nselect * from transcription where activity_id IN (25630961,25381771);\nselect * from generic_ai_prompts where subject_id IN (4353519);\n\nSELECT\n a.id as activity_id,\n a.opportunity_id,\n a.type as activity_type,\n a.language,\n CONCAT(a.title, a.description) AS mail_content,\n e.from AS mail_from,\n e.to AS mail_to,\n e.subject AS mail_subject,\n e.body AS mail_body,\n p.type as prompt_type,\n p.status as prompt_status,\n p.content AS prompt_content,\n a.actual_start_time as created_at\nFROM activities a\n LEFT JOIN ai_prompts p ON a.transcription_id = p.transcription_id AND p.deleted_at IS NULL\n LEFT JOIN email_messages e ON a.id = e.activity_id\nWHERE a.actual_start_time > '2024-01-01 00:00:00'\n AND a.opportunity_id IN (4353519)\n AND a.status IN ('completed', 'received', 'delivered')\n AND a.deleted_at IS NULL\n AND a.type NOT IN ('sms-inbound', 'sms-outbound')\nORDER BY a.opportunity_id ASC, a.id ASC;\n\nSELECT * FROM users WHERE name LIKE '%George Fierstone%'; # 14293\nSELECT * FROM teams WHERE id = 442;\nSELECT * FROM crm_configurations WHERE id = 344;\nselect * from team_features where team_id = 442;\nselect * from groups where team_id = 442;\nselect * from playbooks where team_id = 442;\nselect * from playbook_categories where playbook_id = 1729;\nselect * from crm_fields where crm_configuration_id = 344 and id = 172024;\nSELECT * FROM crm_field_values WHERE crm_field_id = 172024;\nselect * from crm_layouts where crm_configuration_id = 344;\nselect * from playbook_layouts where playbook_id = 1729;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Learning%'; # 260, 221, 9444\n\nselect s.*\n# , s.sent_at, u.name, a.*\nfrom activity_summary_logs s\ninner join activities a on a.id = s.activity_id\ninner join users u on u.id = a.user_id\nwhere a.crm_configuration_id = 356\nand s.sent_at > date_sub(now(), interval 60 day)\norder by a.actual_end_time desc;\n\nselect * from activities a\n# inner join activity_summary_logs s on s.activity_id = a.id\nwhere a.crm_configuration_id = 356 and a.actual_end_time > date_sub(now(), interval 60 day)\n# and a.crm_provider_id is not null\n# and provider <> 'ringcentral'\nand status = 'completed'\norder by a.actual_end_time desc;\n\nselect * from teams order by id desc; # 17328, 32, 17830, integration-account@jiminny.com\nSELECT * FROM users;\nSELECT * FROM users where team_id = 260 and status = 1; # 201 - 150 active\nSELECT * FROM teams WHERE id = 260;\nselect * from team_settings where team_id = 260;\nselect * from crm_configurations where team_id = 260;\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 356;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1184;\n\nselect * from accounts where crm_configuration_id = 221 order by id desc; # 7000\nselect * from leads where crm_configuration_id = 221 order by id desc; # 0\nselect * from contacts where crm_configuration_id = 221 order by id desc; # 200 000\nselect * from opportunities where crm_configuration_id = 221 order by id desc; # 0\nselect * from crm_profiles where crm_configuration_id = 221 order by id desc; # 23\nselect * from crm_fields where crm_configuration_id = 221;\nselect * from crm_field_values where crm_field_id = 5302 order by id desc;\nselect * from crm_layouts where crm_configuration_id = 221 order by id desc;\nselect * from stages where crm_configuration_id = 221 order by id desc;\n\nselect * from accounts where crm_configuration_id = 356 order by id desc; # 7000\nselect * from leads where crm_configuration_id = 356 order by id desc; # 0\nselect * from contacts where crm_configuration_id = 356 order by id desc; # 200 000\nselect * from opportunities where crm_configuration_id = 356 order by id desc; # 0\nselect * from crm_profiles where crm_configuration_id = 356 order by id desc; # 23\nselect * from crm_fields where crm_configuration_id = 356;\nselect * from crm_field_values where crm_field_id = 5302 order by id desc;\nselect * from crm_layouts where crm_configuration_id = 356 order by id desc;\nselect * from stages where crm_configuration_id = 356 order by id desc;\n\nselect * from playbooks where team_id = 260 order by id desc; # 4 (2 deleted)\nselect * from groups where team_id = 260 order by id desc; # 27 groups, (2 deleted)\nselect * from playbook_layouts where playbook_id IN (1410,1409,1276,1254); # 4\nselect ce.* from calendars c\njoin users u on c.user_id = u.id\njoin calendar_events ce on c.id = ce.calendar_id\nwhere u.team_id = 260\nand (ce.start_time > '2025-02-21 00:00:00')\n;\n# calendar events 1207\n#\n\nselect * from opportunities where team_id = 260;\nSELECT * FROM crm_field_data WHERE object_id = 4696496;\n\nselect * from activities where crm_configuration_id = 356 and crm_provider_id IS NOT NULL;\nselect * from activities where crm_configuration_id IN (221) and provider NOT IN ('ms-teams', 'uploader', 'zoom-bot')\n# and type = 'conference' and status = 'scheduled' and activities.is_internal = 0\nand created_at > '2024-03-01 00:00:00'\norder by id desc; # 880 000, ringcentral, avaya\nSELECT * FROM participants WHERE activity_id = 26371744;\n\n# all activities 942 000 +\n# conference 7385 - scheduled 984 - external 343\n\nselect * from activities where id = 26321812;\nselect * from participants where activity_id = 26321812;\nselect * from participants where activity_id in (26414510,26414514,26414516,26414604,26414653,26414655);\nselect * from leads where id in (720428,689175,731546,645866,621037);\n\nselect * from users where id = 13841;\nselect * from opportunities where user_id = 9541;\nselect * from stages where id = 15900;\n\nselect * from accounts where\n# id IN (4160055,5053725,4965303,4896434)\nid in (4584518,3249934,3218025,3891133,3399450,4172999,4485161,3101785,4587203,3070816,2870343,2870341,3563940,4550846,3424464,3249963,2870342)\n;\n\nselect * from activities where id = 26654935;\nSELECT * FROM opportunities WHERE id = 4803458;\n\nSELECT * FROM opportunities where team_id = 260 and user_id = 13841 AND stage_id = 15900;\nSELECT id, uuid, provider, type, lead_id, account_id, contact_id, opportunity_id, stage_id, status, recording_state, title, actual_start_time, actual_end_time\nFROM activities WHERE user_id = 13841 AND opportunity_id IN (4729783, 4731717, 4731726, 4732064, 4732849, 4803458, 4813213);\n\nSELECT DISTINCT\n o.id, o.stage_id, s.name, a.title,\n a.*\nFROM activities a\n# INNER JOIN tracks t ON a.id = t.activity_id\nINNER JOIN users u ON a.user_id = u.id\nINNER JOIN teams team ON u.team_id = team.id\nINNER JOIN groups g ON u.group_id = g.id\nINNER JOIN opportunities o ON a.opportunity_id = o.id\nINNER JOIN stages s ON o.stage_id = s.id\nWHERE\n a.crm_configuration_id = 356\n AND a.status IN ('completed', 'failed')\n AND a.recording_state != 'stopped'\n# and a.user_id = 13841\n AND u.uuid = uuid_to_bin('6f40e4b8-c340-4059-b4ac-1728e87ea99e')\n AND team.uuid = uuid_to_bin('a607fba7-452e-4683-b2af-00d6cb52c93c')\n AND g.uuid = uuid_to_bin('b5d69e40-24a0-4c16-810b-5fa462299f94')\n\n AND a.type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')\n# AND t.type IN ('audio', 'video')\n AND (\n (a.actual_start_time BETWEEN '2025-03-13 00:00:00' AND '2025-03-18 07:59:59')\n OR\n (\n a.actual_start_time IS NULL\n AND a.type IN ('sms-outbound', 'sms-inbound')\n AND a.created_at BETWEEN '2025-03-13 00:00:00' AND '2025-03-18 07:59:59'\n )\n )\n AND (\n a.is_private = 0\n OR (\n a.is_private = 1\n AND u.uuid = uuid_to_bin('6f40e4b8-c340-4059-b4ac-1728e87ea99e')\n )\n )\n AND (\n# s.id = 15900\n s.uuid = uuid_to_bin('04ca1c26-c666-4268-a129-419c0acffd73')\n OR s.uuid IS NULL -- Include records without opportunity stage\n )\n\nORDER BY a.actual_end_time DESC;\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Lead Forensics%'; # 190, 162, 8474, willsc@leadforensics.com\nSELECT * FROM users WHERE team_id = 190;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 190\nand sa.provider = 'hubspot';\n\nselect * from role_user where user_id = 8474;\n\nselect * from crm_configurations where provider = 'bullhorn';\n\nSELECT * FROM opportunities WHERE uuid_to_bin('94578249-65ec-4205-90f2-7d1a7d5ab64a') = uuid;\nSELECT * FROM users WHERE uuid_to_bin('26dbadeb-926f-4150-b11b-771b9d4c2f9a') = uuid;\n\nSELECT * FROM opportunities WHERE id = 4732493;\nselect * from activities where opportunity_id = 4732493;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE id = 443; # 358, 14315, andrea.romano@correrenaturale.com\nSELECT * FROM opportunities WHERE team_id = 443;\n\nSELECT a.id, a.type, a.user_id, a.status, a.deleted_at, u.name, u.email, u.team_id as activity_team_id, u.status, u.deleted_at, t.name, t.status, s.team_id as stage_team_id\nFROM activities AS a\nJOIN stages AS s ON a.stage_id = s.id\nJOIN users AS u ON u.id = a.user_id\nJOIN teams AS t ON t.id = s.team_id\nWHERE u.team_id <> s.team_id and t.id > 135;\n\n\nSELECT\n crm_configuration_id,\n crm_provider_id,\n COUNT(*) as duplicate_count,\n GROUP_CONCAT(id) as stage_ids,\n GROUP_CONCAT(name) as stage_names\nFROM stages\nGROUP BY crm_configuration_id, crm_provider_id\nHAVING COUNT(*) > 1\nORDER BY duplicate_count DESC;\n\nselect * from stages where id IN (14898,14907);\n\nselect * from business_processes;\n\nSELECT *\nFROM crm_configurations\nWHERE team_id IN (\n SELECT team_id\n FROM crm_configurations\n GROUP BY team_id\n HAVING COUNT(*) > 1\n)\nORDER BY team_id;\n\nSELECT *\nFROM teams\nWHERE crm_id IN (\n SELECT crm_id\n FROM teams\n GROUP BY crm_id\n HAVING COUNT(*) > 1\n)\nORDER BY crm_id;\n\n# ***************************************************************************\nselect * from crm_configurations where provider = 'integration-app';\nSELECT * FROM teams WHERE id = 443; # Correre Naturale 358 14315 andrea.romano@correrenaturale.com\nselect * from activities where crm_configuration_id = 358 order by actual_end_time desc;\nselect id, uuid, actual_end_time, crm_provider_id, is_internal, playbook_category_id, type, user_id, lead_id, contact_id, account_id, opportunity_id, status, title from activities where crm_configuration_id = 358 order by actual_end_time desc;\nselect * from team_features where team_id = 358;\nselect * from activity_summary_logs;\n\nselect * from teams where id = 406;\n\n# ************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Sportfive%'; # 267, 202, 14637, srv.salesforce@sportfive.com\nselect * from activities where crm_configuration_id = 202 order by actual_end_time desc;\n\nSELECT * FROM users where id = 14637;\nSELECT * FROM teams where id = 267;\nSELECT * FROM groups where id = 1118;\n\nselect g.name, a.title, uuid_from_bin(a.uuid), a.external_id, a.status, a.recording_state, a.recording_reason_code, a.scheduled_start_time, a.scheduled_end_time, a.actual_start_time, a.actual_end_time from activities a\ninner join users u on u.id = a.user_id\ninner join groups g on g.id = u.group_id\nwhere a.crm_configuration_id = 202\nand a.is_internal = 0\nand (a.scheduled_start_time between '2025-03-19 00:00:00' and '2025-03-21 00:00:00')\nand a.type = 'conference'\nand a.status != 'completed'\nand a.external_id is not null\norder by a.scheduled_start_time desc;\n\nSELECT * FROM activities\nWHERE crm_configuration_id = 202\n AND status IN ('completed', 'failed')\n AND recording_state != 'stopped'\n AND type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')\n AND (is_private = 0 OR user_id = 14637)\n AND (\n (\n actual_start_time BETWEEN '2025-03-12 12:00:00' AND '2025-03-24 11:59:59'\n ) OR (\n actual_start_time IS NULL\n AND type IN ('sms-outbound', 'sms-inbound')\n AND created_at BETWEEN '2025-03-12 12:00:00' AND '2025-03-24 11:59:59'\n )\n )\n AND NOT EXISTS (\n SELECT 1\n FROM tracks\n WHERE\n tracks.activity_id = activities.id\n AND tracks.type IN ('audio', 'video')\n )\nORDER BY actual_end_time DESC;\n\nSELECT DISTINCT\n a.*\nFROM activities a\nINNER JOIN tracks t ON a.id = t.activity_id\nINNER JOIN users u ON a.user_id = u.id\nINNER JOIN teams team ON u.team_id = team.id\nWHERE\n a.crm_configuration_id = 202\n AND a.status IN ('completed', 'failed')\n AND a.recording_state != 'stopped'\n# and a.user_id = 14637\n AND a.type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')\n# AND t.type IN ('audio', 'video')\n AND (\n (a.actual_start_time BETWEEN '2025-03-12 12:00:00' AND '2025-03-24 11:59:59')\n OR\n (\n a.actual_start_time IS NULL\n AND a.type IN ('sms-outbound', 'sms-inbound')\n AND a.created_at BETWEEN '2025-03-12 12:00:00' AND '2025-03-24 11:59:59'\n )\n )\n AND (\n a.is_private = 0\n OR (\n a.is_private = 1\n AND a.user_id = 14637\n )\n )\n\nORDER BY a.actual_end_time DESC\n;\n\nSELECT DISTINCT a.*\nFROM activities a\nINNER JOIN users u ON a.user_id = u.id\nINNER JOIN teams t ON u.team_id = t.id\n# INNER JOIN tracks tr ON a.id = tr.activity_id\n# INNER JOIN groups g ON u.group_id = g.id\nWHERE 1=1\n AND t.id = 267\n# AND t.uuid = uuid_to_bin('aed4927b-f1ea-499e-94c3-83762fd233e8')\n AND a.status IN ('completed', 'failed')\n AND a.recording_state != 'stopped'\n AND a.type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')\n# AND tr.type NOT IN ('audio', 'video')\n AND (\n a.is_private = 0\n OR a.user_id = 14637\n )\n AND (\n (a.actual_start_time BETWEEN '2025-03-19 00:00:00' AND '2025-03-21 23:59:59')\n OR (\n a.actual_start_time IS NULL\n AND a.type IN ('sms-outbound', 'sms-inbound')\n AND a.created_at BETWEEN '2025-03-19 00:00:00' AND '2025-03-21 23:59:59'\n )\n )\n# and NOT EXISTS (\n# SELECT 1\n# FROM tracks t\n# WHERE t.activity_id = a.id\n# AND t.type IN ('audio', 'video')\n# )\n\nORDER BY a.actual_end_time DESC;\n\nSELECT * FROM tracks WHERE activity_id = 26485995;\n\nselect a.is_private, a.title, uuid_from_bin(a.uuid), a.external_id, a.status, a.recording_state, a.recording_reason_code, a.scheduled_start_time, a.scheduled_end_time, a.actual_start_time, a.actual_end_time from activities a\ninner join users u on u.id = a.user_id\nwhere a.crm_configuration_id = 202\n# and a.is_internal = 0\nand (a.actual_start_time between '2025-03-19 00:00:00' and '2025-03-21 00:00:00')\nand a.type IN (\"softphone\",\"softphone-inbound\",\"conference\",\"sms-inbound\")\nand a.status IN ('completed', 'failed')\n# and a.external_id is not null\norder by a.actual_end_time desc;\n\nselect * from activities a where a.crm_configuration_id = 202\nand a.actual_start_time between '2025-03-20 00:00:00' and '2025-03-21 00:00:00'\n# AND a.type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')\n\nselect g.name, a.title, uuid_from_bin(a.uuid), a.external_id, a.status, a.recording_state, a.recording_reason_code, a.scheduled_start_time, a.scheduled_end_time, a.actual_start_time, a.actual_end_time from activities a\ninner join users u on u.id = a.user_id\ninner join groups g on g.id = u.group_id\nwhere a.crm_configuration_id = 202\nand a.is_internal = 0\nand (a.scheduled_start_time between '2025-03-19 00:00:00' and '2025-03-21 00:00:00')\nand a.type = 'conference'\nand a.status != 'completed'\nand a.external_id is not null\norder by a.scheduled_start_time desc;\n\nSELECT * FROM teams WHERE name LIKE '%Tourlane%';\nSELECT * FROM crm_fields WHERE crm_configuration_id = 209 and object_type = 'opportunity';\nSELECT * FROM crm_field_data WHERE crm_field_id = 98809;\n\nselect * from users where status = 1 AND timezone = 'MDT';\n\nselect * from opportunities where id = 3769814;\nselect * from deal_risks where opportunity_id = 3769814;\n\nselect cp.* from crm_profiles cp\njoin users u on cp.user_id = u.id\njoin crm_configurations crm on cp.crm_configuration_id = crm.id\nwhere crm.provider = 'hubspot' AND u.status = 1 AND log_notes != 'none';\n\nselect * from crm_fields where id = 154575;\n\nselect * from team_features where feature = 'SUPPORTS_SYNC_MISSING_CALL_DISPOSITIONS';\nSELECT * FROM teams WHERE id = 176; # crm 148\nselect * from activities where crm_configuration_id = 148 and provider = 'hubspot' order by id desc;\n\nselect * from activity_providers where provider = 'amazon-connect';\n\nselect * from crm_fields cf\njoin crm_configurations crm on crm.id = cf.crm_configuration_id\nwhere crm.provider = 'hubspot' and cf.object_type IN ('account', 'contact');\n\n# *********************************************************************************************\nSELECT * FROM users WHERE id IN (15415, 15418);\nSELECT * FROM groups WHERE id IN (1805,1806);\nSELECT * FROM playbooks WHERE id = 1860;\nSELECT * FROM playbook_categories WHERE id = 38634;\nSELECT * FROM crm_fields WHERE id = 189962;\n\nSELECT * FROM teams WHERE name = 'Pulsar Group'; # 472, 380, 15138 raza.gilani@vuelio.com\n\nSELECT * FROM crm_profiles WHERE user_id = 15415;\nSELECT * FROM social_accounts WHERE sociable_id = 15415 and provider = 'salesforce';\n\nselect * from sidekick_settings where team_id = 472;\n\nSELECT * FROM activities WHERE uuid_to_bin('452c58c7-b87c-4fdd-953e-d7af185e9588') = uuid; # 28617536, user: 15418\nSELECT * FROM activities WHERE uuid_to_bin('399114ee-d3a8-458c-bff5-5f654658db0a') = uuid; # 28344407, user: 15415\nSELECT * FROM activities WHERE uuid_to_bin('f0aa567f-0ab1-4bbb-96aa-37dcf184676b') = uuid; # 28580288, user: 15415\nSELECT * FROM activities WHERE uuid_to_bin('50c086b1-2770-4bca-b5ae-6bac22ec426b') = uuid; # 28566069, user: 15415\n\n# *********************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%TeamTailor%'; # 109, 218, 13969, salesforce-integrations@teamtailor.com\nselect * from crm_configurations where id = 218;\nSELECT * FROM activities WHERE uuid_to_bin('e39b5857-7fdb-4f5a-951a-8d3ca69bb1b0') = uuid; # 28338765\nSELECT * FROM users WHERE id IN (13232, 13230);\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 109\nand sa.provider = 'salesforce';\n\n0057R00000EPL5HQAX Inez Ekblad\n\n1091cb81-5ea1-4951-a0ed-f00b568f0140 Triman Kaur\n\nSELECT * FROM crm_profiles WHERE user_id IN (13232, 13230);\n\n############################################################################################\nSELECT * FROM activities WHERE uuid_to_bin('675eeaeb-5681-42db-90bc-54c07a604408') = uuid; # 28655939 00UVg00000FLvnSMAT\nSELECT * FROM crm_field_data WHERE activity_id = 28655939;\nSELECT * FROM crm_fields WHERE id IN (94491,94493,94498);\nSELECT * FROM users WHERE id = 13658;\nSELECT * FROM teams WHERE id = 109;\nSELECT * FROM crm_configurations WHERE id = 218;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 109\nand sa.provider = 'salesforce';\n\n# ********************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Strengthscope%'; # 481, 390, 15420, katy.holden@strengthscope.comk\nSELECT * FROM stages WHERE crm_configuration_id = 390;\nselect * from business_processes where team_id = 481 and crm_configuration_id = 390;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 481\nand sa.provider = 'salesforce';\n\n\nSELECT * FROM users WHERE id = 15780; # team 462\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 462\nand sa.provider = 'hubspot';\n\n\nselect * from teams where id = 495;\nSELECT * FROM users WHERE id = 15794;\nselect * from social_accounts where sociable_id = 15794;\n\n# ********************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Flight%'; # 427, 333, 13752\nSELECT * FROM accounts WHERE team_id = 427 and crm_provider_id = '668731000183444517';\n\n# ********************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Group GTI%'; # 495, 407, 15794\nSELECT * FROM activities WHERE crm_configuration_id = 407\nand status = 'completed' and type = 'conference'\norder by id desc;\n\nselect ru.*, pr.*, p.* from users u join role_user ru on ru.user_id = u.id\njoin permission_role pr on pr.role_id = ru.role_id\n join permissions p on p.id = pr.permission_id\nwhere team_id = 495 and p.name IN ('dial');\n\nselect * from permission_role;\n\nselect * from activities where crm_configuration_id = 407 and status = 'completed' order by id desc;\nSELECT * FROM activities WHERE id = 29512773;\nSELECT * FROM activities WHERE id IN (29042721,28991325,29002874);\n\nSELECT al.* from activity_summary_logs al join activities a on a.id = al.activity_id\nwhere a.crm_configuration_id = 407\n# and a.id IN (29042721,28991325,29002874);\n\nSELECT * FROM users WHERE id = 15794;\nSELECT * FROM users WHERE team_id = 495;\nSELECT * FROM social_accounts WHERE sociable_id = 15794;\nSELECT * FROM opportunities WHERE team_id = 495 and name like '%OC:%';\nSELECT * FROM contacts WHERE team_id = 495;\nSELECT * FROM leads WHERE team_id = 495;\nSELECT * FROM accounts WHERE team_id = 495;\nSELECT * FROM crm_profiles WHERE crm_configuration_id = 407;\nSELECT * FROM crm_fields WHERE crm_configuration_id = 407;\nSELECT * FROM crm_configurations WHERE id = 407;\nSELECT * FROM opportunities WHERE team_id = 495 and close_date BETWEEN '2025-06-01' AND '2025-07-01'\nand user_id IS NOT NULL and is_closed = 1 and is_won = 1;\n\n# ********************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Hamilton Court FX LLP%'; # 249, 187, 10103\nSELECT * FROM activities WHERE uuid_to_bin('4659c2bb-9a49-484e-9327-a3d66f1e028c') = uuid; # 28951064\nSELECT * FROM crm_fields WHERE crm_configuration_id = 187 and object_type IN ('tasks', 'event');\n\n# *********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Checkstep%'; # 325, 256, 11753\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 325\nand sa.provider = 'hubspot';\n\nSELECT * FROM activities WHERE uuid_to_bin('7be372e2-1916-4d79-a2f3-ca3db1346db3') = uuid; # 28611085\nSELECT * FROM activities WHERE uuid_to_bin('980f0336-840b-4185-a5a9-30cf8b0749a8') = uuid; # 28719733\nSELECT * FROM activity_summary_logs where activity_id = 28719733;\n\n# *************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Learning%'; # 260, 356, 9444\nSELECT * FROM activity_summary_logs where sent_at BETWEEN '2025-06-09 11:38:00' AND '2025-06-09 11:40:00';\nSELECT * FROM leads WHERE crm_configuration_id = 356 and crm_provider_id = '230045001502770504'; # 823630\nselect * from activities where crm_configuration_id = 356 and lead_id = 841732;\n\nSELECT * from activity_summary_logs al join activities a on a.id = al.activity_id\nwhere a.crm_configuration_id = 356;\n\nselect * from activities where crm_configuration_id = 356\nand actual_end_time between '2025-06-09 11:00:00' and '2025-06-09 12:00:00'\norder by id desc;\n\nselect * from accounts where crm_configuration_id = 356 and crm_provider_id = '230045001514403366' order by id desc;\nselect * from leads where crm_configuration_id = 356 and crm_provider_id = '230045001514275654' order by id desc;\nselect * from contacts where crm_configuration_id = 356 and crm_provider_id = '230045001514403366' order by id desc;\nselect * from opportunities where crm_configuration_id = 356 and crm_provider_id = '230045001514403366' order by id desc;\n\nselect * from team_features where team_id = 260;\nselect * from features where id IN (1,2,4,6,18,19,20,9,10,3,23,24,25,26,27);\n\nSELECT * FROM activities WHERE uuid_to_bin('7be372e2-1916-4d79-a2f3-ca3db1346db3') = uuid;\n\nselect * from crm_fields;\nselect * from crm_layout_entities;\n\nSELECT * FROM teams WHERE name LIKE '%Optable%';\n\n# *************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Teamtailor%'; # 109, 218, 13969\nSELECT * FROM crm_configurations WHERE id = 218;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 109\nand sa.provider = 'salesforce';\nSELECT * FROM activities WHERE uuid_to_bin('675eeaeb-5681-42db-90bc-54c07a604408') = uuid; # 28655939\nSELECT * FROM crm_field_data WHERE activity_id = 28655939;\nSELECT * FROM crm_fields WHERE id in (94491,94493,94498);\n\nselect * from teams where crm_id IS NULL;\n\nSELECT * FROM activities WHERE uuid_to_bin('71aa8a0c-9652-4ff6-bee7-d98ae60abef6') = uuid;\n\n# *************************************************************************************************\nselect * from team_domains where team_id = 399;\nSELECT * FROM teams WHERE name LIKE '%Rydoo%'; # 399, 318, 13207\n\nselect * from calendar_events where id = 5163781;\nSELECT * FROM activities WHERE uuid_to_bin('be2cbc52-7fda-46a0-9ae0-25d9553eafc0') = uuid; # 29443896\nSELECT * FROM participants WHERE activity_id = 29443896;\nselect * from contacts where crm_configuration_id = 318 and email = 'marianne.westeng@strawberry.no';\nselect * from leads where crm_configuration_id = 318 and email = 'marianne.westeng@strawberry.no';\n\nselect * from activities where user_id = 14937 order by created_at ;\n\nselect * from users where id = 14937;\n\nselect * from contacts where crm_configuration_id = 318 and email LIKE '%@strawberry.se';\nselect * from opportunities where crm_configuration_id = 318 and crm_provider_id = '006Sf00000D1WOAIA3';\n\nselect * from activities a join participants p on a.id = p.activity_id\nwhere crm_configuration_id = 318 and a.updated_at > '2025-06-23T08:18:43Z';\n\n# *************************************************************************************************\nSELECT * FROM opportunities WHERE team_id = 379 and crm_provider_id = '39334518886';\nSELECT * FROM opportunities WHERE team_id = 379 order by id desc;\nSELECT * FROM teams WHERE id = 379;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 379 and sociable_id = 13852\nand sa.provider = 'hubspot';\n\nSELECT * FROM crm_configurations WHERE id = 307;\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 307;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1027;\nSELECT * FROM crm_fields WHERE crm_configuration_id = 307\n and id IN (144750,144855,145158,155227);\n\nSELECT * FROM activities;\n\n\nselect * from activities\nwhere created_at > '2025-07-01 00:00:00'\n# and created_at < '2025-08-01 00:00:00'\nand type not in ('email-outbound', 'email-inbound')\nand account_id is null\nand contact_id is null\nand lead_id is null\nand opportunity_id is not null\n;\nSELECT * FROM activities WHERE id IN (25344155, 25344296, 25501909, 28692187);\nSELECT * FROM crm_configurations WHERE id in (335,301,200);\n\nselect * from crm_fields where crm_configuration_id = 230 and crm_provider_id = 'Age2__c';\n\nSELECT * FROM teams WHERE name LIKE '%Resights%';\nselect * from crm_fields where crm_configuration_id = 1 and object_type = 'opportunity';\n\nselect * from crm_configurations where provider = 'bullhorn'; # 344\nselect * from teams where id IN (442);\n\nselect * from activities\nwhere crm_configuration_id = 177\nand provider = 'amazon-connect'\n order by id desc;\n# and source <> 'gong';\n\nselect * from activity_providers where provider = 'amazon-connect';\n\nSELECT * FROM activities WHERE uuid_to_bin('cec1993b-a7e5-4164-b74d-d680ea51d2f2') = uuid;\n\n\nselect * from crm_configurations where store_transcript = 1;\nSELECT * FROM teams WHERE id IN (80);\n\n# *************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Sedna%'; # 277, 213, 12594\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 277\nand sa.provider = 'salesforce';\n\nselect * from activities where crm_configuration_id = 213 and account_id = 2511502;\n\nselect * from crm_configurations where id = 213;\n\nSELECT * FROM activities WHERE uuid_to_bin('35aa790a-8569-4544-8268-66f9a4a26804') = uuid; # 33981604\nSELECT * FROM participants WHERE activity_id = 33981604;\nSELECT * FROM crm_fields WHERE crm_configuration_id = 337 and object_type = 'task';\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 431\nand sa.provider = 'salesforce';\nSELECT * FROM activities WHERE uuid_to_bin('b5476c7d-19a8-491b-869d-676ea1e857b6') = uuid; # 33997223\nselect * from activity_summary_logs where activity_id = 33997223;\nselect * from activity_notes where activity_id = 33997223;\n\n# ***********************************\nSELECT * FROM teams WHERE name LIKE '%Abode%';\n\n\nselect * from features;\nselect * from teams t\nwhere t.status = 'active'\nand id NOT IN (select team_id from team_features where feature_id = 9)\n;\n\n\nselect * from playbook_layouts where playbook_id = 1725;\nSELECT * FROM activities WHERE uuid_to_bin('65cc283c-4849-49e6-927f-4c281c8fea19') = uuid; # 34297473\nselect * from teams where id = 318;\nselect * from crm_configurations where team_id = 318;\nselect * from playbooks where team_id = 318;\nSELECT * FROM crm_layouts where crm_configuration_id = 381;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1259;\nSELECT * FROM crm_fields WHERE id IN (192938,192936,192939);\n\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1266;\nSELECT * FROM crm_fields WHERE id IN (192980,192991,192997,192998,193064,193067);\n\nSELECT * FROM activities WHERE uuid_to_bin('a902289b-285c-48eb-9cc2-6ad6c5d938f5') = uuid; # 34297533\n\n\n\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 927;\nSELECT * FROM crm_fields WHERE id IN (131668,131669,131670,131671,131676,131797);\n\nSELECT * FROM teams WHERE name LIKE '%Peripass%'; # 351, 281, 12124\nselect * from crm_layouts where crm_configuration_id = 281;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 927;\nselect * from crm_fields where crm_configuration_id = 281 and id in (131668,131669,131670,131671,131676,131797);\nselect * from opportunities where crm_configuration_id = 281;\n\nSELECT * FROM activities WHERE id IN (34211315, 34130075);\nSELECT * FROM crm_field_data WHERE object_id IN (34211315, 34130075);\n\nselect cf.crm_configuration_id, cle.crm_layout_id, cle.id, cf.id from crm_field_data cfd\njoin crm_layout_entities cle on cle.id = cfd.crm_layout_entity_id\njoin crm_fields cf on cle.crm_field_id = cf.id\nwhere cf.deleted_at IS NOT NULL\nGROUP BY cle.id, cf.id;\n\nselect * from crm_layouts where id IN (355);\nselect u.email, t.crm_id, t.* from teams t\njoin users u on u.id = t.owner_id\nwhere crm_id IN (97);\n\nSELECT * FROM crm_fields WHERE id = 96492;\n\nselect * from permissions;\nselect * from permission_role where permission_id = 247;\nselect * from roles;\n\nselect * from migrations;\n# *****************************************************************\nSELECT * FROM activities WHERE uuid_to_bin('291e3c21-11cc-4728-aee7-6e4bedf86d72') = uuid; # 34262174\nSELECT * FROM crm_configurations WHERE id = 301;\nSELECT * FROM teams WHERE id = 343;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 343\nand sa.provider = 'hubspot';\n\nselect * from participants where activity_id = 34262174;\n\nselect * from contacts where crm_configuration_id = 301 and id = 6976326;\nselect * from accounts where crm_configuration_id = 301 and id IN (4647626, 4815829); # 30761335403\n\nselect * from activity_summary_logs where activity_id = 34262174;\n\nselect * from users where status = 1 AND timezone = 'EST';\n\n# ****************************************************************************\nSELECT * FROM users WHERE id = 13869;\nSELECT * FROM crm_configurations WHERE id = 320;\nSELECT * FROM teams WHERE id = 401;\n\nSELECT * FROM activities WHERE uuid_to_bin('2228c16f-10be-48d5-90d4-67385219dc01') = uuid; # 29670601\n\nSELECT * FROM accounts WHERE id = 7761483;\nSELECT * FROM opportunities WHERE id = 6051814;\n\nSELECT * FROM teams WHERE name LIKE '%Seedlegals%';\n\n;select * from opportunities where updated_at > '2025-10-11' AND crm_provider_id = '34713761166';\n\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 177;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 577;\nSELECT * FROM crm_fields WHERE id IN (68458,68459,68480,68497,68524,68530,68554,68618,68662,68781,68810,68898,68981,69049,97467);\n\nSELECT t.id, crm.id, t.name, crm.sync_objects, crm.provider, crm.last_synced_at FROM crm_configurations crm join teams t on t.crm_id = crm.id\nwhere t.status = 'active' AND crm.provider = 'hubspot' AND crm.last_synced_at < '2025-10-22 00:00:00';\n\nSELECT * FROM activities WHERE uuid_to_bin('fa09449f-cba9-496a-b8f3-865cd3c72351') = uuid;\nSELECT * FROM crm_configurations where id = 184;\nSELECT * FROM teams WHERE id = 246;\nSELECT * FROM social_accounts WHERE sociable_id = 9259 and provider = 'hubspot';\n\nSELECT * FROM users WHERE email LIKE '%rhian.old@bud.co.uk%'; # 17700\nSELECT * FROM teams WHERE id = 551;\n\nSELECT * FROM crm_configurations WHERE id = 471;\nSELECT * FROM activities WHERE crm_configuration_id = 471 and crm_provider_id IS NOT NULL;\nSELECT * FROM crm_fields WHERE crm_configuration_id = 471;\nSELECT * FROM crm_fields WHERE id = 307260;\nSELECT * FROM crm_field_values WHERE crm_field_id = 307260;\n\nselect * from crm_layouts where crm_configuration_id = 471;\n\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1547;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1548;\n\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 551 and sa.provider = 'hubspot';\n\nSELECT * FROM teams WHERE name LIKE '%$PCS%';\n\n# ********************************************************************************************************\nselect * from crm_configurations crm\njoin teams t on t.crm_id = crm.id\nwhere t.status = 'active'\nand crm.provider = 'hubspot';\n\n# $slug = 'HUBSPOT_WEBHOOK_SYNC';\n# $team = Jiminny\\Models\\Team::find(2);\n# $feature = Feature::query()->where('slug', $slug)->first();\n# TeamFeature::query()->create(['feature_id' => $feature->getId(),'team_id' => $team->getId()]);\n\n# hubspot_webhook_metrics\n\nselect * from crm_configurations where id = 331; # 416\nSELECT * FROM teams WHERE id = 416;\nSELECT * FROM opportunities WHERE team_id = 190;\n\nSELECT * FROM teams WHERE name LIKE '%Lead Forensics%';\nSELECT sa.id,\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 190 and sa.provider = 'hubspot';\n\n\n\nSELECT * FROM teams WHERE name LIKE '%Rapaport%'; # 431, 337\nSELECT * FROM teams where id = 431;\nSELECT * FROM crm_configurations where team_id = 431;\nSELECT * FROM activity_providers where team_id = 431;\nSELECT * FROM activities where crm_configuration_id = 337 and type IN ('softphone', 'softphone-outbound')\nand provider NOT IN ('hubspot', 'aircall')\n# and telephony_provider_id = '019c1131-a22f-4792-b9ea-20adf6a02ed0'\norder by id desc;\nSELECT sa.id,\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 431 and sa.provider = 'salesforce';\n\nSELECT * FROM teams WHERE name LIKE '%BiP%'; # 401, 320\nSELECT * FROM teams where id = 401;\nSELECT * FROM crm_configurations where team_id = 401;\nSELECT * FROM activity_providers where team_id = 401;\nSELECT * FROM activities where crm_configuration_id = 320 and type IN ('softphone', 'softphone-outbound')\nand provider NOT IN ('hubspot', 'aircall')\n# and telephony_provider_id = '019c1131-a22f-4792-b9ea-20adf6a02ed0'\norder by id desc;\nSELECT sa.id,\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 401 and sa.provider = 'salesforce';\n\n\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 307; # 379 - Story Terrace Inc , portalId: 3921157\nSELECT * FROM contacts WHERE team_id = 379 and updated_at > '2026-01-31 11:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 379 and updated_at > '2026-02-01 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 379 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 379 and sa.provider = 'hubspot';\n\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 485; # 563 - LATUS Group (ad94d501-5d09-44fd-878f-ca3a9f8865c3) , portalId: 3904501\nSELECT * FROM opportunities WHERE team_id = 563 and updated_at > '2026-02-02 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 563 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 338; # 432 - Formalize , portalId: 9214205\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 432 and sa.provider = 'hubspot';\nSELECT * FROM opportunities WHERE team_id = 432 and updated_at > '2026-02-02 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 432 and updated_at > '2026-02-10 00:00:00' order by updated_at desc;\n\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 436; # 519 - Moxso , portalId: 25531989\nSELECT * FROM opportunities WHERE team_id = 519 and updated_at > '2026-02-02 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 519 and updated_at > '2026-02-04 11:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 96; # 119 - Nourish Care , portalId: 26617984\nSELECT * FROM opportunities WHERE team_id = 119 and updated_at > '2026-02-02 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 119 and updated_at > '2026-02-04 11:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 331; # 416 - The National College , portalId: 7213852\nSELECT * FROM opportunities WHERE team_id = 416 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 416 and updated_at > '2026-02-04 11:00:00' order by updated_at desc;\n\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 308; # 380 - Foodles , portalId: 7723616\nSELECT * FROM opportunities WHERE team_id = 380 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 380 and updated_at > '2026-02-06 10:30:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 379; # 471 - imat-uve , portalId: 9177354\nSELECT * FROM opportunities WHERE team_id = 471 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 471 and updated_at > '2026-02-06 10:30:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 465; # 545 - Spotler , portalId: 144759271\nSELECT * FROM opportunities WHERE team_id = 545 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 545 and updated_at > '2026-02-06 10:30:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 455; # 537 - indevis , portalId: 25666868\nSELECT * FROM opportunities WHERE team_id = 537 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 537 and updated_at > '2026-02-06 10:30:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 200; # 265 - Jobadder , portalId: 6426676\nSELECT * FROM opportunities WHERE team_id = 265 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 265 and updated_at > '2026-02-06 10:30:00' order by updated_at desc;\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 335; # 429 - Eletive , portalId: 6110563\nSELECT * FROM opportunities WHERE team_id = 429 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 429 and updated_at > '2026-02-09 10:30:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 363; # 456 - Global Group , portalId: 8901981\nSELECT * FROM opportunities WHERE team_id = 456 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 456 and updated_at > '2026-02-09 10:30:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 297; # 369 - Unbiased , portalId: 9229005\nSELECT * FROM opportunities WHERE team_id = 369 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 369 and updated_at > '2026-02-09 10:30:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 353; # 449 - Fuuse , portalId: 25781745\nSELECT * FROM opportunities WHERE team_id = 449 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 449 and updated_at > '2026-02-09 10:30:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 487; # 566 - Nimbus , portalId: 39982590\nSELECT * FROM opportunities WHERE team_id = 566 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 566 and updated_at > '2026-02-09 10:30:00' order by updated_at desc;\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 487;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1630;\nselect * from crm_fields where crm_configuration_id = 487 and\n(uuid_to_bin('4c6b2971-64d4-45b8-b377-427be758b5a5') = uuid or uuid_to_bin('59e368d8-65a0-4b77-b611-db37c99fbe68') = uuid);\nSELECT * FROM crm_field_values WHERE crm_field_id = 375177;\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 420; # 506 - voiio , portalId: 145629154\nSELECT * FROM opportunities WHERE team_id = 506 and updated_at > '2026-02-10 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 506 and updated_at > '2026-02-10 15:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 479; # 558 - Momice , portalId: 535962\nSELECT * FROM opportunities WHERE team_id = 558 and updated_at > '2026-02-10 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 558 and updated_at > '2026-02-10 15:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 59; # 80 - Storyclash GmbH , portalId: 4268479\nSELECT * FROM opportunities WHERE team_id = 80 and updated_at > '2026-02-10 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 80 and updated_at > '2026-02-10 15:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 175; # 203 - Team iAM , portalId: 5534732\nSELECT * FROM opportunities WHERE team_id = 203 and updated_at > '2026-02-10 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 203 and updated_at > '2026-02-10 15:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 368; # 460 - OneTouch Health , portalId: 5534732183355\nSELECT * FROM opportunities WHERE team_id = 460 and updated_at > '2026-02-10 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 460 and updated_at > '2026-02-10 15:00:00' order by updated_at desc;\n\n\n\nselect * from users where id = 29643;\nSELECT * FROM crm_field_values WHERE crm_field_id = 375177;\n# ********************************************************************\nSELECT * FROM teams WHERE name LIKE '%Buynomics%'; # 462, 482, 14910\nSELECT * FROM activities WHERE crm_configuration_id = 482\nand type NOT IN ('email-inbound', 'email-outbound')\n# and description like '%The call focused on understanding Welch%'\norder by id desc;\n\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 462 and sa.provider = 'salesforce';\n\nselect * from contacts where crm_configuration_id = 482 and name = 'Cyndall Hill'; # 15504749\nselect * from contacts where id = 10891096; # 482\nSELECT * FROM activities WHERE crm_configuration_id = 482\nand type NOT IN ('email-inbound', 'email-outbound')\nand contact_id = 15504749\norder by id desc;\n\nselect * from activities where id = 36793003; # 96cc7bc1-8622-4d27-92f4-baf664fc1a56, 00UOf00000PDdOXMA1\nselect * from transcription where id = 7646782;\nselect * from ai_prompts where transcription_id = 7646782;\n\n# ********************************************************************\nSELECT * FROM activities WHERE uuid_to_bin('7a8471a3-847e-4822-802b-ddf426bbc252') = uuid; # 37370018\nSELECT * FROM activity_summary_logs WHERE activity_id = 37370018;\nSELECT * FROM teams WHERE id = 555;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 555 and sa.provider = 'hubspot';\n\n# ********************************************************************\nSELECT * FROM activities WHERE uuid_to_bin('7c17b8aa-09df-4f85-a0f7-51f47afd712d') = uuid; # 37395250\nSELECT * FROM activities WHERE uuid_to_bin('14d60388-260d-494b-aa0d-63fdb1c78026') = uuid; # 37395250\n\nSELECT a.* FROM activities a JOIN crm_configurations c on c.id = a.crm_configuration_id\nwhere a.type IN ('softphone', 'softphone-outbound') and c.provider = 'hubspot'\nand a.provider NOT IN ('hubspot')\n# and a.provider IN ('salesloft')\n# and c.id NOT IN (70)\n# and a.duration > 30\n# and actual_start_time > '2026-02-05 00:00:00'\norder by a.id desc;\n\nSELECT * FROM activities WHERE id = 37549787;\nSELECT * FROM crm_profiles WHERE user_id = 17613;\n\nSELECT * FROM crm_configurations WHERE id = 70;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 93 and sa.provider = 'hubspot';\n\nSELECT asf.activity_search_id, asf.id, asf.value\nFROM activity_search_filters asf\nWHERE asf.filter = 'group_id'\nAND asf.value IN (\n SELECT CONCAT(\n HEX(SUBSTR(uuid, 5, 4)), '-',\n HEX(SUBSTR(uuid, 3, 2)), '-',\n HEX(SUBSTR(uuid, 1, 2)), '-',\n HEX(SUBSTR(uuid, 9, 2)), '-',\n HEX(SUBSTR(uuid, 11))\n )\n FROM groups\n WHERE deleted_at IS NOT NULL\n);\n\nSELECT * FROM crm_configurations WHERE id = 373; # KPSBremen.de 465 # - no social account\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 465 and sa.provider = 'hubspot';\n\nselect * from crm_configurations where id = 494;\n\nSELECT * FROM teams WHERE name LIKE '%splose%'; # 572, 495, 18708\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 572 and sa.provider = 'pipedrive';\n\nselect * from opportunities where team_id = 572\n# and name like '%Onebright%'\n# and is_closed = 1 and is_won = 0\n order by id desc;\n\n\nselect * from users where deleted_at is null and status = 2;\n\nselect * from contacts where id = 17900517;\nselect * from accounts where id = 10109838;\nselect * from opportunities where id = 6955880;\n\nselect * from opportunity_contacts where opportunity_id = 6955880;\nselect * from opportunity_contacts where contact_id = 17900517;\n\nselect * from contact_roles cr join crm_configurations crm on cr.crm_configuration_id = crm.id\nwhere crm.provider != 'salesforce';\n\nSELECT * FROM activities WHERE uuid_to_bin('adcb8331-5988-4353-834e-383a355abba2') = uuid; # 38056424, crm 104659682404\nselect * from teams where id = 456;\nSELECT * FROM crm_configurations WHERE id = 363;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 456 and sa.provider = 'hubspot';\n\nselect * from crm_layouts where crm_configuration_id = 363;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id IN (1203, 1204, 1635);\nSELECT * FROM crm_fields WHERE id IN (181536, 181538, 213455);\n\nSELECT * FROM teams WHERE name LIKE '%Electric%'; # 342, 272, 12767\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 342 and sa.provider = 'pipedrive';\nSELECT * FROM opportunities WHERE crm_configuration_id = 272 and name like 'NORTHUMBRIA POL%'; # and updated_at > '2025-07-01 00:00:00';\nSELECT * FROM opportunities WHERE crm_configuration_id = 272 order by remotely_created_at asc; # and updated_at > '2025-07-01 00:00:00';\nSELECT * FROM opportunities WHERE crm_configuration_id = 272 and updated_at > '2026-01-01 00:00:00';\nSELECT * FROM crm_fields WHERE crm_configuration_id = 272 and object_type = 'opportunity';\nSELECT * FROM crm_field_values WHERE crm_field_id = 127164;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 342 and sa.provider = 'pipedrive';\n\nSELECT * FROM teams WHERE id = 472;\nSELECT * FROM crm_configurations WHERE id = 380;\nselect * from activities where id = 38285673; # 38285673\nSELECT * FROM users WHERE id = 16942;\nSELECT * FROM groups WHERE id = 1964;\nSELECT * FROM playbooks WHERE id = 2033;\n\nselect * from teams where created_at > '2026-03-09';\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 499; # 1065\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1678;\n\nSELECT * FROM teams WHERE id = 575;\nselect * from opportunities where team_id = 575;\n\nSELECT * FROM activities WHERE uuid_to_bin('96b1261f-2357-49f9-ab38-23ce12008ea0') = uuid;\n\nselect * from contacts c\nwhere c.crm_configuration_id = 370 order by c.updated_at desc;\n\nSELECT * FROM participants where activity_id = 38833541;\nSELECT * FROM participants where activity_id = 39216301;\nSELECT * FROM activity_summary_logs where activity_id = 39216301;\nSELECT * FROM activities WHERE uuid_to_bin('c7d99fbe-1fb1-41f2-8f4d-52e2bf70e1e9') = uuid; # 38833541, crm 478116564181\nSELECT * FROM activities WHERE uuid_to_bin('2e6ff4d3-9faa-447a-a8c1-9acde4d885ae') = uuid; # 39216301, crm 480171536586\nselect * from crm_profiles where crm_configuration_id = 319 and crm_provider_id = 525785080;\nselect * from opportunities where crm_configuration_id = 319 and crm_provider_id = 410150124747;\nselect * from accounts where crm_configuration_id = 319 and crm_provider_id = 47150650569;\nselect * from contacts where crm_configuration_id = 319 and crm_provider_id IN ('665587441856', '742723347700');\n# owner 13236 525785080\n# contact 1 16779180 665587441856 - activity - Alex Howes alex@supportroom.com created 2026-01-26\n# contact 2 19247563 742723347700 - ash@supportroom.com 2026-03-24\n# company 4176133 47150650569\n# deal 7100953 410150124747\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 400 and sa.provider = 'hubspot';\n\nselect * from features;\nselect * from team_features where feature_id = 40;\n\nselect * from teams where id = 556; # owner: 18101, crm: 477\nselect * from crm_configurations where id = 477;\nSELECT * FROM users WHERE id = 18101;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 556 and sa.provider = 'integration-app';\n\nselect * from opportunities where id = 7594349;\nselect * from opportunity_stages where opportunity_id = 7594349 order by created_at desc;\nselect * from business_processes where id = 6024;\nselect * from business_process_stages where stage_id = 16352;\nselect * from business_process_stages where business_process_id = 6024;\nselect * from stages where team_id = 459;\nselect * from teams where id = 459;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 459 and sa.provider = 'hubspot';\n\nSELECT os.stage_id, s.crm_provider_id, s.name, COUNT(*) as cnt\nFROM opportunity_stages os\nJOIN stages s ON s.id = os.stage_id\nWHERE os.opportunity_id = 7594349\nGROUP BY os.stage_id, s.crm_provider_id, s.name\nORDER BY cnt DESC;\n\nSELECT s.id, s.crm_provider_id, s.name, s.team_id, s.crm_configuration_id\nFROM stages s\nJOIN business_process_stages bps ON bps.stage_id = s.id\nWHERE bps.business_process_id = 6024\nAND s.crm_provider_id = 'contractsent';\n\nselect * from stages where id IN (16352,20612,18281,7344,16378,16309,5036,15223,14535,6293,12098,11607)\n\nSELECT * FROM teams WHERE name LIKE '%Pulsar Group%'; # 472, 380, 15138, raza.gilani@vuelio.com\nselect * from playbooks where team_id = 472; # event 226147\nSELECT * FROM playbook_categories WHERE playbook_id = 2288;\nSELECT * FROM crm_fields WHERE id = 226147;\nSELECT * FROM crm_field_values WHERE crm_field_id = 226147;\n\nSELECT * FROM crm_configurations WHERE id = 380;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 472 and sa.provider = 'salesforce';","depth":4,"value":"SELECT * FROM team_features where team_id = 1;\n\nSELECT * FROM teams WHERE name LIKE '%Vixio%'; # 340,270,11922\nSELECT * FROM users WHERE team_id = 340; # 12015\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 340\nand sa.provider = 'salesforce';\n# and sa.provider = 'salesloft';\n\nselect * from crm_fields where crm_configuration_id = 270 and object_type = 'event';\n# 125558 - Event Type - Event_Type__c\n# 125552 - Event Status - Event_Status__c\n\nSELECT * FROM sidekick_settings WHERE team_id = 340;\n\nSELECT * FROM crm_field_values WHERE crm_field_id in (125552);\n\nselect * from activities where crm_configuration_id = 270\nand type = 'conference' and crm_provider_id IS NOT NULL\nand actual_start_time > '2024-09-16 09:00:00' order by scheduled_start_time;\n\nSELECT * FROM activities WHERE id = 20871677;\nSELECT * FROM crm_field_data WHERE activity_id = 20871677;\n\nselect * from crm_layouts where crm_configuration_id = 270;\nselect * from crm_layout_entities where crm_layout_id in (886,887);\n\nSELECT * FROM crm_configurations WHERE id = 270;\n\nselect * from playbooks where team_id = 340; # 1514\nselect * from groups where team_id = 340;\nSELECT * FROM crm_fields WHERE id IN (125393, 125401);\n\nselect g.name as 'team name', p.name as 'playbook name', f.label as 'activity type field' from groups g\njoin playbooks p on g.playbook_id = p.id\njoin crm_fields f on p.activity_field_id = f.id\nwhere g.team_id = 340;\n\nSELECT * FROM activities WHERE uuid_to_bin('0c180357-67d2-419e-a8c3-b832a3490770') = uuid; # 20448716\nselect * from crm_field_data where object_id = 20448716;\n\nselect * from activities where crm_configuration_id = 270 and provider = 'salesloft' order by id desc;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%CybSafe%'; # 343,273,12008\nselect * from opportunities where team_id = 343;\nselect * from opportunities where team_id = 343 and crm_provider_id = '18099102526';\nselect * from opportunities where team_id = 343 and account_id = 945217482;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 343\nand sa.provider = 'hubspot';\n\nselect * from accounts where team_id = 343 order by name asc;\n\nselect * from stages where crm_configuration_id = 273 and type = 'opportunity';\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Voyado%'; # 353,283,12143\nSELECT * FROM activities WHERE crm_configuration_id = 283 and account_id = 3777844 order by id desc;\nSELECT * FROM accounts WHERE team_id = 353 AND name LIKE '%Salesloft%';\nSELECT * FROM activities WHERE id = 20717903;\n\nselect * from participants where activity_id IN (20929172,20928605,20928468,20926272,20926271,20926270,20926269,20916499,20916454,20916436,20916435,20900015,20900014,20900013,20897312,20897243,20897241,20897237,20897232,20897229,20893648,20893231,20893230,20893229,20893228,20889784,20885039,20885038,20885037,20885036,20885035,20882728,20882708,20882703,20882702,20869828,20869811,20869806,20869801,20869799,20869798,20869796,20869795,20869794,20869761,20869760,20869759,20868688,20868687,20850340,20847195,20841710,20833967,20827021,20825307,20825305,20825297,20824615,20824400,20823927,20821760,20795588,20794233,20794057,20793710,20785811,20781789,20781394,20781307,20762651,20758453,20758282,20757323,20756643,20756636,20756629,20756627,20756606,20756605,20756604,20756603,20756602,20756600,20756599,20756598,20756595,20756594,20756589,20756587,20756577,20756573,20748918,20748386,20748385,20748384,20748383,20748382,20748381,20748380,20748379,20748377,20748375,20748373,20743301,20717905,20717904,20717903,20717901,20717899);\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 353\nand sa.provider = 'salesforce';\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%modern world business solutions%'; # 345,275,12016, l.atkinson@mwbsolutions.co.uk\nSELECT * FROM activities WHERE uuid_to_bin('3921d399-3fef-4609-a291-b0097a166d43') = uuid;\n# id: 20940638, user: 12022, contact: 5305871\nSELECT * FROM activity_summary_logs WHERE activity_id = 20940638;\nselect * from contacts where team_id = 345 and crm_provider_id = '30891432415' order by name asc; # 5305871\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 345\nand sa.provider = 'hubspot';\n\nselect * from users where team_id = 345 and id = 12022;\nSELECT * FROM crm_profiles WHERE user_id = 12022;\nSELECT * FROM participants WHERE activity_id = 20940638;\nSELECT * FROM users u\nJOIN crm_profiles cp ON u.id = cp.user_id\nWHERE u.team_id = 345;\n\nselect * from contacts where team_id = 345 and crm_provider_id = '30880813535' order by name desc; # 5305871\n\nselect * from team_features where team_id = 345;\nSELECT * FROM activities WHERE uuid_to_bin('11701e2d-2f82-4dab-a616-1db4fad238df') = uuid; # 21115197\nSELECT * FROM participants WHERE activity_id = 20897406;\n\n\n\nSELECT * FROM activities WHERE uuid_to_bin('63ba55cd-1abc-447d-83da-0137000005b7') = uuid; # 20953912\nSELECT * FROM activities WHERE crm_configuration_id = 275 and provider = 'ringcentral' and title like '%1252629100%';\n\n\nSELECT * FROM activities WHERE id = 20946641;\nSELECT * FROM crm_profiles WHERE user_id = 10211;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Lunio%'; # 120,97,10984, triger@lunio.ai\nSELECT * FROM opportunities WHERE crm_configuration_id = 97 and crm_provider_id = '006N1000006c5PpIAI';\nselect * from stages where crm_configuration_id = 97 and type = 'opportunity';\nselect * from opportunities where team_id = 120;\n\n\nselect * from crm_configurations crm join teams t on crm.id = t.crm_id\nwhere 1=1\nAND t.current_billing_plan IS NOT NULL\nAND crm.auto_sync_activity = 0\nand crm.provider = 'hubspot';\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Exclaimer%'; # 270,205,10053,james.lewendon@exclaimer.com\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 270\nand sa.provider = 'salesforce';\nSELECT * FROM activities WHERE uuid_to_bin('b54df794-2a9a-4957-8d80-09a600ead5f8') = uuid; # 21637956\nSELECT * FROM crm_profiles WHERE user_id = 11446;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Cygnetise%'; # 372,300,12554, alex.chikly@cygnetise.com\nselect * from playbooks where team_id = 372;\nselect * from crm_fields where crm_configuration_id = 300 and object_type = 'event'; # 141340\nSELECT * FROM crm_field_values WHERE crm_field_id = 141340;\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 372\nand sa.provider = 'salesforce';\n\nselect * from crm_profiles where crm_configuration_id = 300;\nSELECT * FROM crm_configurations WHERE team_id = 372;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Planday%'; # 291,242,11501,mfa@planday.com\nSELECT * FROM opportunities WHERE team_id = 291 and crm_provider_id = '006bG000005DO86QAG'; # 3207756\nselect * from crm_field_data where object_id = 3207756;\nSELECT * FROM crm_fields WHERE id = 111834;\n\nselect f.id, f.crm_provider_id AS field_name, f.label, fd.object_id AS dealId, fd.value\nFROM crm_fields f\nJOIN crm_field_data fd ON f.id = fd.crm_field_id\nWHERE f.crm_configuration_id = 242\nAND f.object_type = 'opportunity'\nAND fd.object_id IN (3207756)\nORDER BY fd.object_id, fd.updated_at;\n\nSELECT * FROM crm_configurations WHERE auto_connect = 1;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Tour%'; # 187,209,8150,salesforce-admin@tourlane.com\nselect * from group_deal_risk_types drgt join groups g on drgt.group_id = g.id\nwhere g.team_id = 187;\n\nselect * from `groups` where team_id = 187;\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 187\nand sa.provider = 'salesforce';\n\n# Destination - 98870 - Destination__c\n# Stage - 79014 - StageName\n# Land Arrangement - 98856 - Land_Arrangement__c\n# Flight - 98848 - Flight__c\n# Last activity date - 98812 - LastActivityDate\n# Last modified date - 98809 - LastModifiedDate\n# Last inbound mail timestamp - 99151 - Last_Inbound_Mail_Timestamp__c\n# next call - 98864 - Next_Call__c\n\nselect * from crm_fields where crm_configuration_id = 209 and object_type = 'opportunity';\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 209;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 682;\n\nselect * from opportunities where team_id = 187 and name LIKE'%Muriel Sal%';\nselect * from opportunities where team_id = 187 and user_id = 9951 and is_closed = 0;\nselect * from activities where opportunity_id = 3538248;\n\nSELECT * FROM crm_profiles WHERE user_id = 8150;\n\nselect * from deal_risks where opportunity_id = 3538248;\n\nselect * from teams where crm_id IS NULL;\n\nSELECT opp.id AS opportunity_id,\n u.group_id AS group_id,\n MAX(\n CASE\n WHEN a.type IN (\"sms-inbound\", \"sms-outbound\") THEN a.created_at\n ELSE a.actual_end_time\n END) as last_date\nFROM opportunities opp\nleft join activities a on a.opportunity_id = opp.id\ninner join users u on opp.user_id = u.id\nwhere opp.user_id IN (9951)\n\nAND opp.is_closed = 0\nand a.status IN ('completed', 'received', 'delivered') OR a.status IS NULL\ngroup by opp.id;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Cybsafe%'; # 343,301,12008,polly.morphew@cybsafe.com\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 343\nand sa.provider = 'hubspot';\n\nSELECT * FROM crm_profiles WHERE crm_configuration_id = 301;\nSELECT * FROM contacts WHERE id = 6612363;\nSELECT * FROM accounts WHERE id = 4235676;\nSELECT * FROM opportunities WHERE crm_configuration_id = 301 and crm_provider_id = 32983784868;\nselect * from opportunity_stages where opportunity_id = 4503759;\n# SELECT * FROM opportunities WHERE id = 4569937;\n\nselect * from activities where crm_configuration_id = 301;\nSELECT * FROM activities WHERE uuid_to_bin('d3b2b28b-c3d0-4c2d-8ed0-eef42855278a') = uuid; # 26330370\nSELECT * FROM participants WHERE activity_id = 26330370;\n\nSELECT * FROM teams WHERE id = 375;\nselect * from playbooks where team_id = 375;\n\nselect * from stages where crm_configuration_id = 301 and type = 'opportunity';\n\nselect * from teams;\nselect * from contact_roles;\n\nSELECT * FROM opportunities WHERE team_id = 343 and user_id = 12871 and close_date >= '2024-11-01';\n\nselect * from users u join crm_profiles cp on cp.user_id = u.id where u.team_id = 343;\n\nSELECT * FROM crm_field_data WHERE object_id = 3771706;\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 343\nand sa.provider = 'hubspot';\n\nSELECT * FROM crm_fields WHERE crm_configuration_id = 301 and object_type = 'opportunity'\nand crm_provider_id LIKE \"%traffic_light%\";\nSELECT * FROM crm_field_values WHERE crm_field_id IN (144020,144048,144111,144113,144126,144481,144508,144531);\n\nSELECT fd.* FROM opportunities o\nJOIN crm_field_data fd ON o.id = fd.object_id\nWHERE o.team_id = 343\n# and o.user_id IS NOT NULL\nand fd.crm_field_id IN (144020,144048,144111,144113,144126,144481,144508,144531)\nand fd.value != ''\norder by value desc\n# group by o.id\n;\n\nSELECT * FROM opportunities WHERE id = 3769843;\n\nSELECT * FROM teams WHERE name LIKE '%Tour%'; # 187,209,8150, salesforce-admin@tourlane.com\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 209;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 682;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Funding Circle%'; # 220,177,8603,aswini.mishra@fundingcircle.com\nSELECT * FROM activities WHERE uuid_to_bin('7a40e99b-3b37-4bb1-b983-325b81801c01') = uuid; # 23139839\n\n\nSELECT * FROM opportunities WHERE id = 3855992;\n\nSELECT * FROM users WHERE name LIKE '%Angus Pollard%'; # 8988\n\nSELECT * FROM teams WHERE name LIKE '%Story Terrace%'; # 379, 307, 12894\nSELECT * FROM crm_fields WHERE crm_configuration_id = 307 and object_type != 'opportunity';\n\nselect * from contacts where team_id = 379 and name like '%bebro%'; # 5874411, crm: 77229348507\nSELECT * FROM crm_field_data WHERE object_id = 5874411;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 379\nand sa.provider = 'hubspot';\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%mentio%'; # 117, 94, 6371, nikhil.kumar@mention-me.com\nSELECT * FROM activities WHERE uuid_to_bin('82939311-1af0-4506-8546-21e8d1fdf2c1') = uuid;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Tourlane%'; # 187, 209, 8150, salesforce-admin@tourlane.com\nSELECT * FROM opportunities WHERE team_id = 187 and crm_provider_id = '006Se000008xfvNIAQ'; # 3537793\nselect * from generic_ai_prompts where subject_id = 3537793;\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Lunio%'; # 120, 97, 10984, triger@lunio.ai\nSELECT * FROM crm_configurations WHERE id = 97;\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 97;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 355;\nSELECT * FROM crm_fields WHERE id = 32682;\n\nselect cfd.value, o.* from opportunities o\njoin crm_field_data cfd on o.id = cfd.object_id and cfd.crm_field_id = 32682\nwhere team_id = 120\nand cfd.value != ''\n;\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 120\nand sa.provider = 'salesforce';\n\nselect * from opportunities where team_id = 120 and crm_provider_id = '006N1000007X8MAIA0';\nSELECT * FROM crm_field_data WHERE object_id = 2313439;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE id = 410;\nSELECT * FROM teams WHERE name LIKE '%Local Business Oxford%';\nselect * from scorecards where team_id = 410;\nselect * from scorecard_rules;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Funding%'; # 220, 177, 8603, aswini.mishra@fundingcircle.com\nselect * from activities a\njoin opportunities o on a.opportunity_id = o.id\njoin users u on o.user_id = u.id\nwhere a.crm_configuration_id = 177 and a.type LIKE '%email-out%'\n# and a.actual_end_time > '2024-12-16 00:00:00'\n# and o.remotely_created_at > '2024-12-01 00:00:00'\n# and u.group_id = 1014\nand u.id = 9021\norder by a.id desc;\nSELECT * FROM opportunities WHERE id in (3981384,4017346);\nSELECT * FROM users WHERE team_id = 220 and id IN (8775, 11435);\n\nselect * from users where id = 9021;\nselect * from inboxes where user_id = 9021;\n\nselect * from inbox_emails where inbox_id = 1349 and email_date > '2024-12-18 00:00:00';\n\nselect * from email_messages where team_id = 220\nand orig_date > '2024-12-16 00:00:00' and orig_date < '2024-12-19 00:00:00'\nand subject LIKE '%Personal%'\n# and 'from' = 'credit@fundingcircle.com'\n;\n\nselect * from activities a\njoin opportunities o on a.opportunity_id = o.id\nwhere a.user_id = 9021 and a.type LIKE '%email-out%'\nand a.actual_end_time > '2024-12-18 00:00:00'\nand o.user_id IS NOT NULL\nand o.remotely_created_at > '2024-12-01 00:00:00'\norder by a.id desc;\n\nSELECT * FROM opportunities WHERE team_id = 220 and name LIKE '%Right Car move Limited%' and id = 3966852;\nselect * from activities where crm_configuration_id = 177 and type LIKE '%email%' and opportunity_id = 3966852 order by id desc;\n\nselect * from team_settings where name IN ('useCloseDate');\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Hurree%'; # 104, 81, 6175, jfarrell@hurree.co\nSELECT * FROM opportunities WHERE team_id = 104 and name = 'PropOp';\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 104\nand sa.provider = 'hubspot';\n\nselect * from crm_configurations where last_synced_at > '2025-01-19 01:00:00'\nselect * from teams where crm_id IS NULL;\n\nselect t.name as 'team', u.name as 'owner', u.email, u.phone\nfrom teams t\njoin activity_providers ap on t.id = ap.team_id\njoin users u on t.owner_id = u.id\nwhere 1=1\n and t.status = 'active'\n and ap.is_enabled = 1\n# and u.status = 1\n and ap.provider = 'ms-teams';\n\nselect * from crm_configurations where provider = 'bullhorn'; # 344\nSELECT * FROM teams WHERE id = 442; # 14293\nselect * from users where team_id = 442;\nselect * from social_accounts sa where sa.sociable_id = 14293;\nselect * from invitations where team_id = 442;\n\n# ********************************************************************************************************\nSELECT * FROM users WHERE email LIKE '%nea.liikamaa@eletive.com%'; # 14022\nSELECT * FROM teams WHERE id = 429;\nselect * from opportunities where team_id = 429 and crm_provider_id IN (16157415775, 22246219645);\nselect * from activities where opportunity_id in (4340436,4353519);\n\nselect * from transcription where activity_id IN (25630961,25381771);\nselect * from generic_ai_prompts where subject_id IN (4353519);\n\nSELECT\n a.id as activity_id,\n a.opportunity_id,\n a.type as activity_type,\n a.language,\n CONCAT(a.title, a.description) AS mail_content,\n e.from AS mail_from,\n e.to AS mail_to,\n e.subject AS mail_subject,\n e.body AS mail_body,\n p.type as prompt_type,\n p.status as prompt_status,\n p.content AS prompt_content,\n a.actual_start_time as created_at\nFROM activities a\n LEFT JOIN ai_prompts p ON a.transcription_id = p.transcription_id AND p.deleted_at IS NULL\n LEFT JOIN email_messages e ON a.id = e.activity_id\nWHERE a.actual_start_time > '2024-01-01 00:00:00'\n AND a.opportunity_id IN (4353519)\n AND a.status IN ('completed', 'received', 'delivered')\n AND a.deleted_at IS NULL\n AND a.type NOT IN ('sms-inbound', 'sms-outbound')\nORDER BY a.opportunity_id ASC, a.id ASC;\n\nSELECT * FROM users WHERE name LIKE '%George Fierstone%'; # 14293\nSELECT * FROM teams WHERE id = 442;\nSELECT * FROM crm_configurations WHERE id = 344;\nselect * from team_features where team_id = 442;\nselect * from groups where team_id = 442;\nselect * from playbooks where team_id = 442;\nselect * from playbook_categories where playbook_id = 1729;\nselect * from crm_fields where crm_configuration_id = 344 and id = 172024;\nSELECT * FROM crm_field_values WHERE crm_field_id = 172024;\nselect * from crm_layouts where crm_configuration_id = 344;\nselect * from playbook_layouts where playbook_id = 1729;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Learning%'; # 260, 221, 9444\n\nselect s.*\n# , s.sent_at, u.name, a.*\nfrom activity_summary_logs s\ninner join activities a on a.id = s.activity_id\ninner join users u on u.id = a.user_id\nwhere a.crm_configuration_id = 356\nand s.sent_at > date_sub(now(), interval 60 day)\norder by a.actual_end_time desc;\n\nselect * from activities a\n# inner join activity_summary_logs s on s.activity_id = a.id\nwhere a.crm_configuration_id = 356 and a.actual_end_time > date_sub(now(), interval 60 day)\n# and a.crm_provider_id is not null\n# and provider <> 'ringcentral'\nand status = 'completed'\norder by a.actual_end_time desc;\n\nselect * from teams order by id desc; # 17328, 32, 17830, integration-account@jiminny.com\nSELECT * FROM users;\nSELECT * FROM users where team_id = 260 and status = 1; # 201 - 150 active\nSELECT * FROM teams WHERE id = 260;\nselect * from team_settings where team_id = 260;\nselect * from crm_configurations where team_id = 260;\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 356;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1184;\n\nselect * from accounts where crm_configuration_id = 221 order by id desc; # 7000\nselect * from leads where crm_configuration_id = 221 order by id desc; # 0\nselect * from contacts where crm_configuration_id = 221 order by id desc; # 200 000\nselect * from opportunities where crm_configuration_id = 221 order by id desc; # 0\nselect * from crm_profiles where crm_configuration_id = 221 order by id desc; # 23\nselect * from crm_fields where crm_configuration_id = 221;\nselect * from crm_field_values where crm_field_id = 5302 order by id desc;\nselect * from crm_layouts where crm_configuration_id = 221 order by id desc;\nselect * from stages where crm_configuration_id = 221 order by id desc;\n\nselect * from accounts where crm_configuration_id = 356 order by id desc; # 7000\nselect * from leads where crm_configuration_id = 356 order by id desc; # 0\nselect * from contacts where crm_configuration_id = 356 order by id desc; # 200 000\nselect * from opportunities where crm_configuration_id = 356 order by id desc; # 0\nselect * from crm_profiles where crm_configuration_id = 356 order by id desc; # 23\nselect * from crm_fields where crm_configuration_id = 356;\nselect * from crm_field_values where crm_field_id = 5302 order by id desc;\nselect * from crm_layouts where crm_configuration_id = 356 order by id desc;\nselect * from stages where crm_configuration_id = 356 order by id desc;\n\nselect * from playbooks where team_id = 260 order by id desc; # 4 (2 deleted)\nselect * from groups where team_id = 260 order by id desc; # 27 groups, (2 deleted)\nselect * from playbook_layouts where playbook_id IN (1410,1409,1276,1254); # 4\nselect ce.* from calendars c\njoin users u on c.user_id = u.id\njoin calendar_events ce on c.id = ce.calendar_id\nwhere u.team_id = 260\nand (ce.start_time > '2025-02-21 00:00:00')\n;\n# calendar events 1207\n#\n\nselect * from opportunities where team_id = 260;\nSELECT * FROM crm_field_data WHERE object_id = 4696496;\n\nselect * from activities where crm_configuration_id = 356 and crm_provider_id IS NOT NULL;\nselect * from activities where crm_configuration_id IN (221) and provider NOT IN ('ms-teams', 'uploader', 'zoom-bot')\n# and type = 'conference' and status = 'scheduled' and activities.is_internal = 0\nand created_at > '2024-03-01 00:00:00'\norder by id desc; # 880 000, ringcentral, avaya\nSELECT * FROM participants WHERE activity_id = 26371744;\n\n# all activities 942 000 +\n# conference 7385 - scheduled 984 - external 343\n\nselect * from activities where id = 26321812;\nselect * from participants where activity_id = 26321812;\nselect * from participants where activity_id in (26414510,26414514,26414516,26414604,26414653,26414655);\nselect * from leads where id in (720428,689175,731546,645866,621037);\n\nselect * from users where id = 13841;\nselect * from opportunities where user_id = 9541;\nselect * from stages where id = 15900;\n\nselect * from accounts where\n# id IN (4160055,5053725,4965303,4896434)\nid in (4584518,3249934,3218025,3891133,3399450,4172999,4485161,3101785,4587203,3070816,2870343,2870341,3563940,4550846,3424464,3249963,2870342)\n;\n\nselect * from activities where id = 26654935;\nSELECT * FROM opportunities WHERE id = 4803458;\n\nSELECT * FROM opportunities where team_id = 260 and user_id = 13841 AND stage_id = 15900;\nSELECT id, uuid, provider, type, lead_id, account_id, contact_id, opportunity_id, stage_id, status, recording_state, title, actual_start_time, actual_end_time\nFROM activities WHERE user_id = 13841 AND opportunity_id IN (4729783, 4731717, 4731726, 4732064, 4732849, 4803458, 4813213);\n\nSELECT DISTINCT\n o.id, o.stage_id, s.name, a.title,\n a.*\nFROM activities a\n# INNER JOIN tracks t ON a.id = t.activity_id\nINNER JOIN users u ON a.user_id = u.id\nINNER JOIN teams team ON u.team_id = team.id\nINNER JOIN groups g ON u.group_id = g.id\nINNER JOIN opportunities o ON a.opportunity_id = o.id\nINNER JOIN stages s ON o.stage_id = s.id\nWHERE\n a.crm_configuration_id = 356\n AND a.status IN ('completed', 'failed')\n AND a.recording_state != 'stopped'\n# and a.user_id = 13841\n AND u.uuid = uuid_to_bin('6f40e4b8-c340-4059-b4ac-1728e87ea99e')\n AND team.uuid = uuid_to_bin('a607fba7-452e-4683-b2af-00d6cb52c93c')\n AND g.uuid = uuid_to_bin('b5d69e40-24a0-4c16-810b-5fa462299f94')\n\n AND a.type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')\n# AND t.type IN ('audio', 'video')\n AND (\n (a.actual_start_time BETWEEN '2025-03-13 00:00:00' AND '2025-03-18 07:59:59')\n OR\n (\n a.actual_start_time IS NULL\n AND a.type IN ('sms-outbound', 'sms-inbound')\n AND a.created_at BETWEEN '2025-03-13 00:00:00' AND '2025-03-18 07:59:59'\n )\n )\n AND (\n a.is_private = 0\n OR (\n a.is_private = 1\n AND u.uuid = uuid_to_bin('6f40e4b8-c340-4059-b4ac-1728e87ea99e')\n )\n )\n AND (\n# s.id = 15900\n s.uuid = uuid_to_bin('04ca1c26-c666-4268-a129-419c0acffd73')\n OR s.uuid IS NULL -- Include records without opportunity stage\n )\n\nORDER BY a.actual_end_time DESC;\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Lead Forensics%'; # 190, 162, 8474, willsc@leadforensics.com\nSELECT * FROM users WHERE team_id = 190;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 190\nand sa.provider = 'hubspot';\n\nselect * from role_user where user_id = 8474;\n\nselect * from crm_configurations where provider = 'bullhorn';\n\nSELECT * FROM opportunities WHERE uuid_to_bin('94578249-65ec-4205-90f2-7d1a7d5ab64a') = uuid;\nSELECT * FROM users WHERE uuid_to_bin('26dbadeb-926f-4150-b11b-771b9d4c2f9a') = uuid;\n\nSELECT * FROM opportunities WHERE id = 4732493;\nselect * from activities where opportunity_id = 4732493;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE id = 443; # 358, 14315, andrea.romano@correrenaturale.com\nSELECT * FROM opportunities WHERE team_id = 443;\n\nSELECT a.id, a.type, a.user_id, a.status, a.deleted_at, u.name, u.email, u.team_id as activity_team_id, u.status, u.deleted_at, t.name, t.status, s.team_id as stage_team_id\nFROM activities AS a\nJOIN stages AS s ON a.stage_id = s.id\nJOIN users AS u ON u.id = a.user_id\nJOIN teams AS t ON t.id = s.team_id\nWHERE u.team_id <> s.team_id and t.id > 135;\n\n\nSELECT\n crm_configuration_id,\n crm_provider_id,\n COUNT(*) as duplicate_count,\n GROUP_CONCAT(id) as stage_ids,\n GROUP_CONCAT(name) as stage_names\nFROM stages\nGROUP BY crm_configuration_id, crm_provider_id\nHAVING COUNT(*) > 1\nORDER BY duplicate_count DESC;\n\nselect * from stages where id IN (14898,14907);\n\nselect * from business_processes;\n\nSELECT *\nFROM crm_configurations\nWHERE team_id IN (\n SELECT team_id\n FROM crm_configurations\n GROUP BY team_id\n HAVING COUNT(*) > 1\n)\nORDER BY team_id;\n\nSELECT *\nFROM teams\nWHERE crm_id IN (\n SELECT crm_id\n FROM teams\n GROUP BY crm_id\n HAVING COUNT(*) > 1\n)\nORDER BY crm_id;\n\n# ***************************************************************************\nselect * from crm_configurations where provider = 'integration-app';\nSELECT * FROM teams WHERE id = 443; # Correre Naturale 358 14315 andrea.romano@correrenaturale.com\nselect * from activities where crm_configuration_id = 358 order by actual_end_time desc;\nselect id, uuid, actual_end_time, crm_provider_id, is_internal, playbook_category_id, type, user_id, lead_id, contact_id, account_id, opportunity_id, status, title from activities where crm_configuration_id = 358 order by actual_end_time desc;\nselect * from team_features where team_id = 358;\nselect * from activity_summary_logs;\n\nselect * from teams where id = 406;\n\n# ************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Sportfive%'; # 267, 202, 14637, srv.salesforce@sportfive.com\nselect * from activities where crm_configuration_id = 202 order by actual_end_time desc;\n\nSELECT * FROM users where id = 14637;\nSELECT * FROM teams where id = 267;\nSELECT * FROM groups where id = 1118;\n\nselect g.name, a.title, uuid_from_bin(a.uuid), a.external_id, a.status, a.recording_state, a.recording_reason_code, a.scheduled_start_time, a.scheduled_end_time, a.actual_start_time, a.actual_end_time from activities a\ninner join users u on u.id = a.user_id\ninner join groups g on g.id = u.group_id\nwhere a.crm_configuration_id = 202\nand a.is_internal = 0\nand (a.scheduled_start_time between '2025-03-19 00:00:00' and '2025-03-21 00:00:00')\nand a.type = 'conference'\nand a.status != 'completed'\nand a.external_id is not null\norder by a.scheduled_start_time desc;\n\nSELECT * FROM activities\nWHERE crm_configuration_id = 202\n AND status IN ('completed', 'failed')\n AND recording_state != 'stopped'\n AND type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')\n AND (is_private = 0 OR user_id = 14637)\n AND (\n (\n actual_start_time BETWEEN '2025-03-12 12:00:00' AND '2025-03-24 11:59:59'\n ) OR (\n actual_start_time IS NULL\n AND type IN ('sms-outbound', 'sms-inbound')\n AND created_at BETWEEN '2025-03-12 12:00:00' AND '2025-03-24 11:59:59'\n )\n )\n AND NOT EXISTS (\n SELECT 1\n FROM tracks\n WHERE\n tracks.activity_id = activities.id\n AND tracks.type IN ('audio', 'video')\n )\nORDER BY actual_end_time DESC;\n\nSELECT DISTINCT\n a.*\nFROM activities a\nINNER JOIN tracks t ON a.id = t.activity_id\nINNER JOIN users u ON a.user_id = u.id\nINNER JOIN teams team ON u.team_id = team.id\nWHERE\n a.crm_configuration_id = 202\n AND a.status IN ('completed', 'failed')\n AND a.recording_state != 'stopped'\n# and a.user_id = 14637\n AND a.type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')\n# AND t.type IN ('audio', 'video')\n AND (\n (a.actual_start_time BETWEEN '2025-03-12 12:00:00' AND '2025-03-24 11:59:59')\n OR\n (\n a.actual_start_time IS NULL\n AND a.type IN ('sms-outbound', 'sms-inbound')\n AND a.created_at BETWEEN '2025-03-12 12:00:00' AND '2025-03-24 11:59:59'\n )\n )\n AND (\n a.is_private = 0\n OR (\n a.is_private = 1\n AND a.user_id = 14637\n )\n )\n\nORDER BY a.actual_end_time DESC\n;\n\nSELECT DISTINCT a.*\nFROM activities a\nINNER JOIN users u ON a.user_id = u.id\nINNER JOIN teams t ON u.team_id = t.id\n# INNER JOIN tracks tr ON a.id = tr.activity_id\n# INNER JOIN groups g ON u.group_id = g.id\nWHERE 1=1\n AND t.id = 267\n# AND t.uuid = uuid_to_bin('aed4927b-f1ea-499e-94c3-83762fd233e8')\n AND a.status IN ('completed', 'failed')\n AND a.recording_state != 'stopped'\n AND a.type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')\n# AND tr.type NOT IN ('audio', 'video')\n AND (\n a.is_private = 0\n OR a.user_id = 14637\n )\n AND (\n (a.actual_start_time BETWEEN '2025-03-19 00:00:00' AND '2025-03-21 23:59:59')\n OR (\n a.actual_start_time IS NULL\n AND a.type IN ('sms-outbound', 'sms-inbound')\n AND a.created_at BETWEEN '2025-03-19 00:00:00' AND '2025-03-21 23:59:59'\n )\n )\n# and NOT EXISTS (\n# SELECT 1\n# FROM tracks t\n# WHERE t.activity_id = a.id\n# AND t.type IN ('audio', 'video')\n# )\n\nORDER BY a.actual_end_time DESC;\n\nSELECT * FROM tracks WHERE activity_id = 26485995;\n\nselect a.is_private, a.title, uuid_from_bin(a.uuid), a.external_id, a.status, a.recording_state, a.recording_reason_code, a.scheduled_start_time, a.scheduled_end_time, a.actual_start_time, a.actual_end_time from activities a\ninner join users u on u.id = a.user_id\nwhere a.crm_configuration_id = 202\n# and a.is_internal = 0\nand (a.actual_start_time between '2025-03-19 00:00:00' and '2025-03-21 00:00:00')\nand a.type IN (\"softphone\",\"softphone-inbound\",\"conference\",\"sms-inbound\")\nand a.status IN ('completed', 'failed')\n# and a.external_id is not null\norder by a.actual_end_time desc;\n\nselect * from activities a where a.crm_configuration_id = 202\nand a.actual_start_time between '2025-03-20 00:00:00' and '2025-03-21 00:00:00'\n# AND a.type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')\n\nselect g.name, a.title, uuid_from_bin(a.uuid), a.external_id, a.status, a.recording_state, a.recording_reason_code, a.scheduled_start_time, a.scheduled_end_time, a.actual_start_time, a.actual_end_time from activities a\ninner join users u on u.id = a.user_id\ninner join groups g on g.id = u.group_id\nwhere a.crm_configuration_id = 202\nand a.is_internal = 0\nand (a.scheduled_start_time between '2025-03-19 00:00:00' and '2025-03-21 00:00:00')\nand a.type = 'conference'\nand a.status != 'completed'\nand a.external_id is not null\norder by a.scheduled_start_time desc;\n\nSELECT * FROM teams WHERE name LIKE '%Tourlane%';\nSELECT * FROM crm_fields WHERE crm_configuration_id = 209 and object_type = 'opportunity';\nSELECT * FROM crm_field_data WHERE crm_field_id = 98809;\n\nselect * from users where status = 1 AND timezone = 'MDT';\n\nselect * from opportunities where id = 3769814;\nselect * from deal_risks where opportunity_id = 3769814;\n\nselect cp.* from crm_profiles cp\njoin users u on cp.user_id = u.id\njoin crm_configurations crm on cp.crm_configuration_id = crm.id\nwhere crm.provider = 'hubspot' AND u.status = 1 AND log_notes != 'none';\n\nselect * from crm_fields where id = 154575;\n\nselect * from team_features where feature = 'SUPPORTS_SYNC_MISSING_CALL_DISPOSITIONS';\nSELECT * FROM teams WHERE id = 176; # crm 148\nselect * from activities where crm_configuration_id = 148 and provider = 'hubspot' order by id desc;\n\nselect * from activity_providers where provider = 'amazon-connect';\n\nselect * from crm_fields cf\njoin crm_configurations crm on crm.id = cf.crm_configuration_id\nwhere crm.provider = 'hubspot' and cf.object_type IN ('account', 'contact');\n\n# *********************************************************************************************\nSELECT * FROM users WHERE id IN (15415, 15418);\nSELECT * FROM groups WHERE id IN (1805,1806);\nSELECT * FROM playbooks WHERE id = 1860;\nSELECT * FROM playbook_categories WHERE id = 38634;\nSELECT * FROM crm_fields WHERE id = 189962;\n\nSELECT * FROM teams WHERE name = 'Pulsar Group'; # 472, 380, 15138 raza.gilani@vuelio.com\n\nSELECT * FROM crm_profiles WHERE user_id = 15415;\nSELECT * FROM social_accounts WHERE sociable_id = 15415 and provider = 'salesforce';\n\nselect * from sidekick_settings where team_id = 472;\n\nSELECT * FROM activities WHERE uuid_to_bin('452c58c7-b87c-4fdd-953e-d7af185e9588') = uuid; # 28617536, user: 15418\nSELECT * FROM activities WHERE uuid_to_bin('399114ee-d3a8-458c-bff5-5f654658db0a') = uuid; # 28344407, user: 15415\nSELECT * FROM activities WHERE uuid_to_bin('f0aa567f-0ab1-4bbb-96aa-37dcf184676b') = uuid; # 28580288, user: 15415\nSELECT * FROM activities WHERE uuid_to_bin('50c086b1-2770-4bca-b5ae-6bac22ec426b') = uuid; # 28566069, user: 15415\n\n# *********************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%TeamTailor%'; # 109, 218, 13969, salesforce-integrations@teamtailor.com\nselect * from crm_configurations where id = 218;\nSELECT * FROM activities WHERE uuid_to_bin('e39b5857-7fdb-4f5a-951a-8d3ca69bb1b0') = uuid; # 28338765\nSELECT * FROM users WHERE id IN (13232, 13230);\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 109\nand sa.provider = 'salesforce';\n\n0057R00000EPL5HQAX Inez Ekblad\n\n1091cb81-5ea1-4951-a0ed-f00b568f0140 Triman Kaur\n\nSELECT * FROM crm_profiles WHERE user_id IN (13232, 13230);\n\n############################################################################################\nSELECT * FROM activities WHERE uuid_to_bin('675eeaeb-5681-42db-90bc-54c07a604408') = uuid; # 28655939 00UVg00000FLvnSMAT\nSELECT * FROM crm_field_data WHERE activity_id = 28655939;\nSELECT * FROM crm_fields WHERE id IN (94491,94493,94498);\nSELECT * FROM users WHERE id = 13658;\nSELECT * FROM teams WHERE id = 109;\nSELECT * FROM crm_configurations WHERE id = 218;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 109\nand sa.provider = 'salesforce';\n\n# ********************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Strengthscope%'; # 481, 390, 15420, katy.holden@strengthscope.comk\nSELECT * FROM stages WHERE crm_configuration_id = 390;\nselect * from business_processes where team_id = 481 and crm_configuration_id = 390;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 481\nand sa.provider = 'salesforce';\n\n\nSELECT * FROM users WHERE id = 15780; # team 462\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 462\nand sa.provider = 'hubspot';\n\n\nselect * from teams where id = 495;\nSELECT * FROM users WHERE id = 15794;\nselect * from social_accounts where sociable_id = 15794;\n\n# ********************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Flight%'; # 427, 333, 13752\nSELECT * FROM accounts WHERE team_id = 427 and crm_provider_id = '668731000183444517';\n\n# ********************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Group GTI%'; # 495, 407, 15794\nSELECT * FROM activities WHERE crm_configuration_id = 407\nand status = 'completed' and type = 'conference'\norder by id desc;\n\nselect ru.*, pr.*, p.* from users u join role_user ru on ru.user_id = u.id\njoin permission_role pr on pr.role_id = ru.role_id\n join permissions p on p.id = pr.permission_id\nwhere team_id = 495 and p.name IN ('dial');\n\nselect * from permission_role;\n\nselect * from activities where crm_configuration_id = 407 and status = 'completed' order by id desc;\nSELECT * FROM activities WHERE id = 29512773;\nSELECT * FROM activities WHERE id IN (29042721,28991325,29002874);\n\nSELECT al.* from activity_summary_logs al join activities a on a.id = al.activity_id\nwhere a.crm_configuration_id = 407\n# and a.id IN (29042721,28991325,29002874);\n\nSELECT * FROM users WHERE id = 15794;\nSELECT * FROM users WHERE team_id = 495;\nSELECT * FROM social_accounts WHERE sociable_id = 15794;\nSELECT * FROM opportunities WHERE team_id = 495 and name like '%OC:%';\nSELECT * FROM contacts WHERE team_id = 495;\nSELECT * FROM leads WHERE team_id = 495;\nSELECT * FROM accounts WHERE team_id = 495;\nSELECT * FROM crm_profiles WHERE crm_configuration_id = 407;\nSELECT * FROM crm_fields WHERE crm_configuration_id = 407;\nSELECT * FROM crm_configurations WHERE id = 407;\nSELECT * FROM opportunities WHERE team_id = 495 and close_date BETWEEN '2025-06-01' AND '2025-07-01'\nand user_id IS NOT NULL and is_closed = 1 and is_won = 1;\n\n# ********************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Hamilton Court FX LLP%'; # 249, 187, 10103\nSELECT * FROM activities WHERE uuid_to_bin('4659c2bb-9a49-484e-9327-a3d66f1e028c') = uuid; # 28951064\nSELECT * FROM crm_fields WHERE crm_configuration_id = 187 and object_type IN ('tasks', 'event');\n\n# *********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Checkstep%'; # 325, 256, 11753\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 325\nand sa.provider = 'hubspot';\n\nSELECT * FROM activities WHERE uuid_to_bin('7be372e2-1916-4d79-a2f3-ca3db1346db3') = uuid; # 28611085\nSELECT * FROM activities WHERE uuid_to_bin('980f0336-840b-4185-a5a9-30cf8b0749a8') = uuid; # 28719733\nSELECT * FROM activity_summary_logs where activity_id = 28719733;\n\n# *************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Learning%'; # 260, 356, 9444\nSELECT * FROM activity_summary_logs where sent_at BETWEEN '2025-06-09 11:38:00' AND '2025-06-09 11:40:00';\nSELECT * FROM leads WHERE crm_configuration_id = 356 and crm_provider_id = '230045001502770504'; # 823630\nselect * from activities where crm_configuration_id = 356 and lead_id = 841732;\n\nSELECT * from activity_summary_logs al join activities a on a.id = al.activity_id\nwhere a.crm_configuration_id = 356;\n\nselect * from activities where crm_configuration_id = 356\nand actual_end_time between '2025-06-09 11:00:00' and '2025-06-09 12:00:00'\norder by id desc;\n\nselect * from accounts where crm_configuration_id = 356 and crm_provider_id = '230045001514403366' order by id desc;\nselect * from leads where crm_configuration_id = 356 and crm_provider_id = '230045001514275654' order by id desc;\nselect * from contacts where crm_configuration_id = 356 and crm_provider_id = '230045001514403366' order by id desc;\nselect * from opportunities where crm_configuration_id = 356 and crm_provider_id = '230045001514403366' order by id desc;\n\nselect * from team_features where team_id = 260;\nselect * from features where id IN (1,2,4,6,18,19,20,9,10,3,23,24,25,26,27);\n\nSELECT * FROM activities WHERE uuid_to_bin('7be372e2-1916-4d79-a2f3-ca3db1346db3') = uuid;\n\nselect * from crm_fields;\nselect * from crm_layout_entities;\n\nSELECT * FROM teams WHERE name LIKE '%Optable%';\n\n# *************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Teamtailor%'; # 109, 218, 13969\nSELECT * FROM crm_configurations WHERE id = 218;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 109\nand sa.provider = 'salesforce';\nSELECT * FROM activities WHERE uuid_to_bin('675eeaeb-5681-42db-90bc-54c07a604408') = uuid; # 28655939\nSELECT * FROM crm_field_data WHERE activity_id = 28655939;\nSELECT * FROM crm_fields WHERE id in (94491,94493,94498);\n\nselect * from teams where crm_id IS NULL;\n\nSELECT * FROM activities WHERE uuid_to_bin('71aa8a0c-9652-4ff6-bee7-d98ae60abef6') = uuid;\n\n# *************************************************************************************************\nselect * from team_domains where team_id = 399;\nSELECT * FROM teams WHERE name LIKE '%Rydoo%'; # 399, 318, 13207\n\nselect * from calendar_events where id = 5163781;\nSELECT * FROM activities WHERE uuid_to_bin('be2cbc52-7fda-46a0-9ae0-25d9553eafc0') = uuid; # 29443896\nSELECT * FROM participants WHERE activity_id = 29443896;\nselect * from contacts where crm_configuration_id = 318 and email = 'marianne.westeng@strawberry.no';\nselect * from leads where crm_configuration_id = 318 and email = 'marianne.westeng@strawberry.no';\n\nselect * from activities where user_id = 14937 order by created_at ;\n\nselect * from users where id = 14937;\n\nselect * from contacts where crm_configuration_id = 318 and email LIKE '%@strawberry.se';\nselect * from opportunities where crm_configuration_id = 318 and crm_provider_id = '006Sf00000D1WOAIA3';\n\nselect * from activities a join participants p on a.id = p.activity_id\nwhere crm_configuration_id = 318 and a.updated_at > '2025-06-23T08:18:43Z';\n\n# *************************************************************************************************\nSELECT * FROM opportunities WHERE team_id = 379 and crm_provider_id = '39334518886';\nSELECT * FROM opportunities WHERE team_id = 379 order by id desc;\nSELECT * FROM teams WHERE id = 379;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 379 and sociable_id = 13852\nand sa.provider = 'hubspot';\n\nSELECT * FROM crm_configurations WHERE id = 307;\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 307;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1027;\nSELECT * FROM crm_fields WHERE crm_configuration_id = 307\n and id IN (144750,144855,145158,155227);\n\nSELECT * FROM activities;\n\n\nselect * from activities\nwhere created_at > '2025-07-01 00:00:00'\n# and created_at < '2025-08-01 00:00:00'\nand type not in ('email-outbound', 'email-inbound')\nand account_id is null\nand contact_id is null\nand lead_id is null\nand opportunity_id is not null\n;\nSELECT * FROM activities WHERE id IN (25344155, 25344296, 25501909, 28692187);\nSELECT * FROM crm_configurations WHERE id in (335,301,200);\n\nselect * from crm_fields where crm_configuration_id = 230 and crm_provider_id = 'Age2__c';\n\nSELECT * FROM teams WHERE name LIKE '%Resights%';\nselect * from crm_fields where crm_configuration_id = 1 and object_type = 'opportunity';\n\nselect * from crm_configurations where provider = 'bullhorn'; # 344\nselect * from teams where id IN (442);\n\nselect * from activities\nwhere crm_configuration_id = 177\nand provider = 'amazon-connect'\n order by id desc;\n# and source <> 'gong';\n\nselect * from activity_providers where provider = 'amazon-connect';\n\nSELECT * FROM activities WHERE uuid_to_bin('cec1993b-a7e5-4164-b74d-d680ea51d2f2') = uuid;\n\n\nselect * from crm_configurations where store_transcript = 1;\nSELECT * FROM teams WHERE id IN (80);\n\n# *************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Sedna%'; # 277, 213, 12594\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 277\nand sa.provider = 'salesforce';\n\nselect * from activities where crm_configuration_id = 213 and account_id = 2511502;\n\nselect * from crm_configurations where id = 213;\n\nSELECT * FROM activities WHERE uuid_to_bin('35aa790a-8569-4544-8268-66f9a4a26804') = uuid; # 33981604\nSELECT * FROM participants WHERE activity_id = 33981604;\nSELECT * FROM crm_fields WHERE crm_configuration_id = 337 and object_type = 'task';\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 431\nand sa.provider = 'salesforce';\nSELECT * FROM activities WHERE uuid_to_bin('b5476c7d-19a8-491b-869d-676ea1e857b6') = uuid; # 33997223\nselect * from activity_summary_logs where activity_id = 33997223;\nselect * from activity_notes where activity_id = 33997223;\n\n# ***********************************\nSELECT * FROM teams WHERE name LIKE '%Abode%';\n\n\nselect * from features;\nselect * from teams t\nwhere t.status = 'active'\nand id NOT IN (select team_id from team_features where feature_id = 9)\n;\n\n\nselect * from playbook_layouts where playbook_id = 1725;\nSELECT * FROM activities WHERE uuid_to_bin('65cc283c-4849-49e6-927f-4c281c8fea19') = uuid; # 34297473\nselect * from teams where id = 318;\nselect * from crm_configurations where team_id = 318;\nselect * from playbooks where team_id = 318;\nSELECT * FROM crm_layouts where crm_configuration_id = 381;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1259;\nSELECT * FROM crm_fields WHERE id IN (192938,192936,192939);\n\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1266;\nSELECT * FROM crm_fields WHERE id IN (192980,192991,192997,192998,193064,193067);\n\nSELECT * FROM activities WHERE uuid_to_bin('a902289b-285c-48eb-9cc2-6ad6c5d938f5') = uuid; # 34297533\n\n\n\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 927;\nSELECT * FROM crm_fields WHERE id IN (131668,131669,131670,131671,131676,131797);\n\nSELECT * FROM teams WHERE name LIKE '%Peripass%'; # 351, 281, 12124\nselect * from crm_layouts where crm_configuration_id = 281;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 927;\nselect * from crm_fields where crm_configuration_id = 281 and id in (131668,131669,131670,131671,131676,131797);\nselect * from opportunities where crm_configuration_id = 281;\n\nSELECT * FROM activities WHERE id IN (34211315, 34130075);\nSELECT * FROM crm_field_data WHERE object_id IN (34211315, 34130075);\n\nselect cf.crm_configuration_id, cle.crm_layout_id, cle.id, cf.id from crm_field_data cfd\njoin crm_layout_entities cle on cle.id = cfd.crm_layout_entity_id\njoin crm_fields cf on cle.crm_field_id = cf.id\nwhere cf.deleted_at IS NOT NULL\nGROUP BY cle.id, cf.id;\n\nselect * from crm_layouts where id IN (355);\nselect u.email, t.crm_id, t.* from teams t\njoin users u on u.id = t.owner_id\nwhere crm_id IN (97);\n\nSELECT * FROM crm_fields WHERE id = 96492;\n\nselect * from permissions;\nselect * from permission_role where permission_id = 247;\nselect * from roles;\n\nselect * from migrations;\n# *****************************************************************\nSELECT * FROM activities WHERE uuid_to_bin('291e3c21-11cc-4728-aee7-6e4bedf86d72') = uuid; # 34262174\nSELECT * FROM crm_configurations WHERE id = 301;\nSELECT * FROM teams WHERE id = 343;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 343\nand sa.provider = 'hubspot';\n\nselect * from participants where activity_id = 34262174;\n\nselect * from contacts where crm_configuration_id = 301 and id = 6976326;\nselect * from accounts where crm_configuration_id = 301 and id IN (4647626, 4815829); # 30761335403\n\nselect * from activity_summary_logs where activity_id = 34262174;\n\nselect * from users where status = 1 AND timezone = 'EST';\n\n# ****************************************************************************\nSELECT * FROM users WHERE id = 13869;\nSELECT * FROM crm_configurations WHERE id = 320;\nSELECT * FROM teams WHERE id = 401;\n\nSELECT * FROM activities WHERE uuid_to_bin('2228c16f-10be-48d5-90d4-67385219dc01') = uuid; # 29670601\n\nSELECT * FROM accounts WHERE id = 7761483;\nSELECT * FROM opportunities WHERE id = 6051814;\n\nSELECT * FROM teams WHERE name LIKE '%Seedlegals%';\n\n;select * from opportunities where updated_at > '2025-10-11' AND crm_provider_id = '34713761166';\n\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 177;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 577;\nSELECT * FROM crm_fields WHERE id IN (68458,68459,68480,68497,68524,68530,68554,68618,68662,68781,68810,68898,68981,69049,97467);\n\nSELECT t.id, crm.id, t.name, crm.sync_objects, crm.provider, crm.last_synced_at FROM crm_configurations crm join teams t on t.crm_id = crm.id\nwhere t.status = 'active' AND crm.provider = 'hubspot' AND crm.last_synced_at < '2025-10-22 00:00:00';\n\nSELECT * FROM activities WHERE uuid_to_bin('fa09449f-cba9-496a-b8f3-865cd3c72351') = uuid;\nSELECT * FROM crm_configurations where id = 184;\nSELECT * FROM teams WHERE id = 246;\nSELECT * FROM social_accounts WHERE sociable_id = 9259 and provider = 'hubspot';\n\nSELECT * FROM users WHERE email LIKE '%rhian.old@bud.co.uk%'; # 17700\nSELECT * FROM teams WHERE id = 551;\n\nSELECT * FROM crm_configurations WHERE id = 471;\nSELECT * FROM activities WHERE crm_configuration_id = 471 and crm_provider_id IS NOT NULL;\nSELECT * FROM crm_fields WHERE crm_configuration_id = 471;\nSELECT * FROM crm_fields WHERE id = 307260;\nSELECT * FROM crm_field_values WHERE crm_field_id = 307260;\n\nselect * from crm_layouts where crm_configuration_id = 471;\n\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1547;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1548;\n\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 551 and sa.provider = 'hubspot';\n\nSELECT * FROM teams WHERE name LIKE '%$PCS%';\n\n# ********************************************************************************************************\nselect * from crm_configurations crm\njoin teams t on t.crm_id = crm.id\nwhere t.status = 'active'\nand crm.provider = 'hubspot';\n\n# $slug = 'HUBSPOT_WEBHOOK_SYNC';\n# $team = Jiminny\\Models\\Team::find(2);\n# $feature = Feature::query()->where('slug', $slug)->first();\n# TeamFeature::query()->create(['feature_id' => $feature->getId(),'team_id' => $team->getId()]);\n\n# hubspot_webhook_metrics\n\nselect * from crm_configurations where id = 331; # 416\nSELECT * FROM teams WHERE id = 416;\nSELECT * FROM opportunities WHERE team_id = 190;\n\nSELECT * FROM teams WHERE name LIKE '%Lead Forensics%';\nSELECT sa.id,\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 190 and sa.provider = 'hubspot';\n\n\n\nSELECT * FROM teams WHERE name LIKE '%Rapaport%'; # 431, 337\nSELECT * FROM teams where id = 431;\nSELECT * FROM crm_configurations where team_id = 431;\nSELECT * FROM activity_providers where team_id = 431;\nSELECT * FROM activities where crm_configuration_id = 337 and type IN ('softphone', 'softphone-outbound')\nand provider NOT IN ('hubspot', 'aircall')\n# and telephony_provider_id = '019c1131-a22f-4792-b9ea-20adf6a02ed0'\norder by id desc;\nSELECT sa.id,\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 431 and sa.provider = 'salesforce';\n\nSELECT * FROM teams WHERE name LIKE '%BiP%'; # 401, 320\nSELECT * FROM teams where id = 401;\nSELECT * FROM crm_configurations where team_id = 401;\nSELECT * FROM activity_providers where team_id = 401;\nSELECT * FROM activities where crm_configuration_id = 320 and type IN ('softphone', 'softphone-outbound')\nand provider NOT IN ('hubspot', 'aircall')\n# and telephony_provider_id = '019c1131-a22f-4792-b9ea-20adf6a02ed0'\norder by id desc;\nSELECT sa.id,\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 401 and sa.provider = 'salesforce';\n\n\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 307; # 379 - Story Terrace Inc , portalId: 3921157\nSELECT * FROM contacts WHERE team_id = 379 and updated_at > '2026-01-31 11:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 379 and updated_at > '2026-02-01 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 379 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 379 and sa.provider = 'hubspot';\n\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 485; # 563 - LATUS Group (ad94d501-5d09-44fd-878f-ca3a9f8865c3) , portalId: 3904501\nSELECT * FROM opportunities WHERE team_id = 563 and updated_at > '2026-02-02 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 563 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 338; # 432 - Formalize , portalId: 9214205\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 432 and sa.provider = 'hubspot';\nSELECT * FROM opportunities WHERE team_id = 432 and updated_at > '2026-02-02 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 432 and updated_at > '2026-02-10 00:00:00' order by updated_at desc;\n\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 436; # 519 - Moxso , portalId: 25531989\nSELECT * FROM opportunities WHERE team_id = 519 and updated_at > '2026-02-02 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 519 and updated_at > '2026-02-04 11:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 96; # 119 - Nourish Care , portalId: 26617984\nSELECT * FROM opportunities WHERE team_id = 119 and updated_at > '2026-02-02 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 119 and updated_at > '2026-02-04 11:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 331; # 416 - The National College , portalId: 7213852\nSELECT * FROM opportunities WHERE team_id = 416 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 416 and updated_at > '2026-02-04 11:00:00' order by updated_at desc;\n\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 308; # 380 - Foodles , portalId: 7723616\nSELECT * FROM opportunities WHERE team_id = 380 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 380 and updated_at > '2026-02-06 10:30:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 379; # 471 - imat-uve , portalId: 9177354\nSELECT * FROM opportunities WHERE team_id = 471 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 471 and updated_at > '2026-02-06 10:30:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 465; # 545 - Spotler , portalId: 144759271\nSELECT * FROM opportunities WHERE team_id = 545 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 545 and updated_at > '2026-02-06 10:30:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 455; # 537 - indevis , portalId: 25666868\nSELECT * FROM opportunities WHERE team_id = 537 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 537 and updated_at > '2026-02-06 10:30:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 200; # 265 - Jobadder , portalId: 6426676\nSELECT * FROM opportunities WHERE team_id = 265 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 265 and updated_at > '2026-02-06 10:30:00' order by updated_at desc;\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 335; # 429 - Eletive , portalId: 6110563\nSELECT * FROM opportunities WHERE team_id = 429 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 429 and updated_at > '2026-02-09 10:30:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 363; # 456 - Global Group , portalId: 8901981\nSELECT * FROM opportunities WHERE team_id = 456 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 456 and updated_at > '2026-02-09 10:30:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 297; # 369 - Unbiased , portalId: 9229005\nSELECT * FROM opportunities WHERE team_id = 369 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 369 and updated_at > '2026-02-09 10:30:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 353; # 449 - Fuuse , portalId: 25781745\nSELECT * FROM opportunities WHERE team_id = 449 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 449 and updated_at > '2026-02-09 10:30:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 487; # 566 - Nimbus , portalId: 39982590\nSELECT * FROM opportunities WHERE team_id = 566 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 566 and updated_at > '2026-02-09 10:30:00' order by updated_at desc;\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 487;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1630;\nselect * from crm_fields where crm_configuration_id = 487 and\n(uuid_to_bin('4c6b2971-64d4-45b8-b377-427be758b5a5') = uuid or uuid_to_bin('59e368d8-65a0-4b77-b611-db37c99fbe68') = uuid);\nSELECT * FROM crm_field_values WHERE crm_field_id = 375177;\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 420; # 506 - voiio , portalId: 145629154\nSELECT * FROM opportunities WHERE team_id = 506 and updated_at > '2026-02-10 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 506 and updated_at > '2026-02-10 15:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 479; # 558 - Momice , portalId: 535962\nSELECT * FROM opportunities WHERE team_id = 558 and updated_at > '2026-02-10 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 558 and updated_at > '2026-02-10 15:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 59; # 80 - Storyclash GmbH , portalId: 4268479\nSELECT * FROM opportunities WHERE team_id = 80 and updated_at > '2026-02-10 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 80 and updated_at > '2026-02-10 15:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 175; # 203 - Team iAM , portalId: 5534732\nSELECT * FROM opportunities WHERE team_id = 203 and updated_at > '2026-02-10 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 203 and updated_at > '2026-02-10 15:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 368; # 460 - OneTouch Health , portalId: 5534732183355\nSELECT * FROM opportunities WHERE team_id = 460 and updated_at > '2026-02-10 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 460 and updated_at > '2026-02-10 15:00:00' order by updated_at desc;\n\n\n\nselect * from users where id = 29643;\nSELECT * FROM crm_field_values WHERE crm_field_id = 375177;\n# ********************************************************************\nSELECT * FROM teams WHERE name LIKE '%Buynomics%'; # 462, 482, 14910\nSELECT * FROM activities WHERE crm_configuration_id = 482\nand type NOT IN ('email-inbound', 'email-outbound')\n# and description like '%The call focused on understanding Welch%'\norder by id desc;\n\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 462 and sa.provider = 'salesforce';\n\nselect * from contacts where crm_configuration_id = 482 and name = 'Cyndall Hill'; # 15504749\nselect * from contacts where id = 10891096; # 482\nSELECT * FROM activities WHERE crm_configuration_id = 482\nand type NOT IN ('email-inbound', 'email-outbound')\nand contact_id = 15504749\norder by id desc;\n\nselect * from activities where id = 36793003; # 96cc7bc1-8622-4d27-92f4-baf664fc1a56, 00UOf00000PDdOXMA1\nselect * from transcription where id = 7646782;\nselect * from ai_prompts where transcription_id = 7646782;\n\n# ********************************************************************\nSELECT * FROM activities WHERE uuid_to_bin('7a8471a3-847e-4822-802b-ddf426bbc252') = uuid; # 37370018\nSELECT * FROM activity_summary_logs WHERE activity_id = 37370018;\nSELECT * FROM teams WHERE id = 555;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 555 and sa.provider = 'hubspot';\n\n# ********************************************************************\nSELECT * FROM activities WHERE uuid_to_bin('7c17b8aa-09df-4f85-a0f7-51f47afd712d') = uuid; # 37395250\nSELECT * FROM activities WHERE uuid_to_bin('14d60388-260d-494b-aa0d-63fdb1c78026') = uuid; # 37395250\n\nSELECT a.* FROM activities a JOIN crm_configurations c on c.id = a.crm_configuration_id\nwhere a.type IN ('softphone', 'softphone-outbound') and c.provider = 'hubspot'\nand a.provider NOT IN ('hubspot')\n# and a.provider IN ('salesloft')\n# and c.id NOT IN (70)\n# and a.duration > 30\n# and actual_start_time > '2026-02-05 00:00:00'\norder by a.id desc;\n\nSELECT * FROM activities WHERE id = 37549787;\nSELECT * FROM crm_profiles WHERE user_id = 17613;\n\nSELECT * FROM crm_configurations WHERE id = 70;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 93 and sa.provider = 'hubspot';\n\nSELECT asf.activity_search_id, asf.id, asf.value\nFROM activity_search_filters asf\nWHERE asf.filter = 'group_id'\nAND asf.value IN (\n SELECT CONCAT(\n HEX(SUBSTR(uuid, 5, 4)), '-',\n HEX(SUBSTR(uuid, 3, 2)), '-',\n HEX(SUBSTR(uuid, 1, 2)), '-',\n HEX(SUBSTR(uuid, 9, 2)), '-',\n HEX(SUBSTR(uuid, 11))\n )\n FROM groups\n WHERE deleted_at IS NOT NULL\n);\n\nSELECT * FROM crm_configurations WHERE id = 373; # KPSBremen.de 465 # - no social account\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 465 and sa.provider = 'hubspot';\n\nselect * from crm_configurations where id = 494;\n\nSELECT * FROM teams WHERE name LIKE '%splose%'; # 572, 495, 18708\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 572 and sa.provider = 'pipedrive';\n\nselect * from opportunities where team_id = 572\n# and name like '%Onebright%'\n# and is_closed = 1 and is_won = 0\n order by id desc;\n\n\nselect * from users where deleted_at is null and status = 2;\n\nselect * from contacts where id = 17900517;\nselect * from accounts where id = 10109838;\nselect * from opportunities where id = 6955880;\n\nselect * from opportunity_contacts where opportunity_id = 6955880;\nselect * from opportunity_contacts where contact_id = 17900517;\n\nselect * from contact_roles cr join crm_configurations crm on cr.crm_configuration_id = crm.id\nwhere crm.provider != 'salesforce';\n\nSELECT * FROM activities WHERE uuid_to_bin('adcb8331-5988-4353-834e-383a355abba2') = uuid; # 38056424, crm 104659682404\nselect * from teams where id = 456;\nSELECT * FROM crm_configurations WHERE id = 363;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 456 and sa.provider = 'hubspot';\n\nselect * from crm_layouts where crm_configuration_id = 363;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id IN (1203, 1204, 1635);\nSELECT * FROM crm_fields WHERE id IN (181536, 181538, 213455);\n\nSELECT * FROM teams WHERE name LIKE '%Electric%'; # 342, 272, 12767\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 342 and sa.provider = 'pipedrive';\nSELECT * FROM opportunities WHERE crm_configuration_id = 272 and name like 'NORTHUMBRIA POL%'; # and updated_at > '2025-07-01 00:00:00';\nSELECT * FROM opportunities WHERE crm_configuration_id = 272 order by remotely_created_at asc; # and updated_at > '2025-07-01 00:00:00';\nSELECT * FROM opportunities WHERE crm_configuration_id = 272 and updated_at > '2026-01-01 00:00:00';\nSELECT * FROM crm_fields WHERE crm_configuration_id = 272 and object_type = 'opportunity';\nSELECT * FROM crm_field_values WHERE crm_field_id = 127164;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 342 and sa.provider = 'pipedrive';\n\nSELECT * FROM teams WHERE id = 472;\nSELECT * FROM crm_configurations WHERE id = 380;\nselect * from activities where id = 38285673; # 38285673\nSELECT * FROM users WHERE id = 16942;\nSELECT * FROM groups WHERE id = 1964;\nSELECT * FROM playbooks WHERE id = 2033;\n\nselect * from teams where created_at > '2026-03-09';\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 499; # 1065\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1678;\n\nSELECT * FROM teams WHERE id = 575;\nselect * from opportunities where team_id = 575;\n\nSELECT * FROM activities WHERE uuid_to_bin('96b1261f-2357-49f9-ab38-23ce12008ea0') = uuid;\n\nselect * from contacts c\nwhere c.crm_configuration_id = 370 order by c.updated_at desc;\n\nSELECT * FROM participants where activity_id = 38833541;\nSELECT * FROM participants where activity_id = 39216301;\nSELECT * FROM activity_summary_logs where activity_id = 39216301;\nSELECT * FROM activities WHERE uuid_to_bin('c7d99fbe-1fb1-41f2-8f4d-52e2bf70e1e9') = uuid; # 38833541, crm 478116564181\nSELECT * FROM activities WHERE uuid_to_bin('2e6ff4d3-9faa-447a-a8c1-9acde4d885ae') = uuid; # 39216301, crm 480171536586\nselect * from crm_profiles where crm_configuration_id = 319 and crm_provider_id = 525785080;\nselect * from opportunities where crm_configuration_id = 319 and crm_provider_id = 410150124747;\nselect * from accounts where crm_configuration_id = 319 and crm_provider_id = 47150650569;\nselect * from contacts where crm_configuration_id = 319 and crm_provider_id IN ('665587441856', '742723347700');\n# owner 13236 525785080\n# contact 1 16779180 665587441856 - activity - Alex Howes alex@supportroom.com created 2026-01-26\n# contact 2 19247563 742723347700 - ash@supportroom.com 2026-03-24\n# company 4176133 47150650569\n# deal 7100953 410150124747\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 400 and sa.provider = 'hubspot';\n\nselect * from features;\nselect * from team_features where feature_id = 40;\n\nselect * from teams where id = 556; # owner: 18101, crm: 477\nselect * from crm_configurations where id = 477;\nSELECT * FROM users WHERE id = 18101;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 556 and sa.provider = 'integration-app';\n\nselect * from opportunities where id = 7594349;\nselect * from opportunity_stages where opportunity_id = 7594349 order by created_at desc;\nselect * from business_processes where id = 6024;\nselect * from business_process_stages where stage_id = 16352;\nselect * from business_process_stages where business_process_id = 6024;\nselect * from stages where team_id = 459;\nselect * from teams where id = 459;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 459 and sa.provider = 'hubspot';\n\nSELECT os.stage_id, s.crm_provider_id, s.name, COUNT(*) as cnt\nFROM opportunity_stages os\nJOIN stages s ON s.id = os.stage_id\nWHERE os.opportunity_id = 7594349\nGROUP BY os.stage_id, s.crm_provider_id, s.name\nORDER BY cnt DESC;\n\nSELECT s.id, s.crm_provider_id, s.name, s.team_id, s.crm_configuration_id\nFROM stages s\nJOIN business_process_stages bps ON bps.stage_id = s.id\nWHERE bps.business_process_id = 6024\nAND s.crm_provider_id = 'contractsent';\n\nselect * from stages where id IN (16352,20612,18281,7344,16378,16309,5036,15223,14535,6293,12098,11607)\n\nSELECT * FROM teams WHERE name LIKE '%Pulsar Group%'; # 472, 380, 15138, raza.gilani@vuelio.com\nselect * from playbooks where team_id = 472; # event 226147\nSELECT * FROM playbook_categories WHERE playbook_id = 2288;\nSELECT * FROM crm_fields WHERE id = 226147;\nSELECT * FROM crm_field_values WHERE crm_field_id = 226147;\n\nSELECT * FROM crm_configurations WHERE id = 380;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 472 and sa.provider = 'salesforce';","role_description":"text entry area","is_enabled":true,"is_focused":true,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Project","depth":3,"role_description":"text"},{"role":"AXButton","text":"Project","depth":3,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"New File or Directory…","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Expand Selected","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Collapse All","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Options","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
2406143553526754098
|
2074680717582186093
|
click
|
accessibility
|
NULL
|
Project: faVsco.js, menu
#11894 on JY-18909-automa Project: faVsco.js, menu
#11894 on JY-18909-automated-reports-ask-jiminny, menu
Start Listening for PHP Debug Connections
TrackAutomatedReportGeneratedEventTest
Run 'TrackAutomatedReportGeneratedEventTest'
Debug 'TrackAutomatedReportGeneratedEventTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Code changed:
Hide
Sync Changes
Hide This Notification
2
Previous Highlighted Error
Next Highlighted Error
<?php
namespace Jiminny\Listeners\Activities\Coaching\UserPilot;
use GuzzleHttp\Exception\GuzzleException;
use Jiminny\Events\Activities\Coaching\Shared;
use Jiminny\Listeners\Activities\UserPilotActivityListener;
class CreateSharedEvent extends UserPilotActivityListener
{
/**
* Handle the event.
*/
public function handle(Shared $event): void
{
// Don't attempt to run this on environments with UserPilot not configured.
if (config('services.userpilot.token') === null) {
return;
}
try {
$this->userPilotService->track(
$event->share->from,
'shared-activity',
$this->generatePayload($event->share->activity)
);
} catch (GuzzleException $e) {
// Retry later.
$this->release(3600);
}
}
}
Execute
Explain Plan
Browse Query History
View Parameters
Open Query Execution Settings…
In-Editor Results
Tx: Auto
Cancel Running Statements
Playground
jiminny
Sync Changes
Hide This Notification
Code changed:
Hide
27
9
23
3
105
Previous Highlighted Error
Next Highlighted Error
SELECT * FROM team_features where team_id = 1;
SELECT * FROM teams WHERE name LIKE '%Vixio%'; # 340,270,11922
SELECT * FROM users WHERE team_id = 340; # 12015
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 340
and sa.provider = 'salesforce';
# and sa.provider = 'salesloft';
select * from crm_fields where crm_configuration_id = 270 and object_type = 'event';
# 125558 - Event Type - Event_Type__c
# 125552 - Event Status - Event_Status__c
SELECT * FROM sidekick_settings WHERE team_id = 340;
SELECT * FROM crm_field_values WHERE crm_field_id in (125552);
select * from activities where crm_configuration_id = 270
and type = 'conference' and crm_provider_id IS NOT NULL
and actual_start_time > '2024-09-16 09:00:00' order by scheduled_start_time;
SELECT * FROM activities WHERE id = 20871677;
SELECT * FROM crm_field_data WHERE activity_id = 20871677;
select * from crm_layouts where crm_configuration_id = 270;
select * from crm_layout_entities where crm_layout_id in (886,887);
SELECT * FROM crm_configurations WHERE id = 270;
select * from playbooks where team_id = 340; # 1514
select * from groups where team_id = 340;
SELECT * FROM crm_fields WHERE id IN (125393, 125401);
select g.name as 'team name', p.name as 'playbook name', f.label as 'activity type field' from groups g
join playbooks p on g.playbook_id = p.id
join crm_fields f on p.activity_field_id = f.id
where g.team_id = 340;
SELECT * FROM activities WHERE uuid_to_bin('0c180357-67d2-419e-a8c3-b832a3490770') = uuid; # 20448716
select * from crm_field_data where object_id = 20448716;
select * from activities where crm_configuration_id = 270 and provider = 'salesloft' order by id desc;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%CybSafe%'; # 343,273,12008
select * from opportunities where team_id = 343;
select * from opportunities where team_id = 343 and crm_provider_id = '18099102526';
select * from opportunities where team_id = 343 and account_id = 945217482;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 343
and sa.provider = 'hubspot';
select * from accounts where team_id = 343 order by name asc;
select * from stages where crm_configuration_id = 273 and type = 'opportunity';
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Voyado%'; # 353,283,12143
SELECT * FROM activities WHERE crm_configuration_id = 283 and account_id = 3777844 order by id desc;
SELECT * FROM accounts WHERE team_id = 353 AND name LIKE '%Salesloft%';
SELECT * FROM activities WHERE id = 20717903;
select * from participants where activity_id IN (20929172,20928605,20928468,20926272,20926271,20926270,20926269,20916499,20916454,20916436,20916435,20900015,20900014,20900013,20897312,20897243,20897241,20897237,20897232,20897229,20893648,20893231,20893230,20893229,20893228,20889784,20885039,20885038,20885037,20885036,20885035,20882728,20882708,20882703,20882702,20869828,20869811,20869806,20869801,20869799,20869798,20869796,20869795,20869794,20869761,20869760,20869759,20868688,20868687,20850340,20847195,20841710,20833967,20827021,20825307,20825305,20825297,20824615,20824400,20823927,20821760,20795588,20794233,20794057,20793710,20785811,20781789,20781394,20781307,20762651,20758453,20758282,20757323,20756643,20756636,20756629,20756627,20756606,20756605,20756604,20756603,20756602,20756600,20756599,20756598,20756595,20756594,20756589,20756587,20756577,20756573,20748918,20748386,20748385,20748384,20748383,20748382,20748381,20748380,20748379,20748377,20748375,20748373,20743301,20717905,20717904,20717903,20717901,20717899);
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 353
and sa.provider = 'salesforce';
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%modern world business solutions%'; # 345,275,12016, [EMAIL]
SELECT * FROM activities WHERE uuid_to_bin('3921d399-3fef-4609-a291-b0097a166d43') = uuid;
# id: 20940638, user: 12022, contact: 5305871
SELECT * FROM activity_summary_logs WHERE activity_id = 20940638;
select * from contacts where team_id = 345 and crm_provider_id = '30891432415' order by name asc; # 5305871
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 345
and sa.provider = 'hubspot';
select * from users where team_id = 345 and id = 12022;
SELECT * FROM crm_profiles WHERE user_id = 12022;
SELECT * FROM participants WHERE activity_id = 20940638;
SELECT * FROM users u
JOIN crm_profiles cp ON u.id = cp.user_id
WHERE u.team_id = 345;
select * from contacts where team_id = 345 and crm_provider_id = '30880813535' order by name desc; # 5305871
select * from team_features where team_id = 345;
SELECT * FROM activities WHERE uuid_to_bin('11701e2d-2f82-4dab-a616-1db4fad238df') = uuid; # 21115197
SELECT * FROM participants WHERE activity_id = 20897406;
SELECT * FROM activities WHERE uuid_to_bin('63ba55cd-1abc-447d-83da-0137000005b7') = uuid; # 20953912
SELECT * FROM activities WHERE crm_configuration_id = 275 and provider = 'ringcentral' and title like '%1252629100%';
SELECT * FROM activities WHERE id = 20946641;
SELECT * FROM crm_profiles WHERE user_id = 10211;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Lunio%'; # 120,97,10984, [EMAIL]
SELECT * FROM opportunities WHERE crm_configuration_id = 97 and crm_provider_id = '006N1000006c5PpIAI';
select * from stages where crm_configuration_id = 97 and type = 'opportunity';
select * from opportunities where team_id = 120;
select * from crm_configurations crm join teams t on crm.id = t.crm_id
where 1=1
AND t.current_billing_plan IS NOT NULL
AND crm.auto_sync_activity = 0
and crm.provider = 'hubspot';
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Exclaimer%'; # 270,205,10053,[EMAIL]
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 270
and sa.provider = 'salesforce';
SELECT * FROM activities WHERE uuid_to_bin('b54df794-2a9a-4957-8d80-09a600ead5f8') = uuid; # 21637956
SELECT * FROM crm_profiles WHERE user_id = 11446;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Cygnetise%'; # 372,300,12554, [EMAIL]
select * from playbooks where team_id = 372;
select * from crm_fields where crm_configuration_id = 300 and object_type = 'event'; # 141340
SELECT * FROM crm_field_values WHERE crm_field_id = 141340;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 372
and sa.provider = 'salesforce';
select * from crm_profiles where crm_configuration_id = 300;
SELECT * FROM crm_configurations WHERE team_id = 372;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Planday%'; # 291,242,11501,[EMAIL]
SELECT * FROM opportunities WHERE team_id = 291 and crm_provider_id = '006bG000005DO86QAG'; # 3207756
select * from crm_field_data where object_id = 3207756;
SELECT * FROM crm_fields WHERE id = 111834;
select f.id, f.crm_provider_id AS field_name, f.label, fd.object_id AS dealId, fd.value
FROM crm_fields f
JOIN crm_field_data fd ON f.id = fd.crm_field_id
WHERE f.crm_configuration_id = 242
AND f.object_type = 'opportunity'
AND fd.object_id IN (3207756)
ORDER BY fd.object_id, fd.updated_at;
SELECT * FROM crm_configurations WHERE auto_connect = 1;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Tour%'; # 187,209,8150,[EMAIL]
select * from group_deal_risk_types drgt join groups g on drgt.group_id = g.id
where g.team_id = 187;
select * from `groups` where team_id = 187;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 187
and sa.provider = 'salesforce';
# Destination - 98870 - Destination__c
# Stage - 79014 - StageName
# Land Arrangement - 98856 - Land_Arrangement__c
# Flight - 98848 - Flight__c
# Last activity date - 98812 - LastActivityDate
# Last modified date - 98809 - LastModifiedDate
# Last inbound mail timestamp - 99151 - Last_Inbound_Mail_Timestamp__c
# next call - 98864 - Next_Call__c
select * from crm_fields where crm_configuration_id = 209 and object_type = 'opportunity';
SELECT * FROM crm_layouts WHERE crm_configuration_id = 209;
SELECT * FROM crm_layout_entities WHERE crm_layout_id = 682;
select * from opportunities where team_id = 187 and name LIKE'%Muriel Sal%';
select * from opportunities where team_id = 187 and user_id = 9951 and is_closed = 0;
select * from activities where opportunity_id = 3538248;
SELECT * FROM crm_profiles WHERE user_id = 8150;
select * from deal_risks where opportunity_id = 3538248;
select * from teams where crm_id IS NULL;
SELECT opp.id AS opportunity_id,
u.group_id AS group_id,
MAX(
CASE
WHEN a.type IN ("sms-inbound", "sms-outbound") THEN a.created_at
ELSE a.actual_end_time
END) as last_date
FROM opportunities opp
left join activities a on a.opportunity_id = opp.id
inner join users u on opp.user_id = u.id
where opp.user_id IN (9951)
AND opp.is_closed = 0
and a.status IN ('completed', 'received', 'delivered') OR a.status IS NULL
group by opp.id;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Cybsafe%'; # 343,301,12008,[EMAIL]
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 343
and sa.provider = 'hubspot';
SELECT * FROM crm_profiles WHERE crm_configuration_id = 301;
SELECT * FROM contacts WHERE id = 6612363;
SELECT * FROM accounts WHERE id = 4235676;
SELECT * FROM opportunities WHERE crm_configuration_id = 301 and crm_provider_id = 32983784868;
select * from opportunity_stages where opportunity_id = 4503759;
# SELECT * FROM opportunities WHERE id = 4569937;
select * from activities where crm_configuration_id = 301;
SELECT * FROM activities WHERE uuid_to_bin('d3b2b28b-c3d0-4c2d-8ed0-eef42855278a') = uuid; # 26330370
SELECT * FROM participants WHERE activity_id = 26330370;
SELECT * FROM teams WHERE id = 375;
select * from playbooks where team_id = 375;
select * from stages where crm_configuration_id = 301 and type = 'opportunity';
select * from teams;
select * from contact_roles;
SELECT * FROM opportunities WHERE team_id = 343 and user_id = 12871 and close_date >= '2024-11-01';
select * from users u join crm_profiles cp on cp.user_id = u.id where u.team_id = 343;
SELECT * FROM crm_field_data WHERE object_id = 3771706;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 343
and sa.provider = 'hubspot';
SELECT * FROM crm_fields WHERE crm_configuration_id = 301 and object_type = 'opportunity'
and crm_provider_id LIKE "%traffic_light%";
SELECT * FROM crm_field_values WHERE crm_field_id IN (144020,144048,144111,144113,144126,144481,144508,144531);
SELECT fd.* FROM opportunities o
JOIN crm_field_data fd ON o.id = fd.object_id
WHERE o.team_id = 343
# and o.user_id IS NOT NULL
and fd.crm_field_id IN (144020,144048,144111,144113,144126,144481,144508,144531)
and fd.value != ''
order by value desc
# group by o.id
;
SELECT * FROM opportunities WHERE id = 3769843;
SELECT * FROM teams WHERE name LIKE '%Tour%'; # 187,209,8150, [EMAIL]
SELECT * FROM crm_layouts WHERE crm_configuration_id = 209;
SELECT * FROM crm_layout_entities WHERE crm_layout_id = 682;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Funding Circle%'; # 220,177,8603,[EMAIL]
SELECT * FROM activities WHERE uuid_to_bin('7a40e99b-3b37-4bb1-b983-325b81801c01') = uuid; # 23139839
SELECT * FROM opportunities WHERE id = 3855992;
SELECT * FROM users WHERE name LIKE '%Angus Pollard%'; # 8988
SELECT * FROM teams WHERE name LIKE '%Story Terrace%'; # 379, 307, 12894
SELECT * FROM crm_fields WHERE crm_configuration_id = 307 and object_type != 'opportunity';
select * from contacts where team_id = 379 and name like '%bebro%'; # 5874411, crm: 77229348507
SELECT * FROM crm_field_data WHERE object_id = 5874411;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 379
and sa.provider = 'hubspot';
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%mentio%'; # 117, 94, 6371, [EMAIL]
SELECT * FROM activities WHERE uuid_to_bin('82939311-1af0-4506-8546-21e8d1fdf2c1') = uuid;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Tourlane%'; # 187, 209, 8150, [EMAIL]
SELECT * FROM opportunities WHERE team_id = 187 and crm_provider_id = '006Se000008xfvNIAQ'; # 3537793
select * from generic_ai_prompts where subject_id = 3537793;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Lunio%'; # 120, 97, 10984, [EMAIL]
SELECT * FROM crm_configurations WHERE id = 97;
SELECT * FROM crm_layouts WHERE crm_configuration_id = 97;
SELECT * FROM crm_layout_entities WHERE crm_layout_id = 355;
SELECT * FROM crm_fields WHERE id = 32682;
select cfd.value, o.* from opportunities o
join crm_field_data cfd on o.id = cfd.object_id and cfd.crm_field_id = 32682
where team_id = 120
and cfd.value != ''
;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 120
and sa.provider = 'salesforce';
select * from opportunities where team_id = 120 and crm_provider_id = '006N1000007X8MAIA0';
SELECT * FROM crm_field_data WHERE object_id = 2313439;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE id = 410;
SELECT * FROM teams WHERE name LIKE '%Local Business Oxford%';
select * from scorecards where team_id = 410;
select * from scorecard_rules;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Funding%'; # 220, 177, 8603, [EMAIL]
select * from activities a
join opportunities o on a.opportunity_id = o.id
join users u on o.user_id = u.id
where a.crm_configuration_id = 177 and a.type LIKE '%email-out%'
# and a.actual_end_time > '2024-12-16 00:00:00'
# and o.remotely_created_at > '2024-12-01 00:00:00'
# and u.group_id = 1014
and u.id = 9021
order by a.id desc;
SELECT * FROM opportunities WHERE id in (3981384,4017346);
SELECT * FROM users WHERE team_id = 220 and id IN (8775, 11435);
select * from users where id = 9021;
select * from inboxes where user_id = 9021;
select * from inbox_emails where inbox_id = 1349 and email_date > '2024-12-18 00:00:00';
select * from email_messages where team_id = 220
and orig_date > '2024-12-16 00:00:00' and orig_date < '2024-12-19 00:00:00'
and subject LIKE '%Personal%'
# and 'from' = '[EMAIL]'
;
select * from activities a
join opportunities o on a.opportunity_id = o.id
where a.user_id = 9021 and a.type LIKE '%email-out%'
and a.actual_end_time > '2024-12-18 00:00:00'
and o.user_id IS NOT NULL
and o.remotely_created_at > '2024-12-01 00:00:00'
order by a.id desc;
SELECT * FROM opportunities WHERE team_id = 220 and name LIKE '%Right Car move Limited%' and id = 3966852;
select * from activities where crm_configuration_id = 177 and type LIKE '%email%' and opportunity_id = 3966852 order by id desc;
select * from team_settings where name IN ('useCloseDate');
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Hurree%'; # 104, 81, 6175, [EMAIL]
SELECT * FROM opportunities WHERE team_id = 104 and name = 'PropOp';
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 104
and sa.provider = 'hubspot';
select * from crm_configurations where last_synced_at > '2025-01-19 01:00:00'
select * from teams where crm_id IS NULL;
select t.name as 'team', u.name as 'owner', u.email, u.phone
from teams t
join activity_providers ap on t.id = ap.team_id
join users u on t.owner_id = u.id
where 1=1
and t.status = 'active'
and ap.is_enabled = 1
# and u.status = 1
and ap.provider = 'ms-teams';
select * from crm_configurations where provider = 'bullhorn'; # 344
SELECT * FROM teams WHERE id = 442; # 14293
select * from users where team_id = 442;
select * from social_accounts sa where sa.sociable_id = 14293;
select * from invitations where team_id = 442;
# [PASSWORD_DOTS]
SELECT * FROM users WHERE email LIKE '%[EMAIL]%'; # 14022
SELECT * FROM teams WHERE id = 429;
select * from opportunities where team_id = 429 and crm_provider_id IN (16157415775, 22246219645);
select * from activities where opportunity_id in (4340436,4353519);
select * from transcription where activity_id IN (25630961,25381771);
select * from generic_ai_prompts where subject_id IN (4353519);
SELECT
a.id as activity_id,
a.opportunity_id,
a.type as activity_type,
a.language,
CONCAT(a.title, a.description) AS mail_content,
e.from AS mail_from,
e.to AS mail_to,
e.subject AS mail_subject,
e.body AS mail_body,
p.type as prompt_type,
p.status as prompt_status,
p.content AS prompt_content,
a.actual_start_time as created_at
FROM activities a
LEFT JOIN ai_prompts p ON a.transcription_id = p.transcription_id AND p.deleted_at IS NULL
LEFT JOIN email_messages e ON a.id = e.activity_id
WHERE a.actual_start_time > '2024-01-01 00:00:00'
AND a.opportunity_id IN (4353519)
AND a.status IN ('completed', 'received', 'delivered')
AND a.deleted_at IS NULL
AND a.type NOT IN ('sms-inbound', 'sms-outbound')
ORDER BY a.opportunity_id ASC, a.id ASC;
SELECT * FROM users WHERE name LIKE '%George Fierstone%'; # 14293
SELECT * FROM teams WHERE id = 442;
SELECT * FROM crm_configurations WHERE id = 344;
select * from team_features where team_id = 442;
select * from groups where team_id = 442;
select * from playbooks where team_id = 442;
select * from playbook_categories where playbook_id = 1729;
select * from crm_fields where crm_configuration_id = 344 and id = 172024;
SELECT * FROM crm_field_values WHERE crm_field_id = 172024;
select * from crm_layouts where crm_configuration_id = 344;
select * from playbook_layouts where playbook_id = 1729;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Learning%'; # 260, 221, 9444
select s.*
# , s.sent_at, u.name, a.*
from activity_summary_logs s
inner join activities a on a.id = s.activity_id
inner join users u on u.id = a.user_id
where a.crm_configuration_id = 356
and s.sent_at > date_sub(now(), interval 60 day)
order by a.actual_end_time desc;
select * from activities a
# inner join activity_summary_logs s on s.activity_id = a.id
where a.crm_configuration_id = 356 and a.actual_end_time > date_sub(now(), interval 60 day)
# and a.crm_provider_id is not null
# and provider <> 'ringcentral'
and status = 'completed'
order by a.actual_end_time desc;
select * from teams order by id desc; # 17328, 32, 17830, [EMAIL]
SELECT * FROM users;
SELECT * FROM users where team_id = 260 and status = 1; # 201 - 150 active
SELECT * FROM teams WHERE id = 260;
select * from team_settings where team_id = 260;
select * from crm_configurations where team_id = 260;
SELECT * FROM crm_layouts WHERE crm_configuration_id = 356;
SELECT * FROM crm_layout_entities WHERE crm_layout_id = 1184;
select * from accounts where crm_configuration_id = 221 order by id desc; # 7000
select * from leads where crm_configuration_id = 221 order by id desc; # 0
select * from contacts where crm_configuration_id = 221 order by id desc; # 200 000
select * from opportunities where crm_configuration_id = 221 order by id desc; # 0
select * from crm_profiles where crm_configuration_id = 221 order by id desc; # 23
select * from crm_fields where crm_configuration_id = 221;
select * from crm_field_values where crm_field_id = 5302 order by id desc;
select * from crm_layouts where crm_configuration_id = 221 order by id desc;
select * from stages where crm_configuration_id = 221 order by id desc;
select * from accounts where crm_configuration_id = 356 order by id desc; # 7000
select * from leads where crm_configuration_id = 356 order by id desc; # 0
select * from contacts where crm_configuration_id = 356 order by id desc; # 200 000
select * from opportunities where crm_configuration_id = 356 order by id desc; # 0
select * from crm_profiles where crm_configuration_id = 356 order by id desc; # 23
select * from crm_fields where crm_configuration_id = 356;
select * from crm_field_values where crm_field_id = 5302 order by id desc;
select * from crm_layouts where crm_configuration_id = 356 order by id desc;
select * from stages where crm_configuration_id = 356 order by id desc;
select * from playbooks where team_id = 260 order by id desc; # 4 (2 deleted)
select * from groups where team_id = 260 order by id desc; # 27 groups, (2 deleted)
select * from playbook_layouts where playbook_id IN (1410,1409,1276,1254); # 4
select ce.* from calendars c
join users u on c.user_id = u.id
join calendar_events ce on c.id = ce.calendar_id
where u.team_id = 260
and (ce.start_time > '2025-02-21 00:00:00')
;
# calendar events 1207
#
select * from opportunities where team_id = 260;
SELECT * FROM crm_field_data WHERE object_id = 4696496;
select * from activities where crm_configuration_id = 356 and crm_provider_id IS NOT NULL;
select * from activities where crm_configuration_id IN (221) and provider NOT IN ('ms-teams', 'uploader', 'zoom-bot')
# and type = 'conference' and status = 'scheduled' and activities.is_internal = 0
and created_at > '2024-03-01 00:00:00'
order by id desc; # 880 000, ringcentral, avaya
SELECT * FROM participants WHERE activity_id = 26371744;
# all activities 942 000 +
# conference 7385 - scheduled 984 - external 343
select * from activities where id = 26321812;
select * from participants where activity_id = 26321812;
select * from participants where activity_id in (26414510,26414514,26414516,26414604,26414653,26414655);
select * from leads where id in (720428,689175,731546,645866,621037);
select * from users where id = 13841;
select * from opportunities where user_id = 9541;
select * from stages where id = 15900;
select * from accounts where
# id IN (4160055,5053725,4965303,4896434)
id in (4584518,3249934,3218025,3891133,3399450,4172999,4485161,3101785,4587203,3070816,2870343,2870341,3563940,4550846,3424464,3249963,2870342)
;
select * from activities where id = 26654935;
SELECT * FROM opportunities WHERE id = 4803458;
SELECT * FROM opportunities where team_id = 260 and user_id = 13841 AND stage_id = 15900;
SELECT id, uuid, provider, type, lead_id, account_id, contact_id, opportunity_id, stage_id, status, recording_state, title, actual_start_time, actual_end_time
FROM activities WHERE user_id = 13841 AND opportunity_id IN (4729783, 4731717, 4731726, 4732064, 4732849, 4803458, 4813213);
SELECT DISTINCT
o.id, o.stage_id, s.name, a.title,
a.*
FROM activities a
# INNER JOIN tracks t ON a.id = t.activity_id
INNER JOIN users u ON a.user_id = u.id
INNER JOIN teams team ON u.team_id = team.id
INNER JOIN groups g ON u.group_id = g.id
INNER JOIN opportunities o ON a.opportunity_id = o.id
INNER JOIN stages s ON o.stage_id = s.id
WHERE
a.crm_configuration_id = 356
AND a.status IN ('completed', 'failed')
AND a.recording_state != 'stopped'
# and a.user_id = 13841
AND u.uuid = uuid_to_bin('6f40e4b8-c340-4059-b4ac-1728e87ea99e')
AND team.uuid = uuid_to_bin('a607fba7-452e-4683-b2af-00d6cb52c93c')
AND g.uuid = uuid_to_bin('b5d69e40-24a0-4c16-810b-5fa462299f94')
AND a.type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')
# AND t.type IN ('audio', 'video')
AND (
(a.actual_start_time BETWEEN '2025-03-13 00:00:00' AND '2025-03-18 07:59:59')
OR
(
a.actual_start_time IS NULL
AND a.type IN ('sms-outbound', 'sms-inbound')
AND a.created_at BETWEEN '2025-03-13 00:00:00' AND '2025-03-18 07:59:59'
)
)
AND (
a.is_private = 0
OR (
a.is_private = 1
AND u.uuid = uuid_to_bin('6f40e4b8-c340-4059-b4ac-1728e87ea99e')
)
)
AND (
# s.id = 15900
s.uuid = uuid_to_bin('04ca1c26-c666-4268-a129-419c0acffd73')
OR s.uuid IS NULL -- Include records without opportunity stage
)
ORDER BY a.actual_end_time DESC;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Lead Forensics%'; # 190, 162, 8474, [EMAIL]
SELECT * FROM users WHERE team_id = 190;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 190
and sa.provider = 'hubspot';
select * from role_user where user_id = 8474;
select * from crm_configurations where provider = 'bullhorn';
SELECT * FROM opportunities WHERE uuid_to_bin('94578249-65ec-4205-90f2-7d1a7d5ab64a') = uuid;
SELECT * FROM users WHERE uuid_to_bin('26dbadeb-926f-4150-b11b-771b9d4c2f9a') = uuid;
SELECT * FROM opportunities WHERE id = 4732493;
select * from activities where opportunity_id = 4732493;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE id = 443; # 358, 14315, [EMAIL]
SELECT * FROM opportunities WHERE team_id = 443;
SELECT a.id, a.type, a.user_id, a.status, a.deleted_at, u.name, u.email, u.team_id as activity_team_id, u.status, u.deleted_at, t.name, t.status, s.team_id as stage_team_id
FROM activities AS a
JOIN stages AS s ON a.stage_id = s.id
JOIN users AS u ON u.id = a.user_id
JOIN teams AS t ON t.id = s.team_id
WHERE u.team_id <> s.team_id and t.id > 135;
SELECT
crm_configuration_id,
crm_provider_id,
COUNT(*) as duplicate_count,
GROUP_CONCAT(id) as stage_ids,
GROUP_CONCAT(name) as stage_names
FROM stages
GROUP BY crm_configuration_id, crm_provider_id
HAVING COUNT(*) > 1
ORDER BY duplicate_count DESC;
select * from stages where id IN (14898,14907);
select * from business_processes;
SELECT *
FROM crm_configurations
WHERE team_id IN (
SELECT team_id
FROM crm_configurations
GROUP BY team_id
HAVING COUNT(*) > 1
)
ORDER BY team_id;
SELECT *
FROM teams
WHERE crm_id IN (
SELECT crm_id
FROM teams
GROUP BY crm_id
HAVING COUNT(*) > 1
)
ORDER BY crm_id;
# [PASSWORD_DOTS]
select * from crm_configurations where provider = 'integration-app';
SELECT * FROM teams WHERE id = 443; # Correre Naturale 358 14315 [EMAIL]
select * from activities where crm_configuration_id = 358 order by actual_end_time desc;
select id, uuid, actual_end_time, crm_provider_id, is_internal, playbook_category_id, type, user_id, lead_id, contact_id, account_id, opportunity_id, status, title from activities where crm_configuration_id = 358 order by actual_end_time desc;
select * from team_features where team_id = 358;
select * from activity_summary_logs;
select * from teams where id = 406;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Sportfive%'; # 267, 202, 14637, [EMAIL]
select * from activities where crm_configuration_id = 202 order by actual_end_time desc;
SELECT * FROM users where id = 14637;
SELECT * FROM teams where id = 267;
SELECT * FROM groups where id = 1118;
select g.name, a.title, uuid_from_bin(a.uuid), a.external_id, a.status, a.recording_state, a.recording_reason_code, a.scheduled_start_time, a.scheduled_end_time, a.actual_start_time, a.actual_end_time from activities a
inner join users u on u.id = a.user_id
inner join groups g on g.id = u.group_id
where a.crm_configuration_id = 202
and a.is_internal = 0
and (a.scheduled_start_time between '2025-03-19 00:00:00' and '2025-03-21 00:00:00')
and a.type = 'conference'
and a.status != 'completed'
and a.external_id is not null
order by a.scheduled_start_time desc;
SELECT * FROM activities
WHERE crm_configuration_id = 202
AND status IN ('completed', 'failed')
AND recording_state != 'stopped'
AND type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')
AND (is_private = 0 OR user_id = 14637)
AND (
(
actual_start_time BETWEEN '2025-03-12 12:00:00' AND '2025-03-24 11:59:59'
) OR (
actual_start_time IS NULL
AND type IN ('sms-outbound', 'sms-inbound')
AND created_at BETWEEN '2025-03-12 12:00:00' AND '2025-03-24 11:59:59'
)
)
AND NOT EXISTS (
SELECT 1
FROM tracks
WHERE
tracks.activity_id = activities.id
AND tracks.type IN ('audio', 'video')
)
ORDER BY actual_end_time DESC;
SELECT DISTINCT
a.*
FROM activities a
INNER JOIN tracks t ON a.id = t.activity_id
INNER JOIN users u ON a.user_id = u.id
INNER JOIN teams team ON u.team_id = team.id
WHERE
a.crm_configuration_id = 202
AND a.status IN ('completed', 'failed')
AND a.recording_state != 'stopped'
# and a.user_id = 14637
AND a.type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')
# AND t.type IN ('audio', 'video')
AND (
(a.actual_start_time BETWEEN '2025-03-12 12:00:00' AND '2025-03-24 11:59:59')
OR
(
a.actual_start_time IS NULL
AND a.type IN ('sms-outbound', 'sms-inbound')
AND a.created_at BETWEEN '2025-03-12 12:00:00' AND '2025-03-24 11:59:59'
)
)
AND (
a.is_private = 0
OR (
a.is_private = 1
AND a.user_id = 14637
)
)
ORDER BY a.actual_end_time DESC
;
SELECT DISTINCT a.*
FROM activities a
INNER JOIN users u ON a.user_id = u.id
INNER JOIN teams t ON u.team_id = t.id
# INNER JOIN tracks tr ON a.id = tr.activity_id
# INNER JOIN groups g ON u.group_id = g.id
WHERE 1=1
AND t.id = 267
# AND t.uuid = uuid_to_bin('aed4927b-f1ea-499e-94c3-83762fd233e8')
AND a.status IN ('completed', 'failed')
AND a.recording_state != 'stopped'
AND a.type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')
# AND tr.type NOT IN ('audio', 'video')
AND (
a.is_private = 0
OR a.user_id = 14637
)
AND (
(a.actual_start_time BETWEEN '2025-03-19 00:00:00' AND '2025-03-21 23:59:59')
OR (
a.actual_start_time IS NULL
AND a.type IN ('sms-outbound', 'sms-inbound')
AND a.created_at BETWEEN '2025-03-19 00:00:00' AND '2025-03-21 23:59:59'
)
)
# and NOT EXISTS (
# SELECT 1
# FROM tracks t
# WHERE t.activity_id = a.id
# AND t.type IN ('audio', 'video')
# )
ORDER BY a.actual_end_time DESC;
SELECT * FROM tracks WHERE activity_id = 26485995;
select a.is_private, a.title, uuid_from_bin(a.uuid), a.external_id, a.status, a.recording_state, a.recording_reason_code, a.scheduled_start_time, a.scheduled_end_time, a.actual_start_time, a.actual_end_time from activities a
inner join users u on u.id = a.user_id
where a.crm_configuration_id = 202
# and a.is_internal = 0
and (a.actual_start_time between '2025-03-19 00:00:00' and '2025-03-21 00:00:00')
and a.type IN ("softphone","softphone-inbound","conference","sms-inbound")
and a.status IN ('completed', 'failed')
# and a.external_id is not null
order by a.actual_end_time desc;
select * from activities a where a.crm_configuration_id = 202
and a.actual_start_time between '2025-03-20 00:00:00' and '2025-03-21 00:00:00'
# AND a.type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')
select g.name, a.title, uuid_from_bin(a.uuid), a.external_id, a.status, a.recording_state, a.recording_reason_code, a.scheduled_start_time, a.scheduled_end_time, a.actual_start_time, a.actual_end_time from activities a
inner join users u on u.id = a.user_id
inner join groups g on g.id = u.group_id
where a.crm_configuration_id = 202
and a.is_internal = 0
and (a.scheduled_start_time between '2025-03-19 00:00:00' and '2025-03-21 00:00:00')
and a.type = 'conference'
and a.status != 'completed'
and a.external_id is not null
order by a.scheduled_start_time desc;
SELECT * FROM teams WHERE name LIKE '%Tourlane%';
SELECT * FROM crm_fields WHERE crm_configuration_id = 209 and object_type = 'opportunity';
SELECT * FROM crm_field_data WHERE crm_field_id = 98809;
select * from users where status = 1 AND timezone = 'MDT';
select * from opportunities where id = 3769814;
select * from deal_risks where opportunity_id = 3769814;
select cp.* from crm_profiles cp
join users u on cp.user_id = u.id
join crm_configurations crm on cp.crm_configuration_id = crm.id
where crm.provider = 'hubspot' AND u.status = 1 AND log_notes != 'none';
select * from crm_fields where id = 154575;
select * from team_features where feature = 'SUPPORTS_SYNC_MISSING_CALL_DISPOSITIONS';
SELECT * FROM teams WHERE id = 176; # crm 148
select * from activities where crm_configuration_id = 148 and provider = 'hubspot' order by id desc;
select * from activity_providers where provider = 'amazon-connect';
select * from crm_fields cf
join crm_configurations crm on crm.id = cf.crm_configuration_id
where crm.provider = 'hubspot' and cf.object_type IN ('account', 'contact');
# [PASSWORD_DOTS]
SELECT * FROM users WHERE id IN (15415, 15418);
SELECT * FROM groups WHERE id IN (1805,1806);
SELECT * FROM playbooks WHERE id = 1860;
SELECT * FROM playbook_categories WHERE id = 38634;
SELECT * FROM crm_fields WHERE id = 189962;
SELECT * FROM teams WHERE name = 'Pulsar Group'; # 472, 380, 15138 [EMAIL]
SELECT * FROM crm_profiles WHERE user_id = 15415;
SELECT * FROM social_accounts WHERE sociable_id = 15415 and provider = 'salesforce';
select * from sidekick_settings where team_id = 472;
SELECT * FROM activities WHERE uuid_to_bin('452c58c7-b87c-4fdd-953e-d7af185e9588') = uuid; # 28617536, user: 15418
SELECT * FROM activities WHERE uuid_to_bin('399114ee-d3a8-458c-bff5-5f654658db0a') = uuid; # 28344407, user: 15415
SELECT * FROM activities WHERE uuid_to_bin('f0aa567f-0ab1-4bbb-96aa-37dcf184676b') = uuid; # 28580288, user: 15415
SELECT * FROM activities WHERE uuid_to_bin('50c086b1-2770-4bca-b5ae-6bac22ec426b') = uuid; # 28566069, user: 15415
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%TeamTailor%'; # 109, 218, 13969, [EMAIL]
select * from crm_configurations where id = 218;
SELECT * FROM activities WHERE uuid_to_bin('e39b5857-7fdb-4f5a-951a-8d3ca69bb1b0') = uuid; # 28338765
SELECT * FROM users WHERE id IN (13232, 13230);
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 109
and sa.provider = 'salesforce';
0057R00000EPL5HQAX Inez Ekblad
1091cb81-5ea1-4951-a0ed-f00b568f0140 Triman Kaur
SELECT * FROM crm_profiles WHERE user_id IN (13232, 13230);
############################################################################################
SELECT * FROM activities WHERE uuid_to_bin('675eeaeb-5681-42db-90bc-54c07a604408') = uuid; # 28655939 00UVg00000FLvnSMAT
SELECT * FROM crm_field_data WHERE activity_id = 28655939;
SELECT * FROM crm_fields WHERE id IN (94491,94493,94498);
SELECT * FROM users WHERE id = 13658;
SELECT * FROM teams WHERE id = 109;
SELECT * FROM crm_configurations WHERE id = 218;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 109
and sa.provider = 'salesforce';
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Strengthscope%'; # 481, 390, 15420, [EMAIL]
SELECT * FROM stages WHERE crm_configuration_id = 390;
select * from business_processes where team_id = 481 and crm_configuration_id = 390;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 481
and sa.provider = 'salesforce';
SELECT * FROM users WHERE id = 15780; # team 462
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 462
and sa.provider = 'hubspot';
select * from teams where id = 495;
SELECT * FROM users WHERE id = 15794;
select * from social_accounts where sociable_id = 15794;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Flight%'; # 427, 333, 13752
SELECT * FROM accounts WHERE team_id = 427 and crm_provider_id = '668731000183444517';
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Group GTI%'; # 495, 407, 15794
SELECT * FROM activities WHERE crm_configuration_id = 407
and status = 'completed' and type = 'conference'
order by id desc;
select ru.*, pr.*, p.* from users u join role_user ru on ru.user_id = u.id
join permission_role pr on pr.role_id = ru.role_id
join permissions p on p.id = pr.permission_id
where team_id = 495 and p.name IN ('dial');
select * from permission_role;
select * from activities where crm_configuration_id = 407 and status = 'completed' order by id desc;
SELECT * FROM activities WHERE id = 29512773;
SELECT * FROM activities WHERE id IN (29042721,28991325,29002874);
SELECT al.* from activity_summary_logs al join activities a on a.id = al.activity_id
where a.crm_configuration_id = 407
# and a.id IN (29042721,28991325,29002874);
SELECT * FROM users WHERE id = 15794;
SELECT * FROM users WHERE team_id = 495;
SELECT * FROM social_accounts WHERE sociable_id = 15794;
SELECT * FROM opportunities WHERE team_id = 495 and name like '%OC:%';
SELECT * FROM contacts WHERE team_id = 495;
SELECT * FROM leads WHERE team_id = 495;
SELECT * FROM accounts WHERE team_id = 495;
SELECT * FROM crm_profiles WHERE crm_configuration_id = 407;
SELECT * FROM crm_fields WHERE crm_configuration_id = 407;
SELECT * FROM crm_configurations WHERE id = 407;
SELECT * FROM opportunities WHERE team_id = 495 and close_date BETWEEN '2025-06-01' AND '2025-07-01'
and user_id IS NOT NULL and is_closed = 1 and is_won = 1;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Hamilton Court FX LLP%'; # 249, 187, 10103
SELECT * FROM activities WHERE uuid_to_bin('4659c2bb-9a49-484e-9327-a3d66f1e028c') = uuid; # 28951064
SELECT * FROM crm_fields WHERE crm_configuration_id = 187 and object_type IN ('tasks', 'event');
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Checkstep%'; # 325, 256, 11753
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 325
and sa.provider = 'hubspot';
SELECT * FROM activities WHERE uuid_to_bin('7be372e2-1916-4d79-a2f3-ca3db1346db3') = uuid; # 28611085
SELECT * FROM activities WHERE uuid_to_bin('980f0336-840b-4185-a5a9-30cf8b0749a8') = uuid; # 28719733
SELECT * FROM activity_summary_logs where activity_id = 28719733;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Learning%'; # 260, 356, 9444
SELECT * FROM activity_summary_logs where sent_at BETWEEN '2025-06-09 11:38:00' AND '2025-06-09 11:40:00';
SELECT * FROM leads WHERE crm_configuration_id = 356 and crm_provider_id = '230045001502770504'; # 823630
select * from activities where crm_configuration_id = 356 and lead_id = 841732;
SELECT * from activity_summary_logs al join activities a on a.id = al.activity_id
where a.crm_configuration_id = 356;
select * from activities where crm_configuration_id = 356
and actual_end_time between '2025-06-09 11:00:00' and '2025-06-09 12:00:00'
order by id desc;
select * from accounts where crm_configuration_id = 356 and crm_provider_id = '230045001514403366' order by id desc;
select * from leads where crm_configuration_id = 356 and crm_provider_id = '230045001514275654' order by id desc;
select * from contacts where crm_configuration_id = 356 and crm_provider_id = '230045001514403366' order by id desc;
select * from opportunities where crm_configuration_id = 356 and crm_provider_id = '230045001514403366' order by id desc;
select * from team_features where team_id = 260;
select * from features where id IN (1,2,4,6,18,19,20,9,10,3,23,24,25,26,27);
SELECT * FROM activities WHERE uuid_to_bin('7be372e2-1916-4d79-a2f3-ca3db1346db3') = uuid;
select * from crm_fields;
select * from crm_layout_entities;
SELECT * FROM teams WHERE name LIKE '%Optable%';
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Teamtailor%'; # 109, 218, 13969
SELECT * FROM crm_configurations WHERE id = 218;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 109
and sa.provider = 'salesforce';
SELECT * FROM activities WHERE uuid_to_bin('675eeaeb-5681-42db-90bc-54c07a604408') = uuid; # 28655939
SELECT * FROM crm_field_data WHERE activity_id = 28655939;
SELECT * FROM crm_fields WHERE id in (94491,94493,94498);
select * from teams where crm_id IS NULL;
SELECT * FROM activities WHERE uuid_to_bin('71aa8a0c-9652-4ff6-bee7-d98ae60abef6') = uuid;
# [PASSWORD_DOTS]
select * from team_domains where team_id = 399;
SELECT * FROM teams WHERE name LIKE '%Rydoo%'; # 399, 318, 13207
select * from calendar_events where id = 5163781;
SELECT * FROM activities WHERE uuid_to_bin('be2cbc52-7fda-46a0-9ae0-25d9553eafc0') = uuid; # 29443896
SELECT * FROM participants WHERE activity_id = 29443896;
select * from contacts where crm_configuration_id = 318 and email = '[EMAIL]';
select * from leads where crm_configuration_id = 318 and email = '[EMAIL]';
select * from activities where user_id = 14937 order by created_at ;
select * from users where id = 14937;
select * from contacts where crm_configuration_id = 318 and email LIKE '%@strawberry.se';
select * from opportunities where crm_configuration_id = 318 and crm_provider_id = '006Sf00000D1WOAIA3';
select * from activities a join participants p on a.id = p.activity_id
where crm_configuration_id = 318 and a.updated_at > '2025-06-23T08:18:43Z';
# [PASSWORD_DOTS]
SELECT * FROM opportunities WHERE team_id = 379 and crm_provider_id = '39334518886';
SELECT * FROM opportunities WHERE team_id = 379 order by id desc;
SELECT * FROM teams WHERE id = 379;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 379 and sociable_id = 13852
and sa.provider = 'hubspot';
SELECT * FROM crm_configurations WHERE id = 307;
SELECT * FROM crm_layouts WHERE crm_configuration_id = 307;
SELECT * FROM crm_layout_entities WHERE crm_layout_id = 1027;
SELECT * FROM crm_fields WHERE crm_configuration_id = 307
and id IN (144750,144855,145158,155227);
SELECT * FROM activities;
select * from activities
where created_at > '2025-07-01 00:00:00'
# and created_at < '2025-08-01 00:00:00'
and type not in ('email-outbound', 'email-inbound')
and account_id is null
and contact_id is null
and lead_id is null
and opportunity_id is not null
;
SELECT * FROM activities WHERE id IN (25344155, 25344296, 25501909, 28692187);
SELECT * FROM crm_configurations WHERE id in (335,301,200);
select * from crm_fields where crm_configuration_id = 230 and crm_provider_id = 'Age2__c';
SELECT * FROM teams WHERE name LIKE '%Resights%';
select * from crm_fields where crm_configuration_id = 1 and object_type = 'opportunity';
select * from crm_configurations where provider = 'bullhorn'; # 344
select * from teams where id IN (442);
select * from activities
where crm_configuration_id = 177
and provider = 'amazon-connect'
order by id desc;
# and source <> 'gong';
select * from activity_providers where provider = 'amazon-connect';
SELECT * FROM activities WHERE uuid_to_bin('cec1993b-a7e5-4164-b74d-d680ea51d2f2') = uuid;
select * from crm_configurations where store_transcript = 1;
SELECT * FROM teams WHERE id IN (80);
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Sedna%'; # 277, 213, 12594
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 277
and sa.provider = 'salesforce';
select * from activities where crm_configuration_id = 213 and account_id = 2511502;
select * from crm_configurations where id = 213;
SELECT * FROM activities WHERE uuid_to_bin('35aa790a-8569-4544-8268-66f9a4a26804') = uuid; # 33981604
SELECT * FROM participants WHERE activity_id = 33981604;
SELECT * FROM crm_fields WHERE crm_configuration_id = 337 and object_type = 'task';
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 431
and sa.provider = 'salesforce';
SELECT * FROM activities WHERE uuid_to_bin('b5476c7d-19a8-491b-869d-676ea1e857b6') = uuid; # 33997223
select * from activity_summary_logs where activity_id = 33997223;
select * from activity_notes where activity_id = 33997223;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Abode%';
select * from features;
select * from teams t
where t.status = 'active'
and id NOT IN (select team_id from team_features where feature_id = 9)
;
select * from playbook_layouts where playbook_id = 1725;
SELECT * FROM activities WHERE uuid_to_bin('65cc283c-4849-49e6-927f-4c281c8fea19') = uuid; # 34297473
select * from teams where id = 318;
select * from crm_configurations where team_id = 318;
select * from playbooks where team_id = 318;
SELECT * FROM crm_layouts where crm_configuration_id = 381;
SELECT * FROM crm_layout_entities WHERE crm_layout_id = 1259;
SELECT * FROM crm_fields WHERE id IN (192938,192936,192939);
SELECT * FROM crm_layout_entities WHERE crm_layout_id = 1266;
SELECT * FROM crm_fields WHERE id IN (192980,192991,192997,192998,193064,193067);
SELECT * FROM activities WHERE uuid_to_bin('a902289b-285c-48eb-9cc2-6ad6c5d938f5') = uuid; # 34297533
SELECT * FROM crm_layout_entities WHERE crm_layout_id = 927;
SELECT * FROM crm_fields WHERE id IN (131668,131669,131670,131671,131676,131797);
SELECT * FROM teams WHERE name LIKE '%Peripass%'; # 351, 281, 12124
select * from crm_layouts where crm_configuration_id = 281;
SELECT * FROM crm_layout_entities WHERE crm_layout_id = 927;
select * from crm_fields where crm_configuration_id = 281 and id in (131668,131669,131670,131671,131676,131797);
select * from opportunities where crm_configuration_id = 281;
SELECT * FROM activities WHERE id IN (34211315, 34130075);
SELECT * FROM crm_field_data WHERE object_id IN (34211315, 34130075);
select cf.crm_configuration_id, cle.crm_layout_id, cle.id, cf.id from crm_field_data cfd
join crm...
|
NULL
|
|
53489
|
NULL
|
0
|
2026-04-20T08:14:46.992528+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-20/1776 /Users/lukas/.screenpipe/data/data/2026-04-20/1776672886992_m1.jpg...
|
iTerm2
|
NULL
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
iTerm2ShellEditViewSessionScriptsProfilesWindowHel iTerm2ShellEditViewSessionScriptsProfilesWindowHelp‹$0APP (-zsh)APP (-zsh)DOCKERO ₴1worker-analytics:worker-analytics_00: startedworker-audio:worker-audio_00: startedworker-calendar:worker-calendar_00:startedworker-conferences:worker-conferences_00: startedworker-crm-sync:worker-crm-sync_00: startedworker-crm-update:worker-crm-update_00:startedworker-download:worker-download_00:startedworker-emails:worker-emails_00: startedworker-es-update:worker-es-update_00: startedworker-nudges:worker-nudges_00: startedDEV (docker)$82*3What's next:Try DockerDebug forseamless,persistentdebugging tools in any container or image → docker debug docker_lamp_1Learn moreat [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-18909-automated-reports-ask-jiminny) $ co mastererror: Your local changes to the following files would be overwritten by checkout:app/Listeners/AutomatedReports/UserPilot/TrackAutomatedReportGeneratedEvent.phptests/Unit/Listeners/AutomatedReports/UserPilot/TrackAutomatedReportGeneratedEventTest.phpPlease:commit your changes or stash them before you switch branches.Abortinglukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-18909-automated-reports-ask-jiminny) $ csfixdocker exec-it docker_lamp_1./vendor/bin/php-cs-fixer fix--config=.php-cs-fixer.dist.php -v --using-cache=no --diffPHP CS Fixer 3.87.1 Alexander by Fabien Potencier, Dariusz Ruminski and contributors.PHP runtime: 8.3.30Running analysis on 7 cores with 10 files per process.Parallel runner is an experimental feature and may be unstable, use it at your own risk. Feedback highly appreciated!Loadedconfig default from".php-cs-fixer.dist.php".5603/5603 [100%-zsh• *4100% C47 8 Mon 20 Apr 11:14:46T₴1|screenpipe"*5APPFixed 0 of 5603 files in 30.988 seconds, 60.00 MB memory usedWhat's next:Try Docker Debug for seamless, persistent debugging tools in any container or image docker debug docker_lamp_1Learn more at https://docs.docker.com/go/debug-cli/lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-18909-automated-reports-ask-jiminny) $I...
|
NULL
|
3230816081251501999
|
NULL
|
click
|
ocr
|
NULL
|
iTerm2ShellEditViewSessionScriptsProfilesWindowHel iTerm2ShellEditViewSessionScriptsProfilesWindowHelp‹$0APP (-zsh)APP (-zsh)DOCKERO ₴1worker-analytics:worker-analytics_00: startedworker-audio:worker-audio_00: startedworker-calendar:worker-calendar_00:startedworker-conferences:worker-conferences_00: startedworker-crm-sync:worker-crm-sync_00: startedworker-crm-update:worker-crm-update_00:startedworker-download:worker-download_00:startedworker-emails:worker-emails_00: startedworker-es-update:worker-es-update_00: startedworker-nudges:worker-nudges_00: startedDEV (docker)$82*3What's next:Try DockerDebug forseamless,persistentdebugging tools in any container or image → docker debug docker_lamp_1Learn moreat [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-18909-automated-reports-ask-jiminny) $ co mastererror: Your local changes to the following files would be overwritten by checkout:app/Listeners/AutomatedReports/UserPilot/TrackAutomatedReportGeneratedEvent.phptests/Unit/Listeners/AutomatedReports/UserPilot/TrackAutomatedReportGeneratedEventTest.phpPlease:commit your changes or stash them before you switch branches.Abortinglukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-18909-automated-reports-ask-jiminny) $ csfixdocker exec-it docker_lamp_1./vendor/bin/php-cs-fixer fix--config=.php-cs-fixer.dist.php -v --using-cache=no --diffPHP CS Fixer 3.87.1 Alexander by Fabien Potencier, Dariusz Ruminski and contributors.PHP runtime: 8.3.30Running analysis on 7 cores with 10 files per process.Parallel runner is an experimental feature and may be unstable, use it at your own risk. Feedback highly appreciated!Loadedconfig default from".php-cs-fixer.dist.php".5603/5603 [100%-zsh• *4100% C47 8 Mon 20 Apr 11:14:46T₴1|screenpipe"*5APPFixed 0 of 5603 files in 30.988 seconds, 60.00 MB memory usedWhat's next:Try Docker Debug for seamless, persistent debugging tools in any container or image docker debug docker_lamp_1Learn more at https://docs.docker.com/go/debug-cli/lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-18909-automated-reports-ask-jiminny) $I...
|
53487
|
|
53490
|
NULL
|
0
|
2026-04-20T08:14:46.992516+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-20/1776 /Users/lukas/.screenpipe/data/data/2026-04-20/1776672886992_m2.jpg...
|
iTerm2
|
NULL
|
True
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Claude FileEditVIewWindowHelpSecurity patch review Claude FileEditVIewWindowHelpSecurity patch review and testing guidance100% LMon 20 Apr 11:14:46User::tactory(()->create(L'email' =› 'playlist-policy-test-' • uniqid() • '@example.netThis is unrelated to the security PR — the duplicate email is a pre-existing test isolation issuethat nappened to surtace in this Cl run. It's a tlaky test; re-running el will lkely pass, but theunderlving issue should be fixed regardless. The security bump itself is fine.so if only this falled on production build it means the tests are passing? AM lcorrect. What else to check. The PR was by accident merged before reviewed.Trying to test it nowYes. vou're correct — if onlv this one test failed and it's the flaky duplicate email issue. thesecurity changes themselves are not causing test failures. The 10,733 other tests passed.What to check now that it's mergedSince it's already on production. focus on runtime verification rather than CT1. OAuth / Passport - the highest-risk change. Check that users can actually log in, tokensare being issued, and any token refresh flows work. Look at your auth logs for any 401spikes2. Check the deploy didn't break the autoloader — run composer dump-autoload if notdone automatically in vour deploy pipeline, and confirm no class resolution errors inLaravel logs3. Laravellogs - tail storage/logs/laravel.log for anything that surfaced after thedeploy. Errors from phpseclib or passport would show up here immediately if somethinghroke4. Key endpoints — since this is Jiminny, anything involving call recording, OAuthintegrations (HubSpot, Salesforce), and any SSH/SFTP paths if phoseclib is used directlv.5. composer.lock dift - double-check that onlv the expected 5 packages changed. If the botaccidentally pulled in an unintended transitive bump. it would show herehe cood news is allunve are vatch minor bumos wit no A? changes. so the bast radlus isvery low. The flaky test failing is almost certainly coincidental timing — Faker seed collision -not a regression rrom the securitv vackagesReplv.Cannot AkvlCiaude ic Aland can make mictakec Plence double-chock recnoncoc)...
|
NULL
|
-5242470730794369198
|
NULL
|
click
|
ocr
|
NULL
|
Claude FileEditVIewWindowHelpSecurity patch review Claude FileEditVIewWindowHelpSecurity patch review and testing guidance100% LMon 20 Apr 11:14:46User::tactory(()->create(L'email' =› 'playlist-policy-test-' • uniqid() • '@example.netThis is unrelated to the security PR — the duplicate email is a pre-existing test isolation issuethat nappened to surtace in this Cl run. It's a tlaky test; re-running el will lkely pass, but theunderlving issue should be fixed regardless. The security bump itself is fine.so if only this falled on production build it means the tests are passing? AM lcorrect. What else to check. The PR was by accident merged before reviewed.Trying to test it nowYes. vou're correct — if onlv this one test failed and it's the flaky duplicate email issue. thesecurity changes themselves are not causing test failures. The 10,733 other tests passed.What to check now that it's mergedSince it's already on production. focus on runtime verification rather than CT1. OAuth / Passport - the highest-risk change. Check that users can actually log in, tokensare being issued, and any token refresh flows work. Look at your auth logs for any 401spikes2. Check the deploy didn't break the autoloader — run composer dump-autoload if notdone automatically in vour deploy pipeline, and confirm no class resolution errors inLaravel logs3. Laravellogs - tail storage/logs/laravel.log for anything that surfaced after thedeploy. Errors from phpseclib or passport would show up here immediately if somethinghroke4. Key endpoints — since this is Jiminny, anything involving call recording, OAuthintegrations (HubSpot, Salesforce), and any SSH/SFTP paths if phoseclib is used directlv.5. composer.lock dift - double-check that onlv the expected 5 packages changed. If the botaccidentally pulled in an unintended transitive bump. it would show herehe cood news is allunve are vatch minor bumos wit no A? changes. so the bast radlus isvery low. The flaky test failing is almost certainly coincidental timing — Faker seed collision -not a regression rrom the securitv vackagesReplv.Cannot AkvlCiaude ic Aland can make mictakec Plence double-chock recnoncoc)...
|
53488
|
|
53631
|
NULL
|
0
|
2026-04-20T08:20:18.037470+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-20/1776 /Users/lukas/.screenpipe/data/data/2026-04-20/1776673218037_m1.jpg...
|
Firefox
|
Work — Mozilla Firefox
|
True
|
jiminny--stagingenv.sandbox.my.salesforce.com/_ui/ jiminny--stagingenv.sandbox.my.salesforce.com/_ui/identity/oauth/ui/AuthorizationPage...
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Platform Sprint 2 Q2 - Platform Team - Scrum Board Platform Sprint 2 Q2 - Platform Team - Scrum Board - Jira
JY-20553 | Improve crm-sync delays by yalokin-jiminny · Pull Request #11976 · jiminny/app
JY-20553 | Improve crm-sync delays by yalokin-jiminny · Pull Request #11976 · jiminny/app
[SRD-6793] Les Mills activity types not pulling in - Jira
[SRD-6793] Les Mills activity types not pulling in - Jira
JY-20698 handle failed field sync on playbook import activity types by LakyLak · Pull Request #11988 · jiminny/app
JY-20698 handle failed field sync on playbook import activity types by LakyLak · Pull Request #11988 · jiminny/app
JY-20692 change confirmation parameter by LakyLak · Pull Request #11986 · jiminny/app
JY-20692 change confirmation parameter by LakyLak · Pull Request #11986 · jiminny/app
[JY-20543] AJ Reports > Tracking - Jira
[JY-20543] AJ Reports > Tracking - Jira
[JY-18909] [Part2] Automated reports with Ask Jiminny - Jira
[JY-18909] [Part2] Automated reports with Ask Jiminny - Jira
Ask Jiminny Reports by nikolay-yankov · Pull Request #11894 · jiminny/app
Ask Jiminny Reports by nikolay-yankov · Pull Request #11894 · jiminny/app
New Tab
New Tab
Product Growth Platform | Userpilot
Product Growth Platform | Userpilot
Userpilot | Logged-activity
Userpilot | Logged-activity
fix(security): composer dependency updates – 2026-04-15 by github-actions[bot] · Pull Request #11970 · jiminny/app
fix(security): composer dependency updates – 2026-04-15 by github-actions[bot] · Pull Request #11970 · jiminny/app
Pipelines - jiminny/app
Pipelines - jiminny/app
Feed — jiminny — Sentry
Feed — jiminny — Sentry
fix(security): composer dependency updates – 2026-04-15 by github-actions[bot] · Pull Request #11970 · jiminny/app
fix(security): composer dependency updates – 2026-04-15 by github-actions[bot] · Pull Request #11970 · jiminny/app
jiminny--stagingenv.sandbox.my.salesforce.com/_ui/identity/oauth/ui/AuthorizationPage
jiminny--stagingenv.sandbox.my.salesforce.com/_ui/identity/oauth/ui/AuthorizationPage
Close tab
New Tab
Customize sidebar
Open Google Gemini (⌃X)
Tabs from other devices
Open history (⇧⌘H)
Open bookmarks (⌘B)...
|
[{"role":"AXRadioButton","text [{"role":"AXRadioButton","text":"Platform Sprint 2 Q2 - Platform Team - Scrum Board - Jira","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXRadioButton","text":"JY-20553 | Improve crm-sync delays by yalokin-jiminny · Pull Request #11976 · jiminny/app","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"JY-20553 | Improve crm-sync delays by yalokin-jiminny · Pull Request #11976 · jiminny/app","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"[SRD-6793] Les Mills activity types not pulling in - Jira","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"[SRD-6793] Les Mills activity types not pulling in - Jira","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"JY-20698 handle failed field sync on playbook import activity types by LakyLak · Pull Request #11988 · jiminny/app","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"JY-20698 handle failed field sync on playbook import activity types by LakyLak · Pull Request #11988 · jiminny/app","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"JY-20692 change confirmation parameter by LakyLak · Pull Request #11986 · jiminny/app","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"JY-20692 change confirmation parameter by LakyLak · Pull Request #11986 · jiminny/app","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"[JY-20543] AJ Reports > Tracking - Jira","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"[JY-20543] AJ Reports > Tracking - Jira","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"[JY-18909] [Part2] Automated reports with Ask Jiminny - Jira","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"[JY-18909] [Part2] Automated reports with Ask Jiminny - Jira","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Ask Jiminny Reports by nikolay-yankov · Pull Request #11894 · jiminny/app","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Ask Jiminny Reports by nikolay-yankov · Pull Request #11894 · jiminny/app","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"New Tab","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"New Tab","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Product Growth Platform | Userpilot","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Product Growth Platform | Userpilot","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Userpilot | Logged-activity","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Userpilot | Logged-activity","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"fix(security): composer dependency updates – 2026-04-15 by github-actions[bot] · Pull Request #11970 · jiminny/app","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"fix(security): composer dependency updates – 2026-04-15 by github-actions[bot] · Pull Request #11970 · jiminny/app","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Pipelines - jiminny/app","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Pipelines - jiminny/app","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Feed — jiminny — Sentry","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Feed — jiminny — Sentry","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"fix(security): composer dependency updates – 2026-04-15 by github-actions[bot] · Pull Request #11970 · jiminny/app","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"fix(security): composer dependency updates – 2026-04-15 by github-actions[bot] · Pull Request #11970 · jiminny/app","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"jiminny--stagingenv.sandbox.my.salesforce.com/_ui/identity/oauth/ui/AuthorizationPage","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true},{"role":"AXStaticText","text":"jiminny--stagingenv.sandbox.my.salesforce.com/_ui/identity/oauth/ui/AuthorizationPage","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Close tab","depth":5,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"New Tab","depth":4,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Customize sidebar","depth":6,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Open Google Gemini (⌃X)","depth":6,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Tabs from other devices","depth":6,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Open history (⇧⌘H)","depth":6,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Open bookmarks (⌘B)","depth":6,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false}]...
|
-7157492391877377763
|
6220988423754146727
|
click
|
accessibility
|
NULL
|
Platform Sprint 2 Q2 - Platform Team - Scrum Board Platform Sprint 2 Q2 - Platform Team - Scrum Board - Jira
JY-20553 | Improve crm-sync delays by yalokin-jiminny · Pull Request #11976 · jiminny/app
JY-20553 | Improve crm-sync delays by yalokin-jiminny · Pull Request #11976 · jiminny/app
[SRD-6793] Les Mills activity types not pulling in - Jira
[SRD-6793] Les Mills activity types not pulling in - Jira
JY-20698 handle failed field sync on playbook import activity types by LakyLak · Pull Request #11988 · jiminny/app
JY-20698 handle failed field sync on playbook import activity types by LakyLak · Pull Request #11988 · jiminny/app
JY-20692 change confirmation parameter by LakyLak · Pull Request #11986 · jiminny/app
JY-20692 change confirmation parameter by LakyLak · Pull Request #11986 · jiminny/app
[JY-20543] AJ Reports > Tracking - Jira
[JY-20543] AJ Reports > Tracking - Jira
[JY-18909] [Part2] Automated reports with Ask Jiminny - Jira
[JY-18909] [Part2] Automated reports with Ask Jiminny - Jira
Ask Jiminny Reports by nikolay-yankov · Pull Request #11894 · jiminny/app
Ask Jiminny Reports by nikolay-yankov · Pull Request #11894 · jiminny/app
New Tab
New Tab
Product Growth Platform | Userpilot
Product Growth Platform | Userpilot
Userpilot | Logged-activity
Userpilot | Logged-activity
fix(security): composer dependency updates – 2026-04-15 by github-actions[bot] · Pull Request #11970 · jiminny/app
fix(security): composer dependency updates – 2026-04-15 by github-actions[bot] · Pull Request #11970 · jiminny/app
Pipelines - jiminny/app
Pipelines - jiminny/app
Feed — jiminny — Sentry
Feed — jiminny — Sentry
fix(security): composer dependency updates – 2026-04-15 by github-actions[bot] · Pull Request #11970 · jiminny/app
fix(security): composer dependency updates – 2026-04-15 by github-actions[bot] · Pull Request #11970 · jiminny/app
jiminny--stagingenv.sandbox.my.salesforce.com/_ui/identity/oauth/ui/AuthorizationPage
jiminny--stagingenv.sandbox.my.salesforce.com/_ui/identity/oauth/ui/AuthorizationPage
Close tab
New Tab
Customize sidebar
Open Google Gemini (⌃X)
Tabs from other devices
Open history (⇧⌘H)
Open bookmarks (⌘B)...
|
53629
|
|
53632
|
NULL
|
0
|
2026-04-20T08:20:17.964784+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-20/1776 /Users/lukas/.screenpipe/data/data/2026-04-20/1776673217964_m2.jpg...
|
Firefox
|
Work — Mozilla Firefox
|
True
|
jiminny--stagingenv.sandbox.my.salesforce.com/_ui/ jiminny--stagingenv.sandbox.my.salesforce.com/_ui/identity/oauth/ui/AuthorizationPage...
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Platform Sprint 2 Q2 - Platform Team - Scrum Board Platform Sprint 2 Q2 - Platform Team - Scrum Board - Jira
JY-20553 | Improve crm-sync delays by yalokin-jiminny · Pull Request #11976 · jiminny/app
JY-20553 | Improve crm-sync delays by yalokin-jiminny · Pull Request #11976 · jiminny/app
[SRD-6793] Les Mills activity types not pulling in - Jira
[SRD-6793] Les Mills activity types not pulling in - Jira
JY-20698 handle failed field sync on playbook import activity types by LakyLak · Pull Request #11988 · jiminny/app
JY-20698 handle failed field sync on playbook import activity types by LakyLak · Pull Request #11988 · jiminny/app
JY-20692 change confirmation parameter by LakyLak · Pull Request #11986 · jiminny/app
JY-20692 change confirmation parameter by LakyLak · Pull Request #11986 · jiminny/app
[JY-20543] AJ Reports > Tracking - Jira
[JY-20543] AJ Reports > Tracking - Jira
[JY-18909] [Part2] Automated reports with Ask Jiminny - Jira
[JY-18909] [Part2] Automated reports with Ask Jiminny - Jira
Ask Jiminny Reports by nikolay-yankov · Pull Request #11894 · jiminny/app
Ask Jiminny Reports by nikolay-yankov · Pull Request #11894 · jiminny/app
New Tab
New Tab
Product Growth Platform | Userpilot
Product Growth Platform | Userpilot
Userpilot | Logged-activity
Userpilot | Logged-activity
fix(security): composer dependency updates – 2026-04-15 by github-actions[bot] · Pull Request #11970 · jiminny/app
fix(security): composer dependency updates – 2026-04-15 by github-actions[bot] · Pull Request #11970 · jiminny/app
Pipelines - jiminny/app
Pipelines - jiminny/app
Feed — jiminny — Sentry
Feed — jiminny — Sentry
fix(security): composer dependency updates – 2026-04-15 by github-actions[bot] · Pull Request #11970 · jiminny/app
fix(security): composer dependency updates – 2026-04-15 by github-actions[bot] · Pull Request #11970 · jiminny/app
jiminny--stagingenv.sandbox.my.salesforce.com/_ui/identity/oauth/ui/AuthorizationPage
jiminny--stagingenv.sandbox.my.salesforce.com/_ui/identity/oauth/ui/AuthorizationPage
Close tab
New Tab
Customize sidebar
Open Google Gemini (⌃X)
Tabs from other devices
Open history (⇧⌘H)
Open bookmarks (⌘B)...
|
[{"role":"AXRadioButton","text [{"role":"AXRadioButton","text":"Platform Sprint 2 Q2 - Platform Team - Scrum Board - Jira","depth":4,"bounds":{"left":0.0018284575,"top":0.0518755,"width":0.07596409,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXRadioButton","text":"JY-20553 | Improve crm-sync delays by yalokin-jiminny · Pull Request #11976 · jiminny/app","depth":4,"bounds":{"left":0.0,"top":0.09497207,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"JY-20553 | Improve crm-sync delays by yalokin-jiminny · Pull Request #11976 · jiminny/app","depth":5,"bounds":{"left":0.013297873,"top":0.10614525,"width":0.15774602,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"[SRD-6793] Les Mills activity types not pulling in - Jira","depth":4,"bounds":{"left":0.0,"top":0.12769353,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"[SRD-6793] Les Mills activity types not pulling in - Jira","depth":5,"bounds":{"left":0.013297873,"top":0.13886672,"width":0.09524601,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"JY-20698 handle failed field sync on playbook import activity types by LakyLak · Pull Request #11988 · jiminny/app","depth":4,"bounds":{"left":0.0,"top":0.16041501,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"JY-20698 handle failed field sync on playbook import activity types by LakyLak · Pull Request #11988 · jiminny/app","depth":5,"bounds":{"left":0.013297873,"top":0.17158818,"width":0.19963431,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"JY-20692 change confirmation parameter by LakyLak · Pull Request #11986 · jiminny/app","depth":4,"bounds":{"left":0.0,"top":0.19313647,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"JY-20692 change confirmation parameter by LakyLak · Pull Request #11986 · jiminny/app","depth":5,"bounds":{"left":0.013297873,"top":0.20430966,"width":0.15525267,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"[JY-20543] AJ Reports > Tracking - Jira","depth":4,"bounds":{"left":0.0,"top":0.22585794,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"[JY-20543] AJ Reports > Tracking - Jira","depth":5,"bounds":{"left":0.013297873,"top":0.23703113,"width":0.06981383,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"[JY-18909] [Part2] Automated reports with Ask Jiminny - Jira","depth":4,"bounds":{"left":0.0,"top":0.2585794,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"[JY-18909] [Part2] Automated reports with Ask Jiminny - Jira","depth":5,"bounds":{"left":0.013297873,"top":0.2697526,"width":0.10688165,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Ask Jiminny Reports by nikolay-yankov · Pull Request #11894 · jiminny/app","depth":4,"bounds":{"left":0.0,"top":0.29130086,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Ask Jiminny Reports by nikolay-yankov · Pull Request #11894 · jiminny/app","depth":5,"bounds":{"left":0.013297873,"top":0.30247405,"width":0.12915559,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"New Tab","depth":4,"bounds":{"left":0.0,"top":0.32402235,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"New Tab","depth":5,"bounds":{"left":0.013297873,"top":0.33519554,"width":0.014960106,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Product Growth Platform | Userpilot","depth":4,"bounds":{"left":0.0,"top":0.3567438,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Product Growth Platform | Userpilot","depth":5,"bounds":{"left":0.013297873,"top":0.367917,"width":0.06200133,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Userpilot | Logged-activity","depth":4,"bounds":{"left":0.0,"top":0.38946527,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Userpilot | Logged-activity","depth":5,"bounds":{"left":0.013297873,"top":0.40063846,"width":0.04637633,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"fix(security): composer dependency updates – 2026-04-15 by github-actions[bot] · Pull Request #11970 · jiminny/app","depth":4,"bounds":{"left":0.0,"top":0.42218676,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"fix(security): composer dependency updates – 2026-04-15 by github-actions[bot] · Pull Request #11970 · jiminny/app","depth":5,"bounds":{"left":0.013297873,"top":0.43335995,"width":0.2052859,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Pipelines - jiminny/app","depth":4,"bounds":{"left":0.0,"top":0.45490822,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Pipelines - jiminny/app","depth":5,"bounds":{"left":0.013297873,"top":0.4660814,"width":0.039228722,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Feed — jiminny — Sentry","depth":4,"bounds":{"left":0.0,"top":0.48762968,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Feed — jiminny — Sentry","depth":5,"bounds":{"left":0.013297873,"top":0.49880287,"width":0.042719416,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"fix(security): composer dependency updates – 2026-04-15 by github-actions[bot] · Pull Request #11970 · jiminny/app","depth":4,"bounds":{"left":0.0,"top":0.5203512,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"fix(security): composer dependency updates – 2026-04-15 by github-actions[bot] · Pull Request #11970 · jiminny/app","depth":5,"bounds":{"left":0.013297873,"top":0.53152436,"width":0.2052859,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"jiminny--stagingenv.sandbox.my.salesforce.com/_ui/identity/oauth/ui/AuthorizationPage","depth":4,"bounds":{"left":0.0,"top":0.55307263,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true},{"role":"AXStaticText","text":"jiminny--stagingenv.sandbox.my.salesforce.com/_ui/identity/oauth/ui/AuthorizationPage","depth":5,"bounds":{"left":0.013297873,"top":0.5642458,"width":0.15226063,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Close tab","depth":5,"bounds":{"left":0.06732048,"top":0.5602554,"width":0.007978723,"height":0.01915403},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"New Tab","depth":4,"bounds":{"left":0.0028257978,"top":0.58739024,"width":0.07413564,"height":0.025538707},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Customize sidebar","depth":6,"bounds":{"left":0.0028257978,"top":0.97007185,"width":0.010638298,"height":0.025538707},"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Open Google Gemini (⌃X)","depth":6,"bounds":{"left":0.013796543,"top":0.97007185,"width":0.010638298,"height":0.025538707},"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Tabs from other devices","depth":6,"bounds":{"left":0.024933511,"top":0.97007185,"width":0.010638298,"height":0.025538707},"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Open history (⇧⌘H)","depth":6,"bounds":{"left":0.036070477,"top":0.97007185,"width":0.010638298,"height":0.025538707},"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Open bookmarks (⌘B)","depth":6,"bounds":{"left":0.04720745,"top":0.97007185,"width":0.010638298,"height":0.025538707},"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false}]...
|
-7157492391877377763
|
6220988423754146727
|
click
|
accessibility
|
NULL
|
Platform Sprint 2 Q2 - Platform Team - Scrum Board Platform Sprint 2 Q2 - Platform Team - Scrum Board - Jira
JY-20553 | Improve crm-sync delays by yalokin-jiminny · Pull Request #11976 · jiminny/app
JY-20553 | Improve crm-sync delays by yalokin-jiminny · Pull Request #11976 · jiminny/app
[SRD-6793] Les Mills activity types not pulling in - Jira
[SRD-6793] Les Mills activity types not pulling in - Jira
JY-20698 handle failed field sync on playbook import activity types by LakyLak · Pull Request #11988 · jiminny/app
JY-20698 handle failed field sync on playbook import activity types by LakyLak · Pull Request #11988 · jiminny/app
JY-20692 change confirmation parameter by LakyLak · Pull Request #11986 · jiminny/app
JY-20692 change confirmation parameter by LakyLak · Pull Request #11986 · jiminny/app
[JY-20543] AJ Reports > Tracking - Jira
[JY-20543] AJ Reports > Tracking - Jira
[JY-18909] [Part2] Automated reports with Ask Jiminny - Jira
[JY-18909] [Part2] Automated reports with Ask Jiminny - Jira
Ask Jiminny Reports by nikolay-yankov · Pull Request #11894 · jiminny/app
Ask Jiminny Reports by nikolay-yankov · Pull Request #11894 · jiminny/app
New Tab
New Tab
Product Growth Platform | Userpilot
Product Growth Platform | Userpilot
Userpilot | Logged-activity
Userpilot | Logged-activity
fix(security): composer dependency updates – 2026-04-15 by github-actions[bot] · Pull Request #11970 · jiminny/app
fix(security): composer dependency updates – 2026-04-15 by github-actions[bot] · Pull Request #11970 · jiminny/app
Pipelines - jiminny/app
Pipelines - jiminny/app
Feed — jiminny — Sentry
Feed — jiminny — Sentry
fix(security): composer dependency updates – 2026-04-15 by github-actions[bot] · Pull Request #11970 · jiminny/app
fix(security): composer dependency updates – 2026-04-15 by github-actions[bot] · Pull Request #11970 · jiminny/app
jiminny--stagingenv.sandbox.my.salesforce.com/_ui/identity/oauth/ui/AuthorizationPage
jiminny--stagingenv.sandbox.my.salesforce.com/_ui/identity/oauth/ui/AuthorizationPage
Close tab
New Tab
Customize sidebar
Open Google Gemini (⌃X)
Tabs from other devices
Open history (⇧⌘H)
Open bookmarks (⌘B)...
|
NULL
|
|
53715
|
NULL
|
0
|
2026-04-20T08:25:32.456522+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-20/1776 /Users/lukas/.screenpipe/data/data/2026-04-20/1776673532456_m1.jpg...
|
iTerm2
|
DEV (docker)
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
iTerm2ShellEditViewSessionScriptsProfilesWindowHel iTerm2ShellEditViewSessionScriptsProfilesWindowHelp>0.DEV (docker)APP (-zsh)DOCKERS- 981devio/pipedrivejasonmccreary/laravel-test-assertionsjdavidbakr/cloudfront-proxieskalnoy/nestedsetlaravel/passportlaravel/slack-notification-channellaravel/tinkerlaravel/uilaravolt/avatarleague/statsdnesbot/carbonnunomaduro/collisionnunomaduro/termwindpropaganistas/laravel-phonesantigarcor/laratrustsentry/sentry-laravelshiftonelabs/laravel-sqs-fifo-queuespatie/laravel-fractalspatie/laravel-ignitionspatie/laravel-webhook-serverstaudenmeir/belongs-to-throughvinkla/hashidsDEV (docker)$82Generated optimized autoload files containing 95492 classesroot@docker_lamp_1:/home/jiminny# php artisan route:list |grep -E "oauthlpassport|token"GETIHEADapi/vl/call-token/{team}/#participant?}GETIHEADapi/v1/get-access-token/{provider?}GETIHEADapi/v1/integration-app-tokenPUTapi/v1/organizations/{team}/api-tokenPOSTapi/v1/single-claim-token/{provider?}GETIHEADexport/{token}GETIHEADexport/{token}/media/{track}.m3u8GETIHEADexport/{token}/playlist.m3u8GETIHEADoauth/authorizePOSToauth/authorizeDELETEoauth/authorizeGETIHEADoauth/deviceGETIHEADoauth/device/authorizePOSToauth/device/authorizeDELETEoauth/device/authorizePOSToauth/device/codePOSToauth/tokenPOSToauth/token/refreshGETIHEADtoken-loginroot@docker_lamp_1:/home/jiminny#*3-zsh• ₴4100% <47*Mon 20 Apr 11:25:32181screenpipe™• ₴5DONEDONEDONEDONEDONEDONEDONEDONEDONEDONEDONEDONEDONEDONEDONEDONEDONEDONEDONEDONEDONEDONEDEVAPI\ClientTokenController@generateTokenapi.get_access_token › Auth\SocialController@getAccessTokenTeamSetupController@integrationAppTokenAPI\[EMAIL]-claim-token ›Auth\SocialController@getSingleUseClaimexport › ExportController@viewExportControllerêmediaexport-playlist › [EMAIL] ›Laravel\Passport › [EMAIL] › Laravel\Passport › [EMAIL] › Laravel\Passport › [EMAIL] › Laravel\Passport › DeviceUserCodeControllerpassport.device.authorizations.authorize › Laravel\Passport › DeviceAuthorizationControllerpassport.device.authorizations.approve › Laravel\Passport › ApproveDeviceAuthorizationControllerpassport.device.authorizations.deny › Laravel\Passport › DenyDeviceAuthorizationControllerpassport.device.code › Laravel\Passport › DeviceCodeControllerpassport.token › Laravel\Passport › [EMAIL] › Laravel\Passport › [EMAIL] › Auth\SsoController@ssoTokenLogin...
|
NULL
|
-4613060810599680057
|
NULL
|
click
|
ocr
|
NULL
|
iTerm2ShellEditViewSessionScriptsProfilesWindowHel iTerm2ShellEditViewSessionScriptsProfilesWindowHelp>0.DEV (docker)APP (-zsh)DOCKERS- 981devio/pipedrivejasonmccreary/laravel-test-assertionsjdavidbakr/cloudfront-proxieskalnoy/nestedsetlaravel/passportlaravel/slack-notification-channellaravel/tinkerlaravel/uilaravolt/avatarleague/statsdnesbot/carbonnunomaduro/collisionnunomaduro/termwindpropaganistas/laravel-phonesantigarcor/laratrustsentry/sentry-laravelshiftonelabs/laravel-sqs-fifo-queuespatie/laravel-fractalspatie/laravel-ignitionspatie/laravel-webhook-serverstaudenmeir/belongs-to-throughvinkla/hashidsDEV (docker)$82Generated optimized autoload files containing 95492 classesroot@docker_lamp_1:/home/jiminny# php artisan route:list |grep -E "oauthlpassport|token"GETIHEADapi/vl/call-token/{team}/#participant?}GETIHEADapi/v1/get-access-token/{provider?}GETIHEADapi/v1/integration-app-tokenPUTapi/v1/organizations/{team}/api-tokenPOSTapi/v1/single-claim-token/{provider?}GETIHEADexport/{token}GETIHEADexport/{token}/media/{track}.m3u8GETIHEADexport/{token}/playlist.m3u8GETIHEADoauth/authorizePOSToauth/authorizeDELETEoauth/authorizeGETIHEADoauth/deviceGETIHEADoauth/device/authorizePOSToauth/device/authorizeDELETEoauth/device/authorizePOSToauth/device/codePOSToauth/tokenPOSToauth/token/refreshGETIHEADtoken-loginroot@docker_lamp_1:/home/jiminny#*3-zsh• ₴4100% <47*Mon 20 Apr 11:25:32181screenpipe™• ₴5DONEDONEDONEDONEDONEDONEDONEDONEDONEDONEDONEDONEDONEDONEDONEDONEDONEDONEDONEDONEDONEDONEDEVAPI\ClientTokenController@generateTokenapi.get_access_token › Auth\SocialController@getAccessTokenTeamSetupController@integrationAppTokenAPI\[EMAIL]-claim-token ›Auth\SocialController@getSingleUseClaimexport › ExportController@viewExportControllerêmediaexport-playlist › [EMAIL] ›Laravel\Passport › [EMAIL] › Laravel\Passport › [EMAIL] › Laravel\Passport › [EMAIL] › Laravel\Passport › DeviceUserCodeControllerpassport.device.authorizations.authorize › Laravel\Passport › DeviceAuthorizationControllerpassport.device.authorizations.approve › Laravel\Passport › ApproveDeviceAuthorizationControllerpassport.device.authorizations.deny › Laravel\Passport › DenyDeviceAuthorizationControllerpassport.device.code › Laravel\Passport › DeviceCodeControllerpassport.token › Laravel\Passport › [EMAIL] › Laravel\Passport › [EMAIL] › Auth\SsoController@ssoTokenLogin...
|
NULL
|
|
53716
|
NULL
|
0
|
2026-04-20T08:25:32.810203+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-20/1776 /Users/lukas/.screenpipe/data/data/2026-04-20/1776673532810_m2.jpg...
|
iTerm2
|
DEV (docker)
|
True
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
100% S2Mon ZU A0r 11-20.32•••Security patch review 100% S2Mon ZU A0r 11-20.32•••Security patch review and testing guidanceWHere could I see OAuth/Passport changes in laravel projectThe autoload looks clean — no errors, just pre-existing warnings (those ambiguousFlysystem/Microsoft Graph classes are old, not from this PR).Where to look for Passport/OAuth in the project:# Koutes registered bv rassportphp artisan route:list | grep -E "oauth|passport| token"Replv +cat config/auth.phpcat contigpassport.ono# guards, provlders# if it exists (not alwavs present)# Where Passport is bootedgrep -r "Passport::" app/ --include="*.php" -]# Custom middleware or token checksgrep -r "auth:api\/CheckClientCredentials\|HasApiTokens" app/--include="*.php" -1In the codebase, Passport changes in 13.6 → 13.7.x typically affect:• oken revocation nenavioui• Personal Accesstoken model 1 vou ve extendedir• Any custom AuthServiceProvider thatcalls Passport::routes OrPassport: :tokensExpireIn()Quickest runtime check — inside your Docker container:bashphp artisan passport:keys --force 2>&1php artisan route:list | grep oauth# confirms kevs are intacti# confirms routes are registeredReplv…CannotAkCiaudo ic Aland can mako mictakac Plesce double-chock recnoncod...
|
NULL
|
-929530047829741380
|
NULL
|
click
|
ocr
|
NULL
|
100% S2Mon ZU A0r 11-20.32•••Security patch review 100% S2Mon ZU A0r 11-20.32•••Security patch review and testing guidanceWHere could I see OAuth/Passport changes in laravel projectThe autoload looks clean — no errors, just pre-existing warnings (those ambiguousFlysystem/Microsoft Graph classes are old, not from this PR).Where to look for Passport/OAuth in the project:# Koutes registered bv rassportphp artisan route:list | grep -E "oauth|passport| token"Replv +cat config/auth.phpcat contigpassport.ono# guards, provlders# if it exists (not alwavs present)# Where Passport is bootedgrep -r "Passport::" app/ --include="*.php" -]# Custom middleware or token checksgrep -r "auth:api\/CheckClientCredentials\|HasApiTokens" app/--include="*.php" -1In the codebase, Passport changes in 13.6 → 13.7.x typically affect:• oken revocation nenavioui• Personal Accesstoken model 1 vou ve extendedir• Any custom AuthServiceProvider thatcalls Passport::routes OrPassport: :tokensExpireIn()Quickest runtime check — inside your Docker container:bashphp artisan passport:keys --force 2>&1php artisan route:list | grep oauth# confirms kevs are intacti# confirms routes are registeredReplv…CannotAkCiaudo ic Aland can mako mictakac Plesce double-chock recnoncod...
|
NULL
|
|
53843
|
NULL
|
0
|
2026-04-20T08:30:36.039376+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-20/1776 /Users/lukas/.screenpipe/data/data/2026-04-20/1776673836039_m2.jpg...
|
iTerm2
|
NULL
|
True
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
VIewWinaowrTavsco.sProject© Opportunity.php© Parti VIewWinaowrTavsco.sProject© Opportunity.php© Participant.php© Partner.php© Permission.phpC Phonenumber.ongc) Playoacklneme.ono© Playbook.phpC) Playbookcategorv.php© Playlist.phpC) RateLimit.php© Region.phpC) Role.php© RoleChangeEvent.php(c) Sconegrouo,ono© Session.php(C) SlackBot.oho(C) SocialAccount.oho(C) Stade oho© Task.phpC Team.php© TeamAiContext.php© TeamDomain.php© TeamFeature.php© TeamSettings.php© TextRelay.php© Track.php© TranscriptionModel.php© TranscriptionModelLocale.php© TranscriptionProvider.phpc User.php© UserSettings.php© Vocabulary.phpc) VocabularyPronunciation.php© VoiceAccess.php(c)VolceconsentPrefix.onoNotitications• → Observers> O Policiesv Providers@ ActivitvServiceProvider.ohn@ AniServiceProvider.nhn@ AnnServiceProvider.nhnC) AuthServiceProvider.nhn@ RroadcastServiceProvider.ohn© CalendarServiceProvider.php© CreateParticipantsServiceProvide(C) CrmServiceProvider.nhn© EncryptionServiceProvider.php(c CvontCorvicoDrovidor nhnl© HubspotJournalServiceProvider.p© HubspotWebhookServiceProvideA limC) AooServiceProvider.ongC) AutomatedReport.phonamespace Jiminny Models;Liminnu Models VIsenamethod stringl] getRoles() laratrust's annotation* @property int $id* @property mixed Suuidx oohopent scring snamex olooent surind semalt* doroperty string null ssecondary emaz* doroperty string null spassword•doroperty string null sonoto pachGoropertu bool Suses two factor auth•doropertu strinolnuur sauthu 10Gpropertu strinalnulz scountru code• doropertu int nulz Sregion 1di• doropertu strinalnulz ssecondaru phone• Aoropertu strinalnull Scaller id* Goronentu int nuu sion titie 1di• Aoronentu strinalnull Stwo facton reset code• Goronertu int Steam id• Gorobertu intlnull Sarounidi* Goronertu strinalnull Stimezone* Oproperty string $language* Annonentu ctrinalnull Cconfononco numhen* @property stringlnull $conference_pin* @property string|null $conference_slug* Apropenty string Sconference join preference* Annonentu bool Sconfonenco ¿oin nomindon* doropertu scring sconterence recoraannounce* Apropentu int $conference record preference* doroperty int sconference banawidch* opropertu int sconference start weocam100% LzMOn 2U A0r 11:30.30Security patch review and testing guidanceservice.pnpkouteservicerrovider.ongC) FieldRepository.ongC) Reportcontroller.pnp© Partner.php© User.php X©syncuserrllotcompanyListener.gA67 X1 X7outright wrong! Also, we don't support using the $team argument.This is a real problem. Your custom trait is missing methods that OAuthenticatable nowrequires as part of the intertace contract. Both User and Partner implementOAuthenticatable but your trait doesn t ruinl itrully.What's missing trom your Jiminny Traits \HasApiTokens vs what the intertace requires:MethodIntertace requiresYour traitoauthAppsMorphManymissingtokens()HasManvmissinetokencant.olboolmissingcreateTokenoPorconalAccoccTokonPocultmissin?currentAccessTokeno?ScopeAuthorizablemissingwithAccecsTokenO?ScopeAuthorizableA wrong - TransientToken (non-nuladle)nuladle)getProviderNamestringmissingIhe immediate risk is withAccessToken() — rassport internals call this and now pass ?ScopeAuthorizable, but vour signature only accepts a non-nullable TransientToken. Thiswill throw a fatal type error at runtime whenever rassport tries to set or clear the access token.Why it hasn't blown up yet — PHP resolves trait method precedence at class definition time.ana Laravel Passport Hasapilokens isaso use advnemoces Matheuau. so rassoor'sown trait methods may be filling the gaps. Check which trait wins:grep -n "use HasApiTokens" app/Models/User.php app/Models/Partner.php app/Traits/HasAp# Does User use Jiminny's or Passport's?grep -rn "HasApiTokens" app/Models/User.phpIf User only use s Jiminny\Traits\HasApiTc J :,then oauthApps() , tokens() ,createToken.getProviderName.tokenCant.and currentAccessToken areallReplv…Sonnet 4.6 v...
|
NULL
|
4501999376720512670
|
NULL
|
click
|
ocr
|
NULL
|
VIewWinaowrTavsco.sProject© Opportunity.php© Parti VIewWinaowrTavsco.sProject© Opportunity.php© Participant.php© Partner.php© Permission.phpC Phonenumber.ongc) Playoacklneme.ono© Playbook.phpC) Playbookcategorv.php© Playlist.phpC) RateLimit.php© Region.phpC) Role.php© RoleChangeEvent.php(c) Sconegrouo,ono© Session.php(C) SlackBot.oho(C) SocialAccount.oho(C) Stade oho© Task.phpC Team.php© TeamAiContext.php© TeamDomain.php© TeamFeature.php© TeamSettings.php© TextRelay.php© Track.php© TranscriptionModel.php© TranscriptionModelLocale.php© TranscriptionProvider.phpc User.php© UserSettings.php© Vocabulary.phpc) VocabularyPronunciation.php© VoiceAccess.php(c)VolceconsentPrefix.onoNotitications• → Observers> O Policiesv Providers@ ActivitvServiceProvider.ohn@ AniServiceProvider.nhn@ AnnServiceProvider.nhnC) AuthServiceProvider.nhn@ RroadcastServiceProvider.ohn© CalendarServiceProvider.php© CreateParticipantsServiceProvide(C) CrmServiceProvider.nhn© EncryptionServiceProvider.php(c CvontCorvicoDrovidor nhnl© HubspotJournalServiceProvider.p© HubspotWebhookServiceProvideA limC) AooServiceProvider.ongC) AutomatedReport.phonamespace Jiminny Models;Liminnu Models VIsenamethod stringl] getRoles() laratrust's annotation* @property int $id* @property mixed Suuidx oohopent scring snamex olooent surind semalt* doroperty string null ssecondary emaz* doroperty string null spassword•doroperty string null sonoto pachGoropertu bool Suses two factor auth•doropertu strinolnuur sauthu 10Gpropertu strinalnulz scountru code• doropertu int nulz Sregion 1di• doropertu strinalnulz ssecondaru phone• Aoropertu strinalnull Scaller id* Goronentu int nuu sion titie 1di• Aoronentu strinalnull Stwo facton reset code• Goronertu int Steam id• Gorobertu intlnull Sarounidi* Goronertu strinalnull Stimezone* Oproperty string $language* Annonentu ctrinalnull Cconfononco numhen* @property stringlnull $conference_pin* @property string|null $conference_slug* Apropenty string Sconference join preference* Annonentu bool Sconfonenco ¿oin nomindon* doropertu scring sconterence recoraannounce* Apropentu int $conference record preference* doroperty int sconference banawidch* opropertu int sconference start weocam100% LzMOn 2U A0r 11:30.30Security patch review and testing guidanceservice.pnpkouteservicerrovider.ongC) FieldRepository.ongC) Reportcontroller.pnp© Partner.php© User.php X©syncuserrllotcompanyListener.gA67 X1 X7outright wrong! Also, we don't support using the $team argument.This is a real problem. Your custom trait is missing methods that OAuthenticatable nowrequires as part of the intertace contract. Both User and Partner implementOAuthenticatable but your trait doesn t ruinl itrully.What's missing trom your Jiminny Traits \HasApiTokens vs what the intertace requires:MethodIntertace requiresYour traitoauthAppsMorphManymissingtokens()HasManvmissinetokencant.olboolmissingcreateTokenoPorconalAccoccTokonPocultmissin?currentAccessTokeno?ScopeAuthorizablemissingwithAccecsTokenO?ScopeAuthorizableA wrong - TransientToken (non-nuladle)nuladle)getProviderNamestringmissingIhe immediate risk is withAccessToken() — rassport internals call this and now pass ?ScopeAuthorizable, but vour signature only accepts a non-nullable TransientToken. Thiswill throw a fatal type error at runtime whenever rassport tries to set or clear the access token.Why it hasn't blown up yet — PHP resolves trait method precedence at class definition time.ana Laravel Passport Hasapilokens isaso use advnemoces Matheuau. so rassoor'sown trait methods may be filling the gaps. Check which trait wins:grep -n "use HasApiTokens" app/Models/User.php app/Models/Partner.php app/Traits/HasAp# Does User use Jiminny's or Passport's?grep -rn "HasApiTokens" app/Models/User.phpIf User only use s Jiminny\Traits\HasApiTc J :,then oauthApps() , tokens() ,createToken.getProviderName.tokenCant.and currentAccessToken areallReplv…Sonnet 4.6 v...
|
NULL
|
|
53845
|
NULL
|
0
|
2026-04-20T08:30:40.306467+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-20/1776 /Users/lukas/.screenpipe/data/data/2026-04-20/1776673840306_m1.jpg...
|
iTerm2
|
DEV (docker)
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
root@docker_lamp_1:/home/jiminny# diff \
vendor/ root@docker_lamp_1:/home/jiminny# diff \
vendor/laravel/passport/src/HasApiTokens.php \
app/Traits/HasApiTokens.php
3c3
< namespace Laravel\Passport;
---
> namespace Jiminny\Traits;
5,9c5
< use Illuminate\Database\Eloquent\Builder;
< use Illuminate\Database\Eloquent\Relations\HasMany;
< use Illuminate\Database\Eloquent\Relations\MorphMany;
< use Laravel\Passport\Contracts\ScopeAuthorizable;
< use LogicException;
---
> use Laravel\Passport\TransientToken;
11,13d6
< /**
< * @phpstan-require-implements \Laravel\Passport\Contracts\OAuthenticatable
< */
18,44d10
< */
< protected ?ScopeAuthorizable $accessToken = null;
<
< /**
< * Get all of the user's registered OAuth clients.
< *
< * @deprecated Use oauthApps()
< *
< * @return \Illuminate\Database\Eloquent\Relations\HasMany<\Laravel\Passport\Client, $this>
< */
< public function clients(): HasMany
< {
< return $this->hasMany(Passport::clientModel(), 'user_id');
< }
<
< /**
< * Get all of the user's registered OAuth applications.
< *
< * @return \Illuminate\Database\Eloquent\Relations\MorphMany<\Laravel\Passport\Client, $this>
< */
< public function oauthApps(): MorphMany
< {
< return $this->morphMany(Passport::clientModel(), 'owner');
< }
<
< /**
< * Get all of the access tokens for the user.
46c12
< * @return \Illuminate\Database\Eloquent\Relations\HasMany<\Laravel\Passport\Token, $this>
---
> * @var Laravel\Passport\TransientToken
48,62c14
< public function tokens(): HasMany
< {
< return $this->hasMany(Passport::tokenModel(), 'user_id', $this->getAuthIdentifierName())
< ->where(function (Builder $query): void {
< $query->whereHas('client', function (Builder $query): void {
< $query->where(function (Builder $query): void {
< $provider = $this->getProviderName();
<
< $query->when($provider === config('auth.guards.api.provider'), function (Builder $query): void {
< $query->orWhereNull('provider');
< })->orWhere('provider', $provider);
< });
< });
< });
< }
---
> protected $accessToken;
65c17
< * Get the access token currently associated with the user.
---
> * Get the current access token being used by the user.
67,75c19
< public function token(): ?ScopeAuthorizable
< {
< return $this->currentAccessToken();
< }
<
< /**
< * Get the access token currently associated with the user.
< */
< public function currentAccessToken(): ?ScopeAuthorizable
---
> public function token(): ?TransientToken
85,123c29
< return $this->accessToken && $this->accessToken->can($scope);
< }
<
< /**
< * Determine if the current API token is missing a given scope.
< */
< public function tokenCant(string $scope): bool
< {
< return ! $this->tokenCan($scope);
< }
<
< /**
< * Create a new personal access token for the user.
< *
< * @param string[] $scopes
< */
< public function createToken(string $name, array $scopes = []): PersonalAccessTokenResult
< {
< return app(PersonalAccessTokenFactory::class)->make(
< $this->getAuthIdentifier(), $name, $scopes, $this->getProviderName()
< );
< }
<
< /**
< * Get the user provider name.
< *
< * @throws \LogicException
< */
< public function getProviderName(): string
< {
< $providers = collect(config('auth.guards'))->where('driver', 'passport')->pluck('provider')->all();
<
< foreach (config('auth.providers') as $provider => $config) {
< if (in_array($provider, $providers) && $config['driver'] === 'eloquent' && is_a($this, $config['model'])) {
< return $provider;
< }
< }
<
< throw new LogicException('Unable to determine authentication provider for this model from configuration.');
---
> return $this->accessToken ? $this->accessToken->can($scope) : false;
129c35
< public function withAccessToken(?ScopeAuthorizable $accessToken): static
---
> public function withAccessToken(TransientToken $accessToken): static
root@docker_lamp_1:/home/jiminny# cat vendor/laravel/passport/src/Contracts/OAuthenticatable.php
<?php
namespace Laravel\Passport\Contracts;
use Illuminate\Contracts\Auth\Authenticatable;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Database\Eloquent\Relations\MorphMany;
use Laravel\Passport\PersonalAccessTokenResult;
interface OAuthenticatable extends Authenticatable
{
/**
* Get all the user's registered OAuth applications.
*
* @return \Illuminate\Database\Eloquent\Relations\MorphMany<\Laravel\Passport\Client, \Illuminate\Foundation\Auth\User>
*/
public function oauthApps(): MorphMany;
/**
* Get all the access tokens for the user.
*
* @return \Illuminate\Database\Eloquent\Relations\HasMany<\Laravel\Passport\Token, \Illuminate\Foundation\Auth\User>
*/
public function tokens(): HasMany;
/**
* Determine if the current API token has a given scope.
*/
public function tokenCan(string $scope): bool;
/**
* Determine if the current API token is missing a given scope.
*/
public function tokenCant(string $scope): bool;
/**
* Create a new personal access token for the user.
*
* @param string[] $scopes
*/
public function createToken(string $name, array $scopes = []): PersonalAccessTokenResult;
/**
* Get the access token currently associated with the user.
*/
public function currentAccessToken(): ?ScopeAuthorizable;
/**
* Set the current access token for the user.
*/
public function withAccessToken(?ScopeAuthorizable $accessToken): static;
/**
* Get the user provider name.
*/
public function getProviderName(): string;
}
root@docker_lamp_1:/home/jiminny# grep -n "use HasApiTokens" app/Models/User.php app/Models/Partner.php app/Traits/HasApiTokens.php
app/Models/User.php:243: use HasApiTokens;
app/Models/Partner.php:78: use HasApiTokens;
root@docker_lamp_1:/home/jiminny#
DOCKER
Close Tab
DEV (docker)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
screenpipe"
Close Tab
⌥⌘1
DEV (docker)...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":"root@docker_lamp_1:/home/jiminny# diff \\\n vendor/laravel/passport/src/HasApiTokens.php \\\n app/Traits/HasApiTokens.php\n3c3\n< namespace Laravel\\Passport;\n---\n> namespace Jiminny\\Traits;\n5,9c5\n< use Illuminate\\Database\\Eloquent\\Builder;\n< use Illuminate\\Database\\Eloquent\\Relations\\HasMany;\n< use Illuminate\\Database\\Eloquent\\Relations\\MorphMany;\n< use Laravel\\Passport\\Contracts\\ScopeAuthorizable;\n< use LogicException;\n---\n> use Laravel\\Passport\\TransientToken;\n11,13d6\n< /**\n< * @phpstan-require-implements \\Laravel\\Passport\\Contracts\\OAuthenticatable\n< */\n18,44d10\n< */\n< protected ?ScopeAuthorizable $accessToken = null;\n< \n< /**\n< * Get all of the user's registered OAuth clients.\n< *\n< * @deprecated Use oauthApps()\n< *\n< * @return \\Illuminate\\Database\\Eloquent\\Relations\\HasMany<\\Laravel\\Passport\\Client, $this>\n< */\n< public function clients(): HasMany\n< {\n< return $this->hasMany(Passport::clientModel(), 'user_id');\n< }\n< \n< /**\n< * Get all of the user's registered OAuth applications.\n< *\n< * @return \\Illuminate\\Database\\Eloquent\\Relations\\MorphMany<\\Laravel\\Passport\\Client, $this>\n< */\n< public function oauthApps(): MorphMany\n< {\n< return $this->morphMany(Passport::clientModel(), 'owner');\n< }\n< \n< /**\n< * Get all of the access tokens for the user.\n46c12\n< * @return \\Illuminate\\Database\\Eloquent\\Relations\\HasMany<\\Laravel\\Passport\\Token, $this>\n---\n> * @var Laravel\\Passport\\TransientToken\n48,62c14\n< public function tokens(): HasMany\n< {\n< return $this->hasMany(Passport::tokenModel(), 'user_id', $this->getAuthIdentifierName())\n< ->where(function (Builder $query): void {\n< $query->whereHas('client', function (Builder $query): void {\n< $query->where(function (Builder $query): void {\n< $provider = $this->getProviderName();\n< \n< $query->when($provider === config('auth.guards.api.provider'), function (Builder $query): void {\n< $query->orWhereNull('provider');\n< })->orWhere('provider', $provider);\n< });\n< });\n< });\n< }\n---\n> protected $accessToken;\n65c17\n< * Get the access token currently associated with the user.\n---\n> * Get the current access token being used by the user.\n67,75c19\n< public function token(): ?ScopeAuthorizable\n< {\n< return $this->currentAccessToken();\n< }\n< \n< /**\n< * Get the access token currently associated with the user.\n< */\n< public function currentAccessToken(): ?ScopeAuthorizable\n---\n> public function token(): ?TransientToken\n85,123c29\n< return $this->accessToken && $this->accessToken->can($scope);\n< }\n< \n< /**\n< * Determine if the current API token is missing a given scope.\n< */\n< public function tokenCant(string $scope): bool\n< {\n< return ! $this->tokenCan($scope);\n< }\n< \n< /**\n< * Create a new personal access token for the user.\n< *\n< * @param string[] $scopes\n< */\n< public function createToken(string $name, array $scopes = []): PersonalAccessTokenResult\n< {\n< return app(PersonalAccessTokenFactory::class)->make(\n< $this->getAuthIdentifier(), $name, $scopes, $this->getProviderName()\n< );\n< }\n< \n< /**\n< * Get the user provider name.\n< *\n< * @throws \\LogicException\n< */\n< public function getProviderName(): string\n< {\n< $providers = collect(config('auth.guards'))->where('driver', 'passport')->pluck('provider')->all();\n< \n< foreach (config('auth.providers') as $provider => $config) {\n< if (in_array($provider, $providers) && $config['driver'] === 'eloquent' && is_a($this, $config['model'])) {\n< return $provider;\n< }\n< }\n< \n< throw new LogicException('Unable to determine authentication provider for this model from configuration.');\n---\n> return $this->accessToken ? $this->accessToken->can($scope) : false;\n129c35\n< public function withAccessToken(?ScopeAuthorizable $accessToken): static\n---\n> public function withAccessToken(TransientToken $accessToken): static\nroot@docker_lamp_1:/home/jiminny# cat vendor/laravel/passport/src/Contracts/OAuthenticatable.php\n<?php\n\nnamespace Laravel\\Passport\\Contracts;\n\nuse Illuminate\\Contracts\\Auth\\Authenticatable;\nuse Illuminate\\Database\\Eloquent\\Relations\\HasMany;\nuse Illuminate\\Database\\Eloquent\\Relations\\MorphMany;\nuse Laravel\\Passport\\PersonalAccessTokenResult;\n\ninterface OAuthenticatable extends Authenticatable\n{\n /**\n * Get all the user's registered OAuth applications.\n *\n * @return \\Illuminate\\Database\\Eloquent\\Relations\\MorphMany<\\Laravel\\Passport\\Client, \\Illuminate\\Foundation\\Auth\\User>\n */\n public function oauthApps(): MorphMany;\n\n /**\n * Get all the access tokens for the user.\n *\n * @return \\Illuminate\\Database\\Eloquent\\Relations\\HasMany<\\Laravel\\Passport\\Token, \\Illuminate\\Foundation\\Auth\\User>\n */\n public function tokens(): HasMany;\n\n /**\n * Determine if the current API token has a given scope.\n */\n public function tokenCan(string $scope): bool;\n\n /**\n * Determine if the current API token is missing a given scope.\n */\n public function tokenCant(string $scope): bool;\n\n /**\n * Create a new personal access token for the user.\n *\n * @param string[] $scopes\n */\n public function createToken(string $name, array $scopes = []): PersonalAccessTokenResult;\n\n /**\n * Get the access token currently associated with the user.\n */\n public function currentAccessToken(): ?ScopeAuthorizable;\n\n /**\n * Set the current access token for the user.\n */\n public function withAccessToken(?ScopeAuthorizable $accessToken): static;\n\n /**\n * Get the user provider name.\n */\n public function getProviderName(): string;\n}\nroot@docker_lamp_1:/home/jiminny# grep -n \"use HasApiTokens\" app/Models/User.php app/Models/Partner.php app/Traits/HasApiTokens.php\napp/Models/User.php:243: use HasApiTokens;\napp/Models/Partner.php:78: use HasApiTokens;\nroot@docker_lamp_1:/home/jiminny#","depth":4,"value":"root@docker_lamp_1:/home/jiminny# diff \\\n vendor/laravel/passport/src/HasApiTokens.php \\\n app/Traits/HasApiTokens.php\n3c3\n< namespace Laravel\\Passport;\n---\n> namespace Jiminny\\Traits;\n5,9c5\n< use Illuminate\\Database\\Eloquent\\Builder;\n< use Illuminate\\Database\\Eloquent\\Relations\\HasMany;\n< use Illuminate\\Database\\Eloquent\\Relations\\MorphMany;\n< use Laravel\\Passport\\Contracts\\ScopeAuthorizable;\n< use LogicException;\n---\n> use Laravel\\Passport\\TransientToken;\n11,13d6\n< /**\n< * @phpstan-require-implements \\Laravel\\Passport\\Contracts\\OAuthenticatable\n< */\n18,44d10\n< */\n< protected ?ScopeAuthorizable $accessToken = null;\n< \n< /**\n< * Get all of the user's registered OAuth clients.\n< *\n< * @deprecated Use oauthApps()\n< *\n< * @return \\Illuminate\\Database\\Eloquent\\Relations\\HasMany<\\Laravel\\Passport\\Client, $this>\n< */\n< public function clients(): HasMany\n< {\n< return $this->hasMany(Passport::clientModel(), 'user_id');\n< }\n< \n< /**\n< * Get all of the user's registered OAuth applications.\n< *\n< * @return \\Illuminate\\Database\\Eloquent\\Relations\\MorphMany<\\Laravel\\Passport\\Client, $this>\n< */\n< public function oauthApps(): MorphMany\n< {\n< return $this->morphMany(Passport::clientModel(), 'owner');\n< }\n< \n< /**\n< * Get all of the access tokens for the user.\n46c12\n< * @return \\Illuminate\\Database\\Eloquent\\Relations\\HasMany<\\Laravel\\Passport\\Token, $this>\n---\n> * @var Laravel\\Passport\\TransientToken\n48,62c14\n< public function tokens(): HasMany\n< {\n< return $this->hasMany(Passport::tokenModel(), 'user_id', $this->getAuthIdentifierName())\n< ->where(function (Builder $query): void {\n< $query->whereHas('client', function (Builder $query): void {\n< $query->where(function (Builder $query): void {\n< $provider = $this->getProviderName();\n< \n< $query->when($provider === config('auth.guards.api.provider'), function (Builder $query): void {\n< $query->orWhereNull('provider');\n< })->orWhere('provider', $provider);\n< });\n< });\n< });\n< }\n---\n> protected $accessToken;\n65c17\n< * Get the access token currently associated with the user.\n---\n> * Get the current access token being used by the user.\n67,75c19\n< public function token(): ?ScopeAuthorizable\n< {\n< return $this->currentAccessToken();\n< }\n< \n< /**\n< * Get the access token currently associated with the user.\n< */\n< public function currentAccessToken(): ?ScopeAuthorizable\n---\n> public function token(): ?TransientToken\n85,123c29\n< return $this->accessToken && $this->accessToken->can($scope);\n< }\n< \n< /**\n< * Determine if the current API token is missing a given scope.\n< */\n< public function tokenCant(string $scope): bool\n< {\n< return ! $this->tokenCan($scope);\n< }\n< \n< /**\n< * Create a new personal access token for the user.\n< *\n< * @param string[] $scopes\n< */\n< public function createToken(string $name, array $scopes = []): PersonalAccessTokenResult\n< {\n< return app(PersonalAccessTokenFactory::class)->make(\n< $this->getAuthIdentifier(), $name, $scopes, $this->getProviderName()\n< );\n< }\n< \n< /**\n< * Get the user provider name.\n< *\n< * @throws \\LogicException\n< */\n< public function getProviderName(): string\n< {\n< $providers = collect(config('auth.guards'))->where('driver', 'passport')->pluck('provider')->all();\n< \n< foreach (config('auth.providers') as $provider => $config) {\n< if (in_array($provider, $providers) && $config['driver'] === 'eloquent' && is_a($this, $config['model'])) {\n< return $provider;\n< }\n< }\n< \n< throw new LogicException('Unable to determine authentication provider for this model from configuration.');\n---\n> return $this->accessToken ? $this->accessToken->can($scope) : false;\n129c35\n< public function withAccessToken(?ScopeAuthorizable $accessToken): static\n---\n> public function withAccessToken(TransientToken $accessToken): static\nroot@docker_lamp_1:/home/jiminny# cat vendor/laravel/passport/src/Contracts/OAuthenticatable.php\n<?php\n\nnamespace Laravel\\Passport\\Contracts;\n\nuse Illuminate\\Contracts\\Auth\\Authenticatable;\nuse Illuminate\\Database\\Eloquent\\Relations\\HasMany;\nuse Illuminate\\Database\\Eloquent\\Relations\\MorphMany;\nuse Laravel\\Passport\\PersonalAccessTokenResult;\n\ninterface OAuthenticatable extends Authenticatable\n{\n /**\n * Get all the user's registered OAuth applications.\n *\n * @return \\Illuminate\\Database\\Eloquent\\Relations\\MorphMany<\\Laravel\\Passport\\Client, \\Illuminate\\Foundation\\Auth\\User>\n */\n public function oauthApps(): MorphMany;\n\n /**\n * Get all the access tokens for the user.\n *\n * @return \\Illuminate\\Database\\Eloquent\\Relations\\HasMany<\\Laravel\\Passport\\Token, \\Illuminate\\Foundation\\Auth\\User>\n */\n public function tokens(): HasMany;\n\n /**\n * Determine if the current API token has a given scope.\n */\n public function tokenCan(string $scope): bool;\n\n /**\n * Determine if the current API token is missing a given scope.\n */\n public function tokenCant(string $scope): bool;\n\n /**\n * Create a new personal access token for the user.\n *\n * @param string[] $scopes\n */\n public function createToken(string $name, array $scopes = []): PersonalAccessTokenResult;\n\n /**\n * Get the access token currently associated with the user.\n */\n public function currentAccessToken(): ?ScopeAuthorizable;\n\n /**\n * Set the current access token for the user.\n */\n public function withAccessToken(?ScopeAuthorizable $accessToken): static;\n\n /**\n * Get the user provider name.\n */\n public function getProviderName(): string;\n}\nroot@docker_lamp_1:/home/jiminny# grep -n \"use HasApiTokens\" app/Models/User.php app/Models/Partner.php app/Traits/HasApiTokens.php\napp/Models/User.php:243: use HasApiTokens;\napp/Models/Partner.php:78: use HasApiTokens;\nroot@docker_lamp_1:/home/jiminny#","is_focused":true},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.0,"top":0.05888889,"width":0.19722222,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.004166667,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"DEV (docker)","depth":2,"bounds":{"left":0.19722222,"top":0.05888889,"width":0.19722222,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.2013889,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"APP (-zsh)","depth":2,"bounds":{"left":0.39444444,"top":0.05888889,"width":0.19722222,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.3986111,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.59166664,"top":0.05888889,"width":0.19722222,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.59583336,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"screenpipe\"","depth":2,"bounds":{"left":0.7888889,"top":0.05888889,"width":0.19722222,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.79305553,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"⌥⌘1","depth":1,"bounds":{"left":0.95763886,"top":0.032222223,"width":0.03888889,"height":0.018888889},"automation_id":"_NS:8","role_description":"text"},{"role":"AXStaticText","text":"DEV (docker)","depth":1,"bounds":{"left":0.47013888,"top":0.033333335,"width":0.0625,"height":0.017777778},"role_description":"text"}]...
|
-4919487151736841628
|
-8608134124993797604
|
visual_change
|
accessibility
|
NULL
|
root@docker_lamp_1:/home/jiminny# diff \
vendor/ root@docker_lamp_1:/home/jiminny# diff \
vendor/laravel/passport/src/HasApiTokens.php \
app/Traits/HasApiTokens.php
3c3
< namespace Laravel\Passport;
---
> namespace Jiminny\Traits;
5,9c5
< use Illuminate\Database\Eloquent\Builder;
< use Illuminate\Database\Eloquent\Relations\HasMany;
< use Illuminate\Database\Eloquent\Relations\MorphMany;
< use Laravel\Passport\Contracts\ScopeAuthorizable;
< use LogicException;
---
> use Laravel\Passport\TransientToken;
11,13d6
< /**
< * @phpstan-require-implements \Laravel\Passport\Contracts\OAuthenticatable
< */
18,44d10
< */
< protected ?ScopeAuthorizable $accessToken = null;
<
< /**
< * Get all of the user's registered OAuth clients.
< *
< * @deprecated Use oauthApps()
< *
< * @return \Illuminate\Database\Eloquent\Relations\HasMany<\Laravel\Passport\Client, $this>
< */
< public function clients(): HasMany
< {
< return $this->hasMany(Passport::clientModel(), 'user_id');
< }
<
< /**
< * Get all of the user's registered OAuth applications.
< *
< * @return \Illuminate\Database\Eloquent\Relations\MorphMany<\Laravel\Passport\Client, $this>
< */
< public function oauthApps(): MorphMany
< {
< return $this->morphMany(Passport::clientModel(), 'owner');
< }
<
< /**
< * Get all of the access tokens for the user.
46c12
< * @return \Illuminate\Database\Eloquent\Relations\HasMany<\Laravel\Passport\Token, $this>
---
> * @var Laravel\Passport\TransientToken
48,62c14
< public function tokens(): HasMany
< {
< return $this->hasMany(Passport::tokenModel(), 'user_id', $this->getAuthIdentifierName())
< ->where(function (Builder $query): void {
< $query->whereHas('client', function (Builder $query): void {
< $query->where(function (Builder $query): void {
< $provider = $this->getProviderName();
<
< $query->when($provider === config('auth.guards.api.provider'), function (Builder $query): void {
< $query->orWhereNull('provider');
< })->orWhere('provider', $provider);
< });
< });
< });
< }
---
> protected $accessToken;
65c17
< * Get the access token currently associated with the user.
---
> * Get the current access token being used by the user.
67,75c19
< public function token(): ?ScopeAuthorizable
< {
< return $this->currentAccessToken();
< }
<
< /**
< * Get the access token currently associated with the user.
< */
< public function currentAccessToken(): ?ScopeAuthorizable
---
> public function token(): ?TransientToken
85,123c29
< return $this->accessToken && $this->accessToken->can($scope);
< }
<
< /**
< * Determine if the current API token is missing a given scope.
< */
< public function tokenCant(string $scope): bool
< {
< return ! $this->tokenCan($scope);
< }
<
< /**
< * Create a new personal access token for the user.
< *
< * @param string[] $scopes
< */
< public function createToken(string $name, array $scopes = []): PersonalAccessTokenResult
< {
< return app(PersonalAccessTokenFactory::class)->make(
< $this->getAuthIdentifier(), $name, $scopes, $this->getProviderName()
< );
< }
<
< /**
< * Get the user provider name.
< *
< * @throws \LogicException
< */
< public function getProviderName(): string
< {
< $providers = collect(config('auth.guards'))->where('driver', 'passport')->pluck('provider')->all();
<
< foreach (config('auth.providers') as $provider => $config) {
< if (in_array($provider, $providers) && $config['driver'] === 'eloquent' && is_a($this, $config['model'])) {
< return $provider;
< }
< }
<
< throw new LogicException('Unable to determine authentication provider for this model from configuration.');
---
> return $this->accessToken ? $this->accessToken->can($scope) : false;
129c35
< public function withAccessToken(?ScopeAuthorizable $accessToken): static
---
> public function withAccessToken(TransientToken $accessToken): static
root@docker_lamp_1:/home/jiminny# cat vendor/laravel/passport/src/Contracts/OAuthenticatable.php
<?php
namespace Laravel\Passport\Contracts;
use Illuminate\Contracts\Auth\Authenticatable;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Database\Eloquent\Relations\MorphMany;
use Laravel\Passport\PersonalAccessTokenResult;
interface OAuthenticatable extends Authenticatable
{
/**
* Get all the user's registered OAuth applications.
*
* @return \Illuminate\Database\Eloquent\Relations\MorphMany<\Laravel\Passport\Client, \Illuminate\Foundation\Auth\User>
*/
public function oauthApps(): MorphMany;
/**
* Get all the access tokens for the user.
*
* @return \Illuminate\Database\Eloquent\Relations\HasMany<\Laravel\Passport\Token, \Illuminate\Foundation\Auth\User>
*/
public function tokens(): HasMany;
/**
* Determine if the current API token has a given scope.
*/
public function tokenCan(string $scope): bool;
/**
* Determine if the current API token is missing a given scope.
*/
public function tokenCant(string $scope): bool;
/**
* Create a new personal access token for the user.
*
* @param string[] $scopes
*/
public function createToken(string $name, array $scopes = []): PersonalAccessTokenResult;
/**
* Get the access token currently associated with the user.
*/
public function currentAccessToken(): ?ScopeAuthorizable;
/**
* Set the current access token for the user.
*/
public function withAccessToken(?ScopeAuthorizable $accessToken): static;
/**
* Get the user provider name.
*/
public function getProviderName(): string;
}
root@docker_lamp_1:/home/jiminny# grep -n "use HasApiTokens" app/Models/User.php app/Models/Partner.php app/Traits/HasApiTokens.php
app/Models/User.php:243: use HasApiTokens;
app/Models/Partner.php:78: use HasApiTokens;
root@docker_lamp_1:/home/jiminny#
DOCKER
Close Tab
DEV (docker)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
screenpipe"
Close Tab
⌥⌘1
DEV (docker)...
|
53844
|
|
53980
|
NULL
|
0
|
2026-04-20T08:35:49.202088+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-20/1776 /Users/lukas/.screenpipe/data/data/2026-04-20/1776674149202_m1.jpg...
|
Slack
|
Slack - Huddle Preview
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Slack - Huddle Preview
Start huddle with
Aneliya A Slack - Huddle Preview
Start huddle with
Aneliya Angelova
Microphone
Video
soundcore AeroClip (Bluetooth) (System Default) (Preferred)
soundcore AeroClip (Bluetooth) (System Default) (Preferred)
soundcore AeroClip (Bluetooth) (System Default) (Preferred)
soundcore AeroClip (Bluetooth) (System Default) (Preferred)
FaceTime HD Camera
FaceTime HD Camera
Cancel
Cancel
Join
Join
A huddle is happening: ....
|
[{"role":"AXStaticText","text& [{"role":"AXStaticText","text":"Slack - Huddle Preview","depth":11,"role_description":"text"},{"role":"AXStaticText","text":"Start huddle with","depth":12,"role_description":"text"},{"role":"AXStaticText","text":"Aneliya Angelova","depth":12,"role_description":"text"},{"role":"AXCheckBox","text":"Microphone","depth":13,"role_description":"switch","subrole":"AXSwitch","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Video","depth":13,"role_description":"switch","subrole":"AXSwitch","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"soundcore AeroClip (Bluetooth) (System Default) (Preferred)","depth":11,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"soundcore AeroClip (Bluetooth) (System Default) (Preferred)","depth":13,"role_description":"text"},{"role":"AXPopUpButton","text":"soundcore AeroClip (Bluetooth) (System Default) (Preferred)","depth":11,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"soundcore AeroClip (Bluetooth) (System Default) (Preferred)","depth":13,"role_description":"text"},{"role":"AXPopUpButton","text":"FaceTime HD Camera","depth":11,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"FaceTime HD Camera","depth":13,"role_description":"text"},{"role":"AXButton","text":"Cancel","depth":11,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Cancel","depth":12,"role_description":"text"},{"role":"AXButton","text":"Join","depth":11,"role_description":"button","is_enabled":true,"is_focused":true,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Join","depth":12,"role_description":"text"},{"role":"AXStaticText","text":"A huddle is happening: .","depth":10,"role_description":"text"}]...
|
-6514232819866915747
|
-6741720522694447578
|
click
|
hybrid
|
NULL
|
Slack - Huddle Preview
Start huddle with
Aneliya A Slack - Huddle Preview
Start huddle with
Aneliya Angelova
Microphone
Video
soundcore AeroClip (Bluetooth) (System Default) (Preferred)
soundcore AeroClip (Bluetooth) (System Default) (Preferred)
soundcore AeroClip (Bluetooth) (System Default) (Preferred)
soundcore AeroClip (Bluetooth) (System Default) (Preferred)
FaceTime HD Camera
FaceTime HD Camera
Cancel
Cancel
Join
Join
A huddle is happening: .
iTerm2ShelllEditViewSessionScriptsProfilesWindowHelp100% C8• Mon 20 Apr 11:35:49screenpipe"DOCKER2026-04-20111:28:15.09933522026-04-20T11:28:18.161712Z2026-04-20T11:28:24.420260Z2026-04-20T11:29:09.322794Z2026-04-20T11:29:12.232781Z2026-04-20T11:29:13.714491Z2026-04-20T11:29:15.29707822026-04-20T11:29:18.279439Z2026-04-20T11:29:21.288709Z2026-04-20T11:29:36.889190Z2026-04-20111:29:36.93591422026-04-20T11:29:44.265375Z2026-04-20T11:29:45.438891Z2026-04-20111:29:48.445512Z2026-04-20T11:30:00.582835Z2026-04-20T11:30:00.930875Z2026-04-20T11:30:03.983533Z2026-04-20T11:30:25.190331ZROM\nframes \nWHERE\n3845166S2026-04-20111:30:25.191014Z2026-04-20T11:30:28.644851Z2026-04-20T11:30:34.292740Z2026-04-20T11:30:49.731059Z2026-04-20T11:30:52.714807Z2026-04-20T11:30:52.764209Z2026-04-20T11:30:53.030418Z2026-04-20T11:30:56.085725Z2026-04-20T11:30:57.236790Z2026-04-20T11:31:57.345054Z2026-04-20111:32:34.844223Z2026-04-20T11:33:01.295072Z2026-04-20T11:33:02.667241Z2026-04-20T11:33:40.313987Z2026-04-20T11:33:40.621030Z2026-04-20T11:33:45.357469Z2026-04-20T11:33:45.361133Z2026-04-20T11:33:50.248270Z2026-04-20T11:33:55.493928Z2026-04-20T11:34:26.223427Z2026-04-20111:34:26.415026Z2026-04-20T11:35:35.008400Z2026-04-20T11:35:37.449048Z2026-04-20T11:35:40.752978ZO ₴1DEV (docker)₴2APP (-zsh)83-zsh• ₴4screenpipe"INFOscreenpipe_engine::event_driven_capture:contentdedup:skipping capture for monitor 2INFOChash=8004693622225847515,trigger=click)screenpipe_engine::event_driven_capture: content dedup:skipping capture for monitor 2 (hash=-3897675075138840599, trigger=visual_change)INFOscreenpipe_engine::event_driven_capture: contentdedup:skipping capture for monitor 1(hash=8004693622225847515, trigger=click)INFOscreenpipe_engine::event,_driven_capture:contentdedup:skipping capture for monitor 1(hash=6684718794164531158, trigger=visual_change)INFOscreenpipe_engine:: event,driven_capture:contentdedup:skipping capture for monitor 1 (hash=6684718794164531158, trigger=visual_change)INFOscreenpipe_engine::event_driven_capture:contentdedup: skippingcapture for monitor 1 (hash=6684718794164531158, trigger=click)INFOscreenpipe_engine::event_driven_capture:contentdedup: skippingINFOcapture for monitor 1 (hash=6684718794164531158, trigger=visual_change)screenpipe_engine::event_driven_capture: contentdedup: skipping capture for monitor 1 (hash=6684718794164531158, trigger=visual_change)INFOscreenpipe_engine::event_driven_capture: content dedup:skipping capture for monitor 1 (hash=6684718794164531158, trigger=visual_change)INFOscreenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-1183751968977138305, trigger=click)INFOscreenpipe_engine::event_driven_capture: contentINFOdedup: skipping capture for monitor 2 (hash=-1183751968977138305, trigger=click)screenpipe_engine::event_driven_capture: contentdedup: skipping capture for monitor 1 (hash=1744865349186139800, trigger=click)INFOscreenpipe_engine::event_driven_capture: contentdedup: skippingcapture for monitor 1 (hash=1744865349186139800, trigger=visual_change)INFOscreenpipe_engine::event_driven_capture:content dedup: skippingcapture for monitor 1 (hash=1744865349186139800, trigger=visual_change)INFOscreenpipe_engine::event_driven_capture: content dedup:skipping capture for monitor 1 (hash=214677970165296243, trigger=click)INFOscreenpipe_engine::event_driven_capture: content dedup:INFOskipping capture for monitor 1 (hash=214677970165296243, trigger=visual_change)screenpipe_engine::event_driven_capture: content dedup:skipping capture for monitor 1 (hash=214677970165296243, trigger=visual_change)WARNsqlx::query:summary="SELECT id, snapshot_path, device_name, ."db.statement="\n\nSELECT\nid, \nsnapshot_path, \ndevice_name, \nsnapshot_path IS NOT NULL\nAND timestamp < ?1\nORDER BY\ndevice_name, \ntimestamp ASC\nLIMIT\n5000\n"timestamp\nFrows_affected=0 rows_returned=144 elapsed=2.41INFOscreenpipe_engine::snapshot_compaction: snapshotcompaction: found 144 eligible framesINFOINFOscreenpipe_engine::snapshot_compaction: snapshot compaction: 59 frames, 8.9MB → 1.9MB (4.8x), 59 JPEGs deletedscreenpipe_engine::snapshot_compaction: snapshot compaction: 83 frames, 12.OMB → 6.2MB (1.9X), 83 JPEGs deletedINFOscreenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 Chash=-6771186432168714093,trigger=visual_change)INFOscreenpipe_engine::event_driven_capture: contentdedup:skipping capture for monitor 1 (hash=-6771186432168714093,INFOtrigger=click)screenpipe_engine::event_driven_capture: contentdedup: skippingcapture for monitor 2 Chash=-6771186432168714093,trigger=click)INFOscreenpipe_engine:: event._driven_capture: contentdedup:skippingcapture for monitor 1 (hash=-6771186432168714093,trigger=visual_change)INFOscreenpipe_engine::event_driven_capture: contentdedup: skipping capture for monitor 1 (hash=-6771186432168714093, trigger=visual_change)INFOscreenpipe_engine::event_driven_capture: content dedup:skipping capture for monitor 2 (hash=-6771186432168714093, trigger=visual_change)INFOscreenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 1 (hash=-5799305003809379240, trigger=visual_change)INFOscreenpipe_engine::event,_driven_capture: contentdedup:skipping capture for monitor 2 (hash=-5799305003809379240, trigger=click)INFOINFOscreenpipe_engine::event_driven_capture: contentdedup:skipping capture for monitor 1 (hash=-2331312136567929026, trigger=visual_change)screenpipe_engine::event_driven_capture: content dedup: skipping capture for monitor 2 (hash=-2331312136567929026, trigger=visual_change)INFOscreenpipe_engine: :meeting_detector: meeting v2: Idle -> Confirming (app=Slack, signals=2)INFOscreenpipe_engine::event_driven_capture:content dedup:skipping capture for monitor 1 (hash=6376510702070023487, trigger=visual_change)INFOscreenpipe_engine::meeting_detector: meeting v2: ConfirmingINFO-› Active (app=Slack, signals=2, browser=false)screenpipe_engine::meeting_detector: meeting v2:meeting started (id=4, app=Slack, title=None)INFOscreenpipe_engine::event_driven_capture:contentdedup:skipping capture for monitor 2 (hash=2305043043211837966, trigger=visual_change)INFOscreenpipe_engine: :meeting_detector: meeting v2:Active->Ending (nocontrols, app=Slack,id=4, grace=30s)INFOscreenpipe_engine::meeting_detector: meeting v2:Ending -> Idle (timeout=30s, app=Slack, id=4)INFOscreenpipe_engine::meeting_detector: meeting v2: meetingended (id=4)INFOINFOscreenpipe_engine::snapshot_compaction: snapshotcompaction: found 86eligible framesscreenpipe_engine::snapshot_compaction: snapshotcompaction: 35 frames,8.2MB → 2.2MB (3.8x), 35 JPEGs deletedINFOscreenpipe_engine::snapshot_compaction: snapshotcompaction: 49 frames, 5.9MB → 3.OMB (2.0x), 49 JPEGs deleted...
|
53978
|
|
53982
|
NULL
|
0
|
2026-04-20T08:35:51.023345+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-20/1776 /Users/lukas/.screenpipe/data/data/2026-04-20/1776674151023_m2.jpg...
|
Slack
|
Huddle: @Aneliya Angelova - Jiminny Inc - Slack
|
True
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
AI Notes: Off
Thread
Every huddle has a thread
Sen AI Notes: Off
Thread
Every huddle has a thread
Send messages, files, and links to everyone in the huddle. They’re saved as a thread in this direct message with
@Aneliya Angelova
@Aneliya Angelova
, so you can access it even after the huddle is done.
Also send as direct message
Also send as direct message
Hide thread
Aneliya Angelova is in the huddle.: .
Aneliya Angelova has declined the huddle invite....
|
[{"role":"AXCheckBox","text [{"role":"AXCheckBox","text":"AI Notes: Off","depth":13,"bounds":{"left":0.50664896,"top":0.058260176,"width":0.050199468,"height":0.023942538},"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"Thread","depth":13,"bounds":{"left":0.8856383,"top":0.045490824,"width":0.019281914,"height":0.0415004},"role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true,"is_expanded":false},{"role":"AXStaticText","text":"Every huddle has a thread","depth":18,"bounds":{"left":0.8909575,"top":0.101356745,"width":0.057845745,"height":0.014365523},"role_description":"text"},{"role":"AXStaticText","text":"Send messages, files, and links to everyone in the huddle. They’re saved as a thread in this direct message with","depth":18,"bounds":{"left":0.8843085,"top":0.12210695,"width":0.10704787,"height":0.049481247},"role_description":"text"},{"role":"AXLink","text":"@Aneliya Angelova","depth":18,"bounds":{"left":0.91522604,"top":0.15642458,"width":0.043218084,"height":0.015961692},"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"@Aneliya Angelova","depth":19,"bounds":{"left":0.91589093,"top":0.15722266,"width":0.041888297,"height":0.014365523},"role_description":"text"},{"role":"AXStaticText","text":", so you can access it even after the huddle is done.","depth":18,"bounds":{"left":0.8843085,"top":0.15722266,"width":0.099734046,"height":0.031923383},"role_description":"text"},{"role":"AXTextArea","text":"","depth":21,"bounds":{"left":0.88464093,"top":0.207502,"width":0.10837766,"height":0.030327214},"value":"","role_description":"text entry area","is_enabled":true,"is_focused":true,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Also send as direct message","depth":20,"bounds":{"left":0.8976064,"top":0.2442139,"width":0.048537236,"height":0.011971269},"role_description":"text"},{"role":"AXCheckBox","text":"Also send as direct message","depth":20,"bounds":{"left":0.8892952,"top":0.2442139,"width":0.0043218085,"height":0.0103751},"role_description":"Tick box","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide thread","depth":13,"bounds":{"left":0.9847075,"top":0.0518755,"width":0.011968086,"height":0.028731046},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Aneliya Angelova is in the huddle.: .","depth":10,"bounds":{"left":0.5,"top":0.9992019,"width":0.019614361,"height":0.0007980846},"role_description":"text"},{"role":"AXStaticText","text":"Aneliya Angelova has declined the huddle invite.","depth":12,"bounds":{"left":0.75598407,"top":0.9050279,"width":0.09075798,"height":0.031923383},"role_description":"text"}]...
|
-4856286727983525697
|
-2864672421208436859
|
visual_change
|
hybrid
|
NULL
|
AI Notes: Off
Thread
Every huddle has a thread
Sen AI Notes: Off
Thread
Every huddle has a thread
Send messages, files, and links to everyone in the huddle. They’re saved as a thread in this direct message with
@Aneliya Angelova
@Aneliya Angelova
, so you can access it even after the huddle is done.
Also send as direct message
Also send as direct message
Hide thread
Aneliya Angelova is in the huddle.: .
Aneliya Angelova has declined the huddle invite.
slackActivityLateVIewmistonWindowJiminny ...* Starred |• jiminny-x-integrat...platform-inner-team@ Channels*al-chapteri alerts# backendcontusion-cllnie# curiosity lab# engineerinss trontendi# generalac intra-changes#jiminny-bg# platform-tickets# product_launches# randomi releases# sofia-office# supporti# thank-yous# the people of iimi..A Direct messagesf.A..• Galva Dimitrova2 Stefka StoyanovaStovan Tomov3 Aneliya Angelova, .o. Nikolav NikolovRo Stoyan TanevVasil VasilevO Nikolav Ivanov®. Ves::: Anns#" Jira Cloud6d Huddle with Aneliva Angelova100% 5• Mon ZU A0r 11:30.:0167 Huddle with Aneliya Angelova* Aneliya Angelova C• Messagest Add canvasur FilesAneliya Angelova 9:35 AMFriday. March 27thvдаже не знам от кога вес е счупил деплоя и колко време все съм тествала едно и сьщо без да се усетя че деплойването не е работелоInkas Kovalik 0.24AMlThursday, April 16th~Y= Al Notes: OffThread@ Every huddle has a threadSend messages, files, and links to everyone in thehuddle. They're saved as a thread in this directmessage with @Anellya Angelova, so you canaccess it even after the huddle is doneReply…• Also send as direct message+ Aа @Aneliya Angelova 10:00 AMЛукаш кога искаш да се чуемза команиитеLukas Kovalik 10:01 AMаиде след 15 мин че се зарових в зохоLukas Kovalik 10:32 AMако искаш ла се чуем сегаAneliva Angelova 10:33 AMA huddle happened 10:33 AMInkac Kovalik 10.11 AMpho artisan automated-revorts --report-1d 39pho artisan automated-renorts:send --result-1d 64TodavAneliva Angelova 9:41 AMЗдрасти Лукаш, струва ми се, че репортите се генерират върху всички активитита сьс съответния Saved search bez da e dobawen filtyr za dataImkae Kouslil 40.01 AMАни след малко може да се чуемAneliya Angelova 11:27 AMJnkas Kovalik 11.26 AMтука сьмAneliya Angelova is in the huddle. LIVE 11:35 AMMessage Aneliva Angeloval+ AaeLukas KovalikAneliva Angelova has declined the huddleinviteAl Notes: OffLeaveLeave...
|
53981
|
|
54164
|
NULL
|
0
|
2026-04-20T08:40:44.641273+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-20/1776 /Users/lukas/.screenpipe/data/data/2026-04-20/1776674444641_m1.jpg...
|
Slack
|
Slack
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
FirefoxFileEditViewHistoryTools Window Help→CJY-20 FirefoxFileEditViewHistoryTools Window Help→CJY-20553 | Improve crm-sync dela[SRD-6793] Les Mills activity typeJY-20698 handle failed field syncJY-20692 change confirmation pal[JY-20543] AJ Reports > Tracking(JY-18909) [Part2) Automated repAsk Jiminny Reports by nikolay-yarNew TabProduct Growth Platform | UserpilcUserpilot | Logged-activityfix(security): composer dependencPipelines - jiminny/appFeed - jiminny - Sentryfix(security): composer dependencJiminnyJiminny+ New TabBookmarks105Profilesapp.staging.jiminny.com/ai-reportsAl ReportsReport namePeriodNAME-Health - 9 - 15 Apr 2026Tuesday Report - 15 Apr 2026Ask Jiminny Test Report - 15 Apr 2026Eastern Summary - 7 - 13 Apr 2026Tuesday Report - 13 Apr 2026Ask Jiminny Test Report - 13 Apr 2026Ask Jiminny Test Report - 13 Apr 2026JY-18909-automated-reports-ask-jiminny = 873114Report TypeFREQUENCY +WeeklyDailyDailyWeeklyDailyDailyDailyA100% C 8• Mon 20 Apr 11:40:44{03 Ask Jiminny reports© Clear all |SHARED|Kamі +1SchuSchul-LamLKamyDATE Y16/04/202616/04/202616/04/202614/04/202614/04/202614/04/202614/04/2026ACTIONSLPOFLeorLeor• Соrш• СоШ• C ш...
|
NULL
|
-5032313353338777698
|
NULL
|
app_switch
|
ocr
|
NULL
|
FirefoxFileEditViewHistoryTools Window Help→CJY-20 FirefoxFileEditViewHistoryTools Window Help→CJY-20553 | Improve crm-sync dela[SRD-6793] Les Mills activity typeJY-20698 handle failed field syncJY-20692 change confirmation pal[JY-20543] AJ Reports > Tracking(JY-18909) [Part2) Automated repAsk Jiminny Reports by nikolay-yarNew TabProduct Growth Platform | UserpilcUserpilot | Logged-activityfix(security): composer dependencPipelines - jiminny/appFeed - jiminny - Sentryfix(security): composer dependencJiminnyJiminny+ New TabBookmarks105Profilesapp.staging.jiminny.com/ai-reportsAl ReportsReport namePeriodNAME-Health - 9 - 15 Apr 2026Tuesday Report - 15 Apr 2026Ask Jiminny Test Report - 15 Apr 2026Eastern Summary - 7 - 13 Apr 2026Tuesday Report - 13 Apr 2026Ask Jiminny Test Report - 13 Apr 2026Ask Jiminny Test Report - 13 Apr 2026JY-18909-automated-reports-ask-jiminny = 873114Report TypeFREQUENCY +WeeklyDailyDailyWeeklyDailyDailyDailyA100% C 8• Mon 20 Apr 11:40:44{03 Ask Jiminny reports© Clear all |SHARED|Kamі +1SchuSchul-LamLKamyDATE Y16/04/202616/04/202616/04/202614/04/202614/04/202614/04/202614/04/2026ACTIONSLPOFLeorLeor• Соrш• СоШ• C ш...
|
NULL
|
|
54170
|
NULL
|
0
|
2026-04-20T08:40:49.153483+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-20/1776 /Users/lukas/.screenpipe/data/data/2026-04-20/1776674449153_m1.jpg...
|
Slack
|
Huddle: @Aneliya Angelova - Jiminny Inc - Slack
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
AI Notes: Off
Aneliya Angelova is in the huddle.: AI Notes: Off
Aneliya Angelova is in the huddle.: ....
|
[{"role":"AXCheckBox","text [{"role":"AXCheckBox","text":"AI Notes: Off","depth":13,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Aneliya Angelova is in the huddle.: .","depth":10,"bounds":{"left":0.4798611,"top":0.0,"width":0.04097222,"height":0.0011111111},"role_description":"text"}]...
|
9195472439744667829
|
-1114629288540501215
|
visual_change
|
hybrid
|
NULL
|
AI Notes: Off
Aneliya Angelova is in the huddle.: AI Notes: Off
Aneliya Angelova is in the huddle.: .
FirefoxFileEditViewHistoryBookmarksProfilesTools Window Help→app.staging.jiminny.com/ai-reportsAl ReportsReport namePeriodJY-20553 | Improve crm-sync dela[SRD-6793] Les Mills activity typeJY-20698 handle failed field syncJY-20692 change confirmation pal[JY-20543] AJ Reports > Tracking(JY-18909) [Part2) Automated repAsk Jiminny Reports by nikolay-yarNew TabProduct Growth Platform | UserpiloUserpilot | Logged-activityfix(security): composer dependencPipelines - jiminny/appFeed - jiminny - Sentryfix(security): composer dependencJiminnyJiminny+New TabNAME105Health - 9 - 15 Apr 2026Tuesday Report - 15 Apr 2026Ask Jiminny Test Report - 15 Apr 2026Eastern Summary - 7 - 13 Apr 2026Tuesday Report - 13 Apr 2026Ask Jiminny Test Report - 13 Apr 2026Ask Jiminny Test Report - 13 Apr 2026JY-18909-automated-reports-ask-jiminny = 873114Report TypeFREQUENCYWeeklyDailyDailyWeeklyDailyDailyDaily‹$0100% C8• Mon 20 Apr 11:40:48{03 Ask Jiminny reports© Clear all |SHARED|Kamі +1SchuSchu-LamLKanyDATE Y16/04/202616/04/202616/04/202614/04/202614/04/202614/04/202614/04/2026ACTIONSCooFLeorLeor• Сorш• СоШ• C ш...
|
NULL
|
|
54172
|
NULL
|
0
|
2026-04-20T08:40:56.397464+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-20/1776 /Users/lukas/.screenpipe/data/data/2026-04-20/1776674456397_m2.jpg...
|
Slack
|
Huddle: @Aneliya Angelova - Jiminny Inc - Slack
|
True
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Aneliya Angelova
Aneliya Angelova, Screen share
An Aneliya Angelova
Aneliya Angelova, Screen share
Aneliya Angelova
Screen share
Turn on drawing
Fullscreen
Back to grid
View Lukas Kovalik's profile
video is off, audio is on
More actions
Audio
View Aneliya Angelova's profile
Aneliya Angelova
More actions
Audio
Aneliya Angelova is in the huddle.: ....
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Aneliya Angelova","depth":14,"bounds":{"left":0.50398934,"top":0.049481247,"width":0.011968086,"height":0.033519555},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Aneliya Angelova, Screen share","depth":14,"bounds":{"left":0.5199468,"top":0.049481247,"width":0.03856383,"height":0.017557861},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Aneliya Angelova","depth":16,"bounds":{"left":0.5199468,"top":0.051077414,"width":0.03856383,"height":0.014365523},"role_description":"text"},{"role":"AXStaticText","text":"Screen share","depth":15,"bounds":{"left":0.5199468,"top":0.06783719,"width":0.024268618,"height":0.012769354},"role_description":"text"},{"role":"AXButton","text":"Turn on drawing","depth":15,"bounds":{"left":0.90791225,"top":0.0518755,"width":0.011968086,"height":0.028731046},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Fullscreen","depth":15,"bounds":{"left":0.91988033,"top":0.0518755,"width":0.011968086,"height":0.028731046},"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Back to grid","depth":15,"bounds":{"left":0.9318484,"top":0.0518755,"width":0.011968086,"height":0.028731046},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCell","text":"View Lukas Kovalik's profile","depth":11,"bounds":{"left":0.9478058,"top":0.3790902,"width":0.049867023,"height":0.11971269},"role_description":"cell"},{"role":"AXButton","text":"video is off, audio is on","depth":12,"bounds":{"left":0.95046544,"top":0.47007182,"width":0.03158245,"height":0.022346368},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"More actions","depth":12,"bounds":{"left":0.984375,"top":0.38547486,"width":0.010638298,"height":0.025538707},"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Audio","depth":12,"bounds":{"left":0.97273934,"top":0.37669593,"width":0.0003324468,"height":0.0007980846},"role_description":"text"},{"role":"AXCell","text":"View Aneliya Angelova's profile","depth":11,"bounds":{"left":0.9478058,"top":0.50359136,"width":0.049867023,"height":0.11971269},"role_description":"cell"},{"role":"AXStaticText","text":"Aneliya Angelova","depth":13,"bounds":{"left":0.953125,"top":0.59936154,"width":0.03324468,"height":0.012769354},"role_description":"text"},{"role":"AXPopUpButton","text":"More actions","depth":12,"bounds":{"left":0.984375,"top":0.509976,"width":0.010638298,"height":0.025538707},"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Audio","depth":12,"bounds":{"left":0.97273934,"top":0.5011971,"width":0.0003324468,"height":0.0007980846},"role_description":"text"},{"role":"AXStaticText","text":"Aneliya Angelova is in the huddle.: .","depth":10,"bounds":{"left":0.5,"top":0.9992019,"width":0.019614361,"height":0.0007980846},"role_description":"text"}]...
|
-456029760066552990
|
-5935090781548428413
|
visual_change
|
hybrid
|
NULL
|
Aneliya Angelova
Aneliya Angelova, Screen share
An Aneliya Angelova
Aneliya Angelova, Screen share
Aneliya Angelova
Screen share
Turn on drawing
Fullscreen
Back to grid
View Lukas Kovalik's profile
video is off, audio is on
More actions
Audio
View Aneliya Angelova's profile
Aneliya Angelova
More actions
Audio
Aneliya Angelova is in the huddle.: .
slackActivityLaterVIewMistonWindowJiminny ...& Starred& jiminny-x-integrati...8 platform-inner-team• Channels*al-chapteri alerts# backendcontusion-clinie# curiosity_lab# engineerins# frontend# general# infra-changes# jiminny-bg# platform-tickets# product_launches# random# releases# sofia-office# support# thank-yous# the people of jimi..^ Direct messagesP. A..Ma 02P. Galya Dimitrova. Stefka StoyanovaR?. Stoyan Tomov3 Aneliya Angelova,..P. Nikolay Nikolov&. Stoyan Tanev€. Vasil Vasilev. Nikolay Ivanov8. Ves:: AppsS Jira Cloud6 Huddle with Aneliya Angelova¿ 8. Aneliya Angelova @• Messagest Add canvasur FilesAneliya Angelova 9:35 AMFriday. March 27thдаже не знам от кога вес е счупил деплоя и колко време все съм тествала едно и сьщо без да се усетя че деплойването не е работелоLukas Kovalik ® 9:36 AMThursday, April 16th~Aneliya Angelova 1000 AMЛукаш кога искаш да се чуемза команиитеLukas Kovalik 10:01 AMаиде след 15 мин че се зарових в зохоLukas Kovalik 10:32 AMако искаш ла се чуем сегаAneliya Angelova O 10:33 AMA huddle happened 10:33 AMInkac Kovalik 0 10.41 AMIpho artisan automated-revorts --report-1d 39pho artisan automated-renorts:send --result-1d 64TodavAneliya Angelova O 9:41 AMЗдрасти Лукаш, струва ми се, че репортите се генерират върху всички активитита сьс съответния Saved search bez da e dobawen filtyr za dataLukas Kovalik 10:31 AMАни след малко може да се чуемAneliya Angelova 11:27 AMLukas Kovalik 11:35 AMтука сьмYou joined the huddle LIVE 11:35 AMAneliya Angelova is here too.Message Aneliva Angeloval+ AaeAl Notes: OffLeaveAneliva AngelovaScreen shareSlackFile Edit View1• 6*E AlNotes: O#fAneliya Angelova100% Lz• Mon ZU Aor 11.40:006 Huddle with Aneliya Angelova6 Huddle with Lukas Koval8• © Mon 20 Apr 11:40Thread@ Every huddle has a threadsend messages, nies, and links to everyone in themessage with @lukas Kovallk, so you can access.& Lukas Kovalik has paused their notificationsReply...O Aso send as direct message+ Aа @• ILeave...
|
54171
|
|
54214
|
NULL
|
0
|
2026-04-20T08:45:57.066309+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-20/1776 /Users/lukas/.screenpipe/data/data/2026-04-20/1776674757066_m2.jpg...
|
Slack
|
Huddle: @Aneliya Angelova - Jiminny Inc - Slack
|
True
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Aneliya Angelova
Aneliya Angelova, Screen share
An Aneliya Angelova
Aneliya Angelova, Screen share
Aneliya Angelova
Screen share
Turn on drawing
Fullscreen
Back to grid
View Lukas Kovalik's profile
video is off, audio is on
More actions
Audio
View Aneliya Angelova's profile
Aneliya Angelova
More actions
Audio
View Galya Dimitrova's profile
Galya Dimitrova
More actions
Audio
Aneliya Angelova is in the huddle.: .
Share your screen...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Aneliya Angelova","depth":14,"bounds":{"left":0.50398934,"top":0.049481247,"width":0.011968086,"height":0.033519555},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Aneliya Angelova, Screen share","depth":14,"bounds":{"left":0.5199468,"top":0.049481247,"width":0.03856383,"height":0.017557861},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Aneliya Angelova","depth":16,"bounds":{"left":0.5199468,"top":0.051077414,"width":0.03856383,"height":0.014365523},"role_description":"text"},{"role":"AXStaticText","text":"Screen share","depth":15,"bounds":{"left":0.5199468,"top":0.06783719,"width":0.024268618,"height":0.012769354},"role_description":"text"},{"role":"AXButton","text":"Turn on drawing","depth":15,"bounds":{"left":0.90791225,"top":0.0518755,"width":0.011968086,"height":0.028731046},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Fullscreen","depth":15,"bounds":{"left":0.91988033,"top":0.0518755,"width":0.011968086,"height":0.028731046},"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Back to grid","depth":15,"bounds":{"left":0.9318484,"top":0.0518755,"width":0.011968086,"height":0.028731046},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCell","text":"View Lukas Kovalik's profile","depth":11,"bounds":{"left":0.9478058,"top":0.31683958,"width":0.049867023,"height":0.11971269},"role_description":"cell"},{"role":"AXButton","text":"video is off, audio is on","depth":12,"bounds":{"left":0.95046544,"top":0.40782124,"width":0.03158245,"height":0.022346368},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXPopUpButton","text":"More actions","depth":12,"bounds":{"left":0.984375,"top":0.32322428,"width":0.010638298,"height":0.025538707},"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Audio","depth":12,"bounds":{"left":0.97273934,"top":0.31444532,"width":0.0003324468,"height":0.0007980846},"role_description":"text"},{"role":"AXCell","text":"View Aneliya Angelova's profile","depth":11,"bounds":{"left":0.9478058,"top":0.44134077,"width":0.049867023,"height":0.11971269},"role_description":"cell"},{"role":"AXStaticText","text":"Aneliya Angelova","depth":13,"bounds":{"left":0.953125,"top":0.5371109,"width":0.03324468,"height":0.012769354},"role_description":"text"},{"role":"AXPopUpButton","text":"More actions","depth":12,"bounds":{"left":0.984375,"top":0.44772545,"width":0.010638298,"height":0.025538707},"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Audio","depth":12,"bounds":{"left":0.97273934,"top":0.43894652,"width":0.0003324468,"height":0.0007980846},"role_description":"text"},{"role":"AXCell","text":"View Galya Dimitrova's profile","depth":11,"bounds":{"left":0.9478058,"top":0.565842,"width":0.049867023,"height":0.11971269},"role_description":"cell"},{"role":"AXStaticText","text":"Galya Dimitrova","depth":13,"bounds":{"left":0.96110374,"top":0.66161215,"width":0.029920213,"height":0.027134877},"role_description":"text"},{"role":"AXPopUpButton","text":"More actions","depth":12,"bounds":{"left":0.984375,"top":0.57222664,"width":0.010638298,"height":0.025538707},"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Audio","depth":12,"bounds":{"left":0.97273934,"top":0.5634477,"width":0.0003324468,"height":0.0007980846},"role_description":"text"},{"role":"AXStaticText","text":"Aneliya Angelova is in the huddle.: .","depth":10,"bounds":{"left":0.5,"top":0.9992019,"width":0.019614361,"height":0.0007980846},"role_description":"text"},{"role":"AXStaticText","text":"Share your screen","depth":12,"bounds":{"left":0.71276593,"top":0.9353551,"width":0.034242023,"height":0.012769354},"role_description":"text"}]...
|
-8547944451951971235
|
-5968586307401395313
|
visual_change
|
hybrid
|
NULL
|
Aneliya Angelova
Aneliya Angelova, Screen share
An Aneliya Angelova
Aneliya Angelova, Screen share
Aneliya Angelova
Screen share
Turn on drawing
Fullscreen
Back to grid
View Lukas Kovalik's profile
video is off, audio is on
More actions
Audio
View Aneliya Angelova's profile
Aneliya Angelova
More actions
Audio
View Galya Dimitrova's profile
Galya Dimitrova
More actions
Audio
Aneliya Angelova is in the huddle.: .
Share your screen
slackActivityLaterVIewMistonWindowJiminny ...& Starred& jiminny-x-integrati...8 platform-inner-team• Channels*al-chaptera alerts# backendcontusion-cllnie# curiosity_lab# engineerins# frontend# general# infra-changes# jiminny-bg# platform-tickets# product_launches# random# releases# sofia-office# support# thank-yous# the people of jimi..¿ 8. Aneliya Angelova @• MessagesLo Add canvasr FilesA Direct meccagpcP. A...М9 д3P. Galya Dimitrova. Stefka StoyanovaR?. Stoyan Tomov3 Aneliya Angelova,..P. Nikolay Nikolov&. Stoyan Tanev€. Vasil Vasilev. Nikolay Ivanov8. Ves:: AppsS Jira CloudLukas Kovallik 9:36 AMThursdav. April 16thvAneliya Angelova ® 10:00 AMЛукаш кога искаш да се чуемза командитеLukas Kovalik 10:01 AMайле слел 15 мин че се зарових в зохоLukas Kovalik • 10:32 AMAneliya Angelova 10:33 AMA huddle happened 10:33 AMukas Kovallk 10-41 AMIphp artisan automated-reports --report-id 39php artisan automated-reports:send --result-id 64Todav vAneliya Angelova 9:41 AMLukas Kovalik 10.31 AMАни след малко може да се чуемAneliva Angelova M 11.27 AMнаплaво зеьнни когато можешLukas Kovalik 11:35 AMЗдрасти Лукаш, струва ми се, че репортите се генерират върху всички активитита със съответния Saved search bez da e dobawen filtyr za dataYou ioined the huddle LIVE 11:35 AMAneliva Angelova and Galva Dimitrova are here too.Galva Dimitrova won't be able to see messages sent in thread because this huddle began in a direct message. You can start a new huddle instead.Message Aneliva Angeloval+ Aae6 Huddle with Aneliya AngelovaAl Notes: OffLeave6 Huddle with Aneliya Angelova10Aneliya AngelovaScreen shareChromeHistory Bookmarks Profilestxpires On -Expires Onapp.staging.jiminny.com/ai-reports/manageAsk Jiminny Reports ®NAME AExpires On - 2 AprilExpires On - 20 April - NewExoires On - 3 April |Expires On - 4 AprilExpires On - 5 AprilExoires On - 6 April |Y - Expires On - 1 AprilExpires OnP Expires OnP Expires On -lcatircoeSHAREDFREQUENCYWeeklyWeeklyWeeklvMonthlyDailyMonthlvMonthlyexpires On.P Expires Or(-) Clear all |EXPIRING16/04/202721/04/20264 Expiring in 1 day03/04/202604/04/2024A ExpiredA Expired06/04/2026/Exoired01/04/20264y ExpiredQShare your screen100% S28• Mon 20 Apr 11:45:578• © Mon 20 Apr 11:45O Circleci, WorkACTIONSLeave...
|
54212
|
|
54215
|
NULL
|
0
|
2026-04-20T08:46:26.939608+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-20/1776 /Users/lukas/.screenpipe/data/data/2026-04-20/1776674786939_m1.jpg...
|
Slack
|
Huddle: @Aneliya Angelova - Jiminny Inc - Slack
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Aneliya Angelova
Aneliya Angelova, Screen share
An Aneliya Angelova
Aneliya Angelova, Screen share
Aneliya Angelova
Screen share
Turn on drawing
Fullscreen
Back to grid
View Lukas Kovalik's profile
video is off, audio is on
Lukas Kovalik
More actions
Audio
View Aneliya Angelova's profile
Aneliya Angelova
More actions
Audio
View Galya Dimitrova's profile
Galya Dimitrova
More actions
Audio
Aneliya Angelova is in the huddle.: .
Share your screen...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Aneliya Angelova","depth":14,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Aneliya Angelova, Screen share","depth":14,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Aneliya Angelova","depth":16,"role_description":"text"},{"role":"AXStaticText","text":"Screen share","depth":15,"role_description":"text"},{"role":"AXButton","text":"Turn on drawing","depth":15,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Fullscreen","depth":15,"role_description":"toggle button","subrole":"AXToggleButton","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Back to grid","depth":15,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCell","text":"View Lukas Kovalik's profile","depth":11,"role_description":"cell"},{"role":"AXButton","text":"video is off, audio is on","depth":12,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Lukas Kovalik","depth":13,"role_description":"text"},{"role":"AXPopUpButton","text":"More actions","depth":12,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Audio","depth":12,"role_description":"text"},{"role":"AXCell","text":"View Aneliya Angelova's profile","depth":11,"role_description":"cell"},{"role":"AXStaticText","text":"Aneliya Angelova","depth":13,"role_description":"text"},{"role":"AXPopUpButton","text":"More actions","depth":12,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Audio","depth":12,"role_description":"text"},{"role":"AXCell","text":"View Galya Dimitrova's profile","depth":11,"role_description":"cell"},{"role":"AXStaticText","text":"Galya Dimitrova","depth":13,"role_description":"text"},{"role":"AXPopUpButton","text":"More actions","depth":12,"role_description":"pop-up button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Audio","depth":12,"role_description":"text"},{"role":"AXStaticText","text":"Aneliya Angelova is in the huddle.: .","depth":10,"bounds":{"left":0.4798611,"top":0.0,"width":0.04097222,"height":0.0011111111},"role_description":"text"},{"role":"AXStaticText","text":"Share your screen","depth":12,"bounds":{"left":0.92430556,"top":0.0,"width":0.07152778,"height":0.017777778},"role_description":"text"}]...
|
987107508425736725
|
-5932689451777768565
|
idle
|
hybrid
|
NULL
|
Aneliya Angelova
Aneliya Angelova, Screen share
An Aneliya Angelova
Aneliya Angelova, Screen share
Aneliya Angelova
Screen share
Turn on drawing
Fullscreen
Back to grid
View Lukas Kovalik's profile
video is off, audio is on
Lukas Kovalik
More actions
Audio
View Aneliya Angelova's profile
Aneliya Angelova
More actions
Audio
View Galya Dimitrova's profile
Galya Dimitrova
More actions
Audio
Aneliya Angelova is in the huddle.: .
Share your screen
FirefoxFileEditViewHistoryBookmarksProfilesTools Window Help→app.staging.jiminny.com/ai-reportsAl ReportsReport namePeriodJY-20553 | Improve crm-sync dela[SRD-6793] Les Mills activity typeJY-20698 handle failed field syncJY-20692 change confirmation pal[JY-20543] AJ Reports > Tracking(JY-18909) [Part2) Automated repAsk Jiminny Reports by nikolay-yarNew TabProduct Growth Platform | UserpiloUserpilot | Logged-activityfix(security): composer dependencPipelines - jiminny/appFeed - jiminny - Sentryfix(security): composer dependencJiminnyJiminny+New TabNAME105Health - 9 - 15 Apr 2026Tuesday Report - 15 Apr 2026Ask Jiminny Test Report - 15 Apr 2026Eastern Summary - 7 - 13 Apr 2026Tuesday Report - 13 Apr 2026Ask Jiminny Test Report - 13 Apr 2026Ask Jiminny Test Report - 13 Apr 2026JY-18909-automated-reports-ask-jiminny = 873114Report TypeFREQUENCYWeeklyDailyDailyWeeklyDailyDailyDaily‹$0100% C8• Mon 20 Apr 11:46:26{03 Ask Jiminny reports© Clear all |SHARED|Kamі +1SchuSchu-LamLKanyDATE Y16/04/202616/04/202616/04/202614/04/202614/04/202614/04/202614/04/2026ACTIONSCooFLeorLeor• Сorш• СоШ• C ш...
|
54213
|
|
54299
|
NULL
|
0
|
2026-04-20T08:51:29.977474+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-20/1776 /Users/lukas/.screenpipe/data/data/2026-04-20/1776675089977_m1.jpg...
|
PhpStorm
|
faVsco.js – AskJiminnyReportActivityService.php
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
#11894 on JY-18909-automa Project: faVsco.js, menu
#11894 on JY-18909-automated-reports-ask-jiminny, menu
Start Listening for PHP Debug Connections
RequestGenerateAskJiminnyReportJobTest
Run 'RequestGenerateAskJiminnyReportJobTest'
Debug 'RequestGenerateAskJiminnyReportJobTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
2
1
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Services\Kiosk\AutomatedReports;
use Jiminny\Component\ActivitySearch\FilterDefinition\ActivityActualDate;
use Jiminny\Component\ActivitySearch\FilterDefinition\ActivityUpdatedDate;
use Jiminny\Component\ActivitySearch\FilterDefinition\DealInsights\ClosingPeriodFilter;
use Jiminny\Component\ActivitySearch\Service\ActivitySearch;
use Jiminny\Models\Activity\Search;
use Jiminny\Models\User;
use Jiminny\Repositories\ElasticActivityRepository;
use Jiminny\VO\Repository\OnDemandActivitySearch\Criteria;
use Psr\Log\LoggerInterface;
class AskJiminnyReportActivityService
{
private const int DEFAULT_TOP_ACTIVITIES_COUNT = 100;
private const array DATE_FILTER_KEYS = [
ActivityActualDate::PARAM_START_DATE,
ActivityActualDate::PARAM_END_DATE,
ActivityUpdatedDate::PARAM_UPDATED_FROM,
ActivityUpdatedDate::PARAM_UPDATED_TO,
ClosingPeriodFilter::KEY_START_DATE,
ClosingPeriodFilter::KEY_END_DATE,
];
public function __construct(
private readonly ActivitySearch $activitySearch,
private readonly ElasticActivityRepository $elasticRepository,
private readonly LoggerInterface $logger,
) {
}
/**
* Fetch activity IDs for a saved search, passing its filters as-is to Criteria.
* Date filters stored on the saved search are excluded; if no other filters exist,
* no date constraint is applied — matching the behaviour of getContextForAskAnythingByFilter.
*
* @return string[] Activity IDs
*/
public function getActivityIdsForSavedSearch(
Search $savedSearch,
User $user,
): array {
$requestParams = $this->buildRequestParamsFromSearch($savedSearch, $user);
$criteria = Criteria::createFromRequest(
array_merge($requestParams, [
'limit' => self::DEFAULT_TOP_ACTIVITIES_COUNT,
'page' => 1,
'sequence_number' => 1,
]),
$user->getTimezone()
);
$filterSet = $this->activitySearch->getOnDemandPageFilterSet($criteria, $user);
$activityIds = $this->elasticRepository->onDemandSearchIdsOnly($user, $criteria, $filterSet);
$this->logger->info('[AskJiminnyReport] Fetched activity IDs for saved search', [
'saved_search_id' => $savedSearch->getId(),
'user_id' => $user->getId(),
'activity_count' => count($activityIds),
]);
return $activityIds;
}
private function buildRequestParamsFromSearch(Search $savedSearch, User $user): array
{
$params = [];
$arrayFilterKeys = $this->activitySearch->getArrayFilterKeys($user);
foreach ($savedSearch->getFilters() as $filter) {
$key = $filter->getFilterProperty();
$value = $filter->getFilterValue();
if (in_array($key, self::DATE_FILTER_KEYS, true)) {
continue;
}
if (isset($params[$key])) {
$params[$key][] = $value;
} elseif (in_array($key, $arrayFilterKeys, true)) {
$params[$key] = [$value];
} else {
$params[$key] = $value;
}
}
return $params;
}
}
Execute
Explain Plan
Browse Query History
View Parameters
Open Query Execution Settings…
In-Editor Results
Tx: Auto
Cancel Running Statements
Playground
jiminny
Sync Changes
Hide This Notification
Code changed:
Hide
27
9
23
3
105
Previous Highlighted Error
Next Highlighted Error
SELECT * FROM team_features where team_id = 1;
SELECT * FROM teams WHERE name LIKE '%Vixio%'; # 340,270,11922
SELECT * FROM users WHERE team_id = 340; # 12015
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 340
and sa.provider = 'salesforce';
# and sa.provider = 'salesloft';
select * from crm_fields where crm_configuration_id = 270 and object_type = 'event';
# 125558 - Event Type - Event_Type__c
# 125552 - Event Status - Event_Status__c
SELECT * FROM sidekick_settings WHERE team_id = 340;
SELECT * FROM crm_field_values WHERE crm_field_id in (125552);
select * from activities where crm_configuration_id = 270
and type = 'conference' and crm_provider_id IS NOT NULL
and actual_start_time > '2024-09-16 09:00:00' order by scheduled_start_time;
SELECT * FROM activities WHERE id = 20871677;
SELECT * FROM crm_field_data WHERE activity_id = 20871677;
select * from crm_layouts where crm_configuration_id = 270;
select * from crm_layout_entities where crm_layout_id in (886,887);
SELECT * FROM crm_configurations WHERE id = 270;
select * from playbooks where team_id = 340; # 1514
select * from groups where team_id = 340;
SELECT * FROM crm_fields WHERE id IN (125393, 125401);
select g.name as 'team name', p.name as 'playbook name', f.label as 'activity type field' from groups g
join playbooks p on g.playbook_id = p.id
join crm_fields f on p.activity_field_id = f.id
where g.team_id = 340;
SELECT * FROM activities WHERE uuid_to_bin('0c180357-67d2-419e-a8c3-b832a3490770') = uuid; # 20448716
select * from crm_field_data where object_id = 20448716;
select * from activities where crm_configuration_id = 270 and provider = 'salesloft' order by id desc;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%CybSafe%'; # 343,273,12008
select * from opportunities where team_id = 343;
select * from opportunities where team_id = 343 and crm_provider_id = '18099102526';
select * from opportunities where team_id = 343 and account_id = 945217482;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 343
and sa.provider = 'hubspot';
select * from accounts where team_id = 343 order by name asc;
select * from stages where crm_configuration_id = 273 and type = 'opportunity';
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Voyado%'; # 353,283,12143
SELECT * FROM activities WHERE crm_configuration_id = 283 and account_id = 3777844 order by id desc;
SELECT * FROM accounts WHERE team_id = 353 AND name LIKE '%Salesloft%';
SELECT * FROM activities WHERE id = 20717903;
select * from participants where activity_id IN (20929172,20928605,20928468,20926272,20926271,20926270,20926269,20916499,20916454,20916436,20916435,20900015,20900014,20900013,20897312,20897243,20897241,20897237,20897232,20897229,20893648,20893231,20893230,20893229,20893228,20889784,20885039,20885038,20885037,20885036,20885035,20882728,20882708,20882703,20882702,20869828,20869811,20869806,20869801,20869799,20869798,20869796,20869795,20869794,20869761,20869760,20869759,20868688,20868687,20850340,20847195,20841710,20833967,20827021,20825307,20825305,20825297,20824615,20824400,20823927,20821760,20795588,20794233,20794057,20793710,20785811,20781789,20781394,20781307,20762651,20758453,20758282,20757323,20756643,20756636,20756629,20756627,20756606,20756605,20756604,20756603,20756602,20756600,20756599,20756598,20756595,20756594,20756589,20756587,20756577,20756573,20748918,20748386,20748385,20748384,20748383,20748382,20748381,20748380,20748379,20748377,20748375,20748373,20743301,20717905,20717904,20717903,20717901,20717899);
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 353
and sa.provider = 'salesforce';
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%modern world business solutions%'; # 345,275,12016, [EMAIL]
SELECT * FROM activities WHERE uuid_to_bin('3921d399-3fef-4609-a291-b0097a166d43') = uuid;
# id: 20940638, user: 12022, contact: 5305871
SELECT * FROM activity_summary_logs WHERE activity_id = 20940638;
select * from contacts where team_id = 345 and crm_provider_id = '30891432415' order by name asc; # 5305871
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 345
and sa.provider = 'hubspot';
select * from users where team_id = 345 and id = 12022;
SELECT * FROM crm_profiles WHERE user_id = 12022;
SELECT * FROM participants WHERE activity_id = 20940638;
SELECT * FROM users u
JOIN crm_profiles cp ON u.id = cp.user_id
WHERE u.team_id = 345;
select * from contacts where team_id = 345 and crm_provider_id = '30880813535' order by name desc; # 5305871
select * from team_features where team_id = 345;
SELECT * FROM activities WHERE uuid_to_bin('11701e2d-2f82-4dab-a616-1db4fad238df') = uuid; # 21115197
SELECT * FROM participants WHERE activity_id = 20897406;
SELECT * FROM activities WHERE uuid_to_bin('63ba55cd-1abc-447d-83da-0137000005b7') = uuid; # 20953912
SELECT * FROM activities WHERE crm_configuration_id = 275 and provider = 'ringcentral' and title like '%1252629100%';
SELECT * FROM activities WHERE id = 20946641;
SELECT * FROM crm_profiles WHERE user_id = 10211;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Lunio%'; # 120,97,10984, [EMAIL]
SELECT * FROM opportunities WHERE crm_configuration_id = 97 and crm_provider_id = '006N1000006c5PpIAI';
select * from stages where crm_configuration_id = 97 and type = 'opportunity';
select * from opportunities where team_id = 120;
select * from crm_configurations crm join teams t on crm.id = t.crm_id
where 1=1
AND t.current_billing_plan IS NOT NULL
AND crm.auto_sync_activity = 0
and crm.provider = 'hubspot';
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Exclaimer%'; # 270,205,10053,[EMAIL]
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 270
and sa.provider = 'salesforce';
SELECT * FROM activities WHERE uuid_to_bin('b54df794-2a9a-4957-8d80-09a600ead5f8') = uuid; # 21637956
SELECT * FROM crm_profiles WHERE user_id = 11446;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Cygnetise%'; # 372,300,12554, [EMAIL]
select * from playbooks where team_id = 372;
select * from crm_fields where crm_configuration_id = 300 and object_type = 'event'; # 141340
SELECT * FROM crm_field_values WHERE crm_field_id = 141340;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 372
and sa.provider = 'salesforce';
select * from crm_profiles where crm_configuration_id = 300;
SELECT * FROM crm_configurations WHERE team_id = 372;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Planday%'; # 291,242,11501,[EMAIL]
SELECT * FROM opportunities WHERE team_id = 291 and crm_provider_id = '006bG000005DO86QAG'; # 3207756
select * from crm_field_data where object_id = 3207756;
SELECT * FROM crm_fields WHERE id = 111834;
select f.id, f.crm_provider_id AS field_name, f.label, fd.object_id AS dealId, fd.value
FROM crm_fields f
JOIN crm_field_data fd ON f.id = fd.crm_field_id
WHERE f.crm_configuration_id = 242
AND f.object_type = 'opportunity'
AND fd.object_id IN (3207756)
ORDER BY fd.object_id, fd.updated_at;
SELECT * FROM crm_configurations WHERE auto_connect = 1;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Tour%'; # 187,209,8150,[EMAIL]
select * from group_deal_risk_types drgt join groups g on drgt.group_id = g.id
where g.team_id = 187;
select * from `groups` where team_id = 187;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 187
and sa.provider = 'salesforce';
# Destination - 98870 - Destination__c
# Stage - 79014 - StageName
# Land Arrangement - 98856 - Land_Arrangement__c
# Flight - 98848 - Flight__c
# Last activity date - 98812 - LastActivityDate
# Last modified date - 98809 - LastModifiedDate
# Last inbound mail timestamp - 99151 - Last_Inbound_Mail_Timestamp__c
# next call - 98864 - Next_Call__c
select * from crm_fields where crm_configuration_id = 209 and object_type = 'opportunity';
SELECT * FROM crm_layouts WHERE crm_configuration_id = 209;
SELECT * FROM crm_layout_entities WHERE crm_layout_id = 682;
select * from opportunities where team_id = 187 and name LIKE'%Muriel Sal%';
select * from opportunities where team_id = 187 and user_id = 9951 and is_closed = 0;
select * from activities where opportunity_id = 3538248;
SELECT * FROM crm_profiles WHERE user_id = 8150;
select * from deal_risks where opportunity_id = 3538248;
select * from teams where crm_id IS NULL;
SELECT opp.id AS opportunity_id,
u.group_id AS group_id,
MAX(
CASE
WHEN a.type IN ("sms-inbound", "sms-outbound") THEN a.created_at
ELSE a.actual_end_time
END) as last_date
FROM opportunities opp
left join activities a on a.opportunity_id = opp.id
inner join users u on opp.user_id = u.id
where opp.user_id IN (9951)
AND opp.is_closed = 0
and a.status IN ('completed', 'received', 'delivered') OR a.status IS NULL
group by opp.id;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Cybsafe%'; # 343,301,12008,[EMAIL]
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 343
and sa.provider = 'hubspot';
SELECT * FROM crm_profiles WHERE crm_configuration_id = 301;
SELECT * FROM contacts WHERE id = 6612363;
SELECT * FROM accounts WHERE id = 4235676;
SELECT * FROM opportunities WHERE crm_configuration_id = 301 and crm_provider_id = 32983784868;
select * from opportunity_stages where opportunity_id = 4503759;
# SELECT * FROM opportunities WHERE id = 4569937;
select * from activities where crm_configuration_id = 301;
SELECT * FROM activities WHERE uuid_to_bin('d3b2b28b-c3d0-4c2d-8ed0-eef42855278a') = uuid; # 26330370
SELECT * FROM participants WHERE activity_id = 26330370;
SELECT * FROM teams WHERE id = 375;
select * from playbooks where team_id = 375;
select * from stages where crm_configuration_id = 301 and type = 'opportunity';
select * from teams;
select * from contact_roles;
SELECT * FROM opportunities WHERE team_id = 343 and user_id = 12871 and close_date >= '2024-11-01';
select * from users u join crm_profiles cp on cp.user_id = u.id where u.team_id = 343;
SELECT * FROM crm_field_data WHERE object_id = 3771706;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 343
and sa.provider = 'hubspot';
SELECT * FROM crm_fields WHERE crm_configuration_id = 301 and object_type = 'opportunity'
and crm_provider_id LIKE "%traffic_light%";
SELECT * FROM crm_field_values WHERE crm_field_id IN (144020,144048,144111,144113,144126,144481,144508,144531);
SELECT fd.* FROM opportunities o
JOIN crm_field_data fd ON o.id = fd.object_id
WHERE o.team_id = 343
# and o.user_id IS NOT NULL
and fd.crm_field_id IN (144020,144048,144111,144113,144126,144481,144508,144531)
and fd.value != ''
order by value desc
# group by o.id
;
SELECT * FROM opportunities WHERE id = 3769843;
SELECT * FROM teams WHERE name LIKE '%Tour%'; # 187,209,8150, [EMAIL]
SELECT * FROM crm_layouts WHERE crm_configuration_id = 209;
SELECT * FROM crm_layout_entities WHERE crm_layout_id = 682;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Funding Circle%'; # 220,177,8603,[EMAIL]
SELECT * FROM activities WHERE uuid_to_bin('7a40e99b-3b37-4bb1-b983-325b81801c01') = uuid; # 23139839
SELECT * FROM opportunities WHERE id = 3855992;
SELECT * FROM users WHERE name LIKE '%Angus Pollard%'; # 8988
SELECT * FROM teams WHERE name LIKE '%Story Terrace%'; # 379, 307, 12894
SELECT * FROM crm_fields WHERE crm_configuration_id = 307 and object_type != 'opportunity';
select * from contacts where team_id = 379 and name like '%bebro%'; # 5874411, crm: 77229348507
SELECT * FROM crm_field_data WHERE object_id = 5874411;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 379
and sa.provider = 'hubspot';
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%mentio%'; # 117, 94, 6371, [EMAIL]
SELECT * FROM activities WHERE uuid_to_bin('82939311-1af0-4506-8546-21e8d1fdf2c1') = uuid;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Tourlane%'; # 187, 209, 8150, [EMAIL]
SELECT * FROM opportunities WHERE team_id = 187 and crm_provider_id = '006Se000008xfvNIAQ'; # 3537793
select * from generic_ai_prompts where subject_id = 3537793;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Lunio%'; # 120, 97, 10984, [EMAIL]
SELECT * FROM crm_configurations WHERE id = 97;
SELECT * FROM crm_layouts WHERE crm_configuration_id = 97;
SELECT * FROM crm_layout_entities WHERE crm_layout_id = 355;
SELECT * FROM crm_fields WHERE id = 32682;
select cfd.value, o.* from opportunities o
join crm_field_data cfd on o.id = cfd.object_id and cfd.crm_field_id = 32682
where team_id = 120
and cfd.value != ''
;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 120
and sa.provider = 'salesforce';
select * from opportunities where team_id = 120 and crm_provider_id = '006N1000007X8MAIA0';
SELECT * FROM crm_field_data WHERE object_id = 2313439;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE id = 410;
SELECT * FROM teams WHERE name LIKE '%Local Business Oxford%';
select * from scorecards where team_id = 410;
select * from scorecard_rules;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Funding%'; # 220, 177, 8603, [EMAIL]
select * from activities a
join opportunities o on a.opportunity_id = o.id
join users u on o.user_id = u.id
where a.crm_configuration_id = 177 and a.type LIKE '%email-out%'
# and a.actual_end_time > '2024-12-16 00:00:00'
# and o.remotely_created_at > '2024-12-01 00:00:00'
# and u.group_id = 1014
and u.id = 9021
order by a.id desc;
SELECT * FROM opportunities WHERE id in (3981384,4017346);
SELECT * FROM users WHERE team_id = 220 and id IN (8775, 11435);
select * from users where id = 9021;
select * from inboxes where user_id = 9021;
select * from inbox_emails where inbox_id = 1349 and email_date > '2024-12-18 00:00:00';
select * from email_messages where team_id = 220
and orig_date > '2024-12-16 00:00:00' and orig_date < '2024-12-19 00:00:00'
and subject LIKE '%Personal%'
# and 'from' = '[EMAIL]'
;
select * from activities a
join opportunities o on a.opportunity_id = o.id
where a.user_id = 9021 and a.type LIKE '%email-out%'
and a.actual_end_time > '2024-12-18 00:00:00'
and o.user_id IS NOT NULL
and o.remotely_created_at > '2024-12-01 00:00:00'
order by a.id desc;
SELECT * FROM opportunities WHERE team_id = 220 and name LIKE '%Right Car move Limited%' and id = 3966852;
select * from activities where crm_configuration_id = 177 and type LIKE '%email%' and opportunity_id = 3966852 order by id desc;
select * from team_settings where name IN ('useCloseDate');
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Hurree%'; # 104, 81, 6175, [EMAIL]
SELECT * FROM opportunities WHERE team_id = 104 and name = 'PropOp';
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 104
and sa.provider = 'hubspot';
select * from crm_configurations where last_synced_at > '2025-01-19 01:00:00'
select * from teams where crm_id IS NULL;
select t.name as 'team', u.name as 'owner', u.email, u.phone
from teams t
join activity_providers ap on t.id = ap.team_id
join users u on t.owner_id = u.id
where 1=1
and t.status = 'active'
and ap.is_enabled = 1
# and u.status = 1
and ap.provider = 'ms-teams';
select * from crm_configurations where provider = 'bullhorn'; # 344
SELECT * FROM teams WHERE id = 442; # 14293
select * from users where team_id = 442;
select * from social_accounts sa where sa.sociable_id = 14293;
select * from invitations where team_id = 442;
# [PASSWORD_DOTS]
SELECT * FROM users WHERE email LIKE '%[EMAIL]%'; # 14022
SELECT * FROM teams WHERE id = 429;
select * from opportunities where team_id = 429 and crm_provider_id IN (16157415775, 22246219645);
select * from activities where opportunity_id in (4340436,4353519);
select * from transcription where activity_id IN (25630961,25381771);
select * from generic_ai_prompts where subject_id IN (4353519);
SELECT
a.id as activity_id,
a.opportunity_id,
a.type as activity_type,
a.language,
CONCAT(a.title, a.description) AS mail_content,
e.from AS mail_from,
e.to AS mail_to,
e.subject AS mail_subject,
e.body AS mail_body,
p.type as prompt_type,
p.status as prompt_status,
p.content AS prompt_content,
a.actual_start_time as created_at
FROM activities a
LEFT JOIN ai_prompts p ON a.transcription_id = p.transcription_id AND p.deleted_at IS NULL
LEFT JOIN email_messages e ON a.id = e.activity_id
WHERE a.actual_start_time > '2024-01-01 00:00:00'
AND a.opportunity_id IN (4353519)
AND a.status IN ('completed', 'received', 'delivered')
AND a.deleted_at IS NULL
AND a.type NOT IN ('sms-inbound', 'sms-outbound')
ORDER BY a.opportunity_id ASC, a.id ASC;
SELECT * FROM users WHERE name LIKE '%George Fierstone%'; # 14293
SELECT * FROM teams WHERE id = 442;
SELECT * FROM crm_configurations WHERE id = 344;
select * from team_features where team_id = 442;
select * from groups where team_id = 442;
select * from playbooks where team_id = 442;
select * from playbook_categories where playbook_id = 1729;
select * from crm_fields where crm_configuration_id = 344 and id = 172024;
SELECT * FROM crm_field_values WHERE crm_field_id = 172024;
select * from crm_layouts where crm_configuration_id = 344;
select * from playbook_layouts where playbook_id = 1729;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Learning%'; # 260, 221, 9444
select s.*
# , s.sent_at, u.name, a.*
from activity_summary_logs s
inner join activities a on a.id = s.activity_id
inner join users u on u.id = a.user_id
where a.crm_configuration_id = 356
and s.sent_at > date_sub(now(), interval 60 day)
order by a.actual_end_time desc;
select * from activities a
# inner join activity_summary_logs s on s.activity_id = a.id
where a.crm_configuration_id = 356 and a.actual_end_time > date_sub(now(), interval 60 day)
# and a.crm_provider_id is not null
# and provider <> 'ringcentral'
and status = 'completed'
order by a.actual_end_time desc;
select * from teams order by id desc; # 17328, 32, 17830, [EMAIL]
SELECT * FROM users;
SELECT * FROM users where team_id = 260 and status = 1; # 201 - 150 active
SELECT * FROM teams WHERE id = 260;
select * from team_settings where team_id = 260;
select * from crm_configurations where team_id = 260;
SELECT * FROM crm_layouts WHERE crm_configuration_id = 356;
SELECT * FROM crm_layout_entities WHERE crm_layout_id = 1184;
select * from accounts where crm_configuration_id = 221 order by id desc; # 7000
select * from leads where crm_configuration_id = 221 order by id desc; # 0
select * from contacts where crm_configuration_id = 221 order by id desc; # 200 000
select * from opportunities where crm_configuration_id = 221 order by id desc; # 0
select * from crm_profiles where crm_configuration_id = 221 order by id desc; # 23
select * from crm_fields where crm_configuration_id = 221;
select * from crm_field_values where crm_field_id = 5302 order by id desc;
select * from crm_layouts where crm_configuration_id = 221 order by id desc;
select * from stages where crm_configuration_id = 221 order by id desc;
select * from accounts where crm_configuration_id = 356 order by id desc; # 7000
select * from leads where crm_configuration_id = 356 order by id desc; # 0
select * from contacts where crm_configuration_id = 356 order by id desc; # 200 000
select * from opportunities where crm_configuration_id = 356 order by id desc; # 0
select * from crm_profiles where crm_configuration_id = 356 order by id desc; # 23
select * from crm_fields where crm_configuration_id = 356;
select * from crm_field_values where crm_field_id = 5302 order by id desc;
select * from crm_layouts where crm_configuration_id = 356 order by id desc;
select * from stages where crm_configuration_id = 356 order by id desc;
select * from playbooks where team_id = 260 order by id desc; # 4 (2 deleted)
select * from groups where team_id = 260 order by id desc; # 27 groups, (2 deleted)
select * from playbook_layouts where playbook_id IN (1410,1409,1276,1254); # 4
select ce.* from calendars c
join users u on c.user_id = u.id
join calendar_events ce on c.id = ce.calendar_id
where u.team_id = 260
and (ce.start_time > '2025-02-21 00:00:00')
;
# calendar events 1207
#
select * from opportunities where team_id = 260;
SELECT * FROM crm_field_data WHERE object_id = 4696496;
select * from activities where crm_configuration_id = 356 and crm_provider_id IS NOT NULL;
select * from activities where crm_configuration_id IN (221) and provider NOT IN ('ms-teams', 'uploader', 'zoom-bot')
# and type = 'conference' and status = 'scheduled' and activities.is_internal = 0
and created_at > '2024-03-01 00:00:00'
order by id desc; # 880 000, ringcentral, avaya
SELECT * FROM participants WHERE activity_id = 26371744;
# all activities 942 000 +
# conference 7385 - scheduled 984 - external 343
select * from activities where id = 26321812;
select * from participants where activity_id = 26321812;
select * from participants where activity_id in (26414510,26414514,26414516,26414604,26414653,26414655);
select * from leads where id in (720428,689175,731546,645866,621037);
select * from users where id = 13841;
select * from opportunities where user_id = 9541;
select * from stages where id = 15900;
select * from accounts where
# id IN (4160055,5053725,4965303,4896434)
id in (4584518,3249934,3218025,3891133,3399450,4172999,4485161,3101785,4587203,3070816,2870343,2870341,3563940,4550846,3424464,3249963,2870342)
;
select * from activities where id = 26654935;
SELECT * FROM opportunities WHERE id = 4803458;
SELECT * FROM opportunities where team_id = 260 and user_id = 13841 AND stage_id = 15900;
SELECT id, uuid, provider, type, lead_id, account_id, contact_id, opportunity_id, stage_id, status, recording_state, title, actual_start_time, actual_end_time
FROM activities WHERE user_id = 13841 AND opportunity_id IN (4729783, 4731717, 4731726, 4732064, 4732849, 4803458, 4813213);
SELECT DISTINCT
o.id, o.stage_id, s.name, a.title,
a.*
FROM activities a
# INNER JOIN tracks t ON a.id = t.activity_id
INNER JOIN users u ON a.user_id = u.id
INNER JOIN teams team ON u.team_id = team.id
INNER JOIN groups g ON u.group_id = g.id
INNER JOIN opportunities o ON a.opportunity_id = o.id
INNER JOIN stages s ON o.stage_id = s.id
WHERE
a.crm_configuration_id = 356
AND a.status IN ('completed', 'failed')
AND a.recording_state != 'stopped'
# and a.user_id = 13841
AND u.uuid = uuid_to_bin('6f40e4b8-c340-4059-b4ac-1728e87ea99e')
AND team.uuid = uuid_to_bin('a607fba7-452e-4683-b2af-00d6cb52c93c')
AND g.uuid = uuid_to_bin('b5d69e40-24a0-4c16-810b-5fa462299f94')
AND a.type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')
# AND t.type IN ('audio', 'video')
AND (
(a.actual_start_time BETWEEN '2025-03-13 00:00:00' AND '2025-03-18 07:59:59')
OR
(
a.actual_start_time IS NULL
AND a.type IN ('sms-outbound', 'sms-inbound')
AND a.created_at BETWEEN '2025-03-13 00:00:00' AND '2025-03-18 07:59:59'
)
)
AND (
a.is_private = 0
OR (
a.is_private = 1
AND u.uuid = uuid_to_bin('6f40e4b8-c340-4059-b4ac-1728e87ea99e')
)
)
AND (
# s.id = 15900
s.uuid = uuid_to_bin('04ca1c26-c666-4268-a129-419c0acffd73')
OR s.uuid IS NULL -- Include records without opportunity stage
)
ORDER BY a.actual_end_time DESC;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Lead Forensics%'; # 190, 162, 8474, [EMAIL]
SELECT * FROM users WHERE team_id = 190;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 190
and sa.provider = 'hubspot';
select * from role_user where user_id = 8474;
select * from crm_configurations where provider = 'bullhorn';
SELECT * FROM opportunities WHERE uuid_to_bin('94578249-65ec-4205-90f2-7d1a7d5ab64a') = uuid;
SELECT * FROM users WHERE uuid_to_bin('26dbadeb-926f-4150-b11b-771b9d4c2f9a') = uuid;
SELECT * FROM opportunities WHERE id = 4732493;
select * from activities where opportunity_id = 4732493;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE id = 443; # 358, 14315, [EMAIL]
SELECT * FROM opportunities WHERE team_id = 443;
SELECT a.id, a.type, a.user_id, a.status, a.deleted_at, u.name, u.email, u.team_id as activity_team_id, u.status, u.deleted_at, t.name, t.status, s.team_id as stage_team_id
FROM activities AS a
JOIN stages AS s ON a.stage_id = s.id
JOIN users AS u ON u.id = a.user_id
JOIN teams AS t ON t.id = s.team_id
WHERE u.team_id <> s.team_id and t.id > 135;
SELECT
crm_configuration_id,
crm_provider_id,
COUNT(*) as duplicate_count,
GROUP_CONCAT(id) as stage_ids,
GROUP_CONCAT(name) as stage_names
FROM stages
GROUP BY crm_configuration_id, crm_provider_id
HAVING COUNT(*) > 1
ORDER BY duplicate_count DESC;
select * from stages where id IN (14898,14907);
select * from business_processes;
SELECT *
FROM crm_configurations
WHERE team_id IN (
SELECT team_id
FROM crm_configurations
GROUP BY team_id
HAVING COUNT(*) > 1
)
ORDER BY team_id;
SELECT *
FROM teams
WHERE crm_id IN (
SELECT crm_id
FROM teams
GROUP BY crm_id
HAVING COUNT(*) > 1
)
ORDER BY crm_id;
# [PASSWORD_DOTS]
select * from crm_configurations where provider = 'integration-app';
SELECT * FROM teams WHERE id = 443; # Correre Naturale 358 14315 [EMAIL]
select * from activities where crm_configuration_id = 358 order by actual_end_time desc;
select id, uuid, actual_end_time, crm_provider_id, is_internal, playbook_category_id, type, user_id, lead_id, contact_id, account_id, opportunity_id, status, title from activities where crm_configuration_id = 358 order by actual_end_time desc;
select * from team_features where team_id = 358;
select * from activity_summary_logs;
select * from teams where id = 406;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Sportfive%'; # 267, 202, 14637, [EMAIL]
select * from activities where crm_configuration_id = 202 order by actual_end_time desc;
SELECT * FROM users where id = 14637;
SELECT * FROM teams where id = 267;
SELECT * FROM groups where id = 1118;
select g.name, a.title, uuid_from_bin(a.uuid), a.external_id, a.status, a.recording_state, a.recording_reason_code, a.scheduled_start_time, a.scheduled_end_time, a.actual_start_time, a.actual_end_time from activities a
inner join users u on u.id = a.user_id
inner join groups g on g.id = u.group_id
where a.crm_configuration_id = 202
and a.is_internal = 0
and (a.scheduled_start_time between '2025-03-19 00:00:00' and '2025-03-21 00:00:00')
and a.type = 'conference'
and a.status != 'completed'
and a.external_id is not null
order by a.scheduled_start_time desc;
SELECT * FROM activities
WHERE crm_configuration_id = 202
AND status IN ('completed', 'failed')
AND recording_state != 'stopped'
AND type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')
AND (is_private = 0 OR user_id = 14637)
AND (
(
actual_start_time BETWEEN '2025-03-12 12:00:00' AND '2025-03-24 11:59:59'
) OR (
actual_start_time IS NULL
AND type IN ('sms-outbound', 'sms-inbound')
AND created_at BETWEEN '2025-03-12 12:00:00' AND '2025-03-24 11:59:59'
)
)
AND NOT EXISTS (
SELECT 1
FROM tracks
WHERE
tracks.activity_id = activities.id
AND tracks.type IN ('audio', 'video')
)
ORDER BY actual_end_time DESC;
SELECT DISTINCT
a.*
FROM activities a
INNER JOIN tracks t ON a.id = t.activity_id
INNER JOIN users u ON a.user_id = u.id
INNER JOIN teams team ON u.team_id = team.id
WHERE
a.crm_configuration_id = 202
AND a.status IN ('completed', 'failed')
AND a.recording_state != 'stopped'
# and a.user_id = 14637
AND a.type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')
# AND t.type IN ('audio', 'video')
AND (
(a.actual_start_time BETWEEN '2025-03-12 12:00:00' AND '2025-03-24 11:59:59')
OR
(
a.actual_start_time IS NULL
AND a.type IN ('sms-outbound', 'sms-inbound')
AND a.created_at BETWEEN '2025-03-12 12:00:00' AND '2025-03-24 11:59:59'
)
)
AND (
a.is_private = 0
OR (
a.is_private = 1
AND a.user_id = 14637
)
)
ORDER BY a.actual_end_time DESC
;
SELECT DISTINCT a.*
FROM activities a
INNER JOIN users u ON a.user_id = u.id
INNER JOIN teams t ON u.team_id = t.id
# INNER JOIN tracks tr ON a.id = tr.activity_id
# INNER JOIN groups g ON u.group_id = g.id
WHERE 1=1
AND t.id = 267
# AND t.uuid = uuid_to_bin('aed4927b-f1ea-499e-94c3-83762fd233e8')
AND a.status IN ('completed', 'failed')
AND a.recording_state != 'stopped'
AND a.type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')
# AND tr.type NOT IN ('audio', 'video')
AND (
a.is_private = 0
OR a.user_id = 14637
)
AND (
(a.actual_start_time BETWEEN '2025-03-19 00:00:00' AND '2025-03-21 23:59:59')
OR (
a.actual_start_time IS NULL
AND a.type IN ('sms-outbound', 'sms-inbound')
AND a.created_at BETWEEN '2025-03-19 00:00:00' AND '2025-03-21 23:59:59'
)
)
# and NOT EXISTS (
# SELECT 1
# FROM tracks t
# WHERE t.activity_id = a.id
# AND t.type IN ('audio', 'video')
# )
ORDER BY a.actual_end_time DESC;
SELECT * FROM tracks WHERE activity_id = 26485995;
select a.is_private, a.title, uuid_from_bin(a.uuid), a.external_id, a.status, a.recording_state, a.recording_reason_code, a.scheduled_start_time, a.scheduled_end_time, a.actual_start_time, a.actual_end_time from activities a
inner join users u on u.id = a.user_id
where a.crm_configuration_id = 202
# and a.is_internal = 0
and (a.actual_start_time between '2025-03-19 00:00:00' and '2025-03-21 00:00:00')
and a.type IN ("softphone","softphone-inbound","conference","sms-inbound")
and a.status IN ('completed', 'failed')
# and a.external_id is not null
order by a.actual_end_time desc;
select * from activities a where a.crm_configuration_id = 202
and a.actual_start_time between '2025-03-20 00:00:00' and '2025-03-21 00:00:00'
# AND a.type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')
select g.name, a.title, uuid_from_bin(a.uuid), a.external_id, a.status, a.recording_state, a.recording_reason_code, a.scheduled_start_time, a.scheduled_end_time, a.actual_start_time, a.actual_end_time from activities a
inner join users u on u.id = a.user_id
inner join groups g on g.id = u.group_id
where a.crm_configuration_id = 202
and a.is_internal = 0
and (a.scheduled_start_time between '2025-03-19 00:00:00' and '2025-03-21 00:00:00')
and a.type = 'conference'
and a.status != 'completed'
and a.external_id is not null
order by a.scheduled_start_time desc;
SELECT * FROM teams WHERE name LIKE '%Tourlane%';
SELECT * FROM crm_fields WHERE crm_configuration_id = 209 and object_type = 'opportunity';
SELECT * FROM crm_field_data WHERE crm_field_id = 98809;
select * from users where status = 1 AND timezone = 'MDT';
select * from opportunities where id = 3769814;
select * from deal_risks where opportunity_id = 3769814;
select cp.* from crm_profiles cp
join users u on cp.user_id = u.id
join crm_configurations crm on cp.crm_configuration_id = crm.id
where crm.provider = 'hubspot' AND u.status = 1 AND log_notes != 'none';
select * from crm_fields where id = 154575;
select * from team_features where feature = 'SUPPORTS_SYNC_MISSING_CALL_DISPOSITIONS';
SELECT * FROM teams WHERE id = 176; # crm 148
select * from activities where crm_configuration_id = 148 and provider = 'hubspot' order by id desc;
select * from activity_providers where provider = 'amazon-connect';
select * from crm_fields cf
join crm_configurations crm on crm.id = cf.crm_configuration_id
where crm.provider = 'hubspot' and cf.object_type IN ('account', 'contact');
# [PASSWORD_DOTS]
SELECT * FROM users WHERE id IN (15415, 15418);
SELECT * FROM groups WHERE id IN (1805,1806);
SELECT * FROM playbooks WHERE id = 1860;
SELECT * FROM playbook_categories WHERE id = 38634;
SELECT * FROM crm_fields WHERE id = 189962;
SELECT * FROM teams WHERE name = 'Pulsar Group'; # 472, 380, 15138 [EMAIL]
SELECT * FROM crm_profiles WHERE user_id = 15415;
SELECT * FROM social_accounts WHERE sociable_id = 15415 and provider = 'salesforce';
select * from sidekick_settings where team_id = 472;
SELECT * FROM activities WHERE uuid_to_bin('452c58c7-b87c-4fdd-953e-d7af185e9588') = uuid; # 28617536, user: 15418
SELECT * FROM activities WHERE uuid_to_bin('399114ee-d3a8-458c-bff5-5f654658db0a') = uuid; # 28344407, user: 15415
SELECT * FROM activities WHERE uuid_to_bin('f0aa567f-0ab1-4bbb-96aa-37dcf184676b') = uuid; # 28580288, user: 15415
SELECT * FROM activities WHERE uuid_to_bin('50c086b1-2770-4bca-b5ae-6bac22ec426b') = uuid; # 28566069, user: 15415
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%TeamTailor%'; # 109, 218, 13969, [EMAIL]
select * from crm_configurations where id = 218;
SELECT * FROM activities WHERE uuid_to_bin('e39b5857-7fdb-4f5a-951a-8d3ca69bb1b0') = uuid; # 28338765
SELECT * FROM users WHERE id IN (13232, 13230);
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 109
and sa.provider = 'salesforce';
0057R00000EPL5HQAX Inez Ekblad
1091cb81-5ea1-4951-a0ed-f00b568f0140 Triman Kaur
SELECT * FROM crm_profiles WHERE user_id IN (13232, 13230);
############################################################################################
SELECT * FROM activities WHERE uuid_to_bin('675eeaeb-5681-42db-90bc-54c07a604408') = uuid; # 28655939 00UVg00000FLvnSMAT
SELECT * FROM crm_field_data WHERE activity_id = 28655939;
SELECT * FROM crm_fields WHERE id IN (94491,94493,94498);
SELECT * FROM users WHERE id = 13658;
SELECT * FROM teams WHERE id = 109;
SELECT * FROM crm_configurations WHERE id = 218;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 109
and sa.provider = 'salesforce';
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Strengthscope%'; # 481, 390, 15420, [EMAIL]
SELECT * FROM stages WHERE crm_configuration_id = 390;
select * from business_processes where team_id = 481 and crm_configuration_id = 390;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 481
and sa.provider = 'salesforce';
SELECT * FROM users WHERE id = 15780; # team 462
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 462
and sa.provider = 'hubspot';
select * from teams where id = 495;
SELECT * FROM users WHERE id = 15794;
select * from social_accounts where sociable_id = 15794;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Flight%'; # 427, 333, 13752
SELECT * FROM accounts WHERE team_id = 427 and crm_provider_id = '668731000183444517';
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Group GTI%'; # 495, 407, 15794
SELECT * FROM activities WHERE crm_configuration_id = 407
and status = 'completed' and type = 'conference'
order by id desc;
select ru.*, pr.*, p.* from users u join role_user ru on ru.user_id = u.id
join permission_role pr on pr.role_id = ru.role_id
join permissions p on p.id = pr.permission_id
where team_id = 495 and p.name IN ('dial');
select * from permission_role;
select * from activities where crm_configuration_id = 407 and status = 'completed' order by id desc;
SELECT * FROM activities WHERE id = 29512773;
SELECT * FROM activities WHERE id IN (29042721,28991325,29002874);
SELECT al.* from activity_summary_logs al join activities a on a.id = al.activity_id
where a.crm_configuration_id = 407
# and a.id IN (29042721,28991325,29002874);
SELECT * FROM users WHERE id = 15794;
SELECT * FROM users WHERE team_id = 495;
SELECT * FROM social_accounts WHERE sociable_id = 15794;
SELECT * FROM opportunities WHERE team_id = 495 and name like '%OC:%';
SELECT * FROM contacts WHERE team_id = 495;
SELECT * FROM leads WHERE team_id = 495;
SELECT * FROM accounts WHERE team_id = 495;
SELECT * FROM crm_profiles WHERE crm_configuration_id = 407;
SELECT * FROM crm_fields WHERE crm_configuration_id = 407;
SELECT * FROM crm_configurations WHERE id = 407;
SELECT * FROM opportunities WHERE team_id = 495 and close_date BETWEEN '2025-06-01' AND '2025-07-01'
and user_id IS NOT NULL and is_closed = 1 and is_won = 1;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Hamilton Court FX LLP%'; # 249, 187, 10103
SELECT * FROM activities WHERE uuid_to_bin('4659c2bb-9a49-484e-9327-a3d66f1e028c') = uuid; # 28951064
SELECT * FROM crm_fields WHERE crm_configuration_id = 187 and object_type IN ('tasks', 'event');
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Checkstep%'; # 325, 256, 11753
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 325
and sa.provider = 'hubspot';
SELECT * FROM activities WHERE uuid_to_bin('7be372e2-1916-4d79-a2f3-ca3db1346db3') = uuid; # 28611085
SELECT * FROM activities WHERE uuid_to_bin('980f0336-840b-4185-a5a9-30cf8b0749a8') = uuid; # 28719733
SELECT * FROM activity_summary_logs where activity_id = 28719733;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Learning%'; # 260, 356, 9444
SELECT * FROM activity_summary_logs where sent_at BETWEEN '2025-06-09 11:38:00' AND '2025-06-09 11:40:00';
SELECT * FROM leads WHERE crm_configuration_id = 356 and crm_provider_id = '230045001502770504'; # 823630
select * from activities where crm_configuration_id = 356 and lead_id = 841732;
SELECT * from activity_summary_logs al join activities a on a.id = al.activity_id
where a.crm_configuration_id = 356;
select * from activities where crm_configuration_id = 356
and actual_end_time between '2025-06-09 11:00:00' and '2025-06-09 12:00:00'
order by id desc;
select * from accounts where crm_configuration_id = 356 and crm_provider_id = '230045001514403366' order by id desc;
select * from leads where crm_configuration_id = 356 and crm_provider_id = '230045001514275654' order by id desc;
select * from contacts where crm_configuration_id = 356 and crm_provider_id = '230045001514403366' order by id desc;
select * from opportunities where crm_configuration_id = 356 and crm_provider_id = '230045001514403366' order by id desc;
select * from team_features where team_id = 260;
select * from features where id IN (1,2,4,6,18,19,20,9,10,3,23,24,25,26,27);
SELECT * FROM activities WHERE uuid_to_bin('7be372e2-1916-4d79-a2f3-ca3db1346db3') = uuid;
select * from crm_fields;
select * from crm_layout_entities;
SELECT * FROM teams WHERE name LIKE '%Optable%';
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Teamtailor%'; # 109, 218, 13969
SELECT * FROM crm_configurations WHERE id = 218;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 109
and sa.provider = 'salesforce';
SELECT * FROM activities WHERE uuid_to_bin('675eeaeb-5681-42db-90bc-54c07a604408') = uuid; # 28655939
SELECT * FROM crm_field_data WHERE activity_id = 28655939;
SELECT * FROM crm_fields WHERE id in (94491,94493,94498);
select * from teams where crm_id IS NULL;
SELECT * FROM activities WHERE uuid_to_bin('71aa8a0c-9652-4ff6-bee7-d98ae60abef6') = uuid;
# [PASSWORD_DOTS]
select * from team_domains where team_id = 399;
SELECT * FROM teams WHERE name LIKE '%Rydoo%'; # 399, 318, 13207
select * from calendar_events where id = 5163781;
SELECT * FROM activities WHERE uuid_to_bin('be2cbc52-7fda-46a0-9ae0-25d9553eafc0') = uuid; # 29443896
SELECT * FROM participants WHERE activity_id = 29443896;
select * from contacts where crm_configuration_id = 318 and email = '[EMAIL]';
select * from leads where crm_configuration_id = 318 and email = '[EMAIL]';
select * from activities where user_id = 14937 order by created_at ;
select * from users where id = 14937;
select * from contacts where crm_configuration_id = 318 and email LIKE '%@strawberry.se';
select * from opportunities where crm_configuration_id = 318 and crm_provider_id = '006Sf00000D1WOAIA3';
select * from activities a join participants p on a.id = p.activity_id
where crm_configuration_id = 318 and a.updated_at > '2025-06-23T08:18:43Z';
# [PASSWORD_DOTS]
SELECT * FROM opportunities WHERE team_id = 379 and crm_provider_id = '39334518886';
SELECT * FROM opportunities WHERE team_id = 379 order by id desc;
SELECT * FROM teams WHERE id = 379;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 379 and sociable_id = 13852
and sa.provider = 'hubspot';
SELECT * FROM crm_configurations WHERE id = 307;
SELECT * FROM crm_layouts WHERE crm_configuration_id = 307;
SELECT * FROM crm_layout_entities WHERE crm_layout_id = 1027;
SELECT * FROM crm_fields WHERE crm_configuration_id = 307
and id IN (144750,144855,145158,155227);
SELECT * FROM activities;
select * from activities
where created_at > '2025-07-01 00:00:00'
# and created_at < '2025-08-01 00:00:00'
and type not in ('email-outbound', 'email-inbound')
and account_id is null
and contact_id is null
and lead_id is null
and opportunity_id is not null
;
SELECT * FROM activities WHERE id IN (25344155, 25344296, 25501909, 28692187);
SELECT * FROM crm_configurations WHERE id in (335,301,200);
select * from crm_fields where crm_configuration_id = 230 and crm_provider_id = 'Age2__c';
SELECT * FROM teams WHERE name LIKE '%Resights%';
select * from crm_fields where crm_configuration_id = 1 and object_type = 'opportunity';
select * from crm_configurations where provider = 'bullhorn'; # 344
select * from teams where id IN (442);
select * from activities
where crm_configuration_id = 177
and provider = 'amazon-connect'
order by id desc;
# and source <> 'gong';
select * from activity_providers where provider = 'amazon-connect';
SELECT * FROM activities WHERE uuid_to_bin('cec1993b-a7e5-4164-b74d-d680ea51d2f2') = uuid;
select * from crm_configurations where store_transcript = 1;
SELECT * FROM teams WHERE id IN (80);
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Sedna%'; # 277, 213, 12594
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 277
and sa.provider = 'salesforce';
selec...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"#11894 on JY-18909-automated-reports-ask-jiminny, menu","depth":5,"help_text":"Pull request #11894 exists for current branch JY-18909-automated-reports-ask-jiminny","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"RequestGenerateAskJiminnyReportJobTest","depth":6,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run 'RequestGenerateAskJiminnyReportJobTest'","depth":6,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'RequestGenerateAskJiminnyReportJobTest'","depth":6,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"More Actions","depth":6,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JetBrains AI","depth":5,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Search Everywhere","depth":5,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"IDE and Project Settings","depth":5,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.088194445,"height":0.027777778},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"2","depth":4,"role_description":"text"},{"role":"AXStaticText","text":"1","depth":4,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Services\\Kiosk\\AutomatedReports;\n\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinition\\ActivityActualDate;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinition\\ActivityUpdatedDate;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinition\\DealInsights\\ClosingPeriodFilter;\nuse Jiminny\\Component\\ActivitySearch\\Service\\ActivitySearch;\nuse Jiminny\\Models\\Activity\\Search;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Repositories\\ElasticActivityRepository;\nuse Jiminny\\VO\\Repository\\OnDemandActivitySearch\\Criteria;\nuse Psr\\Log\\LoggerInterface;\n\nclass AskJiminnyReportActivityService\n{\n private const int DEFAULT_TOP_ACTIVITIES_COUNT = 100;\n\n private const array DATE_FILTER_KEYS = [\n ActivityActualDate::PARAM_START_DATE,\n ActivityActualDate::PARAM_END_DATE,\n ActivityUpdatedDate::PARAM_UPDATED_FROM,\n ActivityUpdatedDate::PARAM_UPDATED_TO,\n ClosingPeriodFilter::KEY_START_DATE,\n ClosingPeriodFilter::KEY_END_DATE,\n ];\n\n public function __construct(\n private readonly ActivitySearch $activitySearch,\n private readonly ElasticActivityRepository $elasticRepository,\n private readonly LoggerInterface $logger,\n ) {\n }\n\n /**\n * Fetch activity IDs for a saved search, passing its filters as-is to Criteria.\n * Date filters stored on the saved search are excluded; if no other filters exist,\n * no date constraint is applied — matching the behaviour of getContextForAskAnythingByFilter.\n *\n * @return string[] Activity IDs\n */\n public function getActivityIdsForSavedSearch(\n Search $savedSearch,\n User $user,\n ): array {\n $requestParams = $this->buildRequestParamsFromSearch($savedSearch, $user);\n\n $criteria = Criteria::createFromRequest(\n array_merge($requestParams, [\n 'limit' => self::DEFAULT_TOP_ACTIVITIES_COUNT,\n 'page' => 1,\n 'sequence_number' => 1,\n ]),\n $user->getTimezone()\n );\n\n $filterSet = $this->activitySearch->getOnDemandPageFilterSet($criteria, $user);\n\n $activityIds = $this->elasticRepository->onDemandSearchIdsOnly($user, $criteria, $filterSet);\n\n $this->logger->info('[AskJiminnyReport] Fetched activity IDs for saved search', [\n 'saved_search_id' => $savedSearch->getId(),\n 'user_id' => $user->getId(),\n 'activity_count' => count($activityIds),\n ]);\n\n return $activityIds;\n }\n\n private function buildRequestParamsFromSearch(Search $savedSearch, User $user): array\n {\n $params = [];\n $arrayFilterKeys = $this->activitySearch->getArrayFilterKeys($user);\n\n foreach ($savedSearch->getFilters() as $filter) {\n $key = $filter->getFilterProperty();\n $value = $filter->getFilterValue();\n\n if (in_array($key, self::DATE_FILTER_KEYS, true)) {\n continue;\n }\n\n if (isset($params[$key])) {\n $params[$key][] = $value;\n } elseif (in_array($key, $arrayFilterKeys, true)) {\n $params[$key] = [$value];\n } else {\n $params[$key] = $value;\n }\n }\n\n return $params;\n }\n}","depth":4,"value":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Services\\Kiosk\\AutomatedReports;\n\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinition\\ActivityActualDate;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinition\\ActivityUpdatedDate;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinition\\DealInsights\\ClosingPeriodFilter;\nuse Jiminny\\Component\\ActivitySearch\\Service\\ActivitySearch;\nuse Jiminny\\Models\\Activity\\Search;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Repositories\\ElasticActivityRepository;\nuse Jiminny\\VO\\Repository\\OnDemandActivitySearch\\Criteria;\nuse Psr\\Log\\LoggerInterface;\n\nclass AskJiminnyReportActivityService\n{\n private const int DEFAULT_TOP_ACTIVITIES_COUNT = 100;\n\n private const array DATE_FILTER_KEYS = [\n ActivityActualDate::PARAM_START_DATE,\n ActivityActualDate::PARAM_END_DATE,\n ActivityUpdatedDate::PARAM_UPDATED_FROM,\n ActivityUpdatedDate::PARAM_UPDATED_TO,\n ClosingPeriodFilter::KEY_START_DATE,\n ClosingPeriodFilter::KEY_END_DATE,\n ];\n\n public function __construct(\n private readonly ActivitySearch $activitySearch,\n private readonly ElasticActivityRepository $elasticRepository,\n private readonly LoggerInterface $logger,\n ) {\n }\n\n /**\n * Fetch activity IDs for a saved search, passing its filters as-is to Criteria.\n * Date filters stored on the saved search are excluded; if no other filters exist,\n * no date constraint is applied — matching the behaviour of getContextForAskAnythingByFilter.\n *\n * @return string[] Activity IDs\n */\n public function getActivityIdsForSavedSearch(\n Search $savedSearch,\n User $user,\n ): array {\n $requestParams = $this->buildRequestParamsFromSearch($savedSearch, $user);\n\n $criteria = Criteria::createFromRequest(\n array_merge($requestParams, [\n 'limit' => self::DEFAULT_TOP_ACTIVITIES_COUNT,\n 'page' => 1,\n 'sequence_number' => 1,\n ]),\n $user->getTimezone()\n );\n\n $filterSet = $this->activitySearch->getOnDemandPageFilterSet($criteria, $user);\n\n $activityIds = $this->elasticRepository->onDemandSearchIdsOnly($user, $criteria, $filterSet);\n\n $this->logger->info('[AskJiminnyReport] Fetched activity IDs for saved search', [\n 'saved_search_id' => $savedSearch->getId(),\n 'user_id' => $user->getId(),\n 'activity_count' => count($activityIds),\n ]);\n\n return $activityIds;\n }\n\n private function buildRequestParamsFromSearch(Search $savedSearch, User $user): array\n {\n $params = [];\n $arrayFilterKeys = $this->activitySearch->getArrayFilterKeys($user);\n\n foreach ($savedSearch->getFilters() as $filter) {\n $key = $filter->getFilterProperty();\n $value = $filter->getFilterValue();\n\n if (in_array($key, self::DATE_FILTER_KEYS, true)) {\n continue;\n }\n\n if (isset($params[$key])) {\n $params[$key][] = $value;\n } elseif (in_array($key, $arrayFilterKeys, true)) {\n $params[$key] = [$value];\n } else {\n $params[$key] = $value;\n }\n }\n\n return $params;\n }\n}","role_description":"text entry area","is_enabled":true,"is_focused":true,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Execute","depth":4,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Explain Plan","depth":4,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Browse Query History","depth":4,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"View Parameters","depth":4,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Open Query Execution Settings…","depth":4,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"In-Editor Results","depth":4,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Tx: Auto","depth":4,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Cancel Running Statements","depth":4,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Playground","depth":4,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"jiminny","depth":4,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.088194445,"height":0.027777778},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"27","depth":4,"role_description":"text"},{"role":"AXStaticText","text":"9","depth":4,"role_description":"text"},{"role":"AXStaticText","text":"23","depth":4,"role_description":"text"},{"role":"AXStaticText","text":"3","depth":4,"role_description":"text"},{"role":"AXStaticText","text":"105","depth":4,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"SELECT * FROM team_features where team_id = 1;\n\nSELECT * FROM teams WHERE name LIKE '%Vixio%'; # 340,270,11922\nSELECT * FROM users WHERE team_id = 340; # 12015\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 340\nand sa.provider = 'salesforce';\n# and sa.provider = 'salesloft';\n\nselect * from crm_fields where crm_configuration_id = 270 and object_type = 'event';\n# 125558 - Event Type - Event_Type__c\n# 125552 - Event Status - Event_Status__c\n\nSELECT * FROM sidekick_settings WHERE team_id = 340;\n\nSELECT * FROM crm_field_values WHERE crm_field_id in (125552);\n\nselect * from activities where crm_configuration_id = 270\nand type = 'conference' and crm_provider_id IS NOT NULL\nand actual_start_time > '2024-09-16 09:00:00' order by scheduled_start_time;\n\nSELECT * FROM activities WHERE id = 20871677;\nSELECT * FROM crm_field_data WHERE activity_id = 20871677;\n\nselect * from crm_layouts where crm_configuration_id = 270;\nselect * from crm_layout_entities where crm_layout_id in (886,887);\n\nSELECT * FROM crm_configurations WHERE id = 270;\n\nselect * from playbooks where team_id = 340; # 1514\nselect * from groups where team_id = 340;\nSELECT * FROM crm_fields WHERE id IN (125393, 125401);\n\nselect g.name as 'team name', p.name as 'playbook name', f.label as 'activity type field' from groups g\njoin playbooks p on g.playbook_id = p.id\njoin crm_fields f on p.activity_field_id = f.id\nwhere g.team_id = 340;\n\nSELECT * FROM activities WHERE uuid_to_bin('0c180357-67d2-419e-a8c3-b832a3490770') = uuid; # 20448716\nselect * from crm_field_data where object_id = 20448716;\n\nselect * from activities where crm_configuration_id = 270 and provider = 'salesloft' order by id desc;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%CybSafe%'; # 343,273,12008\nselect * from opportunities where team_id = 343;\nselect * from opportunities where team_id = 343 and crm_provider_id = '18099102526';\nselect * from opportunities where team_id = 343 and account_id = 945217482;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 343\nand sa.provider = 'hubspot';\n\nselect * from accounts where team_id = 343 order by name asc;\n\nselect * from stages where crm_configuration_id = 273 and type = 'opportunity';\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Voyado%'; # 353,283,12143\nSELECT * FROM activities WHERE crm_configuration_id = 283 and account_id = 3777844 order by id desc;\nSELECT * FROM accounts WHERE team_id = 353 AND name LIKE '%Salesloft%';\nSELECT * FROM activities WHERE id = 20717903;\n\nselect * from participants where activity_id IN (20929172,20928605,20928468,20926272,20926271,20926270,20926269,20916499,20916454,20916436,20916435,20900015,20900014,20900013,20897312,20897243,20897241,20897237,20897232,20897229,20893648,20893231,20893230,20893229,20893228,20889784,20885039,20885038,20885037,20885036,20885035,20882728,20882708,20882703,20882702,20869828,20869811,20869806,20869801,20869799,20869798,20869796,20869795,20869794,20869761,20869760,20869759,20868688,20868687,20850340,20847195,20841710,20833967,20827021,20825307,20825305,20825297,20824615,20824400,20823927,20821760,20795588,20794233,20794057,20793710,20785811,20781789,20781394,20781307,20762651,20758453,20758282,20757323,20756643,20756636,20756629,20756627,20756606,20756605,20756604,20756603,20756602,20756600,20756599,20756598,20756595,20756594,20756589,20756587,20756577,20756573,20748918,20748386,20748385,20748384,20748383,20748382,20748381,20748380,20748379,20748377,20748375,20748373,20743301,20717905,20717904,20717903,20717901,20717899);\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 353\nand sa.provider = 'salesforce';\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%modern world business solutions%'; # 345,275,12016, l.atkinson@mwbsolutions.co.uk\nSELECT * FROM activities WHERE uuid_to_bin('3921d399-3fef-4609-a291-b0097a166d43') = uuid;\n# id: 20940638, user: 12022, contact: 5305871\nSELECT * FROM activity_summary_logs WHERE activity_id = 20940638;\nselect * from contacts where team_id = 345 and crm_provider_id = '30891432415' order by name asc; # 5305871\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 345\nand sa.provider = 'hubspot';\n\nselect * from users where team_id = 345 and id = 12022;\nSELECT * FROM crm_profiles WHERE user_id = 12022;\nSELECT * FROM participants WHERE activity_id = 20940638;\nSELECT * FROM users u\nJOIN crm_profiles cp ON u.id = cp.user_id\nWHERE u.team_id = 345;\n\nselect * from contacts where team_id = 345 and crm_provider_id = '30880813535' order by name desc; # 5305871\n\nselect * from team_features where team_id = 345;\nSELECT * FROM activities WHERE uuid_to_bin('11701e2d-2f82-4dab-a616-1db4fad238df') = uuid; # 21115197\nSELECT * FROM participants WHERE activity_id = 20897406;\n\n\n\nSELECT * FROM activities WHERE uuid_to_bin('63ba55cd-1abc-447d-83da-0137000005b7') = uuid; # 20953912\nSELECT * FROM activities WHERE crm_configuration_id = 275 and provider = 'ringcentral' and title like '%1252629100%';\n\n\nSELECT * FROM activities WHERE id = 20946641;\nSELECT * FROM crm_profiles WHERE user_id = 10211;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Lunio%'; # 120,97,10984, triger@lunio.ai\nSELECT * FROM opportunities WHERE crm_configuration_id = 97 and crm_provider_id = '006N1000006c5PpIAI';\nselect * from stages where crm_configuration_id = 97 and type = 'opportunity';\nselect * from opportunities where team_id = 120;\n\n\nselect * from crm_configurations crm join teams t on crm.id = t.crm_id\nwhere 1=1\nAND t.current_billing_plan IS NOT NULL\nAND crm.auto_sync_activity = 0\nand crm.provider = 'hubspot';\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Exclaimer%'; # 270,205,10053,james.lewendon@exclaimer.com\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 270\nand sa.provider = 'salesforce';\nSELECT * FROM activities WHERE uuid_to_bin('b54df794-2a9a-4957-8d80-09a600ead5f8') = uuid; # 21637956\nSELECT * FROM crm_profiles WHERE user_id = 11446;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Cygnetise%'; # 372,300,12554, alex.chikly@cygnetise.com\nselect * from playbooks where team_id = 372;\nselect * from crm_fields where crm_configuration_id = 300 and object_type = 'event'; # 141340\nSELECT * FROM crm_field_values WHERE crm_field_id = 141340;\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 372\nand sa.provider = 'salesforce';\n\nselect * from crm_profiles where crm_configuration_id = 300;\nSELECT * FROM crm_configurations WHERE team_id = 372;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Planday%'; # 291,242,11501,mfa@planday.com\nSELECT * FROM opportunities WHERE team_id = 291 and crm_provider_id = '006bG000005DO86QAG'; # 3207756\nselect * from crm_field_data where object_id = 3207756;\nSELECT * FROM crm_fields WHERE id = 111834;\n\nselect f.id, f.crm_provider_id AS field_name, f.label, fd.object_id AS dealId, fd.value\nFROM crm_fields f\nJOIN crm_field_data fd ON f.id = fd.crm_field_id\nWHERE f.crm_configuration_id = 242\nAND f.object_type = 'opportunity'\nAND fd.object_id IN (3207756)\nORDER BY fd.object_id, fd.updated_at;\n\nSELECT * FROM crm_configurations WHERE auto_connect = 1;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Tour%'; # 187,209,8150,salesforce-admin@tourlane.com\nselect * from group_deal_risk_types drgt join groups g on drgt.group_id = g.id\nwhere g.team_id = 187;\n\nselect * from `groups` where team_id = 187;\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 187\nand sa.provider = 'salesforce';\n\n# Destination - 98870 - Destination__c\n# Stage - 79014 - StageName\n# Land Arrangement - 98856 - Land_Arrangement__c\n# Flight - 98848 - Flight__c\n# Last activity date - 98812 - LastActivityDate\n# Last modified date - 98809 - LastModifiedDate\n# Last inbound mail timestamp - 99151 - Last_Inbound_Mail_Timestamp__c\n# next call - 98864 - Next_Call__c\n\nselect * from crm_fields where crm_configuration_id = 209 and object_type = 'opportunity';\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 209;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 682;\n\nselect * from opportunities where team_id = 187 and name LIKE'%Muriel Sal%';\nselect * from opportunities where team_id = 187 and user_id = 9951 and is_closed = 0;\nselect * from activities where opportunity_id = 3538248;\n\nSELECT * FROM crm_profiles WHERE user_id = 8150;\n\nselect * from deal_risks where opportunity_id = 3538248;\n\nselect * from teams where crm_id IS NULL;\n\nSELECT opp.id AS opportunity_id,\n u.group_id AS group_id,\n MAX(\n CASE\n WHEN a.type IN (\"sms-inbound\", \"sms-outbound\") THEN a.created_at\n ELSE a.actual_end_time\n END) as last_date\nFROM opportunities opp\nleft join activities a on a.opportunity_id = opp.id\ninner join users u on opp.user_id = u.id\nwhere opp.user_id IN (9951)\n\nAND opp.is_closed = 0\nand a.status IN ('completed', 'received', 'delivered') OR a.status IS NULL\ngroup by opp.id;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Cybsafe%'; # 343,301,12008,polly.morphew@cybsafe.com\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 343\nand sa.provider = 'hubspot';\n\nSELECT * FROM crm_profiles WHERE crm_configuration_id = 301;\nSELECT * FROM contacts WHERE id = 6612363;\nSELECT * FROM accounts WHERE id = 4235676;\nSELECT * FROM opportunities WHERE crm_configuration_id = 301 and crm_provider_id = 32983784868;\nselect * from opportunity_stages where opportunity_id = 4503759;\n# SELECT * FROM opportunities WHERE id = 4569937;\n\nselect * from activities where crm_configuration_id = 301;\nSELECT * FROM activities WHERE uuid_to_bin('d3b2b28b-c3d0-4c2d-8ed0-eef42855278a') = uuid; # 26330370\nSELECT * FROM participants WHERE activity_id = 26330370;\n\nSELECT * FROM teams WHERE id = 375;\nselect * from playbooks where team_id = 375;\n\nselect * from stages where crm_configuration_id = 301 and type = 'opportunity';\n\nselect * from teams;\nselect * from contact_roles;\n\nSELECT * FROM opportunities WHERE team_id = 343 and user_id = 12871 and close_date >= '2024-11-01';\n\nselect * from users u join crm_profiles cp on cp.user_id = u.id where u.team_id = 343;\n\nSELECT * FROM crm_field_data WHERE object_id = 3771706;\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 343\nand sa.provider = 'hubspot';\n\nSELECT * FROM crm_fields WHERE crm_configuration_id = 301 and object_type = 'opportunity'\nand crm_provider_id LIKE \"%traffic_light%\";\nSELECT * FROM crm_field_values WHERE crm_field_id IN (144020,144048,144111,144113,144126,144481,144508,144531);\n\nSELECT fd.* FROM opportunities o\nJOIN crm_field_data fd ON o.id = fd.object_id\nWHERE o.team_id = 343\n# and o.user_id IS NOT NULL\nand fd.crm_field_id IN (144020,144048,144111,144113,144126,144481,144508,144531)\nand fd.value != ''\norder by value desc\n# group by o.id\n;\n\nSELECT * FROM opportunities WHERE id = 3769843;\n\nSELECT * FROM teams WHERE name LIKE '%Tour%'; # 187,209,8150, salesforce-admin@tourlane.com\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 209;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 682;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Funding Circle%'; # 220,177,8603,aswini.mishra@fundingcircle.com\nSELECT * FROM activities WHERE uuid_to_bin('7a40e99b-3b37-4bb1-b983-325b81801c01') = uuid; # 23139839\n\n\nSELECT * FROM opportunities WHERE id = 3855992;\n\nSELECT * FROM users WHERE name LIKE '%Angus Pollard%'; # 8988\n\nSELECT * FROM teams WHERE name LIKE '%Story Terrace%'; # 379, 307, 12894\nSELECT * FROM crm_fields WHERE crm_configuration_id = 307 and object_type != 'opportunity';\n\nselect * from contacts where team_id = 379 and name like '%bebro%'; # 5874411, crm: 77229348507\nSELECT * FROM crm_field_data WHERE object_id = 5874411;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 379\nand sa.provider = 'hubspot';\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%mentio%'; # 117, 94, 6371, nikhil.kumar@mention-me.com\nSELECT * FROM activities WHERE uuid_to_bin('82939311-1af0-4506-8546-21e8d1fdf2c1') = uuid;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Tourlane%'; # 187, 209, 8150, salesforce-admin@tourlane.com\nSELECT * FROM opportunities WHERE team_id = 187 and crm_provider_id = '006Se000008xfvNIAQ'; # 3537793\nselect * from generic_ai_prompts where subject_id = 3537793;\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Lunio%'; # 120, 97, 10984, triger@lunio.ai\nSELECT * FROM crm_configurations WHERE id = 97;\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 97;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 355;\nSELECT * FROM crm_fields WHERE id = 32682;\n\nselect cfd.value, o.* from opportunities o\njoin crm_field_data cfd on o.id = cfd.object_id and cfd.crm_field_id = 32682\nwhere team_id = 120\nand cfd.value != ''\n;\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 120\nand sa.provider = 'salesforce';\n\nselect * from opportunities where team_id = 120 and crm_provider_id = '006N1000007X8MAIA0';\nSELECT * FROM crm_field_data WHERE object_id = 2313439;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE id = 410;\nSELECT * FROM teams WHERE name LIKE '%Local Business Oxford%';\nselect * from scorecards where team_id = 410;\nselect * from scorecard_rules;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Funding%'; # 220, 177, 8603, aswini.mishra@fundingcircle.com\nselect * from activities a\njoin opportunities o on a.opportunity_id = o.id\njoin users u on o.user_id = u.id\nwhere a.crm_configuration_id = 177 and a.type LIKE '%email-out%'\n# and a.actual_end_time > '2024-12-16 00:00:00'\n# and o.remotely_created_at > '2024-12-01 00:00:00'\n# and u.group_id = 1014\nand u.id = 9021\norder by a.id desc;\nSELECT * FROM opportunities WHERE id in (3981384,4017346);\nSELECT * FROM users WHERE team_id = 220 and id IN (8775, 11435);\n\nselect * from users where id = 9021;\nselect * from inboxes where user_id = 9021;\n\nselect * from inbox_emails where inbox_id = 1349 and email_date > '2024-12-18 00:00:00';\n\nselect * from email_messages where team_id = 220\nand orig_date > '2024-12-16 00:00:00' and orig_date < '2024-12-19 00:00:00'\nand subject LIKE '%Personal%'\n# and 'from' = 'credit@fundingcircle.com'\n;\n\nselect * from activities a\njoin opportunities o on a.opportunity_id = o.id\nwhere a.user_id = 9021 and a.type LIKE '%email-out%'\nand a.actual_end_time > '2024-12-18 00:00:00'\nand o.user_id IS NOT NULL\nand o.remotely_created_at > '2024-12-01 00:00:00'\norder by a.id desc;\n\nSELECT * FROM opportunities WHERE team_id = 220 and name LIKE '%Right Car move Limited%' and id = 3966852;\nselect * from activities where crm_configuration_id = 177 and type LIKE '%email%' and opportunity_id = 3966852 order by id desc;\n\nselect * from team_settings where name IN ('useCloseDate');\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Hurree%'; # 104, 81, 6175, jfarrell@hurree.co\nSELECT * FROM opportunities WHERE team_id = 104 and name = 'PropOp';\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 104\nand sa.provider = 'hubspot';\n\nselect * from crm_configurations where last_synced_at > '2025-01-19 01:00:00'\nselect * from teams where crm_id IS NULL;\n\nselect t.name as 'team', u.name as 'owner', u.email, u.phone\nfrom teams t\njoin activity_providers ap on t.id = ap.team_id\njoin users u on t.owner_id = u.id\nwhere 1=1\n and t.status = 'active'\n and ap.is_enabled = 1\n# and u.status = 1\n and ap.provider = 'ms-teams';\n\nselect * from crm_configurations where provider = 'bullhorn'; # 344\nSELECT * FROM teams WHERE id = 442; # 14293\nselect * from users where team_id = 442;\nselect * from social_accounts sa where sa.sociable_id = 14293;\nselect * from invitations where team_id = 442;\n\n# ********************************************************************************************************\nSELECT * FROM users WHERE email LIKE '%nea.liikamaa@eletive.com%'; # 14022\nSELECT * FROM teams WHERE id = 429;\nselect * from opportunities where team_id = 429 and crm_provider_id IN (16157415775, 22246219645);\nselect * from activities where opportunity_id in (4340436,4353519);\n\nselect * from transcription where activity_id IN (25630961,25381771);\nselect * from generic_ai_prompts where subject_id IN (4353519);\n\nSELECT\n a.id as activity_id,\n a.opportunity_id,\n a.type as activity_type,\n a.language,\n CONCAT(a.title, a.description) AS mail_content,\n e.from AS mail_from,\n e.to AS mail_to,\n e.subject AS mail_subject,\n e.body AS mail_body,\n p.type as prompt_type,\n p.status as prompt_status,\n p.content AS prompt_content,\n a.actual_start_time as created_at\nFROM activities a\n LEFT JOIN ai_prompts p ON a.transcription_id = p.transcription_id AND p.deleted_at IS NULL\n LEFT JOIN email_messages e ON a.id = e.activity_id\nWHERE a.actual_start_time > '2024-01-01 00:00:00'\n AND a.opportunity_id IN (4353519)\n AND a.status IN ('completed', 'received', 'delivered')\n AND a.deleted_at IS NULL\n AND a.type NOT IN ('sms-inbound', 'sms-outbound')\nORDER BY a.opportunity_id ASC, a.id ASC;\n\nSELECT * FROM users WHERE name LIKE '%George Fierstone%'; # 14293\nSELECT * FROM teams WHERE id = 442;\nSELECT * FROM crm_configurations WHERE id = 344;\nselect * from team_features where team_id = 442;\nselect * from groups where team_id = 442;\nselect * from playbooks where team_id = 442;\nselect * from playbook_categories where playbook_id = 1729;\nselect * from crm_fields where crm_configuration_id = 344 and id = 172024;\nSELECT * FROM crm_field_values WHERE crm_field_id = 172024;\nselect * from crm_layouts where crm_configuration_id = 344;\nselect * from playbook_layouts where playbook_id = 1729;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Learning%'; # 260, 221, 9444\n\nselect s.*\n# , s.sent_at, u.name, a.*\nfrom activity_summary_logs s\ninner join activities a on a.id = s.activity_id\ninner join users u on u.id = a.user_id\nwhere a.crm_configuration_id = 356\nand s.sent_at > date_sub(now(), interval 60 day)\norder by a.actual_end_time desc;\n\nselect * from activities a\n# inner join activity_summary_logs s on s.activity_id = a.id\nwhere a.crm_configuration_id = 356 and a.actual_end_time > date_sub(now(), interval 60 day)\n# and a.crm_provider_id is not null\n# and provider <> 'ringcentral'\nand status = 'completed'\norder by a.actual_end_time desc;\n\nselect * from teams order by id desc; # 17328, 32, 17830, integration-account@jiminny.com\nSELECT * FROM users;\nSELECT * FROM users where team_id = 260 and status = 1; # 201 - 150 active\nSELECT * FROM teams WHERE id = 260;\nselect * from team_settings where team_id = 260;\nselect * from crm_configurations where team_id = 260;\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 356;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1184;\n\nselect * from accounts where crm_configuration_id = 221 order by id desc; # 7000\nselect * from leads where crm_configuration_id = 221 order by id desc; # 0\nselect * from contacts where crm_configuration_id = 221 order by id desc; # 200 000\nselect * from opportunities where crm_configuration_id = 221 order by id desc; # 0\nselect * from crm_profiles where crm_configuration_id = 221 order by id desc; # 23\nselect * from crm_fields where crm_configuration_id = 221;\nselect * from crm_field_values where crm_field_id = 5302 order by id desc;\nselect * from crm_layouts where crm_configuration_id = 221 order by id desc;\nselect * from stages where crm_configuration_id = 221 order by id desc;\n\nselect * from accounts where crm_configuration_id = 356 order by id desc; # 7000\nselect * from leads where crm_configuration_id = 356 order by id desc; # 0\nselect * from contacts where crm_configuration_id = 356 order by id desc; # 200 000\nselect * from opportunities where crm_configuration_id = 356 order by id desc; # 0\nselect * from crm_profiles where crm_configuration_id = 356 order by id desc; # 23\nselect * from crm_fields where crm_configuration_id = 356;\nselect * from crm_field_values where crm_field_id = 5302 order by id desc;\nselect * from crm_layouts where crm_configuration_id = 356 order by id desc;\nselect * from stages where crm_configuration_id = 356 order by id desc;\n\nselect * from playbooks where team_id = 260 order by id desc; # 4 (2 deleted)\nselect * from groups where team_id = 260 order by id desc; # 27 groups, (2 deleted)\nselect * from playbook_layouts where playbook_id IN (1410,1409,1276,1254); # 4\nselect ce.* from calendars c\njoin users u on c.user_id = u.id\njoin calendar_events ce on c.id = ce.calendar_id\nwhere u.team_id = 260\nand (ce.start_time > '2025-02-21 00:00:00')\n;\n# calendar events 1207\n#\n\nselect * from opportunities where team_id = 260;\nSELECT * FROM crm_field_data WHERE object_id = 4696496;\n\nselect * from activities where crm_configuration_id = 356 and crm_provider_id IS NOT NULL;\nselect * from activities where crm_configuration_id IN (221) and provider NOT IN ('ms-teams', 'uploader', 'zoom-bot')\n# and type = 'conference' and status = 'scheduled' and activities.is_internal = 0\nand created_at > '2024-03-01 00:00:00'\norder by id desc; # 880 000, ringcentral, avaya\nSELECT * FROM participants WHERE activity_id = 26371744;\n\n# all activities 942 000 +\n# conference 7385 - scheduled 984 - external 343\n\nselect * from activities where id = 26321812;\nselect * from participants where activity_id = 26321812;\nselect * from participants where activity_id in (26414510,26414514,26414516,26414604,26414653,26414655);\nselect * from leads where id in (720428,689175,731546,645866,621037);\n\nselect * from users where id = 13841;\nselect * from opportunities where user_id = 9541;\nselect * from stages where id = 15900;\n\nselect * from accounts where\n# id IN (4160055,5053725,4965303,4896434)\nid in (4584518,3249934,3218025,3891133,3399450,4172999,4485161,3101785,4587203,3070816,2870343,2870341,3563940,4550846,3424464,3249963,2870342)\n;\n\nselect * from activities where id = 26654935;\nSELECT * FROM opportunities WHERE id = 4803458;\n\nSELECT * FROM opportunities where team_id = 260 and user_id = 13841 AND stage_id = 15900;\nSELECT id, uuid, provider, type, lead_id, account_id, contact_id, opportunity_id, stage_id, status, recording_state, title, actual_start_time, actual_end_time\nFROM activities WHERE user_id = 13841 AND opportunity_id IN (4729783, 4731717, 4731726, 4732064, 4732849, 4803458, 4813213);\n\nSELECT DISTINCT\n o.id, o.stage_id, s.name, a.title,\n a.*\nFROM activities a\n# INNER JOIN tracks t ON a.id = t.activity_id\nINNER JOIN users u ON a.user_id = u.id\nINNER JOIN teams team ON u.team_id = team.id\nINNER JOIN groups g ON u.group_id = g.id\nINNER JOIN opportunities o ON a.opportunity_id = o.id\nINNER JOIN stages s ON o.stage_id = s.id\nWHERE\n a.crm_configuration_id = 356\n AND a.status IN ('completed', 'failed')\n AND a.recording_state != 'stopped'\n# and a.user_id = 13841\n AND u.uuid = uuid_to_bin('6f40e4b8-c340-4059-b4ac-1728e87ea99e')\n AND team.uuid = uuid_to_bin('a607fba7-452e-4683-b2af-00d6cb52c93c')\n AND g.uuid = uuid_to_bin('b5d69e40-24a0-4c16-810b-5fa462299f94')\n\n AND a.type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')\n# AND t.type IN ('audio', 'video')\n AND (\n (a.actual_start_time BETWEEN '2025-03-13 00:00:00' AND '2025-03-18 07:59:59')\n OR\n (\n a.actual_start_time IS NULL\n AND a.type IN ('sms-outbound', 'sms-inbound')\n AND a.created_at BETWEEN '2025-03-13 00:00:00' AND '2025-03-18 07:59:59'\n )\n )\n AND (\n a.is_private = 0\n OR (\n a.is_private = 1\n AND u.uuid = uuid_to_bin('6f40e4b8-c340-4059-b4ac-1728e87ea99e')\n )\n )\n AND (\n# s.id = 15900\n s.uuid = uuid_to_bin('04ca1c26-c666-4268-a129-419c0acffd73')\n OR s.uuid IS NULL -- Include records without opportunity stage\n )\n\nORDER BY a.actual_end_time DESC;\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Lead Forensics%'; # 190, 162, 8474, willsc@leadforensics.com\nSELECT * FROM users WHERE team_id = 190;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 190\nand sa.provider = 'hubspot';\n\nselect * from role_user where user_id = 8474;\n\nselect * from crm_configurations where provider = 'bullhorn';\n\nSELECT * FROM opportunities WHERE uuid_to_bin('94578249-65ec-4205-90f2-7d1a7d5ab64a') = uuid;\nSELECT * FROM users WHERE uuid_to_bin('26dbadeb-926f-4150-b11b-771b9d4c2f9a') = uuid;\n\nSELECT * FROM opportunities WHERE id = 4732493;\nselect * from activities where opportunity_id = 4732493;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE id = 443; # 358, 14315, andrea.romano@correrenaturale.com\nSELECT * FROM opportunities WHERE team_id = 443;\n\nSELECT a.id, a.type, a.user_id, a.status, a.deleted_at, u.name, u.email, u.team_id as activity_team_id, u.status, u.deleted_at, t.name, t.status, s.team_id as stage_team_id\nFROM activities AS a\nJOIN stages AS s ON a.stage_id = s.id\nJOIN users AS u ON u.id = a.user_id\nJOIN teams AS t ON t.id = s.team_id\nWHERE u.team_id <> s.team_id and t.id > 135;\n\n\nSELECT\n crm_configuration_id,\n crm_provider_id,\n COUNT(*) as duplicate_count,\n GROUP_CONCAT(id) as stage_ids,\n GROUP_CONCAT(name) as stage_names\nFROM stages\nGROUP BY crm_configuration_id, crm_provider_id\nHAVING COUNT(*) > 1\nORDER BY duplicate_count DESC;\n\nselect * from stages where id IN (14898,14907);\n\nselect * from business_processes;\n\nSELECT *\nFROM crm_configurations\nWHERE team_id IN (\n SELECT team_id\n FROM crm_configurations\n GROUP BY team_id\n HAVING COUNT(*) > 1\n)\nORDER BY team_id;\n\nSELECT *\nFROM teams\nWHERE crm_id IN (\n SELECT crm_id\n FROM teams\n GROUP BY crm_id\n HAVING COUNT(*) > 1\n)\nORDER BY crm_id;\n\n# ***************************************************************************\nselect * from crm_configurations where provider = 'integration-app';\nSELECT * FROM teams WHERE id = 443; # Correre Naturale 358 14315 andrea.romano@correrenaturale.com\nselect * from activities where crm_configuration_id = 358 order by actual_end_time desc;\nselect id, uuid, actual_end_time, crm_provider_id, is_internal, playbook_category_id, type, user_id, lead_id, contact_id, account_id, opportunity_id, status, title from activities where crm_configuration_id = 358 order by actual_end_time desc;\nselect * from team_features where team_id = 358;\nselect * from activity_summary_logs;\n\nselect * from teams where id = 406;\n\n# ************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Sportfive%'; # 267, 202, 14637, srv.salesforce@sportfive.com\nselect * from activities where crm_configuration_id = 202 order by actual_end_time desc;\n\nSELECT * FROM users where id = 14637;\nSELECT * FROM teams where id = 267;\nSELECT * FROM groups where id = 1118;\n\nselect g.name, a.title, uuid_from_bin(a.uuid), a.external_id, a.status, a.recording_state, a.recording_reason_code, a.scheduled_start_time, a.scheduled_end_time, a.actual_start_time, a.actual_end_time from activities a\ninner join users u on u.id = a.user_id\ninner join groups g on g.id = u.group_id\nwhere a.crm_configuration_id = 202\nand a.is_internal = 0\nand (a.scheduled_start_time between '2025-03-19 00:00:00' and '2025-03-21 00:00:00')\nand a.type = 'conference'\nand a.status != 'completed'\nand a.external_id is not null\norder by a.scheduled_start_time desc;\n\nSELECT * FROM activities\nWHERE crm_configuration_id = 202\n AND status IN ('completed', 'failed')\n AND recording_state != 'stopped'\n AND type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')\n AND (is_private = 0 OR user_id = 14637)\n AND (\n (\n actual_start_time BETWEEN '2025-03-12 12:00:00' AND '2025-03-24 11:59:59'\n ) OR (\n actual_start_time IS NULL\n AND type IN ('sms-outbound', 'sms-inbound')\n AND created_at BETWEEN '2025-03-12 12:00:00' AND '2025-03-24 11:59:59'\n )\n )\n AND NOT EXISTS (\n SELECT 1\n FROM tracks\n WHERE\n tracks.activity_id = activities.id\n AND tracks.type IN ('audio', 'video')\n )\nORDER BY actual_end_time DESC;\n\nSELECT DISTINCT\n a.*\nFROM activities a\nINNER JOIN tracks t ON a.id = t.activity_id\nINNER JOIN users u ON a.user_id = u.id\nINNER JOIN teams team ON u.team_id = team.id\nWHERE\n a.crm_configuration_id = 202\n AND a.status IN ('completed', 'failed')\n AND a.recording_state != 'stopped'\n# and a.user_id = 14637\n AND a.type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')\n# AND t.type IN ('audio', 'video')\n AND (\n (a.actual_start_time BETWEEN '2025-03-12 12:00:00' AND '2025-03-24 11:59:59')\n OR\n (\n a.actual_start_time IS NULL\n AND a.type IN ('sms-outbound', 'sms-inbound')\n AND a.created_at BETWEEN '2025-03-12 12:00:00' AND '2025-03-24 11:59:59'\n )\n )\n AND (\n a.is_private = 0\n OR (\n a.is_private = 1\n AND a.user_id = 14637\n )\n )\n\nORDER BY a.actual_end_time DESC\n;\n\nSELECT DISTINCT a.*\nFROM activities a\nINNER JOIN users u ON a.user_id = u.id\nINNER JOIN teams t ON u.team_id = t.id\n# INNER JOIN tracks tr ON a.id = tr.activity_id\n# INNER JOIN groups g ON u.group_id = g.id\nWHERE 1=1\n AND t.id = 267\n# AND t.uuid = uuid_to_bin('aed4927b-f1ea-499e-94c3-83762fd233e8')\n AND a.status IN ('completed', 'failed')\n AND a.recording_state != 'stopped'\n AND a.type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')\n# AND tr.type NOT IN ('audio', 'video')\n AND (\n a.is_private = 0\n OR a.user_id = 14637\n )\n AND (\n (a.actual_start_time BETWEEN '2025-03-19 00:00:00' AND '2025-03-21 23:59:59')\n OR (\n a.actual_start_time IS NULL\n AND a.type IN ('sms-outbound', 'sms-inbound')\n AND a.created_at BETWEEN '2025-03-19 00:00:00' AND '2025-03-21 23:59:59'\n )\n )\n# and NOT EXISTS (\n# SELECT 1\n# FROM tracks t\n# WHERE t.activity_id = a.id\n# AND t.type IN ('audio', 'video')\n# )\n\nORDER BY a.actual_end_time DESC;\n\nSELECT * FROM tracks WHERE activity_id = 26485995;\n\nselect a.is_private, a.title, uuid_from_bin(a.uuid), a.external_id, a.status, a.recording_state, a.recording_reason_code, a.scheduled_start_time, a.scheduled_end_time, a.actual_start_time, a.actual_end_time from activities a\ninner join users u on u.id = a.user_id\nwhere a.crm_configuration_id = 202\n# and a.is_internal = 0\nand (a.actual_start_time between '2025-03-19 00:00:00' and '2025-03-21 00:00:00')\nand a.type IN (\"softphone\",\"softphone-inbound\",\"conference\",\"sms-inbound\")\nand a.status IN ('completed', 'failed')\n# and a.external_id is not null\norder by a.actual_end_time desc;\n\nselect * from activities a where a.crm_configuration_id = 202\nand a.actual_start_time between '2025-03-20 00:00:00' and '2025-03-21 00:00:00'\n# AND a.type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')\n\nselect g.name, a.title, uuid_from_bin(a.uuid), a.external_id, a.status, a.recording_state, a.recording_reason_code, a.scheduled_start_time, a.scheduled_end_time, a.actual_start_time, a.actual_end_time from activities a\ninner join users u on u.id = a.user_id\ninner join groups g on g.id = u.group_id\nwhere a.crm_configuration_id = 202\nand a.is_internal = 0\nand (a.scheduled_start_time between '2025-03-19 00:00:00' and '2025-03-21 00:00:00')\nand a.type = 'conference'\nand a.status != 'completed'\nand a.external_id is not null\norder by a.scheduled_start_time desc;\n\nSELECT * FROM teams WHERE name LIKE '%Tourlane%';\nSELECT * FROM crm_fields WHERE crm_configuration_id = 209 and object_type = 'opportunity';\nSELECT * FROM crm_field_data WHERE crm_field_id = 98809;\n\nselect * from users where status = 1 AND timezone = 'MDT';\n\nselect * from opportunities where id = 3769814;\nselect * from deal_risks where opportunity_id = 3769814;\n\nselect cp.* from crm_profiles cp\njoin users u on cp.user_id = u.id\njoin crm_configurations crm on cp.crm_configuration_id = crm.id\nwhere crm.provider = 'hubspot' AND u.status = 1 AND log_notes != 'none';\n\nselect * from crm_fields where id = 154575;\n\nselect * from team_features where feature = 'SUPPORTS_SYNC_MISSING_CALL_DISPOSITIONS';\nSELECT * FROM teams WHERE id = 176; # crm 148\nselect * from activities where crm_configuration_id = 148 and provider = 'hubspot' order by id desc;\n\nselect * from activity_providers where provider = 'amazon-connect';\n\nselect * from crm_fields cf\njoin crm_configurations crm on crm.id = cf.crm_configuration_id\nwhere crm.provider = 'hubspot' and cf.object_type IN ('account', 'contact');\n\n# *********************************************************************************************\nSELECT * FROM users WHERE id IN (15415, 15418);\nSELECT * FROM groups WHERE id IN (1805,1806);\nSELECT * FROM playbooks WHERE id = 1860;\nSELECT * FROM playbook_categories WHERE id = 38634;\nSELECT * FROM crm_fields WHERE id = 189962;\n\nSELECT * FROM teams WHERE name = 'Pulsar Group'; # 472, 380, 15138 raza.gilani@vuelio.com\n\nSELECT * FROM crm_profiles WHERE user_id = 15415;\nSELECT * FROM social_accounts WHERE sociable_id = 15415 and provider = 'salesforce';\n\nselect * from sidekick_settings where team_id = 472;\n\nSELECT * FROM activities WHERE uuid_to_bin('452c58c7-b87c-4fdd-953e-d7af185e9588') = uuid; # 28617536, user: 15418\nSELECT * FROM activities WHERE uuid_to_bin('399114ee-d3a8-458c-bff5-5f654658db0a') = uuid; # 28344407, user: 15415\nSELECT * FROM activities WHERE uuid_to_bin('f0aa567f-0ab1-4bbb-96aa-37dcf184676b') = uuid; # 28580288, user: 15415\nSELECT * FROM activities WHERE uuid_to_bin('50c086b1-2770-4bca-b5ae-6bac22ec426b') = uuid; # 28566069, user: 15415\n\n# *********************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%TeamTailor%'; # 109, 218, 13969, salesforce-integrations@teamtailor.com\nselect * from crm_configurations where id = 218;\nSELECT * FROM activities WHERE uuid_to_bin('e39b5857-7fdb-4f5a-951a-8d3ca69bb1b0') = uuid; # 28338765\nSELECT * FROM users WHERE id IN (13232, 13230);\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 109\nand sa.provider = 'salesforce';\n\n0057R00000EPL5HQAX Inez Ekblad\n\n1091cb81-5ea1-4951-a0ed-f00b568f0140 Triman Kaur\n\nSELECT * FROM crm_profiles WHERE user_id IN (13232, 13230);\n\n############################################################################################\nSELECT * FROM activities WHERE uuid_to_bin('675eeaeb-5681-42db-90bc-54c07a604408') = uuid; # 28655939 00UVg00000FLvnSMAT\nSELECT * FROM crm_field_data WHERE activity_id = 28655939;\nSELECT * FROM crm_fields WHERE id IN (94491,94493,94498);\nSELECT * FROM users WHERE id = 13658;\nSELECT * FROM teams WHERE id = 109;\nSELECT * FROM crm_configurations WHERE id = 218;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 109\nand sa.provider = 'salesforce';\n\n# ********************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Strengthscope%'; # 481, 390, 15420, katy.holden@strengthscope.comk\nSELECT * FROM stages WHERE crm_configuration_id = 390;\nselect * from business_processes where team_id = 481 and crm_configuration_id = 390;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 481\nand sa.provider = 'salesforce';\n\n\nSELECT * FROM users WHERE id = 15780; # team 462\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 462\nand sa.provider = 'hubspot';\n\n\nselect * from teams where id = 495;\nSELECT * FROM users WHERE id = 15794;\nselect * from social_accounts where sociable_id = 15794;\n\n# ********************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Flight%'; # 427, 333, 13752\nSELECT * FROM accounts WHERE team_id = 427 and crm_provider_id = '668731000183444517';\n\n# ********************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Group GTI%'; # 495, 407, 15794\nSELECT * FROM activities WHERE crm_configuration_id = 407\nand status = 'completed' and type = 'conference'\norder by id desc;\n\nselect ru.*, pr.*, p.* from users u join role_user ru on ru.user_id = u.id\njoin permission_role pr on pr.role_id = ru.role_id\n join permissions p on p.id = pr.permission_id\nwhere team_id = 495 and p.name IN ('dial');\n\nselect * from permission_role;\n\nselect * from activities where crm_configuration_id = 407 and status = 'completed' order by id desc;\nSELECT * FROM activities WHERE id = 29512773;\nSELECT * FROM activities WHERE id IN (29042721,28991325,29002874);\n\nSELECT al.* from activity_summary_logs al join activities a on a.id = al.activity_id\nwhere a.crm_configuration_id = 407\n# and a.id IN (29042721,28991325,29002874);\n\nSELECT * FROM users WHERE id = 15794;\nSELECT * FROM users WHERE team_id = 495;\nSELECT * FROM social_accounts WHERE sociable_id = 15794;\nSELECT * FROM opportunities WHERE team_id = 495 and name like '%OC:%';\nSELECT * FROM contacts WHERE team_id = 495;\nSELECT * FROM leads WHERE team_id = 495;\nSELECT * FROM accounts WHERE team_id = 495;\nSELECT * FROM crm_profiles WHERE crm_configuration_id = 407;\nSELECT * FROM crm_fields WHERE crm_configuration_id = 407;\nSELECT * FROM crm_configurations WHERE id = 407;\nSELECT * FROM opportunities WHERE team_id = 495 and close_date BETWEEN '2025-06-01' AND '2025-07-01'\nand user_id IS NOT NULL and is_closed = 1 and is_won = 1;\n\n# ********************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Hamilton Court FX LLP%'; # 249, 187, 10103\nSELECT * FROM activities WHERE uuid_to_bin('4659c2bb-9a49-484e-9327-a3d66f1e028c') = uuid; # 28951064\nSELECT * FROM crm_fields WHERE crm_configuration_id = 187 and object_type IN ('tasks', 'event');\n\n# *********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Checkstep%'; # 325, 256, 11753\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 325\nand sa.provider = 'hubspot';\n\nSELECT * FROM activities WHERE uuid_to_bin('7be372e2-1916-4d79-a2f3-ca3db1346db3') = uuid; # 28611085\nSELECT * FROM activities WHERE uuid_to_bin('980f0336-840b-4185-a5a9-30cf8b0749a8') = uuid; # 28719733\nSELECT * FROM activity_summary_logs where activity_id = 28719733;\n\n# *************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Learning%'; # 260, 356, 9444\nSELECT * FROM activity_summary_logs where sent_at BETWEEN '2025-06-09 11:38:00' AND '2025-06-09 11:40:00';\nSELECT * FROM leads WHERE crm_configuration_id = 356 and crm_provider_id = '230045001502770504'; # 823630\nselect * from activities where crm_configuration_id = 356 and lead_id = 841732;\n\nSELECT * from activity_summary_logs al join activities a on a.id = al.activity_id\nwhere a.crm_configuration_id = 356;\n\nselect * from activities where crm_configuration_id = 356\nand actual_end_time between '2025-06-09 11:00:00' and '2025-06-09 12:00:00'\norder by id desc;\n\nselect * from accounts where crm_configuration_id = 356 and crm_provider_id = '230045001514403366' order by id desc;\nselect * from leads where crm_configuration_id = 356 and crm_provider_id = '230045001514275654' order by id desc;\nselect * from contacts where crm_configuration_id = 356 and crm_provider_id = '230045001514403366' order by id desc;\nselect * from opportunities where crm_configuration_id = 356 and crm_provider_id = '230045001514403366' order by id desc;\n\nselect * from team_features where team_id = 260;\nselect * from features where id IN (1,2,4,6,18,19,20,9,10,3,23,24,25,26,27);\n\nSELECT * FROM activities WHERE uuid_to_bin('7be372e2-1916-4d79-a2f3-ca3db1346db3') = uuid;\n\nselect * from crm_fields;\nselect * from crm_layout_entities;\n\nSELECT * FROM teams WHERE name LIKE '%Optable%';\n\n# *************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Teamtailor%'; # 109, 218, 13969\nSELECT * FROM crm_configurations WHERE id = 218;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 109\nand sa.provider = 'salesforce';\nSELECT * FROM activities WHERE uuid_to_bin('675eeaeb-5681-42db-90bc-54c07a604408') = uuid; # 28655939\nSELECT * FROM crm_field_data WHERE activity_id = 28655939;\nSELECT * FROM crm_fields WHERE id in (94491,94493,94498);\n\nselect * from teams where crm_id IS NULL;\n\nSELECT * FROM activities WHERE uuid_to_bin('71aa8a0c-9652-4ff6-bee7-d98ae60abef6') = uuid;\n\n# *************************************************************************************************\nselect * from team_domains where team_id = 399;\nSELECT * FROM teams WHERE name LIKE '%Rydoo%'; # 399, 318, 13207\n\nselect * from calendar_events where id = 5163781;\nSELECT * FROM activities WHERE uuid_to_bin('be2cbc52-7fda-46a0-9ae0-25d9553eafc0') = uuid; # 29443896\nSELECT * FROM participants WHERE activity_id = 29443896;\nselect * from contacts where crm_configuration_id = 318 and email = 'marianne.westeng@strawberry.no';\nselect * from leads where crm_configuration_id = 318 and email = 'marianne.westeng@strawberry.no';\n\nselect * from activities where user_id = 14937 order by created_at ;\n\nselect * from users where id = 14937;\n\nselect * from contacts where crm_configuration_id = 318 and email LIKE '%@strawberry.se';\nselect * from opportunities where crm_configuration_id = 318 and crm_provider_id = '006Sf00000D1WOAIA3';\n\nselect * from activities a join participants p on a.id = p.activity_id\nwhere crm_configuration_id = 318 and a.updated_at > '2025-06-23T08:18:43Z';\n\n# *************************************************************************************************\nSELECT * FROM opportunities WHERE team_id = 379 and crm_provider_id = '39334518886';\nSELECT * FROM opportunities WHERE team_id = 379 order by id desc;\nSELECT * FROM teams WHERE id = 379;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 379 and sociable_id = 13852\nand sa.provider = 'hubspot';\n\nSELECT * FROM crm_configurations WHERE id = 307;\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 307;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1027;\nSELECT * FROM crm_fields WHERE crm_configuration_id = 307\n and id IN (144750,144855,145158,155227);\n\nSELECT * FROM activities;\n\n\nselect * from activities\nwhere created_at > '2025-07-01 00:00:00'\n# and created_at < '2025-08-01 00:00:00'\nand type not in ('email-outbound', 'email-inbound')\nand account_id is null\nand contact_id is null\nand lead_id is null\nand opportunity_id is not null\n;\nSELECT * FROM activities WHERE id IN (25344155, 25344296, 25501909, 28692187);\nSELECT * FROM crm_configurations WHERE id in (335,301,200);\n\nselect * from crm_fields where crm_configuration_id = 230 and crm_provider_id = 'Age2__c';\n\nSELECT * FROM teams WHERE name LIKE '%Resights%';\nselect * from crm_fields where crm_configuration_id = 1 and object_type = 'opportunity';\n\nselect * from crm_configurations where provider = 'bullhorn'; # 344\nselect * from teams where id IN (442);\n\nselect * from activities\nwhere crm_configuration_id = 177\nand provider = 'amazon-connect'\n order by id desc;\n# and source <> 'gong';\n\nselect * from activity_providers where provider = 'amazon-connect';\n\nSELECT * FROM activities WHERE uuid_to_bin('cec1993b-a7e5-4164-b74d-d680ea51d2f2') = uuid;\n\n\nselect * from crm_configurations where store_transcript = 1;\nSELECT * FROM teams WHERE id IN (80);\n\n# *************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Sedna%'; # 277, 213, 12594\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 277\nand sa.provider = 'salesforce';\n\nselect * from activities where crm_configuration_id = 213 and account_id = 2511502;\n\nselect * from crm_configurations where id = 213;\n\nSELECT * FROM activities WHERE uuid_to_bin('35aa790a-8569-4544-8268-66f9a4a26804') = uuid; # 33981604\nSELECT * FROM participants WHERE activity_id = 33981604;\nSELECT * FROM crm_fields WHERE crm_configuration_id = 337 and object_type = 'task';\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 431\nand sa.provider = 'salesforce';\nSELECT * FROM activities WHERE uuid_to_bin('b5476c7d-19a8-491b-869d-676ea1e857b6') = uuid; # 33997223\nselect * from activity_summary_logs where activity_id = 33997223;\nselect * from activity_notes where activity_id = 33997223;\n\n# ***********************************\nSELECT * FROM teams WHERE name LIKE '%Abode%';\n\n\nselect * from features;\nselect * from teams t\nwhere t.status = 'active'\nand id NOT IN (select team_id from team_features where feature_id = 9)\n;\n\n\nselect * from playbook_layouts where playbook_id = 1725;\nSELECT * FROM activities WHERE uuid_to_bin('65cc283c-4849-49e6-927f-4c281c8fea19') = uuid; # 34297473\nselect * from teams where id = 318;\nselect * from crm_configurations where team_id = 318;\nselect * from playbooks where team_id = 318;\nSELECT * FROM crm_layouts where crm_configuration_id = 381;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1259;\nSELECT * FROM crm_fields WHERE id IN (192938,192936,192939);\n\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1266;\nSELECT * FROM crm_fields WHERE id IN (192980,192991,192997,192998,193064,193067);\n\nSELECT * FROM activities WHERE uuid_to_bin('a902289b-285c-48eb-9cc2-6ad6c5d938f5') = uuid; # 34297533\n\n\n\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 927;\nSELECT * FROM crm_fields WHERE id IN (131668,131669,131670,131671,131676,131797);\n\nSELECT * FROM teams WHERE name LIKE '%Peripass%'; # 351, 281, 12124\nselect * from crm_layouts where crm_configuration_id = 281;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 927;\nselect * from crm_fields where crm_configuration_id = 281 and id in (131668,131669,131670,131671,131676,131797);\nselect * from opportunities where crm_configuration_id = 281;\n\nSELECT * FROM activities WHERE id IN (34211315, 34130075);\nSELECT * FROM crm_field_data WHERE object_id IN (34211315, 34130075);\n\nselect cf.crm_configuration_id, cle.crm_layout_id, cle.id, cf.id from crm_field_data cfd\njoin crm_layout_entities cle on cle.id = cfd.crm_layout_entity_id\njoin crm_fields cf on cle.crm_field_id = cf.id\nwhere cf.deleted_at IS NOT NULL\nGROUP BY cle.id, cf.id;\n\nselect * from crm_layouts where id IN (355);\nselect u.email, t.crm_id, t.* from teams t\njoin users u on u.id = t.owner_id\nwhere crm_id IN (97);\n\nSELECT * FROM crm_fields WHERE id = 96492;\n\nselect * from permissions;\nselect * from permission_role where permission_id = 247;\nselect * from roles;\n\nselect * from migrations;\n# *****************************************************************\nSELECT * FROM activities WHERE uuid_to_bin('291e3c21-11cc-4728-aee7-6e4bedf86d72') = uuid; # 34262174\nSELECT * FROM crm_configurations WHERE id = 301;\nSELECT * FROM teams WHERE id = 343;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 343\nand sa.provider = 'hubspot';\n\nselect * from participants where activity_id = 34262174;\n\nselect * from contacts where crm_configuration_id = 301 and id = 6976326;\nselect * from accounts where crm_configuration_id = 301 and id IN (4647626, 4815829); # 30761335403\n\nselect * from activity_summary_logs where activity_id = 34262174;\n\nselect * from users where status = 1 AND timezone = 'EST';\n\n# ****************************************************************************\nSELECT * FROM users WHERE id = 13869;\nSELECT * FROM crm_configurations WHERE id = 320;\nSELECT * FROM teams WHERE id = 401;\n\nSELECT * FROM activities WHERE uuid_to_bin('2228c16f-10be-48d5-90d4-67385219dc01') = uuid; # 29670601\n\nSELECT * FROM accounts WHERE id = 7761483;\nSELECT * FROM opportunities WHERE id = 6051814;\n\nSELECT * FROM teams WHERE name LIKE '%Seedlegals%';\n\n;select * from opportunities where updated_at > '2025-10-11' AND crm_provider_id = '34713761166';\n\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 177;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 577;\nSELECT * FROM crm_fields WHERE id IN (68458,68459,68480,68497,68524,68530,68554,68618,68662,68781,68810,68898,68981,69049,97467);\n\nSELECT t.id, crm.id, t.name, crm.sync_objects, crm.provider, crm.last_synced_at FROM crm_configurations crm join teams t on t.crm_id = crm.id\nwhere t.status = 'active' AND crm.provider = 'hubspot' AND crm.last_synced_at < '2025-10-22 00:00:00';\n\nSELECT * FROM activities WHERE uuid_to_bin('fa09449f-cba9-496a-b8f3-865cd3c72351') = uuid;\nSELECT * FROM crm_configurations where id = 184;\nSELECT * FROM teams WHERE id = 246;\nSELECT * FROM social_accounts WHERE sociable_id = 9259 and provider = 'hubspot';\n\nSELECT * FROM users WHERE email LIKE '%rhian.old@bud.co.uk%'; # 17700\nSELECT * FROM teams WHERE id = 551;\n\nSELECT * FROM crm_configurations WHERE id = 471;\nSELECT * FROM activities WHERE crm_configuration_id = 471 and crm_provider_id IS NOT NULL;\nSELECT * FROM crm_fields WHERE crm_configuration_id = 471;\nSELECT * FROM crm_fields WHERE id = 307260;\nSELECT * FROM crm_field_values WHERE crm_field_id = 307260;\n\nselect * from crm_layouts where crm_configuration_id = 471;\n\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1547;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1548;\n\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 551 and sa.provider = 'hubspot';\n\nSELECT * FROM teams WHERE name LIKE '%$PCS%';\n\n# ********************************************************************************************************\nselect * from crm_configurations crm\njoin teams t on t.crm_id = crm.id\nwhere t.status = 'active'\nand crm.provider = 'hubspot';\n\n# $slug = 'HUBSPOT_WEBHOOK_SYNC';\n# $team = Jiminny\\Models\\Team::find(2);\n# $feature = Feature::query()->where('slug', $slug)->first();\n# TeamFeature::query()->create(['feature_id' => $feature->getId(),'team_id' => $team->getId()]);\n\n# hubspot_webhook_metrics\n\nselect * from crm_configurations where id = 331; # 416\nSELECT * FROM teams WHERE id = 416;\nSELECT * FROM opportunities WHERE team_id = 190;\n\nSELECT * FROM teams WHERE name LIKE '%Lead Forensics%';\nSELECT sa.id,\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 190 and sa.provider = 'hubspot';\n\n\n\nSELECT * FROM teams WHERE name LIKE '%Rapaport%'; # 431, 337\nSELECT * FROM teams where id = 431;\nSELECT * FROM crm_configurations where team_id = 431;\nSELECT * FROM activity_providers where team_id = 431;\nSELECT * FROM activities where crm_configuration_id = 337 and type IN ('softphone', 'softphone-outbound')\nand provider NOT IN ('hubspot', 'aircall')\n# and telephony_provider_id = '019c1131-a22f-4792-b9ea-20adf6a02ed0'\norder by id desc;\nSELECT sa.id,\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 431 and sa.provider = 'salesforce';\n\nSELECT * FROM teams WHERE name LIKE '%BiP%'; # 401, 320\nSELECT * FROM teams where id = 401;\nSELECT * FROM crm_configurations where team_id = 401;\nSELECT * FROM activity_providers where team_id = 401;\nSELECT * FROM activities where crm_configuration_id = 320 and type IN ('softphone', 'softphone-outbound')\nand provider NOT IN ('hubspot', 'aircall')\n# and telephony_provider_id = '019c1131-a22f-4792-b9ea-20adf6a02ed0'\norder by id desc;\nSELECT sa.id,\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 401 and sa.provider = 'salesforce';\n\n\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 307; # 379 - Story Terrace Inc , portalId: 3921157\nSELECT * FROM contacts WHERE team_id = 379 and updated_at > '2026-01-31 11:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 379 and updated_at > '2026-02-01 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 379 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 379 and sa.provider = 'hubspot';\n\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 485; # 563 - LATUS Group (ad94d501-5d09-44fd-878f-ca3a9f8865c3) , portalId: 3904501\nSELECT * FROM opportunities WHERE team_id = 563 and updated_at > '2026-02-02 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 563 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 338; # 432 - Formalize , portalId: 9214205\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 432 and sa.provider = 'hubspot';\nSELECT * FROM opportunities WHERE team_id = 432 and updated_at > '2026-02-02 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 432 and updated_at > '2026-02-10 00:00:00' order by updated_at desc;\n\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 436; # 519 - Moxso , portalId: 25531989\nSELECT * FROM opportunities WHERE team_id = 519 and updated_at > '2026-02-02 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 519 and updated_at > '2026-02-04 11:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 96; # 119 - Nourish Care , portalId: 26617984\nSELECT * FROM opportunities WHERE team_id = 119 and updated_at > '2026-02-02 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 119 and updated_at > '2026-02-04 11:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 331; # 416 - The National College , portalId: 7213852\nSELECT * FROM opportunities WHERE team_id = 416 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 416 and updated_at > '2026-02-04 11:00:00' order by updated_at desc;\n\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 308; # 380 - Foodles , portalId: 7723616\nSELECT * FROM opportunities WHERE team_id = 380 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 380 and updated_at > '2026-02-06 10:30:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 379; # 471 - imat-uve , portalId: 9177354\nSELECT * FROM opportunities WHERE team_id = 471 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 471 and updated_at > '2026-02-06 10:30:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 465; # 545 - Spotler , portalId: 144759271\nSELECT * FROM opportunities WHERE team_id = 545 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 545 and updated_at > '2026-02-06 10:30:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 455; # 537 - indevis , portalId: 25666868\nSELECT * FROM opportunities WHERE team_id = 537 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 537 and updated_at > '2026-02-06 10:30:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 200; # 265 - Jobadder , portalId: 6426676\nSELECT * FROM opportunities WHERE team_id = 265 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 265 and updated_at > '2026-02-06 10:30:00' order by updated_at desc;\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 335; # 429 - Eletive , portalId: 6110563\nSELECT * FROM opportunities WHERE team_id = 429 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 429 and updated_at > '2026-02-09 10:30:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 363; # 456 - Global Group , portalId: 8901981\nSELECT * FROM opportunities WHERE team_id = 456 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 456 and updated_at > '2026-02-09 10:30:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 297; # 369 - Unbiased , portalId: 9229005\nSELECT * FROM opportunities WHERE team_id = 369 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 369 and updated_at > '2026-02-09 10:30:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 353; # 449 - Fuuse , portalId: 25781745\nSELECT * FROM opportunities WHERE team_id = 449 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 449 and updated_at > '2026-02-09 10:30:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 487; # 566 - Nimbus , portalId: 39982590\nSELECT * FROM opportunities WHERE team_id = 566 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 566 and updated_at > '2026-02-09 10:30:00' order by updated_at desc;\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 487;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1630;\nselect * from crm_fields where crm_configuration_id = 487 and\n(uuid_to_bin('4c6b2971-64d4-45b8-b377-427be758b5a5') = uuid or uuid_to_bin('59e368d8-65a0-4b77-b611-db37c99fbe68') = uuid);\nSELECT * FROM crm_field_values WHERE crm_field_id = 375177;\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 420; # 506 - voiio , portalId: 145629154\nSELECT * FROM opportunities WHERE team_id = 506 and updated_at > '2026-02-10 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 506 and updated_at > '2026-02-10 15:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 479; # 558 - Momice , portalId: 535962\nSELECT * FROM opportunities WHERE team_id = 558 and updated_at > '2026-02-10 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 558 and updated_at > '2026-02-10 15:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 59; # 80 - Storyclash GmbH , portalId: 4268479\nSELECT * FROM opportunities WHERE team_id = 80 and updated_at > '2026-02-10 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 80 and updated_at > '2026-02-10 15:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 175; # 203 - Team iAM , portalId: 5534732\nSELECT * FROM opportunities WHERE team_id = 203 and updated_at > '2026-02-10 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 203 and updated_at > '2026-02-10 15:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 368; # 460 - OneTouch Health , portalId: 5534732183355\nSELECT * FROM opportunities WHERE team_id = 460 and updated_at > '2026-02-10 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 460 and updated_at > '2026-02-10 15:00:00' order by updated_at desc;\n\n\n\nselect * from users where id = 29643;\nSELECT * FROM crm_field_values WHERE crm_field_id = 375177;\n# ********************************************************************\nSELECT * FROM teams WHERE name LIKE '%Buynomics%'; # 462, 482, 14910\nSELECT * FROM activities WHERE crm_configuration_id = 482\nand type NOT IN ('email-inbound', 'email-outbound')\n# and description like '%The call focused on understanding Welch%'\norder by id desc;\n\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 462 and sa.provider = 'salesforce';\n\nselect * from contacts where crm_configuration_id = 482 and name = 'Cyndall Hill'; # 15504749\nselect * from contacts where id = 10891096; # 482\nSELECT * FROM activities WHERE crm_configuration_id = 482\nand type NOT IN ('email-inbound', 'email-outbound')\nand contact_id = 15504749\norder by id desc;\n\nselect * from activities where id = 36793003; # 96cc7bc1-8622-4d27-92f4-baf664fc1a56, 00UOf00000PDdOXMA1\nselect * from transcription where id = 7646782;\nselect * from ai_prompts where transcription_id = 7646782;\n\n# ********************************************************************\nSELECT * FROM activities WHERE uuid_to_bin('7a8471a3-847e-4822-802b-ddf426bbc252') = uuid; # 37370018\nSELECT * FROM activity_summary_logs WHERE activity_id = 37370018;\nSELECT * FROM teams WHERE id = 555;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 555 and sa.provider = 'hubspot';\n\n# ********************************************************************\nSELECT * FROM activities WHERE uuid_to_bin('7c17b8aa-09df-4f85-a0f7-51f47afd712d') = uuid; # 37395250\nSELECT * FROM activities WHERE uuid_to_bin('14d60388-260d-494b-aa0d-63fdb1c78026') = uuid; # 37395250\n\nSELECT a.* FROM activities a JOIN crm_configurations c on c.id = a.crm_configuration_id\nwhere a.type IN ('softphone', 'softphone-outbound') and c.provider = 'hubspot'\nand a.provider NOT IN ('hubspot')\n# and a.provider IN ('salesloft')\n# and c.id NOT IN (70)\n# and a.duration > 30\n# and actual_start_time > '2026-02-05 00:00:00'\norder by a.id desc;\n\nSELECT * FROM activities WHERE id = 37549787;\nSELECT * FROM crm_profiles WHERE user_id = 17613;\n\nSELECT * FROM crm_configurations WHERE id = 70;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 93 and sa.provider = 'hubspot';\n\nSELECT asf.activity_search_id, asf.id, asf.value\nFROM activity_search_filters asf\nWHERE asf.filter = 'group_id'\nAND asf.value IN (\n SELECT CONCAT(\n HEX(SUBSTR(uuid, 5, 4)), '-',\n HEX(SUBSTR(uuid, 3, 2)), '-',\n HEX(SUBSTR(uuid, 1, 2)), '-',\n HEX(SUBSTR(uuid, 9, 2)), '-',\n HEX(SUBSTR(uuid, 11))\n )\n FROM groups\n WHERE deleted_at IS NOT NULL\n);\n\nSELECT * FROM crm_configurations WHERE id = 373; # KPSBremen.de 465 # - no social account\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 465 and sa.provider = 'hubspot';\n\nselect * from crm_configurations where id = 494;\n\nSELECT * FROM teams WHERE name LIKE '%splose%'; # 572, 495, 18708\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 572 and sa.provider = 'pipedrive';\n\nselect * from opportunities where team_id = 572\n# and name like '%Onebright%'\n# and is_closed = 1 and is_won = 0\n order by id desc;\n\n\nselect * from users where deleted_at is null and status = 2;\n\nselect * from contacts where id = 17900517;\nselect * from accounts where id = 10109838;\nselect * from opportunities where id = 6955880;\n\nselect * from opportunity_contacts where opportunity_id = 6955880;\nselect * from opportunity_contacts where contact_id = 17900517;\n\nselect * from contact_roles cr join crm_configurations crm on cr.crm_configuration_id = crm.id\nwhere crm.provider != 'salesforce';\n\nSELECT * FROM activities WHERE uuid_to_bin('adcb8331-5988-4353-834e-383a355abba2') = uuid; # 38056424, crm 104659682404\nselect * from teams where id = 456;\nSELECT * FROM crm_configurations WHERE id = 363;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 456 and sa.provider = 'hubspot';\n\nselect * from crm_layouts where crm_configuration_id = 363;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id IN (1203, 1204, 1635);\nSELECT * FROM crm_fields WHERE id IN (181536, 181538, 213455);\n\nSELECT * FROM teams WHERE name LIKE '%Electric%'; # 342, 272, 12767\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 342 and sa.provider = 'pipedrive';\nSELECT * FROM opportunities WHERE crm_configuration_id = 272 and name like 'NORTHUMBRIA POL%'; # and updated_at > '2025-07-01 00:00:00';\nSELECT * FROM opportunities WHERE crm_configuration_id = 272 order by remotely_created_at asc; # and updated_at > '2025-07-01 00:00:00';\nSELECT * FROM opportunities WHERE crm_configuration_id = 272 and updated_at > '2026-01-01 00:00:00';\nSELECT * FROM crm_fields WHERE crm_configuration_id = 272 and object_type = 'opportunity';\nSELECT * FROM crm_field_values WHERE crm_field_id = 127164;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 342 and sa.provider = 'pipedrive';\n\nSELECT * FROM teams WHERE id = 472;\nSELECT * FROM crm_configurations WHERE id = 380;\nselect * from activities where id = 38285673; # 38285673\nSELECT * FROM users WHERE id = 16942;\nSELECT * FROM groups WHERE id = 1964;\nSELECT * FROM playbooks WHERE id = 2033;\n\nselect * from teams where created_at > '2026-03-09';\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 499; # 1065\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1678;\n\nSELECT * FROM teams WHERE id = 575;\nselect * from opportunities where team_id = 575;\n\nSELECT * FROM activities WHERE uuid_to_bin('96b1261f-2357-49f9-ab38-23ce12008ea0') = uuid;\n\nselect * from contacts c\nwhere c.crm_configuration_id = 370 order by c.updated_at desc;\n\nSELECT * FROM participants where activity_id = 38833541;\nSELECT * FROM participants where activity_id = 39216301;\nSELECT * FROM activity_summary_logs where activity_id = 39216301;\nSELECT * FROM activities WHERE uuid_to_bin('c7d99fbe-1fb1-41f2-8f4d-52e2bf70e1e9') = uuid; # 38833541, crm 478116564181\nSELECT * FROM activities WHERE uuid_to_bin('2e6ff4d3-9faa-447a-a8c1-9acde4d885ae') = uuid; # 39216301, crm 480171536586\nselect * from crm_profiles where crm_configuration_id = 319 and crm_provider_id = 525785080;\nselect * from opportunities where crm_configuration_id = 319 and crm_provider_id = 410150124747;\nselect * from accounts where crm_configuration_id = 319 and crm_provider_id = 47150650569;\nselect * from contacts where crm_configuration_id = 319 and crm_provider_id IN ('665587441856', '742723347700');\n# owner 13236 525785080\n# contact 1 16779180 665587441856 - activity - Alex Howes alex@supportroom.com created 2026-01-26\n# contact 2 19247563 742723347700 - ash@supportroom.com 2026-03-24\n# company 4176133 47150650569\n# deal 7100953 410150124747\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 400 and sa.provider = 'hubspot';\n\nselect * from features;\nselect * from team_features where feature_id = 40;\n\nselect * from teams where id = 556; # owner: 18101, crm: 477\nselect * from crm_configurations where id = 477;\nSELECT * FROM users WHERE id = 18101;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 556 and sa.provider = 'integration-app';\n\nselect * from opportunities where id = 7594349;\nselect * from opportunity_stages where opportunity_id = 7594349 order by created_at desc;\nselect * from business_processes where id = 6024;\nselect * from business_process_stages where stage_id = 16352;\nselect * from business_process_stages where business_process_id = 6024;\nselect * from stages where team_id = 459;\nselect * from teams where id = 459;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 459 and sa.provider = 'hubspot';\n\nSELECT os.stage_id, s.crm_provider_id, s.name, COUNT(*) as cnt\nFROM opportunity_stages os\nJOIN stages s ON s.id = os.stage_id\nWHERE os.opportunity_id = 7594349\nGROUP BY os.stage_id, s.crm_provider_id, s.name\nORDER BY cnt DESC;\n\nSELECT s.id, s.crm_provider_id, s.name, s.team_id, s.crm_configuration_id\nFROM stages s\nJOIN business_process_stages bps ON bps.stage_id = s.id\nWHERE bps.business_process_id = 6024\nAND s.crm_provider_id = 'contractsent';\n\nselect * from stages where id IN (16352,20612,18281,7344,16378,16309,5036,15223,14535,6293,12098,11607)\n\nSELECT * FROM teams WHERE name LIKE '%Pulsar Group%'; # 472, 380, 15138, raza.gilani@vuelio.com\nselect * from playbooks where team_id = 472; # event 226147\nSELECT * FROM playbook_categories WHERE playbook_id = 2288;\nSELECT * FROM crm_fields WHERE id = 226147;\nSELECT * FROM crm_field_values WHERE crm_field_id = 226147;\n\nSELECT * FROM crm_configurations WHERE id = 380;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 472 and sa.provider = 'salesforce';","depth":4,"value":"SELECT * FROM team_features where team_id = 1;\n\nSELECT * FROM teams WHERE name LIKE '%Vixio%'; # 340,270,11922\nSELECT * FROM users WHERE team_id = 340; # 12015\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 340\nand sa.provider = 'salesforce';\n# and sa.provider = 'salesloft';\n\nselect * from crm_fields where crm_configuration_id = 270 and object_type = 'event';\n# 125558 - Event Type - Event_Type__c\n# 125552 - Event Status - Event_Status__c\n\nSELECT * FROM sidekick_settings WHERE team_id = 340;\n\nSELECT * FROM crm_field_values WHERE crm_field_id in (125552);\n\nselect * from activities where crm_configuration_id = 270\nand type = 'conference' and crm_provider_id IS NOT NULL\nand actual_start_time > '2024-09-16 09:00:00' order by scheduled_start_time;\n\nSELECT * FROM activities WHERE id = 20871677;\nSELECT * FROM crm_field_data WHERE activity_id = 20871677;\n\nselect * from crm_layouts where crm_configuration_id = 270;\nselect * from crm_layout_entities where crm_layout_id in (886,887);\n\nSELECT * FROM crm_configurations WHERE id = 270;\n\nselect * from playbooks where team_id = 340; # 1514\nselect * from groups where team_id = 340;\nSELECT * FROM crm_fields WHERE id IN (125393, 125401);\n\nselect g.name as 'team name', p.name as 'playbook name', f.label as 'activity type field' from groups g\njoin playbooks p on g.playbook_id = p.id\njoin crm_fields f on p.activity_field_id = f.id\nwhere g.team_id = 340;\n\nSELECT * FROM activities WHERE uuid_to_bin('0c180357-67d2-419e-a8c3-b832a3490770') = uuid; # 20448716\nselect * from crm_field_data where object_id = 20448716;\n\nselect * from activities where crm_configuration_id = 270 and provider = 'salesloft' order by id desc;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%CybSafe%'; # 343,273,12008\nselect * from opportunities where team_id = 343;\nselect * from opportunities where team_id = 343 and crm_provider_id = '18099102526';\nselect * from opportunities where team_id = 343 and account_id = 945217482;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 343\nand sa.provider = 'hubspot';\n\nselect * from accounts where team_id = 343 order by name asc;\n\nselect * from stages where crm_configuration_id = 273 and type = 'opportunity';\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Voyado%'; # 353,283,12143\nSELECT * FROM activities WHERE crm_configuration_id = 283 and account_id = 3777844 order by id desc;\nSELECT * FROM accounts WHERE team_id = 353 AND name LIKE '%Salesloft%';\nSELECT * FROM activities WHERE id = 20717903;\n\nselect * from participants where activity_id IN (20929172,20928605,20928468,20926272,20926271,20926270,20926269,20916499,20916454,20916436,20916435,20900015,20900014,20900013,20897312,20897243,20897241,20897237,20897232,20897229,20893648,20893231,20893230,20893229,20893228,20889784,20885039,20885038,20885037,20885036,20885035,20882728,20882708,20882703,20882702,20869828,20869811,20869806,20869801,20869799,20869798,20869796,20869795,20869794,20869761,20869760,20869759,20868688,20868687,20850340,20847195,20841710,20833967,20827021,20825307,20825305,20825297,20824615,20824400,20823927,20821760,20795588,20794233,20794057,20793710,20785811,20781789,20781394,20781307,20762651,20758453,20758282,20757323,20756643,20756636,20756629,20756627,20756606,20756605,20756604,20756603,20756602,20756600,20756599,20756598,20756595,20756594,20756589,20756587,20756577,20756573,20748918,20748386,20748385,20748384,20748383,20748382,20748381,20748380,20748379,20748377,20748375,20748373,20743301,20717905,20717904,20717903,20717901,20717899);\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 353\nand sa.provider = 'salesforce';\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%modern world business solutions%'; # 345,275,12016, l.atkinson@mwbsolutions.co.uk\nSELECT * FROM activities WHERE uuid_to_bin('3921d399-3fef-4609-a291-b0097a166d43') = uuid;\n# id: 20940638, user: 12022, contact: 5305871\nSELECT * FROM activity_summary_logs WHERE activity_id = 20940638;\nselect * from contacts where team_id = 345 and crm_provider_id = '30891432415' order by name asc; # 5305871\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 345\nand sa.provider = 'hubspot';\n\nselect * from users where team_id = 345 and id = 12022;\nSELECT * FROM crm_profiles WHERE user_id = 12022;\nSELECT * FROM participants WHERE activity_id = 20940638;\nSELECT * FROM users u\nJOIN crm_profiles cp ON u.id = cp.user_id\nWHERE u.team_id = 345;\n\nselect * from contacts where team_id = 345 and crm_provider_id = '30880813535' order by name desc; # 5305871\n\nselect * from team_features where team_id = 345;\nSELECT * FROM activities WHERE uuid_to_bin('11701e2d-2f82-4dab-a616-1db4fad238df') = uuid; # 21115197\nSELECT * FROM participants WHERE activity_id = 20897406;\n\n\n\nSELECT * FROM activities WHERE uuid_to_bin('63ba55cd-1abc-447d-83da-0137000005b7') = uuid; # 20953912\nSELECT * FROM activities WHERE crm_configuration_id = 275 and provider = 'ringcentral' and title like '%1252629100%';\n\n\nSELECT * FROM activities WHERE id = 20946641;\nSELECT * FROM crm_profiles WHERE user_id = 10211;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Lunio%'; # 120,97,10984, triger@lunio.ai\nSELECT * FROM opportunities WHERE crm_configuration_id = 97 and crm_provider_id = '006N1000006c5PpIAI';\nselect * from stages where crm_configuration_id = 97 and type = 'opportunity';\nselect * from opportunities where team_id = 120;\n\n\nselect * from crm_configurations crm join teams t on crm.id = t.crm_id\nwhere 1=1\nAND t.current_billing_plan IS NOT NULL\nAND crm.auto_sync_activity = 0\nand crm.provider = 'hubspot';\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Exclaimer%'; # 270,205,10053,james.lewendon@exclaimer.com\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 270\nand sa.provider = 'salesforce';\nSELECT * FROM activities WHERE uuid_to_bin('b54df794-2a9a-4957-8d80-09a600ead5f8') = uuid; # 21637956\nSELECT * FROM crm_profiles WHERE user_id = 11446;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Cygnetise%'; # 372,300,12554, alex.chikly@cygnetise.com\nselect * from playbooks where team_id = 372;\nselect * from crm_fields where crm_configuration_id = 300 and object_type = 'event'; # 141340\nSELECT * FROM crm_field_values WHERE crm_field_id = 141340;\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 372\nand sa.provider = 'salesforce';\n\nselect * from crm_profiles where crm_configuration_id = 300;\nSELECT * FROM crm_configurations WHERE team_id = 372;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Planday%'; # 291,242,11501,mfa@planday.com\nSELECT * FROM opportunities WHERE team_id = 291 and crm_provider_id = '006bG000005DO86QAG'; # 3207756\nselect * from crm_field_data where object_id = 3207756;\nSELECT * FROM crm_fields WHERE id = 111834;\n\nselect f.id, f.crm_provider_id AS field_name, f.label, fd.object_id AS dealId, fd.value\nFROM crm_fields f\nJOIN crm_field_data fd ON f.id = fd.crm_field_id\nWHERE f.crm_configuration_id = 242\nAND f.object_type = 'opportunity'\nAND fd.object_id IN (3207756)\nORDER BY fd.object_id, fd.updated_at;\n\nSELECT * FROM crm_configurations WHERE auto_connect = 1;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Tour%'; # 187,209,8150,salesforce-admin@tourlane.com\nselect * from group_deal_risk_types drgt join groups g on drgt.group_id = g.id\nwhere g.team_id = 187;\n\nselect * from `groups` where team_id = 187;\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 187\nand sa.provider = 'salesforce';\n\n# Destination - 98870 - Destination__c\n# Stage - 79014 - StageName\n# Land Arrangement - 98856 - Land_Arrangement__c\n# Flight - 98848 - Flight__c\n# Last activity date - 98812 - LastActivityDate\n# Last modified date - 98809 - LastModifiedDate\n# Last inbound mail timestamp - 99151 - Last_Inbound_Mail_Timestamp__c\n# next call - 98864 - Next_Call__c\n\nselect * from crm_fields where crm_configuration_id = 209 and object_type = 'opportunity';\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 209;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 682;\n\nselect * from opportunities where team_id = 187 and name LIKE'%Muriel Sal%';\nselect * from opportunities where team_id = 187 and user_id = 9951 and is_closed = 0;\nselect * from activities where opportunity_id = 3538248;\n\nSELECT * FROM crm_profiles WHERE user_id = 8150;\n\nselect * from deal_risks where opportunity_id = 3538248;\n\nselect * from teams where crm_id IS NULL;\n\nSELECT opp.id AS opportunity_id,\n u.group_id AS group_id,\n MAX(\n CASE\n WHEN a.type IN (\"sms-inbound\", \"sms-outbound\") THEN a.created_at\n ELSE a.actual_end_time\n END) as last_date\nFROM opportunities opp\nleft join activities a on a.opportunity_id = opp.id\ninner join users u on opp.user_id = u.id\nwhere opp.user_id IN (9951)\n\nAND opp.is_closed = 0\nand a.status IN ('completed', 'received', 'delivered') OR a.status IS NULL\ngroup by opp.id;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Cybsafe%'; # 343,301,12008,polly.morphew@cybsafe.com\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 343\nand sa.provider = 'hubspot';\n\nSELECT * FROM crm_profiles WHERE crm_configuration_id = 301;\nSELECT * FROM contacts WHERE id = 6612363;\nSELECT * FROM accounts WHERE id = 4235676;\nSELECT * FROM opportunities WHERE crm_configuration_id = 301 and crm_provider_id = 32983784868;\nselect * from opportunity_stages where opportunity_id = 4503759;\n# SELECT * FROM opportunities WHERE id = 4569937;\n\nselect * from activities where crm_configuration_id = 301;\nSELECT * FROM activities WHERE uuid_to_bin('d3b2b28b-c3d0-4c2d-8ed0-eef42855278a') = uuid; # 26330370\nSELECT * FROM participants WHERE activity_id = 26330370;\n\nSELECT * FROM teams WHERE id = 375;\nselect * from playbooks where team_id = 375;\n\nselect * from stages where crm_configuration_id = 301 and type = 'opportunity';\n\nselect * from teams;\nselect * from contact_roles;\n\nSELECT * FROM opportunities WHERE team_id = 343 and user_id = 12871 and close_date >= '2024-11-01';\n\nselect * from users u join crm_profiles cp on cp.user_id = u.id where u.team_id = 343;\n\nSELECT * FROM crm_field_data WHERE object_id = 3771706;\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 343\nand sa.provider = 'hubspot';\n\nSELECT * FROM crm_fields WHERE crm_configuration_id = 301 and object_type = 'opportunity'\nand crm_provider_id LIKE \"%traffic_light%\";\nSELECT * FROM crm_field_values WHERE crm_field_id IN (144020,144048,144111,144113,144126,144481,144508,144531);\n\nSELECT fd.* FROM opportunities o\nJOIN crm_field_data fd ON o.id = fd.object_id\nWHERE o.team_id = 343\n# and o.user_id IS NOT NULL\nand fd.crm_field_id IN (144020,144048,144111,144113,144126,144481,144508,144531)\nand fd.value != ''\norder by value desc\n# group by o.id\n;\n\nSELECT * FROM opportunities WHERE id = 3769843;\n\nSELECT * FROM teams WHERE name LIKE '%Tour%'; # 187,209,8150, salesforce-admin@tourlane.com\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 209;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 682;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Funding Circle%'; # 220,177,8603,aswini.mishra@fundingcircle.com\nSELECT * FROM activities WHERE uuid_to_bin('7a40e99b-3b37-4bb1-b983-325b81801c01') = uuid; # 23139839\n\n\nSELECT * FROM opportunities WHERE id = 3855992;\n\nSELECT * FROM users WHERE name LIKE '%Angus Pollard%'; # 8988\n\nSELECT * FROM teams WHERE name LIKE '%Story Terrace%'; # 379, 307, 12894\nSELECT * FROM crm_fields WHERE crm_configuration_id = 307 and object_type != 'opportunity';\n\nselect * from contacts where team_id = 379 and name like '%bebro%'; # 5874411, crm: 77229348507\nSELECT * FROM crm_field_data WHERE object_id = 5874411;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 379\nand sa.provider = 'hubspot';\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%mentio%'; # 117, 94, 6371, nikhil.kumar@mention-me.com\nSELECT * FROM activities WHERE uuid_to_bin('82939311-1af0-4506-8546-21e8d1fdf2c1') = uuid;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Tourlane%'; # 187, 209, 8150, salesforce-admin@tourlane.com\nSELECT * FROM opportunities WHERE team_id = 187 and crm_provider_id = '006Se000008xfvNIAQ'; # 3537793\nselect * from generic_ai_prompts where subject_id = 3537793;\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Lunio%'; # 120, 97, 10984, triger@lunio.ai\nSELECT * FROM crm_configurations WHERE id = 97;\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 97;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 355;\nSELECT * FROM crm_fields WHERE id = 32682;\n\nselect cfd.value, o.* from opportunities o\njoin crm_field_data cfd on o.id = cfd.object_id and cfd.crm_field_id = 32682\nwhere team_id = 120\nand cfd.value != ''\n;\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 120\nand sa.provider = 'salesforce';\n\nselect * from opportunities where team_id = 120 and crm_provider_id = '006N1000007X8MAIA0';\nSELECT * FROM crm_field_data WHERE object_id = 2313439;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE id = 410;\nSELECT * FROM teams WHERE name LIKE '%Local Business Oxford%';\nselect * from scorecards where team_id = 410;\nselect * from scorecard_rules;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Funding%'; # 220, 177, 8603, aswini.mishra@fundingcircle.com\nselect * from activities a\njoin opportunities o on a.opportunity_id = o.id\njoin users u on o.user_id = u.id\nwhere a.crm_configuration_id = 177 and a.type LIKE '%email-out%'\n# and a.actual_end_time > '2024-12-16 00:00:00'\n# and o.remotely_created_at > '2024-12-01 00:00:00'\n# and u.group_id = 1014\nand u.id = 9021\norder by a.id desc;\nSELECT * FROM opportunities WHERE id in (3981384,4017346);\nSELECT * FROM users WHERE team_id = 220 and id IN (8775, 11435);\n\nselect * from users where id = 9021;\nselect * from inboxes where user_id = 9021;\n\nselect * from inbox_emails where inbox_id = 1349 and email_date > '2024-12-18 00:00:00';\n\nselect * from email_messages where team_id = 220\nand orig_date > '2024-12-16 00:00:00' and orig_date < '2024-12-19 00:00:00'\nand subject LIKE '%Personal%'\n# and 'from' = 'credit@fundingcircle.com'\n;\n\nselect * from activities a\njoin opportunities o on a.opportunity_id = o.id\nwhere a.user_id = 9021 and a.type LIKE '%email-out%'\nand a.actual_end_time > '2024-12-18 00:00:00'\nand o.user_id IS NOT NULL\nand o.remotely_created_at > '2024-12-01 00:00:00'\norder by a.id desc;\n\nSELECT * FROM opportunities WHERE team_id = 220 and name LIKE '%Right Car move Limited%' and id = 3966852;\nselect * from activities where crm_configuration_id = 177 and type LIKE '%email%' and opportunity_id = 3966852 order by id desc;\n\nselect * from team_settings where name IN ('useCloseDate');\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Hurree%'; # 104, 81, 6175, jfarrell@hurree.co\nSELECT * FROM opportunities WHERE team_id = 104 and name = 'PropOp';\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 104\nand sa.provider = 'hubspot';\n\nselect * from crm_configurations where last_synced_at > '2025-01-19 01:00:00'\nselect * from teams where crm_id IS NULL;\n\nselect t.name as 'team', u.name as 'owner', u.email, u.phone\nfrom teams t\njoin activity_providers ap on t.id = ap.team_id\njoin users u on t.owner_id = u.id\nwhere 1=1\n and t.status = 'active'\n and ap.is_enabled = 1\n# and u.status = 1\n and ap.provider = 'ms-teams';\n\nselect * from crm_configurations where provider = 'bullhorn'; # 344\nSELECT * FROM teams WHERE id = 442; # 14293\nselect * from users where team_id = 442;\nselect * from social_accounts sa where sa.sociable_id = 14293;\nselect * from invitations where team_id = 442;\n\n# ********************************************************************************************************\nSELECT * FROM users WHERE email LIKE '%nea.liikamaa@eletive.com%'; # 14022\nSELECT * FROM teams WHERE id = 429;\nselect * from opportunities where team_id = 429 and crm_provider_id IN (16157415775, 22246219645);\nselect * from activities where opportunity_id in (4340436,4353519);\n\nselect * from transcription where activity_id IN (25630961,25381771);\nselect * from generic_ai_prompts where subject_id IN (4353519);\n\nSELECT\n a.id as activity_id,\n a.opportunity_id,\n a.type as activity_type,\n a.language,\n CONCAT(a.title, a.description) AS mail_content,\n e.from AS mail_from,\n e.to AS mail_to,\n e.subject AS mail_subject,\n e.body AS mail_body,\n p.type as prompt_type,\n p.status as prompt_status,\n p.content AS prompt_content,\n a.actual_start_time as created_at\nFROM activities a\n LEFT JOIN ai_prompts p ON a.transcription_id = p.transcription_id AND p.deleted_at IS NULL\n LEFT JOIN email_messages e ON a.id = e.activity_id\nWHERE a.actual_start_time > '2024-01-01 00:00:00'\n AND a.opportunity_id IN (4353519)\n AND a.status IN ('completed', 'received', 'delivered')\n AND a.deleted_at IS NULL\n AND a.type NOT IN ('sms-inbound', 'sms-outbound')\nORDER BY a.opportunity_id ASC, a.id ASC;\n\nSELECT * FROM users WHERE name LIKE '%George Fierstone%'; # 14293\nSELECT * FROM teams WHERE id = 442;\nSELECT * FROM crm_configurations WHERE id = 344;\nselect * from team_features where team_id = 442;\nselect * from groups where team_id = 442;\nselect * from playbooks where team_id = 442;\nselect * from playbook_categories where playbook_id = 1729;\nselect * from crm_fields where crm_configuration_id = 344 and id = 172024;\nSELECT * FROM crm_field_values WHERE crm_field_id = 172024;\nselect * from crm_layouts where crm_configuration_id = 344;\nselect * from playbook_layouts where playbook_id = 1729;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Learning%'; # 260, 221, 9444\n\nselect s.*\n# , s.sent_at, u.name, a.*\nfrom activity_summary_logs s\ninner join activities a on a.id = s.activity_id\ninner join users u on u.id = a.user_id\nwhere a.crm_configuration_id = 356\nand s.sent_at > date_sub(now(), interval 60 day)\norder by a.actual_end_time desc;\n\nselect * from activities a\n# inner join activity_summary_logs s on s.activity_id = a.id\nwhere a.crm_configuration_id = 356 and a.actual_end_time > date_sub(now(), interval 60 day)\n# and a.crm_provider_id is not null\n# and provider <> 'ringcentral'\nand status = 'completed'\norder by a.actual_end_time desc;\n\nselect * from teams order by id desc; # 17328, 32, 17830, integration-account@jiminny.com\nSELECT * FROM users;\nSELECT * FROM users where team_id = 260 and status = 1; # 201 - 150 active\nSELECT * FROM teams WHERE id = 260;\nselect * from team_settings where team_id = 260;\nselect * from crm_configurations where team_id = 260;\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 356;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1184;\n\nselect * from accounts where crm_configuration_id = 221 order by id desc; # 7000\nselect * from leads where crm_configuration_id = 221 order by id desc; # 0\nselect * from contacts where crm_configuration_id = 221 order by id desc; # 200 000\nselect * from opportunities where crm_configuration_id = 221 order by id desc; # 0\nselect * from crm_profiles where crm_configuration_id = 221 order by id desc; # 23\nselect * from crm_fields where crm_configuration_id = 221;\nselect * from crm_field_values where crm_field_id = 5302 order by id desc;\nselect * from crm_layouts where crm_configuration_id = 221 order by id desc;\nselect * from stages where crm_configuration_id = 221 order by id desc;\n\nselect * from accounts where crm_configuration_id = 356 order by id desc; # 7000\nselect * from leads where crm_configuration_id = 356 order by id desc; # 0\nselect * from contacts where crm_configuration_id = 356 order by id desc; # 200 000\nselect * from opportunities where crm_configuration_id = 356 order by id desc; # 0\nselect * from crm_profiles where crm_configuration_id = 356 order by id desc; # 23\nselect * from crm_fields where crm_configuration_id = 356;\nselect * from crm_field_values where crm_field_id = 5302 order by id desc;\nselect * from crm_layouts where crm_configuration_id = 356 order by id desc;\nselect * from stages where crm_configuration_id = 356 order by id desc;\n\nselect * from playbooks where team_id = 260 order by id desc; # 4 (2 deleted)\nselect * from groups where team_id = 260 order by id desc; # 27 groups, (2 deleted)\nselect * from playbook_layouts where playbook_id IN (1410,1409,1276,1254); # 4\nselect ce.* from calendars c\njoin users u on c.user_id = u.id\njoin calendar_events ce on c.id = ce.calendar_id\nwhere u.team_id = 260\nand (ce.start_time > '2025-02-21 00:00:00')\n;\n# calendar events 1207\n#\n\nselect * from opportunities where team_id = 260;\nSELECT * FROM crm_field_data WHERE object_id = 4696496;\n\nselect * from activities where crm_configuration_id = 356 and crm_provider_id IS NOT NULL;\nselect * from activities where crm_configuration_id IN (221) and provider NOT IN ('ms-teams', 'uploader', 'zoom-bot')\n# and type = 'conference' and status = 'scheduled' and activities.is_internal = 0\nand created_at > '2024-03-01 00:00:00'\norder by id desc; # 880 000, ringcentral, avaya\nSELECT * FROM participants WHERE activity_id = 26371744;\n\n# all activities 942 000 +\n# conference 7385 - scheduled 984 - external 343\n\nselect * from activities where id = 26321812;\nselect * from participants where activity_id = 26321812;\nselect * from participants where activity_id in (26414510,26414514,26414516,26414604,26414653,26414655);\nselect * from leads where id in (720428,689175,731546,645866,621037);\n\nselect * from users where id = 13841;\nselect * from opportunities where user_id = 9541;\nselect * from stages where id = 15900;\n\nselect * from accounts where\n# id IN (4160055,5053725,4965303,4896434)\nid in (4584518,3249934,3218025,3891133,3399450,4172999,4485161,3101785,4587203,3070816,2870343,2870341,3563940,4550846,3424464,3249963,2870342)\n;\n\nselect * from activities where id = 26654935;\nSELECT * FROM opportunities WHERE id = 4803458;\n\nSELECT * FROM opportunities where team_id = 260 and user_id = 13841 AND stage_id = 15900;\nSELECT id, uuid, provider, type, lead_id, account_id, contact_id, opportunity_id, stage_id, status, recording_state, title, actual_start_time, actual_end_time\nFROM activities WHERE user_id = 13841 AND opportunity_id IN (4729783, 4731717, 4731726, 4732064, 4732849, 4803458, 4813213);\n\nSELECT DISTINCT\n o.id, o.stage_id, s.name, a.title,\n a.*\nFROM activities a\n# INNER JOIN tracks t ON a.id = t.activity_id\nINNER JOIN users u ON a.user_id = u.id\nINNER JOIN teams team ON u.team_id = team.id\nINNER JOIN groups g ON u.group_id = g.id\nINNER JOIN opportunities o ON a.opportunity_id = o.id\nINNER JOIN stages s ON o.stage_id = s.id\nWHERE\n a.crm_configuration_id = 356\n AND a.status IN ('completed', 'failed')\n AND a.recording_state != 'stopped'\n# and a.user_id = 13841\n AND u.uuid = uuid_to_bin('6f40e4b8-c340-4059-b4ac-1728e87ea99e')\n AND team.uuid = uuid_to_bin('a607fba7-452e-4683-b2af-00d6cb52c93c')\n AND g.uuid = uuid_to_bin('b5d69e40-24a0-4c16-810b-5fa462299f94')\n\n AND a.type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')\n# AND t.type IN ('audio', 'video')\n AND (\n (a.actual_start_time BETWEEN '2025-03-13 00:00:00' AND '2025-03-18 07:59:59')\n OR\n (\n a.actual_start_time IS NULL\n AND a.type IN ('sms-outbound', 'sms-inbound')\n AND a.created_at BETWEEN '2025-03-13 00:00:00' AND '2025-03-18 07:59:59'\n )\n )\n AND (\n a.is_private = 0\n OR (\n a.is_private = 1\n AND u.uuid = uuid_to_bin('6f40e4b8-c340-4059-b4ac-1728e87ea99e')\n )\n )\n AND (\n# s.id = 15900\n s.uuid = uuid_to_bin('04ca1c26-c666-4268-a129-419c0acffd73')\n OR s.uuid IS NULL -- Include records without opportunity stage\n )\n\nORDER BY a.actual_end_time DESC;\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Lead Forensics%'; # 190, 162, 8474, willsc@leadforensics.com\nSELECT * FROM users WHERE team_id = 190;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 190\nand sa.provider = 'hubspot';\n\nselect * from role_user where user_id = 8474;\n\nselect * from crm_configurations where provider = 'bullhorn';\n\nSELECT * FROM opportunities WHERE uuid_to_bin('94578249-65ec-4205-90f2-7d1a7d5ab64a') = uuid;\nSELECT * FROM users WHERE uuid_to_bin('26dbadeb-926f-4150-b11b-771b9d4c2f9a') = uuid;\n\nSELECT * FROM opportunities WHERE id = 4732493;\nselect * from activities where opportunity_id = 4732493;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE id = 443; # 358, 14315, andrea.romano@correrenaturale.com\nSELECT * FROM opportunities WHERE team_id = 443;\n\nSELECT a.id, a.type, a.user_id, a.status, a.deleted_at, u.name, u.email, u.team_id as activity_team_id, u.status, u.deleted_at, t.name, t.status, s.team_id as stage_team_id\nFROM activities AS a\nJOIN stages AS s ON a.stage_id = s.id\nJOIN users AS u ON u.id = a.user_id\nJOIN teams AS t ON t.id = s.team_id\nWHERE u.team_id <> s.team_id and t.id > 135;\n\n\nSELECT\n crm_configuration_id,\n crm_provider_id,\n COUNT(*) as duplicate_count,\n GROUP_CONCAT(id) as stage_ids,\n GROUP_CONCAT(name) as stage_names\nFROM stages\nGROUP BY crm_configuration_id, crm_provider_id\nHAVING COUNT(*) > 1\nORDER BY duplicate_count DESC;\n\nselect * from stages where id IN (14898,14907);\n\nselect * from business_processes;\n\nSELECT *\nFROM crm_configurations\nWHERE team_id IN (\n SELECT team_id\n FROM crm_configurations\n GROUP BY team_id\n HAVING COUNT(*) > 1\n)\nORDER BY team_id;\n\nSELECT *\nFROM teams\nWHERE crm_id IN (\n SELECT crm_id\n FROM teams\n GROUP BY crm_id\n HAVING COUNT(*) > 1\n)\nORDER BY crm_id;\n\n# ***************************************************************************\nselect * from crm_configurations where provider = 'integration-app';\nSELECT * FROM teams WHERE id = 443; # Correre Naturale 358 14315 andrea.romano@correrenaturale.com\nselect * from activities where crm_configuration_id = 358 order by actual_end_time desc;\nselect id, uuid, actual_end_time, crm_provider_id, is_internal, playbook_category_id, type, user_id, lead_id, contact_id, account_id, opportunity_id, status, title from activities where crm_configuration_id = 358 order by actual_end_time desc;\nselect * from team_features where team_id = 358;\nselect * from activity_summary_logs;\n\nselect * from teams where id = 406;\n\n# ************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Sportfive%'; # 267, 202, 14637, srv.salesforce@sportfive.com\nselect * from activities where crm_configuration_id = 202 order by actual_end_time desc;\n\nSELECT * FROM users where id = 14637;\nSELECT * FROM teams where id = 267;\nSELECT * FROM groups where id = 1118;\n\nselect g.name, a.title, uuid_from_bin(a.uuid), a.external_id, a.status, a.recording_state, a.recording_reason_code, a.scheduled_start_time, a.scheduled_end_time, a.actual_start_time, a.actual_end_time from activities a\ninner join users u on u.id = a.user_id\ninner join groups g on g.id = u.group_id\nwhere a.crm_configuration_id = 202\nand a.is_internal = 0\nand (a.scheduled_start_time between '2025-03-19 00:00:00' and '2025-03-21 00:00:00')\nand a.type = 'conference'\nand a.status != 'completed'\nand a.external_id is not null\norder by a.scheduled_start_time desc;\n\nSELECT * FROM activities\nWHERE crm_configuration_id = 202\n AND status IN ('completed', 'failed')\n AND recording_state != 'stopped'\n AND type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')\n AND (is_private = 0 OR user_id = 14637)\n AND (\n (\n actual_start_time BETWEEN '2025-03-12 12:00:00' AND '2025-03-24 11:59:59'\n ) OR (\n actual_start_time IS NULL\n AND type IN ('sms-outbound', 'sms-inbound')\n AND created_at BETWEEN '2025-03-12 12:00:00' AND '2025-03-24 11:59:59'\n )\n )\n AND NOT EXISTS (\n SELECT 1\n FROM tracks\n WHERE\n tracks.activity_id = activities.id\n AND tracks.type IN ('audio', 'video')\n )\nORDER BY actual_end_time DESC;\n\nSELECT DISTINCT\n a.*\nFROM activities a\nINNER JOIN tracks t ON a.id = t.activity_id\nINNER JOIN users u ON a.user_id = u.id\nINNER JOIN teams team ON u.team_id = team.id\nWHERE\n a.crm_configuration_id = 202\n AND a.status IN ('completed', 'failed')\n AND a.recording_state != 'stopped'\n# and a.user_id = 14637\n AND a.type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')\n# AND t.type IN ('audio', 'video')\n AND (\n (a.actual_start_time BETWEEN '2025-03-12 12:00:00' AND '2025-03-24 11:59:59')\n OR\n (\n a.actual_start_time IS NULL\n AND a.type IN ('sms-outbound', 'sms-inbound')\n AND a.created_at BETWEEN '2025-03-12 12:00:00' AND '2025-03-24 11:59:59'\n )\n )\n AND (\n a.is_private = 0\n OR (\n a.is_private = 1\n AND a.user_id = 14637\n )\n )\n\nORDER BY a.actual_end_time DESC\n;\n\nSELECT DISTINCT a.*\nFROM activities a\nINNER JOIN users u ON a.user_id = u.id\nINNER JOIN teams t ON u.team_id = t.id\n# INNER JOIN tracks tr ON a.id = tr.activity_id\n# INNER JOIN groups g ON u.group_id = g.id\nWHERE 1=1\n AND t.id = 267\n# AND t.uuid = uuid_to_bin('aed4927b-f1ea-499e-94c3-83762fd233e8')\n AND a.status IN ('completed', 'failed')\n AND a.recording_state != 'stopped'\n AND a.type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')\n# AND tr.type NOT IN ('audio', 'video')\n AND (\n a.is_private = 0\n OR a.user_id = 14637\n )\n AND (\n (a.actual_start_time BETWEEN '2025-03-19 00:00:00' AND '2025-03-21 23:59:59')\n OR (\n a.actual_start_time IS NULL\n AND a.type IN ('sms-outbound', 'sms-inbound')\n AND a.created_at BETWEEN '2025-03-19 00:00:00' AND '2025-03-21 23:59:59'\n )\n )\n# and NOT EXISTS (\n# SELECT 1\n# FROM tracks t\n# WHERE t.activity_id = a.id\n# AND t.type IN ('audio', 'video')\n# )\n\nORDER BY a.actual_end_time DESC;\n\nSELECT * FROM tracks WHERE activity_id = 26485995;\n\nselect a.is_private, a.title, uuid_from_bin(a.uuid), a.external_id, a.status, a.recording_state, a.recording_reason_code, a.scheduled_start_time, a.scheduled_end_time, a.actual_start_time, a.actual_end_time from activities a\ninner join users u on u.id = a.user_id\nwhere a.crm_configuration_id = 202\n# and a.is_internal = 0\nand (a.actual_start_time between '2025-03-19 00:00:00' and '2025-03-21 00:00:00')\nand a.type IN (\"softphone\",\"softphone-inbound\",\"conference\",\"sms-inbound\")\nand a.status IN ('completed', 'failed')\n# and a.external_id is not null\norder by a.actual_end_time desc;\n\nselect * from activities a where a.crm_configuration_id = 202\nand a.actual_start_time between '2025-03-20 00:00:00' and '2025-03-21 00:00:00'\n# AND a.type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')\n\nselect g.name, a.title, uuid_from_bin(a.uuid), a.external_id, a.status, a.recording_state, a.recording_reason_code, a.scheduled_start_time, a.scheduled_end_time, a.actual_start_time, a.actual_end_time from activities a\ninner join users u on u.id = a.user_id\ninner join groups g on g.id = u.group_id\nwhere a.crm_configuration_id = 202\nand a.is_internal = 0\nand (a.scheduled_start_time between '2025-03-19 00:00:00' and '2025-03-21 00:00:00')\nand a.type = 'conference'\nand a.status != 'completed'\nand a.external_id is not null\norder by a.scheduled_start_time desc;\n\nSELECT * FROM teams WHERE name LIKE '%Tourlane%';\nSELECT * FROM crm_fields WHERE crm_configuration_id = 209 and object_type = 'opportunity';\nSELECT * FROM crm_field_data WHERE crm_field_id = 98809;\n\nselect * from users where status = 1 AND timezone = 'MDT';\n\nselect * from opportunities where id = 3769814;\nselect * from deal_risks where opportunity_id = 3769814;\n\nselect cp.* from crm_profiles cp\njoin users u on cp.user_id = u.id\njoin crm_configurations crm on cp.crm_configuration_id = crm.id\nwhere crm.provider = 'hubspot' AND u.status = 1 AND log_notes != 'none';\n\nselect * from crm_fields where id = 154575;\n\nselect * from team_features where feature = 'SUPPORTS_SYNC_MISSING_CALL_DISPOSITIONS';\nSELECT * FROM teams WHERE id = 176; # crm 148\nselect * from activities where crm_configuration_id = 148 and provider = 'hubspot' order by id desc;\n\nselect * from activity_providers where provider = 'amazon-connect';\n\nselect * from crm_fields cf\njoin crm_configurations crm on crm.id = cf.crm_configuration_id\nwhere crm.provider = 'hubspot' and cf.object_type IN ('account', 'contact');\n\n# *********************************************************************************************\nSELECT * FROM users WHERE id IN (15415, 15418);\nSELECT * FROM groups WHERE id IN (1805,1806);\nSELECT * FROM playbooks WHERE id = 1860;\nSELECT * FROM playbook_categories WHERE id = 38634;\nSELECT * FROM crm_fields WHERE id = 189962;\n\nSELECT * FROM teams WHERE name = 'Pulsar Group'; # 472, 380, 15138 raza.gilani@vuelio.com\n\nSELECT * FROM crm_profiles WHERE user_id = 15415;\nSELECT * FROM social_accounts WHERE sociable_id = 15415 and provider = 'salesforce';\n\nselect * from sidekick_settings where team_id = 472;\n\nSELECT * FROM activities WHERE uuid_to_bin('452c58c7-b87c-4fdd-953e-d7af185e9588') = uuid; # 28617536, user: 15418\nSELECT * FROM activities WHERE uuid_to_bin('399114ee-d3a8-458c-bff5-5f654658db0a') = uuid; # 28344407, user: 15415\nSELECT * FROM activities WHERE uuid_to_bin('f0aa567f-0ab1-4bbb-96aa-37dcf184676b') = uuid; # 28580288, user: 15415\nSELECT * FROM activities WHERE uuid_to_bin('50c086b1-2770-4bca-b5ae-6bac22ec426b') = uuid; # 28566069, user: 15415\n\n# *********************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%TeamTailor%'; # 109, 218, 13969, salesforce-integrations@teamtailor.com\nselect * from crm_configurations where id = 218;\nSELECT * FROM activities WHERE uuid_to_bin('e39b5857-7fdb-4f5a-951a-8d3ca69bb1b0') = uuid; # 28338765\nSELECT * FROM users WHERE id IN (13232, 13230);\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 109\nand sa.provider = 'salesforce';\n\n0057R00000EPL5HQAX Inez Ekblad\n\n1091cb81-5ea1-4951-a0ed-f00b568f0140 Triman Kaur\n\nSELECT * FROM crm_profiles WHERE user_id IN (13232, 13230);\n\n############################################################################################\nSELECT * FROM activities WHERE uuid_to_bin('675eeaeb-5681-42db-90bc-54c07a604408') = uuid; # 28655939 00UVg00000FLvnSMAT\nSELECT * FROM crm_field_data WHERE activity_id = 28655939;\nSELECT * FROM crm_fields WHERE id IN (94491,94493,94498);\nSELECT * FROM users WHERE id = 13658;\nSELECT * FROM teams WHERE id = 109;\nSELECT * FROM crm_configurations WHERE id = 218;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 109\nand sa.provider = 'salesforce';\n\n# ********************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Strengthscope%'; # 481, 390, 15420, katy.holden@strengthscope.comk\nSELECT * FROM stages WHERE crm_configuration_id = 390;\nselect * from business_processes where team_id = 481 and crm_configuration_id = 390;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 481\nand sa.provider = 'salesforce';\n\n\nSELECT * FROM users WHERE id = 15780; # team 462\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 462\nand sa.provider = 'hubspot';\n\n\nselect * from teams where id = 495;\nSELECT * FROM users WHERE id = 15794;\nselect * from social_accounts where sociable_id = 15794;\n\n# ********************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Flight%'; # 427, 333, 13752\nSELECT * FROM accounts WHERE team_id = 427 and crm_provider_id = '668731000183444517';\n\n# ********************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Group GTI%'; # 495, 407, 15794\nSELECT * FROM activities WHERE crm_configuration_id = 407\nand status = 'completed' and type = 'conference'\norder by id desc;\n\nselect ru.*, pr.*, p.* from users u join role_user ru on ru.user_id = u.id\njoin permission_role pr on pr.role_id = ru.role_id\n join permissions p on p.id = pr.permission_id\nwhere team_id = 495 and p.name IN ('dial');\n\nselect * from permission_role;\n\nselect * from activities where crm_configuration_id = 407 and status = 'completed' order by id desc;\nSELECT * FROM activities WHERE id = 29512773;\nSELECT * FROM activities WHERE id IN (29042721,28991325,29002874);\n\nSELECT al.* from activity_summary_logs al join activities a on a.id = al.activity_id\nwhere a.crm_configuration_id = 407\n# and a.id IN (29042721,28991325,29002874);\n\nSELECT * FROM users WHERE id = 15794;\nSELECT * FROM users WHERE team_id = 495;\nSELECT * FROM social_accounts WHERE sociable_id = 15794;\nSELECT * FROM opportunities WHERE team_id = 495 and name like '%OC:%';\nSELECT * FROM contacts WHERE team_id = 495;\nSELECT * FROM leads WHERE team_id = 495;\nSELECT * FROM accounts WHERE team_id = 495;\nSELECT * FROM crm_profiles WHERE crm_configuration_id = 407;\nSELECT * FROM crm_fields WHERE crm_configuration_id = 407;\nSELECT * FROM crm_configurations WHERE id = 407;\nSELECT * FROM opportunities WHERE team_id = 495 and close_date BETWEEN '2025-06-01' AND '2025-07-01'\nand user_id IS NOT NULL and is_closed = 1 and is_won = 1;\n\n# ********************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Hamilton Court FX LLP%'; # 249, 187, 10103\nSELECT * FROM activities WHERE uuid_to_bin('4659c2bb-9a49-484e-9327-a3d66f1e028c') = uuid; # 28951064\nSELECT * FROM crm_fields WHERE crm_configuration_id = 187 and object_type IN ('tasks', 'event');\n\n# *********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Checkstep%'; # 325, 256, 11753\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 325\nand sa.provider = 'hubspot';\n\nSELECT * FROM activities WHERE uuid_to_bin('7be372e2-1916-4d79-a2f3-ca3db1346db3') = uuid; # 28611085\nSELECT * FROM activities WHERE uuid_to_bin('980f0336-840b-4185-a5a9-30cf8b0749a8') = uuid; # 28719733\nSELECT * FROM activity_summary_logs where activity_id = 28719733;\n\n# *************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Learning%'; # 260, 356, 9444\nSELECT * FROM activity_summary_logs where sent_at BETWEEN '2025-06-09 11:38:00' AND '2025-06-09 11:40:00';\nSELECT * FROM leads WHERE crm_configuration_id = 356 and crm_provider_id = '230045001502770504'; # 823630\nselect * from activities where crm_configuration_id = 356 and lead_id = 841732;\n\nSELECT * from activity_summary_logs al join activities a on a.id = al.activity_id\nwhere a.crm_configuration_id = 356;\n\nselect * from activities where crm_configuration_id = 356\nand actual_end_time between '2025-06-09 11:00:00' and '2025-06-09 12:00:00'\norder by id desc;\n\nselect * from accounts where crm_configuration_id = 356 and crm_provider_id = '230045001514403366' order by id desc;\nselect * from leads where crm_configuration_id = 356 and crm_provider_id = '230045001514275654' order by id desc;\nselect * from contacts where crm_configuration_id = 356 and crm_provider_id = '230045001514403366' order by id desc;\nselect * from opportunities where crm_configuration_id = 356 and crm_provider_id = '230045001514403366' order by id desc;\n\nselect * from team_features where team_id = 260;\nselect * from features where id IN (1,2,4,6,18,19,20,9,10,3,23,24,25,26,27);\n\nSELECT * FROM activities WHERE uuid_to_bin('7be372e2-1916-4d79-a2f3-ca3db1346db3') = uuid;\n\nselect * from crm_fields;\nselect * from crm_layout_entities;\n\nSELECT * FROM teams WHERE name LIKE '%Optable%';\n\n# *************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Teamtailor%'; # 109, 218, 13969\nSELECT * FROM crm_configurations WHERE id = 218;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 109\nand sa.provider = 'salesforce';\nSELECT * FROM activities WHERE uuid_to_bin('675eeaeb-5681-42db-90bc-54c07a604408') = uuid; # 28655939\nSELECT * FROM crm_field_data WHERE activity_id = 28655939;\nSELECT * FROM crm_fields WHERE id in (94491,94493,94498);\n\nselect * from teams where crm_id IS NULL;\n\nSELECT * FROM activities WHERE uuid_to_bin('71aa8a0c-9652-4ff6-bee7-d98ae60abef6') = uuid;\n\n# *************************************************************************************************\nselect * from team_domains where team_id = 399;\nSELECT * FROM teams WHERE name LIKE '%Rydoo%'; # 399, 318, 13207\n\nselect * from calendar_events where id = 5163781;\nSELECT * FROM activities WHERE uuid_to_bin('be2cbc52-7fda-46a0-9ae0-25d9553eafc0') = uuid; # 29443896\nSELECT * FROM participants WHERE activity_id = 29443896;\nselect * from contacts where crm_configuration_id = 318 and email = 'marianne.westeng@strawberry.no';\nselect * from leads where crm_configuration_id = 318 and email = 'marianne.westeng@strawberry.no';\n\nselect * from activities where user_id = 14937 order by created_at ;\n\nselect * from users where id = 14937;\n\nselect * from contacts where crm_configuration_id = 318 and email LIKE '%@strawberry.se';\nselect * from opportunities where crm_configuration_id = 318 and crm_provider_id = '006Sf00000D1WOAIA3';\n\nselect * from activities a join participants p on a.id = p.activity_id\nwhere crm_configuration_id = 318 and a.updated_at > '2025-06-23T08:18:43Z';\n\n# *************************************************************************************************\nSELECT * FROM opportunities WHERE team_id = 379 and crm_provider_id = '39334518886';\nSELECT * FROM opportunities WHERE team_id = 379 order by id desc;\nSELECT * FROM teams WHERE id = 379;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 379 and sociable_id = 13852\nand sa.provider = 'hubspot';\n\nSELECT * FROM crm_configurations WHERE id = 307;\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 307;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1027;\nSELECT * FROM crm_fields WHERE crm_configuration_id = 307\n and id IN (144750,144855,145158,155227);\n\nSELECT * FROM activities;\n\n\nselect * from activities\nwhere created_at > '2025-07-01 00:00:00'\n# and created_at < '2025-08-01 00:00:00'\nand type not in ('email-outbound', 'email-inbound')\nand account_id is null\nand contact_id is null\nand lead_id is null\nand opportunity_id is not null\n;\nSELECT * FROM activities WHERE id IN (25344155, 25344296, 25501909, 28692187);\nSELECT * FROM crm_configurations WHERE id in (335,301,200);\n\nselect * from crm_fields where crm_configuration_id = 230 and crm_provider_id = 'Age2__c';\n\nSELECT * FROM teams WHERE name LIKE '%Resights%';\nselect * from crm_fields where crm_configuration_id = 1 and object_type = 'opportunity';\n\nselect * from crm_configurations where provider = 'bullhorn'; # 344\nselect * from teams where id IN (442);\n\nselect * from activities\nwhere crm_configuration_id = 177\nand provider = 'amazon-connect'\n order by id desc;\n# and source <> 'gong';\n\nselect * from activity_providers where provider = 'amazon-connect';\n\nSELECT * FROM activities WHERE uuid_to_bin('cec1993b-a7e5-4164-b74d-d680ea51d2f2') = uuid;\n\n\nselect * from crm_configurations where store_transcript = 1;\nSELECT * FROM teams WHERE id IN (80);\n\n# *************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Sedna%'; # 277, 213, 12594\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 277\nand sa.provider = 'salesforce';\n\nselect * from activities where crm_configuration_id = 213 and account_id = 2511502;\n\nselect * from crm_configurations where id = 213;\n\nSELECT * FROM activities WHERE uuid_to_bin('35aa790a-8569-4544-8268-66f9a4a26804') = uuid; # 33981604\nSELECT * FROM participants WHERE activity_id = 33981604;\nSELECT * FROM crm_fields WHERE crm_configuration_id = 337 and object_type = 'task';\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 431\nand sa.provider = 'salesforce';\nSELECT * FROM activities WHERE uuid_to_bin('b5476c7d-19a8-491b-869d-676ea1e857b6') = uuid; # 33997223\nselect * from activity_summary_logs where activity_id = 33997223;\nselect * from activity_notes where activity_id = 33997223;\n\n# ***********************************\nSELECT * FROM teams WHERE name LIKE '%Abode%';\n\n\nselect * from features;\nselect * from teams t\nwhere t.status = 'active'\nand id NOT IN (select team_id from team_features where feature_id = 9)\n;\n\n\nselect * from playbook_layouts where playbook_id = 1725;\nSELECT * FROM activities WHERE uuid_to_bin('65cc283c-4849-49e6-927f-4c281c8fea19') = uuid; # 34297473\nselect * from teams where id = 318;\nselect * from crm_configurations where team_id = 318;\nselect * from playbooks where team_id = 318;\nSELECT * FROM crm_layouts where crm_configuration_id = 381;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1259;\nSELECT * FROM crm_fields WHERE id IN (192938,192936,192939);\n\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1266;\nSELECT * FROM crm_fields WHERE id IN (192980,192991,192997,192998,193064,193067);\n\nSELECT * FROM activities WHERE uuid_to_bin('a902289b-285c-48eb-9cc2-6ad6c5d938f5') = uuid; # 34297533\n\n\n\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 927;\nSELECT * FROM crm_fields WHERE id IN (131668,131669,131670,131671,131676,131797);\n\nSELECT * FROM teams WHERE name LIKE '%Peripass%'; # 351, 281, 12124\nselect * from crm_layouts where crm_configuration_id = 281;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 927;\nselect * from crm_fields where crm_configuration_id = 281 and id in (131668,131669,131670,131671,131676,131797);\nselect * from opportunities where crm_configuration_id = 281;\n\nSELECT * FROM activities WHERE id IN (34211315, 34130075);\nSELECT * FROM crm_field_data WHERE object_id IN (34211315, 34130075);\n\nselect cf.crm_configuration_id, cle.crm_layout_id, cle.id, cf.id from crm_field_data cfd\njoin crm_layout_entities cle on cle.id = cfd.crm_layout_entity_id\njoin crm_fields cf on cle.crm_field_id = cf.id\nwhere cf.deleted_at IS NOT NULL\nGROUP BY cle.id, cf.id;\n\nselect * from crm_layouts where id IN (355);\nselect u.email, t.crm_id, t.* from teams t\njoin users u on u.id = t.owner_id\nwhere crm_id IN (97);\n\nSELECT * FROM crm_fields WHERE id = 96492;\n\nselect * from permissions;\nselect * from permission_role where permission_id = 247;\nselect * from roles;\n\nselect * from migrations;\n# *****************************************************************\nSELECT * FROM activities WHERE uuid_to_bin('291e3c21-11cc-4728-aee7-6e4bedf86d72') = uuid; # 34262174\nSELECT * FROM crm_configurations WHERE id = 301;\nSELECT * FROM teams WHERE id = 343;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 343\nand sa.provider = 'hubspot';\n\nselect * from participants where activity_id = 34262174;\n\nselect * from contacts where crm_configuration_id = 301 and id = 6976326;\nselect * from accounts where crm_configuration_id = 301 and id IN (4647626, 4815829); # 30761335403\n\nselect * from activity_summary_logs where activity_id = 34262174;\n\nselect * from users where status = 1 AND timezone = 'EST';\n\n# ****************************************************************************\nSELECT * FROM users WHERE id = 13869;\nSELECT * FROM crm_configurations WHERE id = 320;\nSELECT * FROM teams WHERE id = 401;\n\nSELECT * FROM activities WHERE uuid_to_bin('2228c16f-10be-48d5-90d4-67385219dc01') = uuid; # 29670601\n\nSELECT * FROM accounts WHERE id = 7761483;\nSELECT * FROM opportunities WHERE id = 6051814;\n\nSELECT * FROM teams WHERE name LIKE '%Seedlegals%';\n\n;select * from opportunities where updated_at > '2025-10-11' AND crm_provider_id = '34713761166';\n\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 177;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 577;\nSELECT * FROM crm_fields WHERE id IN (68458,68459,68480,68497,68524,68530,68554,68618,68662,68781,68810,68898,68981,69049,97467);\n\nSELECT t.id, crm.id, t.name, crm.sync_objects, crm.provider, crm.last_synced_at FROM crm_configurations crm join teams t on t.crm_id = crm.id\nwhere t.status = 'active' AND crm.provider = 'hubspot' AND crm.last_synced_at < '2025-10-22 00:00:00';\n\nSELECT * FROM activities WHERE uuid_to_bin('fa09449f-cba9-496a-b8f3-865cd3c72351') = uuid;\nSELECT * FROM crm_configurations where id = 184;\nSELECT * FROM teams WHERE id = 246;\nSELECT * FROM social_accounts WHERE sociable_id = 9259 and provider = 'hubspot';\n\nSELECT * FROM users WHERE email LIKE '%rhian.old@bud.co.uk%'; # 17700\nSELECT * FROM teams WHERE id = 551;\n\nSELECT * FROM crm_configurations WHERE id = 471;\nSELECT * FROM activities WHERE crm_configuration_id = 471 and crm_provider_id IS NOT NULL;\nSELECT * FROM crm_fields WHERE crm_configuration_id = 471;\nSELECT * FROM crm_fields WHERE id = 307260;\nSELECT * FROM crm_field_values WHERE crm_field_id = 307260;\n\nselect * from crm_layouts where crm_configuration_id = 471;\n\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1547;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1548;\n\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 551 and sa.provider = 'hubspot';\n\nSELECT * FROM teams WHERE name LIKE '%$PCS%';\n\n# ********************************************************************************************************\nselect * from crm_configurations crm\njoin teams t on t.crm_id = crm.id\nwhere t.status = 'active'\nand crm.provider = 'hubspot';\n\n# $slug = 'HUBSPOT_WEBHOOK_SYNC';\n# $team = Jiminny\\Models\\Team::find(2);\n# $feature = Feature::query()->where('slug', $slug)->first();\n# TeamFeature::query()->create(['feature_id' => $feature->getId(),'team_id' => $team->getId()]);\n\n# hubspot_webhook_metrics\n\nselect * from crm_configurations where id = 331; # 416\nSELECT * FROM teams WHERE id = 416;\nSELECT * FROM opportunities WHERE team_id = 190;\n\nSELECT * FROM teams WHERE name LIKE '%Lead Forensics%';\nSELECT sa.id,\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 190 and sa.provider = 'hubspot';\n\n\n\nSELECT * FROM teams WHERE name LIKE '%Rapaport%'; # 431, 337\nSELECT * FROM teams where id = 431;\nSELECT * FROM crm_configurations where team_id = 431;\nSELECT * FROM activity_providers where team_id = 431;\nSELECT * FROM activities where crm_configuration_id = 337 and type IN ('softphone', 'softphone-outbound')\nand provider NOT IN ('hubspot', 'aircall')\n# and telephony_provider_id = '019c1131-a22f-4792-b9ea-20adf6a02ed0'\norder by id desc;\nSELECT sa.id,\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 431 and sa.provider = 'salesforce';\n\nSELECT * FROM teams WHERE name LIKE '%BiP%'; # 401, 320\nSELECT * FROM teams where id = 401;\nSELECT * FROM crm_configurations where team_id = 401;\nSELECT * FROM activity_providers where team_id = 401;\nSELECT * FROM activities where crm_configuration_id = 320 and type IN ('softphone', 'softphone-outbound')\nand provider NOT IN ('hubspot', 'aircall')\n# and telephony_provider_id = '019c1131-a22f-4792-b9ea-20adf6a02ed0'\norder by id desc;\nSELECT sa.id,\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 401 and sa.provider = 'salesforce';\n\n\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 307; # 379 - Story Terrace Inc , portalId: 3921157\nSELECT * FROM contacts WHERE team_id = 379 and updated_at > '2026-01-31 11:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 379 and updated_at > '2026-02-01 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 379 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 379 and sa.provider = 'hubspot';\n\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 485; # 563 - LATUS Group (ad94d501-5d09-44fd-878f-ca3a9f8865c3) , portalId: 3904501\nSELECT * FROM opportunities WHERE team_id = 563 and updated_at > '2026-02-02 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 563 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 338; # 432 - Formalize , portalId: 9214205\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 432 and sa.provider = 'hubspot';\nSELECT * FROM opportunities WHERE team_id = 432 and updated_at > '2026-02-02 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 432 and updated_at > '2026-02-10 00:00:00' order by updated_at desc;\n\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 436; # 519 - Moxso , portalId: 25531989\nSELECT * FROM opportunities WHERE team_id = 519 and updated_at > '2026-02-02 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 519 and updated_at > '2026-02-04 11:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 96; # 119 - Nourish Care , portalId: 26617984\nSELECT * FROM opportunities WHERE team_id = 119 and updated_at > '2026-02-02 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 119 and updated_at > '2026-02-04 11:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 331; # 416 - The National College , portalId: 7213852\nSELECT * FROM opportunities WHERE team_id = 416 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 416 and updated_at > '2026-02-04 11:00:00' order by updated_at desc;\n\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 308; # 380 - Foodles , portalId: 7723616\nSELECT * FROM opportunities WHERE team_id = 380 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 380 and updated_at > '2026-02-06 10:30:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 379; # 471 - imat-uve , portalId: 9177354\nSELECT * FROM opportunities WHERE team_id = 471 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 471 and updated_at > '2026-02-06 10:30:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 465; # 545 - Spotler , portalId: 144759271\nSELECT * FROM opportunities WHERE team_id = 545 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 545 and updated_at > '2026-02-06 10:30:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 455; # 537 - indevis , portalId: 25666868\nSELECT * FROM opportunities WHERE team_id = 537 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 537 and updated_at > '2026-02-06 10:30:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 200; # 265 - Jobadder , portalId: 6426676\nSELECT * FROM opportunities WHERE team_id = 265 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 265 and updated_at > '2026-02-06 10:30:00' order by updated_at desc;\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 335; # 429 - Eletive , portalId: 6110563\nSELECT * FROM opportunities WHERE team_id = 429 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 429 and updated_at > '2026-02-09 10:30:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 363; # 456 - Global Group , portalId: 8901981\nSELECT * FROM opportunities WHERE team_id = 456 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 456 and updated_at > '2026-02-09 10:30:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 297; # 369 - Unbiased , portalId: 9229005\nSELECT * FROM opportunities WHERE team_id = 369 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 369 and updated_at > '2026-02-09 10:30:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 353; # 449 - Fuuse , portalId: 25781745\nSELECT * FROM opportunities WHERE team_id = 449 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 449 and updated_at > '2026-02-09 10:30:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 487; # 566 - Nimbus , portalId: 39982590\nSELECT * FROM opportunities WHERE team_id = 566 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 566 and updated_at > '2026-02-09 10:30:00' order by updated_at desc;\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 487;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1630;\nselect * from crm_fields where crm_configuration_id = 487 and\n(uuid_to_bin('4c6b2971-64d4-45b8-b377-427be758b5a5') = uuid or uuid_to_bin('59e368d8-65a0-4b77-b611-db37c99fbe68') = uuid);\nSELECT * FROM crm_field_values WHERE crm_field_id = 375177;\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 420; # 506 - voiio , portalId: 145629154\nSELECT * FROM opportunities WHERE team_id = 506 and updated_at > '2026-02-10 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 506 and updated_at > '2026-02-10 15:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 479; # 558 - Momice , portalId: 535962\nSELECT * FROM opportunities WHERE team_id = 558 and updated_at > '2026-02-10 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 558 and updated_at > '2026-02-10 15:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 59; # 80 - Storyclash GmbH , portalId: 4268479\nSELECT * FROM opportunities WHERE team_id = 80 and updated_at > '2026-02-10 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 80 and updated_at > '2026-02-10 15:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 175; # 203 - Team iAM , portalId: 5534732\nSELECT * FROM opportunities WHERE team_id = 203 and updated_at > '2026-02-10 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 203 and updated_at > '2026-02-10 15:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 368; # 460 - OneTouch Health , portalId: 5534732183355\nSELECT * FROM opportunities WHERE team_id = 460 and updated_at > '2026-02-10 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 460 and updated_at > '2026-02-10 15:00:00' order by updated_at desc;\n\n\n\nselect * from users where id = 29643;\nSELECT * FROM crm_field_values WHERE crm_field_id = 375177;\n# ********************************************************************\nSELECT * FROM teams WHERE name LIKE '%Buynomics%'; # 462, 482, 14910\nSELECT * FROM activities WHERE crm_configuration_id = 482\nand type NOT IN ('email-inbound', 'email-outbound')\n# and description like '%The call focused on understanding Welch%'\norder by id desc;\n\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 462 and sa.provider = 'salesforce';\n\nselect * from contacts where crm_configuration_id = 482 and name = 'Cyndall Hill'; # 15504749\nselect * from contacts where id = 10891096; # 482\nSELECT * FROM activities WHERE crm_configuration_id = 482\nand type NOT IN ('email-inbound', 'email-outbound')\nand contact_id = 15504749\norder by id desc;\n\nselect * from activities where id = 36793003; # 96cc7bc1-8622-4d27-92f4-baf664fc1a56, 00UOf00000PDdOXMA1\nselect * from transcription where id = 7646782;\nselect * from ai_prompts where transcription_id = 7646782;\n\n# ********************************************************************\nSELECT * FROM activities WHERE uuid_to_bin('7a8471a3-847e-4822-802b-ddf426bbc252') = uuid; # 37370018\nSELECT * FROM activity_summary_logs WHERE activity_id = 37370018;\nSELECT * FROM teams WHERE id = 555;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 555 and sa.provider = 'hubspot';\n\n# ********************************************************************\nSELECT * FROM activities WHERE uuid_to_bin('7c17b8aa-09df-4f85-a0f7-51f47afd712d') = uuid; # 37395250\nSELECT * FROM activities WHERE uuid_to_bin('14d60388-260d-494b-aa0d-63fdb1c78026') = uuid; # 37395250\n\nSELECT a.* FROM activities a JOIN crm_configurations c on c.id = a.crm_configuration_id\nwhere a.type IN ('softphone', 'softphone-outbound') and c.provider = 'hubspot'\nand a.provider NOT IN ('hubspot')\n# and a.provider IN ('salesloft')\n# and c.id NOT IN (70)\n# and a.duration > 30\n# and actual_start_time > '2026-02-05 00:00:00'\norder by a.id desc;\n\nSELECT * FROM activities WHERE id = 37549787;\nSELECT * FROM crm_profiles WHERE user_id = 17613;\n\nSELECT * FROM crm_configurations WHERE id = 70;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 93 and sa.provider = 'hubspot';\n\nSELECT asf.activity_search_id, asf.id, asf.value\nFROM activity_search_filters asf\nWHERE asf.filter = 'group_id'\nAND asf.value IN (\n SELECT CONCAT(\n HEX(SUBSTR(uuid, 5, 4)), '-',\n HEX(SUBSTR(uuid, 3, 2)), '-',\n HEX(SUBSTR(uuid, 1, 2)), '-',\n HEX(SUBSTR(uuid, 9, 2)), '-',\n HEX(SUBSTR(uuid, 11))\n )\n FROM groups\n WHERE deleted_at IS NOT NULL\n);\n\nSELECT * FROM crm_configurations WHERE id = 373; # KPSBremen.de 465 # - no social account\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 465 and sa.provider = 'hubspot';\n\nselect * from crm_configurations where id = 494;\n\nSELECT * FROM teams WHERE name LIKE '%splose%'; # 572, 495, 18708\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 572 and sa.provider = 'pipedrive';\n\nselect * from opportunities where team_id = 572\n# and name like '%Onebright%'\n# and is_closed = 1 and is_won = 0\n order by id desc;\n\n\nselect * from users where deleted_at is null and status = 2;\n\nselect * from contacts where id = 17900517;\nselect * from accounts where id = 10109838;\nselect * from opportunities where id = 6955880;\n\nselect * from opportunity_contacts where opportunity_id = 6955880;\nselect * from opportunity_contacts where contact_id = 17900517;\n\nselect * from contact_roles cr join crm_configurations crm on cr.crm_configuration_id = crm.id\nwhere crm.provider != 'salesforce';\n\nSELECT * FROM activities WHERE uuid_to_bin('adcb8331-5988-4353-834e-383a355abba2') = uuid; # 38056424, crm 104659682404\nselect * from teams where id = 456;\nSELECT * FROM crm_configurations WHERE id = 363;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 456 and sa.provider = 'hubspot';\n\nselect * from crm_layouts where crm_configuration_id = 363;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id IN (1203, 1204, 1635);\nSELECT * FROM crm_fields WHERE id IN (181536, 181538, 213455);\n\nSELECT * FROM teams WHERE name LIKE '%Electric%'; # 342, 272, 12767\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 342 and sa.provider = 'pipedrive';\nSELECT * FROM opportunities WHERE crm_configuration_id = 272 and name like 'NORTHUMBRIA POL%'; # and updated_at > '2025-07-01 00:00:00';\nSELECT * FROM opportunities WHERE crm_configuration_id = 272 order by remotely_created_at asc; # and updated_at > '2025-07-01 00:00:00';\nSELECT * FROM opportunities WHERE crm_configuration_id = 272 and updated_at > '2026-01-01 00:00:00';\nSELECT * FROM crm_fields WHERE crm_configuration_id = 272 and object_type = 'opportunity';\nSELECT * FROM crm_field_values WHERE crm_field_id = 127164;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 342 and sa.provider = 'pipedrive';\n\nSELECT * FROM teams WHERE id = 472;\nSELECT * FROM crm_configurations WHERE id = 380;\nselect * from activities where id = 38285673; # 38285673\nSELECT * FROM users WHERE id = 16942;\nSELECT * FROM groups WHERE id = 1964;\nSELECT * FROM playbooks WHERE id = 2033;\n\nselect * from teams where created_at > '2026-03-09';\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 499; # 1065\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1678;\n\nSELECT * FROM teams WHERE id = 575;\nselect * from opportunities where team_id = 575;\n\nSELECT * FROM activities WHERE uuid_to_bin('96b1261f-2357-49f9-ab38-23ce12008ea0') = uuid;\n\nselect * from contacts c\nwhere c.crm_configuration_id = 370 order by c.updated_at desc;\n\nSELECT * FROM participants where activity_id = 38833541;\nSELECT * FROM participants where activity_id = 39216301;\nSELECT * FROM activity_summary_logs where activity_id = 39216301;\nSELECT * FROM activities WHERE uuid_to_bin('c7d99fbe-1fb1-41f2-8f4d-52e2bf70e1e9') = uuid; # 38833541, crm 478116564181\nSELECT * FROM activities WHERE uuid_to_bin('2e6ff4d3-9faa-447a-a8c1-9acde4d885ae') = uuid; # 39216301, crm 480171536586\nselect * from crm_profiles where crm_configuration_id = 319 and crm_provider_id = 525785080;\nselect * from opportunities where crm_configuration_id = 319 and crm_provider_id = 410150124747;\nselect * from accounts where crm_configuration_id = 319 and crm_provider_id = 47150650569;\nselect * from contacts where crm_configuration_id = 319 and crm_provider_id IN ('665587441856', '742723347700');\n# owner 13236 525785080\n# contact 1 16779180 665587441856 - activity - Alex Howes alex@supportroom.com created 2026-01-26\n# contact 2 19247563 742723347700 - ash@supportroom.com 2026-03-24\n# company 4176133 47150650569\n# deal 7100953 410150124747\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 400 and sa.provider = 'hubspot';\n\nselect * from features;\nselect * from team_features where feature_id = 40;\n\nselect * from teams where id = 556; # owner: 18101, crm: 477\nselect * from crm_configurations where id = 477;\nSELECT * FROM users WHERE id = 18101;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 556 and sa.provider = 'integration-app';\n\nselect * from opportunities where id = 7594349;\nselect * from opportunity_stages where opportunity_id = 7594349 order by created_at desc;\nselect * from business_processes where id = 6024;\nselect * from business_process_stages where stage_id = 16352;\nselect * from business_process_stages where business_process_id = 6024;\nselect * from stages where team_id = 459;\nselect * from teams where id = 459;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 459 and sa.provider = 'hubspot';\n\nSELECT os.stage_id, s.crm_provider_id, s.name, COUNT(*) as cnt\nFROM opportunity_stages os\nJOIN stages s ON s.id = os.stage_id\nWHERE os.opportunity_id = 7594349\nGROUP BY os.stage_id, s.crm_provider_id, s.name\nORDER BY cnt DESC;\n\nSELECT s.id, s.crm_provider_id, s.name, s.team_id, s.crm_configuration_id\nFROM stages s\nJOIN business_process_stages bps ON bps.stage_id = s.id\nWHERE bps.business_process_id = 6024\nAND s.crm_provider_id = 'contractsent';\n\nselect * from stages where id IN (16352,20612,18281,7344,16378,16309,5036,15223,14535,6293,12098,11607)\n\nSELECT * FROM teams WHERE name LIKE '%Pulsar Group%'; # 472, 380, 15138, raza.gilani@vuelio.com\nselect * from playbooks where team_id = 472; # event 226147\nSELECT * FROM playbook_categories WHERE playbook_id = 2288;\nSELECT * FROM crm_fields WHERE id = 226147;\nSELECT * FROM crm_field_values WHERE crm_field_id = 226147;\n\nSELECT * FROM crm_configurations WHERE id = 380;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 472 and sa.provider = 'salesforce';","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Project","depth":3,"role_description":"text"},{"role":"AXButton","text":"Project","depth":3,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"New File or Directory…","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Expand Selected","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Collapse All","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Options","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
-7246725341180660992
|
2146738311620114029
|
click
|
accessibility
|
NULL
|
Project: faVsco.js, menu
#11894 on JY-18909-automa Project: faVsco.js, menu
#11894 on JY-18909-automated-reports-ask-jiminny, menu
Start Listening for PHP Debug Connections
RequestGenerateAskJiminnyReportJobTest
Run 'RequestGenerateAskJiminnyReportJobTest'
Debug 'RequestGenerateAskJiminnyReportJobTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
2
1
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Services\Kiosk\AutomatedReports;
use Jiminny\Component\ActivitySearch\FilterDefinition\ActivityActualDate;
use Jiminny\Component\ActivitySearch\FilterDefinition\ActivityUpdatedDate;
use Jiminny\Component\ActivitySearch\FilterDefinition\DealInsights\ClosingPeriodFilter;
use Jiminny\Component\ActivitySearch\Service\ActivitySearch;
use Jiminny\Models\Activity\Search;
use Jiminny\Models\User;
use Jiminny\Repositories\ElasticActivityRepository;
use Jiminny\VO\Repository\OnDemandActivitySearch\Criteria;
use Psr\Log\LoggerInterface;
class AskJiminnyReportActivityService
{
private const int DEFAULT_TOP_ACTIVITIES_COUNT = 100;
private const array DATE_FILTER_KEYS = [
ActivityActualDate::PARAM_START_DATE,
ActivityActualDate::PARAM_END_DATE,
ActivityUpdatedDate::PARAM_UPDATED_FROM,
ActivityUpdatedDate::PARAM_UPDATED_TO,
ClosingPeriodFilter::KEY_START_DATE,
ClosingPeriodFilter::KEY_END_DATE,
];
public function __construct(
private readonly ActivitySearch $activitySearch,
private readonly ElasticActivityRepository $elasticRepository,
private readonly LoggerInterface $logger,
) {
}
/**
* Fetch activity IDs for a saved search, passing its filters as-is to Criteria.
* Date filters stored on the saved search are excluded; if no other filters exist,
* no date constraint is applied — matching the behaviour of getContextForAskAnythingByFilter.
*
* @return string[] Activity IDs
*/
public function getActivityIdsForSavedSearch(
Search $savedSearch,
User $user,
): array {
$requestParams = $this->buildRequestParamsFromSearch($savedSearch, $user);
$criteria = Criteria::createFromRequest(
array_merge($requestParams, [
'limit' => self::DEFAULT_TOP_ACTIVITIES_COUNT,
'page' => 1,
'sequence_number' => 1,
]),
$user->getTimezone()
);
$filterSet = $this->activitySearch->getOnDemandPageFilterSet($criteria, $user);
$activityIds = $this->elasticRepository->onDemandSearchIdsOnly($user, $criteria, $filterSet);
$this->logger->info('[AskJiminnyReport] Fetched activity IDs for saved search', [
'saved_search_id' => $savedSearch->getId(),
'user_id' => $user->getId(),
'activity_count' => count($activityIds),
]);
return $activityIds;
}
private function buildRequestParamsFromSearch(Search $savedSearch, User $user): array
{
$params = [];
$arrayFilterKeys = $this->activitySearch->getArrayFilterKeys($user);
foreach ($savedSearch->getFilters() as $filter) {
$key = $filter->getFilterProperty();
$value = $filter->getFilterValue();
if (in_array($key, self::DATE_FILTER_KEYS, true)) {
continue;
}
if (isset($params[$key])) {
$params[$key][] = $value;
} elseif (in_array($key, $arrayFilterKeys, true)) {
$params[$key] = [$value];
} else {
$params[$key] = $value;
}
}
return $params;
}
}
Execute
Explain Plan
Browse Query History
View Parameters
Open Query Execution Settings…
In-Editor Results
Tx: Auto
Cancel Running Statements
Playground
jiminny
Sync Changes
Hide This Notification
Code changed:
Hide
27
9
23
3
105
Previous Highlighted Error
Next Highlighted Error
SELECT * FROM team_features where team_id = 1;
SELECT * FROM teams WHERE name LIKE '%Vixio%'; # 340,270,11922
SELECT * FROM users WHERE team_id = 340; # 12015
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 340
and sa.provider = 'salesforce';
# and sa.provider = 'salesloft';
select * from crm_fields where crm_configuration_id = 270 and object_type = 'event';
# 125558 - Event Type - Event_Type__c
# 125552 - Event Status - Event_Status__c
SELECT * FROM sidekick_settings WHERE team_id = 340;
SELECT * FROM crm_field_values WHERE crm_field_id in (125552);
select * from activities where crm_configuration_id = 270
and type = 'conference' and crm_provider_id IS NOT NULL
and actual_start_time > '2024-09-16 09:00:00' order by scheduled_start_time;
SELECT * FROM activities WHERE id = 20871677;
SELECT * FROM crm_field_data WHERE activity_id = 20871677;
select * from crm_layouts where crm_configuration_id = 270;
select * from crm_layout_entities where crm_layout_id in (886,887);
SELECT * FROM crm_configurations WHERE id = 270;
select * from playbooks where team_id = 340; # 1514
select * from groups where team_id = 340;
SELECT * FROM crm_fields WHERE id IN (125393, 125401);
select g.name as 'team name', p.name as 'playbook name', f.label as 'activity type field' from groups g
join playbooks p on g.playbook_id = p.id
join crm_fields f on p.activity_field_id = f.id
where g.team_id = 340;
SELECT * FROM activities WHERE uuid_to_bin('0c180357-67d2-419e-a8c3-b832a3490770') = uuid; # 20448716
select * from crm_field_data where object_id = 20448716;
select * from activities where crm_configuration_id = 270 and provider = 'salesloft' order by id desc;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%CybSafe%'; # 343,273,12008
select * from opportunities where team_id = 343;
select * from opportunities where team_id = 343 and crm_provider_id = '18099102526';
select * from opportunities where team_id = 343 and account_id = 945217482;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 343
and sa.provider = 'hubspot';
select * from accounts where team_id = 343 order by name asc;
select * from stages where crm_configuration_id = 273 and type = 'opportunity';
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Voyado%'; # 353,283,12143
SELECT * FROM activities WHERE crm_configuration_id = 283 and account_id = 3777844 order by id desc;
SELECT * FROM accounts WHERE team_id = 353 AND name LIKE '%Salesloft%';
SELECT * FROM activities WHERE id = 20717903;
select * from participants where activity_id IN (20929172,20928605,20928468,20926272,20926271,20926270,20926269,20916499,20916454,20916436,20916435,20900015,20900014,20900013,20897312,20897243,20897241,20897237,20897232,20897229,20893648,20893231,20893230,20893229,20893228,20889784,20885039,20885038,20885037,20885036,20885035,20882728,20882708,20882703,20882702,20869828,20869811,20869806,20869801,20869799,20869798,20869796,20869795,20869794,20869761,20869760,20869759,20868688,20868687,20850340,20847195,20841710,20833967,20827021,20825307,20825305,20825297,20824615,20824400,20823927,20821760,20795588,20794233,20794057,20793710,20785811,20781789,20781394,20781307,20762651,20758453,20758282,20757323,20756643,20756636,20756629,20756627,20756606,20756605,20756604,20756603,20756602,20756600,20756599,20756598,20756595,20756594,20756589,20756587,20756577,20756573,20748918,20748386,20748385,20748384,20748383,20748382,20748381,20748380,20748379,20748377,20748375,20748373,20743301,20717905,20717904,20717903,20717901,20717899);
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 353
and sa.provider = 'salesforce';
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%modern world business solutions%'; # 345,275,12016, [EMAIL]
SELECT * FROM activities WHERE uuid_to_bin('3921d399-3fef-4609-a291-b0097a166d43') = uuid;
# id: 20940638, user: 12022, contact: 5305871
SELECT * FROM activity_summary_logs WHERE activity_id = 20940638;
select * from contacts where team_id = 345 and crm_provider_id = '30891432415' order by name asc; # 5305871
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 345
and sa.provider = 'hubspot';
select * from users where team_id = 345 and id = 12022;
SELECT * FROM crm_profiles WHERE user_id = 12022;
SELECT * FROM participants WHERE activity_id = 20940638;
SELECT * FROM users u
JOIN crm_profiles cp ON u.id = cp.user_id
WHERE u.team_id = 345;
select * from contacts where team_id = 345 and crm_provider_id = '30880813535' order by name desc; # 5305871
select * from team_features where team_id = 345;
SELECT * FROM activities WHERE uuid_to_bin('11701e2d-2f82-4dab-a616-1db4fad238df') = uuid; # 21115197
SELECT * FROM participants WHERE activity_id = 20897406;
SELECT * FROM activities WHERE uuid_to_bin('63ba55cd-1abc-447d-83da-0137000005b7') = uuid; # 20953912
SELECT * FROM activities WHERE crm_configuration_id = 275 and provider = 'ringcentral' and title like '%1252629100%';
SELECT * FROM activities WHERE id = 20946641;
SELECT * FROM crm_profiles WHERE user_id = 10211;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Lunio%'; # 120,97,10984, [EMAIL]
SELECT * FROM opportunities WHERE crm_configuration_id = 97 and crm_provider_id = '006N1000006c5PpIAI';
select * from stages where crm_configuration_id = 97 and type = 'opportunity';
select * from opportunities where team_id = 120;
select * from crm_configurations crm join teams t on crm.id = t.crm_id
where 1=1
AND t.current_billing_plan IS NOT NULL
AND crm.auto_sync_activity = 0
and crm.provider = 'hubspot';
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Exclaimer%'; # 270,205,10053,[EMAIL]
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 270
and sa.provider = 'salesforce';
SELECT * FROM activities WHERE uuid_to_bin('b54df794-2a9a-4957-8d80-09a600ead5f8') = uuid; # 21637956
SELECT * FROM crm_profiles WHERE user_id = 11446;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Cygnetise%'; # 372,300,12554, [EMAIL]
select * from playbooks where team_id = 372;
select * from crm_fields where crm_configuration_id = 300 and object_type = 'event'; # 141340
SELECT * FROM crm_field_values WHERE crm_field_id = 141340;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 372
and sa.provider = 'salesforce';
select * from crm_profiles where crm_configuration_id = 300;
SELECT * FROM crm_configurations WHERE team_id = 372;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Planday%'; # 291,242,11501,[EMAIL]
SELECT * FROM opportunities WHERE team_id = 291 and crm_provider_id = '006bG000005DO86QAG'; # 3207756
select * from crm_field_data where object_id = 3207756;
SELECT * FROM crm_fields WHERE id = 111834;
select f.id, f.crm_provider_id AS field_name, f.label, fd.object_id AS dealId, fd.value
FROM crm_fields f
JOIN crm_field_data fd ON f.id = fd.crm_field_id
WHERE f.crm_configuration_id = 242
AND f.object_type = 'opportunity'
AND fd.object_id IN (3207756)
ORDER BY fd.object_id, fd.updated_at;
SELECT * FROM crm_configurations WHERE auto_connect = 1;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Tour%'; # 187,209,8150,[EMAIL]
select * from group_deal_risk_types drgt join groups g on drgt.group_id = g.id
where g.team_id = 187;
select * from `groups` where team_id = 187;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 187
and sa.provider = 'salesforce';
# Destination - 98870 - Destination__c
# Stage - 79014 - StageName
# Land Arrangement - 98856 - Land_Arrangement__c
# Flight - 98848 - Flight__c
# Last activity date - 98812 - LastActivityDate
# Last modified date - 98809 - LastModifiedDate
# Last inbound mail timestamp - 99151 - Last_Inbound_Mail_Timestamp__c
# next call - 98864 - Next_Call__c
select * from crm_fields where crm_configuration_id = 209 and object_type = 'opportunity';
SELECT * FROM crm_layouts WHERE crm_configuration_id = 209;
SELECT * FROM crm_layout_entities WHERE crm_layout_id = 682;
select * from opportunities where team_id = 187 and name LIKE'%Muriel Sal%';
select * from opportunities where team_id = 187 and user_id = 9951 and is_closed = 0;
select * from activities where opportunity_id = 3538248;
SELECT * FROM crm_profiles WHERE user_id = 8150;
select * from deal_risks where opportunity_id = 3538248;
select * from teams where crm_id IS NULL;
SELECT opp.id AS opportunity_id,
u.group_id AS group_id,
MAX(
CASE
WHEN a.type IN ("sms-inbound", "sms-outbound") THEN a.created_at
ELSE a.actual_end_time
END) as last_date
FROM opportunities opp
left join activities a on a.opportunity_id = opp.id
inner join users u on opp.user_id = u.id
where opp.user_id IN (9951)
AND opp.is_closed = 0
and a.status IN ('completed', 'received', 'delivered') OR a.status IS NULL
group by opp.id;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Cybsafe%'; # 343,301,12008,[EMAIL]
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 343
and sa.provider = 'hubspot';
SELECT * FROM crm_profiles WHERE crm_configuration_id = 301;
SELECT * FROM contacts WHERE id = 6612363;
SELECT * FROM accounts WHERE id = 4235676;
SELECT * FROM opportunities WHERE crm_configuration_id = 301 and crm_provider_id = 32983784868;
select * from opportunity_stages where opportunity_id = 4503759;
# SELECT * FROM opportunities WHERE id = 4569937;
select * from activities where crm_configuration_id = 301;
SELECT * FROM activities WHERE uuid_to_bin('d3b2b28b-c3d0-4c2d-8ed0-eef42855278a') = uuid; # 26330370
SELECT * FROM participants WHERE activity_id = 26330370;
SELECT * FROM teams WHERE id = 375;
select * from playbooks where team_id = 375;
select * from stages where crm_configuration_id = 301 and type = 'opportunity';
select * from teams;
select * from contact_roles;
SELECT * FROM opportunities WHERE team_id = 343 and user_id = 12871 and close_date >= '2024-11-01';
select * from users u join crm_profiles cp on cp.user_id = u.id where u.team_id = 343;
SELECT * FROM crm_field_data WHERE object_id = 3771706;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 343
and sa.provider = 'hubspot';
SELECT * FROM crm_fields WHERE crm_configuration_id = 301 and object_type = 'opportunity'
and crm_provider_id LIKE "%traffic_light%";
SELECT * FROM crm_field_values WHERE crm_field_id IN (144020,144048,144111,144113,144126,144481,144508,144531);
SELECT fd.* FROM opportunities o
JOIN crm_field_data fd ON o.id = fd.object_id
WHERE o.team_id = 343
# and o.user_id IS NOT NULL
and fd.crm_field_id IN (144020,144048,144111,144113,144126,144481,144508,144531)
and fd.value != ''
order by value desc
# group by o.id
;
SELECT * FROM opportunities WHERE id = 3769843;
SELECT * FROM teams WHERE name LIKE '%Tour%'; # 187,209,8150, [EMAIL]
SELECT * FROM crm_layouts WHERE crm_configuration_id = 209;
SELECT * FROM crm_layout_entities WHERE crm_layout_id = 682;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Funding Circle%'; # 220,177,8603,[EMAIL]
SELECT * FROM activities WHERE uuid_to_bin('7a40e99b-3b37-4bb1-b983-325b81801c01') = uuid; # 23139839
SELECT * FROM opportunities WHERE id = 3855992;
SELECT * FROM users WHERE name LIKE '%Angus Pollard%'; # 8988
SELECT * FROM teams WHERE name LIKE '%Story Terrace%'; # 379, 307, 12894
SELECT * FROM crm_fields WHERE crm_configuration_id = 307 and object_type != 'opportunity';
select * from contacts where team_id = 379 and name like '%bebro%'; # 5874411, crm: 77229348507
SELECT * FROM crm_field_data WHERE object_id = 5874411;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 379
and sa.provider = 'hubspot';
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%mentio%'; # 117, 94, 6371, [EMAIL]
SELECT * FROM activities WHERE uuid_to_bin('82939311-1af0-4506-8546-21e8d1fdf2c1') = uuid;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Tourlane%'; # 187, 209, 8150, [EMAIL]
SELECT * FROM opportunities WHERE team_id = 187 and crm_provider_id = '006Se000008xfvNIAQ'; # 3537793
select * from generic_ai_prompts where subject_id = 3537793;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Lunio%'; # 120, 97, 10984, [EMAIL]
SELECT * FROM crm_configurations WHERE id = 97;
SELECT * FROM crm_layouts WHERE crm_configuration_id = 97;
SELECT * FROM crm_layout_entities WHERE crm_layout_id = 355;
SELECT * FROM crm_fields WHERE id = 32682;
select cfd.value, o.* from opportunities o
join crm_field_data cfd on o.id = cfd.object_id and cfd.crm_field_id = 32682
where team_id = 120
and cfd.value != ''
;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 120
and sa.provider = 'salesforce';
select * from opportunities where team_id = 120 and crm_provider_id = '006N1000007X8MAIA0';
SELECT * FROM crm_field_data WHERE object_id = 2313439;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE id = 410;
SELECT * FROM teams WHERE name LIKE '%Local Business Oxford%';
select * from scorecards where team_id = 410;
select * from scorecard_rules;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Funding%'; # 220, 177, 8603, [EMAIL]
select * from activities a
join opportunities o on a.opportunity_id = o.id
join users u on o.user_id = u.id
where a.crm_configuration_id = 177 and a.type LIKE '%email-out%'
# and a.actual_end_time > '2024-12-16 00:00:00'
# and o.remotely_created_at > '2024-12-01 00:00:00'
# and u.group_id = 1014
and u.id = 9021
order by a.id desc;
SELECT * FROM opportunities WHERE id in (3981384,4017346);
SELECT * FROM users WHERE team_id = 220 and id IN (8775, 11435);
select * from users where id = 9021;
select * from inboxes where user_id = 9021;
select * from inbox_emails where inbox_id = 1349 and email_date > '2024-12-18 00:00:00';
select * from email_messages where team_id = 220
and orig_date > '2024-12-16 00:00:00' and orig_date < '2024-12-19 00:00:00'
and subject LIKE '%Personal%'
# and 'from' = '[EMAIL]'
;
select * from activities a
join opportunities o on a.opportunity_id = o.id
where a.user_id = 9021 and a.type LIKE '%email-out%'
and a.actual_end_time > '2024-12-18 00:00:00'
and o.user_id IS NOT NULL
and o.remotely_created_at > '2024-12-01 00:00:00'
order by a.id desc;
SELECT * FROM opportunities WHERE team_id = 220 and name LIKE '%Right Car move Limited%' and id = 3966852;
select * from activities where crm_configuration_id = 177 and type LIKE '%email%' and opportunity_id = 3966852 order by id desc;
select * from team_settings where name IN ('useCloseDate');
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Hurree%'; # 104, 81, 6175, [EMAIL]
SELECT * FROM opportunities WHERE team_id = 104 and name = 'PropOp';
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 104
and sa.provider = 'hubspot';
select * from crm_configurations where last_synced_at > '2025-01-19 01:00:00'
select * from teams where crm_id IS NULL;
select t.name as 'team', u.name as 'owner', u.email, u.phone
from teams t
join activity_providers ap on t.id = ap.team_id
join users u on t.owner_id = u.id
where 1=1
and t.status = 'active'
and ap.is_enabled = 1
# and u.status = 1
and ap.provider = 'ms-teams';
select * from crm_configurations where provider = 'bullhorn'; # 344
SELECT * FROM teams WHERE id = 442; # 14293
select * from users where team_id = 442;
select * from social_accounts sa where sa.sociable_id = 14293;
select * from invitations where team_id = 442;
# [PASSWORD_DOTS]
SELECT * FROM users WHERE email LIKE '%[EMAIL]%'; # 14022
SELECT * FROM teams WHERE id = 429;
select * from opportunities where team_id = 429 and crm_provider_id IN (16157415775, 22246219645);
select * from activities where opportunity_id in (4340436,4353519);
select * from transcription where activity_id IN (25630961,25381771);
select * from generic_ai_prompts where subject_id IN (4353519);
SELECT
a.id as activity_id,
a.opportunity_id,
a.type as activity_type,
a.language,
CONCAT(a.title, a.description) AS mail_content,
e.from AS mail_from,
e.to AS mail_to,
e.subject AS mail_subject,
e.body AS mail_body,
p.type as prompt_type,
p.status as prompt_status,
p.content AS prompt_content,
a.actual_start_time as created_at
FROM activities a
LEFT JOIN ai_prompts p ON a.transcription_id = p.transcription_id AND p.deleted_at IS NULL
LEFT JOIN email_messages e ON a.id = e.activity_id
WHERE a.actual_start_time > '2024-01-01 00:00:00'
AND a.opportunity_id IN (4353519)
AND a.status IN ('completed', 'received', 'delivered')
AND a.deleted_at IS NULL
AND a.type NOT IN ('sms-inbound', 'sms-outbound')
ORDER BY a.opportunity_id ASC, a.id ASC;
SELECT * FROM users WHERE name LIKE '%George Fierstone%'; # 14293
SELECT * FROM teams WHERE id = 442;
SELECT * FROM crm_configurations WHERE id = 344;
select * from team_features where team_id = 442;
select * from groups where team_id = 442;
select * from playbooks where team_id = 442;
select * from playbook_categories where playbook_id = 1729;
select * from crm_fields where crm_configuration_id = 344 and id = 172024;
SELECT * FROM crm_field_values WHERE crm_field_id = 172024;
select * from crm_layouts where crm_configuration_id = 344;
select * from playbook_layouts where playbook_id = 1729;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Learning%'; # 260, 221, 9444
select s.*
# , s.sent_at, u.name, a.*
from activity_summary_logs s
inner join activities a on a.id = s.activity_id
inner join users u on u.id = a.user_id
where a.crm_configuration_id = 356
and s.sent_at > date_sub(now(), interval 60 day)
order by a.actual_end_time desc;
select * from activities a
# inner join activity_summary_logs s on s.activity_id = a.id
where a.crm_configuration_id = 356 and a.actual_end_time > date_sub(now(), interval 60 day)
# and a.crm_provider_id is not null
# and provider <> 'ringcentral'
and status = 'completed'
order by a.actual_end_time desc;
select * from teams order by id desc; # 17328, 32, 17830, [EMAIL]
SELECT * FROM users;
SELECT * FROM users where team_id = 260 and status = 1; # 201 - 150 active
SELECT * FROM teams WHERE id = 260;
select * from team_settings where team_id = 260;
select * from crm_configurations where team_id = 260;
SELECT * FROM crm_layouts WHERE crm_configuration_id = 356;
SELECT * FROM crm_layout_entities WHERE crm_layout_id = 1184;
select * from accounts where crm_configuration_id = 221 order by id desc; # 7000
select * from leads where crm_configuration_id = 221 order by id desc; # 0
select * from contacts where crm_configuration_id = 221 order by id desc; # 200 000
select * from opportunities where crm_configuration_id = 221 order by id desc; # 0
select * from crm_profiles where crm_configuration_id = 221 order by id desc; # 23
select * from crm_fields where crm_configuration_id = 221;
select * from crm_field_values where crm_field_id = 5302 order by id desc;
select * from crm_layouts where crm_configuration_id = 221 order by id desc;
select * from stages where crm_configuration_id = 221 order by id desc;
select * from accounts where crm_configuration_id = 356 order by id desc; # 7000
select * from leads where crm_configuration_id = 356 order by id desc; # 0
select * from contacts where crm_configuration_id = 356 order by id desc; # 200 000
select * from opportunities where crm_configuration_id = 356 order by id desc; # 0
select * from crm_profiles where crm_configuration_id = 356 order by id desc; # 23
select * from crm_fields where crm_configuration_id = 356;
select * from crm_field_values where crm_field_id = 5302 order by id desc;
select * from crm_layouts where crm_configuration_id = 356 order by id desc;
select * from stages where crm_configuration_id = 356 order by id desc;
select * from playbooks where team_id = 260 order by id desc; # 4 (2 deleted)
select * from groups where team_id = 260 order by id desc; # 27 groups, (2 deleted)
select * from playbook_layouts where playbook_id IN (1410,1409,1276,1254); # 4
select ce.* from calendars c
join users u on c.user_id = u.id
join calendar_events ce on c.id = ce.calendar_id
where u.team_id = 260
and (ce.start_time > '2025-02-21 00:00:00')
;
# calendar events 1207
#
select * from opportunities where team_id = 260;
SELECT * FROM crm_field_data WHERE object_id = 4696496;
select * from activities where crm_configuration_id = 356 and crm_provider_id IS NOT NULL;
select * from activities where crm_configuration_id IN (221) and provider NOT IN ('ms-teams', 'uploader', 'zoom-bot')
# and type = 'conference' and status = 'scheduled' and activities.is_internal = 0
and created_at > '2024-03-01 00:00:00'
order by id desc; # 880 000, ringcentral, avaya
SELECT * FROM participants WHERE activity_id = 26371744;
# all activities 942 000 +
# conference 7385 - scheduled 984 - external 343
select * from activities where id = 26321812;
select * from participants where activity_id = 26321812;
select * from participants where activity_id in (26414510,26414514,26414516,26414604,26414653,26414655);
select * from leads where id in (720428,689175,731546,645866,621037);
select * from users where id = 13841;
select * from opportunities where user_id = 9541;
select * from stages where id = 15900;
select * from accounts where
# id IN (4160055,5053725,4965303,4896434)
id in (4584518,3249934,3218025,3891133,3399450,4172999,4485161,3101785,4587203,3070816,2870343,2870341,3563940,4550846,3424464,3249963,2870342)
;
select * from activities where id = 26654935;
SELECT * FROM opportunities WHERE id = 4803458;
SELECT * FROM opportunities where team_id = 260 and user_id = 13841 AND stage_id = 15900;
SELECT id, uuid, provider, type, lead_id, account_id, contact_id, opportunity_id, stage_id, status, recording_state, title, actual_start_time, actual_end_time
FROM activities WHERE user_id = 13841 AND opportunity_id IN (4729783, 4731717, 4731726, 4732064, 4732849, 4803458, 4813213);
SELECT DISTINCT
o.id, o.stage_id, s.name, a.title,
a.*
FROM activities a
# INNER JOIN tracks t ON a.id = t.activity_id
INNER JOIN users u ON a.user_id = u.id
INNER JOIN teams team ON u.team_id = team.id
INNER JOIN groups g ON u.group_id = g.id
INNER JOIN opportunities o ON a.opportunity_id = o.id
INNER JOIN stages s ON o.stage_id = s.id
WHERE
a.crm_configuration_id = 356
AND a.status IN ('completed', 'failed')
AND a.recording_state != 'stopped'
# and a.user_id = 13841
AND u.uuid = uuid_to_bin('6f40e4b8-c340-4059-b4ac-1728e87ea99e')
AND team.uuid = uuid_to_bin('a607fba7-452e-4683-b2af-00d6cb52c93c')
AND g.uuid = uuid_to_bin('b5d69e40-24a0-4c16-810b-5fa462299f94')
AND a.type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')
# AND t.type IN ('audio', 'video')
AND (
(a.actual_start_time BETWEEN '2025-03-13 00:00:00' AND '2025-03-18 07:59:59')
OR
(
a.actual_start_time IS NULL
AND a.type IN ('sms-outbound', 'sms-inbound')
AND a.created_at BETWEEN '2025-03-13 00:00:00' AND '2025-03-18 07:59:59'
)
)
AND (
a.is_private = 0
OR (
a.is_private = 1
AND u.uuid = uuid_to_bin('6f40e4b8-c340-4059-b4ac-1728e87ea99e')
)
)
AND (
# s.id = 15900
s.uuid = uuid_to_bin('04ca1c26-c666-4268-a129-419c0acffd73')
OR s.uuid IS NULL -- Include records without opportunity stage
)
ORDER BY a.actual_end_time DESC;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Lead Forensics%'; # 190, 162, 8474, [EMAIL]
SELECT * FROM users WHERE team_id = 190;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 190
and sa.provider = 'hubspot';
select * from role_user where user_id = 8474;
select * from crm_configurations where provider = 'bullhorn';
SELECT * FROM opportunities WHERE uuid_to_bin('94578249-65ec-4205-90f2-7d1a7d5ab64a') = uuid;
SELECT * FROM users WHERE uuid_to_bin('26dbadeb-926f-4150-b11b-771b9d4c2f9a') = uuid;
SELECT * FROM opportunities WHERE id = 4732493;
select * from activities where opportunity_id = 4732493;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE id = 443; # 358, 14315, [EMAIL]
SELECT * FROM opportunities WHERE team_id = 443;
SELECT a.id, a.type, a.user_id, a.status, a.deleted_at, u.name, u.email, u.team_id as activity_team_id, u.status, u.deleted_at, t.name, t.status, s.team_id as stage_team_id
FROM activities AS a
JOIN stages AS s ON a.stage_id = s.id
JOIN users AS u ON u.id = a.user_id
JOIN teams AS t ON t.id = s.team_id
WHERE u.team_id <> s.team_id and t.id > 135;
SELECT
crm_configuration_id,
crm_provider_id,
COUNT(*) as duplicate_count,
GROUP_CONCAT(id) as stage_ids,
GROUP_CONCAT(name) as stage_names
FROM stages
GROUP BY crm_configuration_id, crm_provider_id
HAVING COUNT(*) > 1
ORDER BY duplicate_count DESC;
select * from stages where id IN (14898,14907);
select * from business_processes;
SELECT *
FROM crm_configurations
WHERE team_id IN (
SELECT team_id
FROM crm_configurations
GROUP BY team_id
HAVING COUNT(*) > 1
)
ORDER BY team_id;
SELECT *
FROM teams
WHERE crm_id IN (
SELECT crm_id
FROM teams
GROUP BY crm_id
HAVING COUNT(*) > 1
)
ORDER BY crm_id;
# [PASSWORD_DOTS]
select * from crm_configurations where provider = 'integration-app';
SELECT * FROM teams WHERE id = 443; # Correre Naturale 358 14315 [EMAIL]
select * from activities where crm_configuration_id = 358 order by actual_end_time desc;
select id, uuid, actual_end_time, crm_provider_id, is_internal, playbook_category_id, type, user_id, lead_id, contact_id, account_id, opportunity_id, status, title from activities where crm_configuration_id = 358 order by actual_end_time desc;
select * from team_features where team_id = 358;
select * from activity_summary_logs;
select * from teams where id = 406;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Sportfive%'; # 267, 202, 14637, [EMAIL]
select * from activities where crm_configuration_id = 202 order by actual_end_time desc;
SELECT * FROM users where id = 14637;
SELECT * FROM teams where id = 267;
SELECT * FROM groups where id = 1118;
select g.name, a.title, uuid_from_bin(a.uuid), a.external_id, a.status, a.recording_state, a.recording_reason_code, a.scheduled_start_time, a.scheduled_end_time, a.actual_start_time, a.actual_end_time from activities a
inner join users u on u.id = a.user_id
inner join groups g on g.id = u.group_id
where a.crm_configuration_id = 202
and a.is_internal = 0
and (a.scheduled_start_time between '2025-03-19 00:00:00' and '2025-03-21 00:00:00')
and a.type = 'conference'
and a.status != 'completed'
and a.external_id is not null
order by a.scheduled_start_time desc;
SELECT * FROM activities
WHERE crm_configuration_id = 202
AND status IN ('completed', 'failed')
AND recording_state != 'stopped'
AND type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')
AND (is_private = 0 OR user_id = 14637)
AND (
(
actual_start_time BETWEEN '2025-03-12 12:00:00' AND '2025-03-24 11:59:59'
) OR (
actual_start_time IS NULL
AND type IN ('sms-outbound', 'sms-inbound')
AND created_at BETWEEN '2025-03-12 12:00:00' AND '2025-03-24 11:59:59'
)
)
AND NOT EXISTS (
SELECT 1
FROM tracks
WHERE
tracks.activity_id = activities.id
AND tracks.type IN ('audio', 'video')
)
ORDER BY actual_end_time DESC;
SELECT DISTINCT
a.*
FROM activities a
INNER JOIN tracks t ON a.id = t.activity_id
INNER JOIN users u ON a.user_id = u.id
INNER JOIN teams team ON u.team_id = team.id
WHERE
a.crm_configuration_id = 202
AND a.status IN ('completed', 'failed')
AND a.recording_state != 'stopped'
# and a.user_id = 14637
AND a.type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')
# AND t.type IN ('audio', 'video')
AND (
(a.actual_start_time BETWEEN '2025-03-12 12:00:00' AND '2025-03-24 11:59:59')
OR
(
a.actual_start_time IS NULL
AND a.type IN ('sms-outbound', 'sms-inbound')
AND a.created_at BETWEEN '2025-03-12 12:00:00' AND '2025-03-24 11:59:59'
)
)
AND (
a.is_private = 0
OR (
a.is_private = 1
AND a.user_id = 14637
)
)
ORDER BY a.actual_end_time DESC
;
SELECT DISTINCT a.*
FROM activities a
INNER JOIN users u ON a.user_id = u.id
INNER JOIN teams t ON u.team_id = t.id
# INNER JOIN tracks tr ON a.id = tr.activity_id
# INNER JOIN groups g ON u.group_id = g.id
WHERE 1=1
AND t.id = 267
# AND t.uuid = uuid_to_bin('aed4927b-f1ea-499e-94c3-83762fd233e8')
AND a.status IN ('completed', 'failed')
AND a.recording_state != 'stopped'
AND a.type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')
# AND tr.type NOT IN ('audio', 'video')
AND (
a.is_private = 0
OR a.user_id = 14637
)
AND (
(a.actual_start_time BETWEEN '2025-03-19 00:00:00' AND '2025-03-21 23:59:59')
OR (
a.actual_start_time IS NULL
AND a.type IN ('sms-outbound', 'sms-inbound')
AND a.created_at BETWEEN '2025-03-19 00:00:00' AND '2025-03-21 23:59:59'
)
)
# and NOT EXISTS (
# SELECT 1
# FROM tracks t
# WHERE t.activity_id = a.id
# AND t.type IN ('audio', 'video')
# )
ORDER BY a.actual_end_time DESC;
SELECT * FROM tracks WHERE activity_id = 26485995;
select a.is_private, a.title, uuid_from_bin(a.uuid), a.external_id, a.status, a.recording_state, a.recording_reason_code, a.scheduled_start_time, a.scheduled_end_time, a.actual_start_time, a.actual_end_time from activities a
inner join users u on u.id = a.user_id
where a.crm_configuration_id = 202
# and a.is_internal = 0
and (a.actual_start_time between '2025-03-19 00:00:00' and '2025-03-21 00:00:00')
and a.type IN ("softphone","softphone-inbound","conference","sms-inbound")
and a.status IN ('completed', 'failed')
# and a.external_id is not null
order by a.actual_end_time desc;
select * from activities a where a.crm_configuration_id = 202
and a.actual_start_time between '2025-03-20 00:00:00' and '2025-03-21 00:00:00'
# AND a.type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')
select g.name, a.title, uuid_from_bin(a.uuid), a.external_id, a.status, a.recording_state, a.recording_reason_code, a.scheduled_start_time, a.scheduled_end_time, a.actual_start_time, a.actual_end_time from activities a
inner join users u on u.id = a.user_id
inner join groups g on g.id = u.group_id
where a.crm_configuration_id = 202
and a.is_internal = 0
and (a.scheduled_start_time between '2025-03-19 00:00:00' and '2025-03-21 00:00:00')
and a.type = 'conference'
and a.status != 'completed'
and a.external_id is not null
order by a.scheduled_start_time desc;
SELECT * FROM teams WHERE name LIKE '%Tourlane%';
SELECT * FROM crm_fields WHERE crm_configuration_id = 209 and object_type = 'opportunity';
SELECT * FROM crm_field_data WHERE crm_field_id = 98809;
select * from users where status = 1 AND timezone = 'MDT';
select * from opportunities where id = 3769814;
select * from deal_risks where opportunity_id = 3769814;
select cp.* from crm_profiles cp
join users u on cp.user_id = u.id
join crm_configurations crm on cp.crm_configuration_id = crm.id
where crm.provider = 'hubspot' AND u.status = 1 AND log_notes != 'none';
select * from crm_fields where id = 154575;
select * from team_features where feature = 'SUPPORTS_SYNC_MISSING_CALL_DISPOSITIONS';
SELECT * FROM teams WHERE id = 176; # crm 148
select * from activities where crm_configuration_id = 148 and provider = 'hubspot' order by id desc;
select * from activity_providers where provider = 'amazon-connect';
select * from crm_fields cf
join crm_configurations crm on crm.id = cf.crm_configuration_id
where crm.provider = 'hubspot' and cf.object_type IN ('account', 'contact');
# [PASSWORD_DOTS]
SELECT * FROM users WHERE id IN (15415, 15418);
SELECT * FROM groups WHERE id IN (1805,1806);
SELECT * FROM playbooks WHERE id = 1860;
SELECT * FROM playbook_categories WHERE id = 38634;
SELECT * FROM crm_fields WHERE id = 189962;
SELECT * FROM teams WHERE name = 'Pulsar Group'; # 472, 380, 15138 [EMAIL]
SELECT * FROM crm_profiles WHERE user_id = 15415;
SELECT * FROM social_accounts WHERE sociable_id = 15415 and provider = 'salesforce';
select * from sidekick_settings where team_id = 472;
SELECT * FROM activities WHERE uuid_to_bin('452c58c7-b87c-4fdd-953e-d7af185e9588') = uuid; # 28617536, user: 15418
SELECT * FROM activities WHERE uuid_to_bin('399114ee-d3a8-458c-bff5-5f654658db0a') = uuid; # 28344407, user: 15415
SELECT * FROM activities WHERE uuid_to_bin('f0aa567f-0ab1-4bbb-96aa-37dcf184676b') = uuid; # 28580288, user: 15415
SELECT * FROM activities WHERE uuid_to_bin('50c086b1-2770-4bca-b5ae-6bac22ec426b') = uuid; # 28566069, user: 15415
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%TeamTailor%'; # 109, 218, 13969, [EMAIL]
select * from crm_configurations where id = 218;
SELECT * FROM activities WHERE uuid_to_bin('e39b5857-7fdb-4f5a-951a-8d3ca69bb1b0') = uuid; # 28338765
SELECT * FROM users WHERE id IN (13232, 13230);
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 109
and sa.provider = 'salesforce';
0057R00000EPL5HQAX Inez Ekblad
1091cb81-5ea1-4951-a0ed-f00b568f0140 Triman Kaur
SELECT * FROM crm_profiles WHERE user_id IN (13232, 13230);
############################################################################################
SELECT * FROM activities WHERE uuid_to_bin('675eeaeb-5681-42db-90bc-54c07a604408') = uuid; # 28655939 00UVg00000FLvnSMAT
SELECT * FROM crm_field_data WHERE activity_id = 28655939;
SELECT * FROM crm_fields WHERE id IN (94491,94493,94498);
SELECT * FROM users WHERE id = 13658;
SELECT * FROM teams WHERE id = 109;
SELECT * FROM crm_configurations WHERE id = 218;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 109
and sa.provider = 'salesforce';
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Strengthscope%'; # 481, 390, 15420, [EMAIL]
SELECT * FROM stages WHERE crm_configuration_id = 390;
select * from business_processes where team_id = 481 and crm_configuration_id = 390;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 481
and sa.provider = 'salesforce';
SELECT * FROM users WHERE id = 15780; # team 462
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 462
and sa.provider = 'hubspot';
select * from teams where id = 495;
SELECT * FROM users WHERE id = 15794;
select * from social_accounts where sociable_id = 15794;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Flight%'; # 427, 333, 13752
SELECT * FROM accounts WHERE team_id = 427 and crm_provider_id = '668731000183444517';
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Group GTI%'; # 495, 407, 15794
SELECT * FROM activities WHERE crm_configuration_id = 407
and status = 'completed' and type = 'conference'
order by id desc;
select ru.*, pr.*, p.* from users u join role_user ru on ru.user_id = u.id
join permission_role pr on pr.role_id = ru.role_id
join permissions p on p.id = pr.permission_id
where team_id = 495 and p.name IN ('dial');
select * from permission_role;
select * from activities where crm_configuration_id = 407 and status = 'completed' order by id desc;
SELECT * FROM activities WHERE id = 29512773;
SELECT * FROM activities WHERE id IN (29042721,28991325,29002874);
SELECT al.* from activity_summary_logs al join activities a on a.id = al.activity_id
where a.crm_configuration_id = 407
# and a.id IN (29042721,28991325,29002874);
SELECT * FROM users WHERE id = 15794;
SELECT * FROM users WHERE team_id = 495;
SELECT * FROM social_accounts WHERE sociable_id = 15794;
SELECT * FROM opportunities WHERE team_id = 495 and name like '%OC:%';
SELECT * FROM contacts WHERE team_id = 495;
SELECT * FROM leads WHERE team_id = 495;
SELECT * FROM accounts WHERE team_id = 495;
SELECT * FROM crm_profiles WHERE crm_configuration_id = 407;
SELECT * FROM crm_fields WHERE crm_configuration_id = 407;
SELECT * FROM crm_configurations WHERE id = 407;
SELECT * FROM opportunities WHERE team_id = 495 and close_date BETWEEN '2025-06-01' AND '2025-07-01'
and user_id IS NOT NULL and is_closed = 1 and is_won = 1;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Hamilton Court FX LLP%'; # 249, 187, 10103
SELECT * FROM activities WHERE uuid_to_bin('4659c2bb-9a49-484e-9327-a3d66f1e028c') = uuid; # 28951064
SELECT * FROM crm_fields WHERE crm_configuration_id = 187 and object_type IN ('tasks', 'event');
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Checkstep%'; # 325, 256, 11753
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 325
and sa.provider = 'hubspot';
SELECT * FROM activities WHERE uuid_to_bin('7be372e2-1916-4d79-a2f3-ca3db1346db3') = uuid; # 28611085
SELECT * FROM activities WHERE uuid_to_bin('980f0336-840b-4185-a5a9-30cf8b0749a8') = uuid; # 28719733
SELECT * FROM activity_summary_logs where activity_id = 28719733;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Learning%'; # 260, 356, 9444
SELECT * FROM activity_summary_logs where sent_at BETWEEN '2025-06-09 11:38:00' AND '2025-06-09 11:40:00';
SELECT * FROM leads WHERE crm_configuration_id = 356 and crm_provider_id = '230045001502770504'; # 823630
select * from activities where crm_configuration_id = 356 and lead_id = 841732;
SELECT * from activity_summary_logs al join activities a on a.id = al.activity_id
where a.crm_configuration_id = 356;
select * from activities where crm_configuration_id = 356
and actual_end_time between '2025-06-09 11:00:00' and '2025-06-09 12:00:00'
order by id desc;
select * from accounts where crm_configuration_id = 356 and crm_provider_id = '230045001514403366' order by id desc;
select * from leads where crm_configuration_id = 356 and crm_provider_id = '230045001514275654' order by id desc;
select * from contacts where crm_configuration_id = 356 and crm_provider_id = '230045001514403366' order by id desc;
select * from opportunities where crm_configuration_id = 356 and crm_provider_id = '230045001514403366' order by id desc;
select * from team_features where team_id = 260;
select * from features where id IN (1,2,4,6,18,19,20,9,10,3,23,24,25,26,27);
SELECT * FROM activities WHERE uuid_to_bin('7be372e2-1916-4d79-a2f3-ca3db1346db3') = uuid;
select * from crm_fields;
select * from crm_layout_entities;
SELECT * FROM teams WHERE name LIKE '%Optable%';
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Teamtailor%'; # 109, 218, 13969
SELECT * FROM crm_configurations WHERE id = 218;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 109
and sa.provider = 'salesforce';
SELECT * FROM activities WHERE uuid_to_bin('675eeaeb-5681-42db-90bc-54c07a604408') = uuid; # 28655939
SELECT * FROM crm_field_data WHERE activity_id = 28655939;
SELECT * FROM crm_fields WHERE id in (94491,94493,94498);
select * from teams where crm_id IS NULL;
SELECT * FROM activities WHERE uuid_to_bin('71aa8a0c-9652-4ff6-bee7-d98ae60abef6') = uuid;
# [PASSWORD_DOTS]
select * from team_domains where team_id = 399;
SELECT * FROM teams WHERE name LIKE '%Rydoo%'; # 399, 318, 13207
select * from calendar_events where id = 5163781;
SELECT * FROM activities WHERE uuid_to_bin('be2cbc52-7fda-46a0-9ae0-25d9553eafc0') = uuid; # 29443896
SELECT * FROM participants WHERE activity_id = 29443896;
select * from contacts where crm_configuration_id = 318 and email = '[EMAIL]';
select * from leads where crm_configuration_id = 318 and email = '[EMAIL]';
select * from activities where user_id = 14937 order by created_at ;
select * from users where id = 14937;
select * from contacts where crm_configuration_id = 318 and email LIKE '%@strawberry.se';
select * from opportunities where crm_configuration_id = 318 and crm_provider_id = '006Sf00000D1WOAIA3';
select * from activities a join participants p on a.id = p.activity_id
where crm_configuration_id = 318 and a.updated_at > '2025-06-23T08:18:43Z';
# [PASSWORD_DOTS]
SELECT * FROM opportunities WHERE team_id = 379 and crm_provider_id = '39334518886';
SELECT * FROM opportunities WHERE team_id = 379 order by id desc;
SELECT * FROM teams WHERE id = 379;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 379 and sociable_id = 13852
and sa.provider = 'hubspot';
SELECT * FROM crm_configurations WHERE id = 307;
SELECT * FROM crm_layouts WHERE crm_configuration_id = 307;
SELECT * FROM crm_layout_entities WHERE crm_layout_id = 1027;
SELECT * FROM crm_fields WHERE crm_configuration_id = 307
and id IN (144750,144855,145158,155227);
SELECT * FROM activities;
select * from activities
where created_at > '2025-07-01 00:00:00'
# and created_at < '2025-08-01 00:00:00'
and type not in ('email-outbound', 'email-inbound')
and account_id is null
and contact_id is null
and lead_id is null
and opportunity_id is not null
;
SELECT * FROM activities WHERE id IN (25344155, 25344296, 25501909, 28692187);
SELECT * FROM crm_configurations WHERE id in (335,301,200);
select * from crm_fields where crm_configuration_id = 230 and crm_provider_id = 'Age2__c';
SELECT * FROM teams WHERE name LIKE '%Resights%';
select * from crm_fields where crm_configuration_id = 1 and object_type = 'opportunity';
select * from crm_configurations where provider = 'bullhorn'; # 344
select * from teams where id IN (442);
select * from activities
where crm_configuration_id = 177
and provider = 'amazon-connect'
order by id desc;
# and source <> 'gong';
select * from activity_providers where provider = 'amazon-connect';
SELECT * FROM activities WHERE uuid_to_bin('cec1993b-a7e5-4164-b74d-d680ea51d2f2') = uuid;
select * from crm_configurations where store_transcript = 1;
SELECT * FROM teams WHERE id IN (80);
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Sedna%'; # 277, 213, 12594
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 277
and sa.provider = 'salesforce';
selec...
|
NULL
|
|
54300
|
NULL
|
0
|
2026-04-20T08:51:29.977557+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-20/1776 /Users/lukas/.screenpipe/data/data/2026-04-20/1776675089977_m2.jpg...
|
PhpStorm
|
faVsco.js – AskJiminnyReportActivityService.php
|
True
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
#11894 on JY-18909-automa Project: faVsco.js, menu
#11894 on JY-18909-automated-reports-ask-jiminny, menu
Start Listening for PHP Debug Connections
RequestGenerateAskJiminnyReportJobTest
Run 'RequestGenerateAskJiminnyReportJobTest'
Debug 'RequestGenerateAskJiminnyReportJobTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
2
1
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Services\Kiosk\AutomatedReports;
use Jiminny\Component\ActivitySearch\FilterDefinition\ActivityActualDate;
use Jiminny\Component\ActivitySearch\FilterDefinition\ActivityUpdatedDate;
use Jiminny\Component\ActivitySearch\FilterDefinition\DealInsights\ClosingPeriodFilter;
use Jiminny\Component\ActivitySearch\Service\ActivitySearch;
use Jiminny\Models\Activity\Search;
use Jiminny\Models\User;
use Jiminny\Repositories\ElasticActivityRepository;
use Jiminny\VO\Repository\OnDemandActivitySearch\Criteria;
use Psr\Log\LoggerInterface;
class AskJiminnyReportActivityService
{
private const int DEFAULT_TOP_ACTIVITIES_COUNT = 100;
private const array DATE_FILTER_KEYS = [
ActivityActualDate::PARAM_START_DATE,
ActivityActualDate::PARAM_END_DATE,
ActivityUpdatedDate::PARAM_UPDATED_FROM,
ActivityUpdatedDate::PARAM_UPDATED_TO,
ClosingPeriodFilter::KEY_START_DATE,
ClosingPeriodFilter::KEY_END_DATE,
];
public function __construct(
private readonly ActivitySearch $activitySearch,
private readonly ElasticActivityRepository $elasticRepository,
private readonly LoggerInterface $logger,
) {
}
/**
* Fetch activity IDs for a saved search, passing its filters as-is to Criteria.
* Date filters stored on the saved search are excluded; if no other filters exist,
* no date constraint is applied — matching the behaviour of getContextForAskAnythingByFilter.
*
* @return string[] Activity IDs
*/
public function getActivityIdsForSavedSearch(
Search $savedSearch,
User $user,
): array {
$requestParams = $this->buildRequestParamsFromSearch($savedSearch, $user);
$criteria = Criteria::createFromRequest(
array_merge($requestParams, [
'limit' => self::DEFAULT_TOP_ACTIVITIES_COUNT,
'page' => 1,
'sequence_number' => 1,
]),
$user->getTimezone()
);
$filterSet = $this->activitySearch->getOnDemandPageFilterSet($criteria, $user);
$activityIds = $this->elasticRepository->onDemandSearchIdsOnly($user, $criteria, $filterSet);
$this->logger->info('[AskJiminnyReport] Fetched activity IDs for saved search', [
'saved_search_id' => $savedSearch->getId(),
'user_id' => $user->getId(),
'activity_count' => count($activityIds),
]);
return $activityIds;
}
private function buildRequestParamsFromSearch(Search $savedSearch, User $user): array
{
$params = [];
$arrayFilterKeys = $this->activitySearch->getArrayFilterKeys($user);
foreach ($savedSearch->getFilters() as $filter) {
$key = $filter->getFilterProperty();
$value = $filter->getFilterValue();
if (in_array($key, self::DATE_FILTER_KEYS, true)) {
continue;
}
if (isset($params[$key])) {
$params[$key][] = $value;
} elseif (in_array($key, $arrayFilterKeys, true)) {
$params[$key] = [$value];
} else {
$params[$key] = $value;
}
}
return $params;
}
}
Execute
Explain Plan
Browse Query History
View Parameters
Open Query Execution Settings…
In-Editor Results
Tx: Auto
Cancel Running Statements
Playground
jiminny
Sync Changes
Hide This Notification
Code changed:
Hide
27
9
23
3
105
Previous Highlighted Error
Next Highlighted Error
SELECT * FROM team_features where team_id = 1;
SELECT * FROM teams WHERE name LIKE '%Vixio%'; # 340,270,11922
SELECT * FROM users WHERE team_id = 340; # 12015
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 340
and sa.provider = 'salesforce';
# and sa.provider = 'salesloft';
select * from crm_fields where crm_configuration_id = 270 and object_type = 'event';
# 125558 - Event Type - Event_Type__c
# 125552 - Event Status - Event_Status__c
SELECT * FROM sidekick_settings WHERE team_id = 340;
SELECT * FROM crm_field_values WHERE crm_field_id in (125552);
select * from activities where crm_configuration_id = 270
and type = 'conference' and crm_provider_id IS NOT NULL
and actual_start_time > '2024-09-16 09:00:00' order by scheduled_start_time;
SELECT * FROM activities WHERE id = 20871677;
SELECT * FROM crm_field_data WHERE activity_id = 20871677;
select * from crm_layouts where crm_configuration_id = 270;
select * from crm_layout_entities where crm_layout_id in (886,887);
SELECT * FROM crm_configurations WHERE id = 270;
select * from playbooks where team_id = 340; # 1514
select * from groups where team_id = 340;
SELECT * FROM crm_fields WHERE id IN (125393, 125401);
select g.name as 'team name', p.name as 'playbook name', f.label as 'activity type field' from groups g
join playbooks p on g.playbook_id = p.id
join crm_fields f on p.activity_field_id = f.id
where g.team_id = 340;
SELECT * FROM activities WHERE uuid_to_bin('0c180357-67d2-419e-a8c3-b832a3490770') = uuid; # 20448716
select * from crm_field_data where object_id = 20448716;
select * from activities where crm_configuration_id = 270 and provider = 'salesloft' order by id desc;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%CybSafe%'; # 343,273,12008
select * from opportunities where team_id = 343;
select * from opportunities where team_id = 343 and crm_provider_id = '18099102526';
select * from opportunities where team_id = 343 and account_id = 945217482;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 343
and sa.provider = 'hubspot';
select * from accounts where team_id = 343 order by name asc;
select * from stages where crm_configuration_id = 273 and type = 'opportunity';
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Voyado%'; # 353,283,12143
SELECT * FROM activities WHERE crm_configuration_id = 283 and account_id = 3777844 order by id desc;
SELECT * FROM accounts WHERE team_id = 353 AND name LIKE '%Salesloft%';
SELECT * FROM activities WHERE id = 20717903;
select * from participants where activity_id IN (20929172,20928605,20928468,20926272,20926271,20926270,20926269,20916499,20916454,20916436,20916435,20900015,20900014,20900013,20897312,20897243,20897241,20897237,20897232,20897229,20893648,20893231,20893230,20893229,20893228,20889784,20885039,20885038,20885037,20885036,20885035,20882728,20882708,20882703,20882702,20869828,20869811,20869806,20869801,20869799,20869798,20869796,20869795,20869794,20869761,20869760,20869759,20868688,20868687,20850340,20847195,20841710,20833967,20827021,20825307,20825305,20825297,20824615,20824400,20823927,20821760,20795588,20794233,20794057,20793710,20785811,20781789,20781394,20781307,20762651,20758453,20758282,20757323,20756643,20756636,20756629,20756627,20756606,20756605,20756604,20756603,20756602,20756600,20756599,20756598,20756595,20756594,20756589,20756587,20756577,20756573,20748918,20748386,20748385,20748384,20748383,20748382,20748381,20748380,20748379,20748377,20748375,20748373,20743301,20717905,20717904,20717903,20717901,20717899);
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 353
and sa.provider = 'salesforce';
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%modern world business solutions%'; # 345,275,12016, [EMAIL]
SELECT * FROM activities WHERE uuid_to_bin('3921d399-3fef-4609-a291-b0097a166d43') = uuid;
# id: 20940638, user: 12022, contact: 5305871
SELECT * FROM activity_summary_logs WHERE activity_id = 20940638;
select * from contacts where team_id = 345 and crm_provider_id = '30891432415' order by name asc; # 5305871
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 345
and sa.provider = 'hubspot';
select * from users where team_id = 345 and id = 12022;
SELECT * FROM crm_profiles WHERE user_id = 12022;
SELECT * FROM participants WHERE activity_id = 20940638;
SELECT * FROM users u
JOIN crm_profiles cp ON u.id = cp.user_id
WHERE u.team_id = 345;
select * from contacts where team_id = 345 and crm_provider_id = '30880813535' order by name desc; # 5305871
select * from team_features where team_id = 345;
SELECT * FROM activities WHERE uuid_to_bin('11701e2d-2f82-4dab-a616-1db4fad238df') = uuid; # 21115197
SELECT * FROM participants WHERE activity_id = 20897406;
SELECT * FROM activities WHERE uuid_to_bin('63ba55cd-1abc-447d-83da-0137000005b7') = uuid; # 20953912
SELECT * FROM activities WHERE crm_configuration_id = 275 and provider = 'ringcentral' and title like '%1252629100%';
SELECT * FROM activities WHERE id = 20946641;
SELECT * FROM crm_profiles WHERE user_id = 10211;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Lunio%'; # 120,97,10984, [EMAIL]
SELECT * FROM opportunities WHERE crm_configuration_id = 97 and crm_provider_id = '006N1000006c5PpIAI';
select * from stages where crm_configuration_id = 97 and type = 'opportunity';
select * from opportunities where team_id = 120;
select * from crm_configurations crm join teams t on crm.id = t.crm_id
where 1=1
AND t.current_billing_plan IS NOT NULL
AND crm.auto_sync_activity = 0
and crm.provider = 'hubspot';
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Exclaimer%'; # 270,205,10053,[EMAIL]
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 270
and sa.provider = 'salesforce';
SELECT * FROM activities WHERE uuid_to_bin('b54df794-2a9a-4957-8d80-09a600ead5f8') = uuid; # 21637956
SELECT * FROM crm_profiles WHERE user_id = 11446;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Cygnetise%'; # 372,300,12554, [EMAIL]
select * from playbooks where team_id = 372;
select * from crm_fields where crm_configuration_id = 300 and object_type = 'event'; # 141340
SELECT * FROM crm_field_values WHERE crm_field_id = 141340;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 372
and sa.provider = 'salesforce';
select * from crm_profiles where crm_configuration_id = 300;
SELECT * FROM crm_configurations WHERE team_id = 372;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Planday%'; # 291,242,11501,[EMAIL]
SELECT * FROM opportunities WHERE team_id = 291 and crm_provider_id = '006bG000005DO86QAG'; # 3207756
select * from crm_field_data where object_id = 3207756;
SELECT * FROM crm_fields WHERE id = 111834;
select f.id, f.crm_provider_id AS field_name, f.label, fd.object_id AS dealId, fd.value
FROM crm_fields f
JOIN crm_field_data fd ON f.id = fd.crm_field_id
WHERE f.crm_configuration_id = 242
AND f.object_type = 'opportunity'
AND fd.object_id IN (3207756)
ORDER BY fd.object_id, fd.updated_at;
SELECT * FROM crm_configurations WHERE auto_connect = 1;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Tour%'; # 187,209,8150,[EMAIL]
select * from group_deal_risk_types drgt join groups g on drgt.group_id = g.id
where g.team_id = 187;
select * from `groups` where team_id = 187;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 187
and sa.provider = 'salesforce';
# Destination - 98870 - Destination__c
# Stage - 79014 - StageName
# Land Arrangement - 98856 - Land_Arrangement__c
# Flight - 98848 - Flight__c
# Last activity date - 98812 - LastActivityDate
# Last modified date - 98809 - LastModifiedDate
# Last inbound mail timestamp - 99151 - Last_Inbound_Mail_Timestamp__c
# next call - 98864 - Next_Call__c
select * from crm_fields where crm_configuration_id = 209 and object_type = 'opportunity';
SELECT * FROM crm_layouts WHERE crm_configuration_id = 209;
SELECT * FROM crm_layout_entities WHERE crm_layout_id = 682;
select * from opportunities where team_id = 187 and name LIKE'%Muriel Sal%';
select * from opportunities where team_id = 187 and user_id = 9951 and is_closed = 0;
select * from activities where opportunity_id = 3538248;
SELECT * FROM crm_profiles WHERE user_id = 8150;
select * from deal_risks where opportunity_id = 3538248;
select * from teams where crm_id IS NULL;
SELECT opp.id AS opportunity_id,
u.group_id AS group_id,
MAX(
CASE
WHEN a.type IN ("sms-inbound", "sms-outbound") THEN a.created_at
ELSE a.actual_end_time
END) as last_date
FROM opportunities opp
left join activities a on a.opportunity_id = opp.id
inner join users u on opp.user_id = u.id
where opp.user_id IN (9951)
AND opp.is_closed = 0
and a.status IN ('completed', 'received', 'delivered') OR a.status IS NULL
group by opp.id;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Cybsafe%'; # 343,301,12008,[EMAIL]
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 343
and sa.provider = 'hubspot';
SELECT * FROM crm_profiles WHERE crm_configuration_id = 301;
SELECT * FROM contacts WHERE id = 6612363;
SELECT * FROM accounts WHERE id = 4235676;
SELECT * FROM opportunities WHERE crm_configuration_id = 301 and crm_provider_id = 32983784868;
select * from opportunity_stages where opportunity_id = 4503759;
# SELECT * FROM opportunities WHERE id = 4569937;
select * from activities where crm_configuration_id = 301;
SELECT * FROM activities WHERE uuid_to_bin('d3b2b28b-c3d0-4c2d-8ed0-eef42855278a') = uuid; # 26330370
SELECT * FROM participants WHERE activity_id = 26330370;
SELECT * FROM teams WHERE id = 375;
select * from playbooks where team_id = 375;
select * from stages where crm_configuration_id = 301 and type = 'opportunity';
select * from teams;
select * from contact_roles;
SELECT * FROM opportunities WHERE team_id = 343 and user_id = 12871 and close_date >= '2024-11-01';
select * from users u join crm_profiles cp on cp.user_id = u.id where u.team_id = 343;
SELECT * FROM crm_field_data WHERE object_id = 3771706;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 343
and sa.provider = 'hubspot';
SELECT * FROM crm_fields WHERE crm_configuration_id = 301 and object_type = 'opportunity'
and crm_provider_id LIKE "%traffic_light%";
SELECT * FROM crm_field_values WHERE crm_field_id IN (144020,144048,144111,144113,144126,144481,144508,144531);
SELECT fd.* FROM opportunities o
JOIN crm_field_data fd ON o.id = fd.object_id
WHERE o.team_id = 343
# and o.user_id IS NOT NULL
and fd.crm_field_id IN (144020,144048,144111,144113,144126,144481,144508,144531)
and fd.value != ''
order by value desc
# group by o.id
;
SELECT * FROM opportunities WHERE id = 3769843;
SELECT * FROM teams WHERE name LIKE '%Tour%'; # 187,209,8150, [EMAIL]
SELECT * FROM crm_layouts WHERE crm_configuration_id = 209;
SELECT * FROM crm_layout_entities WHERE crm_layout_id = 682;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Funding Circle%'; # 220,177,8603,[EMAIL]
SELECT * FROM activities WHERE uuid_to_bin('7a40e99b-3b37-4bb1-b983-325b81801c01') = uuid; # 23139839
SELECT * FROM opportunities WHERE id = 3855992;
SELECT * FROM users WHERE name LIKE '%Angus Pollard%'; # 8988
SELECT * FROM teams WHERE name LIKE '%Story Terrace%'; # 379, 307, 12894
SELECT * FROM crm_fields WHERE crm_configuration_id = 307 and object_type != 'opportunity';
select * from contacts where team_id = 379 and name like '%bebro%'; # 5874411, crm: 77229348507
SELECT * FROM crm_field_data WHERE object_id = 5874411;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 379
and sa.provider = 'hubspot';
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%mentio%'; # 117, 94, 6371, [EMAIL]
SELECT * FROM activities WHERE uuid_to_bin('82939311-1af0-4506-8546-21e8d1fdf2c1') = uuid;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Tourlane%'; # 187, 209, 8150, [EMAIL]
SELECT * FROM opportunities WHERE team_id = 187 and crm_provider_id = '006Se000008xfvNIAQ'; # 3537793
select * from generic_ai_prompts where subject_id = 3537793;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Lunio%'; # 120, 97, 10984, [EMAIL]
SELECT * FROM crm_configurations WHERE id = 97;
SELECT * FROM crm_layouts WHERE crm_configuration_id = 97;
SELECT * FROM crm_layout_entities WHERE crm_layout_id = 355;
SELECT * FROM crm_fields WHERE id = 32682;
select cfd.value, o.* from opportunities o
join crm_field_data cfd on o.id = cfd.object_id and cfd.crm_field_id = 32682
where team_id = 120
and cfd.value != ''
;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 120
and sa.provider = 'salesforce';
select * from opportunities where team_id = 120 and crm_provider_id = '006N1000007X8MAIA0';
SELECT * FROM crm_field_data WHERE object_id = 2313439;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE id = 410;
SELECT * FROM teams WHERE name LIKE '%Local Business Oxford%';
select * from scorecards where team_id = 410;
select * from scorecard_rules;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Funding%'; # 220, 177, 8603, [EMAIL]
select * from activities a
join opportunities o on a.opportunity_id = o.id
join users u on o.user_id = u.id
where a.crm_configuration_id = 177 and a.type LIKE '%email-out%'
# and a.actual_end_time > '2024-12-16 00:00:00'
# and o.remotely_created_at > '2024-12-01 00:00:00'
# and u.group_id = 1014
and u.id = 9021
order by a.id desc;
SELECT * FROM opportunities WHERE id in (3981384,4017346);
SELECT * FROM users WHERE team_id = 220 and id IN (8775, 11435);
select * from users where id = 9021;
select * from inboxes where user_id = 9021;
select * from inbox_emails where inbox_id = 1349 and email_date > '2024-12-18 00:00:00';
select * from email_messages where team_id = 220
and orig_date > '2024-12-16 00:00:00' and orig_date < '2024-12-19 00:00:00'
and subject LIKE '%Personal%'
# and 'from' = '[EMAIL]'
;
select * from activities a
join opportunities o on a.opportunity_id = o.id
where a.user_id = 9021 and a.type LIKE '%email-out%'
and a.actual_end_time > '2024-12-18 00:00:00'
and o.user_id IS NOT NULL
and o.remotely_created_at > '2024-12-01 00:00:00'
order by a.id desc;
SELECT * FROM opportunities WHERE team_id = 220 and name LIKE '%Right Car move Limited%' and id = 3966852;
select * from activities where crm_configuration_id = 177 and type LIKE '%email%' and opportunity_id = 3966852 order by id desc;
select * from team_settings where name IN ('useCloseDate');
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Hurree%'; # 104, 81, 6175, [EMAIL]
SELECT * FROM opportunities WHERE team_id = 104 and name = 'PropOp';
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 104
and sa.provider = 'hubspot';
select * from crm_configurations where last_synced_at > '2025-01-19 01:00:00'
select * from teams where crm_id IS NULL;
select t.name as 'team', u.name as 'owner', u.email, u.phone
from teams t
join activity_providers ap on t.id = ap.team_id
join users u on t.owner_id = u.id
where 1=1
and t.status = 'active'
and ap.is_enabled = 1
# and u.status = 1
and ap.provider = 'ms-teams';
select * from crm_configurations where provider = 'bullhorn'; # 344
SELECT * FROM teams WHERE id = 442; # 14293
select * from users where team_id = 442;
select * from social_accounts sa where sa.sociable_id = 14293;
select * from invitations where team_id = 442;
# [PASSWORD_DOTS]
SELECT * FROM users WHERE email LIKE '%[EMAIL]%'; # 14022
SELECT * FROM teams WHERE id = 429;
select * from opportunities where team_id = 429 and crm_provider_id IN (16157415775, 22246219645);
select * from activities where opportunity_id in (4340436,4353519);
select * from transcription where activity_id IN (25630961,25381771);
select * from generic_ai_prompts where subject_id IN (4353519);
SELECT
a.id as activity_id,
a.opportunity_id,
a.type as activity_type,
a.language,
CONCAT(a.title, a.description) AS mail_content,
e.from AS mail_from,
e.to AS mail_to,
e.subject AS mail_subject,
e.body AS mail_body,
p.type as prompt_type,
p.status as prompt_status,
p.content AS prompt_content,
a.actual_start_time as created_at
FROM activities a
LEFT JOIN ai_prompts p ON a.transcription_id = p.transcription_id AND p.deleted_at IS NULL
LEFT JOIN email_messages e ON a.id = e.activity_id
WHERE a.actual_start_time > '2024-01-01 00:00:00'
AND a.opportunity_id IN (4353519)
AND a.status IN ('completed', 'received', 'delivered')
AND a.deleted_at IS NULL
AND a.type NOT IN ('sms-inbound', 'sms-outbound')
ORDER BY a.opportunity_id ASC, a.id ASC;
SELECT * FROM users WHERE name LIKE '%George Fierstone%'; # 14293
SELECT * FROM teams WHERE id = 442;
SELECT * FROM crm_configurations WHERE id = 344;
select * from team_features where team_id = 442;
select * from groups where team_id = 442;
select * from playbooks where team_id = 442;
select * from playbook_categories where playbook_id = 1729;
select * from crm_fields where crm_configuration_id = 344 and id = 172024;
SELECT * FROM crm_field_values WHERE crm_field_id = 172024;
select * from crm_layouts where crm_configuration_id = 344;
select * from playbook_layouts where playbook_id = 1729;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Learning%'; # 260, 221, 9444
select s.*
# , s.sent_at, u.name, a.*
from activity_summary_logs s
inner join activities a on a.id = s.activity_id
inner join users u on u.id = a.user_id
where a.crm_configuration_id = 356
and s.sent_at > date_sub(now(), interval 60 day)
order by a.actual_end_time desc;
select * from activities a
# inner join activity_summary_logs s on s.activity_id = a.id
where a.crm_configuration_id = 356 and a.actual_end_time > date_sub(now(), interval 60 day)
# and a.crm_provider_id is not null
# and provider <> 'ringcentral'
and status = 'completed'
order by a.actual_end_time desc;
select * from teams order by id desc; # 17328, 32, 17830, [EMAIL]
SELECT * FROM users;
SELECT * FROM users where team_id = 260 and status = 1; # 201 - 150 active
SELECT * FROM teams WHERE id = 260;
select * from team_settings where team_id = 260;
select * from crm_configurations where team_id = 260;
SELECT * FROM crm_layouts WHERE crm_configuration_id = 356;
SELECT * FROM crm_layout_entities WHERE crm_layout_id = 1184;
select * from accounts where crm_configuration_id = 221 order by id desc; # 7000
select * from leads where crm_configuration_id = 221 order by id desc; # 0
select * from contacts where crm_configuration_id = 221 order by id desc; # 200 000
select * from opportunities where crm_configuration_id = 221 order by id desc; # 0
select * from crm_profiles where crm_configuration_id = 221 order by id desc; # 23
select * from crm_fields where crm_configuration_id = 221;
select * from crm_field_values where crm_field_id = 5302 order by id desc;
select * from crm_layouts where crm_configuration_id = 221 order by id desc;
select * from stages where crm_configuration_id = 221 order by id desc;
select * from accounts where crm_configuration_id = 356 order by id desc; # 7000
select * from leads where crm_configuration_id = 356 order by id desc; # 0
select * from contacts where crm_configuration_id = 356 order by id desc; # 200 000
select * from opportunities where crm_configuration_id = 356 order by id desc; # 0
select * from crm_profiles where crm_configuration_id = 356 order by id desc; # 23
select * from crm_fields where crm_configuration_id = 356;
select * from crm_field_values where crm_field_id = 5302 order by id desc;
select * from crm_layouts where crm_configuration_id = 356 order by id desc;
select * from stages where crm_configuration_id = 356 order by id desc;
select * from playbooks where team_id = 260 order by id desc; # 4 (2 deleted)
select * from groups where team_id = 260 order by id desc; # 27 groups, (2 deleted)
select * from playbook_layouts where playbook_id IN (1410,1409,1276,1254); # 4
select ce.* from calendars c
join users u on c.user_id = u.id
join calendar_events ce on c.id = ce.calendar_id
where u.team_id = 260
and (ce.start_time > '2025-02-21 00:00:00')
;
# calendar events 1207
#
select * from opportunities where team_id = 260;
SELECT * FROM crm_field_data WHERE object_id = 4696496;
select * from activities where crm_configuration_id = 356 and crm_provider_id IS NOT NULL;
select * from activities where crm_configuration_id IN (221) and provider NOT IN ('ms-teams', 'uploader', 'zoom-bot')
# and type = 'conference' and status = 'scheduled' and activities.is_internal = 0
and created_at > '2024-03-01 00:00:00'
order by id desc; # 880 000, ringcentral, avaya
SELECT * FROM participants WHERE activity_id = 26371744;
# all activities 942 000 +
# conference 7385 - scheduled 984 - external 343
select * from activities where id = 26321812;
select * from participants where activity_id = 26321812;
select * from participants where activity_id in (26414510,26414514,26414516,26414604,26414653,26414655);
select * from leads where id in (720428,689175,731546,645866,621037);
select * from users where id = 13841;
select * from opportunities where user_id = 9541;
select * from stages where id = 15900;
select * from accounts where
# id IN (4160055,5053725,4965303,4896434)
id in (4584518,3249934,3218025,3891133,3399450,4172999,4485161,3101785,4587203,3070816,2870343,2870341,3563940,4550846,3424464,3249963,2870342)
;
select * from activities where id = 26654935;
SELECT * FROM opportunities WHERE id = 4803458;
SELECT * FROM opportunities where team_id = 260 and user_id = 13841 AND stage_id = 15900;
SELECT id, uuid, provider, type, lead_id, account_id, contact_id, opportunity_id, stage_id, status, recording_state, title, actual_start_time, actual_end_time
FROM activities WHERE user_id = 13841 AND opportunity_id IN (4729783, 4731717, 4731726, 4732064, 4732849, 4803458, 4813213);
SELECT DISTINCT
o.id, o.stage_id, s.name, a.title,
a.*
FROM activities a
# INNER JOIN tracks t ON a.id = t.activity_id
INNER JOIN users u ON a.user_id = u.id
INNER JOIN teams team ON u.team_id = team.id
INNER JOIN groups g ON u.group_id = g.id
INNER JOIN opportunities o ON a.opportunity_id = o.id
INNER JOIN stages s ON o.stage_id = s.id
WHERE
a.crm_configuration_id = 356
AND a.status IN ('completed', 'failed')
AND a.recording_state != 'stopped'
# and a.user_id = 13841
AND u.uuid = uuid_to_bin('6f40e4b8-c340-4059-b4ac-1728e87ea99e')
AND team.uuid = uuid_to_bin('a607fba7-452e-4683-b2af-00d6cb52c93c')
AND g.uuid = uuid_to_bin('b5d69e40-24a0-4c16-810b-5fa462299f94')
AND a.type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')
# AND t.type IN ('audio', 'video')
AND (
(a.actual_start_time BETWEEN '2025-03-13 00:00:00' AND '2025-03-18 07:59:59')
OR
(
a.actual_start_time IS NULL
AND a.type IN ('sms-outbound', 'sms-inbound')
AND a.created_at BETWEEN '2025-03-13 00:00:00' AND '2025-03-18 07:59:59'
)
)
AND (
a.is_private = 0
OR (
a.is_private = 1
AND u.uuid = uuid_to_bin('6f40e4b8-c340-4059-b4ac-1728e87ea99e')
)
)
AND (
# s.id = 15900
s.uuid = uuid_to_bin('04ca1c26-c666-4268-a129-419c0acffd73')
OR s.uuid IS NULL -- Include records without opportunity stage
)
ORDER BY a.actual_end_time DESC;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Lead Forensics%'; # 190, 162, 8474, [EMAIL]
SELECT * FROM users WHERE team_id = 190;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 190
and sa.provider = 'hubspot';
select * from role_user where user_id = 8474;
select * from crm_configurations where provider = 'bullhorn';
SELECT * FROM opportunities WHERE uuid_to_bin('94578249-65ec-4205-90f2-7d1a7d5ab64a') = uuid;
SELECT * FROM users WHERE uuid_to_bin('26dbadeb-926f-4150-b11b-771b9d4c2f9a') = uuid;
SELECT * FROM opportunities WHERE id = 4732493;
select * from activities where opportunity_id = 4732493;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE id = 443; # 358, 14315, [EMAIL]
SELECT * FROM opportunities WHERE team_id = 443;
SELECT a.id, a.type, a.user_id, a.status, a.deleted_at, u.name, u.email, u.team_id as activity_team_id, u.status, u.deleted_at, t.name, t.status, s.team_id as stage_team_id
FROM activities AS a
JOIN stages AS s ON a.stage_id = s.id
JOIN users AS u ON u.id = a.user_id
JOIN teams AS t ON t.id = s.team_id
WHERE u.team_id <> s.team_id and t.id > 135;
SELECT
crm_configuration_id,
crm_provider_id,
COUNT(*) as duplicate_count,
GROUP_CONCAT(id) as stage_ids,
GROUP_CONCAT(name) as stage_names
FROM stages
GROUP BY crm_configuration_id, crm_provider_id
HAVING COUNT(*) > 1
ORDER BY duplicate_count DESC;
select * from stages where id IN (14898,14907);
select * from business_processes;
SELECT *
FROM crm_configurations
WHERE team_id IN (
SELECT team_id
FROM crm_configurations
GROUP BY team_id
HAVING COUNT(*) > 1
)
ORDER BY team_id;
SELECT *
FROM teams
WHERE crm_id IN (
SELECT crm_id
FROM teams
GROUP BY crm_id
HAVING COUNT(*) > 1
)
ORDER BY crm_id;
# [PASSWORD_DOTS]
select * from crm_configurations where provider = 'integration-app';
SELECT * FROM teams WHERE id = 443; # Correre Naturale 358 14315 [EMAIL]
select * from activities where crm_configuration_id = 358 order by actual_end_time desc;
select id, uuid, actual_end_time, crm_provider_id, is_internal, playbook_category_id, type, user_id, lead_id, contact_id, account_id, opportunity_id, status, title from activities where crm_configuration_id = 358 order by actual_end_time desc;
select * from team_features where team_id = 358;
select * from activity_summary_logs;
select * from teams where id = 406;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Sportfive%'; # 267, 202, 14637, [EMAIL]
select * from activities where crm_configuration_id = 202 order by actual_end_time desc;
SELECT * FROM users where id = 14637;
SELECT * FROM teams where id = 267;
SELECT * FROM groups where id = 1118;
select g.name, a.title, uuid_from_bin(a.uuid), a.external_id, a.status, a.recording_state, a.recording_reason_code, a.scheduled_start_time, a.scheduled_end_time, a.actual_start_time, a.actual_end_time from activities a
inner join users u on u.id = a.user_id
inner join groups g on g.id = u.group_id
where a.crm_configuration_id = 202
and a.is_internal = 0
and (a.scheduled_start_time between '2025-03-19 00:00:00' and '2025-03-21 00:00:00')
and a.type = 'conference'
and a.status != 'completed'
and a.external_id is not null
order by a.scheduled_start_time desc;
SELECT * FROM activities
WHERE crm_configuration_id = 202
AND status IN ('completed', 'failed')
AND recording_state != 'stopped'
AND type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')
AND (is_private = 0 OR user_id = 14637)
AND (
(
actual_start_time BETWEEN '2025-03-12 12:00:00' AND '2025-03-24 11:59:59'
) OR (
actual_start_time IS NULL
AND type IN ('sms-outbound', 'sms-inbound')
AND created_at BETWEEN '2025-03-12 12:00:00' AND '2025-03-24 11:59:59'
)
)
AND NOT EXISTS (
SELECT 1
FROM tracks
WHERE
tracks.activity_id = activities.id
AND tracks.type IN ('audio', 'video')
)
ORDER BY actual_end_time DESC;
SELECT DISTINCT
a.*
FROM activities a
INNER JOIN tracks t ON a.id = t.activity_id
INNER JOIN users u ON a.user_id = u.id
INNER JOIN teams team ON u.team_id = team.id
WHERE
a.crm_configuration_id = 202
AND a.status IN ('completed', 'failed')
AND a.recording_state != 'stopped'
# and a.user_id = 14637
AND a.type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')
# AND t.type IN ('audio', 'video')
AND (
(a.actual_start_time BETWEEN '2025-03-12 12:00:00' AND '2025-03-24 11:59:59')
OR
(
a.actual_start_time IS NULL
AND a.type IN ('sms-outbound', 'sms-inbound')
AND a.created_at BETWEEN '2025-03-12 12:00:00' AND '2025-03-24 11:59:59'
)
)
AND (
a.is_private = 0
OR (
a.is_private = 1
AND a.user_id = 14637
)
)
ORDER BY a.actual_end_time DESC
;
SELECT DISTINCT a.*
FROM activities a
INNER JOIN users u ON a.user_id = u.id
INNER JOIN teams t ON u.team_id = t.id
# INNER JOIN tracks tr ON a.id = tr.activity_id
# INNER JOIN groups g ON u.group_id = g.id
WHERE 1=1
AND t.id = 267
# AND t.uuid = uuid_to_bin('aed4927b-f1ea-499e-94c3-83762fd233e8')
AND a.status IN ('completed', 'failed')
AND a.recording_state != 'stopped'
AND a.type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')
# AND tr.type NOT IN ('audio', 'video')
AND (
a.is_private = 0
OR a.user_id = 14637
)
AND (
(a.actual_start_time BETWEEN '2025-03-19 00:00:00' AND '2025-03-21 23:59:59')
OR (
a.actual_start_time IS NULL
AND a.type IN ('sms-outbound', 'sms-inbound')
AND a.created_at BETWEEN '2025-03-19 00:00:00' AND '2025-03-21 23:59:59'
)
)
# and NOT EXISTS (
# SELECT 1
# FROM tracks t
# WHERE t.activity_id = a.id
# AND t.type IN ('audio', 'video')
# )
ORDER BY a.actual_end_time DESC;
SELECT * FROM tracks WHERE activity_id = 26485995;
select a.is_private, a.title, uuid_from_bin(a.uuid), a.external_id, a.status, a.recording_state, a.recording_reason_code, a.scheduled_start_time, a.scheduled_end_time, a.actual_start_time, a.actual_end_time from activities a
inner join users u on u.id = a.user_id
where a.crm_configuration_id = 202
# and a.is_internal = 0
and (a.actual_start_time between '2025-03-19 00:00:00' and '2025-03-21 00:00:00')
and a.type IN ("softphone","softphone-inbound","conference","sms-inbound")
and a.status IN ('completed', 'failed')
# and a.external_id is not null
order by a.actual_end_time desc;
select * from activities a where a.crm_configuration_id = 202
and a.actual_start_time between '2025-03-20 00:00:00' and '2025-03-21 00:00:00'
# AND a.type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')
select g.name, a.title, uuid_from_bin(a.uuid), a.external_id, a.status, a.recording_state, a.recording_reason_code, a.scheduled_start_time, a.scheduled_end_time, a.actual_start_time, a.actual_end_time from activities a
inner join users u on u.id = a.user_id
inner join groups g on g.id = u.group_id
where a.crm_configuration_id = 202
and a.is_internal = 0
and (a.scheduled_start_time between '2025-03-19 00:00:00' and '2025-03-21 00:00:00')
and a.type = 'conference'
and a.status != 'completed'
and a.external_id is not null
order by a.scheduled_start_time desc;
SELECT * FROM teams WHERE name LIKE '%Tourlane%';
SELECT * FROM crm_fields WHERE crm_configuration_id = 209 and object_type = 'opportunity';
SELECT * FROM crm_field_data WHERE crm_field_id = 98809;
select * from users where status = 1 AND timezone = 'MDT';
select * from opportunities where id = 3769814;
select * from deal_risks where opportunity_id = 3769814;
select cp.* from crm_profiles cp
join users u on cp.user_id = u.id
join crm_configurations crm on cp.crm_configuration_id = crm.id
where crm.provider = 'hubspot' AND u.status = 1 AND log_notes != 'none';
select * from crm_fields where id = 154575;
select * from team_features where feature = 'SUPPORTS_SYNC_MISSING_CALL_DISPOSITIONS';
SELECT * FROM teams WHERE id = 176; # crm 148
select * from activities where crm_configuration_id = 148 and provider = 'hubspot' order by id desc;
select * from activity_providers where provider = 'amazon-connect';
select * from crm_fields cf
join crm_configurations crm on crm.id = cf.crm_configuration_id
where crm.provider = 'hubspot' and cf.object_type IN ('account', 'contact');
# [PASSWORD_DOTS]
SELECT * FROM users WHERE id IN (15415, 15418);
SELECT * FROM groups WHERE id IN (1805,1806);
SELECT * FROM playbooks WHERE id = 1860;
SELECT * FROM playbook_categories WHERE id = 38634;
SELECT * FROM crm_fields WHERE id = 189962;
SELECT * FROM teams WHERE name = 'Pulsar Group'; # 472, 380, 15138 [EMAIL]
SELECT * FROM crm_profiles WHERE user_id = 15415;
SELECT * FROM social_accounts WHERE sociable_id = 15415 and provider = 'salesforce';
select * from sidekick_settings where team_id = 472;
SELECT * FROM activities WHERE uuid_to_bin('452c58c7-b87c-4fdd-953e-d7af185e9588') = uuid; # 28617536, user: 15418
SELECT * FROM activities WHERE uuid_to_bin('399114ee-d3a8-458c-bff5-5f654658db0a') = uuid; # 28344407, user: 15415
SELECT * FROM activities WHERE uuid_to_bin('f0aa567f-0ab1-4bbb-96aa-37dcf184676b') = uuid; # 28580288, user: 15415
SELECT * FROM activities WHERE uuid_to_bin('50c086b1-2770-4bca-b5ae-6bac22ec426b') = uuid; # 28566069, user: 15415
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%TeamTailor%'; # 109, 218, 13969, [EMAIL]
select * from crm_configurations where id = 218;
SELECT * FROM activities WHERE uuid_to_bin('e39b5857-7fdb-4f5a-951a-8d3ca69bb1b0') = uuid; # 28338765
SELECT * FROM users WHERE id IN (13232, 13230);
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 109
and sa.provider = 'salesforce';
0057R00000EPL5HQAX Inez Ekblad
1091cb81-5ea1-4951-a0ed-f00b568f0140 Triman Kaur
SELECT * FROM crm_profiles WHERE user_id IN (13232, 13230);
############################################################################################
SELECT * FROM activities WHERE uuid_to_bin('675eeaeb-5681-42db-90bc-54c07a604408') = uuid; # 28655939 00UVg00000FLvnSMAT
SELECT * FROM crm_field_data WHERE activity_id = 28655939;
SELECT * FROM crm_fields WHERE id IN (94491,94493,94498);
SELECT * FROM users WHERE id = 13658;
SELECT * FROM teams WHERE id = 109;
SELECT * FROM crm_configurations WHERE id = 218;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 109
and sa.provider = 'salesforce';
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Strengthscope%'; # 481, 390, 15420, [EMAIL]
SELECT * FROM stages WHERE crm_configuration_id = 390;
select * from business_processes where team_id = 481 and crm_configuration_id = 390;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 481
and sa.provider = 'salesforce';
SELECT * FROM users WHERE id = 15780; # team 462
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 462
and sa.provider = 'hubspot';
select * from teams where id = 495;
SELECT * FROM users WHERE id = 15794;
select * from social_accounts where sociable_id = 15794;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Flight%'; # 427, 333, 13752
SELECT * FROM accounts WHERE team_id = 427 and crm_provider_id = '668731000183444517';
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Group GTI%'; # 495, 407, 15794
SELECT * FROM activities WHERE crm_configuration_id = 407
and status = 'completed' and type = 'conference'
order by id desc;
select ru.*, pr.*, p.* from users u join role_user ru on ru.user_id = u.id
join permission_role pr on pr.role_id = ru.role_id
join permissions p on p.id = pr.permission_id
where team_id = 495 and p.name IN ('dial');
select * from permission_role;
select * from activities where crm_configuration_id = 407 and status = 'completed' order by id desc;
SELECT * FROM activities WHERE id = 29512773;
SELECT * FROM activities WHERE id IN (29042721,28991325,29002874);
SELECT al.* from activity_summary_logs al join activities a on a.id = al.activity_id
where a.crm_configuration_id = 407
# and a.id IN (29042721,28991325,29002874);
SELECT * FROM users WHERE id = 15794;
SELECT * FROM users WHERE team_id = 495;
SELECT * FROM social_accounts WHERE sociable_id = 15794;
SELECT * FROM opportunities WHERE team_id = 495 and name like '%OC:%';
SELECT * FROM contacts WHERE team_id = 495;
SELECT * FROM leads WHERE team_id = 495;
SELECT * FROM accounts WHERE team_id = 495;
SELECT * FROM crm_profiles WHERE crm_configuration_id = 407;
SELECT * FROM crm_fields WHERE crm_configuration_id = 407;
SELECT * FROM crm_configurations WHERE id = 407;
SELECT * FROM opportunities WHERE team_id = 495 and close_date BETWEEN '2025-06-01' AND '2025-07-01'
and user_id IS NOT NULL and is_closed = 1 and is_won = 1;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Hamilton Court FX LLP%'; # 249, 187, 10103
SELECT * FROM activities WHERE uuid_to_bin('4659c2bb-9a49-484e-9327-a3d66f1e028c') = uuid; # 28951064
SELECT * FROM crm_fields WHERE crm_configuration_id = 187 and object_type IN ('tasks', 'event');
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Checkstep%'; # 325, 256, 11753
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 325
and sa.provider = 'hubspot';
SELECT * FROM activities WHERE uuid_to_bin('7be372e2-1916-4d79-a2f3-ca3db1346db3') = uuid; # 28611085
SELECT * FROM activities WHERE uuid_to_bin('980f0336-840b-4185-a5a9-30cf8b0749a8') = uuid; # 28719733
SELECT * FROM activity_summary_logs where activity_id = 28719733;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Learning%'; # 260, 356, 9444
SELECT * FROM activity_summary_logs where sent_at BETWEEN '2025-06-09 11:38:00' AND '2025-06-09 11:40:00';
SELECT * FROM leads WHERE crm_configuration_id = 356 and crm_provider_id = '230045001502770504'; # 823630
select * from activities where crm_configuration_id = 356 and lead_id = 841732;
SELECT * from activity_summary_logs al join activities a on a.id = al.activity_id
where a.crm_configuration_id = 356;
select * from activities where crm_configuration_id = 356
and actual_end_time between '2025-06-09 11:00:00' and '2025-06-09 12:00:00'
order by id desc;
select * from accounts where crm_configuration_id = 356 and crm_provider_id = '230045001514403366' order by id desc;
select * from leads where crm_configuration_id = 356 and crm_provider_id = '230045001514275654' order by id desc;
select * from contacts where crm_configuration_id = 356 and crm_provider_id = '230045001514403366' order by id desc;
select * from opportunities where crm_configuration_id = 356 and crm_provider_id = '230045001514403366' order by id desc;
select * from team_features where team_id = 260;
select * from features where id IN (1,2,4,6,18,19,20,9,10,3,23,24,25,26,27);
SELECT * FROM activities WHERE uuid_to_bin('7be372e2-1916-4d79-a2f3-ca3db1346db3') = uuid;
select * from crm_fields;
select * from crm_layout_entities;
SELECT * FROM teams WHERE name LIKE '%Optable%';
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Teamtailor%'; # 109, 218, 13969
SELECT * FROM crm_configurations WHERE id = 218;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 109
and sa.provider = 'salesforce';
SELECT * FROM activities WHERE uuid_to_bin('675eeaeb-5681-42db-90bc-54c07a604408') = uuid; # 28655939
SELECT * FROM crm_field_data WHERE activity_id = 28655939;
SELECT * FROM crm_fields WHERE id in (94491,94493,94498);
select * from teams where crm_id IS NULL;
SELECT * FROM activities WHERE uuid_to_bin('71aa8a0c-9652-4ff6-bee7-d98ae60abef6') = uuid;
# [PASSWORD_DOTS]
select * from team_domains where team_id = 399;
SELECT * FROM teams WHERE name LIKE '%Rydoo%'; # 399, 318, 13207
select * from calendar_events where id = 5163781;
SELECT * FROM activities WHERE uuid_to_bin('be2cbc52-7fda-46a0-9ae0-25d9553eafc0') = uuid; # 29443896
SELECT * FROM participants WHERE activity_id = 29443896;
select * from contacts where crm_configuration_id = 318 and email = '[EMAIL]';
select * from leads where crm_configuration_id = 318 and email = '[EMAIL]';
select * from activities where user_id = 14937 order by created_at ;
select * from users where id = 14937;
select * from contacts where crm_configuration_id = 318 and email LIKE '%@strawberry.se';
select * from opportunities where crm_configuration_id = 318 and crm_provider_id = '006Sf00000D1WOAIA3';
select * from activities a join participants p on a.id = p.activity_id
where crm_configuration_id = 318 and a.updated_at > '2025-06-23T08:18:43Z';
# [PASSWORD_DOTS]
SELECT * FROM opportunities WHERE team_id = 379 and crm_provider_id = '39334518886';
SELECT * FROM opportunities WHERE team_id = 379 order by id desc;
SELECT * FROM teams WHERE id = 379;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 379 and sociable_id = 13852
and sa.provider = 'hubspot';
SELECT * FROM crm_configurations WHERE id = 307;
SELECT * FROM crm_layouts WHERE crm_configuration_id = 307;
SELECT * FROM crm_layout_entities WHERE crm_layout_id = 1027;
SELECT * FROM crm_fields WHERE crm_configuration_id = 307
and id IN (144750,144855,145158,155227);
SELECT * FROM activities;
select * from activities
where created_at > '2025-07-01 00:00:00'
# and created_at < '2025-08-01 00:00:00'
and type not in ('email-outbound', 'email-inbound')
and account_id is null
and contact_id is null
and lead_id is null
and opportunity_id is not null
;
SELECT * FROM activities WHERE id IN (25344155, 25344296, 25501909, 28692187);
SELECT * FROM crm_configurations WHERE id in (335,301,200);
select * from crm_fields where crm_configuration_id = 230 and crm_provider_id = 'Age2__c';
SELECT * FROM teams WHERE name LIKE '%Resights%';
select * from crm_fields where crm_configuration_id = 1 and object_type = 'opportunity';
select * from crm_configurations where provider = 'bullhorn'; # 344
select * from teams where id IN (442);
select * from activities
where crm_configuration_id = 177
and provider = 'amazon-connect'
order by id desc;
# and source <> 'gong';
select * from activity_providers where provider = 'amazon-connect';
SELECT * FROM activities WHERE uuid_to_bin('cec1993b-a7e5-4164-b74d-d680ea51d2f2') = uuid;
select * from crm_configurations where store_transcript = 1;
SELECT * FROM teams WHERE id IN (80);
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Sedna%'; # 277, 213, 12594
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 277
and sa.provider = 'salesforce';
selec...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"bounds":{"left":0.025930852,"top":0.019952115,"width":0.03856383,"height":0.025538707},"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"#11894 on JY-18909-automated-reports-ask-jiminny, menu","depth":5,"bounds":{"left":0.064494684,"top":0.019952115,"width":0.12134308,"height":0.025538707},"help_text":"Pull request #11894 exists for current branch JY-18909-automated-reports-ask-jiminny","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"bounds":{"left":0.7972075,"top":0.019952115,"width":0.011303191,"height":0.025538707},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"RequestGenerateAskJiminnyReportJobTest","depth":6,"bounds":{"left":0.8125,"top":0.019952115,"width":0.10305851,"height":0.025538707},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run 'RequestGenerateAskJiminnyReportJobTest'","depth":6,"bounds":{"left":0.9155585,"top":0.019952115,"width":0.011303191,"height":0.025538707},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'RequestGenerateAskJiminnyReportJobTest'","depth":6,"bounds":{"left":0.9268617,"top":0.019952115,"width":0.011303191,"height":0.025538707},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"More Actions","depth":6,"bounds":{"left":0.9381649,"top":0.019952115,"width":0.011303191,"height":0.025538707},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JetBrains AI","depth":5,"bounds":{"left":0.96609044,"top":0.019952115,"width":0.011303191,"height":0.025538707},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Search Everywhere","depth":5,"bounds":{"left":0.9773936,"top":0.019952115,"width":0.011303191,"height":0.025538707},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"IDE and Project Settings","depth":5,"bounds":{"left":0.9886968,"top":0.019952115,"width":0.011303186,"height":0.025538707},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.042220745,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"2","depth":4,"bounds":{"left":0.37034574,"top":0.2490024,"width":0.007978723,"height":0.015163607},"role_description":"text"},{"role":"AXStaticText","text":"1","depth":4,"bounds":{"left":0.38031915,"top":0.2490024,"width":0.00731383,"height":0.015163607},"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.38929522,"top":0.24740623,"width":0.00731383,"height":0.018355945},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"bounds":{"left":0.39660904,"top":0.24740623,"width":0.006981383,"height":0.018355945},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Services\\Kiosk\\AutomatedReports;\n\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinition\\ActivityActualDate;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinition\\ActivityUpdatedDate;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinition\\DealInsights\\ClosingPeriodFilter;\nuse Jiminny\\Component\\ActivitySearch\\Service\\ActivitySearch;\nuse Jiminny\\Models\\Activity\\Search;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Repositories\\ElasticActivityRepository;\nuse Jiminny\\VO\\Repository\\OnDemandActivitySearch\\Criteria;\nuse Psr\\Log\\LoggerInterface;\n\nclass AskJiminnyReportActivityService\n{\n private const int DEFAULT_TOP_ACTIVITIES_COUNT = 100;\n\n private const array DATE_FILTER_KEYS = [\n ActivityActualDate::PARAM_START_DATE,\n ActivityActualDate::PARAM_END_DATE,\n ActivityUpdatedDate::PARAM_UPDATED_FROM,\n ActivityUpdatedDate::PARAM_UPDATED_TO,\n ClosingPeriodFilter::KEY_START_DATE,\n ClosingPeriodFilter::KEY_END_DATE,\n ];\n\n public function __construct(\n private readonly ActivitySearch $activitySearch,\n private readonly ElasticActivityRepository $elasticRepository,\n private readonly LoggerInterface $logger,\n ) {\n }\n\n /**\n * Fetch activity IDs for a saved search, passing its filters as-is to Criteria.\n * Date filters stored on the saved search are excluded; if no other filters exist,\n * no date constraint is applied — matching the behaviour of getContextForAskAnythingByFilter.\n *\n * @return string[] Activity IDs\n */\n public function getActivityIdsForSavedSearch(\n Search $savedSearch,\n User $user,\n ): array {\n $requestParams = $this->buildRequestParamsFromSearch($savedSearch, $user);\n\n $criteria = Criteria::createFromRequest(\n array_merge($requestParams, [\n 'limit' => self::DEFAULT_TOP_ACTIVITIES_COUNT,\n 'page' => 1,\n 'sequence_number' => 1,\n ]),\n $user->getTimezone()\n );\n\n $filterSet = $this->activitySearch->getOnDemandPageFilterSet($criteria, $user);\n\n $activityIds = $this->elasticRepository->onDemandSearchIdsOnly($user, $criteria, $filterSet);\n\n $this->logger->info('[AskJiminnyReport] Fetched activity IDs for saved search', [\n 'saved_search_id' => $savedSearch->getId(),\n 'user_id' => $user->getId(),\n 'activity_count' => count($activityIds),\n ]);\n\n return $activityIds;\n }\n\n private function buildRequestParamsFromSearch(Search $savedSearch, User $user): array\n {\n $params = [];\n $arrayFilterKeys = $this->activitySearch->getArrayFilterKeys($user);\n\n foreach ($savedSearch->getFilters() as $filter) {\n $key = $filter->getFilterProperty();\n $value = $filter->getFilterValue();\n\n if (in_array($key, self::DATE_FILTER_KEYS, true)) {\n continue;\n }\n\n if (isset($params[$key])) {\n $params[$key][] = $value;\n } elseif (in_array($key, $arrayFilterKeys, true)) {\n $params[$key] = [$value];\n } else {\n $params[$key] = $value;\n }\n }\n\n return $params;\n }\n}","depth":4,"value":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Services\\Kiosk\\AutomatedReports;\n\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinition\\ActivityActualDate;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinition\\ActivityUpdatedDate;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinition\\DealInsights\\ClosingPeriodFilter;\nuse Jiminny\\Component\\ActivitySearch\\Service\\ActivitySearch;\nuse Jiminny\\Models\\Activity\\Search;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Repositories\\ElasticActivityRepository;\nuse Jiminny\\VO\\Repository\\OnDemandActivitySearch\\Criteria;\nuse Psr\\Log\\LoggerInterface;\n\nclass AskJiminnyReportActivityService\n{\n private const int DEFAULT_TOP_ACTIVITIES_COUNT = 100;\n\n private const array DATE_FILTER_KEYS = [\n ActivityActualDate::PARAM_START_DATE,\n ActivityActualDate::PARAM_END_DATE,\n ActivityUpdatedDate::PARAM_UPDATED_FROM,\n ActivityUpdatedDate::PARAM_UPDATED_TO,\n ClosingPeriodFilter::KEY_START_DATE,\n ClosingPeriodFilter::KEY_END_DATE,\n ];\n\n public function __construct(\n private readonly ActivitySearch $activitySearch,\n private readonly ElasticActivityRepository $elasticRepository,\n private readonly LoggerInterface $logger,\n ) {\n }\n\n /**\n * Fetch activity IDs for a saved search, passing its filters as-is to Criteria.\n * Date filters stored on the saved search are excluded; if no other filters exist,\n * no date constraint is applied — matching the behaviour of getContextForAskAnythingByFilter.\n *\n * @return string[] Activity IDs\n */\n public function getActivityIdsForSavedSearch(\n Search $savedSearch,\n User $user,\n ): array {\n $requestParams = $this->buildRequestParamsFromSearch($savedSearch, $user);\n\n $criteria = Criteria::createFromRequest(\n array_merge($requestParams, [\n 'limit' => self::DEFAULT_TOP_ACTIVITIES_COUNT,\n 'page' => 1,\n 'sequence_number' => 1,\n ]),\n $user->getTimezone()\n );\n\n $filterSet = $this->activitySearch->getOnDemandPageFilterSet($criteria, $user);\n\n $activityIds = $this->elasticRepository->onDemandSearchIdsOnly($user, $criteria, $filterSet);\n\n $this->logger->info('[AskJiminnyReport] Fetched activity IDs for saved search', [\n 'saved_search_id' => $savedSearch->getId(),\n 'user_id' => $user->getId(),\n 'activity_count' => count($activityIds),\n ]);\n\n return $activityIds;\n }\n\n private function buildRequestParamsFromSearch(Search $savedSearch, User $user): array\n {\n $params = [];\n $arrayFilterKeys = $this->activitySearch->getArrayFilterKeys($user);\n\n foreach ($savedSearch->getFilters() as $filter) {\n $key = $filter->getFilterProperty();\n $value = $filter->getFilterValue();\n\n if (in_array($key, self::DATE_FILTER_KEYS, true)) {\n continue;\n }\n\n if (isset($params[$key])) {\n $params[$key][] = $value;\n } elseif (in_array($key, $arrayFilterKeys, true)) {\n $params[$key] = [$value];\n } else {\n $params[$key] = $value;\n }\n }\n\n return $params;\n }\n}","role_description":"text entry area","is_enabled":true,"is_focused":true,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Execute","depth":4,"bounds":{"left":0.40492022,"top":0.09896249,"width":0.008643617,"height":0.01915403},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Explain Plan","depth":4,"bounds":{"left":0.41356382,"top":0.09896249,"width":0.008643617,"height":0.01915403},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Browse Query History","depth":4,"bounds":{"left":0.4245346,"top":0.09896249,"width":0.008643617,"height":0.01915403},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"View Parameters","depth":4,"bounds":{"left":0.4331782,"top":0.09896249,"width":0.008643617,"height":0.01915403},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Open Query Execution Settings…","depth":4,"bounds":{"left":0.4418218,"top":0.09896249,"width":0.008643617,"height":0.01915403},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"In-Editor Results","depth":4,"bounds":{"left":0.45279256,"top":0.09896249,"width":0.008643617,"height":0.01915403},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Tx: Auto","depth":4,"bounds":{"left":0.4637633,"top":0.09896249,"width":0.024268618,"height":0.01915403},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Cancel Running Statements","depth":4,"bounds":{"left":0.49035904,"top":0.09896249,"width":0.008643617,"height":0.01915403},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Playground","depth":4,"bounds":{"left":0.5013298,"top":0.09896249,"width":0.029587766,"height":0.01915403},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"jiminny","depth":4,"bounds":{"left":0.69913566,"top":0.09896249,"width":0.02825798,"height":0.01915403},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.042220745,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"27","depth":4,"bounds":{"left":0.6565825,"top":0.123703115,"width":0.009973404,"height":0.015163607},"role_description":"text"},{"role":"AXStaticText","text":"9","depth":4,"bounds":{"left":0.66855055,"top":0.123703115,"width":0.007978723,"height":0.015163607},"role_description":"text"},{"role":"AXStaticText","text":"23","depth":4,"bounds":{"left":0.67852396,"top":0.123703115,"width":0.010305851,"height":0.015163607},"role_description":"text"},{"role":"AXStaticText","text":"3","depth":4,"bounds":{"left":0.69082445,"top":0.123703115,"width":0.007978723,"height":0.015163607},"role_description":"text"},{"role":"AXStaticText","text":"105","depth":4,"bounds":{"left":0.70079786,"top":0.123703115,"width":0.011968086,"height":0.015163607},"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.7144282,"top":0.12210695,"width":0.00731383,"height":0.018355945},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"bounds":{"left":0.72174203,"top":0.12210695,"width":0.006981383,"height":0.018355945},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"SELECT * FROM team_features where team_id = 1;\n\nSELECT * FROM teams WHERE name LIKE '%Vixio%'; # 340,270,11922\nSELECT * FROM users WHERE team_id = 340; # 12015\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 340\nand sa.provider = 'salesforce';\n# and sa.provider = 'salesloft';\n\nselect * from crm_fields where crm_configuration_id = 270 and object_type = 'event';\n# 125558 - Event Type - Event_Type__c\n# 125552 - Event Status - Event_Status__c\n\nSELECT * FROM sidekick_settings WHERE team_id = 340;\n\nSELECT * FROM crm_field_values WHERE crm_field_id in (125552);\n\nselect * from activities where crm_configuration_id = 270\nand type = 'conference' and crm_provider_id IS NOT NULL\nand actual_start_time > '2024-09-16 09:00:00' order by scheduled_start_time;\n\nSELECT * FROM activities WHERE id = 20871677;\nSELECT * FROM crm_field_data WHERE activity_id = 20871677;\n\nselect * from crm_layouts where crm_configuration_id = 270;\nselect * from crm_layout_entities where crm_layout_id in (886,887);\n\nSELECT * FROM crm_configurations WHERE id = 270;\n\nselect * from playbooks where team_id = 340; # 1514\nselect * from groups where team_id = 340;\nSELECT * FROM crm_fields WHERE id IN (125393, 125401);\n\nselect g.name as 'team name', p.name as 'playbook name', f.label as 'activity type field' from groups g\njoin playbooks p on g.playbook_id = p.id\njoin crm_fields f on p.activity_field_id = f.id\nwhere g.team_id = 340;\n\nSELECT * FROM activities WHERE uuid_to_bin('0c180357-67d2-419e-a8c3-b832a3490770') = uuid; # 20448716\nselect * from crm_field_data where object_id = 20448716;\n\nselect * from activities where crm_configuration_id = 270 and provider = 'salesloft' order by id desc;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%CybSafe%'; # 343,273,12008\nselect * from opportunities where team_id = 343;\nselect * from opportunities where team_id = 343 and crm_provider_id = '18099102526';\nselect * from opportunities where team_id = 343 and account_id = 945217482;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 343\nand sa.provider = 'hubspot';\n\nselect * from accounts where team_id = 343 order by name asc;\n\nselect * from stages where crm_configuration_id = 273 and type = 'opportunity';\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Voyado%'; # 353,283,12143\nSELECT * FROM activities WHERE crm_configuration_id = 283 and account_id = 3777844 order by id desc;\nSELECT * FROM accounts WHERE team_id = 353 AND name LIKE '%Salesloft%';\nSELECT * FROM activities WHERE id = 20717903;\n\nselect * from participants where activity_id IN (20929172,20928605,20928468,20926272,20926271,20926270,20926269,20916499,20916454,20916436,20916435,20900015,20900014,20900013,20897312,20897243,20897241,20897237,20897232,20897229,20893648,20893231,20893230,20893229,20893228,20889784,20885039,20885038,20885037,20885036,20885035,20882728,20882708,20882703,20882702,20869828,20869811,20869806,20869801,20869799,20869798,20869796,20869795,20869794,20869761,20869760,20869759,20868688,20868687,20850340,20847195,20841710,20833967,20827021,20825307,20825305,20825297,20824615,20824400,20823927,20821760,20795588,20794233,20794057,20793710,20785811,20781789,20781394,20781307,20762651,20758453,20758282,20757323,20756643,20756636,20756629,20756627,20756606,20756605,20756604,20756603,20756602,20756600,20756599,20756598,20756595,20756594,20756589,20756587,20756577,20756573,20748918,20748386,20748385,20748384,20748383,20748382,20748381,20748380,20748379,20748377,20748375,20748373,20743301,20717905,20717904,20717903,20717901,20717899);\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 353\nand sa.provider = 'salesforce';\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%modern world business solutions%'; # 345,275,12016, l.atkinson@mwbsolutions.co.uk\nSELECT * FROM activities WHERE uuid_to_bin('3921d399-3fef-4609-a291-b0097a166d43') = uuid;\n# id: 20940638, user: 12022, contact: 5305871\nSELECT * FROM activity_summary_logs WHERE activity_id = 20940638;\nselect * from contacts where team_id = 345 and crm_provider_id = '30891432415' order by name asc; # 5305871\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 345\nand sa.provider = 'hubspot';\n\nselect * from users where team_id = 345 and id = 12022;\nSELECT * FROM crm_profiles WHERE user_id = 12022;\nSELECT * FROM participants WHERE activity_id = 20940638;\nSELECT * FROM users u\nJOIN crm_profiles cp ON u.id = cp.user_id\nWHERE u.team_id = 345;\n\nselect * from contacts where team_id = 345 and crm_provider_id = '30880813535' order by name desc; # 5305871\n\nselect * from team_features where team_id = 345;\nSELECT * FROM activities WHERE uuid_to_bin('11701e2d-2f82-4dab-a616-1db4fad238df') = uuid; # 21115197\nSELECT * FROM participants WHERE activity_id = 20897406;\n\n\n\nSELECT * FROM activities WHERE uuid_to_bin('63ba55cd-1abc-447d-83da-0137000005b7') = uuid; # 20953912\nSELECT * FROM activities WHERE crm_configuration_id = 275 and provider = 'ringcentral' and title like '%1252629100%';\n\n\nSELECT * FROM activities WHERE id = 20946641;\nSELECT * FROM crm_profiles WHERE user_id = 10211;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Lunio%'; # 120,97,10984, triger@lunio.ai\nSELECT * FROM opportunities WHERE crm_configuration_id = 97 and crm_provider_id = '006N1000006c5PpIAI';\nselect * from stages where crm_configuration_id = 97 and type = 'opportunity';\nselect * from opportunities where team_id = 120;\n\n\nselect * from crm_configurations crm join teams t on crm.id = t.crm_id\nwhere 1=1\nAND t.current_billing_plan IS NOT NULL\nAND crm.auto_sync_activity = 0\nand crm.provider = 'hubspot';\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Exclaimer%'; # 270,205,10053,james.lewendon@exclaimer.com\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 270\nand sa.provider = 'salesforce';\nSELECT * FROM activities WHERE uuid_to_bin('b54df794-2a9a-4957-8d80-09a600ead5f8') = uuid; # 21637956\nSELECT * FROM crm_profiles WHERE user_id = 11446;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Cygnetise%'; # 372,300,12554, alex.chikly@cygnetise.com\nselect * from playbooks where team_id = 372;\nselect * from crm_fields where crm_configuration_id = 300 and object_type = 'event'; # 141340\nSELECT * FROM crm_field_values WHERE crm_field_id = 141340;\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 372\nand sa.provider = 'salesforce';\n\nselect * from crm_profiles where crm_configuration_id = 300;\nSELECT * FROM crm_configurations WHERE team_id = 372;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Planday%'; # 291,242,11501,mfa@planday.com\nSELECT * FROM opportunities WHERE team_id = 291 and crm_provider_id = '006bG000005DO86QAG'; # 3207756\nselect * from crm_field_data where object_id = 3207756;\nSELECT * FROM crm_fields WHERE id = 111834;\n\nselect f.id, f.crm_provider_id AS field_name, f.label, fd.object_id AS dealId, fd.value\nFROM crm_fields f\nJOIN crm_field_data fd ON f.id = fd.crm_field_id\nWHERE f.crm_configuration_id = 242\nAND f.object_type = 'opportunity'\nAND fd.object_id IN (3207756)\nORDER BY fd.object_id, fd.updated_at;\n\nSELECT * FROM crm_configurations WHERE auto_connect = 1;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Tour%'; # 187,209,8150,salesforce-admin@tourlane.com\nselect * from group_deal_risk_types drgt join groups g on drgt.group_id = g.id\nwhere g.team_id = 187;\n\nselect * from `groups` where team_id = 187;\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 187\nand sa.provider = 'salesforce';\n\n# Destination - 98870 - Destination__c\n# Stage - 79014 - StageName\n# Land Arrangement - 98856 - Land_Arrangement__c\n# Flight - 98848 - Flight__c\n# Last activity date - 98812 - LastActivityDate\n# Last modified date - 98809 - LastModifiedDate\n# Last inbound mail timestamp - 99151 - Last_Inbound_Mail_Timestamp__c\n# next call - 98864 - Next_Call__c\n\nselect * from crm_fields where crm_configuration_id = 209 and object_type = 'opportunity';\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 209;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 682;\n\nselect * from opportunities where team_id = 187 and name LIKE'%Muriel Sal%';\nselect * from opportunities where team_id = 187 and user_id = 9951 and is_closed = 0;\nselect * from activities where opportunity_id = 3538248;\n\nSELECT * FROM crm_profiles WHERE user_id = 8150;\n\nselect * from deal_risks where opportunity_id = 3538248;\n\nselect * from teams where crm_id IS NULL;\n\nSELECT opp.id AS opportunity_id,\n u.group_id AS group_id,\n MAX(\n CASE\n WHEN a.type IN (\"sms-inbound\", \"sms-outbound\") THEN a.created_at\n ELSE a.actual_end_time\n END) as last_date\nFROM opportunities opp\nleft join activities a on a.opportunity_id = opp.id\ninner join users u on opp.user_id = u.id\nwhere opp.user_id IN (9951)\n\nAND opp.is_closed = 0\nand a.status IN ('completed', 'received', 'delivered') OR a.status IS NULL\ngroup by opp.id;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Cybsafe%'; # 343,301,12008,polly.morphew@cybsafe.com\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 343\nand sa.provider = 'hubspot';\n\nSELECT * FROM crm_profiles WHERE crm_configuration_id = 301;\nSELECT * FROM contacts WHERE id = 6612363;\nSELECT * FROM accounts WHERE id = 4235676;\nSELECT * FROM opportunities WHERE crm_configuration_id = 301 and crm_provider_id = 32983784868;\nselect * from opportunity_stages where opportunity_id = 4503759;\n# SELECT * FROM opportunities WHERE id = 4569937;\n\nselect * from activities where crm_configuration_id = 301;\nSELECT * FROM activities WHERE uuid_to_bin('d3b2b28b-c3d0-4c2d-8ed0-eef42855278a') = uuid; # 26330370\nSELECT * FROM participants WHERE activity_id = 26330370;\n\nSELECT * FROM teams WHERE id = 375;\nselect * from playbooks where team_id = 375;\n\nselect * from stages where crm_configuration_id = 301 and type = 'opportunity';\n\nselect * from teams;\nselect * from contact_roles;\n\nSELECT * FROM opportunities WHERE team_id = 343 and user_id = 12871 and close_date >= '2024-11-01';\n\nselect * from users u join crm_profiles cp on cp.user_id = u.id where u.team_id = 343;\n\nSELECT * FROM crm_field_data WHERE object_id = 3771706;\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 343\nand sa.provider = 'hubspot';\n\nSELECT * FROM crm_fields WHERE crm_configuration_id = 301 and object_type = 'opportunity'\nand crm_provider_id LIKE \"%traffic_light%\";\nSELECT * FROM crm_field_values WHERE crm_field_id IN (144020,144048,144111,144113,144126,144481,144508,144531);\n\nSELECT fd.* FROM opportunities o\nJOIN crm_field_data fd ON o.id = fd.object_id\nWHERE o.team_id = 343\n# and o.user_id IS NOT NULL\nand fd.crm_field_id IN (144020,144048,144111,144113,144126,144481,144508,144531)\nand fd.value != ''\norder by value desc\n# group by o.id\n;\n\nSELECT * FROM opportunities WHERE id = 3769843;\n\nSELECT * FROM teams WHERE name LIKE '%Tour%'; # 187,209,8150, salesforce-admin@tourlane.com\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 209;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 682;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Funding Circle%'; # 220,177,8603,aswini.mishra@fundingcircle.com\nSELECT * FROM activities WHERE uuid_to_bin('7a40e99b-3b37-4bb1-b983-325b81801c01') = uuid; # 23139839\n\n\nSELECT * FROM opportunities WHERE id = 3855992;\n\nSELECT * FROM users WHERE name LIKE '%Angus Pollard%'; # 8988\n\nSELECT * FROM teams WHERE name LIKE '%Story Terrace%'; # 379, 307, 12894\nSELECT * FROM crm_fields WHERE crm_configuration_id = 307 and object_type != 'opportunity';\n\nselect * from contacts where team_id = 379 and name like '%bebro%'; # 5874411, crm: 77229348507\nSELECT * FROM crm_field_data WHERE object_id = 5874411;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 379\nand sa.provider = 'hubspot';\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%mentio%'; # 117, 94, 6371, nikhil.kumar@mention-me.com\nSELECT * FROM activities WHERE uuid_to_bin('82939311-1af0-4506-8546-21e8d1fdf2c1') = uuid;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Tourlane%'; # 187, 209, 8150, salesforce-admin@tourlane.com\nSELECT * FROM opportunities WHERE team_id = 187 and crm_provider_id = '006Se000008xfvNIAQ'; # 3537793\nselect * from generic_ai_prompts where subject_id = 3537793;\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Lunio%'; # 120, 97, 10984, triger@lunio.ai\nSELECT * FROM crm_configurations WHERE id = 97;\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 97;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 355;\nSELECT * FROM crm_fields WHERE id = 32682;\n\nselect cfd.value, o.* from opportunities o\njoin crm_field_data cfd on o.id = cfd.object_id and cfd.crm_field_id = 32682\nwhere team_id = 120\nand cfd.value != ''\n;\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 120\nand sa.provider = 'salesforce';\n\nselect * from opportunities where team_id = 120 and crm_provider_id = '006N1000007X8MAIA0';\nSELECT * FROM crm_field_data WHERE object_id = 2313439;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE id = 410;\nSELECT * FROM teams WHERE name LIKE '%Local Business Oxford%';\nselect * from scorecards where team_id = 410;\nselect * from scorecard_rules;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Funding%'; # 220, 177, 8603, aswini.mishra@fundingcircle.com\nselect * from activities a\njoin opportunities o on a.opportunity_id = o.id\njoin users u on o.user_id = u.id\nwhere a.crm_configuration_id = 177 and a.type LIKE '%email-out%'\n# and a.actual_end_time > '2024-12-16 00:00:00'\n# and o.remotely_created_at > '2024-12-01 00:00:00'\n# and u.group_id = 1014\nand u.id = 9021\norder by a.id desc;\nSELECT * FROM opportunities WHERE id in (3981384,4017346);\nSELECT * FROM users WHERE team_id = 220 and id IN (8775, 11435);\n\nselect * from users where id = 9021;\nselect * from inboxes where user_id = 9021;\n\nselect * from inbox_emails where inbox_id = 1349 and email_date > '2024-12-18 00:00:00';\n\nselect * from email_messages where team_id = 220\nand orig_date > '2024-12-16 00:00:00' and orig_date < '2024-12-19 00:00:00'\nand subject LIKE '%Personal%'\n# and 'from' = 'credit@fundingcircle.com'\n;\n\nselect * from activities a\njoin opportunities o on a.opportunity_id = o.id\nwhere a.user_id = 9021 and a.type LIKE '%email-out%'\nand a.actual_end_time > '2024-12-18 00:00:00'\nand o.user_id IS NOT NULL\nand o.remotely_created_at > '2024-12-01 00:00:00'\norder by a.id desc;\n\nSELECT * FROM opportunities WHERE team_id = 220 and name LIKE '%Right Car move Limited%' and id = 3966852;\nselect * from activities where crm_configuration_id = 177 and type LIKE '%email%' and opportunity_id = 3966852 order by id desc;\n\nselect * from team_settings where name IN ('useCloseDate');\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Hurree%'; # 104, 81, 6175, jfarrell@hurree.co\nSELECT * FROM opportunities WHERE team_id = 104 and name = 'PropOp';\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 104\nand sa.provider = 'hubspot';\n\nselect * from crm_configurations where last_synced_at > '2025-01-19 01:00:00'\nselect * from teams where crm_id IS NULL;\n\nselect t.name as 'team', u.name as 'owner', u.email, u.phone\nfrom teams t\njoin activity_providers ap on t.id = ap.team_id\njoin users u on t.owner_id = u.id\nwhere 1=1\n and t.status = 'active'\n and ap.is_enabled = 1\n# and u.status = 1\n and ap.provider = 'ms-teams';\n\nselect * from crm_configurations where provider = 'bullhorn'; # 344\nSELECT * FROM teams WHERE id = 442; # 14293\nselect * from users where team_id = 442;\nselect * from social_accounts sa where sa.sociable_id = 14293;\nselect * from invitations where team_id = 442;\n\n# ********************************************************************************************************\nSELECT * FROM users WHERE email LIKE '%nea.liikamaa@eletive.com%'; # 14022\nSELECT * FROM teams WHERE id = 429;\nselect * from opportunities where team_id = 429 and crm_provider_id IN (16157415775, 22246219645);\nselect * from activities where opportunity_id in (4340436,4353519);\n\nselect * from transcription where activity_id IN (25630961,25381771);\nselect * from generic_ai_prompts where subject_id IN (4353519);\n\nSELECT\n a.id as activity_id,\n a.opportunity_id,\n a.type as activity_type,\n a.language,\n CONCAT(a.title, a.description) AS mail_content,\n e.from AS mail_from,\n e.to AS mail_to,\n e.subject AS mail_subject,\n e.body AS mail_body,\n p.type as prompt_type,\n p.status as prompt_status,\n p.content AS prompt_content,\n a.actual_start_time as created_at\nFROM activities a\n LEFT JOIN ai_prompts p ON a.transcription_id = p.transcription_id AND p.deleted_at IS NULL\n LEFT JOIN email_messages e ON a.id = e.activity_id\nWHERE a.actual_start_time > '2024-01-01 00:00:00'\n AND a.opportunity_id IN (4353519)\n AND a.status IN ('completed', 'received', 'delivered')\n AND a.deleted_at IS NULL\n AND a.type NOT IN ('sms-inbound', 'sms-outbound')\nORDER BY a.opportunity_id ASC, a.id ASC;\n\nSELECT * FROM users WHERE name LIKE '%George Fierstone%'; # 14293\nSELECT * FROM teams WHERE id = 442;\nSELECT * FROM crm_configurations WHERE id = 344;\nselect * from team_features where team_id = 442;\nselect * from groups where team_id = 442;\nselect * from playbooks where team_id = 442;\nselect * from playbook_categories where playbook_id = 1729;\nselect * from crm_fields where crm_configuration_id = 344 and id = 172024;\nSELECT * FROM crm_field_values WHERE crm_field_id = 172024;\nselect * from crm_layouts where crm_configuration_id = 344;\nselect * from playbook_layouts where playbook_id = 1729;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Learning%'; # 260, 221, 9444\n\nselect s.*\n# , s.sent_at, u.name, a.*\nfrom activity_summary_logs s\ninner join activities a on a.id = s.activity_id\ninner join users u on u.id = a.user_id\nwhere a.crm_configuration_id = 356\nand s.sent_at > date_sub(now(), interval 60 day)\norder by a.actual_end_time desc;\n\nselect * from activities a\n# inner join activity_summary_logs s on s.activity_id = a.id\nwhere a.crm_configuration_id = 356 and a.actual_end_time > date_sub(now(), interval 60 day)\n# and a.crm_provider_id is not null\n# and provider <> 'ringcentral'\nand status = 'completed'\norder by a.actual_end_time desc;\n\nselect * from teams order by id desc; # 17328, 32, 17830, integration-account@jiminny.com\nSELECT * FROM users;\nSELECT * FROM users where team_id = 260 and status = 1; # 201 - 150 active\nSELECT * FROM teams WHERE id = 260;\nselect * from team_settings where team_id = 260;\nselect * from crm_configurations where team_id = 260;\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 356;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1184;\n\nselect * from accounts where crm_configuration_id = 221 order by id desc; # 7000\nselect * from leads where crm_configuration_id = 221 order by id desc; # 0\nselect * from contacts where crm_configuration_id = 221 order by id desc; # 200 000\nselect * from opportunities where crm_configuration_id = 221 order by id desc; # 0\nselect * from crm_profiles where crm_configuration_id = 221 order by id desc; # 23\nselect * from crm_fields where crm_configuration_id = 221;\nselect * from crm_field_values where crm_field_id = 5302 order by id desc;\nselect * from crm_layouts where crm_configuration_id = 221 order by id desc;\nselect * from stages where crm_configuration_id = 221 order by id desc;\n\nselect * from accounts where crm_configuration_id = 356 order by id desc; # 7000\nselect * from leads where crm_configuration_id = 356 order by id desc; # 0\nselect * from contacts where crm_configuration_id = 356 order by id desc; # 200 000\nselect * from opportunities where crm_configuration_id = 356 order by id desc; # 0\nselect * from crm_profiles where crm_configuration_id = 356 order by id desc; # 23\nselect * from crm_fields where crm_configuration_id = 356;\nselect * from crm_field_values where crm_field_id = 5302 order by id desc;\nselect * from crm_layouts where crm_configuration_id = 356 order by id desc;\nselect * from stages where crm_configuration_id = 356 order by id desc;\n\nselect * from playbooks where team_id = 260 order by id desc; # 4 (2 deleted)\nselect * from groups where team_id = 260 order by id desc; # 27 groups, (2 deleted)\nselect * from playbook_layouts where playbook_id IN (1410,1409,1276,1254); # 4\nselect ce.* from calendars c\njoin users u on c.user_id = u.id\njoin calendar_events ce on c.id = ce.calendar_id\nwhere u.team_id = 260\nand (ce.start_time > '2025-02-21 00:00:00')\n;\n# calendar events 1207\n#\n\nselect * from opportunities where team_id = 260;\nSELECT * FROM crm_field_data WHERE object_id = 4696496;\n\nselect * from activities where crm_configuration_id = 356 and crm_provider_id IS NOT NULL;\nselect * from activities where crm_configuration_id IN (221) and provider NOT IN ('ms-teams', 'uploader', 'zoom-bot')\n# and type = 'conference' and status = 'scheduled' and activities.is_internal = 0\nand created_at > '2024-03-01 00:00:00'\norder by id desc; # 880 000, ringcentral, avaya\nSELECT * FROM participants WHERE activity_id = 26371744;\n\n# all activities 942 000 +\n# conference 7385 - scheduled 984 - external 343\n\nselect * from activities where id = 26321812;\nselect * from participants where activity_id = 26321812;\nselect * from participants where activity_id in (26414510,26414514,26414516,26414604,26414653,26414655);\nselect * from leads where id in (720428,689175,731546,645866,621037);\n\nselect * from users where id = 13841;\nselect * from opportunities where user_id = 9541;\nselect * from stages where id = 15900;\n\nselect * from accounts where\n# id IN (4160055,5053725,4965303,4896434)\nid in (4584518,3249934,3218025,3891133,3399450,4172999,4485161,3101785,4587203,3070816,2870343,2870341,3563940,4550846,3424464,3249963,2870342)\n;\n\nselect * from activities where id = 26654935;\nSELECT * FROM opportunities WHERE id = 4803458;\n\nSELECT * FROM opportunities where team_id = 260 and user_id = 13841 AND stage_id = 15900;\nSELECT id, uuid, provider, type, lead_id, account_id, contact_id, opportunity_id, stage_id, status, recording_state, title, actual_start_time, actual_end_time\nFROM activities WHERE user_id = 13841 AND opportunity_id IN (4729783, 4731717, 4731726, 4732064, 4732849, 4803458, 4813213);\n\nSELECT DISTINCT\n o.id, o.stage_id, s.name, a.title,\n a.*\nFROM activities a\n# INNER JOIN tracks t ON a.id = t.activity_id\nINNER JOIN users u ON a.user_id = u.id\nINNER JOIN teams team ON u.team_id = team.id\nINNER JOIN groups g ON u.group_id = g.id\nINNER JOIN opportunities o ON a.opportunity_id = o.id\nINNER JOIN stages s ON o.stage_id = s.id\nWHERE\n a.crm_configuration_id = 356\n AND a.status IN ('completed', 'failed')\n AND a.recording_state != 'stopped'\n# and a.user_id = 13841\n AND u.uuid = uuid_to_bin('6f40e4b8-c340-4059-b4ac-1728e87ea99e')\n AND team.uuid = uuid_to_bin('a607fba7-452e-4683-b2af-00d6cb52c93c')\n AND g.uuid = uuid_to_bin('b5d69e40-24a0-4c16-810b-5fa462299f94')\n\n AND a.type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')\n# AND t.type IN ('audio', 'video')\n AND (\n (a.actual_start_time BETWEEN '2025-03-13 00:00:00' AND '2025-03-18 07:59:59')\n OR\n (\n a.actual_start_time IS NULL\n AND a.type IN ('sms-outbound', 'sms-inbound')\n AND a.created_at BETWEEN '2025-03-13 00:00:00' AND '2025-03-18 07:59:59'\n )\n )\n AND (\n a.is_private = 0\n OR (\n a.is_private = 1\n AND u.uuid = uuid_to_bin('6f40e4b8-c340-4059-b4ac-1728e87ea99e')\n )\n )\n AND (\n# s.id = 15900\n s.uuid = uuid_to_bin('04ca1c26-c666-4268-a129-419c0acffd73')\n OR s.uuid IS NULL -- Include records without opportunity stage\n )\n\nORDER BY a.actual_end_time DESC;\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Lead Forensics%'; # 190, 162, 8474, willsc@leadforensics.com\nSELECT * FROM users WHERE team_id = 190;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 190\nand sa.provider = 'hubspot';\n\nselect * from role_user where user_id = 8474;\n\nselect * from crm_configurations where provider = 'bullhorn';\n\nSELECT * FROM opportunities WHERE uuid_to_bin('94578249-65ec-4205-90f2-7d1a7d5ab64a') = uuid;\nSELECT * FROM users WHERE uuid_to_bin('26dbadeb-926f-4150-b11b-771b9d4c2f9a') = uuid;\n\nSELECT * FROM opportunities WHERE id = 4732493;\nselect * from activities where opportunity_id = 4732493;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE id = 443; # 358, 14315, andrea.romano@correrenaturale.com\nSELECT * FROM opportunities WHERE team_id = 443;\n\nSELECT a.id, a.type, a.user_id, a.status, a.deleted_at, u.name, u.email, u.team_id as activity_team_id, u.status, u.deleted_at, t.name, t.status, s.team_id as stage_team_id\nFROM activities AS a\nJOIN stages AS s ON a.stage_id = s.id\nJOIN users AS u ON u.id = a.user_id\nJOIN teams AS t ON t.id = s.team_id\nWHERE u.team_id <> s.team_id and t.id > 135;\n\n\nSELECT\n crm_configuration_id,\n crm_provider_id,\n COUNT(*) as duplicate_count,\n GROUP_CONCAT(id) as stage_ids,\n GROUP_CONCAT(name) as stage_names\nFROM stages\nGROUP BY crm_configuration_id, crm_provider_id\nHAVING COUNT(*) > 1\nORDER BY duplicate_count DESC;\n\nselect * from stages where id IN (14898,14907);\n\nselect * from business_processes;\n\nSELECT *\nFROM crm_configurations\nWHERE team_id IN (\n SELECT team_id\n FROM crm_configurations\n GROUP BY team_id\n HAVING COUNT(*) > 1\n)\nORDER BY team_id;\n\nSELECT *\nFROM teams\nWHERE crm_id IN (\n SELECT crm_id\n FROM teams\n GROUP BY crm_id\n HAVING COUNT(*) > 1\n)\nORDER BY crm_id;\n\n# ***************************************************************************\nselect * from crm_configurations where provider = 'integration-app';\nSELECT * FROM teams WHERE id = 443; # Correre Naturale 358 14315 andrea.romano@correrenaturale.com\nselect * from activities where crm_configuration_id = 358 order by actual_end_time desc;\nselect id, uuid, actual_end_time, crm_provider_id, is_internal, playbook_category_id, type, user_id, lead_id, contact_id, account_id, opportunity_id, status, title from activities where crm_configuration_id = 358 order by actual_end_time desc;\nselect * from team_features where team_id = 358;\nselect * from activity_summary_logs;\n\nselect * from teams where id = 406;\n\n# ************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Sportfive%'; # 267, 202, 14637, srv.salesforce@sportfive.com\nselect * from activities where crm_configuration_id = 202 order by actual_end_time desc;\n\nSELECT * FROM users where id = 14637;\nSELECT * FROM teams where id = 267;\nSELECT * FROM groups where id = 1118;\n\nselect g.name, a.title, uuid_from_bin(a.uuid), a.external_id, a.status, a.recording_state, a.recording_reason_code, a.scheduled_start_time, a.scheduled_end_time, a.actual_start_time, a.actual_end_time from activities a\ninner join users u on u.id = a.user_id\ninner join groups g on g.id = u.group_id\nwhere a.crm_configuration_id = 202\nand a.is_internal = 0\nand (a.scheduled_start_time between '2025-03-19 00:00:00' and '2025-03-21 00:00:00')\nand a.type = 'conference'\nand a.status != 'completed'\nand a.external_id is not null\norder by a.scheduled_start_time desc;\n\nSELECT * FROM activities\nWHERE crm_configuration_id = 202\n AND status IN ('completed', 'failed')\n AND recording_state != 'stopped'\n AND type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')\n AND (is_private = 0 OR user_id = 14637)\n AND (\n (\n actual_start_time BETWEEN '2025-03-12 12:00:00' AND '2025-03-24 11:59:59'\n ) OR (\n actual_start_time IS NULL\n AND type IN ('sms-outbound', 'sms-inbound')\n AND created_at BETWEEN '2025-03-12 12:00:00' AND '2025-03-24 11:59:59'\n )\n )\n AND NOT EXISTS (\n SELECT 1\n FROM tracks\n WHERE\n tracks.activity_id = activities.id\n AND tracks.type IN ('audio', 'video')\n )\nORDER BY actual_end_time DESC;\n\nSELECT DISTINCT\n a.*\nFROM activities a\nINNER JOIN tracks t ON a.id = t.activity_id\nINNER JOIN users u ON a.user_id = u.id\nINNER JOIN teams team ON u.team_id = team.id\nWHERE\n a.crm_configuration_id = 202\n AND a.status IN ('completed', 'failed')\n AND a.recording_state != 'stopped'\n# and a.user_id = 14637\n AND a.type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')\n# AND t.type IN ('audio', 'video')\n AND (\n (a.actual_start_time BETWEEN '2025-03-12 12:00:00' AND '2025-03-24 11:59:59')\n OR\n (\n a.actual_start_time IS NULL\n AND a.type IN ('sms-outbound', 'sms-inbound')\n AND a.created_at BETWEEN '2025-03-12 12:00:00' AND '2025-03-24 11:59:59'\n )\n )\n AND (\n a.is_private = 0\n OR (\n a.is_private = 1\n AND a.user_id = 14637\n )\n )\n\nORDER BY a.actual_end_time DESC\n;\n\nSELECT DISTINCT a.*\nFROM activities a\nINNER JOIN users u ON a.user_id = u.id\nINNER JOIN teams t ON u.team_id = t.id\n# INNER JOIN tracks tr ON a.id = tr.activity_id\n# INNER JOIN groups g ON u.group_id = g.id\nWHERE 1=1\n AND t.id = 267\n# AND t.uuid = uuid_to_bin('aed4927b-f1ea-499e-94c3-83762fd233e8')\n AND a.status IN ('completed', 'failed')\n AND a.recording_state != 'stopped'\n AND a.type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')\n# AND tr.type NOT IN ('audio', 'video')\n AND (\n a.is_private = 0\n OR a.user_id = 14637\n )\n AND (\n (a.actual_start_time BETWEEN '2025-03-19 00:00:00' AND '2025-03-21 23:59:59')\n OR (\n a.actual_start_time IS NULL\n AND a.type IN ('sms-outbound', 'sms-inbound')\n AND a.created_at BETWEEN '2025-03-19 00:00:00' AND '2025-03-21 23:59:59'\n )\n )\n# and NOT EXISTS (\n# SELECT 1\n# FROM tracks t\n# WHERE t.activity_id = a.id\n# AND t.type IN ('audio', 'video')\n# )\n\nORDER BY a.actual_end_time DESC;\n\nSELECT * FROM tracks WHERE activity_id = 26485995;\n\nselect a.is_private, a.title, uuid_from_bin(a.uuid), a.external_id, a.status, a.recording_state, a.recording_reason_code, a.scheduled_start_time, a.scheduled_end_time, a.actual_start_time, a.actual_end_time from activities a\ninner join users u on u.id = a.user_id\nwhere a.crm_configuration_id = 202\n# and a.is_internal = 0\nand (a.actual_start_time between '2025-03-19 00:00:00' and '2025-03-21 00:00:00')\nand a.type IN (\"softphone\",\"softphone-inbound\",\"conference\",\"sms-inbound\")\nand a.status IN ('completed', 'failed')\n# and a.external_id is not null\norder by a.actual_end_time desc;\n\nselect * from activities a where a.crm_configuration_id = 202\nand a.actual_start_time between '2025-03-20 00:00:00' and '2025-03-21 00:00:00'\n# AND a.type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')\n\nselect g.name, a.title, uuid_from_bin(a.uuid), a.external_id, a.status, a.recording_state, a.recording_reason_code, a.scheduled_start_time, a.scheduled_end_time, a.actual_start_time, a.actual_end_time from activities a\ninner join users u on u.id = a.user_id\ninner join groups g on g.id = u.group_id\nwhere a.crm_configuration_id = 202\nand a.is_internal = 0\nand (a.scheduled_start_time between '2025-03-19 00:00:00' and '2025-03-21 00:00:00')\nand a.type = 'conference'\nand a.status != 'completed'\nand a.external_id is not null\norder by a.scheduled_start_time desc;\n\nSELECT * FROM teams WHERE name LIKE '%Tourlane%';\nSELECT * FROM crm_fields WHERE crm_configuration_id = 209 and object_type = 'opportunity';\nSELECT * FROM crm_field_data WHERE crm_field_id = 98809;\n\nselect * from users where status = 1 AND timezone = 'MDT';\n\nselect * from opportunities where id = 3769814;\nselect * from deal_risks where opportunity_id = 3769814;\n\nselect cp.* from crm_profiles cp\njoin users u on cp.user_id = u.id\njoin crm_configurations crm on cp.crm_configuration_id = crm.id\nwhere crm.provider = 'hubspot' AND u.status = 1 AND log_notes != 'none';\n\nselect * from crm_fields where id = 154575;\n\nselect * from team_features where feature = 'SUPPORTS_SYNC_MISSING_CALL_DISPOSITIONS';\nSELECT * FROM teams WHERE id = 176; # crm 148\nselect * from activities where crm_configuration_id = 148 and provider = 'hubspot' order by id desc;\n\nselect * from activity_providers where provider = 'amazon-connect';\n\nselect * from crm_fields cf\njoin crm_configurations crm on crm.id = cf.crm_configuration_id\nwhere crm.provider = 'hubspot' and cf.object_type IN ('account', 'contact');\n\n# *********************************************************************************************\nSELECT * FROM users WHERE id IN (15415, 15418);\nSELECT * FROM groups WHERE id IN (1805,1806);\nSELECT * FROM playbooks WHERE id = 1860;\nSELECT * FROM playbook_categories WHERE id = 38634;\nSELECT * FROM crm_fields WHERE id = 189962;\n\nSELECT * FROM teams WHERE name = 'Pulsar Group'; # 472, 380, 15138 raza.gilani@vuelio.com\n\nSELECT * FROM crm_profiles WHERE user_id = 15415;\nSELECT * FROM social_accounts WHERE sociable_id = 15415 and provider = 'salesforce';\n\nselect * from sidekick_settings where team_id = 472;\n\nSELECT * FROM activities WHERE uuid_to_bin('452c58c7-b87c-4fdd-953e-d7af185e9588') = uuid; # 28617536, user: 15418\nSELECT * FROM activities WHERE uuid_to_bin('399114ee-d3a8-458c-bff5-5f654658db0a') = uuid; # 28344407, user: 15415\nSELECT * FROM activities WHERE uuid_to_bin('f0aa567f-0ab1-4bbb-96aa-37dcf184676b') = uuid; # 28580288, user: 15415\nSELECT * FROM activities WHERE uuid_to_bin('50c086b1-2770-4bca-b5ae-6bac22ec426b') = uuid; # 28566069, user: 15415\n\n# *********************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%TeamTailor%'; # 109, 218, 13969, salesforce-integrations@teamtailor.com\nselect * from crm_configurations where id = 218;\nSELECT * FROM activities WHERE uuid_to_bin('e39b5857-7fdb-4f5a-951a-8d3ca69bb1b0') = uuid; # 28338765\nSELECT * FROM users WHERE id IN (13232, 13230);\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 109\nand sa.provider = 'salesforce';\n\n0057R00000EPL5HQAX Inez Ekblad\n\n1091cb81-5ea1-4951-a0ed-f00b568f0140 Triman Kaur\n\nSELECT * FROM crm_profiles WHERE user_id IN (13232, 13230);\n\n############################################################################################\nSELECT * FROM activities WHERE uuid_to_bin('675eeaeb-5681-42db-90bc-54c07a604408') = uuid; # 28655939 00UVg00000FLvnSMAT\nSELECT * FROM crm_field_data WHERE activity_id = 28655939;\nSELECT * FROM crm_fields WHERE id IN (94491,94493,94498);\nSELECT * FROM users WHERE id = 13658;\nSELECT * FROM teams WHERE id = 109;\nSELECT * FROM crm_configurations WHERE id = 218;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 109\nand sa.provider = 'salesforce';\n\n# ********************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Strengthscope%'; # 481, 390, 15420, katy.holden@strengthscope.comk\nSELECT * FROM stages WHERE crm_configuration_id = 390;\nselect * from business_processes where team_id = 481 and crm_configuration_id = 390;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 481\nand sa.provider = 'salesforce';\n\n\nSELECT * FROM users WHERE id = 15780; # team 462\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 462\nand sa.provider = 'hubspot';\n\n\nselect * from teams where id = 495;\nSELECT * FROM users WHERE id = 15794;\nselect * from social_accounts where sociable_id = 15794;\n\n# ********************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Flight%'; # 427, 333, 13752\nSELECT * FROM accounts WHERE team_id = 427 and crm_provider_id = '668731000183444517';\n\n# ********************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Group GTI%'; # 495, 407, 15794\nSELECT * FROM activities WHERE crm_configuration_id = 407\nand status = 'completed' and type = 'conference'\norder by id desc;\n\nselect ru.*, pr.*, p.* from users u join role_user ru on ru.user_id = u.id\njoin permission_role pr on pr.role_id = ru.role_id\n join permissions p on p.id = pr.permission_id\nwhere team_id = 495 and p.name IN ('dial');\n\nselect * from permission_role;\n\nselect * from activities where crm_configuration_id = 407 and status = 'completed' order by id desc;\nSELECT * FROM activities WHERE id = 29512773;\nSELECT * FROM activities WHERE id IN (29042721,28991325,29002874);\n\nSELECT al.* from activity_summary_logs al join activities a on a.id = al.activity_id\nwhere a.crm_configuration_id = 407\n# and a.id IN (29042721,28991325,29002874);\n\nSELECT * FROM users WHERE id = 15794;\nSELECT * FROM users WHERE team_id = 495;\nSELECT * FROM social_accounts WHERE sociable_id = 15794;\nSELECT * FROM opportunities WHERE team_id = 495 and name like '%OC:%';\nSELECT * FROM contacts WHERE team_id = 495;\nSELECT * FROM leads WHERE team_id = 495;\nSELECT * FROM accounts WHERE team_id = 495;\nSELECT * FROM crm_profiles WHERE crm_configuration_id = 407;\nSELECT * FROM crm_fields WHERE crm_configuration_id = 407;\nSELECT * FROM crm_configurations WHERE id = 407;\nSELECT * FROM opportunities WHERE team_id = 495 and close_date BETWEEN '2025-06-01' AND '2025-07-01'\nand user_id IS NOT NULL and is_closed = 1 and is_won = 1;\n\n# ********************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Hamilton Court FX LLP%'; # 249, 187, 10103\nSELECT * FROM activities WHERE uuid_to_bin('4659c2bb-9a49-484e-9327-a3d66f1e028c') = uuid; # 28951064\nSELECT * FROM crm_fields WHERE crm_configuration_id = 187 and object_type IN ('tasks', 'event');\n\n# *********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Checkstep%'; # 325, 256, 11753\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 325\nand sa.provider = 'hubspot';\n\nSELECT * FROM activities WHERE uuid_to_bin('7be372e2-1916-4d79-a2f3-ca3db1346db3') = uuid; # 28611085\nSELECT * FROM activities WHERE uuid_to_bin('980f0336-840b-4185-a5a9-30cf8b0749a8') = uuid; # 28719733\nSELECT * FROM activity_summary_logs where activity_id = 28719733;\n\n# *************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Learning%'; # 260, 356, 9444\nSELECT * FROM activity_summary_logs where sent_at BETWEEN '2025-06-09 11:38:00' AND '2025-06-09 11:40:00';\nSELECT * FROM leads WHERE crm_configuration_id = 356 and crm_provider_id = '230045001502770504'; # 823630\nselect * from activities where crm_configuration_id = 356 and lead_id = 841732;\n\nSELECT * from activity_summary_logs al join activities a on a.id = al.activity_id\nwhere a.crm_configuration_id = 356;\n\nselect * from activities where crm_configuration_id = 356\nand actual_end_time between '2025-06-09 11:00:00' and '2025-06-09 12:00:00'\norder by id desc;\n\nselect * from accounts where crm_configuration_id = 356 and crm_provider_id = '230045001514403366' order by id desc;\nselect * from leads where crm_configuration_id = 356 and crm_provider_id = '230045001514275654' order by id desc;\nselect * from contacts where crm_configuration_id = 356 and crm_provider_id = '230045001514403366' order by id desc;\nselect * from opportunities where crm_configuration_id = 356 and crm_provider_id = '230045001514403366' order by id desc;\n\nselect * from team_features where team_id = 260;\nselect * from features where id IN (1,2,4,6,18,19,20,9,10,3,23,24,25,26,27);\n\nSELECT * FROM activities WHERE uuid_to_bin('7be372e2-1916-4d79-a2f3-ca3db1346db3') = uuid;\n\nselect * from crm_fields;\nselect * from crm_layout_entities;\n\nSELECT * FROM teams WHERE name LIKE '%Optable%';\n\n# *************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Teamtailor%'; # 109, 218, 13969\nSELECT * FROM crm_configurations WHERE id = 218;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 109\nand sa.provider = 'salesforce';\nSELECT * FROM activities WHERE uuid_to_bin('675eeaeb-5681-42db-90bc-54c07a604408') = uuid; # 28655939\nSELECT * FROM crm_field_data WHERE activity_id = 28655939;\nSELECT * FROM crm_fields WHERE id in (94491,94493,94498);\n\nselect * from teams where crm_id IS NULL;\n\nSELECT * FROM activities WHERE uuid_to_bin('71aa8a0c-9652-4ff6-bee7-d98ae60abef6') = uuid;\n\n# *************************************************************************************************\nselect * from team_domains where team_id = 399;\nSELECT * FROM teams WHERE name LIKE '%Rydoo%'; # 399, 318, 13207\n\nselect * from calendar_events where id = 5163781;\nSELECT * FROM activities WHERE uuid_to_bin('be2cbc52-7fda-46a0-9ae0-25d9553eafc0') = uuid; # 29443896\nSELECT * FROM participants WHERE activity_id = 29443896;\nselect * from contacts where crm_configuration_id = 318 and email = 'marianne.westeng@strawberry.no';\nselect * from leads where crm_configuration_id = 318 and email = 'marianne.westeng@strawberry.no';\n\nselect * from activities where user_id = 14937 order by created_at ;\n\nselect * from users where id = 14937;\n\nselect * from contacts where crm_configuration_id = 318 and email LIKE '%@strawberry.se';\nselect * from opportunities where crm_configuration_id = 318 and crm_provider_id = '006Sf00000D1WOAIA3';\n\nselect * from activities a join participants p on a.id = p.activity_id\nwhere crm_configuration_id = 318 and a.updated_at > '2025-06-23T08:18:43Z';\n\n# *************************************************************************************************\nSELECT * FROM opportunities WHERE team_id = 379 and crm_provider_id = '39334518886';\nSELECT * FROM opportunities WHERE team_id = 379 order by id desc;\nSELECT * FROM teams WHERE id = 379;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 379 and sociable_id = 13852\nand sa.provider = 'hubspot';\n\nSELECT * FROM crm_configurations WHERE id = 307;\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 307;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1027;\nSELECT * FROM crm_fields WHERE crm_configuration_id = 307\n and id IN (144750,144855,145158,155227);\n\nSELECT * FROM activities;\n\n\nselect * from activities\nwhere created_at > '2025-07-01 00:00:00'\n# and created_at < '2025-08-01 00:00:00'\nand type not in ('email-outbound', 'email-inbound')\nand account_id is null\nand contact_id is null\nand lead_id is null\nand opportunity_id is not null\n;\nSELECT * FROM activities WHERE id IN (25344155, 25344296, 25501909, 28692187);\nSELECT * FROM crm_configurations WHERE id in (335,301,200);\n\nselect * from crm_fields where crm_configuration_id = 230 and crm_provider_id = 'Age2__c';\n\nSELECT * FROM teams WHERE name LIKE '%Resights%';\nselect * from crm_fields where crm_configuration_id = 1 and object_type = 'opportunity';\n\nselect * from crm_configurations where provider = 'bullhorn'; # 344\nselect * from teams where id IN (442);\n\nselect * from activities\nwhere crm_configuration_id = 177\nand provider = 'amazon-connect'\n order by id desc;\n# and source <> 'gong';\n\nselect * from activity_providers where provider = 'amazon-connect';\n\nSELECT * FROM activities WHERE uuid_to_bin('cec1993b-a7e5-4164-b74d-d680ea51d2f2') = uuid;\n\n\nselect * from crm_configurations where store_transcript = 1;\nSELECT * FROM teams WHERE id IN (80);\n\n# *************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Sedna%'; # 277, 213, 12594\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 277\nand sa.provider = 'salesforce';\n\nselect * from activities where crm_configuration_id = 213 and account_id = 2511502;\n\nselect * from crm_configurations where id = 213;\n\nSELECT * FROM activities WHERE uuid_to_bin('35aa790a-8569-4544-8268-66f9a4a26804') = uuid; # 33981604\nSELECT * FROM participants WHERE activity_id = 33981604;\nSELECT * FROM crm_fields WHERE crm_configuration_id = 337 and object_type = 'task';\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 431\nand sa.provider = 'salesforce';\nSELECT * FROM activities WHERE uuid_to_bin('b5476c7d-19a8-491b-869d-676ea1e857b6') = uuid; # 33997223\nselect * from activity_summary_logs where activity_id = 33997223;\nselect * from activity_notes where activity_id = 33997223;\n\n# ***********************************\nSELECT * FROM teams WHERE name LIKE '%Abode%';\n\n\nselect * from features;\nselect * from teams t\nwhere t.status = 'active'\nand id NOT IN (select team_id from team_features where feature_id = 9)\n;\n\n\nselect * from playbook_layouts where playbook_id = 1725;\nSELECT * FROM activities WHERE uuid_to_bin('65cc283c-4849-49e6-927f-4c281c8fea19') = uuid; # 34297473\nselect * from teams where id = 318;\nselect * from crm_configurations where team_id = 318;\nselect * from playbooks where team_id = 318;\nSELECT * FROM crm_layouts where crm_configuration_id = 381;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1259;\nSELECT * FROM crm_fields WHERE id IN (192938,192936,192939);\n\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1266;\nSELECT * FROM crm_fields WHERE id IN (192980,192991,192997,192998,193064,193067);\n\nSELECT * FROM activities WHERE uuid_to_bin('a902289b-285c-48eb-9cc2-6ad6c5d938f5') = uuid; # 34297533\n\n\n\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 927;\nSELECT * FROM crm_fields WHERE id IN (131668,131669,131670,131671,131676,131797);\n\nSELECT * FROM teams WHERE name LIKE '%Peripass%'; # 351, 281, 12124\nselect * from crm_layouts where crm_configuration_id = 281;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 927;\nselect * from crm_fields where crm_configuration_id = 281 and id in (131668,131669,131670,131671,131676,131797);\nselect * from opportunities where crm_configuration_id = 281;\n\nSELECT * FROM activities WHERE id IN (34211315, 34130075);\nSELECT * FROM crm_field_data WHERE object_id IN (34211315, 34130075);\n\nselect cf.crm_configuration_id, cle.crm_layout_id, cle.id, cf.id from crm_field_data cfd\njoin crm_layout_entities cle on cle.id = cfd.crm_layout_entity_id\njoin crm_fields cf on cle.crm_field_id = cf.id\nwhere cf.deleted_at IS NOT NULL\nGROUP BY cle.id, cf.id;\n\nselect * from crm_layouts where id IN (355);\nselect u.email, t.crm_id, t.* from teams t\njoin users u on u.id = t.owner_id\nwhere crm_id IN (97);\n\nSELECT * FROM crm_fields WHERE id = 96492;\n\nselect * from permissions;\nselect * from permission_role where permission_id = 247;\nselect * from roles;\n\nselect * from migrations;\n# *****************************************************************\nSELECT * FROM activities WHERE uuid_to_bin('291e3c21-11cc-4728-aee7-6e4bedf86d72') = uuid; # 34262174\nSELECT * FROM crm_configurations WHERE id = 301;\nSELECT * FROM teams WHERE id = 343;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 343\nand sa.provider = 'hubspot';\n\nselect * from participants where activity_id = 34262174;\n\nselect * from contacts where crm_configuration_id = 301 and id = 6976326;\nselect * from accounts where crm_configuration_id = 301 and id IN (4647626, 4815829); # 30761335403\n\nselect * from activity_summary_logs where activity_id = 34262174;\n\nselect * from users where status = 1 AND timezone = 'EST';\n\n# ****************************************************************************\nSELECT * FROM users WHERE id = 13869;\nSELECT * FROM crm_configurations WHERE id = 320;\nSELECT * FROM teams WHERE id = 401;\n\nSELECT * FROM activities WHERE uuid_to_bin('2228c16f-10be-48d5-90d4-67385219dc01') = uuid; # 29670601\n\nSELECT * FROM accounts WHERE id = 7761483;\nSELECT * FROM opportunities WHERE id = 6051814;\n\nSELECT * FROM teams WHERE name LIKE '%Seedlegals%';\n\n;select * from opportunities where updated_at > '2025-10-11' AND crm_provider_id = '34713761166';\n\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 177;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 577;\nSELECT * FROM crm_fields WHERE id IN (68458,68459,68480,68497,68524,68530,68554,68618,68662,68781,68810,68898,68981,69049,97467);\n\nSELECT t.id, crm.id, t.name, crm.sync_objects, crm.provider, crm.last_synced_at FROM crm_configurations crm join teams t on t.crm_id = crm.id\nwhere t.status = 'active' AND crm.provider = 'hubspot' AND crm.last_synced_at < '2025-10-22 00:00:00';\n\nSELECT * FROM activities WHERE uuid_to_bin('fa09449f-cba9-496a-b8f3-865cd3c72351') = uuid;\nSELECT * FROM crm_configurations where id = 184;\nSELECT * FROM teams WHERE id = 246;\nSELECT * FROM social_accounts WHERE sociable_id = 9259 and provider = 'hubspot';\n\nSELECT * FROM users WHERE email LIKE '%rhian.old@bud.co.uk%'; # 17700\nSELECT * FROM teams WHERE id = 551;\n\nSELECT * FROM crm_configurations WHERE id = 471;\nSELECT * FROM activities WHERE crm_configuration_id = 471 and crm_provider_id IS NOT NULL;\nSELECT * FROM crm_fields WHERE crm_configuration_id = 471;\nSELECT * FROM crm_fields WHERE id = 307260;\nSELECT * FROM crm_field_values WHERE crm_field_id = 307260;\n\nselect * from crm_layouts where crm_configuration_id = 471;\n\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1547;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1548;\n\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 551 and sa.provider = 'hubspot';\n\nSELECT * FROM teams WHERE name LIKE '%$PCS%';\n\n# ********************************************************************************************************\nselect * from crm_configurations crm\njoin teams t on t.crm_id = crm.id\nwhere t.status = 'active'\nand crm.provider = 'hubspot';\n\n# $slug = 'HUBSPOT_WEBHOOK_SYNC';\n# $team = Jiminny\\Models\\Team::find(2);\n# $feature = Feature::query()->where('slug', $slug)->first();\n# TeamFeature::query()->create(['feature_id' => $feature->getId(),'team_id' => $team->getId()]);\n\n# hubspot_webhook_metrics\n\nselect * from crm_configurations where id = 331; # 416\nSELECT * FROM teams WHERE id = 416;\nSELECT * FROM opportunities WHERE team_id = 190;\n\nSELECT * FROM teams WHERE name LIKE '%Lead Forensics%';\nSELECT sa.id,\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 190 and sa.provider = 'hubspot';\n\n\n\nSELECT * FROM teams WHERE name LIKE '%Rapaport%'; # 431, 337\nSELECT * FROM teams where id = 431;\nSELECT * FROM crm_configurations where team_id = 431;\nSELECT * FROM activity_providers where team_id = 431;\nSELECT * FROM activities where crm_configuration_id = 337 and type IN ('softphone', 'softphone-outbound')\nand provider NOT IN ('hubspot', 'aircall')\n# and telephony_provider_id = '019c1131-a22f-4792-b9ea-20adf6a02ed0'\norder by id desc;\nSELECT sa.id,\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 431 and sa.provider = 'salesforce';\n\nSELECT * FROM teams WHERE name LIKE '%BiP%'; # 401, 320\nSELECT * FROM teams where id = 401;\nSELECT * FROM crm_configurations where team_id = 401;\nSELECT * FROM activity_providers where team_id = 401;\nSELECT * FROM activities where crm_configuration_id = 320 and type IN ('softphone', 'softphone-outbound')\nand provider NOT IN ('hubspot', 'aircall')\n# and telephony_provider_id = '019c1131-a22f-4792-b9ea-20adf6a02ed0'\norder by id desc;\nSELECT sa.id,\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 401 and sa.provider = 'salesforce';\n\n\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 307; # 379 - Story Terrace Inc , portalId: 3921157\nSELECT * FROM contacts WHERE team_id = 379 and updated_at > '2026-01-31 11:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 379 and updated_at > '2026-02-01 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 379 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 379 and sa.provider = 'hubspot';\n\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 485; # 563 - LATUS Group (ad94d501-5d09-44fd-878f-ca3a9f8865c3) , portalId: 3904501\nSELECT * FROM opportunities WHERE team_id = 563 and updated_at > '2026-02-02 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 563 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 338; # 432 - Formalize , portalId: 9214205\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 432 and sa.provider = 'hubspot';\nSELECT * FROM opportunities WHERE team_id = 432 and updated_at > '2026-02-02 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 432 and updated_at > '2026-02-10 00:00:00' order by updated_at desc;\n\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 436; # 519 - Moxso , portalId: 25531989\nSELECT * FROM opportunities WHERE team_id = 519 and updated_at > '2026-02-02 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 519 and updated_at > '2026-02-04 11:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 96; # 119 - Nourish Care , portalId: 26617984\nSELECT * FROM opportunities WHERE team_id = 119 and updated_at > '2026-02-02 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 119 and updated_at > '2026-02-04 11:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 331; # 416 - The National College , portalId: 7213852\nSELECT * FROM opportunities WHERE team_id = 416 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 416 and updated_at > '2026-02-04 11:00:00' order by updated_at desc;\n\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 308; # 380 - Foodles , portalId: 7723616\nSELECT * FROM opportunities WHERE team_id = 380 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 380 and updated_at > '2026-02-06 10:30:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 379; # 471 - imat-uve , portalId: 9177354\nSELECT * FROM opportunities WHERE team_id = 471 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 471 and updated_at > '2026-02-06 10:30:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 465; # 545 - Spotler , portalId: 144759271\nSELECT * FROM opportunities WHERE team_id = 545 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 545 and updated_at > '2026-02-06 10:30:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 455; # 537 - indevis , portalId: 25666868\nSELECT * FROM opportunities WHERE team_id = 537 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 537 and updated_at > '2026-02-06 10:30:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 200; # 265 - Jobadder , portalId: 6426676\nSELECT * FROM opportunities WHERE team_id = 265 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 265 and updated_at > '2026-02-06 10:30:00' order by updated_at desc;\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 335; # 429 - Eletive , portalId: 6110563\nSELECT * FROM opportunities WHERE team_id = 429 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 429 and updated_at > '2026-02-09 10:30:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 363; # 456 - Global Group , portalId: 8901981\nSELECT * FROM opportunities WHERE team_id = 456 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 456 and updated_at > '2026-02-09 10:30:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 297; # 369 - Unbiased , portalId: 9229005\nSELECT * FROM opportunities WHERE team_id = 369 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 369 and updated_at > '2026-02-09 10:30:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 353; # 449 - Fuuse , portalId: 25781745\nSELECT * FROM opportunities WHERE team_id = 449 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 449 and updated_at > '2026-02-09 10:30:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 487; # 566 - Nimbus , portalId: 39982590\nSELECT * FROM opportunities WHERE team_id = 566 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 566 and updated_at > '2026-02-09 10:30:00' order by updated_at desc;\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 487;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1630;\nselect * from crm_fields where crm_configuration_id = 487 and\n(uuid_to_bin('4c6b2971-64d4-45b8-b377-427be758b5a5') = uuid or uuid_to_bin('59e368d8-65a0-4b77-b611-db37c99fbe68') = uuid);\nSELECT * FROM crm_field_values WHERE crm_field_id = 375177;\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 420; # 506 - voiio , portalId: 145629154\nSELECT * FROM opportunities WHERE team_id = 506 and updated_at > '2026-02-10 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 506 and updated_at > '2026-02-10 15:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 479; # 558 - Momice , portalId: 535962\nSELECT * FROM opportunities WHERE team_id = 558 and updated_at > '2026-02-10 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 558 and updated_at > '2026-02-10 15:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 59; # 80 - Storyclash GmbH , portalId: 4268479\nSELECT * FROM opportunities WHERE team_id = 80 and updated_at > '2026-02-10 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 80 and updated_at > '2026-02-10 15:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 175; # 203 - Team iAM , portalId: 5534732\nSELECT * FROM opportunities WHERE team_id = 203 and updated_at > '2026-02-10 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 203 and updated_at > '2026-02-10 15:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 368; # 460 - OneTouch Health , portalId: 5534732183355\nSELECT * FROM opportunities WHERE team_id = 460 and updated_at > '2026-02-10 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 460 and updated_at > '2026-02-10 15:00:00' order by updated_at desc;\n\n\n\nselect * from users where id = 29643;\nSELECT * FROM crm_field_values WHERE crm_field_id = 375177;\n# ********************************************************************\nSELECT * FROM teams WHERE name LIKE '%Buynomics%'; # 462, 482, 14910\nSELECT * FROM activities WHERE crm_configuration_id = 482\nand type NOT IN ('email-inbound', 'email-outbound')\n# and description like '%The call focused on understanding Welch%'\norder by id desc;\n\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 462 and sa.provider = 'salesforce';\n\nselect * from contacts where crm_configuration_id = 482 and name = 'Cyndall Hill'; # 15504749\nselect * from contacts where id = 10891096; # 482\nSELECT * FROM activities WHERE crm_configuration_id = 482\nand type NOT IN ('email-inbound', 'email-outbound')\nand contact_id = 15504749\norder by id desc;\n\nselect * from activities where id = 36793003; # 96cc7bc1-8622-4d27-92f4-baf664fc1a56, 00UOf00000PDdOXMA1\nselect * from transcription where id = 7646782;\nselect * from ai_prompts where transcription_id = 7646782;\n\n# ********************************************************************\nSELECT * FROM activities WHERE uuid_to_bin('7a8471a3-847e-4822-802b-ddf426bbc252') = uuid; # 37370018\nSELECT * FROM activity_summary_logs WHERE activity_id = 37370018;\nSELECT * FROM teams WHERE id = 555;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 555 and sa.provider = 'hubspot';\n\n# ********************************************************************\nSELECT * FROM activities WHERE uuid_to_bin('7c17b8aa-09df-4f85-a0f7-51f47afd712d') = uuid; # 37395250\nSELECT * FROM activities WHERE uuid_to_bin('14d60388-260d-494b-aa0d-63fdb1c78026') = uuid; # 37395250\n\nSELECT a.* FROM activities a JOIN crm_configurations c on c.id = a.crm_configuration_id\nwhere a.type IN ('softphone', 'softphone-outbound') and c.provider = 'hubspot'\nand a.provider NOT IN ('hubspot')\n# and a.provider IN ('salesloft')\n# and c.id NOT IN (70)\n# and a.duration > 30\n# and actual_start_time > '2026-02-05 00:00:00'\norder by a.id desc;\n\nSELECT * FROM activities WHERE id = 37549787;\nSELECT * FROM crm_profiles WHERE user_id = 17613;\n\nSELECT * FROM crm_configurations WHERE id = 70;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 93 and sa.provider = 'hubspot';\n\nSELECT asf.activity_search_id, asf.id, asf.value\nFROM activity_search_filters asf\nWHERE asf.filter = 'group_id'\nAND asf.value IN (\n SELECT CONCAT(\n HEX(SUBSTR(uuid, 5, 4)), '-',\n HEX(SUBSTR(uuid, 3, 2)), '-',\n HEX(SUBSTR(uuid, 1, 2)), '-',\n HEX(SUBSTR(uuid, 9, 2)), '-',\n HEX(SUBSTR(uuid, 11))\n )\n FROM groups\n WHERE deleted_at IS NOT NULL\n);\n\nSELECT * FROM crm_configurations WHERE id = 373; # KPSBremen.de 465 # - no social account\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 465 and sa.provider = 'hubspot';\n\nselect * from crm_configurations where id = 494;\n\nSELECT * FROM teams WHERE name LIKE '%splose%'; # 572, 495, 18708\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 572 and sa.provider = 'pipedrive';\n\nselect * from opportunities where team_id = 572\n# and name like '%Onebright%'\n# and is_closed = 1 and is_won = 0\n order by id desc;\n\n\nselect * from users where deleted_at is null and status = 2;\n\nselect * from contacts where id = 17900517;\nselect * from accounts where id = 10109838;\nselect * from opportunities where id = 6955880;\n\nselect * from opportunity_contacts where opportunity_id = 6955880;\nselect * from opportunity_contacts where contact_id = 17900517;\n\nselect * from contact_roles cr join crm_configurations crm on cr.crm_configuration_id = crm.id\nwhere crm.provider != 'salesforce';\n\nSELECT * FROM activities WHERE uuid_to_bin('adcb8331-5988-4353-834e-383a355abba2') = uuid; # 38056424, crm 104659682404\nselect * from teams where id = 456;\nSELECT * FROM crm_configurations WHERE id = 363;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 456 and sa.provider = 'hubspot';\n\nselect * from crm_layouts where crm_configuration_id = 363;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id IN (1203, 1204, 1635);\nSELECT * FROM crm_fields WHERE id IN (181536, 181538, 213455);\n\nSELECT * FROM teams WHERE name LIKE '%Electric%'; # 342, 272, 12767\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 342 and sa.provider = 'pipedrive';\nSELECT * FROM opportunities WHERE crm_configuration_id = 272 and name like 'NORTHUMBRIA POL%'; # and updated_at > '2025-07-01 00:00:00';\nSELECT * FROM opportunities WHERE crm_configuration_id = 272 order by remotely_created_at asc; # and updated_at > '2025-07-01 00:00:00';\nSELECT * FROM opportunities WHERE crm_configuration_id = 272 and updated_at > '2026-01-01 00:00:00';\nSELECT * FROM crm_fields WHERE crm_configuration_id = 272 and object_type = 'opportunity';\nSELECT * FROM crm_field_values WHERE crm_field_id = 127164;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 342 and sa.provider = 'pipedrive';\n\nSELECT * FROM teams WHERE id = 472;\nSELECT * FROM crm_configurations WHERE id = 380;\nselect * from activities where id = 38285673; # 38285673\nSELECT * FROM users WHERE id = 16942;\nSELECT * FROM groups WHERE id = 1964;\nSELECT * FROM playbooks WHERE id = 2033;\n\nselect * from teams where created_at > '2026-03-09';\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 499; # 1065\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1678;\n\nSELECT * FROM teams WHERE id = 575;\nselect * from opportunities where team_id = 575;\n\nSELECT * FROM activities WHERE uuid_to_bin('96b1261f-2357-49f9-ab38-23ce12008ea0') = uuid;\n\nselect * from contacts c\nwhere c.crm_configuration_id = 370 order by c.updated_at desc;\n\nSELECT * FROM participants where activity_id = 38833541;\nSELECT * FROM participants where activity_id = 39216301;\nSELECT * FROM activity_summary_logs where activity_id = 39216301;\nSELECT * FROM activities WHERE uuid_to_bin('c7d99fbe-1fb1-41f2-8f4d-52e2bf70e1e9') = uuid; # 38833541, crm 478116564181\nSELECT * FROM activities WHERE uuid_to_bin('2e6ff4d3-9faa-447a-a8c1-9acde4d885ae') = uuid; # 39216301, crm 480171536586\nselect * from crm_profiles where crm_configuration_id = 319 and crm_provider_id = 525785080;\nselect * from opportunities where crm_configuration_id = 319 and crm_provider_id = 410150124747;\nselect * from accounts where crm_configuration_id = 319 and crm_provider_id = 47150650569;\nselect * from contacts where crm_configuration_id = 319 and crm_provider_id IN ('665587441856', '742723347700');\n# owner 13236 525785080\n# contact 1 16779180 665587441856 - activity - Alex Howes alex@supportroom.com created 2026-01-26\n# contact 2 19247563 742723347700 - ash@supportroom.com 2026-03-24\n# company 4176133 47150650569\n# deal 7100953 410150124747\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 400 and sa.provider = 'hubspot';\n\nselect * from features;\nselect * from team_features where feature_id = 40;\n\nselect * from teams where id = 556; # owner: 18101, crm: 477\nselect * from crm_configurations where id = 477;\nSELECT * FROM users WHERE id = 18101;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 556 and sa.provider = 'integration-app';\n\nselect * from opportunities where id = 7594349;\nselect * from opportunity_stages where opportunity_id = 7594349 order by created_at desc;\nselect * from business_processes where id = 6024;\nselect * from business_process_stages where stage_id = 16352;\nselect * from business_process_stages where business_process_id = 6024;\nselect * from stages where team_id = 459;\nselect * from teams where id = 459;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 459 and sa.provider = 'hubspot';\n\nSELECT os.stage_id, s.crm_provider_id, s.name, COUNT(*) as cnt\nFROM opportunity_stages os\nJOIN stages s ON s.id = os.stage_id\nWHERE os.opportunity_id = 7594349\nGROUP BY os.stage_id, s.crm_provider_id, s.name\nORDER BY cnt DESC;\n\nSELECT s.id, s.crm_provider_id, s.name, s.team_id, s.crm_configuration_id\nFROM stages s\nJOIN business_process_stages bps ON bps.stage_id = s.id\nWHERE bps.business_process_id = 6024\nAND s.crm_provider_id = 'contractsent';\n\nselect * from stages where id IN (16352,20612,18281,7344,16378,16309,5036,15223,14535,6293,12098,11607)\n\nSELECT * FROM teams WHERE name LIKE '%Pulsar Group%'; # 472, 380, 15138, raza.gilani@vuelio.com\nselect * from playbooks where team_id = 472; # event 226147\nSELECT * FROM playbook_categories WHERE playbook_id = 2288;\nSELECT * FROM crm_fields WHERE id = 226147;\nSELECT * FROM crm_field_values WHERE crm_field_id = 226147;\n\nSELECT * FROM crm_configurations WHERE id = 380;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 472 and sa.provider = 'salesforce';","depth":4,"value":"SELECT * FROM team_features where team_id = 1;\n\nSELECT * FROM teams WHERE name LIKE '%Vixio%'; # 340,270,11922\nSELECT * FROM users WHERE team_id = 340; # 12015\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 340\nand sa.provider = 'salesforce';\n# and sa.provider = 'salesloft';\n\nselect * from crm_fields where crm_configuration_id = 270 and object_type = 'event';\n# 125558 - Event Type - Event_Type__c\n# 125552 - Event Status - Event_Status__c\n\nSELECT * FROM sidekick_settings WHERE team_id = 340;\n\nSELECT * FROM crm_field_values WHERE crm_field_id in (125552);\n\nselect * from activities where crm_configuration_id = 270\nand type = 'conference' and crm_provider_id IS NOT NULL\nand actual_start_time > '2024-09-16 09:00:00' order by scheduled_start_time;\n\nSELECT * FROM activities WHERE id = 20871677;\nSELECT * FROM crm_field_data WHERE activity_id = 20871677;\n\nselect * from crm_layouts where crm_configuration_id = 270;\nselect * from crm_layout_entities where crm_layout_id in (886,887);\n\nSELECT * FROM crm_configurations WHERE id = 270;\n\nselect * from playbooks where team_id = 340; # 1514\nselect * from groups where team_id = 340;\nSELECT * FROM crm_fields WHERE id IN (125393, 125401);\n\nselect g.name as 'team name', p.name as 'playbook name', f.label as 'activity type field' from groups g\njoin playbooks p on g.playbook_id = p.id\njoin crm_fields f on p.activity_field_id = f.id\nwhere g.team_id = 340;\n\nSELECT * FROM activities WHERE uuid_to_bin('0c180357-67d2-419e-a8c3-b832a3490770') = uuid; # 20448716\nselect * from crm_field_data where object_id = 20448716;\n\nselect * from activities where crm_configuration_id = 270 and provider = 'salesloft' order by id desc;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%CybSafe%'; # 343,273,12008\nselect * from opportunities where team_id = 343;\nselect * from opportunities where team_id = 343 and crm_provider_id = '18099102526';\nselect * from opportunities where team_id = 343 and account_id = 945217482;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 343\nand sa.provider = 'hubspot';\n\nselect * from accounts where team_id = 343 order by name asc;\n\nselect * from stages where crm_configuration_id = 273 and type = 'opportunity';\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Voyado%'; # 353,283,12143\nSELECT * FROM activities WHERE crm_configuration_id = 283 and account_id = 3777844 order by id desc;\nSELECT * FROM accounts WHERE team_id = 353 AND name LIKE '%Salesloft%';\nSELECT * FROM activities WHERE id = 20717903;\n\nselect * from participants where activity_id IN (20929172,20928605,20928468,20926272,20926271,20926270,20926269,20916499,20916454,20916436,20916435,20900015,20900014,20900013,20897312,20897243,20897241,20897237,20897232,20897229,20893648,20893231,20893230,20893229,20893228,20889784,20885039,20885038,20885037,20885036,20885035,20882728,20882708,20882703,20882702,20869828,20869811,20869806,20869801,20869799,20869798,20869796,20869795,20869794,20869761,20869760,20869759,20868688,20868687,20850340,20847195,20841710,20833967,20827021,20825307,20825305,20825297,20824615,20824400,20823927,20821760,20795588,20794233,20794057,20793710,20785811,20781789,20781394,20781307,20762651,20758453,20758282,20757323,20756643,20756636,20756629,20756627,20756606,20756605,20756604,20756603,20756602,20756600,20756599,20756598,20756595,20756594,20756589,20756587,20756577,20756573,20748918,20748386,20748385,20748384,20748383,20748382,20748381,20748380,20748379,20748377,20748375,20748373,20743301,20717905,20717904,20717903,20717901,20717899);\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 353\nand sa.provider = 'salesforce';\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%modern world business solutions%'; # 345,275,12016, l.atkinson@mwbsolutions.co.uk\nSELECT * FROM activities WHERE uuid_to_bin('3921d399-3fef-4609-a291-b0097a166d43') = uuid;\n# id: 20940638, user: 12022, contact: 5305871\nSELECT * FROM activity_summary_logs WHERE activity_id = 20940638;\nselect * from contacts where team_id = 345 and crm_provider_id = '30891432415' order by name asc; # 5305871\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 345\nand sa.provider = 'hubspot';\n\nselect * from users where team_id = 345 and id = 12022;\nSELECT * FROM crm_profiles WHERE user_id = 12022;\nSELECT * FROM participants WHERE activity_id = 20940638;\nSELECT * FROM users u\nJOIN crm_profiles cp ON u.id = cp.user_id\nWHERE u.team_id = 345;\n\nselect * from contacts where team_id = 345 and crm_provider_id = '30880813535' order by name desc; # 5305871\n\nselect * from team_features where team_id = 345;\nSELECT * FROM activities WHERE uuid_to_bin('11701e2d-2f82-4dab-a616-1db4fad238df') = uuid; # 21115197\nSELECT * FROM participants WHERE activity_id = 20897406;\n\n\n\nSELECT * FROM activities WHERE uuid_to_bin('63ba55cd-1abc-447d-83da-0137000005b7') = uuid; # 20953912\nSELECT * FROM activities WHERE crm_configuration_id = 275 and provider = 'ringcentral' and title like '%1252629100%';\n\n\nSELECT * FROM activities WHERE id = 20946641;\nSELECT * FROM crm_profiles WHERE user_id = 10211;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Lunio%'; # 120,97,10984, triger@lunio.ai\nSELECT * FROM opportunities WHERE crm_configuration_id = 97 and crm_provider_id = '006N1000006c5PpIAI';\nselect * from stages where crm_configuration_id = 97 and type = 'opportunity';\nselect * from opportunities where team_id = 120;\n\n\nselect * from crm_configurations crm join teams t on crm.id = t.crm_id\nwhere 1=1\nAND t.current_billing_plan IS NOT NULL\nAND crm.auto_sync_activity = 0\nand crm.provider = 'hubspot';\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Exclaimer%'; # 270,205,10053,james.lewendon@exclaimer.com\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 270\nand sa.provider = 'salesforce';\nSELECT * FROM activities WHERE uuid_to_bin('b54df794-2a9a-4957-8d80-09a600ead5f8') = uuid; # 21637956\nSELECT * FROM crm_profiles WHERE user_id = 11446;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Cygnetise%'; # 372,300,12554, alex.chikly@cygnetise.com\nselect * from playbooks where team_id = 372;\nselect * from crm_fields where crm_configuration_id = 300 and object_type = 'event'; # 141340\nSELECT * FROM crm_field_values WHERE crm_field_id = 141340;\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 372\nand sa.provider = 'salesforce';\n\nselect * from crm_profiles where crm_configuration_id = 300;\nSELECT * FROM crm_configurations WHERE team_id = 372;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Planday%'; # 291,242,11501,mfa@planday.com\nSELECT * FROM opportunities WHERE team_id = 291 and crm_provider_id = '006bG000005DO86QAG'; # 3207756\nselect * from crm_field_data where object_id = 3207756;\nSELECT * FROM crm_fields WHERE id = 111834;\n\nselect f.id, f.crm_provider_id AS field_name, f.label, fd.object_id AS dealId, fd.value\nFROM crm_fields f\nJOIN crm_field_data fd ON f.id = fd.crm_field_id\nWHERE f.crm_configuration_id = 242\nAND f.object_type = 'opportunity'\nAND fd.object_id IN (3207756)\nORDER BY fd.object_id, fd.updated_at;\n\nSELECT * FROM crm_configurations WHERE auto_connect = 1;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Tour%'; # 187,209,8150,salesforce-admin@tourlane.com\nselect * from group_deal_risk_types drgt join groups g on drgt.group_id = g.id\nwhere g.team_id = 187;\n\nselect * from `groups` where team_id = 187;\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 187\nand sa.provider = 'salesforce';\n\n# Destination - 98870 - Destination__c\n# Stage - 79014 - StageName\n# Land Arrangement - 98856 - Land_Arrangement__c\n# Flight - 98848 - Flight__c\n# Last activity date - 98812 - LastActivityDate\n# Last modified date - 98809 - LastModifiedDate\n# Last inbound mail timestamp - 99151 - Last_Inbound_Mail_Timestamp__c\n# next call - 98864 - Next_Call__c\n\nselect * from crm_fields where crm_configuration_id = 209 and object_type = 'opportunity';\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 209;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 682;\n\nselect * from opportunities where team_id = 187 and name LIKE'%Muriel Sal%';\nselect * from opportunities where team_id = 187 and user_id = 9951 and is_closed = 0;\nselect * from activities where opportunity_id = 3538248;\n\nSELECT * FROM crm_profiles WHERE user_id = 8150;\n\nselect * from deal_risks where opportunity_id = 3538248;\n\nselect * from teams where crm_id IS NULL;\n\nSELECT opp.id AS opportunity_id,\n u.group_id AS group_id,\n MAX(\n CASE\n WHEN a.type IN (\"sms-inbound\", \"sms-outbound\") THEN a.created_at\n ELSE a.actual_end_time\n END) as last_date\nFROM opportunities opp\nleft join activities a on a.opportunity_id = opp.id\ninner join users u on opp.user_id = u.id\nwhere opp.user_id IN (9951)\n\nAND opp.is_closed = 0\nand a.status IN ('completed', 'received', 'delivered') OR a.status IS NULL\ngroup by opp.id;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Cybsafe%'; # 343,301,12008,polly.morphew@cybsafe.com\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 343\nand sa.provider = 'hubspot';\n\nSELECT * FROM crm_profiles WHERE crm_configuration_id = 301;\nSELECT * FROM contacts WHERE id = 6612363;\nSELECT * FROM accounts WHERE id = 4235676;\nSELECT * FROM opportunities WHERE crm_configuration_id = 301 and crm_provider_id = 32983784868;\nselect * from opportunity_stages where opportunity_id = 4503759;\n# SELECT * FROM opportunities WHERE id = 4569937;\n\nselect * from activities where crm_configuration_id = 301;\nSELECT * FROM activities WHERE uuid_to_bin('d3b2b28b-c3d0-4c2d-8ed0-eef42855278a') = uuid; # 26330370\nSELECT * FROM participants WHERE activity_id = 26330370;\n\nSELECT * FROM teams WHERE id = 375;\nselect * from playbooks where team_id = 375;\n\nselect * from stages where crm_configuration_id = 301 and type = 'opportunity';\n\nselect * from teams;\nselect * from contact_roles;\n\nSELECT * FROM opportunities WHERE team_id = 343 and user_id = 12871 and close_date >= '2024-11-01';\n\nselect * from users u join crm_profiles cp on cp.user_id = u.id where u.team_id = 343;\n\nSELECT * FROM crm_field_data WHERE object_id = 3771706;\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 343\nand sa.provider = 'hubspot';\n\nSELECT * FROM crm_fields WHERE crm_configuration_id = 301 and object_type = 'opportunity'\nand crm_provider_id LIKE \"%traffic_light%\";\nSELECT * FROM crm_field_values WHERE crm_field_id IN (144020,144048,144111,144113,144126,144481,144508,144531);\n\nSELECT fd.* FROM opportunities o\nJOIN crm_field_data fd ON o.id = fd.object_id\nWHERE o.team_id = 343\n# and o.user_id IS NOT NULL\nand fd.crm_field_id IN (144020,144048,144111,144113,144126,144481,144508,144531)\nand fd.value != ''\norder by value desc\n# group by o.id\n;\n\nSELECT * FROM opportunities WHERE id = 3769843;\n\nSELECT * FROM teams WHERE name LIKE '%Tour%'; # 187,209,8150, salesforce-admin@tourlane.com\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 209;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 682;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Funding Circle%'; # 220,177,8603,aswini.mishra@fundingcircle.com\nSELECT * FROM activities WHERE uuid_to_bin('7a40e99b-3b37-4bb1-b983-325b81801c01') = uuid; # 23139839\n\n\nSELECT * FROM opportunities WHERE id = 3855992;\n\nSELECT * FROM users WHERE name LIKE '%Angus Pollard%'; # 8988\n\nSELECT * FROM teams WHERE name LIKE '%Story Terrace%'; # 379, 307, 12894\nSELECT * FROM crm_fields WHERE crm_configuration_id = 307 and object_type != 'opportunity';\n\nselect * from contacts where team_id = 379 and name like '%bebro%'; # 5874411, crm: 77229348507\nSELECT * FROM crm_field_data WHERE object_id = 5874411;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 379\nand sa.provider = 'hubspot';\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%mentio%'; # 117, 94, 6371, nikhil.kumar@mention-me.com\nSELECT * FROM activities WHERE uuid_to_bin('82939311-1af0-4506-8546-21e8d1fdf2c1') = uuid;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Tourlane%'; # 187, 209, 8150, salesforce-admin@tourlane.com\nSELECT * FROM opportunities WHERE team_id = 187 and crm_provider_id = '006Se000008xfvNIAQ'; # 3537793\nselect * from generic_ai_prompts where subject_id = 3537793;\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Lunio%'; # 120, 97, 10984, triger@lunio.ai\nSELECT * FROM crm_configurations WHERE id = 97;\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 97;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 355;\nSELECT * FROM crm_fields WHERE id = 32682;\n\nselect cfd.value, o.* from opportunities o\njoin crm_field_data cfd on o.id = cfd.object_id and cfd.crm_field_id = 32682\nwhere team_id = 120\nand cfd.value != ''\n;\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 120\nand sa.provider = 'salesforce';\n\nselect * from opportunities where team_id = 120 and crm_provider_id = '006N1000007X8MAIA0';\nSELECT * FROM crm_field_data WHERE object_id = 2313439;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE id = 410;\nSELECT * FROM teams WHERE name LIKE '%Local Business Oxford%';\nselect * from scorecards where team_id = 410;\nselect * from scorecard_rules;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Funding%'; # 220, 177, 8603, aswini.mishra@fundingcircle.com\nselect * from activities a\njoin opportunities o on a.opportunity_id = o.id\njoin users u on o.user_id = u.id\nwhere a.crm_configuration_id = 177 and a.type LIKE '%email-out%'\n# and a.actual_end_time > '2024-12-16 00:00:00'\n# and o.remotely_created_at > '2024-12-01 00:00:00'\n# and u.group_id = 1014\nand u.id = 9021\norder by a.id desc;\nSELECT * FROM opportunities WHERE id in (3981384,4017346);\nSELECT * FROM users WHERE team_id = 220 and id IN (8775, 11435);\n\nselect * from users where id = 9021;\nselect * from inboxes where user_id = 9021;\n\nselect * from inbox_emails where inbox_id = 1349 and email_date > '2024-12-18 00:00:00';\n\nselect * from email_messages where team_id = 220\nand orig_date > '2024-12-16 00:00:00' and orig_date < '2024-12-19 00:00:00'\nand subject LIKE '%Personal%'\n# and 'from' = 'credit@fundingcircle.com'\n;\n\nselect * from activities a\njoin opportunities o on a.opportunity_id = o.id\nwhere a.user_id = 9021 and a.type LIKE '%email-out%'\nand a.actual_end_time > '2024-12-18 00:00:00'\nand o.user_id IS NOT NULL\nand o.remotely_created_at > '2024-12-01 00:00:00'\norder by a.id desc;\n\nSELECT * FROM opportunities WHERE team_id = 220 and name LIKE '%Right Car move Limited%' and id = 3966852;\nselect * from activities where crm_configuration_id = 177 and type LIKE '%email%' and opportunity_id = 3966852 order by id desc;\n\nselect * from team_settings where name IN ('useCloseDate');\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Hurree%'; # 104, 81, 6175, jfarrell@hurree.co\nSELECT * FROM opportunities WHERE team_id = 104 and name = 'PropOp';\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 104\nand sa.provider = 'hubspot';\n\nselect * from crm_configurations where last_synced_at > '2025-01-19 01:00:00'\nselect * from teams where crm_id IS NULL;\n\nselect t.name as 'team', u.name as 'owner', u.email, u.phone\nfrom teams t\njoin activity_providers ap on t.id = ap.team_id\njoin users u on t.owner_id = u.id\nwhere 1=1\n and t.status = 'active'\n and ap.is_enabled = 1\n# and u.status = 1\n and ap.provider = 'ms-teams';\n\nselect * from crm_configurations where provider = 'bullhorn'; # 344\nSELECT * FROM teams WHERE id = 442; # 14293\nselect * from users where team_id = 442;\nselect * from social_accounts sa where sa.sociable_id = 14293;\nselect * from invitations where team_id = 442;\n\n# ********************************************************************************************************\nSELECT * FROM users WHERE email LIKE '%nea.liikamaa@eletive.com%'; # 14022\nSELECT * FROM teams WHERE id = 429;\nselect * from opportunities where team_id = 429 and crm_provider_id IN (16157415775, 22246219645);\nselect * from activities where opportunity_id in (4340436,4353519);\n\nselect * from transcription where activity_id IN (25630961,25381771);\nselect * from generic_ai_prompts where subject_id IN (4353519);\n\nSELECT\n a.id as activity_id,\n a.opportunity_id,\n a.type as activity_type,\n a.language,\n CONCAT(a.title, a.description) AS mail_content,\n e.from AS mail_from,\n e.to AS mail_to,\n e.subject AS mail_subject,\n e.body AS mail_body,\n p.type as prompt_type,\n p.status as prompt_status,\n p.content AS prompt_content,\n a.actual_start_time as created_at\nFROM activities a\n LEFT JOIN ai_prompts p ON a.transcription_id = p.transcription_id AND p.deleted_at IS NULL\n LEFT JOIN email_messages e ON a.id = e.activity_id\nWHERE a.actual_start_time > '2024-01-01 00:00:00'\n AND a.opportunity_id IN (4353519)\n AND a.status IN ('completed', 'received', 'delivered')\n AND a.deleted_at IS NULL\n AND a.type NOT IN ('sms-inbound', 'sms-outbound')\nORDER BY a.opportunity_id ASC, a.id ASC;\n\nSELECT * FROM users WHERE name LIKE '%George Fierstone%'; # 14293\nSELECT * FROM teams WHERE id = 442;\nSELECT * FROM crm_configurations WHERE id = 344;\nselect * from team_features where team_id = 442;\nselect * from groups where team_id = 442;\nselect * from playbooks where team_id = 442;\nselect * from playbook_categories where playbook_id = 1729;\nselect * from crm_fields where crm_configuration_id = 344 and id = 172024;\nSELECT * FROM crm_field_values WHERE crm_field_id = 172024;\nselect * from crm_layouts where crm_configuration_id = 344;\nselect * from playbook_layouts where playbook_id = 1729;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Learning%'; # 260, 221, 9444\n\nselect s.*\n# , s.sent_at, u.name, a.*\nfrom activity_summary_logs s\ninner join activities a on a.id = s.activity_id\ninner join users u on u.id = a.user_id\nwhere a.crm_configuration_id = 356\nand s.sent_at > date_sub(now(), interval 60 day)\norder by a.actual_end_time desc;\n\nselect * from activities a\n# inner join activity_summary_logs s on s.activity_id = a.id\nwhere a.crm_configuration_id = 356 and a.actual_end_time > date_sub(now(), interval 60 day)\n# and a.crm_provider_id is not null\n# and provider <> 'ringcentral'\nand status = 'completed'\norder by a.actual_end_time desc;\n\nselect * from teams order by id desc; # 17328, 32, 17830, integration-account@jiminny.com\nSELECT * FROM users;\nSELECT * FROM users where team_id = 260 and status = 1; # 201 - 150 active\nSELECT * FROM teams WHERE id = 260;\nselect * from team_settings where team_id = 260;\nselect * from crm_configurations where team_id = 260;\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 356;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1184;\n\nselect * from accounts where crm_configuration_id = 221 order by id desc; # 7000\nselect * from leads where crm_configuration_id = 221 order by id desc; # 0\nselect * from contacts where crm_configuration_id = 221 order by id desc; # 200 000\nselect * from opportunities where crm_configuration_id = 221 order by id desc; # 0\nselect * from crm_profiles where crm_configuration_id = 221 order by id desc; # 23\nselect * from crm_fields where crm_configuration_id = 221;\nselect * from crm_field_values where crm_field_id = 5302 order by id desc;\nselect * from crm_layouts where crm_configuration_id = 221 order by id desc;\nselect * from stages where crm_configuration_id = 221 order by id desc;\n\nselect * from accounts where crm_configuration_id = 356 order by id desc; # 7000\nselect * from leads where crm_configuration_id = 356 order by id desc; # 0\nselect * from contacts where crm_configuration_id = 356 order by id desc; # 200 000\nselect * from opportunities where crm_configuration_id = 356 order by id desc; # 0\nselect * from crm_profiles where crm_configuration_id = 356 order by id desc; # 23\nselect * from crm_fields where crm_configuration_id = 356;\nselect * from crm_field_values where crm_field_id = 5302 order by id desc;\nselect * from crm_layouts where crm_configuration_id = 356 order by id desc;\nselect * from stages where crm_configuration_id = 356 order by id desc;\n\nselect * from playbooks where team_id = 260 order by id desc; # 4 (2 deleted)\nselect * from groups where team_id = 260 order by id desc; # 27 groups, (2 deleted)\nselect * from playbook_layouts where playbook_id IN (1410,1409,1276,1254); # 4\nselect ce.* from calendars c\njoin users u on c.user_id = u.id\njoin calendar_events ce on c.id = ce.calendar_id\nwhere u.team_id = 260\nand (ce.start_time > '2025-02-21 00:00:00')\n;\n# calendar events 1207\n#\n\nselect * from opportunities where team_id = 260;\nSELECT * FROM crm_field_data WHERE object_id = 4696496;\n\nselect * from activities where crm_configuration_id = 356 and crm_provider_id IS NOT NULL;\nselect * from activities where crm_configuration_id IN (221) and provider NOT IN ('ms-teams', 'uploader', 'zoom-bot')\n# and type = 'conference' and status = 'scheduled' and activities.is_internal = 0\nand created_at > '2024-03-01 00:00:00'\norder by id desc; # 880 000, ringcentral, avaya\nSELECT * FROM participants WHERE activity_id = 26371744;\n\n# all activities 942 000 +\n# conference 7385 - scheduled 984 - external 343\n\nselect * from activities where id = 26321812;\nselect * from participants where activity_id = 26321812;\nselect * from participants where activity_id in (26414510,26414514,26414516,26414604,26414653,26414655);\nselect * from leads where id in (720428,689175,731546,645866,621037);\n\nselect * from users where id = 13841;\nselect * from opportunities where user_id = 9541;\nselect * from stages where id = 15900;\n\nselect * from accounts where\n# id IN (4160055,5053725,4965303,4896434)\nid in (4584518,3249934,3218025,3891133,3399450,4172999,4485161,3101785,4587203,3070816,2870343,2870341,3563940,4550846,3424464,3249963,2870342)\n;\n\nselect * from activities where id = 26654935;\nSELECT * FROM opportunities WHERE id = 4803458;\n\nSELECT * FROM opportunities where team_id = 260 and user_id = 13841 AND stage_id = 15900;\nSELECT id, uuid, provider, type, lead_id, account_id, contact_id, opportunity_id, stage_id, status, recording_state, title, actual_start_time, actual_end_time\nFROM activities WHERE user_id = 13841 AND opportunity_id IN (4729783, 4731717, 4731726, 4732064, 4732849, 4803458, 4813213);\n\nSELECT DISTINCT\n o.id, o.stage_id, s.name, a.title,\n a.*\nFROM activities a\n# INNER JOIN tracks t ON a.id = t.activity_id\nINNER JOIN users u ON a.user_id = u.id\nINNER JOIN teams team ON u.team_id = team.id\nINNER JOIN groups g ON u.group_id = g.id\nINNER JOIN opportunities o ON a.opportunity_id = o.id\nINNER JOIN stages s ON o.stage_id = s.id\nWHERE\n a.crm_configuration_id = 356\n AND a.status IN ('completed', 'failed')\n AND a.recording_state != 'stopped'\n# and a.user_id = 13841\n AND u.uuid = uuid_to_bin('6f40e4b8-c340-4059-b4ac-1728e87ea99e')\n AND team.uuid = uuid_to_bin('a607fba7-452e-4683-b2af-00d6cb52c93c')\n AND g.uuid = uuid_to_bin('b5d69e40-24a0-4c16-810b-5fa462299f94')\n\n AND a.type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')\n# AND t.type IN ('audio', 'video')\n AND (\n (a.actual_start_time BETWEEN '2025-03-13 00:00:00' AND '2025-03-18 07:59:59')\n OR\n (\n a.actual_start_time IS NULL\n AND a.type IN ('sms-outbound', 'sms-inbound')\n AND a.created_at BETWEEN '2025-03-13 00:00:00' AND '2025-03-18 07:59:59'\n )\n )\n AND (\n a.is_private = 0\n OR (\n a.is_private = 1\n AND u.uuid = uuid_to_bin('6f40e4b8-c340-4059-b4ac-1728e87ea99e')\n )\n )\n AND (\n# s.id = 15900\n s.uuid = uuid_to_bin('04ca1c26-c666-4268-a129-419c0acffd73')\n OR s.uuid IS NULL -- Include records without opportunity stage\n )\n\nORDER BY a.actual_end_time DESC;\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Lead Forensics%'; # 190, 162, 8474, willsc@leadforensics.com\nSELECT * FROM users WHERE team_id = 190;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 190\nand sa.provider = 'hubspot';\n\nselect * from role_user where user_id = 8474;\n\nselect * from crm_configurations where provider = 'bullhorn';\n\nSELECT * FROM opportunities WHERE uuid_to_bin('94578249-65ec-4205-90f2-7d1a7d5ab64a') = uuid;\nSELECT * FROM users WHERE uuid_to_bin('26dbadeb-926f-4150-b11b-771b9d4c2f9a') = uuid;\n\nSELECT * FROM opportunities WHERE id = 4732493;\nselect * from activities where opportunity_id = 4732493;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE id = 443; # 358, 14315, andrea.romano@correrenaturale.com\nSELECT * FROM opportunities WHERE team_id = 443;\n\nSELECT a.id, a.type, a.user_id, a.status, a.deleted_at, u.name, u.email, u.team_id as activity_team_id, u.status, u.deleted_at, t.name, t.status, s.team_id as stage_team_id\nFROM activities AS a\nJOIN stages AS s ON a.stage_id = s.id\nJOIN users AS u ON u.id = a.user_id\nJOIN teams AS t ON t.id = s.team_id\nWHERE u.team_id <> s.team_id and t.id > 135;\n\n\nSELECT\n crm_configuration_id,\n crm_provider_id,\n COUNT(*) as duplicate_count,\n GROUP_CONCAT(id) as stage_ids,\n GROUP_CONCAT(name) as stage_names\nFROM stages\nGROUP BY crm_configuration_id, crm_provider_id\nHAVING COUNT(*) > 1\nORDER BY duplicate_count DESC;\n\nselect * from stages where id IN (14898,14907);\n\nselect * from business_processes;\n\nSELECT *\nFROM crm_configurations\nWHERE team_id IN (\n SELECT team_id\n FROM crm_configurations\n GROUP BY team_id\n HAVING COUNT(*) > 1\n)\nORDER BY team_id;\n\nSELECT *\nFROM teams\nWHERE crm_id IN (\n SELECT crm_id\n FROM teams\n GROUP BY crm_id\n HAVING COUNT(*) > 1\n)\nORDER BY crm_id;\n\n# ***************************************************************************\nselect * from crm_configurations where provider = 'integration-app';\nSELECT * FROM teams WHERE id = 443; # Correre Naturale 358 14315 andrea.romano@correrenaturale.com\nselect * from activities where crm_configuration_id = 358 order by actual_end_time desc;\nselect id, uuid, actual_end_time, crm_provider_id, is_internal, playbook_category_id, type, user_id, lead_id, contact_id, account_id, opportunity_id, status, title from activities where crm_configuration_id = 358 order by actual_end_time desc;\nselect * from team_features where team_id = 358;\nselect * from activity_summary_logs;\n\nselect * from teams where id = 406;\n\n# ************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Sportfive%'; # 267, 202, 14637, srv.salesforce@sportfive.com\nselect * from activities where crm_configuration_id = 202 order by actual_end_time desc;\n\nSELECT * FROM users where id = 14637;\nSELECT * FROM teams where id = 267;\nSELECT * FROM groups where id = 1118;\n\nselect g.name, a.title, uuid_from_bin(a.uuid), a.external_id, a.status, a.recording_state, a.recording_reason_code, a.scheduled_start_time, a.scheduled_end_time, a.actual_start_time, a.actual_end_time from activities a\ninner join users u on u.id = a.user_id\ninner join groups g on g.id = u.group_id\nwhere a.crm_configuration_id = 202\nand a.is_internal = 0\nand (a.scheduled_start_time between '2025-03-19 00:00:00' and '2025-03-21 00:00:00')\nand a.type = 'conference'\nand a.status != 'completed'\nand a.external_id is not null\norder by a.scheduled_start_time desc;\n\nSELECT * FROM activities\nWHERE crm_configuration_id = 202\n AND status IN ('completed', 'failed')\n AND recording_state != 'stopped'\n AND type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')\n AND (is_private = 0 OR user_id = 14637)\n AND (\n (\n actual_start_time BETWEEN '2025-03-12 12:00:00' AND '2025-03-24 11:59:59'\n ) OR (\n actual_start_time IS NULL\n AND type IN ('sms-outbound', 'sms-inbound')\n AND created_at BETWEEN '2025-03-12 12:00:00' AND '2025-03-24 11:59:59'\n )\n )\n AND NOT EXISTS (\n SELECT 1\n FROM tracks\n WHERE\n tracks.activity_id = activities.id\n AND tracks.type IN ('audio', 'video')\n )\nORDER BY actual_end_time DESC;\n\nSELECT DISTINCT\n a.*\nFROM activities a\nINNER JOIN tracks t ON a.id = t.activity_id\nINNER JOIN users u ON a.user_id = u.id\nINNER JOIN teams team ON u.team_id = team.id\nWHERE\n a.crm_configuration_id = 202\n AND a.status IN ('completed', 'failed')\n AND a.recording_state != 'stopped'\n# and a.user_id = 14637\n AND a.type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')\n# AND t.type IN ('audio', 'video')\n AND (\n (a.actual_start_time BETWEEN '2025-03-12 12:00:00' AND '2025-03-24 11:59:59')\n OR\n (\n a.actual_start_time IS NULL\n AND a.type IN ('sms-outbound', 'sms-inbound')\n AND a.created_at BETWEEN '2025-03-12 12:00:00' AND '2025-03-24 11:59:59'\n )\n )\n AND (\n a.is_private = 0\n OR (\n a.is_private = 1\n AND a.user_id = 14637\n )\n )\n\nORDER BY a.actual_end_time DESC\n;\n\nSELECT DISTINCT a.*\nFROM activities a\nINNER JOIN users u ON a.user_id = u.id\nINNER JOIN teams t ON u.team_id = t.id\n# INNER JOIN tracks tr ON a.id = tr.activity_id\n# INNER JOIN groups g ON u.group_id = g.id\nWHERE 1=1\n AND t.id = 267\n# AND t.uuid = uuid_to_bin('aed4927b-f1ea-499e-94c3-83762fd233e8')\n AND a.status IN ('completed', 'failed')\n AND a.recording_state != 'stopped'\n AND a.type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')\n# AND tr.type NOT IN ('audio', 'video')\n AND (\n a.is_private = 0\n OR a.user_id = 14637\n )\n AND (\n (a.actual_start_time BETWEEN '2025-03-19 00:00:00' AND '2025-03-21 23:59:59')\n OR (\n a.actual_start_time IS NULL\n AND a.type IN ('sms-outbound', 'sms-inbound')\n AND a.created_at BETWEEN '2025-03-19 00:00:00' AND '2025-03-21 23:59:59'\n )\n )\n# and NOT EXISTS (\n# SELECT 1\n# FROM tracks t\n# WHERE t.activity_id = a.id\n# AND t.type IN ('audio', 'video')\n# )\n\nORDER BY a.actual_end_time DESC;\n\nSELECT * FROM tracks WHERE activity_id = 26485995;\n\nselect a.is_private, a.title, uuid_from_bin(a.uuid), a.external_id, a.status, a.recording_state, a.recording_reason_code, a.scheduled_start_time, a.scheduled_end_time, a.actual_start_time, a.actual_end_time from activities a\ninner join users u on u.id = a.user_id\nwhere a.crm_configuration_id = 202\n# and a.is_internal = 0\nand (a.actual_start_time between '2025-03-19 00:00:00' and '2025-03-21 00:00:00')\nand a.type IN (\"softphone\",\"softphone-inbound\",\"conference\",\"sms-inbound\")\nand a.status IN ('completed', 'failed')\n# and a.external_id is not null\norder by a.actual_end_time desc;\n\nselect * from activities a where a.crm_configuration_id = 202\nand a.actual_start_time between '2025-03-20 00:00:00' and '2025-03-21 00:00:00'\n# AND a.type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')\n\nselect g.name, a.title, uuid_from_bin(a.uuid), a.external_id, a.status, a.recording_state, a.recording_reason_code, a.scheduled_start_time, a.scheduled_end_time, a.actual_start_time, a.actual_end_time from activities a\ninner join users u on u.id = a.user_id\ninner join groups g on g.id = u.group_id\nwhere a.crm_configuration_id = 202\nand a.is_internal = 0\nand (a.scheduled_start_time between '2025-03-19 00:00:00' and '2025-03-21 00:00:00')\nand a.type = 'conference'\nand a.status != 'completed'\nand a.external_id is not null\norder by a.scheduled_start_time desc;\n\nSELECT * FROM teams WHERE name LIKE '%Tourlane%';\nSELECT * FROM crm_fields WHERE crm_configuration_id = 209 and object_type = 'opportunity';\nSELECT * FROM crm_field_data WHERE crm_field_id = 98809;\n\nselect * from users where status = 1 AND timezone = 'MDT';\n\nselect * from opportunities where id = 3769814;\nselect * from deal_risks where opportunity_id = 3769814;\n\nselect cp.* from crm_profiles cp\njoin users u on cp.user_id = u.id\njoin crm_configurations crm on cp.crm_configuration_id = crm.id\nwhere crm.provider = 'hubspot' AND u.status = 1 AND log_notes != 'none';\n\nselect * from crm_fields where id = 154575;\n\nselect * from team_features where feature = 'SUPPORTS_SYNC_MISSING_CALL_DISPOSITIONS';\nSELECT * FROM teams WHERE id = 176; # crm 148\nselect * from activities where crm_configuration_id = 148 and provider = 'hubspot' order by id desc;\n\nselect * from activity_providers where provider = 'amazon-connect';\n\nselect * from crm_fields cf\njoin crm_configurations crm on crm.id = cf.crm_configuration_id\nwhere crm.provider = 'hubspot' and cf.object_type IN ('account', 'contact');\n\n# *********************************************************************************************\nSELECT * FROM users WHERE id IN (15415, 15418);\nSELECT * FROM groups WHERE id IN (1805,1806);\nSELECT * FROM playbooks WHERE id = 1860;\nSELECT * FROM playbook_categories WHERE id = 38634;\nSELECT * FROM crm_fields WHERE id = 189962;\n\nSELECT * FROM teams WHERE name = 'Pulsar Group'; # 472, 380, 15138 raza.gilani@vuelio.com\n\nSELECT * FROM crm_profiles WHERE user_id = 15415;\nSELECT * FROM social_accounts WHERE sociable_id = 15415 and provider = 'salesforce';\n\nselect * from sidekick_settings where team_id = 472;\n\nSELECT * FROM activities WHERE uuid_to_bin('452c58c7-b87c-4fdd-953e-d7af185e9588') = uuid; # 28617536, user: 15418\nSELECT * FROM activities WHERE uuid_to_bin('399114ee-d3a8-458c-bff5-5f654658db0a') = uuid; # 28344407, user: 15415\nSELECT * FROM activities WHERE uuid_to_bin('f0aa567f-0ab1-4bbb-96aa-37dcf184676b') = uuid; # 28580288, user: 15415\nSELECT * FROM activities WHERE uuid_to_bin('50c086b1-2770-4bca-b5ae-6bac22ec426b') = uuid; # 28566069, user: 15415\n\n# *********************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%TeamTailor%'; # 109, 218, 13969, salesforce-integrations@teamtailor.com\nselect * from crm_configurations where id = 218;\nSELECT * FROM activities WHERE uuid_to_bin('e39b5857-7fdb-4f5a-951a-8d3ca69bb1b0') = uuid; # 28338765\nSELECT * FROM users WHERE id IN (13232, 13230);\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 109\nand sa.provider = 'salesforce';\n\n0057R00000EPL5HQAX Inez Ekblad\n\n1091cb81-5ea1-4951-a0ed-f00b568f0140 Triman Kaur\n\nSELECT * FROM crm_profiles WHERE user_id IN (13232, 13230);\n\n############################################################################################\nSELECT * FROM activities WHERE uuid_to_bin('675eeaeb-5681-42db-90bc-54c07a604408') = uuid; # 28655939 00UVg00000FLvnSMAT\nSELECT * FROM crm_field_data WHERE activity_id = 28655939;\nSELECT * FROM crm_fields WHERE id IN (94491,94493,94498);\nSELECT * FROM users WHERE id = 13658;\nSELECT * FROM teams WHERE id = 109;\nSELECT * FROM crm_configurations WHERE id = 218;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 109\nand sa.provider = 'salesforce';\n\n# ********************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Strengthscope%'; # 481, 390, 15420, katy.holden@strengthscope.comk\nSELECT * FROM stages WHERE crm_configuration_id = 390;\nselect * from business_processes where team_id = 481 and crm_configuration_id = 390;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 481\nand sa.provider = 'salesforce';\n\n\nSELECT * FROM users WHERE id = 15780; # team 462\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 462\nand sa.provider = 'hubspot';\n\n\nselect * from teams where id = 495;\nSELECT * FROM users WHERE id = 15794;\nselect * from social_accounts where sociable_id = 15794;\n\n# ********************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Flight%'; # 427, 333, 13752\nSELECT * FROM accounts WHERE team_id = 427 and crm_provider_id = '668731000183444517';\n\n# ********************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Group GTI%'; # 495, 407, 15794\nSELECT * FROM activities WHERE crm_configuration_id = 407\nand status = 'completed' and type = 'conference'\norder by id desc;\n\nselect ru.*, pr.*, p.* from users u join role_user ru on ru.user_id = u.id\njoin permission_role pr on pr.role_id = ru.role_id\n join permissions p on p.id = pr.permission_id\nwhere team_id = 495 and p.name IN ('dial');\n\nselect * from permission_role;\n\nselect * from activities where crm_configuration_id = 407 and status = 'completed' order by id desc;\nSELECT * FROM activities WHERE id = 29512773;\nSELECT * FROM activities WHERE id IN (29042721,28991325,29002874);\n\nSELECT al.* from activity_summary_logs al join activities a on a.id = al.activity_id\nwhere a.crm_configuration_id = 407\n# and a.id IN (29042721,28991325,29002874);\n\nSELECT * FROM users WHERE id = 15794;\nSELECT * FROM users WHERE team_id = 495;\nSELECT * FROM social_accounts WHERE sociable_id = 15794;\nSELECT * FROM opportunities WHERE team_id = 495 and name like '%OC:%';\nSELECT * FROM contacts WHERE team_id = 495;\nSELECT * FROM leads WHERE team_id = 495;\nSELECT * FROM accounts WHERE team_id = 495;\nSELECT * FROM crm_profiles WHERE crm_configuration_id = 407;\nSELECT * FROM crm_fields WHERE crm_configuration_id = 407;\nSELECT * FROM crm_configurations WHERE id = 407;\nSELECT * FROM opportunities WHERE team_id = 495 and close_date BETWEEN '2025-06-01' AND '2025-07-01'\nand user_id IS NOT NULL and is_closed = 1 and is_won = 1;\n\n# ********************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Hamilton Court FX LLP%'; # 249, 187, 10103\nSELECT * FROM activities WHERE uuid_to_bin('4659c2bb-9a49-484e-9327-a3d66f1e028c') = uuid; # 28951064\nSELECT * FROM crm_fields WHERE crm_configuration_id = 187 and object_type IN ('tasks', 'event');\n\n# *********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Checkstep%'; # 325, 256, 11753\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 325\nand sa.provider = 'hubspot';\n\nSELECT * FROM activities WHERE uuid_to_bin('7be372e2-1916-4d79-a2f3-ca3db1346db3') = uuid; # 28611085\nSELECT * FROM activities WHERE uuid_to_bin('980f0336-840b-4185-a5a9-30cf8b0749a8') = uuid; # 28719733\nSELECT * FROM activity_summary_logs where activity_id = 28719733;\n\n# *************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Learning%'; # 260, 356, 9444\nSELECT * FROM activity_summary_logs where sent_at BETWEEN '2025-06-09 11:38:00' AND '2025-06-09 11:40:00';\nSELECT * FROM leads WHERE crm_configuration_id = 356 and crm_provider_id = '230045001502770504'; # 823630\nselect * from activities where crm_configuration_id = 356 and lead_id = 841732;\n\nSELECT * from activity_summary_logs al join activities a on a.id = al.activity_id\nwhere a.crm_configuration_id = 356;\n\nselect * from activities where crm_configuration_id = 356\nand actual_end_time between '2025-06-09 11:00:00' and '2025-06-09 12:00:00'\norder by id desc;\n\nselect * from accounts where crm_configuration_id = 356 and crm_provider_id = '230045001514403366' order by id desc;\nselect * from leads where crm_configuration_id = 356 and crm_provider_id = '230045001514275654' order by id desc;\nselect * from contacts where crm_configuration_id = 356 and crm_provider_id = '230045001514403366' order by id desc;\nselect * from opportunities where crm_configuration_id = 356 and crm_provider_id = '230045001514403366' order by id desc;\n\nselect * from team_features where team_id = 260;\nselect * from features where id IN (1,2,4,6,18,19,20,9,10,3,23,24,25,26,27);\n\nSELECT * FROM activities WHERE uuid_to_bin('7be372e2-1916-4d79-a2f3-ca3db1346db3') = uuid;\n\nselect * from crm_fields;\nselect * from crm_layout_entities;\n\nSELECT * FROM teams WHERE name LIKE '%Optable%';\n\n# *************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Teamtailor%'; # 109, 218, 13969\nSELECT * FROM crm_configurations WHERE id = 218;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 109\nand sa.provider = 'salesforce';\nSELECT * FROM activities WHERE uuid_to_bin('675eeaeb-5681-42db-90bc-54c07a604408') = uuid; # 28655939\nSELECT * FROM crm_field_data WHERE activity_id = 28655939;\nSELECT * FROM crm_fields WHERE id in (94491,94493,94498);\n\nselect * from teams where crm_id IS NULL;\n\nSELECT * FROM activities WHERE uuid_to_bin('71aa8a0c-9652-4ff6-bee7-d98ae60abef6') = uuid;\n\n# *************************************************************************************************\nselect * from team_domains where team_id = 399;\nSELECT * FROM teams WHERE name LIKE '%Rydoo%'; # 399, 318, 13207\n\nselect * from calendar_events where id = 5163781;\nSELECT * FROM activities WHERE uuid_to_bin('be2cbc52-7fda-46a0-9ae0-25d9553eafc0') = uuid; # 29443896\nSELECT * FROM participants WHERE activity_id = 29443896;\nselect * from contacts where crm_configuration_id = 318 and email = 'marianne.westeng@strawberry.no';\nselect * from leads where crm_configuration_id = 318 and email = 'marianne.westeng@strawberry.no';\n\nselect * from activities where user_id = 14937 order by created_at ;\n\nselect * from users where id = 14937;\n\nselect * from contacts where crm_configuration_id = 318 and email LIKE '%@strawberry.se';\nselect * from opportunities where crm_configuration_id = 318 and crm_provider_id = '006Sf00000D1WOAIA3';\n\nselect * from activities a join participants p on a.id = p.activity_id\nwhere crm_configuration_id = 318 and a.updated_at > '2025-06-23T08:18:43Z';\n\n# *************************************************************************************************\nSELECT * FROM opportunities WHERE team_id = 379 and crm_provider_id = '39334518886';\nSELECT * FROM opportunities WHERE team_id = 379 order by id desc;\nSELECT * FROM teams WHERE id = 379;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 379 and sociable_id = 13852\nand sa.provider = 'hubspot';\n\nSELECT * FROM crm_configurations WHERE id = 307;\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 307;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1027;\nSELECT * FROM crm_fields WHERE crm_configuration_id = 307\n and id IN (144750,144855,145158,155227);\n\nSELECT * FROM activities;\n\n\nselect * from activities\nwhere created_at > '2025-07-01 00:00:00'\n# and created_at < '2025-08-01 00:00:00'\nand type not in ('email-outbound', 'email-inbound')\nand account_id is null\nand contact_id is null\nand lead_id is null\nand opportunity_id is not null\n;\nSELECT * FROM activities WHERE id IN (25344155, 25344296, 25501909, 28692187);\nSELECT * FROM crm_configurations WHERE id in (335,301,200);\n\nselect * from crm_fields where crm_configuration_id = 230 and crm_provider_id = 'Age2__c';\n\nSELECT * FROM teams WHERE name LIKE '%Resights%';\nselect * from crm_fields where crm_configuration_id = 1 and object_type = 'opportunity';\n\nselect * from crm_configurations where provider = 'bullhorn'; # 344\nselect * from teams where id IN (442);\n\nselect * from activities\nwhere crm_configuration_id = 177\nand provider = 'amazon-connect'\n order by id desc;\n# and source <> 'gong';\n\nselect * from activity_providers where provider = 'amazon-connect';\n\nSELECT * FROM activities WHERE uuid_to_bin('cec1993b-a7e5-4164-b74d-d680ea51d2f2') = uuid;\n\n\nselect * from crm_configurations where store_transcript = 1;\nSELECT * FROM teams WHERE id IN (80);\n\n# *************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Sedna%'; # 277, 213, 12594\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 277\nand sa.provider = 'salesforce';\n\nselect * from activities where crm_configuration_id = 213 and account_id = 2511502;\n\nselect * from crm_configurations where id = 213;\n\nSELECT * FROM activities WHERE uuid_to_bin('35aa790a-8569-4544-8268-66f9a4a26804') = uuid; # 33981604\nSELECT * FROM participants WHERE activity_id = 33981604;\nSELECT * FROM crm_fields WHERE crm_configuration_id = 337 and object_type = 'task';\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 431\nand sa.provider = 'salesforce';\nSELECT * FROM activities WHERE uuid_to_bin('b5476c7d-19a8-491b-869d-676ea1e857b6') = uuid; # 33997223\nselect * from activity_summary_logs where activity_id = 33997223;\nselect * from activity_notes where activity_id = 33997223;\n\n# ***********************************\nSELECT * FROM teams WHERE name LIKE '%Abode%';\n\n\nselect * from features;\nselect * from teams t\nwhere t.status = 'active'\nand id NOT IN (select team_id from team_features where feature_id = 9)\n;\n\n\nselect * from playbook_layouts where playbook_id = 1725;\nSELECT * FROM activities WHERE uuid_to_bin('65cc283c-4849-49e6-927f-4c281c8fea19') = uuid; # 34297473\nselect * from teams where id = 318;\nselect * from crm_configurations where team_id = 318;\nselect * from playbooks where team_id = 318;\nSELECT * FROM crm_layouts where crm_configuration_id = 381;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1259;\nSELECT * FROM crm_fields WHERE id IN (192938,192936,192939);\n\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1266;\nSELECT * FROM crm_fields WHERE id IN (192980,192991,192997,192998,193064,193067);\n\nSELECT * FROM activities WHERE uuid_to_bin('a902289b-285c-48eb-9cc2-6ad6c5d938f5') = uuid; # 34297533\n\n\n\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 927;\nSELECT * FROM crm_fields WHERE id IN (131668,131669,131670,131671,131676,131797);\n\nSELECT * FROM teams WHERE name LIKE '%Peripass%'; # 351, 281, 12124\nselect * from crm_layouts where crm_configuration_id = 281;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 927;\nselect * from crm_fields where crm_configuration_id = 281 and id in (131668,131669,131670,131671,131676,131797);\nselect * from opportunities where crm_configuration_id = 281;\n\nSELECT * FROM activities WHERE id IN (34211315, 34130075);\nSELECT * FROM crm_field_data WHERE object_id IN (34211315, 34130075);\n\nselect cf.crm_configuration_id, cle.crm_layout_id, cle.id, cf.id from crm_field_data cfd\njoin crm_layout_entities cle on cle.id = cfd.crm_layout_entity_id\njoin crm_fields cf on cle.crm_field_id = cf.id\nwhere cf.deleted_at IS NOT NULL\nGROUP BY cle.id, cf.id;\n\nselect * from crm_layouts where id IN (355);\nselect u.email, t.crm_id, t.* from teams t\njoin users u on u.id = t.owner_id\nwhere crm_id IN (97);\n\nSELECT * FROM crm_fields WHERE id = 96492;\n\nselect * from permissions;\nselect * from permission_role where permission_id = 247;\nselect * from roles;\n\nselect * from migrations;\n# *****************************************************************\nSELECT * FROM activities WHERE uuid_to_bin('291e3c21-11cc-4728-aee7-6e4bedf86d72') = uuid; # 34262174\nSELECT * FROM crm_configurations WHERE id = 301;\nSELECT * FROM teams WHERE id = 343;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 343\nand sa.provider = 'hubspot';\n\nselect * from participants where activity_id = 34262174;\n\nselect * from contacts where crm_configuration_id = 301 and id = 6976326;\nselect * from accounts where crm_configuration_id = 301 and id IN (4647626, 4815829); # 30761335403\n\nselect * from activity_summary_logs where activity_id = 34262174;\n\nselect * from users where status = 1 AND timezone = 'EST';\n\n# ****************************************************************************\nSELECT * FROM users WHERE id = 13869;\nSELECT * FROM crm_configurations WHERE id = 320;\nSELECT * FROM teams WHERE id = 401;\n\nSELECT * FROM activities WHERE uuid_to_bin('2228c16f-10be-48d5-90d4-67385219dc01') = uuid; # 29670601\n\nSELECT * FROM accounts WHERE id = 7761483;\nSELECT * FROM opportunities WHERE id = 6051814;\n\nSELECT * FROM teams WHERE name LIKE '%Seedlegals%';\n\n;select * from opportunities where updated_at > '2025-10-11' AND crm_provider_id = '34713761166';\n\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 177;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 577;\nSELECT * FROM crm_fields WHERE id IN (68458,68459,68480,68497,68524,68530,68554,68618,68662,68781,68810,68898,68981,69049,97467);\n\nSELECT t.id, crm.id, t.name, crm.sync_objects, crm.provider, crm.last_synced_at FROM crm_configurations crm join teams t on t.crm_id = crm.id\nwhere t.status = 'active' AND crm.provider = 'hubspot' AND crm.last_synced_at < '2025-10-22 00:00:00';\n\nSELECT * FROM activities WHERE uuid_to_bin('fa09449f-cba9-496a-b8f3-865cd3c72351') = uuid;\nSELECT * FROM crm_configurations where id = 184;\nSELECT * FROM teams WHERE id = 246;\nSELECT * FROM social_accounts WHERE sociable_id = 9259 and provider = 'hubspot';\n\nSELECT * FROM users WHERE email LIKE '%rhian.old@bud.co.uk%'; # 17700\nSELECT * FROM teams WHERE id = 551;\n\nSELECT * FROM crm_configurations WHERE id = 471;\nSELECT * FROM activities WHERE crm_configuration_id = 471 and crm_provider_id IS NOT NULL;\nSELECT * FROM crm_fields WHERE crm_configuration_id = 471;\nSELECT * FROM crm_fields WHERE id = 307260;\nSELECT * FROM crm_field_values WHERE crm_field_id = 307260;\n\nselect * from crm_layouts where crm_configuration_id = 471;\n\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1547;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1548;\n\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 551 and sa.provider = 'hubspot';\n\nSELECT * FROM teams WHERE name LIKE '%$PCS%';\n\n# ********************************************************************************************************\nselect * from crm_configurations crm\njoin teams t on t.crm_id = crm.id\nwhere t.status = 'active'\nand crm.provider = 'hubspot';\n\n# $slug = 'HUBSPOT_WEBHOOK_SYNC';\n# $team = Jiminny\\Models\\Team::find(2);\n# $feature = Feature::query()->where('slug', $slug)->first();\n# TeamFeature::query()->create(['feature_id' => $feature->getId(),'team_id' => $team->getId()]);\n\n# hubspot_webhook_metrics\n\nselect * from crm_configurations where id = 331; # 416\nSELECT * FROM teams WHERE id = 416;\nSELECT * FROM opportunities WHERE team_id = 190;\n\nSELECT * FROM teams WHERE name LIKE '%Lead Forensics%';\nSELECT sa.id,\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 190 and sa.provider = 'hubspot';\n\n\n\nSELECT * FROM teams WHERE name LIKE '%Rapaport%'; # 431, 337\nSELECT * FROM teams where id = 431;\nSELECT * FROM crm_configurations where team_id = 431;\nSELECT * FROM activity_providers where team_id = 431;\nSELECT * FROM activities where crm_configuration_id = 337 and type IN ('softphone', 'softphone-outbound')\nand provider NOT IN ('hubspot', 'aircall')\n# and telephony_provider_id = '019c1131-a22f-4792-b9ea-20adf6a02ed0'\norder by id desc;\nSELECT sa.id,\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 431 and sa.provider = 'salesforce';\n\nSELECT * FROM teams WHERE name LIKE '%BiP%'; # 401, 320\nSELECT * FROM teams where id = 401;\nSELECT * FROM crm_configurations where team_id = 401;\nSELECT * FROM activity_providers where team_id = 401;\nSELECT * FROM activities where crm_configuration_id = 320 and type IN ('softphone', 'softphone-outbound')\nand provider NOT IN ('hubspot', 'aircall')\n# and telephony_provider_id = '019c1131-a22f-4792-b9ea-20adf6a02ed0'\norder by id desc;\nSELECT sa.id,\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 401 and sa.provider = 'salesforce';\n\n\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 307; # 379 - Story Terrace Inc , portalId: 3921157\nSELECT * FROM contacts WHERE team_id = 379 and updated_at > '2026-01-31 11:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 379 and updated_at > '2026-02-01 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 379 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 379 and sa.provider = 'hubspot';\n\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 485; # 563 - LATUS Group (ad94d501-5d09-44fd-878f-ca3a9f8865c3) , portalId: 3904501\nSELECT * FROM opportunities WHERE team_id = 563 and updated_at > '2026-02-02 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 563 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 338; # 432 - Formalize , portalId: 9214205\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 432 and sa.provider = 'hubspot';\nSELECT * FROM opportunities WHERE team_id = 432 and updated_at > '2026-02-02 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 432 and updated_at > '2026-02-10 00:00:00' order by updated_at desc;\n\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 436; # 519 - Moxso , portalId: 25531989\nSELECT * FROM opportunities WHERE team_id = 519 and updated_at > '2026-02-02 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 519 and updated_at > '2026-02-04 11:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 96; # 119 - Nourish Care , portalId: 26617984\nSELECT * FROM opportunities WHERE team_id = 119 and updated_at > '2026-02-02 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 119 and updated_at > '2026-02-04 11:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 331; # 416 - The National College , portalId: 7213852\nSELECT * FROM opportunities WHERE team_id = 416 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 416 and updated_at > '2026-02-04 11:00:00' order by updated_at desc;\n\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 308; # 380 - Foodles , portalId: 7723616\nSELECT * FROM opportunities WHERE team_id = 380 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 380 and updated_at > '2026-02-06 10:30:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 379; # 471 - imat-uve , portalId: 9177354\nSELECT * FROM opportunities WHERE team_id = 471 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 471 and updated_at > '2026-02-06 10:30:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 465; # 545 - Spotler , portalId: 144759271\nSELECT * FROM opportunities WHERE team_id = 545 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 545 and updated_at > '2026-02-06 10:30:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 455; # 537 - indevis , portalId: 25666868\nSELECT * FROM opportunities WHERE team_id = 537 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 537 and updated_at > '2026-02-06 10:30:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 200; # 265 - Jobadder , portalId: 6426676\nSELECT * FROM opportunities WHERE team_id = 265 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 265 and updated_at > '2026-02-06 10:30:00' order by updated_at desc;\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 335; # 429 - Eletive , portalId: 6110563\nSELECT * FROM opportunities WHERE team_id = 429 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 429 and updated_at > '2026-02-09 10:30:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 363; # 456 - Global Group , portalId: 8901981\nSELECT * FROM opportunities WHERE team_id = 456 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 456 and updated_at > '2026-02-09 10:30:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 297; # 369 - Unbiased , portalId: 9229005\nSELECT * FROM opportunities WHERE team_id = 369 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 369 and updated_at > '2026-02-09 10:30:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 353; # 449 - Fuuse , portalId: 25781745\nSELECT * FROM opportunities WHERE team_id = 449 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 449 and updated_at > '2026-02-09 10:30:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 487; # 566 - Nimbus , portalId: 39982590\nSELECT * FROM opportunities WHERE team_id = 566 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 566 and updated_at > '2026-02-09 10:30:00' order by updated_at desc;\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 487;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1630;\nselect * from crm_fields where crm_configuration_id = 487 and\n(uuid_to_bin('4c6b2971-64d4-45b8-b377-427be758b5a5') = uuid or uuid_to_bin('59e368d8-65a0-4b77-b611-db37c99fbe68') = uuid);\nSELECT * FROM crm_field_values WHERE crm_field_id = 375177;\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 420; # 506 - voiio , portalId: 145629154\nSELECT * FROM opportunities WHERE team_id = 506 and updated_at > '2026-02-10 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 506 and updated_at > '2026-02-10 15:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 479; # 558 - Momice , portalId: 535962\nSELECT * FROM opportunities WHERE team_id = 558 and updated_at > '2026-02-10 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 558 and updated_at > '2026-02-10 15:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 59; # 80 - Storyclash GmbH , portalId: 4268479\nSELECT * FROM opportunities WHERE team_id = 80 and updated_at > '2026-02-10 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 80 and updated_at > '2026-02-10 15:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 175; # 203 - Team iAM , portalId: 5534732\nSELECT * FROM opportunities WHERE team_id = 203 and updated_at > '2026-02-10 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 203 and updated_at > '2026-02-10 15:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 368; # 460 - OneTouch Health , portalId: 5534732183355\nSELECT * FROM opportunities WHERE team_id = 460 and updated_at > '2026-02-10 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 460 and updated_at > '2026-02-10 15:00:00' order by updated_at desc;\n\n\n\nselect * from users where id = 29643;\nSELECT * FROM crm_field_values WHERE crm_field_id = 375177;\n# ********************************************************************\nSELECT * FROM teams WHERE name LIKE '%Buynomics%'; # 462, 482, 14910\nSELECT * FROM activities WHERE crm_configuration_id = 482\nand type NOT IN ('email-inbound', 'email-outbound')\n# and description like '%The call focused on understanding Welch%'\norder by id desc;\n\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 462 and sa.provider = 'salesforce';\n\nselect * from contacts where crm_configuration_id = 482 and name = 'Cyndall Hill'; # 15504749\nselect * from contacts where id = 10891096; # 482\nSELECT * FROM activities WHERE crm_configuration_id = 482\nand type NOT IN ('email-inbound', 'email-outbound')\nand contact_id = 15504749\norder by id desc;\n\nselect * from activities where id = 36793003; # 96cc7bc1-8622-4d27-92f4-baf664fc1a56, 00UOf00000PDdOXMA1\nselect * from transcription where id = 7646782;\nselect * from ai_prompts where transcription_id = 7646782;\n\n# ********************************************************************\nSELECT * FROM activities WHERE uuid_to_bin('7a8471a3-847e-4822-802b-ddf426bbc252') = uuid; # 37370018\nSELECT * FROM activity_summary_logs WHERE activity_id = 37370018;\nSELECT * FROM teams WHERE id = 555;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 555 and sa.provider = 'hubspot';\n\n# ********************************************************************\nSELECT * FROM activities WHERE uuid_to_bin('7c17b8aa-09df-4f85-a0f7-51f47afd712d') = uuid; # 37395250\nSELECT * FROM activities WHERE uuid_to_bin('14d60388-260d-494b-aa0d-63fdb1c78026') = uuid; # 37395250\n\nSELECT a.* FROM activities a JOIN crm_configurations c on c.id = a.crm_configuration_id\nwhere a.type IN ('softphone', 'softphone-outbound') and c.provider = 'hubspot'\nand a.provider NOT IN ('hubspot')\n# and a.provider IN ('salesloft')\n# and c.id NOT IN (70)\n# and a.duration > 30\n# and actual_start_time > '2026-02-05 00:00:00'\norder by a.id desc;\n\nSELECT * FROM activities WHERE id = 37549787;\nSELECT * FROM crm_profiles WHERE user_id = 17613;\n\nSELECT * FROM crm_configurations WHERE id = 70;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 93 and sa.provider = 'hubspot';\n\nSELECT asf.activity_search_id, asf.id, asf.value\nFROM activity_search_filters asf\nWHERE asf.filter = 'group_id'\nAND asf.value IN (\n SELECT CONCAT(\n HEX(SUBSTR(uuid, 5, 4)), '-',\n HEX(SUBSTR(uuid, 3, 2)), '-',\n HEX(SUBSTR(uuid, 1, 2)), '-',\n HEX(SUBSTR(uuid, 9, 2)), '-',\n HEX(SUBSTR(uuid, 11))\n )\n FROM groups\n WHERE deleted_at IS NOT NULL\n);\n\nSELECT * FROM crm_configurations WHERE id = 373; # KPSBremen.de 465 # - no social account\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 465 and sa.provider = 'hubspot';\n\nselect * from crm_configurations where id = 494;\n\nSELECT * FROM teams WHERE name LIKE '%splose%'; # 572, 495, 18708\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 572 and sa.provider = 'pipedrive';\n\nselect * from opportunities where team_id = 572\n# and name like '%Onebright%'\n# and is_closed = 1 and is_won = 0\n order by id desc;\n\n\nselect * from users where deleted_at is null and status = 2;\n\nselect * from contacts where id = 17900517;\nselect * from accounts where id = 10109838;\nselect * from opportunities where id = 6955880;\n\nselect * from opportunity_contacts where opportunity_id = 6955880;\nselect * from opportunity_contacts where contact_id = 17900517;\n\nselect * from contact_roles cr join crm_configurations crm on cr.crm_configuration_id = crm.id\nwhere crm.provider != 'salesforce';\n\nSELECT * FROM activities WHERE uuid_to_bin('adcb8331-5988-4353-834e-383a355abba2') = uuid; # 38056424, crm 104659682404\nselect * from teams where id = 456;\nSELECT * FROM crm_configurations WHERE id = 363;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 456 and sa.provider = 'hubspot';\n\nselect * from crm_layouts where crm_configuration_id = 363;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id IN (1203, 1204, 1635);\nSELECT * FROM crm_fields WHERE id IN (181536, 181538, 213455);\n\nSELECT * FROM teams WHERE name LIKE '%Electric%'; # 342, 272, 12767\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 342 and sa.provider = 'pipedrive';\nSELECT * FROM opportunities WHERE crm_configuration_id = 272 and name like 'NORTHUMBRIA POL%'; # and updated_at > '2025-07-01 00:00:00';\nSELECT * FROM opportunities WHERE crm_configuration_id = 272 order by remotely_created_at asc; # and updated_at > '2025-07-01 00:00:00';\nSELECT * FROM opportunities WHERE crm_configuration_id = 272 and updated_at > '2026-01-01 00:00:00';\nSELECT * FROM crm_fields WHERE crm_configuration_id = 272 and object_type = 'opportunity';\nSELECT * FROM crm_field_values WHERE crm_field_id = 127164;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 342 and sa.provider = 'pipedrive';\n\nSELECT * FROM teams WHERE id = 472;\nSELECT * FROM crm_configurations WHERE id = 380;\nselect * from activities where id = 38285673; # 38285673\nSELECT * FROM users WHERE id = 16942;\nSELECT * FROM groups WHERE id = 1964;\nSELECT * FROM playbooks WHERE id = 2033;\n\nselect * from teams where created_at > '2026-03-09';\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 499; # 1065\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1678;\n\nSELECT * FROM teams WHERE id = 575;\nselect * from opportunities where team_id = 575;\n\nSELECT * FROM activities WHERE uuid_to_bin('96b1261f-2357-49f9-ab38-23ce12008ea0') = uuid;\n\nselect * from contacts c\nwhere c.crm_configuration_id = 370 order by c.updated_at desc;\n\nSELECT * FROM participants where activity_id = 38833541;\nSELECT * FROM participants where activity_id = 39216301;\nSELECT * FROM activity_summary_logs where activity_id = 39216301;\nSELECT * FROM activities WHERE uuid_to_bin('c7d99fbe-1fb1-41f2-8f4d-52e2bf70e1e9') = uuid; # 38833541, crm 478116564181\nSELECT * FROM activities WHERE uuid_to_bin('2e6ff4d3-9faa-447a-a8c1-9acde4d885ae') = uuid; # 39216301, crm 480171536586\nselect * from crm_profiles where crm_configuration_id = 319 and crm_provider_id = 525785080;\nselect * from opportunities where crm_configuration_id = 319 and crm_provider_id = 410150124747;\nselect * from accounts where crm_configuration_id = 319 and crm_provider_id = 47150650569;\nselect * from contacts where crm_configuration_id = 319 and crm_provider_id IN ('665587441856', '742723347700');\n# owner 13236 525785080\n# contact 1 16779180 665587441856 - activity - Alex Howes alex@supportroom.com created 2026-01-26\n# contact 2 19247563 742723347700 - ash@supportroom.com 2026-03-24\n# company 4176133 47150650569\n# deal 7100953 410150124747\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 400 and sa.provider = 'hubspot';\n\nselect * from features;\nselect * from team_features where feature_id = 40;\n\nselect * from teams where id = 556; # owner: 18101, crm: 477\nselect * from crm_configurations where id = 477;\nSELECT * FROM users WHERE id = 18101;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 556 and sa.provider = 'integration-app';\n\nselect * from opportunities where id = 7594349;\nselect * from opportunity_stages where opportunity_id = 7594349 order by created_at desc;\nselect * from business_processes where id = 6024;\nselect * from business_process_stages where stage_id = 16352;\nselect * from business_process_stages where business_process_id = 6024;\nselect * from stages where team_id = 459;\nselect * from teams where id = 459;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 459 and sa.provider = 'hubspot';\n\nSELECT os.stage_id, s.crm_provider_id, s.name, COUNT(*) as cnt\nFROM opportunity_stages os\nJOIN stages s ON s.id = os.stage_id\nWHERE os.opportunity_id = 7594349\nGROUP BY os.stage_id, s.crm_provider_id, s.name\nORDER BY cnt DESC;\n\nSELECT s.id, s.crm_provider_id, s.name, s.team_id, s.crm_configuration_id\nFROM stages s\nJOIN business_process_stages bps ON bps.stage_id = s.id\nWHERE bps.business_process_id = 6024\nAND s.crm_provider_id = 'contractsent';\n\nselect * from stages where id IN (16352,20612,18281,7344,16378,16309,5036,15223,14535,6293,12098,11607)\n\nSELECT * FROM teams WHERE name LIKE '%Pulsar Group%'; # 472, 380, 15138, raza.gilani@vuelio.com\nselect * from playbooks where team_id = 472; # event 226147\nSELECT * FROM playbook_categories WHERE playbook_id = 2288;\nSELECT * FROM crm_fields WHERE id = 226147;\nSELECT * FROM crm_field_values WHERE crm_field_id = 226147;\n\nSELECT * FROM crm_configurations WHERE id = 380;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 472 and sa.provider = 'salesforce';","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Project","depth":3,"role_description":"text"},{"role":"AXButton","text":"Project","depth":3,"bounds":{"left":0.011968086,"top":0.047885075,"width":0.024268618,"height":0.024740623},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"New File or Directory…","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Expand Selected","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Collapse All","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Options","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
-7246725341180660992
|
2146738311620114029
|
click
|
accessibility
|
NULL
|
Project: faVsco.js, menu
#11894 on JY-18909-automa Project: faVsco.js, menu
#11894 on JY-18909-automated-reports-ask-jiminny, menu
Start Listening for PHP Debug Connections
RequestGenerateAskJiminnyReportJobTest
Run 'RequestGenerateAskJiminnyReportJobTest'
Debug 'RequestGenerateAskJiminnyReportJobTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
2
1
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Services\Kiosk\AutomatedReports;
use Jiminny\Component\ActivitySearch\FilterDefinition\ActivityActualDate;
use Jiminny\Component\ActivitySearch\FilterDefinition\ActivityUpdatedDate;
use Jiminny\Component\ActivitySearch\FilterDefinition\DealInsights\ClosingPeriodFilter;
use Jiminny\Component\ActivitySearch\Service\ActivitySearch;
use Jiminny\Models\Activity\Search;
use Jiminny\Models\User;
use Jiminny\Repositories\ElasticActivityRepository;
use Jiminny\VO\Repository\OnDemandActivitySearch\Criteria;
use Psr\Log\LoggerInterface;
class AskJiminnyReportActivityService
{
private const int DEFAULT_TOP_ACTIVITIES_COUNT = 100;
private const array DATE_FILTER_KEYS = [
ActivityActualDate::PARAM_START_DATE,
ActivityActualDate::PARAM_END_DATE,
ActivityUpdatedDate::PARAM_UPDATED_FROM,
ActivityUpdatedDate::PARAM_UPDATED_TO,
ClosingPeriodFilter::KEY_START_DATE,
ClosingPeriodFilter::KEY_END_DATE,
];
public function __construct(
private readonly ActivitySearch $activitySearch,
private readonly ElasticActivityRepository $elasticRepository,
private readonly LoggerInterface $logger,
) {
}
/**
* Fetch activity IDs for a saved search, passing its filters as-is to Criteria.
* Date filters stored on the saved search are excluded; if no other filters exist,
* no date constraint is applied — matching the behaviour of getContextForAskAnythingByFilter.
*
* @return string[] Activity IDs
*/
public function getActivityIdsForSavedSearch(
Search $savedSearch,
User $user,
): array {
$requestParams = $this->buildRequestParamsFromSearch($savedSearch, $user);
$criteria = Criteria::createFromRequest(
array_merge($requestParams, [
'limit' => self::DEFAULT_TOP_ACTIVITIES_COUNT,
'page' => 1,
'sequence_number' => 1,
]),
$user->getTimezone()
);
$filterSet = $this->activitySearch->getOnDemandPageFilterSet($criteria, $user);
$activityIds = $this->elasticRepository->onDemandSearchIdsOnly($user, $criteria, $filterSet);
$this->logger->info('[AskJiminnyReport] Fetched activity IDs for saved search', [
'saved_search_id' => $savedSearch->getId(),
'user_id' => $user->getId(),
'activity_count' => count($activityIds),
]);
return $activityIds;
}
private function buildRequestParamsFromSearch(Search $savedSearch, User $user): array
{
$params = [];
$arrayFilterKeys = $this->activitySearch->getArrayFilterKeys($user);
foreach ($savedSearch->getFilters() as $filter) {
$key = $filter->getFilterProperty();
$value = $filter->getFilterValue();
if (in_array($key, self::DATE_FILTER_KEYS, true)) {
continue;
}
if (isset($params[$key])) {
$params[$key][] = $value;
} elseif (in_array($key, $arrayFilterKeys, true)) {
$params[$key] = [$value];
} else {
$params[$key] = $value;
}
}
return $params;
}
}
Execute
Explain Plan
Browse Query History
View Parameters
Open Query Execution Settings…
In-Editor Results
Tx: Auto
Cancel Running Statements
Playground
jiminny
Sync Changes
Hide This Notification
Code changed:
Hide
27
9
23
3
105
Previous Highlighted Error
Next Highlighted Error
SELECT * FROM team_features where team_id = 1;
SELECT * FROM teams WHERE name LIKE '%Vixio%'; # 340,270,11922
SELECT * FROM users WHERE team_id = 340; # 12015
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 340
and sa.provider = 'salesforce';
# and sa.provider = 'salesloft';
select * from crm_fields where crm_configuration_id = 270 and object_type = 'event';
# 125558 - Event Type - Event_Type__c
# 125552 - Event Status - Event_Status__c
SELECT * FROM sidekick_settings WHERE team_id = 340;
SELECT * FROM crm_field_values WHERE crm_field_id in (125552);
select * from activities where crm_configuration_id = 270
and type = 'conference' and crm_provider_id IS NOT NULL
and actual_start_time > '2024-09-16 09:00:00' order by scheduled_start_time;
SELECT * FROM activities WHERE id = 20871677;
SELECT * FROM crm_field_data WHERE activity_id = 20871677;
select * from crm_layouts where crm_configuration_id = 270;
select * from crm_layout_entities where crm_layout_id in (886,887);
SELECT * FROM crm_configurations WHERE id = 270;
select * from playbooks where team_id = 340; # 1514
select * from groups where team_id = 340;
SELECT * FROM crm_fields WHERE id IN (125393, 125401);
select g.name as 'team name', p.name as 'playbook name', f.label as 'activity type field' from groups g
join playbooks p on g.playbook_id = p.id
join crm_fields f on p.activity_field_id = f.id
where g.team_id = 340;
SELECT * FROM activities WHERE uuid_to_bin('0c180357-67d2-419e-a8c3-b832a3490770') = uuid; # 20448716
select * from crm_field_data where object_id = 20448716;
select * from activities where crm_configuration_id = 270 and provider = 'salesloft' order by id desc;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%CybSafe%'; # 343,273,12008
select * from opportunities where team_id = 343;
select * from opportunities where team_id = 343 and crm_provider_id = '18099102526';
select * from opportunities where team_id = 343 and account_id = 945217482;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 343
and sa.provider = 'hubspot';
select * from accounts where team_id = 343 order by name asc;
select * from stages where crm_configuration_id = 273 and type = 'opportunity';
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Voyado%'; # 353,283,12143
SELECT * FROM activities WHERE crm_configuration_id = 283 and account_id = 3777844 order by id desc;
SELECT * FROM accounts WHERE team_id = 353 AND name LIKE '%Salesloft%';
SELECT * FROM activities WHERE id = 20717903;
select * from participants where activity_id IN (20929172,20928605,20928468,20926272,20926271,20926270,20926269,20916499,20916454,20916436,20916435,20900015,20900014,20900013,20897312,20897243,20897241,20897237,20897232,20897229,20893648,20893231,20893230,20893229,20893228,20889784,20885039,20885038,20885037,20885036,20885035,20882728,20882708,20882703,20882702,20869828,20869811,20869806,20869801,20869799,20869798,20869796,20869795,20869794,20869761,20869760,20869759,20868688,20868687,20850340,20847195,20841710,20833967,20827021,20825307,20825305,20825297,20824615,20824400,20823927,20821760,20795588,20794233,20794057,20793710,20785811,20781789,20781394,20781307,20762651,20758453,20758282,20757323,20756643,20756636,20756629,20756627,20756606,20756605,20756604,20756603,20756602,20756600,20756599,20756598,20756595,20756594,20756589,20756587,20756577,20756573,20748918,20748386,20748385,20748384,20748383,20748382,20748381,20748380,20748379,20748377,20748375,20748373,20743301,20717905,20717904,20717903,20717901,20717899);
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 353
and sa.provider = 'salesforce';
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%modern world business solutions%'; # 345,275,12016, [EMAIL]
SELECT * FROM activities WHERE uuid_to_bin('3921d399-3fef-4609-a291-b0097a166d43') = uuid;
# id: 20940638, user: 12022, contact: 5305871
SELECT * FROM activity_summary_logs WHERE activity_id = 20940638;
select * from contacts where team_id = 345 and crm_provider_id = '30891432415' order by name asc; # 5305871
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 345
and sa.provider = 'hubspot';
select * from users where team_id = 345 and id = 12022;
SELECT * FROM crm_profiles WHERE user_id = 12022;
SELECT * FROM participants WHERE activity_id = 20940638;
SELECT * FROM users u
JOIN crm_profiles cp ON u.id = cp.user_id
WHERE u.team_id = 345;
select * from contacts where team_id = 345 and crm_provider_id = '30880813535' order by name desc; # 5305871
select * from team_features where team_id = 345;
SELECT * FROM activities WHERE uuid_to_bin('11701e2d-2f82-4dab-a616-1db4fad238df') = uuid; # 21115197
SELECT * FROM participants WHERE activity_id = 20897406;
SELECT * FROM activities WHERE uuid_to_bin('63ba55cd-1abc-447d-83da-0137000005b7') = uuid; # 20953912
SELECT * FROM activities WHERE crm_configuration_id = 275 and provider = 'ringcentral' and title like '%1252629100%';
SELECT * FROM activities WHERE id = 20946641;
SELECT * FROM crm_profiles WHERE user_id = 10211;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Lunio%'; # 120,97,10984, [EMAIL]
SELECT * FROM opportunities WHERE crm_configuration_id = 97 and crm_provider_id = '006N1000006c5PpIAI';
select * from stages where crm_configuration_id = 97 and type = 'opportunity';
select * from opportunities where team_id = 120;
select * from crm_configurations crm join teams t on crm.id = t.crm_id
where 1=1
AND t.current_billing_plan IS NOT NULL
AND crm.auto_sync_activity = 0
and crm.provider = 'hubspot';
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Exclaimer%'; # 270,205,10053,[EMAIL]
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 270
and sa.provider = 'salesforce';
SELECT * FROM activities WHERE uuid_to_bin('b54df794-2a9a-4957-8d80-09a600ead5f8') = uuid; # 21637956
SELECT * FROM crm_profiles WHERE user_id = 11446;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Cygnetise%'; # 372,300,12554, [EMAIL]
select * from playbooks where team_id = 372;
select * from crm_fields where crm_configuration_id = 300 and object_type = 'event'; # 141340
SELECT * FROM crm_field_values WHERE crm_field_id = 141340;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 372
and sa.provider = 'salesforce';
select * from crm_profiles where crm_configuration_id = 300;
SELECT * FROM crm_configurations WHERE team_id = 372;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Planday%'; # 291,242,11501,[EMAIL]
SELECT * FROM opportunities WHERE team_id = 291 and crm_provider_id = '006bG000005DO86QAG'; # 3207756
select * from crm_field_data where object_id = 3207756;
SELECT * FROM crm_fields WHERE id = 111834;
select f.id, f.crm_provider_id AS field_name, f.label, fd.object_id AS dealId, fd.value
FROM crm_fields f
JOIN crm_field_data fd ON f.id = fd.crm_field_id
WHERE f.crm_configuration_id = 242
AND f.object_type = 'opportunity'
AND fd.object_id IN (3207756)
ORDER BY fd.object_id, fd.updated_at;
SELECT * FROM crm_configurations WHERE auto_connect = 1;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Tour%'; # 187,209,8150,[EMAIL]
select * from group_deal_risk_types drgt join groups g on drgt.group_id = g.id
where g.team_id = 187;
select * from `groups` where team_id = 187;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 187
and sa.provider = 'salesforce';
# Destination - 98870 - Destination__c
# Stage - 79014 - StageName
# Land Arrangement - 98856 - Land_Arrangement__c
# Flight - 98848 - Flight__c
# Last activity date - 98812 - LastActivityDate
# Last modified date - 98809 - LastModifiedDate
# Last inbound mail timestamp - 99151 - Last_Inbound_Mail_Timestamp__c
# next call - 98864 - Next_Call__c
select * from crm_fields where crm_configuration_id = 209 and object_type = 'opportunity';
SELECT * FROM crm_layouts WHERE crm_configuration_id = 209;
SELECT * FROM crm_layout_entities WHERE crm_layout_id = 682;
select * from opportunities where team_id = 187 and name LIKE'%Muriel Sal%';
select * from opportunities where team_id = 187 and user_id = 9951 and is_closed = 0;
select * from activities where opportunity_id = 3538248;
SELECT * FROM crm_profiles WHERE user_id = 8150;
select * from deal_risks where opportunity_id = 3538248;
select * from teams where crm_id IS NULL;
SELECT opp.id AS opportunity_id,
u.group_id AS group_id,
MAX(
CASE
WHEN a.type IN ("sms-inbound", "sms-outbound") THEN a.created_at
ELSE a.actual_end_time
END) as last_date
FROM opportunities opp
left join activities a on a.opportunity_id = opp.id
inner join users u on opp.user_id = u.id
where opp.user_id IN (9951)
AND opp.is_closed = 0
and a.status IN ('completed', 'received', 'delivered') OR a.status IS NULL
group by opp.id;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Cybsafe%'; # 343,301,12008,[EMAIL]
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 343
and sa.provider = 'hubspot';
SELECT * FROM crm_profiles WHERE crm_configuration_id = 301;
SELECT * FROM contacts WHERE id = 6612363;
SELECT * FROM accounts WHERE id = 4235676;
SELECT * FROM opportunities WHERE crm_configuration_id = 301 and crm_provider_id = 32983784868;
select * from opportunity_stages where opportunity_id = 4503759;
# SELECT * FROM opportunities WHERE id = 4569937;
select * from activities where crm_configuration_id = 301;
SELECT * FROM activities WHERE uuid_to_bin('d3b2b28b-c3d0-4c2d-8ed0-eef42855278a') = uuid; # 26330370
SELECT * FROM participants WHERE activity_id = 26330370;
SELECT * FROM teams WHERE id = 375;
select * from playbooks where team_id = 375;
select * from stages where crm_configuration_id = 301 and type = 'opportunity';
select * from teams;
select * from contact_roles;
SELECT * FROM opportunities WHERE team_id = 343 and user_id = 12871 and close_date >= '2024-11-01';
select * from users u join crm_profiles cp on cp.user_id = u.id where u.team_id = 343;
SELECT * FROM crm_field_data WHERE object_id = 3771706;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 343
and sa.provider = 'hubspot';
SELECT * FROM crm_fields WHERE crm_configuration_id = 301 and object_type = 'opportunity'
and crm_provider_id LIKE "%traffic_light%";
SELECT * FROM crm_field_values WHERE crm_field_id IN (144020,144048,144111,144113,144126,144481,144508,144531);
SELECT fd.* FROM opportunities o
JOIN crm_field_data fd ON o.id = fd.object_id
WHERE o.team_id = 343
# and o.user_id IS NOT NULL
and fd.crm_field_id IN (144020,144048,144111,144113,144126,144481,144508,144531)
and fd.value != ''
order by value desc
# group by o.id
;
SELECT * FROM opportunities WHERE id = 3769843;
SELECT * FROM teams WHERE name LIKE '%Tour%'; # 187,209,8150, [EMAIL]
SELECT * FROM crm_layouts WHERE crm_configuration_id = 209;
SELECT * FROM crm_layout_entities WHERE crm_layout_id = 682;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Funding Circle%'; # 220,177,8603,[EMAIL]
SELECT * FROM activities WHERE uuid_to_bin('7a40e99b-3b37-4bb1-b983-325b81801c01') = uuid; # 23139839
SELECT * FROM opportunities WHERE id = 3855992;
SELECT * FROM users WHERE name LIKE '%Angus Pollard%'; # 8988
SELECT * FROM teams WHERE name LIKE '%Story Terrace%'; # 379, 307, 12894
SELECT * FROM crm_fields WHERE crm_configuration_id = 307 and object_type != 'opportunity';
select * from contacts where team_id = 379 and name like '%bebro%'; # 5874411, crm: 77229348507
SELECT * FROM crm_field_data WHERE object_id = 5874411;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 379
and sa.provider = 'hubspot';
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%mentio%'; # 117, 94, 6371, [EMAIL]
SELECT * FROM activities WHERE uuid_to_bin('82939311-1af0-4506-8546-21e8d1fdf2c1') = uuid;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Tourlane%'; # 187, 209, 8150, [EMAIL]
SELECT * FROM opportunities WHERE team_id = 187 and crm_provider_id = '006Se000008xfvNIAQ'; # 3537793
select * from generic_ai_prompts where subject_id = 3537793;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Lunio%'; # 120, 97, 10984, [EMAIL]
SELECT * FROM crm_configurations WHERE id = 97;
SELECT * FROM crm_layouts WHERE crm_configuration_id = 97;
SELECT * FROM crm_layout_entities WHERE crm_layout_id = 355;
SELECT * FROM crm_fields WHERE id = 32682;
select cfd.value, o.* from opportunities o
join crm_field_data cfd on o.id = cfd.object_id and cfd.crm_field_id = 32682
where team_id = 120
and cfd.value != ''
;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 120
and sa.provider = 'salesforce';
select * from opportunities where team_id = 120 and crm_provider_id = '006N1000007X8MAIA0';
SELECT * FROM crm_field_data WHERE object_id = 2313439;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE id = 410;
SELECT * FROM teams WHERE name LIKE '%Local Business Oxford%';
select * from scorecards where team_id = 410;
select * from scorecard_rules;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Funding%'; # 220, 177, 8603, [EMAIL]
select * from activities a
join opportunities o on a.opportunity_id = o.id
join users u on o.user_id = u.id
where a.crm_configuration_id = 177 and a.type LIKE '%email-out%'
# and a.actual_end_time > '2024-12-16 00:00:00'
# and o.remotely_created_at > '2024-12-01 00:00:00'
# and u.group_id = 1014
and u.id = 9021
order by a.id desc;
SELECT * FROM opportunities WHERE id in (3981384,4017346);
SELECT * FROM users WHERE team_id = 220 and id IN (8775, 11435);
select * from users where id = 9021;
select * from inboxes where user_id = 9021;
select * from inbox_emails where inbox_id = 1349 and email_date > '2024-12-18 00:00:00';
select * from email_messages where team_id = 220
and orig_date > '2024-12-16 00:00:00' and orig_date < '2024-12-19 00:00:00'
and subject LIKE '%Personal%'
# and 'from' = '[EMAIL]'
;
select * from activities a
join opportunities o on a.opportunity_id = o.id
where a.user_id = 9021 and a.type LIKE '%email-out%'
and a.actual_end_time > '2024-12-18 00:00:00'
and o.user_id IS NOT NULL
and o.remotely_created_at > '2024-12-01 00:00:00'
order by a.id desc;
SELECT * FROM opportunities WHERE team_id = 220 and name LIKE '%Right Car move Limited%' and id = 3966852;
select * from activities where crm_configuration_id = 177 and type LIKE '%email%' and opportunity_id = 3966852 order by id desc;
select * from team_settings where name IN ('useCloseDate');
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Hurree%'; # 104, 81, 6175, [EMAIL]
SELECT * FROM opportunities WHERE team_id = 104 and name = 'PropOp';
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 104
and sa.provider = 'hubspot';
select * from crm_configurations where last_synced_at > '2025-01-19 01:00:00'
select * from teams where crm_id IS NULL;
select t.name as 'team', u.name as 'owner', u.email, u.phone
from teams t
join activity_providers ap on t.id = ap.team_id
join users u on t.owner_id = u.id
where 1=1
and t.status = 'active'
and ap.is_enabled = 1
# and u.status = 1
and ap.provider = 'ms-teams';
select * from crm_configurations where provider = 'bullhorn'; # 344
SELECT * FROM teams WHERE id = 442; # 14293
select * from users where team_id = 442;
select * from social_accounts sa where sa.sociable_id = 14293;
select * from invitations where team_id = 442;
# [PASSWORD_DOTS]
SELECT * FROM users WHERE email LIKE '%[EMAIL]%'; # 14022
SELECT * FROM teams WHERE id = 429;
select * from opportunities where team_id = 429 and crm_provider_id IN (16157415775, 22246219645);
select * from activities where opportunity_id in (4340436,4353519);
select * from transcription where activity_id IN (25630961,25381771);
select * from generic_ai_prompts where subject_id IN (4353519);
SELECT
a.id as activity_id,
a.opportunity_id,
a.type as activity_type,
a.language,
CONCAT(a.title, a.description) AS mail_content,
e.from AS mail_from,
e.to AS mail_to,
e.subject AS mail_subject,
e.body AS mail_body,
p.type as prompt_type,
p.status as prompt_status,
p.content AS prompt_content,
a.actual_start_time as created_at
FROM activities a
LEFT JOIN ai_prompts p ON a.transcription_id = p.transcription_id AND p.deleted_at IS NULL
LEFT JOIN email_messages e ON a.id = e.activity_id
WHERE a.actual_start_time > '2024-01-01 00:00:00'
AND a.opportunity_id IN (4353519)
AND a.status IN ('completed', 'received', 'delivered')
AND a.deleted_at IS NULL
AND a.type NOT IN ('sms-inbound', 'sms-outbound')
ORDER BY a.opportunity_id ASC, a.id ASC;
SELECT * FROM users WHERE name LIKE '%George Fierstone%'; # 14293
SELECT * FROM teams WHERE id = 442;
SELECT * FROM crm_configurations WHERE id = 344;
select * from team_features where team_id = 442;
select * from groups where team_id = 442;
select * from playbooks where team_id = 442;
select * from playbook_categories where playbook_id = 1729;
select * from crm_fields where crm_configuration_id = 344 and id = 172024;
SELECT * FROM crm_field_values WHERE crm_field_id = 172024;
select * from crm_layouts where crm_configuration_id = 344;
select * from playbook_layouts where playbook_id = 1729;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Learning%'; # 260, 221, 9444
select s.*
# , s.sent_at, u.name, a.*
from activity_summary_logs s
inner join activities a on a.id = s.activity_id
inner join users u on u.id = a.user_id
where a.crm_configuration_id = 356
and s.sent_at > date_sub(now(), interval 60 day)
order by a.actual_end_time desc;
select * from activities a
# inner join activity_summary_logs s on s.activity_id = a.id
where a.crm_configuration_id = 356 and a.actual_end_time > date_sub(now(), interval 60 day)
# and a.crm_provider_id is not null
# and provider <> 'ringcentral'
and status = 'completed'
order by a.actual_end_time desc;
select * from teams order by id desc; # 17328, 32, 17830, [EMAIL]
SELECT * FROM users;
SELECT * FROM users where team_id = 260 and status = 1; # 201 - 150 active
SELECT * FROM teams WHERE id = 260;
select * from team_settings where team_id = 260;
select * from crm_configurations where team_id = 260;
SELECT * FROM crm_layouts WHERE crm_configuration_id = 356;
SELECT * FROM crm_layout_entities WHERE crm_layout_id = 1184;
select * from accounts where crm_configuration_id = 221 order by id desc; # 7000
select * from leads where crm_configuration_id = 221 order by id desc; # 0
select * from contacts where crm_configuration_id = 221 order by id desc; # 200 000
select * from opportunities where crm_configuration_id = 221 order by id desc; # 0
select * from crm_profiles where crm_configuration_id = 221 order by id desc; # 23
select * from crm_fields where crm_configuration_id = 221;
select * from crm_field_values where crm_field_id = 5302 order by id desc;
select * from crm_layouts where crm_configuration_id = 221 order by id desc;
select * from stages where crm_configuration_id = 221 order by id desc;
select * from accounts where crm_configuration_id = 356 order by id desc; # 7000
select * from leads where crm_configuration_id = 356 order by id desc; # 0
select * from contacts where crm_configuration_id = 356 order by id desc; # 200 000
select * from opportunities where crm_configuration_id = 356 order by id desc; # 0
select * from crm_profiles where crm_configuration_id = 356 order by id desc; # 23
select * from crm_fields where crm_configuration_id = 356;
select * from crm_field_values where crm_field_id = 5302 order by id desc;
select * from crm_layouts where crm_configuration_id = 356 order by id desc;
select * from stages where crm_configuration_id = 356 order by id desc;
select * from playbooks where team_id = 260 order by id desc; # 4 (2 deleted)
select * from groups where team_id = 260 order by id desc; # 27 groups, (2 deleted)
select * from playbook_layouts where playbook_id IN (1410,1409,1276,1254); # 4
select ce.* from calendars c
join users u on c.user_id = u.id
join calendar_events ce on c.id = ce.calendar_id
where u.team_id = 260
and (ce.start_time > '2025-02-21 00:00:00')
;
# calendar events 1207
#
select * from opportunities where team_id = 260;
SELECT * FROM crm_field_data WHERE object_id = 4696496;
select * from activities where crm_configuration_id = 356 and crm_provider_id IS NOT NULL;
select * from activities where crm_configuration_id IN (221) and provider NOT IN ('ms-teams', 'uploader', 'zoom-bot')
# and type = 'conference' and status = 'scheduled' and activities.is_internal = 0
and created_at > '2024-03-01 00:00:00'
order by id desc; # 880 000, ringcentral, avaya
SELECT * FROM participants WHERE activity_id = 26371744;
# all activities 942 000 +
# conference 7385 - scheduled 984 - external 343
select * from activities where id = 26321812;
select * from participants where activity_id = 26321812;
select * from participants where activity_id in (26414510,26414514,26414516,26414604,26414653,26414655);
select * from leads where id in (720428,689175,731546,645866,621037);
select * from users where id = 13841;
select * from opportunities where user_id = 9541;
select * from stages where id = 15900;
select * from accounts where
# id IN (4160055,5053725,4965303,4896434)
id in (4584518,3249934,3218025,3891133,3399450,4172999,4485161,3101785,4587203,3070816,2870343,2870341,3563940,4550846,3424464,3249963,2870342)
;
select * from activities where id = 26654935;
SELECT * FROM opportunities WHERE id = 4803458;
SELECT * FROM opportunities where team_id = 260 and user_id = 13841 AND stage_id = 15900;
SELECT id, uuid, provider, type, lead_id, account_id, contact_id, opportunity_id, stage_id, status, recording_state, title, actual_start_time, actual_end_time
FROM activities WHERE user_id = 13841 AND opportunity_id IN (4729783, 4731717, 4731726, 4732064, 4732849, 4803458, 4813213);
SELECT DISTINCT
o.id, o.stage_id, s.name, a.title,
a.*
FROM activities a
# INNER JOIN tracks t ON a.id = t.activity_id
INNER JOIN users u ON a.user_id = u.id
INNER JOIN teams team ON u.team_id = team.id
INNER JOIN groups g ON u.group_id = g.id
INNER JOIN opportunities o ON a.opportunity_id = o.id
INNER JOIN stages s ON o.stage_id = s.id
WHERE
a.crm_configuration_id = 356
AND a.status IN ('completed', 'failed')
AND a.recording_state != 'stopped'
# and a.user_id = 13841
AND u.uuid = uuid_to_bin('6f40e4b8-c340-4059-b4ac-1728e87ea99e')
AND team.uuid = uuid_to_bin('a607fba7-452e-4683-b2af-00d6cb52c93c')
AND g.uuid = uuid_to_bin('b5d69e40-24a0-4c16-810b-5fa462299f94')
AND a.type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')
# AND t.type IN ('audio', 'video')
AND (
(a.actual_start_time BETWEEN '2025-03-13 00:00:00' AND '2025-03-18 07:59:59')
OR
(
a.actual_start_time IS NULL
AND a.type IN ('sms-outbound', 'sms-inbound')
AND a.created_at BETWEEN '2025-03-13 00:00:00' AND '2025-03-18 07:59:59'
)
)
AND (
a.is_private = 0
OR (
a.is_private = 1
AND u.uuid = uuid_to_bin('6f40e4b8-c340-4059-b4ac-1728e87ea99e')
)
)
AND (
# s.id = 15900
s.uuid = uuid_to_bin('04ca1c26-c666-4268-a129-419c0acffd73')
OR s.uuid IS NULL -- Include records without opportunity stage
)
ORDER BY a.actual_end_time DESC;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Lead Forensics%'; # 190, 162, 8474, [EMAIL]
SELECT * FROM users WHERE team_id = 190;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 190
and sa.provider = 'hubspot';
select * from role_user where user_id = 8474;
select * from crm_configurations where provider = 'bullhorn';
SELECT * FROM opportunities WHERE uuid_to_bin('94578249-65ec-4205-90f2-7d1a7d5ab64a') = uuid;
SELECT * FROM users WHERE uuid_to_bin('26dbadeb-926f-4150-b11b-771b9d4c2f9a') = uuid;
SELECT * FROM opportunities WHERE id = 4732493;
select * from activities where opportunity_id = 4732493;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE id = 443; # 358, 14315, [EMAIL]
SELECT * FROM opportunities WHERE team_id = 443;
SELECT a.id, a.type, a.user_id, a.status, a.deleted_at, u.name, u.email, u.team_id as activity_team_id, u.status, u.deleted_at, t.name, t.status, s.team_id as stage_team_id
FROM activities AS a
JOIN stages AS s ON a.stage_id = s.id
JOIN users AS u ON u.id = a.user_id
JOIN teams AS t ON t.id = s.team_id
WHERE u.team_id <> s.team_id and t.id > 135;
SELECT
crm_configuration_id,
crm_provider_id,
COUNT(*) as duplicate_count,
GROUP_CONCAT(id) as stage_ids,
GROUP_CONCAT(name) as stage_names
FROM stages
GROUP BY crm_configuration_id, crm_provider_id
HAVING COUNT(*) > 1
ORDER BY duplicate_count DESC;
select * from stages where id IN (14898,14907);
select * from business_processes;
SELECT *
FROM crm_configurations
WHERE team_id IN (
SELECT team_id
FROM crm_configurations
GROUP BY team_id
HAVING COUNT(*) > 1
)
ORDER BY team_id;
SELECT *
FROM teams
WHERE crm_id IN (
SELECT crm_id
FROM teams
GROUP BY crm_id
HAVING COUNT(*) > 1
)
ORDER BY crm_id;
# [PASSWORD_DOTS]
select * from crm_configurations where provider = 'integration-app';
SELECT * FROM teams WHERE id = 443; # Correre Naturale 358 14315 [EMAIL]
select * from activities where crm_configuration_id = 358 order by actual_end_time desc;
select id, uuid, actual_end_time, crm_provider_id, is_internal, playbook_category_id, type, user_id, lead_id, contact_id, account_id, opportunity_id, status, title from activities where crm_configuration_id = 358 order by actual_end_time desc;
select * from team_features where team_id = 358;
select * from activity_summary_logs;
select * from teams where id = 406;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Sportfive%'; # 267, 202, 14637, [EMAIL]
select * from activities where crm_configuration_id = 202 order by actual_end_time desc;
SELECT * FROM users where id = 14637;
SELECT * FROM teams where id = 267;
SELECT * FROM groups where id = 1118;
select g.name, a.title, uuid_from_bin(a.uuid), a.external_id, a.status, a.recording_state, a.recording_reason_code, a.scheduled_start_time, a.scheduled_end_time, a.actual_start_time, a.actual_end_time from activities a
inner join users u on u.id = a.user_id
inner join groups g on g.id = u.group_id
where a.crm_configuration_id = 202
and a.is_internal = 0
and (a.scheduled_start_time between '2025-03-19 00:00:00' and '2025-03-21 00:00:00')
and a.type = 'conference'
and a.status != 'completed'
and a.external_id is not null
order by a.scheduled_start_time desc;
SELECT * FROM activities
WHERE crm_configuration_id = 202
AND status IN ('completed', 'failed')
AND recording_state != 'stopped'
AND type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')
AND (is_private = 0 OR user_id = 14637)
AND (
(
actual_start_time BETWEEN '2025-03-12 12:00:00' AND '2025-03-24 11:59:59'
) OR (
actual_start_time IS NULL
AND type IN ('sms-outbound', 'sms-inbound')
AND created_at BETWEEN '2025-03-12 12:00:00' AND '2025-03-24 11:59:59'
)
)
AND NOT EXISTS (
SELECT 1
FROM tracks
WHERE
tracks.activity_id = activities.id
AND tracks.type IN ('audio', 'video')
)
ORDER BY actual_end_time DESC;
SELECT DISTINCT
a.*
FROM activities a
INNER JOIN tracks t ON a.id = t.activity_id
INNER JOIN users u ON a.user_id = u.id
INNER JOIN teams team ON u.team_id = team.id
WHERE
a.crm_configuration_id = 202
AND a.status IN ('completed', 'failed')
AND a.recording_state != 'stopped'
# and a.user_id = 14637
AND a.type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')
# AND t.type IN ('audio', 'video')
AND (
(a.actual_start_time BETWEEN '2025-03-12 12:00:00' AND '2025-03-24 11:59:59')
OR
(
a.actual_start_time IS NULL
AND a.type IN ('sms-outbound', 'sms-inbound')
AND a.created_at BETWEEN '2025-03-12 12:00:00' AND '2025-03-24 11:59:59'
)
)
AND (
a.is_private = 0
OR (
a.is_private = 1
AND a.user_id = 14637
)
)
ORDER BY a.actual_end_time DESC
;
SELECT DISTINCT a.*
FROM activities a
INNER JOIN users u ON a.user_id = u.id
INNER JOIN teams t ON u.team_id = t.id
# INNER JOIN tracks tr ON a.id = tr.activity_id
# INNER JOIN groups g ON u.group_id = g.id
WHERE 1=1
AND t.id = 267
# AND t.uuid = uuid_to_bin('aed4927b-f1ea-499e-94c3-83762fd233e8')
AND a.status IN ('completed', 'failed')
AND a.recording_state != 'stopped'
AND a.type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')
# AND tr.type NOT IN ('audio', 'video')
AND (
a.is_private = 0
OR a.user_id = 14637
)
AND (
(a.actual_start_time BETWEEN '2025-03-19 00:00:00' AND '2025-03-21 23:59:59')
OR (
a.actual_start_time IS NULL
AND a.type IN ('sms-outbound', 'sms-inbound')
AND a.created_at BETWEEN '2025-03-19 00:00:00' AND '2025-03-21 23:59:59'
)
)
# and NOT EXISTS (
# SELECT 1
# FROM tracks t
# WHERE t.activity_id = a.id
# AND t.type IN ('audio', 'video')
# )
ORDER BY a.actual_end_time DESC;
SELECT * FROM tracks WHERE activity_id = 26485995;
select a.is_private, a.title, uuid_from_bin(a.uuid), a.external_id, a.status, a.recording_state, a.recording_reason_code, a.scheduled_start_time, a.scheduled_end_time, a.actual_start_time, a.actual_end_time from activities a
inner join users u on u.id = a.user_id
where a.crm_configuration_id = 202
# and a.is_internal = 0
and (a.actual_start_time between '2025-03-19 00:00:00' and '2025-03-21 00:00:00')
and a.type IN ("softphone","softphone-inbound","conference","sms-inbound")
and a.status IN ('completed', 'failed')
# and a.external_id is not null
order by a.actual_end_time desc;
select * from activities a where a.crm_configuration_id = 202
and a.actual_start_time between '2025-03-20 00:00:00' and '2025-03-21 00:00:00'
# AND a.type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')
select g.name, a.title, uuid_from_bin(a.uuid), a.external_id, a.status, a.recording_state, a.recording_reason_code, a.scheduled_start_time, a.scheduled_end_time, a.actual_start_time, a.actual_end_time from activities a
inner join users u on u.id = a.user_id
inner join groups g on g.id = u.group_id
where a.crm_configuration_id = 202
and a.is_internal = 0
and (a.scheduled_start_time between '2025-03-19 00:00:00' and '2025-03-21 00:00:00')
and a.type = 'conference'
and a.status != 'completed'
and a.external_id is not null
order by a.scheduled_start_time desc;
SELECT * FROM teams WHERE name LIKE '%Tourlane%';
SELECT * FROM crm_fields WHERE crm_configuration_id = 209 and object_type = 'opportunity';
SELECT * FROM crm_field_data WHERE crm_field_id = 98809;
select * from users where status = 1 AND timezone = 'MDT';
select * from opportunities where id = 3769814;
select * from deal_risks where opportunity_id = 3769814;
select cp.* from crm_profiles cp
join users u on cp.user_id = u.id
join crm_configurations crm on cp.crm_configuration_id = crm.id
where crm.provider = 'hubspot' AND u.status = 1 AND log_notes != 'none';
select * from crm_fields where id = 154575;
select * from team_features where feature = 'SUPPORTS_SYNC_MISSING_CALL_DISPOSITIONS';
SELECT * FROM teams WHERE id = 176; # crm 148
select * from activities where crm_configuration_id = 148 and provider = 'hubspot' order by id desc;
select * from activity_providers where provider = 'amazon-connect';
select * from crm_fields cf
join crm_configurations crm on crm.id = cf.crm_configuration_id
where crm.provider = 'hubspot' and cf.object_type IN ('account', 'contact');
# [PASSWORD_DOTS]
SELECT * FROM users WHERE id IN (15415, 15418);
SELECT * FROM groups WHERE id IN (1805,1806);
SELECT * FROM playbooks WHERE id = 1860;
SELECT * FROM playbook_categories WHERE id = 38634;
SELECT * FROM crm_fields WHERE id = 189962;
SELECT * FROM teams WHERE name = 'Pulsar Group'; # 472, 380, 15138 [EMAIL]
SELECT * FROM crm_profiles WHERE user_id = 15415;
SELECT * FROM social_accounts WHERE sociable_id = 15415 and provider = 'salesforce';
select * from sidekick_settings where team_id = 472;
SELECT * FROM activities WHERE uuid_to_bin('452c58c7-b87c-4fdd-953e-d7af185e9588') = uuid; # 28617536, user: 15418
SELECT * FROM activities WHERE uuid_to_bin('399114ee-d3a8-458c-bff5-5f654658db0a') = uuid; # 28344407, user: 15415
SELECT * FROM activities WHERE uuid_to_bin('f0aa567f-0ab1-4bbb-96aa-37dcf184676b') = uuid; # 28580288, user: 15415
SELECT * FROM activities WHERE uuid_to_bin('50c086b1-2770-4bca-b5ae-6bac22ec426b') = uuid; # 28566069, user: 15415
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%TeamTailor%'; # 109, 218, 13969, [EMAIL]
select * from crm_configurations where id = 218;
SELECT * FROM activities WHERE uuid_to_bin('e39b5857-7fdb-4f5a-951a-8d3ca69bb1b0') = uuid; # 28338765
SELECT * FROM users WHERE id IN (13232, 13230);
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 109
and sa.provider = 'salesforce';
0057R00000EPL5HQAX Inez Ekblad
1091cb81-5ea1-4951-a0ed-f00b568f0140 Triman Kaur
SELECT * FROM crm_profiles WHERE user_id IN (13232, 13230);
############################################################################################
SELECT * FROM activities WHERE uuid_to_bin('675eeaeb-5681-42db-90bc-54c07a604408') = uuid; # 28655939 00UVg00000FLvnSMAT
SELECT * FROM crm_field_data WHERE activity_id = 28655939;
SELECT * FROM crm_fields WHERE id IN (94491,94493,94498);
SELECT * FROM users WHERE id = 13658;
SELECT * FROM teams WHERE id = 109;
SELECT * FROM crm_configurations WHERE id = 218;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 109
and sa.provider = 'salesforce';
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Strengthscope%'; # 481, 390, 15420, [EMAIL]
SELECT * FROM stages WHERE crm_configuration_id = 390;
select * from business_processes where team_id = 481 and crm_configuration_id = 390;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 481
and sa.provider = 'salesforce';
SELECT * FROM users WHERE id = 15780; # team 462
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 462
and sa.provider = 'hubspot';
select * from teams where id = 495;
SELECT * FROM users WHERE id = 15794;
select * from social_accounts where sociable_id = 15794;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Flight%'; # 427, 333, 13752
SELECT * FROM accounts WHERE team_id = 427 and crm_provider_id = '668731000183444517';
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Group GTI%'; # 495, 407, 15794
SELECT * FROM activities WHERE crm_configuration_id = 407
and status = 'completed' and type = 'conference'
order by id desc;
select ru.*, pr.*, p.* from users u join role_user ru on ru.user_id = u.id
join permission_role pr on pr.role_id = ru.role_id
join permissions p on p.id = pr.permission_id
where team_id = 495 and p.name IN ('dial');
select * from permission_role;
select * from activities where crm_configuration_id = 407 and status = 'completed' order by id desc;
SELECT * FROM activities WHERE id = 29512773;
SELECT * FROM activities WHERE id IN (29042721,28991325,29002874);
SELECT al.* from activity_summary_logs al join activities a on a.id = al.activity_id
where a.crm_configuration_id = 407
# and a.id IN (29042721,28991325,29002874);
SELECT * FROM users WHERE id = 15794;
SELECT * FROM users WHERE team_id = 495;
SELECT * FROM social_accounts WHERE sociable_id = 15794;
SELECT * FROM opportunities WHERE team_id = 495 and name like '%OC:%';
SELECT * FROM contacts WHERE team_id = 495;
SELECT * FROM leads WHERE team_id = 495;
SELECT * FROM accounts WHERE team_id = 495;
SELECT * FROM crm_profiles WHERE crm_configuration_id = 407;
SELECT * FROM crm_fields WHERE crm_configuration_id = 407;
SELECT * FROM crm_configurations WHERE id = 407;
SELECT * FROM opportunities WHERE team_id = 495 and close_date BETWEEN '2025-06-01' AND '2025-07-01'
and user_id IS NOT NULL and is_closed = 1 and is_won = 1;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Hamilton Court FX LLP%'; # 249, 187, 10103
SELECT * FROM activities WHERE uuid_to_bin('4659c2bb-9a49-484e-9327-a3d66f1e028c') = uuid; # 28951064
SELECT * FROM crm_fields WHERE crm_configuration_id = 187 and object_type IN ('tasks', 'event');
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Checkstep%'; # 325, 256, 11753
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 325
and sa.provider = 'hubspot';
SELECT * FROM activities WHERE uuid_to_bin('7be372e2-1916-4d79-a2f3-ca3db1346db3') = uuid; # 28611085
SELECT * FROM activities WHERE uuid_to_bin('980f0336-840b-4185-a5a9-30cf8b0749a8') = uuid; # 28719733
SELECT * FROM activity_summary_logs where activity_id = 28719733;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Learning%'; # 260, 356, 9444
SELECT * FROM activity_summary_logs where sent_at BETWEEN '2025-06-09 11:38:00' AND '2025-06-09 11:40:00';
SELECT * FROM leads WHERE crm_configuration_id = 356 and crm_provider_id = '230045001502770504'; # 823630
select * from activities where crm_configuration_id = 356 and lead_id = 841732;
SELECT * from activity_summary_logs al join activities a on a.id = al.activity_id
where a.crm_configuration_id = 356;
select * from activities where crm_configuration_id = 356
and actual_end_time between '2025-06-09 11:00:00' and '2025-06-09 12:00:00'
order by id desc;
select * from accounts where crm_configuration_id = 356 and crm_provider_id = '230045001514403366' order by id desc;
select * from leads where crm_configuration_id = 356 and crm_provider_id = '230045001514275654' order by id desc;
select * from contacts where crm_configuration_id = 356 and crm_provider_id = '230045001514403366' order by id desc;
select * from opportunities where crm_configuration_id = 356 and crm_provider_id = '230045001514403366' order by id desc;
select * from team_features where team_id = 260;
select * from features where id IN (1,2,4,6,18,19,20,9,10,3,23,24,25,26,27);
SELECT * FROM activities WHERE uuid_to_bin('7be372e2-1916-4d79-a2f3-ca3db1346db3') = uuid;
select * from crm_fields;
select * from crm_layout_entities;
SELECT * FROM teams WHERE name LIKE '%Optable%';
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Teamtailor%'; # 109, 218, 13969
SELECT * FROM crm_configurations WHERE id = 218;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 109
and sa.provider = 'salesforce';
SELECT * FROM activities WHERE uuid_to_bin('675eeaeb-5681-42db-90bc-54c07a604408') = uuid; # 28655939
SELECT * FROM crm_field_data WHERE activity_id = 28655939;
SELECT * FROM crm_fields WHERE id in (94491,94493,94498);
select * from teams where crm_id IS NULL;
SELECT * FROM activities WHERE uuid_to_bin('71aa8a0c-9652-4ff6-bee7-d98ae60abef6') = uuid;
# [PASSWORD_DOTS]
select * from team_domains where team_id = 399;
SELECT * FROM teams WHERE name LIKE '%Rydoo%'; # 399, 318, 13207
select * from calendar_events where id = 5163781;
SELECT * FROM activities WHERE uuid_to_bin('be2cbc52-7fda-46a0-9ae0-25d9553eafc0') = uuid; # 29443896
SELECT * FROM participants WHERE activity_id = 29443896;
select * from contacts where crm_configuration_id = 318 and email = '[EMAIL]';
select * from leads where crm_configuration_id = 318 and email = '[EMAIL]';
select * from activities where user_id = 14937 order by created_at ;
select * from users where id = 14937;
select * from contacts where crm_configuration_id = 318 and email LIKE '%@strawberry.se';
select * from opportunities where crm_configuration_id = 318 and crm_provider_id = '006Sf00000D1WOAIA3';
select * from activities a join participants p on a.id = p.activity_id
where crm_configuration_id = 318 and a.updated_at > '2025-06-23T08:18:43Z';
# [PASSWORD_DOTS]
SELECT * FROM opportunities WHERE team_id = 379 and crm_provider_id = '39334518886';
SELECT * FROM opportunities WHERE team_id = 379 order by id desc;
SELECT * FROM teams WHERE id = 379;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 379 and sociable_id = 13852
and sa.provider = 'hubspot';
SELECT * FROM crm_configurations WHERE id = 307;
SELECT * FROM crm_layouts WHERE crm_configuration_id = 307;
SELECT * FROM crm_layout_entities WHERE crm_layout_id = 1027;
SELECT * FROM crm_fields WHERE crm_configuration_id = 307
and id IN (144750,144855,145158,155227);
SELECT * FROM activities;
select * from activities
where created_at > '2025-07-01 00:00:00'
# and created_at < '2025-08-01 00:00:00'
and type not in ('email-outbound', 'email-inbound')
and account_id is null
and contact_id is null
and lead_id is null
and opportunity_id is not null
;
SELECT * FROM activities WHERE id IN (25344155, 25344296, 25501909, 28692187);
SELECT * FROM crm_configurations WHERE id in (335,301,200);
select * from crm_fields where crm_configuration_id = 230 and crm_provider_id = 'Age2__c';
SELECT * FROM teams WHERE name LIKE '%Resights%';
select * from crm_fields where crm_configuration_id = 1 and object_type = 'opportunity';
select * from crm_configurations where provider = 'bullhorn'; # 344
select * from teams where id IN (442);
select * from activities
where crm_configuration_id = 177
and provider = 'amazon-connect'
order by id desc;
# and source <> 'gong';
select * from activity_providers where provider = 'amazon-connect';
SELECT * FROM activities WHERE uuid_to_bin('cec1993b-a7e5-4164-b74d-d680ea51d2f2') = uuid;
select * from crm_configurations where store_transcript = 1;
SELECT * FROM teams WHERE id IN (80);
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Sedna%'; # 277, 213, 12594
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 277
and sa.provider = 'salesforce';
selec...
|
54297
|
|
54370
|
NULL
|
0
|
2026-04-20T08:56:45.659697+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-20/1776 /Users/lukas/.screenpipe/data/data/2026-04-20/1776675405659_m1.jpg...
|
Firefox
|
Jiminny — Work
|
True
|
app.jiminny.com/dashboard
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Add bookmark
Name
PROD US
URL
https://app.jiminny. Add bookmark
Name
PROD US
URL
https://app.jiminny.com/dashboard
Location
Location
Show all the bookmarks folders
Tags
Tags
Show all tags
Use tags to organize and search for bookmarks from the address bar...
|
[{"role":"AXStaticText","text& [{"role":"AXStaticText","text":"Add bookmark","depth":8,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Name","depth":7,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXTextField","text":"PROD US","depth":6,"value":"PROD US","help_text":"","role_description":"text field","subrole":"AXUnknown","is_enabled":true,"is_focused":true,"is_selected":false},{"role":"AXStaticText","text":"URL","depth":7,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXTextField","text":"https://app.jiminny.com/dashboard","depth":6,"value":"https://app.jiminny.com/dashboard","help_text":"","role_description":"text field","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Location","depth":7,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXPopUpButton","text":"Location","depth":6,"help_text":"","role_description":"pop up button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Show all the bookmarks folders","depth":6,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Tags","depth":7,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXTextField","text":"Tags","depth":6,"placeholder":"Separate tags with commas","role_description":"text field","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Show all tags","depth":6,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Use tags to organize and search for bookmarks from the address bar","depth":7,"help_text":"","role_description":"text","subrole":"AXUnknown"}]...
|
6052277039731513269
|
-351935113223570805
|
click
|
accessibility
|
NULL
|
Add bookmark
Name
PROD US
URL
https://app.jiminny. Add bookmark
Name
PROD US
URL
https://app.jiminny.com/dashboard
Location
Location
Show all the bookmarks folders
Tags
Tags
Show all tags
Use tags to organize and search for bookmarks from the address bar...
|
NULL
|
|
54371
|
NULL
|
0
|
2026-04-20T08:56:45.659830+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-20/1776 /Users/lukas/.screenpipe/data/data/2026-04-20/1776675405659_m2.jpg...
|
Firefox
|
Jiminny — Work
|
True
|
app.jiminny.com/dashboard
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Platform Sprint 2 Q2 - Platform Team - Scrum Board Platform Sprint 2 Q2 - Platform Team - Scrum Board - Jira
JY-20553 | Improve crm-sync delays by yalokin-jiminny · Pull Request #11976 · jiminny/app
JY-20553 | Improve crm-sync delays by yalokin-jiminny · Pull Request #11976 · jiminny/app
[SRD-6793] Les Mills activity types not pulling in - Jira
[SRD-6793] Les Mills activity types not pulling in - Jira
JY-20698 handle failed field sync on playbook import activity types by LakyLak · Pull Request #11988 · jiminny/app
JY-20698 handle failed field sync on playbook import activity types by LakyLak · Pull Request #11988 · jiminny/app
JY-20692 change confirmation parameter by LakyLak · Pull Request #11986 · jiminny/app
JY-20692 change confirmation parameter by LakyLak · Pull Request #11986 · jiminny/app
[JY-20543] AJ Reports > Tracking - Jira
[JY-20543] AJ Reports > Tracking - Jira
[JY-18909] [Part2] Automated reports with Ask Jiminny - Jira
[JY-18909] [Part2] Automated reports with Ask Jiminny - Jira
Ask Jiminny Reports by nikolay-yankov · Pull Request #11894 · jiminny/app
Ask Jiminny Reports by nikolay-yankov · Pull Request #11894 · jiminny/app
New Tab
New Tab
Product Growth Platform | Userpilot
Product Growth Platform | Userpilot
Userpilot | Logged-activity
Userpilot | Logged-activity
fix(security): composer dependency updates – 2026-04-15 by github-actions[bot] · Pull Request #11970 · jiminny/app
fix(security): composer dependency updates – 2026-04-15 by github-actions[bot] · Pull Request #11970 · jiminny/app
Pipelines - jiminny/app
Pipelines - jiminny/app
Feed — jiminny — Sentry
Feed — jiminny — Sentry
fix(security): composer dependency updates – 2026-04-15 by github-actions[bot] · Pull Request #11970 · jiminny/app
fix(security): composer dependency updates – 2026-04-15 by github-actions[bot] · Pull Request #11970 · jiminny/app
Jiminny
Jiminny
Jiminny
Jiminny
Jiminny
Jiminny
Close tab
New Tab
Customize sidebar
Open Google Gemini (⌃X)
Tabs from other devices
Open history (⇧⌘H)
Open bookmarks (⌘B)
1
1
My Recordings
My Recordings
Team Recordings
Team Recordings
Everyone's Recordings
Everyone's Recordings
Unknown Customer
Notetaker added on 05-15-23 @ 20:45
15 May, 2023, 8:47 PM
Schedule
Schedule
Invite Notetaker
This Week
This Week
My Schedule
My Schedule
No Meetings
Trending this month
Trending this month
Sort by Sort by: Most played
Sort by
Sort by:
Most played
Miles Weeks at Cloud Gateway
Miles Weeks and Zornitsa Dzhongova
Miles Weeks and Zornitsa Dzhongova
4
times played
Unknown Customer
Steve Lazarus and Greg Moser
Steve Lazarus and Greg Moser
4
times played
David Roberts at Sigma Labs
Jiminny Onboarding Workshop
Jiminny Onboarding Workshop
2
times played
Tony Lombardo at AutoLeap
Meeting with Oliver
Meeting with Oliver
2
times played
Graeme Hennessey at RealTime eClinical Solutions
Meet with Becky from Jiminny 🚀
Meet with Becky from Jiminny 🚀
2
times played
Tom Daniels at Worldover
Worldover Onboarding Workshop
Worldover Onboarding Workshop
2
times played
Will Pagden at Rosterfy
Rosterfy & Jiminny [Intro call]
Rosterfy & Jiminny [Intro call]
2
times played
Todd Upchurch at LeadVenture
Jiminny - sync (Lauren & Todd)
Jiminny - sync (Lauren & Todd)
2
times played
Alex Bogumil at Cognitive Credit
Alex & Gabby Jiminny Customisations Alignment
Alex & Gabby Jiminny Customisations Alignment
2
times played
Phil Hart at Oxford Medical Simulation
🚀 Meet with Oliver from Jiminny
🚀 Meet with Oliver from Jiminny
2
times played
Melanie Yu Yu at Unibuddy
Jiminny <> Unibuddy (weekly acceleration!)
Jiminny <> Unibuddy (weekly acceleration!)
2
times played
Jack Wilson at Akixi
Akixi & Jiminny Onboarding Workshop 🚀
Akixi & Jiminny Onboarding Workshop 🚀
1
times played
Kelly Atkins at BT Local Business Severnside
BT Coventry & Jiminny
BT Coventry & Jiminny
1
times played
Kerensa Martin at CreateFuture
Jiminny x CF - Connect to Jiminny :)
Jiminny x CF - Connect to Jiminny :)
1
times played
Philipp Kronsteiner at DocPlanner
Meeting with Oliver
Meeting with Oliver
1
times played
Rachel Hand at Storage King
🚀 Meet with Becky from Jiminny
🚀 Meet with Becky from Jiminny
1
times played
Zilch
🚀 Meet with Becky from Jiminny
🚀 Meet with Becky from Jiminny
1
times played
Johnathan Berryman at INSURITAS
Jiminny + VIU by HUB/Insuritas Touchbase-Monthly
Jiminny + VIU by HUB/Insuritas Touchbase-Monthly
1
times played
Adriana Voyce at Credentially
Meeting with Stoyan 🚀 (Adriana Voyce)
Meeting with Stoyan 🚀 (Adriana Voyce)
1
times played
Melissa Desousa at Lloyd's List Intelligence
Melissa De Sousa and Petko Kashinski
Melissa De Sousa and Petko Kashinski
1
times played
Oscar Linares at Storyclash GmbH
Oscar Linares and Petko Kashinski
Oscar Linares and Petko Kashinski
1
times played
Graeme Hennessey at RealTime eClinical Solutions
Jiminny - Commercials Review & Next Steps 🚀
Jiminny - Commercials Review & Next Steps 🚀
1
times played
Base.com
Jiminny x Base - Commercials & Next Steps
Jiminny x Base - Commercials & Next Steps
1
times played
Belen Conteri at Superside
Belen Conteri and Lauren Hudson
Belen Conteri and Lauren Hudson
1
times played
Thomas Baxter at John Galt Solutions
🚀 Meet with Becky from Jiminny
🚀 Meet with Becky from Jiminny
1
times played
Live Feed
Live Feed
Gabriela Dureva
listened to call
Today, 11:42 AM
Decision / Closing
with
Hakeem Oloritun
Held:
28 Jan, 6:00 PM
Duration:
27m
Value:
$34,877
Calum Scott
listened to call
17 Apr, 7:26 PM
Proposal / Next Steps
with
Holger Marggraf
Held:
20 Feb, 11:00 AM
Duration:
42m
Value:
€0
Becky Butler
listened to call
17 Apr, 3:41 PM
Web Demo
with
Scott Ferguson
Held:
20 Mar, 11:29 AM
Duration:
1h
Value:
$7,620
Oliver Harris
listened to call
17 Apr, 3:34 PM
Web Demo
with
Scott Ferguson
Held:
20 Mar, 11:29 AM
Duration:
1h
Value:
$7,620
Petko Kashinski
listened to call
17 Apr, 10:01 AM
cold call
with
unknown customer
Held:
16 Apr, 4:35 PM
Duration:
1m
Value:
$0
Petko Kashinski
listened to call
17 Apr, 9:43 AM
Refresher Session
with
Melanie Yu Yu
Held:
9 Apr, 5:58 PM
Duration:
30m
Value:
$0
Zornitsa Dzhongova
listened to call
16 Apr, 4:16 PM
Discovery Call (upsell)
with
Oscar Linares
Held:
15 Apr, 3:30 PM
Duration:
32m
Value:
$11,875
Mario Georgiev
listened to call
16 Apr, 2:59 PM
Support / Troubleshooting
with
Adriana Voyce
Held:
15 Apr, 7:28 PM...
|
[{"role":"AXRadioButton","text [{"role":"AXRadioButton","text":"Platform Sprint 2 Q2 - Platform Team - Scrum Board - Jira","depth":4,"bounds":{"left":0.0018284575,"top":0.0518755,"width":0.07596409,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXRadioButton","text":"JY-20553 | Improve crm-sync delays by yalokin-jiminny · Pull Request #11976 · jiminny/app","depth":4,"bounds":{"left":0.0,"top":0.09497207,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"JY-20553 | Improve crm-sync delays by yalokin-jiminny · Pull Request #11976 · jiminny/app","depth":5,"bounds":{"left":0.013297873,"top":0.10614525,"width":0.15774602,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"[SRD-6793] Les Mills activity types not pulling in - Jira","depth":4,"bounds":{"left":0.0,"top":0.12769353,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"[SRD-6793] Les Mills activity types not pulling in - Jira","depth":5,"bounds":{"left":0.013297873,"top":0.13886672,"width":0.09524601,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"JY-20698 handle failed field sync on playbook import activity types by LakyLak · Pull Request #11988 · jiminny/app","depth":4,"bounds":{"left":0.0,"top":0.16041501,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"JY-20698 handle failed field sync on playbook import activity types by LakyLak · Pull Request #11988 · jiminny/app","depth":5,"bounds":{"left":0.013297873,"top":0.17158818,"width":0.19963431,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"JY-20692 change confirmation parameter by LakyLak · Pull Request #11986 · jiminny/app","depth":4,"bounds":{"left":0.0,"top":0.19313647,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"JY-20692 change confirmation parameter by LakyLak · Pull Request #11986 · jiminny/app","depth":5,"bounds":{"left":0.013297873,"top":0.20430966,"width":0.15525267,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"[JY-20543] AJ Reports > Tracking - Jira","depth":4,"bounds":{"left":0.0,"top":0.22585794,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"[JY-20543] AJ Reports > Tracking - Jira","depth":5,"bounds":{"left":0.013297873,"top":0.23703113,"width":0.06981383,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"[JY-18909] [Part2] Automated reports with Ask Jiminny - Jira","depth":4,"bounds":{"left":0.0,"top":0.2585794,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"[JY-18909] [Part2] Automated reports with Ask Jiminny - Jira","depth":5,"bounds":{"left":0.013297873,"top":0.2697526,"width":0.10688165,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Ask Jiminny Reports by nikolay-yankov · Pull Request #11894 · jiminny/app","depth":4,"bounds":{"left":0.0,"top":0.29130086,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Ask Jiminny Reports by nikolay-yankov · Pull Request #11894 · jiminny/app","depth":5,"bounds":{"left":0.013297873,"top":0.30247405,"width":0.12915559,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"New Tab","depth":4,"bounds":{"left":0.0,"top":0.32402235,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"New Tab","depth":5,"bounds":{"left":0.013297873,"top":0.33519554,"width":0.014960106,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Product Growth Platform | Userpilot","depth":4,"bounds":{"left":0.0,"top":0.3567438,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Product Growth Platform | Userpilot","depth":5,"bounds":{"left":0.013297873,"top":0.367917,"width":0.06200133,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Userpilot | Logged-activity","depth":4,"bounds":{"left":0.0,"top":0.38946527,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Userpilot | Logged-activity","depth":5,"bounds":{"left":0.013297873,"top":0.40063846,"width":0.04637633,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"fix(security): composer dependency updates – 2026-04-15 by github-actions[bot] · Pull Request #11970 · jiminny/app","depth":4,"bounds":{"left":0.0,"top":0.42218676,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"fix(security): composer dependency updates – 2026-04-15 by github-actions[bot] · Pull Request #11970 · jiminny/app","depth":5,"bounds":{"left":0.013297873,"top":0.43335995,"width":0.2052859,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Pipelines - jiminny/app","depth":4,"bounds":{"left":0.0,"top":0.45490822,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Pipelines - jiminny/app","depth":5,"bounds":{"left":0.013297873,"top":0.4660814,"width":0.039228722,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Feed — jiminny — Sentry","depth":4,"bounds":{"left":0.0,"top":0.48762968,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Feed — jiminny — Sentry","depth":5,"bounds":{"left":0.013297873,"top":0.49880287,"width":0.042719416,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"fix(security): composer dependency updates – 2026-04-15 by github-actions[bot] · Pull Request #11970 · jiminny/app","depth":4,"bounds":{"left":0.0,"top":0.5203512,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"fix(security): composer dependency updates – 2026-04-15 by github-actions[bot] · Pull Request #11970 · jiminny/app","depth":5,"bounds":{"left":0.013297873,"top":0.53152436,"width":0.2052859,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Jiminny","depth":4,"bounds":{"left":0.0,"top":0.55307263,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Jiminny","depth":5,"bounds":{"left":0.013297873,"top":0.5642458,"width":0.013131649,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Jiminny","depth":4,"bounds":{"left":0.0,"top":0.5857941,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Jiminny","depth":5,"bounds":{"left":0.013297873,"top":0.5969673,"width":0.013131649,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Jiminny","depth":4,"bounds":{"left":0.0,"top":0.61851555,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true},{"role":"AXStaticText","text":"Jiminny","depth":5,"bounds":{"left":0.013297873,"top":0.62968874,"width":0.013131649,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Close tab","depth":5,"bounds":{"left":0.06732048,"top":0.6256983,"width":0.007978723,"height":0.01915403},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"New Tab","depth":4,"bounds":{"left":0.0028257978,"top":0.6528332,"width":0.07413564,"height":0.025538707},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Customize sidebar","depth":6,"bounds":{"left":0.0028257978,"top":0.97007185,"width":0.010638298,"height":0.025538707},"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Open Google Gemini (⌃X)","depth":6,"bounds":{"left":0.013796543,"top":0.97007185,"width":0.010638298,"height":0.025538707},"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Tabs from other devices","depth":6,"bounds":{"left":0.024933511,"top":0.97007185,"width":0.010638298,"height":0.025538707},"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Open history (⇧⌘H)","depth":6,"bounds":{"left":0.036070477,"top":0.97007185,"width":0.010638298,"height":0.025538707},"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Open bookmarks (⌘B)","depth":6,"bounds":{"left":0.04720745,"top":0.97007185,"width":0.010638298,"height":0.025538707},"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"1","depth":12,"bounds":{"left":0.08228058,"top":0.91380686,"width":0.015957447,"height":0.035115723},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"1","depth":14,"bounds":{"left":0.091755316,"top":0.9173983,"width":0.0023271276,"height":0.011971269},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"My Recordings","depth":14,"bounds":{"left":0.15209441,"top":0.07182761,"width":0.061170213,"height":0.052673582},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true},{"role":"AXStaticText","text":"My Recordings","depth":15,"bounds":{"left":0.1653923,"top":0.0905826,"width":0.034574468,"height":0.01556265},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Team Recordings","depth":14,"bounds":{"left":0.21326463,"top":0.07182761,"width":0.065990694,"height":0.052673582},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Team Recordings","depth":15,"bounds":{"left":0.2265625,"top":0.0905826,"width":0.03939495,"height":0.01556265},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Everyone's Recordings","depth":14,"bounds":{"left":0.27925533,"top":0.07182761,"width":0.07895612,"height":0.052673582},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Everyone's Recordings","depth":15,"bounds":{"left":0.2925532,"top":0.0905826,"width":0.05236037,"height":0.01556265},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Unknown Customer","depth":17,"bounds":{"left":0.14079122,"top":0.14604948,"width":0.04155585,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Notetaker added on 05-15-23 @ 20:45","depth":18,"bounds":{"left":0.14079122,"top":0.16679968,"width":0.079953454,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"15 May, 2023, 8:47 PM","depth":17,"bounds":{"left":0.14079122,"top":0.18754987,"width":0.047706116,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Schedule","depth":13,"bounds":{"left":0.40608376,"top":0.27214685,"width":0.029421542,"height":0.025538707},"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Schedule","depth":14,"bounds":{"left":0.40608376,"top":0.27414206,"width":0.029421542,"height":0.021548284},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Invite Notetaker","depth":14,"bounds":{"left":0.65026593,"top":0.2697526,"width":0.044215426,"height":0.028731046},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXComboBox","text":"This Week","depth":14,"bounds":{"left":0.41107047,"top":0.31763768,"width":0.13763298,"height":0.02952913},"value":"This Week","help_text":"","role_description":"combo box","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"This Week","depth":17,"bounds":{"left":0.4147274,"top":0.3256185,"width":0.021775266,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXComboBox","text":"My Schedule","depth":14,"bounds":{"left":0.55202794,"top":0.31763768,"width":0.13746676,"height":0.02952913},"value":"My Schedule","help_text":"","role_description":"combo box","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"My Schedule","depth":17,"bounds":{"left":0.55568486,"top":0.3256185,"width":0.02642952,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"No Meetings","depth":16,"bounds":{"left":0.53706783,"top":0.69193935,"width":0.02642952,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Trending this month","depth":13,"bounds":{"left":0.41107047,"top":0.08858739,"width":0.046210106,"height":0.01915403},"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Trending this month","depth":14,"bounds":{"left":0.41107047,"top":0.0905826,"width":0.046210106,"height":0.01556265},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXComboBox","text":"Sort by Sort by: Most played","depth":13,"bounds":{"left":0.62101066,"top":0.08339984,"width":0.068484046,"height":0.02952913},"value":"Sort by Sort by: Most played","help_text":"","role_description":"combo box","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextField","text":"Sort by","depth":14,"help_text":"","role_description":"text field","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Sort by:","depth":15,"bounds":{"left":0.6246675,"top":0.091380686,"width":0.016954787,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Most played","depth":15,"bounds":{"left":0.64162236,"top":0.091380686,"width":0.025930852,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Miles Weeks at Cloud Gateway","depth":16,"bounds":{"left":0.51363033,"top":0.18036711,"width":0.06665558,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Miles Weeks and Zornitsa Dzhongova","depth":15,"bounds":{"left":0.50681514,"top":0.1991221,"width":0.08693484,"height":0.011971269},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Miles Weeks and Zornitsa Dzhongova","depth":16,"bounds":{"left":0.51678854,"top":0.1991221,"width":0.06698803,"height":0.011971269},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"4","depth":16,"bounds":{"left":0.5511968,"top":0.2150838,"width":0.005319149,"height":0.019553073},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"times played","depth":17,"bounds":{"left":0.54105717,"top":0.23144454,"width":0.01861702,"height":0.009976057},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Unknown Customer","depth":16,"bounds":{"left":0.813996,"top":0.18036711,"width":0.043218084,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Steve Lazarus and Greg Moser","depth":15,"bounds":{"left":0.8018617,"top":0.1991221,"width":0.07396942,"height":0.011971269},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Steve Lazarus and Greg Moser","depth":16,"bounds":{"left":0.8118351,"top":0.1991221,"width":0.054022606,"height":0.011971269},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"4","depth":16,"bounds":{"left":0.83976066,"top":0.2150838,"width":0.005319149,"height":0.019553073},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"times played","depth":17,"bounds":{"left":0.829621,"top":0.23144454,"width":0.01861702,"height":0.009976057},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"David Roberts at Sigma Labs","depth":16,"bounds":{"left":1.0,"top":0.18036711,"width":-0.09375,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Jiminny Onboarding Workshop","depth":15,"bounds":{"left":1.0,"top":0.1991221,"width":-0.08976066,"height":0.011971269},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Jiminny Onboarding Workshop","depth":16,"bounds":{"left":1.0,"top":0.1991221,"width":-0.09973407,"height":0.011971269},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"2","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"times played","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Tony Lombardo at AutoLeap","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Meeting with Oliver","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Meeting with Oliver","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"2","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"times played","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Graeme Hennessey at RealTime eClinical Solutions","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Meet with Becky from Jiminny 🚀","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Meet with Becky from Jiminny 🚀","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"2","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"times played","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Tom Daniels at Worldover","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Worldover Onboarding Workshop","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Worldover Onboarding Workshop","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"2","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"times played","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Will Pagden at Rosterfy","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Rosterfy & Jiminny [Intro call]","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Rosterfy & Jiminny [Intro call]","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"2","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"times played","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Todd Upchurch at LeadVenture","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Jiminny - sync (Lauren & Todd)","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Jiminny - sync (Lauren & Todd)","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"2","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"times played","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Alex Bogumil at Cognitive Credit","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Alex & Gabby Jiminny Customisations Alignment","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Alex & Gabby Jiminny Customisations Alignment","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"2","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"times played","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Phil Hart at Oxford Medical Simulation","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"🚀 Meet with Oliver from Jiminny","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"🚀 Meet with Oliver from Jiminny","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"2","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"times played","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Melanie Yu Yu at Unibuddy","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Jiminny <> Unibuddy (weekly acceleration!)","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Jiminny <> Unibuddy (weekly acceleration!)","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"2","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"times played","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Jack Wilson at Akixi","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Akixi & Jiminny Onboarding Workshop 🚀","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Akixi & Jiminny Onboarding Workshop 🚀","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"1","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"times played","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Kelly Atkins at BT Local Business Severnside","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"BT Coventry & Jiminny","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"BT Coventry & Jiminny","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"1","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"times played","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Kerensa Martin at CreateFuture","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Jiminny x CF - Connect to Jiminny :)","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Jiminny x CF - Connect to Jiminny :)","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"1","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"times played","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Philipp Kronsteiner at DocPlanner","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Meeting with Oliver","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Meeting with Oliver","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"1","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"times played","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Rachel Hand at Storage King","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"🚀 Meet with Becky from Jiminny","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"🚀 Meet with Becky from Jiminny","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"1","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"times played","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Zilch","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"🚀 Meet with Becky from Jiminny","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"🚀 Meet with Becky from Jiminny","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"1","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"times played","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Johnathan Berryman at INSURITAS","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Jiminny + VIU by HUB/Insuritas Touchbase-Monthly","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Jiminny + VIU by HUB/Insuritas Touchbase-Monthly","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"1","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"times played","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Adriana Voyce at Credentially","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Meeting with Stoyan 🚀 (Adriana Voyce)","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Meeting with Stoyan 🚀 (Adriana Voyce)","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"1","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"times played","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Melissa Desousa at Lloyd's List Intelligence","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Melissa De Sousa and Petko Kashinski","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Melissa De Sousa and Petko Kashinski","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"1","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"times played","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Oscar Linares at Storyclash GmbH","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Oscar Linares and Petko Kashinski","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Oscar Linares and Petko Kashinski","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"1","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"times played","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Graeme Hennessey at RealTime eClinical Solutions","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Jiminny - Commercials Review & Next Steps 🚀","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Jiminny - Commercials Review & Next Steps 🚀","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"1","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"times played","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Base.com","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Jiminny x Base - Commercials & Next Steps","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Jiminny x Base - Commercials & Next Steps","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"1","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"times played","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Belen Conteri at Superside","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Belen Conteri and Lauren Hudson","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Belen Conteri and Lauren Hudson","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"1","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"times played","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Thomas Baxter at John Galt Solutions","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"🚀 Meet with Becky from Jiminny","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"🚀 Meet with Becky from Jiminny","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"1","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"times played","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Live Feed","depth":13,"bounds":{"left":0.70611703,"top":0.08858739,"width":0.021941489,"height":0.01915403},"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Live Feed","depth":14,"bounds":{"left":0.70611703,"top":0.0905826,"width":0.021941489,"height":0.01556265},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Gabriela Dureva","depth":18,"bounds":{"left":0.72772604,"top":0.14086193,"width":0.034075797,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"listened to call","depth":18,"bounds":{"left":0.7634641,"top":0.14086193,"width":0.02925532,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Today, 11:42 AM","depth":18,"bounds":{"left":0.9489694,"top":0.14046289,"width":0.034075797,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Decision / Closing","depth":18,"bounds":{"left":0.72772604,"top":0.17158818,"width":0.03706782,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"with","depth":18,"bounds":{"left":0.76579124,"top":0.17158818,"width":0.008976064,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Hakeem Oloritun","depth":18,"bounds":{"left":0.77576464,"top":0.17158818,"width":0.036070477,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Held:","depth":18,"bounds":{"left":0.73537236,"top":0.20909816,"width":0.010472074,"height":0.012769354},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"28 Jan, 6:00 PM","depth":18,"bounds":{"left":0.7465093,"top":0.20909816,"width":0.030086435,"height":0.012769354},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Duration:","depth":18,"bounds":{"left":0.8490692,"top":0.20909816,"width":0.01861702,"height":0.012769354},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"27m","depth":18,"bounds":{"left":0.86835104,"top":0.20909816,"width":0.008477394,"height":0.012769354},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Value:","depth":18,"bounds":{"left":0.94930184,"top":0.20909816,"width":0.012134309,"height":0.012769354},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"$34,877","depth":18,"bounds":{"left":0.96210104,"top":0.20909816,"width":0.015957447,"height":0.012769354},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Calum Scott","depth":18,"bounds":{"left":0.72772604,"top":0.25418994,"width":0.025265958,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"listened to call","depth":18,"bounds":{"left":0.7546542,"top":0.25418994,"width":0.02925532,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"17 Apr, 7:26 PM","depth":18,"bounds":{"left":0.9502992,"top":0.25379092,"width":0.03274601,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Proposal / Next Steps","depth":18,"bounds":{"left":0.72772604,"top":0.2849162,"width":0.044714097,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"with","depth":18,"bounds":{"left":0.77327126,"top":0.2849162,"width":0.009142287,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Holger Marggraf","depth":18,"bounds":{"left":0.78324467,"top":0.2849162,"width":0.034574468,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Held:","depth":18,"bounds":{"left":0.73537236,"top":0.32242617,"width":0.010472074,"height":0.012769354},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"20 Feb, 11:00 AM","depth":18,"bounds":{"left":0.7465093,"top":0.32242617,"width":0.033410903,"height":0.012769354},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Duration:","depth":18,"bounds":{"left":0.8562167,"top":0.32242617,"width":0.018450798,"height":0.012769354},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"42m","depth":18,"bounds":{"left":0.8753325,"top":0.32242617,"width":0.008643617,"height":0.012769354},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Value:","depth":18,"bounds":{"left":0.9602726,"top":0.32242617,"width":0.012134309,"height":0.012769354},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"€0","depth":18,"bounds":{"left":0.9730718,"top":0.32242617,"width":0.004986702,"height":0.012769354},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Becky Butler","depth":18,"bounds":{"left":0.72772604,"top":0.36751795,"width":0.026928192,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"listened to call","depth":18,"bounds":{"left":0.7563165,"top":0.36751795,"width":0.02925532,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"17 Apr, 3:41 PM","depth":18,"bounds":{"left":0.9502992,"top":0.36711892,"width":0.03274601,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Web Demo","depth":18,"bounds":{"left":0.72772604,"top":0.3982442,"width":0.0234375,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"with","depth":18,"bounds":{"left":0.75199467,"top":0.3982442,"width":0.009142287,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Scott Ferguson","depth":18,"bounds":{"left":0.7619681,"top":0.3982442,"width":0.031083776,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Held:","depth":18,"bounds":{"left":0.73537236,"top":0.43575418,"width":0.010472074,"height":0.012769354},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"20 Mar, 11:29 AM","depth":18,"bounds":{"left":0.7465093,"top":0.43575418,"width":0.034075797,"height":0.012769354},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Duration:","depth":18,"bounds":{"left":0.8540558,"top":0.43575418,"width":0.01861702,"height":0.012769354},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"1h","depth":18,"bounds":{"left":0.87333775,"top":0.43575418,"width":0.0048204786,"height":0.012769354},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Value:","depth":18,"bounds":{"left":0.9517952,"top":0.43575418,"width":0.012134309,"height":0.012769354},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"$7,620","depth":18,"bounds":{"left":0.9645944,"top":0.43575418,"width":0.013464096,"height":0.012769354},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Oliver Harris","depth":18,"bounds":{"left":0.72772604,"top":0.48084596,"width":0.027094414,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"listened to call","depth":18,"bounds":{"left":0.7564827,"top":0.48084596,"width":0.02925532,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"17 Apr, 3:34 PM","depth":18,"bounds":{"left":0.9502992,"top":0.48044693,"width":0.03274601,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Web Demo","depth":18,"bounds":{"left":0.72772604,"top":0.51157224,"width":0.0234375,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"with","depth":18,"bounds":{"left":0.75199467,"top":0.51157224,"width":0.009142287,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Scott Ferguson","depth":18,"bounds":{"left":0.7619681,"top":0.51157224,"width":0.031083776,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Held:","depth":18,"bounds":{"left":0.73537236,"top":0.5490822,"width":0.010472074,"height":0.012769354},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"20 Mar, 11:29 AM","depth":18,"bounds":{"left":0.7465093,"top":0.5490822,"width":0.034075797,"height":0.012769354},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Duration:","depth":18,"bounds":{"left":0.8540558,"top":0.5490822,"width":0.01861702,"height":0.012769354},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"1h","depth":18,"bounds":{"left":0.87333775,"top":0.5490822,"width":0.0048204786,"height":0.012769354},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Value:","depth":18,"bounds":{"left":0.9517952,"top":0.5490822,"width":0.012134309,"height":0.012769354},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"$7,620","depth":18,"bounds":{"left":0.9645944,"top":0.5490822,"width":0.013464096,"height":0.012769354},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Petko Kashinski","depth":18,"bounds":{"left":0.72772604,"top":0.59417397,"width":0.03324468,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"listened to call","depth":18,"bounds":{"left":0.76263297,"top":0.59417397,"width":0.02925532,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"17 Apr, 10:01 AM","depth":18,"bounds":{"left":0.94730717,"top":0.5937749,"width":0.035738032,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"cold call","depth":18,"bounds":{"left":0.72772604,"top":0.6249002,"width":0.016954787,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"with","depth":18,"bounds":{"left":0.74551195,"top":0.6249002,"width":0.009142287,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"unknown customer","depth":18,"bounds":{"left":0.75548536,"top":0.6249002,"width":0.040059842,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Held:","depth":18,"bounds":{"left":0.73537236,"top":0.6624102,"width":0.010472074,"height":0.012769354},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"16 Apr, 4:35 PM","depth":18,"bounds":{"left":0.7465093,"top":0.6624102,"width":0.030418882,"height":0.012769354},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Duration:","depth":18,"bounds":{"left":0.8558843,"top":0.6624102,"width":0.01861702,"height":0.012769354},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"1m","depth":18,"bounds":{"left":0.87516624,"top":0.6624102,"width":0.005984043,"height":0.012769354},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Value:","depth":18,"bounds":{"left":0.9602726,"top":0.6624102,"width":0.012134309,"height":0.012769354},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"$0","depth":18,"bounds":{"left":0.9730718,"top":0.6624102,"width":0.004986702,"height":0.012769354},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Petko Kashinski","depth":18,"bounds":{"left":0.72772604,"top":0.707502,"width":0.03324468,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"listened to call","depth":18,"bounds":{"left":0.76263297,"top":0.707502,"width":0.02925532,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"17 Apr, 9:43 AM","depth":18,"bounds":{"left":0.9499667,"top":0.70710295,"width":0.03307846,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Refresher Session","depth":18,"bounds":{"left":0.72772604,"top":0.73822826,"width":0.03723404,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"with","depth":18,"bounds":{"left":0.76579124,"top":0.73822826,"width":0.009142287,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Melanie Yu Yu","depth":18,"bounds":{"left":0.77576464,"top":0.73822826,"width":0.029587766,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Held:","depth":18,"bounds":{"left":0.73537236,"top":0.77573824,"width":0.010472074,"height":0.012769354},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"9 Apr, 5:58 PM","depth":18,"bounds":{"left":0.7465093,"top":0.77573824,"width":0.027925532,"height":0.012769354},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Duration:","depth":18,"bounds":{"left":0.85339093,"top":0.77573824,"width":0.01861702,"height":0.012769354},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"30m","depth":18,"bounds":{"left":0.87267286,"top":0.77573824,"width":0.008477394,"height":0.012769354},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Value:","depth":18,"bounds":{"left":0.9602726,"top":0.77573824,"width":0.012134309,"height":0.012769354},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"$0","depth":18,"bounds":{"left":0.9730718,"top":0.77573824,"width":0.004986702,"height":0.012769354},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Zornitsa Dzhongova","depth":18,"bounds":{"left":0.72772604,"top":0.82083,"width":0.042054523,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"listened to call","depth":18,"bounds":{"left":0.77144283,"top":0.82083,"width":0.02925532,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"16 Apr, 4:16 PM","depth":18,"bounds":{"left":0.9502992,"top":0.820431,"width":0.03274601,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Discovery Call (upsell)","depth":18,"bounds":{"left":0.72772604,"top":0.85155624,"width":0.045877658,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"with","depth":18,"bounds":{"left":0.77460104,"top":0.85155624,"width":0.008976064,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Oscar Linares","depth":18,"bounds":{"left":0.78457445,"top":0.85155624,"width":0.02825798,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Held:","depth":18,"bounds":{"left":0.73537236,"top":0.8890662,"width":0.010472074,"height":0.012769354},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"15 Apr, 3:30 PM","depth":18,"bounds":{"left":0.7465093,"top":0.8890662,"width":0.030418882,"height":0.012769354},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Duration:","depth":18,"bounds":{"left":0.84923536,"top":0.8890662,"width":0.018450798,"height":0.012769354},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"32m","depth":18,"bounds":{"left":0.86835104,"top":0.8890662,"width":0.008643617,"height":0.012769354},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Value:","depth":18,"bounds":{"left":0.94930184,"top":0.8890662,"width":0.012134309,"height":0.012769354},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"$11,875","depth":18,"bounds":{"left":0.96210104,"top":0.8890662,"width":0.015957447,"height":0.012769354},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Mario Georgiev","depth":18,"bounds":{"left":0.72772604,"top":0.934158,"width":0.032579787,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"listened to call","depth":18,"bounds":{"left":0.7619681,"top":0.934158,"width":0.029089095,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"16 Apr, 2:59 PM","depth":18,"bounds":{"left":0.9502992,"top":0.933759,"width":0.03274601,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Support / Troubleshooting","depth":18,"bounds":{"left":0.72772604,"top":0.9648843,"width":0.054521278,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"with","depth":18,"bounds":{"left":0.78307843,"top":0.9648843,"width":0.009142287,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Adriana Voyce","depth":18,"bounds":{"left":0.79305184,"top":0.9648843,"width":0.03025266,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Held:","depth":18,"bounds":{"left":0.73537236,"top":1.0,"width":0.010472074,"height":-0.0023941994},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"15 Apr, 7:28 PM","depth":18,"bounds":{"left":0.7465093,"top":1.0,"width":0.030418882,"height":-0.0023941994},"help_text":"","role_description":"text","subrole":"AXUnknown"}]...
|
-4143135670630223683
|
-674061312079434720
|
click
|
accessibility
|
NULL
|
Platform Sprint 2 Q2 - Platform Team - Scrum Board Platform Sprint 2 Q2 - Platform Team - Scrum Board - Jira
JY-20553 | Improve crm-sync delays by yalokin-jiminny · Pull Request #11976 · jiminny/app
JY-20553 | Improve crm-sync delays by yalokin-jiminny · Pull Request #11976 · jiminny/app
[SRD-6793] Les Mills activity types not pulling in - Jira
[SRD-6793] Les Mills activity types not pulling in - Jira
JY-20698 handle failed field sync on playbook import activity types by LakyLak · Pull Request #11988 · jiminny/app
JY-20698 handle failed field sync on playbook import activity types by LakyLak · Pull Request #11988 · jiminny/app
JY-20692 change confirmation parameter by LakyLak · Pull Request #11986 · jiminny/app
JY-20692 change confirmation parameter by LakyLak · Pull Request #11986 · jiminny/app
[JY-20543] AJ Reports > Tracking - Jira
[JY-20543] AJ Reports > Tracking - Jira
[JY-18909] [Part2] Automated reports with Ask Jiminny - Jira
[JY-18909] [Part2] Automated reports with Ask Jiminny - Jira
Ask Jiminny Reports by nikolay-yankov · Pull Request #11894 · jiminny/app
Ask Jiminny Reports by nikolay-yankov · Pull Request #11894 · jiminny/app
New Tab
New Tab
Product Growth Platform | Userpilot
Product Growth Platform | Userpilot
Userpilot | Logged-activity
Userpilot | Logged-activity
fix(security): composer dependency updates – 2026-04-15 by github-actions[bot] · Pull Request #11970 · jiminny/app
fix(security): composer dependency updates – 2026-04-15 by github-actions[bot] · Pull Request #11970 · jiminny/app
Pipelines - jiminny/app
Pipelines - jiminny/app
Feed — jiminny — Sentry
Feed — jiminny — Sentry
fix(security): composer dependency updates – 2026-04-15 by github-actions[bot] · Pull Request #11970 · jiminny/app
fix(security): composer dependency updates – 2026-04-15 by github-actions[bot] · Pull Request #11970 · jiminny/app
Jiminny
Jiminny
Jiminny
Jiminny
Jiminny
Jiminny
Close tab
New Tab
Customize sidebar
Open Google Gemini (⌃X)
Tabs from other devices
Open history (⇧⌘H)
Open bookmarks (⌘B)
1
1
My Recordings
My Recordings
Team Recordings
Team Recordings
Everyone's Recordings
Everyone's Recordings
Unknown Customer
Notetaker added on 05-15-23 @ 20:45
15 May, 2023, 8:47 PM
Schedule
Schedule
Invite Notetaker
This Week
This Week
My Schedule
My Schedule
No Meetings
Trending this month
Trending this month
Sort by Sort by: Most played
Sort by
Sort by:
Most played
Miles Weeks at Cloud Gateway
Miles Weeks and Zornitsa Dzhongova
Miles Weeks and Zornitsa Dzhongova
4
times played
Unknown Customer
Steve Lazarus and Greg Moser
Steve Lazarus and Greg Moser
4
times played
David Roberts at Sigma Labs
Jiminny Onboarding Workshop
Jiminny Onboarding Workshop
2
times played
Tony Lombardo at AutoLeap
Meeting with Oliver
Meeting with Oliver
2
times played
Graeme Hennessey at RealTime eClinical Solutions
Meet with Becky from Jiminny 🚀
Meet with Becky from Jiminny 🚀
2
times played
Tom Daniels at Worldover
Worldover Onboarding Workshop
Worldover Onboarding Workshop
2
times played
Will Pagden at Rosterfy
Rosterfy & Jiminny [Intro call]
Rosterfy & Jiminny [Intro call]
2
times played
Todd Upchurch at LeadVenture
Jiminny - sync (Lauren & Todd)
Jiminny - sync (Lauren & Todd)
2
times played
Alex Bogumil at Cognitive Credit
Alex & Gabby Jiminny Customisations Alignment
Alex & Gabby Jiminny Customisations Alignment
2
times played
Phil Hart at Oxford Medical Simulation
🚀 Meet with Oliver from Jiminny
🚀 Meet with Oliver from Jiminny
2
times played
Melanie Yu Yu at Unibuddy
Jiminny <> Unibuddy (weekly acceleration!)
Jiminny <> Unibuddy (weekly acceleration!)
2
times played
Jack Wilson at Akixi
Akixi & Jiminny Onboarding Workshop 🚀
Akixi & Jiminny Onboarding Workshop 🚀
1
times played
Kelly Atkins at BT Local Business Severnside
BT Coventry & Jiminny
BT Coventry & Jiminny
1
times played
Kerensa Martin at CreateFuture
Jiminny x CF - Connect to Jiminny :)
Jiminny x CF - Connect to Jiminny :)
1
times played
Philipp Kronsteiner at DocPlanner
Meeting with Oliver
Meeting with Oliver
1
times played
Rachel Hand at Storage King
🚀 Meet with Becky from Jiminny
🚀 Meet with Becky from Jiminny
1
times played
Zilch
🚀 Meet with Becky from Jiminny
🚀 Meet with Becky from Jiminny
1
times played
Johnathan Berryman at INSURITAS
Jiminny + VIU by HUB/Insuritas Touchbase-Monthly
Jiminny + VIU by HUB/Insuritas Touchbase-Monthly
1
times played
Adriana Voyce at Credentially
Meeting with Stoyan 🚀 (Adriana Voyce)
Meeting with Stoyan 🚀 (Adriana Voyce)
1
times played
Melissa Desousa at Lloyd's List Intelligence
Melissa De Sousa and Petko Kashinski
Melissa De Sousa and Petko Kashinski
1
times played
Oscar Linares at Storyclash GmbH
Oscar Linares and Petko Kashinski
Oscar Linares and Petko Kashinski
1
times played
Graeme Hennessey at RealTime eClinical Solutions
Jiminny - Commercials Review & Next Steps 🚀
Jiminny - Commercials Review & Next Steps 🚀
1
times played
Base.com
Jiminny x Base - Commercials & Next Steps
Jiminny x Base - Commercials & Next Steps
1
times played
Belen Conteri at Superside
Belen Conteri and Lauren Hudson
Belen Conteri and Lauren Hudson
1
times played
Thomas Baxter at John Galt Solutions
🚀 Meet with Becky from Jiminny
🚀 Meet with Becky from Jiminny
1
times played
Live Feed
Live Feed
Gabriela Dureva
listened to call
Today, 11:42 AM
Decision / Closing
with
Hakeem Oloritun
Held:
28 Jan, 6:00 PM
Duration:
27m
Value:
$34,877
Calum Scott
listened to call
17 Apr, 7:26 PM
Proposal / Next Steps
with
Holger Marggraf
Held:
20 Feb, 11:00 AM
Duration:
42m
Value:
€0
Becky Butler
listened to call
17 Apr, 3:41 PM
Web Demo
with
Scott Ferguson
Held:
20 Mar, 11:29 AM
Duration:
1h
Value:
$7,620
Oliver Harris
listened to call
17 Apr, 3:34 PM
Web Demo
with
Scott Ferguson
Held:
20 Mar, 11:29 AM
Duration:
1h
Value:
$7,620
Petko Kashinski
listened to call
17 Apr, 10:01 AM
cold call
with
unknown customer
Held:
16 Apr, 4:35 PM
Duration:
1m
Value:
$0
Petko Kashinski
listened to call
17 Apr, 9:43 AM
Refresher Session
with
Melanie Yu Yu
Held:
9 Apr, 5:58 PM
Duration:
30m
Value:
$0
Zornitsa Dzhongova
listened to call
16 Apr, 4:16 PM
Discovery Call (upsell)
with
Oscar Linares
Held:
15 Apr, 3:30 PM
Duration:
32m
Value:
$11,875
Mario Georgiev
listened to call
16 Apr, 2:59 PM
Support / Troubleshooting
with
Adriana Voyce
Held:
15 Apr, 7:28 PM...
|
NULL
|
|
54502
|
NULL
|
0
|
2026-04-20T09:01:53.473051+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-20/1776 /Users/lukas/.screenpipe/data/data/2026-04-20/1776675713473_m2.jpg...
|
PhpStorm
|
faVsco.js – RequestGenerateAskJiminnyReportJobTest faVsco.js – RequestGenerateAskJiminnyReportJobTest.php...
|
True
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
#11894 on JY-18909-automa Project: faVsco.js, menu
#11894 on JY-18909-automated-reports-ask-jiminny, menu
Start Listening for PHP Debug Connections
RequestGenerateAskJiminnyReportJobTest
Run 'RequestGenerateAskJiminnyReportJobTest'
Debug 'RequestGenerateAskJiminnyReportJobTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Code changed:
Hide
Sync Changes
Hide This Notification
1
14
4
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Tests\Unit\Jobs\AutomatedReports;
use Carbon\Carbon;
use Jiminny\Component\ProphetAi\Exceptions\ProphetException;
use Jiminny\Component\ProphetAi\ProphetClient;
use Jiminny\Jobs\AutomatedReports\RequestGenerateAskJiminnyReportJob;
use Jiminny\Models\AutomatedReport;
use Jiminny\Models\AutomatedReportResult;
use Jiminny\Models\Team;
use Jiminny\Models\User;
use Jiminny\Services\Kiosk\AutomatedReports\AskJiminnyReportActivityService;
use Jiminny\Services\Kiosk\AutomatedReports\AutomatedReportsService;
use PHPUnit\Framework\MockObject\MockObject;
use PHPUnit\Framework\TestCase;
use Psr\Log\LoggerInterface;
class RequestGenerateAskJiminnyReportJobTest extends TestCase
{
private AutomatedReportsService&MockObject $reportService;
private AskJiminnyReportActivityService&MockObject $activityService;
private ProphetClient&MockObject $prophetClient;
private LoggerInterface&MockObject $logger;
protected function setUp(): void
{
$this->reportService = $this->createMock(AutomatedReportsService::class);
$this->activityService = $this->createMock(AskJiminnyReportActivityService::class);
$this->prophetClient = $this->createMock(ProphetClient::class);
$this->logger = $this->createMock(LoggerInterface::class);
}
private function makeJob(string $uuid = 'report-uuid'): RequestGenerateAskJiminnyReportJob
{
return new RequestGenerateAskJiminnyReportJob($uuid);
}
private function makeActiveReport(
string $type = AutomatedReportsService::TYPE_ASK_JIMINNY,
bool $status = true,
string $teamStatus = Team::STATUS_ACTIVE,
): AutomatedReport&MockObject { // @phpstan-ignore-line
$team = $this->createMock(Team::class);
$team->method('getStatus')->willReturn($teamStatus);
$report = $this->createMock(AutomatedReport::class);
$report->method('getType')->willReturn($type);
$report->method('getStatus')->willReturn($status);
$report->method('getTeam')->willReturn($team);
return $report;
}
public function testUniqueIdReturnsReportUuid(): void
{
$job = $this->makeJob('my-unique-uuid');
$this->assertEquals('my-unique-uuid', $job->uniqueId());
}
public function testHandleSkipsWhenReportTypeIsNotAskJiminny(): void
{
$report = $this->makeActiveReport(type: 'exec_summary');
$this->reportService->expects($this->once())
->method('getReport')
->willReturn($report);
$this->logger->expects($this->once())
->method('info')
->with($this->stringContains('Started'));
$this->logger->expects($this->once())
->method('warning')
->with($this->stringContains('not an ask_jiminny report'));
$this->reportService->expects($this->never())->method('getOrCreateReportResult');
$job = $this->makeJob();
$job->handle($this->reportService, $this->activityService, $this->prophetClient, $this->logger);
}
public function testHandleSkipsWhenReportIsInactive(): void
{
$report = $this->makeActiveReport(status: false);
$this->reportService->expects($this->once())
->method('getReport')
->willReturn($report);
$this->logger->expects($this->exactly(2))
->method('info');
$this->reportService->expects($this->never())->method('getOrCreateReportResult');
$job = $this->makeJob();
$job->handle($this->reportService, $this->activityService, $this->prophetClient, $this->logger);
}
public function testHandleSkipsWhenTeamIsInactive(): void
{
$report = $this->makeActiveReport(teamStatus: Team::STATUS_DEACTIVATED);
$this->reportService->expects($this->once())
->method('getReport')
->willReturn($report);
$this->logger->expects($this->exactly(2))
->method('info');
$this->reportService->expects($this->never())->method('getOrCreateReportResult');
$job = $this->makeJob();
$job->handle($this->reportService, $this->activityService, $this->prophetClient, $this->logger);
}
public function testHandleSkipsWhenCreatorIsNull(): void
{
$report = $this->makeActiveReport();
$report->method('getCreator')->willReturn(null);
$this->reportService->expects($this->once())
->method('getReport')
->willReturn($report);
$this->logger->expects($this->once())
->method('warning')
->with($this->stringContains('report creator not found'));
$this->reportService->expects($this->never())->method('getOrCreateReportResult');
$job = $this->makeJob();
$job->handle($this->reportService, $this->activityService, $this->prophetClient, $this->logger);
}
public function testHandleSkipsWhenSavedSearchIsNull(): void
{
$creator = $this->createMock(User::class);
$report = $this->makeActiveReport();
$report->method('getCreator')->willReturn($creator);
$report->method('getSavedSearch')->willReturn(null);
$this->reportService->expects($this->once())
->method('getReport')
->willReturn($report);
$this->logger->expects($this->once())
->method('warning')
->with($this->stringContains('saved search not found'));
$this->reportService->expects($this->never())->method('getOrCreateReportResult');
$job = $this->makeJob();
$job->handle($this->reportService, $this->activityService, $this->prophetClient, $this->logger);
}
public function testHandleSkipsWhenPromptIsNull(): void
{
$creator = $this->createMock(User::class);
$savedSearch = $this->createMock(\Jiminny\Models\Activity\Search::class);
$report = $this->makeActiveReport();
$report->method('getCreator')->willReturn($creator);
$report->method('getSavedSearch')->willReturn($savedSearch);
$report->method('getAskAnythingPrompt')->willReturn(null);
$this->reportService->expects($this->once())
->method('getReport')
->willReturn($report);
$this->logger->expects($this->once())
->method('warning')
->with($this->stringContains('ask anything prompt not found'));
$this->reportService->expects($this->never())->method('getOrCreateReportResult');
$job = $this->makeJob();
$job->handle($this->reportService, $this->activityService, $this->prophetClient, $this->logger);
}
public function testHandleFailsReportWhenNotEnoughActivities(): void
{
$creator = $this->createMock(User::class);
$savedSearch = $this->createMock(\Jiminny\Models\Activity\Search::class);
$prompt = $this->createMock(\Jiminny\Models\AskAnything\AskAnythingPrompt::class);
$report = $this->makeActiveReport();
$report->method('getCreator')->willReturn($creator);
$report->method('getSavedSearch')->willReturn($savedSearch);
$report->method('getAskAnythingPrompt')->willReturn($prompt);
$reportResult = $this->createMock(AutomatedReportResult::class);
$reportResult->expects($this->once())
->method('update')
->with($this->callback(fn ($data) => $data['status'] === AutomatedReportResult::STATUS_FAILED
&& $data['reason'] === AutomatedReportResult::REASON_NOT_ENOUGH_ACTIVITIES));
$this->reportService->expects($this->once())
->method('getReport')
->willReturn($report);
$this->reportService->expects($this->once())
->method('getOrCreateReportResult')
->willReturn($reportResult);
$this->activityService->expects($this->once())
->method('getActivityIdsForSavedSearch')
->willReturn([]);
$this->logger->expects($this->exactly(3))
->method('info');
$job = $this->makeJob();
$job->handle($this->reportService, $this->activityService, $this->prophetClient, $this->logger);
}
public function testHandleSuccessfullyRequestsReport(): void
{
Carbon::setTestNow(Carbon::parse('2026-04-07 10:00:00'));
$creator = $this->createMock(User::class);
$savedSearch = $this->createMock(\Jiminny\Models\Activity\Search::class);
$prompt = $this->createMock(\Jiminny\Models\AskAnything\AskAnythingPrompt::class);
$report = $this->makeActiveReport();
$report->method('getCreator')->willReturn($creator);
$report->method('getSavedSearch')->willReturn($savedSearch);
$report->method('getAskAnythingPrompt')->willReturn($prompt);
$report->method('getUuid')->willReturn('report-uuid');
$reportResult = $this->createMock(AutomatedReportResult::class);
$reportResult->method('getUuid')->willReturn('result-uuid');
$reportResult->expects($this->once())
->method('update')
->with($this->callback(fn ($data) => $data['status'] === AutomatedReportResult::STATUS_REQUESTED
&& isset($data['name'], $data['payload'], $data['requested_at'])));
$this->reportService->expects($this->once())
->method('getReport')
->willReturn($report);
$this->reportService->expects($this->once())
->method('getOrCreateReportResult')
->willReturn($reportResult);
$this->reportService->expects($this->once())
->method('getAskJiminnyGenerateReportPayload')
->willReturn(['key' => 'value']);
$this->reportService->expects($this->once())
->method('getReportFileName')
->willReturn('My Report - 7 Apr 2026');
$this->activityService->expects($this->once())
->method('getActivityIdsForSavedSearch')
->willReturn(['act-1', 'act-2']);
$this->prophetClient->expects($this->once())
->method('sendRequest')
->willReturn(new \Jiminny\Component\ProphetAi\Dtos\ProphetResponseDto([]));
$this->logger->expects($this->exactly(4))
->method('info');
$job = $this->makeJob();
$job->handle($this->reportService, $this->activityService, $this->prophetClient, $this->logger);
Carbon::setTestNow();
}
public function testHandleCatchesGenericExceptionAndLogsError(): void
{
$this->reportService->expects($this->once())
->method('getReport')
->willThrowException(new \RuntimeException('DB error'));
$this->logger->expects($this->once())
->method('error')
->with($this->stringContains('Error'));
$job = $this->makeJob();
$reflection = new \ReflectionClass($job);
$triesProp = $reflection->getProperty('tries');
$triesProp->setAccessible(true);
$job->handle($this->reportService, $this->activityService, $this->prophetClient, $this->logger);
}
public function testHandleCatchesProphetExceptionAndSetsCorrectReason(): void
{
$creator = $this->createMock(User::class);
$savedSearch = $this->createMock(\Jiminny\Models\Activity\Search::class);
$prompt = $this->createMock(\Jiminny\Models\AskAnything\AskAnythingPrompt::class);
$report = $this->makeActiveReport();
$report->method('getCreator')->willReturn($creator);
$report->method('getSavedSearch')->willReturn($savedSearch);
$report->method('getAskAnythingPrompt')->willReturn($prompt);
$reportResult = $this->createMock(AutomatedReportResult::class);
$reportResult->method('getUuid')->willReturn('result-uuid');
$reportResult->expects($this->once())
->method('update')
->with($this->callback(fn ($data) => $data['reason'] === AutomatedReportResult::REASON_PROPHET_API_ERROR));
$this->reportService->expects($this->once())
->method('getReport')
->willReturn($report);
$this->reportService->expects($this->once())
->method('getOrCreateReportResult')
->willReturn($reportResult);
$this->activityService->expects($this->once())
->method('getActivityIdsForSavedSearch')
->willThrowException(new ProphetException('Prophet failed'));
$this->logger->expects($this->once())
->method('error');
$job = $this->makeJob();
$job->handle($this->reportService, $this->activityService, $this->prophetClient, $this->logger);
}
public function testHandleCreatesReportResultBeforeActivityFetch(): void
{
$creator = $this->createMock(User::class);
$savedSearch = $this->createMock(\Jiminny\Models\Activity\Search::class);
$prompt = $this->createMock(\Jiminny\Models\AskAnything\AskAnythingPrompt::class);
$report = $this->makeActiveReport();
$report->method('getCreator')->willReturn($creator);
$report->method('getSavedSearch')->willReturn($savedSearch);
$report->method('getAskAnythingPrompt')->willReturn($prompt);
$reportResult = $this->createMock(AutomatedReportResult::class);
$reportResult->method('getUuid')->willReturn('result-uuid');
$callOrder = [];
$this->reportService->expects($this->once())
->method('getReport')
->willReturn($report);
$this->reportService->expects($this->once())
->method('getOrCreateReportResult')
->willReturnCallback(function () use ($reportResult, &$callOrder) {
$callOrder[] = 'getOrCreateReportResult';
return $reportResult;
});
$this->activityService->expects($this->once())
->method('getActivityIdsForSavedSearch')
->willReturnCallback(function () use (&$callOrder) {
$callOrder[] = 'getActivityIds';
return [];
});
$job = $this->makeJob();
$job->handle($this->reportService, $this->activityService, $this->prophetClient, $this->logger);
$this->assertEquals(['getOrCreateReportResult', 'getActivityIds'], $callOrder);
}
public function testHandlePassesCorrectDataToCreateReportResult(): void
{
$creator = $this->createMock(User::class);
$savedSearch = $this->createMock(\Jiminny\Models\Activity\Search::class);
$prompt = $this->createMock(\Jiminny\Models\AskAnything\AskAnythingPrompt::class);
$report = $this->makeActiveReport();
$report->method('getCreator')->willReturn($creator);
$report->method('getSavedSearch')->willReturn($savedSearch);
$report->method('getAskAnythingPrompt')->willReturn($prompt);
$reportResult = $this->createMock(AutomatedReportResult::class);
$reportResult->method('getUuid')->willReturn('result-uuid');
$reportResult->method('update')->willReturn(true);
$this->reportService->expects($this->once())
->method('getReport')
->willReturn($report);
$this->reportService->expects($this->once())
->method('getOrCreateReportResult')
->with(
automatedReport: $report,
data: $this->callback(fn ($data) => $data['status'] === AutomatedReportResult::STATUS_DEFAULT
&& $data['media_type'] === AutomatedReportsService::MEDIA_TYPE_PDF)
)
->willReturn($reportResult);
$this->activityService->expects($this->once())
->method('getActivityIdsForSavedSearch')
->willReturn([]);
$job = $this->makeJob();
$job->handle($this->reportService, $this->activityService, $this->prophetClient, $this->logger);
}
}
Execute
Explain Plan
Browse Query History
View Parameters
Open Query Execution Settings…
In-Editor Results
Tx: Auto
Cancel Running Statements
Playground
jiminny
Code changed:
Hide
Sync Changes
Hide This Notification
9
12
2
4
Previous Highlighted Error
Next Highlighted Error
SELECT a.id, a.uuid, a.actual_start_time, o.id, o.uuid FROM opportunities o
JOIN activities a ON o.id = a.opportunity_id
WHERE a.crm_configuration_id = 39
AND a.actual_start_time > '2025-10-13'
AND a.type IN ('conference', 'softphone-inbound', 'softphone-outbound')
;
SELECT * FROM activities
WHERE crm_configuration_id = 39 and user_id = 143
and actual_start_time >= '2025-10-13'
AND type IN ('conference', 'softphone-inbound', 'softphone-outbound')
;
SELECT * FROM opportunities WHERE account_id IN (178);
select * from activities where id IN (620137, 620187, 620188, 620189, 620230);
# HS
SELECT * FROM opportunities WHERE id IN (238);
select * from activities where id IN (477,2076);
select * from users;
SELECT COUNT(*) FROM users;
SELECT COUNT(*) FROM activities;
SELECT COUNT(*) FROM opportunities;
UPDATE activities
SET
actual_start_time = '2025-12-19 09:00:00',
actual_end_time = '2025-12-19 10:30:00',
scheduled_start_time = '2025-12-19 09:00:00',
scheduled_end_time = '2025-12-19 10:30:00'
WHERE id IN (407509,407375);
select * from partners;
SELECT id, uuid, type, actual_start_time, user_id, crm_configuration_id
FROM activities
WHERE user_id = 143
AND actual_start_time >= '2025-10-13 00:00:00'
AND actual_start_time <= '2026-01-13 23:59:59'
ORDER BY actual_start_time DESC;
SELECT * FROM activities WHERE uuid_to_bin('78eda160-3086-435f-88a5-bb0c71b6008d') = uuid;
SELECT * FROM crm_layouts where crm_configuration_id = 39;
SELECT * FROM crm_layout_entities WHERE crm_layout_id = 282;
# lead_id
# account_id 177
# contact_id 3969
# opportunity_id
# stage_id 203
SELECT * FROM opportunities WHERE opportunities.crm_configuration_id = id = 282;
SELECT * FROM activities where crm_configuration_id = 39 AND type = 'conference'
AND user_id = 143 and actual_start_time >= '2025-10-13';
SELECT * FROM activities a
# JOIN opportunities o ON a.opportunity_id = o.id
WHERE a.crm_configuration_id = 39 AND a.type = 'conference'
and status = 'completed' and recording_state = 'recorded'
and a.actual_start_time >= '2025-10-13'
AND a.user_id = 143
;
select * from leads
where crm_configuration_id = 39; # 112 -> ac. 178, 109 => op. 1707
SELECT * FROM activities WHERE id IN (356013,616188,616202,616310,407509,407375,356001,356008);
SELECT * FROM activities WHERE id IN (356013,616188,616202,616310);
SELECT * FROM activities WHERE id IN (407509,407375); # leads: 112, 109 | status - 198
SELECT * FROM activities WHERE id IN (356001, 356008); # contacts:
SELECT * FROM opportunities WHERE id IN (1707);
SELECT * FROM stages where id IN (204, 198);
SELECT * FROM opportunities WHERE account_id IN (178);
SELECT * FROM opportunities WHERE crm_configuration_id = 39 AND created_at > '2025-01-01';
SELECT * FROM contacts WHERE account_id IN (178); # 4118 Musaibe, 4448 Ceco Personal
SELECT * FROM activities where crm_configuration_id = 39
AND opportunity_id IS NULL
AND is_internal = false
and status = 'completed' and recording_state = 'recorded'
AND actual_start_time >= '2025-10-13'
AND (lead_id IS NOT NULL OR contact_id IS NOT NULL OR account_id IS NOT NULL)
# AND lead_id IN (112, 109)
;
SELECT * FROM crm_profiles WHERE user_id = 143;
select * from inboxes; # 212
select * from users where id = 143; # 143
select * from inbox_email_batches where inbox_id = 212
and updated_at >= '2026-01-28 00:00:00' order by id desc;
select * from inbox_emails where inbox_id = 212
and batch_id = 95885 order by id desc;
select * from email_messages where origin_user_id = 143;
select * from activities where user_id = 143 and updated_at >= '2026-01-28 00:00:00';
select * from participants where activity_id = 620247;
select * from crm_profiles where user_id = 143;
SELECT * FROM activities WHERE uuid_to_bin('458cf915-b914-4000-b083-5687b32b2956') = uuid; # 356001
select * from transcription where activity_id = 356001; # 6943
select * from ai_prompts where transcription_id = 6943;
SELECT * FROM activity_summary_logs where activity_id = 356001;
SELECT * FROM social_accounts WHERE sociable_id = 143;
# [PASSWORD_DOTS]
SELECT * FROM activities WHERE uuid_to_bin('0164a4fb-cb95-454e-9edd-4d804e4999bd') = uuid;
# 422515 softphone tr. 8100
SELECT * FROM activities WHERE uuid_to_bin('7520add8-8d87-41a5-98e5-fc4edf96f21e') = uuid;
# 407509 conference tr. 7670 crmId: 00UD1000002J9aTMAS
select * from ai_prompts where transcription_id IN (8100, 7670);
select * from activity_summary_logs where activity_id = 407509;
select * from sidekick_settings;
select * from default_activity_types;
SELECT * FROM contacts WHERE crm_configuration_id = 39 and email = '[EMAIL]';
SELECT * FROM leads WHERE crm_configuration_id = 39 and email = '[EMAIL]';
SELECT * FROM activity_searches where user_id = 143;
SELECT * FROM groups where team_id = 1;
select * from teams where id = 1;
select * from groups where team_id = 1; # 1150 - 7e75f8025c22
select id, name, group_id, status, deleted_at, email
from users where team_id = 1 order by group_id desc ;
select * from activity_searches where id in (1977, 1978, 1979);
select * from activity_search_filters where activity_search_id IN (1977, 1978, 1979);
select * from activity_search_filters where filter = 'group_id' and value = '443f26b8-8512-437e-a9f9-7e75f8025c22'; # 10268, 10272, 10277
select * from nudges where activity_search_id IN (1977, 1978, 1979); # 877, 878, 879
INSERT INTO `activity_search_filters`
(`activity_search_id`, `filter`, `value`) VALUES
(1977, 'group_id', '443f26b8-8512-437e-a9f9-7e75f8025c22'),
(1978, 'group_id', '443f26b8-8512-437e-a9f9-7e75f8025c22'),
(1979, 'group_id', '443f26b8-8512-437e-a9f9-7e75f8025c22')
;
select * from crm_configurations where id = 39;
select * from teams where id = 1;
select * from team_features where team_id = 1;
select * from features;
SELECT * FROM activity_searches where id = 1982; # 1981
SELECT * FROM activity_search_filters WHERE activity_search_id = 1982;
SELECT * FROM automated_reports where id = 68;
SELECT * FROM automated_report_results where id = 275;
SELECT * FROM automated_reports order by id desc;
SELECT * FROM automated_report_results order by id desc;
select * from activity_searches where user_id = 143;
select * from ask_anything_prompts;
SELECT * FROM groups WHERE id = 1439;
SELECT * FROM users WHERE group_id = 1439;
select * from permissions; # 158
select * from roles;
select * from permission_role
select * from teams where id = 1;
select * from groups g JOIN playbooks p on g.playbook_id = p.id where g.team_id = 1;
select * from groups where id = 28;
select * from playbooks where team_id = 1;
select * from playbooks where id = 179;
select * from playbook_categories where id = 1391;
select * from users where id = 143;
select * from crm_profiles where user_id = 143;
select * from activities where crm_configuration_id = 39 and type = 'conference'
and crm_provider_id IS NOT NULL ORDER by id desc;
select * from activities where id = 422003; # 00UO400000pB6fpMAC
SELECT ar.id, ar.uuid, ar.media_type, ar.status, a.type
FROM automated_report_results ar
JOIN automated_reports a ON a.id = ar.report_id
WHERE a.type = 'ask_jiminny'
LIMIT 10;
select * from teams where id = 3143;
select * from crm_configurations where id = 500;
select * from users where name = 'Integration Account'; # 1695
SELECT * FROM social_accounts WHERE sociable_id = 1695;
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"bounds":{"left":0.025930852,"top":0.019952115,"width":0.03856383,"height":0.025538707},"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"#11894 on JY-18909-automated-reports-ask-jiminny, menu","depth":5,"bounds":{"left":0.064494684,"top":0.019952115,"width":0.12134308,"height":0.025538707},"help_text":"Pull request #11894 exists for current branch JY-18909-automated-reports-ask-jiminny","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"bounds":{"left":0.7972075,"top":0.019952115,"width":0.011303191,"height":0.025538707},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"RequestGenerateAskJiminnyReportJobTest","depth":6,"bounds":{"left":0.8125,"top":0.019952115,"width":0.10305851,"height":0.025538707},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run 'RequestGenerateAskJiminnyReportJobTest'","depth":6,"bounds":{"left":0.9155585,"top":0.019952115,"width":0.011303191,"height":0.025538707},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'RequestGenerateAskJiminnyReportJobTest'","depth":6,"bounds":{"left":0.9268617,"top":0.019952115,"width":0.011303191,"height":0.025538707},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"More Actions","depth":6,"bounds":{"left":0.9381649,"top":0.019952115,"width":0.011303191,"height":0.025538707},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JetBrains AI","depth":5,"bounds":{"left":0.96609044,"top":0.019952115,"width":0.011303191,"height":0.025538707},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Search Everywhere","depth":5,"bounds":{"left":0.9773936,"top":0.019952115,"width":0.011303191,"height":0.025538707},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"IDE and Project Settings","depth":5,"bounds":{"left":0.9886968,"top":0.019952115,"width":0.011303186,"height":0.025538707},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.042220745,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"1","depth":4,"bounds":{"left":0.3587101,"top":0.273743,"width":0.00731383,"height":0.015163607},"role_description":"text"},{"role":"AXStaticText","text":"14","depth":4,"bounds":{"left":0.36801863,"top":0.273743,"width":0.009640957,"height":0.015163607},"role_description":"text"},{"role":"AXStaticText","text":"4","depth":4,"bounds":{"left":0.37965426,"top":0.273743,"width":0.007978723,"height":0.015163607},"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.38929522,"top":0.27214685,"width":0.00731383,"height":0.018355945},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"bounds":{"left":0.39660904,"top":0.27214685,"width":0.006981383,"height":0.018355945},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Tests\\Unit\\Jobs\\AutomatedReports;\n\nuse Carbon\\Carbon;\nuse Jiminny\\Component\\ProphetAi\\Exceptions\\ProphetException;\nuse Jiminny\\Component\\ProphetAi\\ProphetClient;\nuse Jiminny\\Jobs\\AutomatedReports\\RequestGenerateAskJiminnyReportJob;\nuse Jiminny\\Models\\AutomatedReport;\nuse Jiminny\\Models\\AutomatedReportResult;\nuse Jiminny\\Models\\Team;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Services\\Kiosk\\AutomatedReports\\AskJiminnyReportActivityService;\nuse Jiminny\\Services\\Kiosk\\AutomatedReports\\AutomatedReportsService;\nuse PHPUnit\\Framework\\MockObject\\MockObject;\nuse PHPUnit\\Framework\\TestCase;\nuse Psr\\Log\\LoggerInterface;\n\nclass RequestGenerateAskJiminnyReportJobTest extends TestCase\n{\n private AutomatedReportsService&MockObject $reportService;\n private AskJiminnyReportActivityService&MockObject $activityService;\n private ProphetClient&MockObject $prophetClient;\n private LoggerInterface&MockObject $logger;\n\n protected function setUp(): void\n {\n $this->reportService = $this->createMock(AutomatedReportsService::class);\n $this->activityService = $this->createMock(AskJiminnyReportActivityService::class);\n $this->prophetClient = $this->createMock(ProphetClient::class);\n $this->logger = $this->createMock(LoggerInterface::class);\n }\n\n private function makeJob(string $uuid = 'report-uuid'): RequestGenerateAskJiminnyReportJob\n {\n return new RequestGenerateAskJiminnyReportJob($uuid);\n }\n\n private function makeActiveReport(\n string $type = AutomatedReportsService::TYPE_ASK_JIMINNY,\n bool $status = true,\n string $teamStatus = Team::STATUS_ACTIVE,\n ): AutomatedReport&MockObject { // @phpstan-ignore-line\n $team = $this->createMock(Team::class);\n $team->method('getStatus')->willReturn($teamStatus);\n\n $report = $this->createMock(AutomatedReport::class);\n $report->method('getType')->willReturn($type);\n $report->method('getStatus')->willReturn($status);\n $report->method('getTeam')->willReturn($team);\n\n return $report;\n }\n\n public function testUniqueIdReturnsReportUuid(): void\n {\n $job = $this->makeJob('my-unique-uuid');\n\n $this->assertEquals('my-unique-uuid', $job->uniqueId());\n }\n\n public function testHandleSkipsWhenReportTypeIsNotAskJiminny(): void\n {\n $report = $this->makeActiveReport(type: 'exec_summary');\n\n $this->reportService->expects($this->once())\n ->method('getReport')\n ->willReturn($report);\n\n $this->logger->expects($this->once())\n ->method('info')\n ->with($this->stringContains('Started'));\n\n $this->logger->expects($this->once())\n ->method('warning')\n ->with($this->stringContains('not an ask_jiminny report'));\n\n $this->reportService->expects($this->never())->method('getOrCreateReportResult');\n\n $job = $this->makeJob();\n $job->handle($this->reportService, $this->activityService, $this->prophetClient, $this->logger);\n }\n\n public function testHandleSkipsWhenReportIsInactive(): void\n {\n $report = $this->makeActiveReport(status: false);\n\n $this->reportService->expects($this->once())\n ->method('getReport')\n ->willReturn($report);\n\n $this->logger->expects($this->exactly(2))\n ->method('info');\n\n $this->reportService->expects($this->never())->method('getOrCreateReportResult');\n\n $job = $this->makeJob();\n $job->handle($this->reportService, $this->activityService, $this->prophetClient, $this->logger);\n }\n\n public function testHandleSkipsWhenTeamIsInactive(): void\n {\n $report = $this->makeActiveReport(teamStatus: Team::STATUS_DEACTIVATED);\n\n $this->reportService->expects($this->once())\n ->method('getReport')\n ->willReturn($report);\n\n $this->logger->expects($this->exactly(2))\n ->method('info');\n\n $this->reportService->expects($this->never())->method('getOrCreateReportResult');\n\n $job = $this->makeJob();\n $job->handle($this->reportService, $this->activityService, $this->prophetClient, $this->logger);\n }\n\n public function testHandleSkipsWhenCreatorIsNull(): void\n {\n $report = $this->makeActiveReport();\n $report->method('getCreator')->willReturn(null);\n\n $this->reportService->expects($this->once())\n ->method('getReport')\n ->willReturn($report);\n\n $this->logger->expects($this->once())\n ->method('warning')\n ->with($this->stringContains('report creator not found'));\n\n $this->reportService->expects($this->never())->method('getOrCreateReportResult');\n\n $job = $this->makeJob();\n $job->handle($this->reportService, $this->activityService, $this->prophetClient, $this->logger);\n }\n\n public function testHandleSkipsWhenSavedSearchIsNull(): void\n {\n $creator = $this->createMock(User::class);\n\n $report = $this->makeActiveReport();\n $report->method('getCreator')->willReturn($creator);\n $report->method('getSavedSearch')->willReturn(null);\n\n $this->reportService->expects($this->once())\n ->method('getReport')\n ->willReturn($report);\n\n $this->logger->expects($this->once())\n ->method('warning')\n ->with($this->stringContains('saved search not found'));\n\n $this->reportService->expects($this->never())->method('getOrCreateReportResult');\n\n $job = $this->makeJob();\n $job->handle($this->reportService, $this->activityService, $this->prophetClient, $this->logger);\n }\n\n public function testHandleSkipsWhenPromptIsNull(): void\n {\n $creator = $this->createMock(User::class);\n $savedSearch = $this->createMock(\\Jiminny\\Models\\Activity\\Search::class);\n\n $report = $this->makeActiveReport();\n $report->method('getCreator')->willReturn($creator);\n $report->method('getSavedSearch')->willReturn($savedSearch);\n $report->method('getAskAnythingPrompt')->willReturn(null);\n\n $this->reportService->expects($this->once())\n ->method('getReport')\n ->willReturn($report);\n\n $this->logger->expects($this->once())\n ->method('warning')\n ->with($this->stringContains('ask anything prompt not found'));\n\n $this->reportService->expects($this->never())->method('getOrCreateReportResult');\n\n $job = $this->makeJob();\n $job->handle($this->reportService, $this->activityService, $this->prophetClient, $this->logger);\n }\n\n public function testHandleFailsReportWhenNotEnoughActivities(): void\n {\n $creator = $this->createMock(User::class);\n $savedSearch = $this->createMock(\\Jiminny\\Models\\Activity\\Search::class);\n $prompt = $this->createMock(\\Jiminny\\Models\\AskAnything\\AskAnythingPrompt::class);\n\n $report = $this->makeActiveReport();\n $report->method('getCreator')->willReturn($creator);\n $report->method('getSavedSearch')->willReturn($savedSearch);\n $report->method('getAskAnythingPrompt')->willReturn($prompt);\n\n $reportResult = $this->createMock(AutomatedReportResult::class);\n $reportResult->expects($this->once())\n ->method('update')\n ->with($this->callback(fn ($data) => $data['status'] === AutomatedReportResult::STATUS_FAILED\n && $data['reason'] === AutomatedReportResult::REASON_NOT_ENOUGH_ACTIVITIES));\n\n $this->reportService->expects($this->once())\n ->method('getReport')\n ->willReturn($report);\n\n $this->reportService->expects($this->once())\n ->method('getOrCreateReportResult')\n ->willReturn($reportResult);\n\n $this->activityService->expects($this->once())\n ->method('getActivityIdsForSavedSearch')\n ->willReturn([]);\n\n $this->logger->expects($this->exactly(3))\n ->method('info');\n\n $job = $this->makeJob();\n $job->handle($this->reportService, $this->activityService, $this->prophetClient, $this->logger);\n }\n\n public function testHandleSuccessfullyRequestsReport(): void\n {\n Carbon::setTestNow(Carbon::parse('2026-04-07 10:00:00'));\n\n $creator = $this->createMock(User::class);\n $savedSearch = $this->createMock(\\Jiminny\\Models\\Activity\\Search::class);\n $prompt = $this->createMock(\\Jiminny\\Models\\AskAnything\\AskAnythingPrompt::class);\n\n $report = $this->makeActiveReport();\n $report->method('getCreator')->willReturn($creator);\n $report->method('getSavedSearch')->willReturn($savedSearch);\n $report->method('getAskAnythingPrompt')->willReturn($prompt);\n $report->method('getUuid')->willReturn('report-uuid');\n\n $reportResult = $this->createMock(AutomatedReportResult::class);\n $reportResult->method('getUuid')->willReturn('result-uuid');\n $reportResult->expects($this->once())\n ->method('update')\n ->with($this->callback(fn ($data) => $data['status'] === AutomatedReportResult::STATUS_REQUESTED\n && isset($data['name'], $data['payload'], $data['requested_at'])));\n\n $this->reportService->expects($this->once())\n ->method('getReport')\n ->willReturn($report);\n\n $this->reportService->expects($this->once())\n ->method('getOrCreateReportResult')\n ->willReturn($reportResult);\n\n $this->reportService->expects($this->once())\n ->method('getAskJiminnyGenerateReportPayload')\n ->willReturn(['key' => 'value']);\n\n $this->reportService->expects($this->once())\n ->method('getReportFileName')\n ->willReturn('My Report - 7 Apr 2026');\n\n $this->activityService->expects($this->once())\n ->method('getActivityIdsForSavedSearch')\n ->willReturn(['act-1', 'act-2']);\n\n $this->prophetClient->expects($this->once())\n ->method('sendRequest')\n ->willReturn(new \\Jiminny\\Component\\ProphetAi\\Dtos\\ProphetResponseDto([]));\n\n $this->logger->expects($this->exactly(4))\n ->method('info');\n\n $job = $this->makeJob();\n $job->handle($this->reportService, $this->activityService, $this->prophetClient, $this->logger);\n\n Carbon::setTestNow();\n }\n\n public function testHandleCatchesGenericExceptionAndLogsError(): void\n {\n $this->reportService->expects($this->once())\n ->method('getReport')\n ->willThrowException(new \\RuntimeException('DB error'));\n\n $this->logger->expects($this->once())\n ->method('error')\n ->with($this->stringContains('Error'));\n\n $job = $this->makeJob();\n\n $reflection = new \\ReflectionClass($job);\n $triesProp = $reflection->getProperty('tries');\n $triesProp->setAccessible(true);\n\n $job->handle($this->reportService, $this->activityService, $this->prophetClient, $this->logger);\n }\n\n public function testHandleCatchesProphetExceptionAndSetsCorrectReason(): void\n {\n $creator = $this->createMock(User::class);\n $savedSearch = $this->createMock(\\Jiminny\\Models\\Activity\\Search::class);\n $prompt = $this->createMock(\\Jiminny\\Models\\AskAnything\\AskAnythingPrompt::class);\n\n $report = $this->makeActiveReport();\n $report->method('getCreator')->willReturn($creator);\n $report->method('getSavedSearch')->willReturn($savedSearch);\n $report->method('getAskAnythingPrompt')->willReturn($prompt);\n\n $reportResult = $this->createMock(AutomatedReportResult::class);\n $reportResult->method('getUuid')->willReturn('result-uuid');\n $reportResult->expects($this->once())\n ->method('update')\n ->with($this->callback(fn ($data) => $data['reason'] === AutomatedReportResult::REASON_PROPHET_API_ERROR));\n\n $this->reportService->expects($this->once())\n ->method('getReport')\n ->willReturn($report);\n\n $this->reportService->expects($this->once())\n ->method('getOrCreateReportResult')\n ->willReturn($reportResult);\n\n $this->activityService->expects($this->once())\n ->method('getActivityIdsForSavedSearch')\n ->willThrowException(new ProphetException('Prophet failed'));\n\n $this->logger->expects($this->once())\n ->method('error');\n\n $job = $this->makeJob();\n $job->handle($this->reportService, $this->activityService, $this->prophetClient, $this->logger);\n }\n\n public function testHandleCreatesReportResultBeforeActivityFetch(): void\n {\n $creator = $this->createMock(User::class);\n $savedSearch = $this->createMock(\\Jiminny\\Models\\Activity\\Search::class);\n $prompt = $this->createMock(\\Jiminny\\Models\\AskAnything\\AskAnythingPrompt::class);\n\n $report = $this->makeActiveReport();\n $report->method('getCreator')->willReturn($creator);\n $report->method('getSavedSearch')->willReturn($savedSearch);\n $report->method('getAskAnythingPrompt')->willReturn($prompt);\n\n $reportResult = $this->createMock(AutomatedReportResult::class);\n $reportResult->method('getUuid')->willReturn('result-uuid');\n\n $callOrder = [];\n\n $this->reportService->expects($this->once())\n ->method('getReport')\n ->willReturn($report);\n\n $this->reportService->expects($this->once())\n ->method('getOrCreateReportResult')\n ->willReturnCallback(function () use ($reportResult, &$callOrder) {\n $callOrder[] = 'getOrCreateReportResult';\n\n return $reportResult;\n });\n\n $this->activityService->expects($this->once())\n ->method('getActivityIdsForSavedSearch')\n ->willReturnCallback(function () use (&$callOrder) {\n $callOrder[] = 'getActivityIds';\n\n return [];\n });\n\n $job = $this->makeJob();\n $job->handle($this->reportService, $this->activityService, $this->prophetClient, $this->logger);\n\n $this->assertEquals(['getOrCreateReportResult', 'getActivityIds'], $callOrder);\n }\n\n public function testHandlePassesCorrectDataToCreateReportResult(): void\n {\n $creator = $this->createMock(User::class);\n $savedSearch = $this->createMock(\\Jiminny\\Models\\Activity\\Search::class);\n $prompt = $this->createMock(\\Jiminny\\Models\\AskAnything\\AskAnythingPrompt::class);\n\n $report = $this->makeActiveReport();\n $report->method('getCreator')->willReturn($creator);\n $report->method('getSavedSearch')->willReturn($savedSearch);\n $report->method('getAskAnythingPrompt')->willReturn($prompt);\n\n $reportResult = $this->createMock(AutomatedReportResult::class);\n $reportResult->method('getUuid')->willReturn('result-uuid');\n $reportResult->method('update')->willReturn(true);\n\n $this->reportService->expects($this->once())\n ->method('getReport')\n ->willReturn($report);\n\n $this->reportService->expects($this->once())\n ->method('getOrCreateReportResult')\n ->with(\n automatedReport: $report,\n data: $this->callback(fn ($data) => $data['status'] === AutomatedReportResult::STATUS_DEFAULT\n && $data['media_type'] === AutomatedReportsService::MEDIA_TYPE_PDF)\n )\n ->willReturn($reportResult);\n\n $this->activityService->expects($this->once())\n ->method('getActivityIdsForSavedSearch')\n ->willReturn([]);\n\n $job = $this->makeJob();\n $job->handle($this->reportService, $this->activityService, $this->prophetClient, $this->logger);\n }\n}","depth":4,"bounds":{"left":0.13863032,"top":0.27055067,"width":0.28158244,"height":0.72944933},"value":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Tests\\Unit\\Jobs\\AutomatedReports;\n\nuse Carbon\\Carbon;\nuse Jiminny\\Component\\ProphetAi\\Exceptions\\ProphetException;\nuse Jiminny\\Component\\ProphetAi\\ProphetClient;\nuse Jiminny\\Jobs\\AutomatedReports\\RequestGenerateAskJiminnyReportJob;\nuse Jiminny\\Models\\AutomatedReport;\nuse Jiminny\\Models\\AutomatedReportResult;\nuse Jiminny\\Models\\Team;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Services\\Kiosk\\AutomatedReports\\AskJiminnyReportActivityService;\nuse Jiminny\\Services\\Kiosk\\AutomatedReports\\AutomatedReportsService;\nuse PHPUnit\\Framework\\MockObject\\MockObject;\nuse PHPUnit\\Framework\\TestCase;\nuse Psr\\Log\\LoggerInterface;\n\nclass RequestGenerateAskJiminnyReportJobTest extends TestCase\n{\n private AutomatedReportsService&MockObject $reportService;\n private AskJiminnyReportActivityService&MockObject $activityService;\n private ProphetClient&MockObject $prophetClient;\n private LoggerInterface&MockObject $logger;\n\n protected function setUp(): void\n {\n $this->reportService = $this->createMock(AutomatedReportsService::class);\n $this->activityService = $this->createMock(AskJiminnyReportActivityService::class);\n $this->prophetClient = $this->createMock(ProphetClient::class);\n $this->logger = $this->createMock(LoggerInterface::class);\n }\n\n private function makeJob(string $uuid = 'report-uuid'): RequestGenerateAskJiminnyReportJob\n {\n return new RequestGenerateAskJiminnyReportJob($uuid);\n }\n\n private function makeActiveReport(\n string $type = AutomatedReportsService::TYPE_ASK_JIMINNY,\n bool $status = true,\n string $teamStatus = Team::STATUS_ACTIVE,\n ): AutomatedReport&MockObject { // @phpstan-ignore-line\n $team = $this->createMock(Team::class);\n $team->method('getStatus')->willReturn($teamStatus);\n\n $report = $this->createMock(AutomatedReport::class);\n $report->method('getType')->willReturn($type);\n $report->method('getStatus')->willReturn($status);\n $report->method('getTeam')->willReturn($team);\n\n return $report;\n }\n\n public function testUniqueIdReturnsReportUuid(): void\n {\n $job = $this->makeJob('my-unique-uuid');\n\n $this->assertEquals('my-unique-uuid', $job->uniqueId());\n }\n\n public function testHandleSkipsWhenReportTypeIsNotAskJiminny(): void\n {\n $report = $this->makeActiveReport(type: 'exec_summary');\n\n $this->reportService->expects($this->once())\n ->method('getReport')\n ->willReturn($report);\n\n $this->logger->expects($this->once())\n ->method('info')\n ->with($this->stringContains('Started'));\n\n $this->logger->expects($this->once())\n ->method('warning')\n ->with($this->stringContains('not an ask_jiminny report'));\n\n $this->reportService->expects($this->never())->method('getOrCreateReportResult');\n\n $job = $this->makeJob();\n $job->handle($this->reportService, $this->activityService, $this->prophetClient, $this->logger);\n }\n\n public function testHandleSkipsWhenReportIsInactive(): void\n {\n $report = $this->makeActiveReport(status: false);\n\n $this->reportService->expects($this->once())\n ->method('getReport')\n ->willReturn($report);\n\n $this->logger->expects($this->exactly(2))\n ->method('info');\n\n $this->reportService->expects($this->never())->method('getOrCreateReportResult');\n\n $job = $this->makeJob();\n $job->handle($this->reportService, $this->activityService, $this->prophetClient, $this->logger);\n }\n\n public function testHandleSkipsWhenTeamIsInactive(): void\n {\n $report = $this->makeActiveReport(teamStatus: Team::STATUS_DEACTIVATED);\n\n $this->reportService->expects($this->once())\n ->method('getReport')\n ->willReturn($report);\n\n $this->logger->expects($this->exactly(2))\n ->method('info');\n\n $this->reportService->expects($this->never())->method('getOrCreateReportResult');\n\n $job = $this->makeJob();\n $job->handle($this->reportService, $this->activityService, $this->prophetClient, $this->logger);\n }\n\n public function testHandleSkipsWhenCreatorIsNull(): void\n {\n $report = $this->makeActiveReport();\n $report->method('getCreator')->willReturn(null);\n\n $this->reportService->expects($this->once())\n ->method('getReport')\n ->willReturn($report);\n\n $this->logger->expects($this->once())\n ->method('warning')\n ->with($this->stringContains('report creator not found'));\n\n $this->reportService->expects($this->never())->method('getOrCreateReportResult');\n\n $job = $this->makeJob();\n $job->handle($this->reportService, $this->activityService, $this->prophetClient, $this->logger);\n }\n\n public function testHandleSkipsWhenSavedSearchIsNull(): void\n {\n $creator = $this->createMock(User::class);\n\n $report = $this->makeActiveReport();\n $report->method('getCreator')->willReturn($creator);\n $report->method('getSavedSearch')->willReturn(null);\n\n $this->reportService->expects($this->once())\n ->method('getReport')\n ->willReturn($report);\n\n $this->logger->expects($this->once())\n ->method('warning')\n ->with($this->stringContains('saved search not found'));\n\n $this->reportService->expects($this->never())->method('getOrCreateReportResult');\n\n $job = $this->makeJob();\n $job->handle($this->reportService, $this->activityService, $this->prophetClient, $this->logger);\n }\n\n public function testHandleSkipsWhenPromptIsNull(): void\n {\n $creator = $this->createMock(User::class);\n $savedSearch = $this->createMock(\\Jiminny\\Models\\Activity\\Search::class);\n\n $report = $this->makeActiveReport();\n $report->method('getCreator')->willReturn($creator);\n $report->method('getSavedSearch')->willReturn($savedSearch);\n $report->method('getAskAnythingPrompt')->willReturn(null);\n\n $this->reportService->expects($this->once())\n ->method('getReport')\n ->willReturn($report);\n\n $this->logger->expects($this->once())\n ->method('warning')\n ->with($this->stringContains('ask anything prompt not found'));\n\n $this->reportService->expects($this->never())->method('getOrCreateReportResult');\n\n $job = $this->makeJob();\n $job->handle($this->reportService, $this->activityService, $this->prophetClient, $this->logger);\n }\n\n public function testHandleFailsReportWhenNotEnoughActivities(): void\n {\n $creator = $this->createMock(User::class);\n $savedSearch = $this->createMock(\\Jiminny\\Models\\Activity\\Search::class);\n $prompt = $this->createMock(\\Jiminny\\Models\\AskAnything\\AskAnythingPrompt::class);\n\n $report = $this->makeActiveReport();\n $report->method('getCreator')->willReturn($creator);\n $report->method('getSavedSearch')->willReturn($savedSearch);\n $report->method('getAskAnythingPrompt')->willReturn($prompt);\n\n $reportResult = $this->createMock(AutomatedReportResult::class);\n $reportResult->expects($this->once())\n ->method('update')\n ->with($this->callback(fn ($data) => $data['status'] === AutomatedReportResult::STATUS_FAILED\n && $data['reason'] === AutomatedReportResult::REASON_NOT_ENOUGH_ACTIVITIES));\n\n $this->reportService->expects($this->once())\n ->method('getReport')\n ->willReturn($report);\n\n $this->reportService->expects($this->once())\n ->method('getOrCreateReportResult')\n ->willReturn($reportResult);\n\n $this->activityService->expects($this->once())\n ->method('getActivityIdsForSavedSearch')\n ->willReturn([]);\n\n $this->logger->expects($this->exactly(3))\n ->method('info');\n\n $job = $this->makeJob();\n $job->handle($this->reportService, $this->activityService, $this->prophetClient, $this->logger);\n }\n\n public function testHandleSuccessfullyRequestsReport(): void\n {\n Carbon::setTestNow(Carbon::parse('2026-04-07 10:00:00'));\n\n $creator = $this->createMock(User::class);\n $savedSearch = $this->createMock(\\Jiminny\\Models\\Activity\\Search::class);\n $prompt = $this->createMock(\\Jiminny\\Models\\AskAnything\\AskAnythingPrompt::class);\n\n $report = $this->makeActiveReport();\n $report->method('getCreator')->willReturn($creator);\n $report->method('getSavedSearch')->willReturn($savedSearch);\n $report->method('getAskAnythingPrompt')->willReturn($prompt);\n $report->method('getUuid')->willReturn('report-uuid');\n\n $reportResult = $this->createMock(AutomatedReportResult::class);\n $reportResult->method('getUuid')->willReturn('result-uuid');\n $reportResult->expects($this->once())\n ->method('update')\n ->with($this->callback(fn ($data) => $data['status'] === AutomatedReportResult::STATUS_REQUESTED\n && isset($data['name'], $data['payload'], $data['requested_at'])));\n\n $this->reportService->expects($this->once())\n ->method('getReport')\n ->willReturn($report);\n\n $this->reportService->expects($this->once())\n ->method('getOrCreateReportResult')\n ->willReturn($reportResult);\n\n $this->reportService->expects($this->once())\n ->method('getAskJiminnyGenerateReportPayload')\n ->willReturn(['key' => 'value']);\n\n $this->reportService->expects($this->once())\n ->method('getReportFileName')\n ->willReturn('My Report - 7 Apr 2026');\n\n $this->activityService->expects($this->once())\n ->method('getActivityIdsForSavedSearch')\n ->willReturn(['act-1', 'act-2']);\n\n $this->prophetClient->expects($this->once())\n ->method('sendRequest')\n ->willReturn(new \\Jiminny\\Component\\ProphetAi\\Dtos\\ProphetResponseDto([]));\n\n $this->logger->expects($this->exactly(4))\n ->method('info');\n\n $job = $this->makeJob();\n $job->handle($this->reportService, $this->activityService, $this->prophetClient, $this->logger);\n\n Carbon::setTestNow();\n }\n\n public function testHandleCatchesGenericExceptionAndLogsError(): void\n {\n $this->reportService->expects($this->once())\n ->method('getReport')\n ->willThrowException(new \\RuntimeException('DB error'));\n\n $this->logger->expects($this->once())\n ->method('error')\n ->with($this->stringContains('Error'));\n\n $job = $this->makeJob();\n\n $reflection = new \\ReflectionClass($job);\n $triesProp = $reflection->getProperty('tries');\n $triesProp->setAccessible(true);\n\n $job->handle($this->reportService, $this->activityService, $this->prophetClient, $this->logger);\n }\n\n public function testHandleCatchesProphetExceptionAndSetsCorrectReason(): void\n {\n $creator = $this->createMock(User::class);\n $savedSearch = $this->createMock(\\Jiminny\\Models\\Activity\\Search::class);\n $prompt = $this->createMock(\\Jiminny\\Models\\AskAnything\\AskAnythingPrompt::class);\n\n $report = $this->makeActiveReport();\n $report->method('getCreator')->willReturn($creator);\n $report->method('getSavedSearch')->willReturn($savedSearch);\n $report->method('getAskAnythingPrompt')->willReturn($prompt);\n\n $reportResult = $this->createMock(AutomatedReportResult::class);\n $reportResult->method('getUuid')->willReturn('result-uuid');\n $reportResult->expects($this->once())\n ->method('update')\n ->with($this->callback(fn ($data) => $data['reason'] === AutomatedReportResult::REASON_PROPHET_API_ERROR));\n\n $this->reportService->expects($this->once())\n ->method('getReport')\n ->willReturn($report);\n\n $this->reportService->expects($this->once())\n ->method('getOrCreateReportResult')\n ->willReturn($reportResult);\n\n $this->activityService->expects($this->once())\n ->method('getActivityIdsForSavedSearch')\n ->willThrowException(new ProphetException('Prophet failed'));\n\n $this->logger->expects($this->once())\n ->method('error');\n\n $job = $this->makeJob();\n $job->handle($this->reportService, $this->activityService, $this->prophetClient, $this->logger);\n }\n\n public function testHandleCreatesReportResultBeforeActivityFetch(): void\n {\n $creator = $this->createMock(User::class);\n $savedSearch = $this->createMock(\\Jiminny\\Models\\Activity\\Search::class);\n $prompt = $this->createMock(\\Jiminny\\Models\\AskAnything\\AskAnythingPrompt::class);\n\n $report = $this->makeActiveReport();\n $report->method('getCreator')->willReturn($creator);\n $report->method('getSavedSearch')->willReturn($savedSearch);\n $report->method('getAskAnythingPrompt')->willReturn($prompt);\n\n $reportResult = $this->createMock(AutomatedReportResult::class);\n $reportResult->method('getUuid')->willReturn('result-uuid');\n\n $callOrder = [];\n\n $this->reportService->expects($this->once())\n ->method('getReport')\n ->willReturn($report);\n\n $this->reportService->expects($this->once())\n ->method('getOrCreateReportResult')\n ->willReturnCallback(function () use ($reportResult, &$callOrder) {\n $callOrder[] = 'getOrCreateReportResult';\n\n return $reportResult;\n });\n\n $this->activityService->expects($this->once())\n ->method('getActivityIdsForSavedSearch')\n ->willReturnCallback(function () use (&$callOrder) {\n $callOrder[] = 'getActivityIds';\n\n return [];\n });\n\n $job = $this->makeJob();\n $job->handle($this->reportService, $this->activityService, $this->prophetClient, $this->logger);\n\n $this->assertEquals(['getOrCreateReportResult', 'getActivityIds'], $callOrder);\n }\n\n public function testHandlePassesCorrectDataToCreateReportResult(): void\n {\n $creator = $this->createMock(User::class);\n $savedSearch = $this->createMock(\\Jiminny\\Models\\Activity\\Search::class);\n $prompt = $this->createMock(\\Jiminny\\Models\\AskAnything\\AskAnythingPrompt::class);\n\n $report = $this->makeActiveReport();\n $report->method('getCreator')->willReturn($creator);\n $report->method('getSavedSearch')->willReturn($savedSearch);\n $report->method('getAskAnythingPrompt')->willReturn($prompt);\n\n $reportResult = $this->createMock(AutomatedReportResult::class);\n $reportResult->method('getUuid')->willReturn('result-uuid');\n $reportResult->method('update')->willReturn(true);\n\n $this->reportService->expects($this->once())\n ->method('getReport')\n ->willReturn($report);\n\n $this->reportService->expects($this->once())\n ->method('getOrCreateReportResult')\n ->with(\n automatedReport: $report,\n data: $this->callback(fn ($data) => $data['status'] === AutomatedReportResult::STATUS_DEFAULT\n && $data['media_type'] === AutomatedReportsService::MEDIA_TYPE_PDF)\n )\n ->willReturn($reportResult);\n\n $this->activityService->expects($this->once())\n ->method('getActivityIdsForSavedSearch')\n ->willReturn([]);\n\n $job = $this->makeJob();\n $job->handle($this->reportService, $this->activityService, $this->prophetClient, $this->logger);\n }\n}","role_description":"text entry area","is_enabled":true,"is_focused":true,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Execute","depth":4,"bounds":{"left":0.40492022,"top":0.09896249,"width":0.008643617,"height":0.01915403},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Explain Plan","depth":4,"bounds":{"left":0.41356382,"top":0.09896249,"width":0.008643617,"height":0.01915403},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Browse Query History","depth":4,"bounds":{"left":0.4245346,"top":0.09896249,"width":0.008643617,"height":0.01915403},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"View Parameters","depth":4,"bounds":{"left":0.4331782,"top":0.09896249,"width":0.008643617,"height":0.01915403},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Open Query Execution Settings…","depth":4,"bounds":{"left":0.4418218,"top":0.09896249,"width":0.008643617,"height":0.01915403},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"In-Editor Results","depth":4,"bounds":{"left":0.45279256,"top":0.09896249,"width":0.008643617,"height":0.01915403},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Tx: Auto","depth":4,"bounds":{"left":0.4637633,"top":0.09896249,"width":0.024268618,"height":0.01915403},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Cancel Running Statements","depth":4,"bounds":{"left":0.49035904,"top":0.09896249,"width":0.008643617,"height":0.01915403},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Playground","depth":4,"bounds":{"left":0.5013298,"top":0.09896249,"width":0.029587766,"height":0.01915403},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"jiminny","depth":4,"bounds":{"left":0.69913566,"top":0.09896249,"width":0.02825798,"height":0.01915403},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.042220745,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"9","depth":4,"bounds":{"left":0.6732048,"top":0.123703115,"width":0.007978723,"height":0.015163607},"role_description":"text"},{"role":"AXStaticText","text":"12","depth":4,"bounds":{"left":0.6831782,"top":0.123703115,"width":0.009640957,"height":0.015163607},"role_description":"text"},{"role":"AXStaticText","text":"2","depth":4,"bounds":{"left":0.69481385,"top":0.123703115,"width":0.007978723,"height":0.015163607},"role_description":"text"},{"role":"AXStaticText","text":"4","depth":4,"bounds":{"left":0.70478725,"top":0.123703115,"width":0.007978723,"height":0.015163607},"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.7144282,"top":0.12210695,"width":0.00731383,"height":0.018355945},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"bounds":{"left":0.72174203,"top":0.12210695,"width":0.006981383,"height":0.018355945},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"SELECT a.id, a.uuid, a.actual_start_time, o.id, o.uuid FROM opportunities o\nJOIN activities a ON o.id = a.opportunity_id\nWHERE a.crm_configuration_id = 39\nAND a.actual_start_time > '2025-10-13'\nAND a.type IN ('conference', 'softphone-inbound', 'softphone-outbound')\n;\n\nSELECT * FROM activities\nWHERE crm_configuration_id = 39 and user_id = 143\nand actual_start_time >= '2025-10-13'\nAND type IN ('conference', 'softphone-inbound', 'softphone-outbound')\n;\n\nSELECT * FROM opportunities WHERE account_id IN (178);\nselect * from activities where id IN (620137, 620187, 620188, 620189, 620230);\n\n# HS\nSELECT * FROM opportunities WHERE id IN (238);\nselect * from activities where id IN (477,2076);\n\nselect * from users;\n\nSELECT COUNT(*) FROM users;\nSELECT COUNT(*) FROM activities;\nSELECT COUNT(*) FROM opportunities;\n\nUPDATE activities\nSET\n actual_start_time = '2025-12-19 09:00:00',\n actual_end_time = '2025-12-19 10:30:00',\n scheduled_start_time = '2025-12-19 09:00:00',\n scheduled_end_time = '2025-12-19 10:30:00'\nWHERE id IN (407509,407375);\n\nselect * from partners;\n\nSELECT id, uuid, type, actual_start_time, user_id, crm_configuration_id\nFROM activities\nWHERE user_id = 143\nAND actual_start_time >= '2025-10-13 00:00:00'\nAND actual_start_time <= '2026-01-13 23:59:59'\nORDER BY actual_start_time DESC;\n\nSELECT * FROM activities WHERE uuid_to_bin('78eda160-3086-435f-88a5-bb0c71b6008d') = uuid;\nSELECT * FROM crm_layouts where crm_configuration_id = 39;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 282;\n# lead_id\n# account_id 177\n# contact_id 3969\n# opportunity_id\n# stage_id 203\n\nSELECT * FROM opportunities WHERE opportunities.crm_configuration_id = id = 282;\n\nSELECT * FROM activities where crm_configuration_id = 39 AND type = 'conference'\nAND user_id = 143 and actual_start_time >= '2025-10-13';\n\nSELECT * FROM activities a\n# JOIN opportunities o ON a.opportunity_id = o.id\nWHERE a.crm_configuration_id = 39 AND a.type = 'conference'\nand status = 'completed' and recording_state = 'recorded'\nand a.actual_start_time >= '2025-10-13'\nAND a.user_id = 143\n;\n\nselect * from leads\nwhere crm_configuration_id = 39; # 112 -> ac. 178, 109 => op. 1707\n\nSELECT * FROM activities WHERE id IN (356013,616188,616202,616310,407509,407375,356001,356008);\nSELECT * FROM activities WHERE id IN (356013,616188,616202,616310);\nSELECT * FROM activities WHERE id IN (407509,407375); # leads: 112, 109 | status - 198\nSELECT * FROM activities WHERE id IN (356001, 356008); # contacts:\n\nSELECT * FROM opportunities WHERE id IN (1707);\nSELECT * FROM stages where id IN (204, 198);\nSELECT * FROM opportunities WHERE account_id IN (178);\nSELECT * FROM opportunities WHERE crm_configuration_id = 39 AND created_at > '2025-01-01';\nSELECT * FROM contacts WHERE account_id IN (178); # 4118 Musaibe, 4448 Ceco Personal\n\nSELECT * FROM activities where crm_configuration_id = 39\nAND opportunity_id IS NULL\nAND is_internal = false\nand status = 'completed' and recording_state = 'recorded'\nAND actual_start_time >= '2025-10-13'\nAND (lead_id IS NOT NULL OR contact_id IS NOT NULL OR account_id IS NOT NULL)\n# AND lead_id IN (112, 109)\n;\n\nSELECT * FROM crm_profiles WHERE user_id = 143;\n\nselect * from inboxes; # 212\nselect * from users where id = 143; # 143\nselect * from inbox_email_batches where inbox_id = 212\nand updated_at >= '2026-01-28 00:00:00' order by id desc;\nselect * from inbox_emails where inbox_id = 212\nand batch_id = 95885 order by id desc;\nselect * from email_messages where origin_user_id = 143;\nselect * from activities where user_id = 143 and updated_at >= '2026-01-28 00:00:00';\nselect * from participants where activity_id = 620247;\n\nselect * from crm_profiles where user_id = 143;\n\nSELECT * FROM activities WHERE uuid_to_bin('458cf915-b914-4000-b083-5687b32b2956') = uuid; # 356001\nselect * from transcription where activity_id = 356001; # 6943\nselect * from ai_prompts where transcription_id = 6943;\nSELECT * FROM activity_summary_logs where activity_id = 356001;\n\nSELECT * FROM social_accounts WHERE sociable_id = 143;\n\n# ************************************************************************************\nSELECT * FROM activities WHERE uuid_to_bin('0164a4fb-cb95-454e-9edd-4d804e4999bd') = uuid;\n# 422515 softphone tr. 8100\n\nSELECT * FROM activities WHERE uuid_to_bin('7520add8-8d87-41a5-98e5-fc4edf96f21e') = uuid;\n# 407509 conference tr. 7670 crmId: 00UD1000002J9aTMAS\n\nselect * from ai_prompts where transcription_id IN (8100, 7670);\nselect * from activity_summary_logs where activity_id = 407509;\n\nselect * from sidekick_settings;\nselect * from default_activity_types;\n\nSELECT * FROM contacts WHERE crm_configuration_id = 39 and email = 'm.kogoj@gmx.at';\nSELECT * FROM leads WHERE crm_configuration_id = 39 and email = 'm.kogoj@gmx.at';\n\nSELECT * FROM activity_searches where user_id = 143;\nSELECT * FROM groups where team_id = 1;\n\nselect * from teams where id = 1;\nselect * from groups where team_id = 1; # 1150 - 7e75f8025c22\nselect id, name, group_id, status, deleted_at, email\nfrom users where team_id = 1 order by group_id desc ;\n\nselect * from activity_searches where id in (1977, 1978, 1979);\nselect * from activity_search_filters where activity_search_id IN (1977, 1978, 1979);\nselect * from activity_search_filters where filter = 'group_id' and value = '443f26b8-8512-437e-a9f9-7e75f8025c22'; # 10268, 10272, 10277\nselect * from nudges where activity_search_id IN (1977, 1978, 1979); # 877, 878, 879\n\nINSERT INTO `activity_search_filters`\n(`activity_search_id`, `filter`, `value`) VALUES\n(1977, 'group_id', '443f26b8-8512-437e-a9f9-7e75f8025c22'),\n(1978, 'group_id', '443f26b8-8512-437e-a9f9-7e75f8025c22'),\n(1979, 'group_id', '443f26b8-8512-437e-a9f9-7e75f8025c22')\n;\n\nselect * from crm_configurations where id = 39;\n\nselect * from teams where id = 1;\nselect * from team_features where team_id = 1;\nselect * from features;\n\nSELECT * FROM activity_searches where id = 1982; # 1981\nSELECT * FROM activity_search_filters WHERE activity_search_id = 1982;\n\nSELECT * FROM automated_reports where id = 68;\nSELECT * FROM automated_report_results where id = 275;\n\nSELECT * FROM automated_reports order by id desc;\nSELECT * FROM automated_report_results order by id desc;\nselect * from activity_searches where user_id = 143;\nselect * from ask_anything_prompts;\n\nSELECT * FROM groups WHERE id = 1439;\nSELECT * FROM users WHERE group_id = 1439;\n\nselect * from permissions; # 158\nselect * from roles;\nselect * from permission_role\n\nselect * from teams where id = 1;\nselect * from groups g JOIN playbooks p on g.playbook_id = p.id where g.team_id = 1;\nselect * from groups where id = 28;\nselect * from playbooks where team_id = 1;\nselect * from playbooks where id = 179;\nselect * from playbook_categories where id = 1391;\nselect * from users where id = 143;\nselect * from crm_profiles where user_id = 143;\nselect * from activities where crm_configuration_id = 39 and type = 'conference'\nand crm_provider_id IS NOT NULL ORDER by id desc;\nselect * from activities where id = 422003; # 00UO400000pB6fpMAC\n\nSELECT ar.id, ar.uuid, ar.media_type, ar.status, a.type\nFROM automated_report_results ar\nJOIN automated_reports a ON a.id = ar.report_id\nWHERE a.type = 'ask_jiminny'\nLIMIT 10;\n\n\nselect * from teams where id = 3143;\nselect * from crm_configurations where id = 500;\nselect * from users where name = 'Integration Account'; # 1695\nSELECT * FROM social_accounts WHERE sociable_id = 1695;","depth":4,"value":"SELECT a.id, a.uuid, a.actual_start_time, o.id, o.uuid FROM opportunities o\nJOIN activities a ON o.id = a.opportunity_id\nWHERE a.crm_configuration_id = 39\nAND a.actual_start_time > '2025-10-13'\nAND a.type IN ('conference', 'softphone-inbound', 'softphone-outbound')\n;\n\nSELECT * FROM activities\nWHERE crm_configuration_id = 39 and user_id = 143\nand actual_start_time >= '2025-10-13'\nAND type IN ('conference', 'softphone-inbound', 'softphone-outbound')\n;\n\nSELECT * FROM opportunities WHERE account_id IN (178);\nselect * from activities where id IN (620137, 620187, 620188, 620189, 620230);\n\n# HS\nSELECT * FROM opportunities WHERE id IN (238);\nselect * from activities where id IN (477,2076);\n\nselect * from users;\n\nSELECT COUNT(*) FROM users;\nSELECT COUNT(*) FROM activities;\nSELECT COUNT(*) FROM opportunities;\n\nUPDATE activities\nSET\n actual_start_time = '2025-12-19 09:00:00',\n actual_end_time = '2025-12-19 10:30:00',\n scheduled_start_time = '2025-12-19 09:00:00',\n scheduled_end_time = '2025-12-19 10:30:00'\nWHERE id IN (407509,407375);\n\nselect * from partners;\n\nSELECT id, uuid, type, actual_start_time, user_id, crm_configuration_id\nFROM activities\nWHERE user_id = 143\nAND actual_start_time >= '2025-10-13 00:00:00'\nAND actual_start_time <= '2026-01-13 23:59:59'\nORDER BY actual_start_time DESC;\n\nSELECT * FROM activities WHERE uuid_to_bin('78eda160-3086-435f-88a5-bb0c71b6008d') = uuid;\nSELECT * FROM crm_layouts where crm_configuration_id = 39;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 282;\n# lead_id\n# account_id 177\n# contact_id 3969\n# opportunity_id\n# stage_id 203\n\nSELECT * FROM opportunities WHERE opportunities.crm_configuration_id = id = 282;\n\nSELECT * FROM activities where crm_configuration_id = 39 AND type = 'conference'\nAND user_id = 143 and actual_start_time >= '2025-10-13';\n\nSELECT * FROM activities a\n# JOIN opportunities o ON a.opportunity_id = o.id\nWHERE a.crm_configuration_id = 39 AND a.type = 'conference'\nand status = 'completed' and recording_state = 'recorded'\nand a.actual_start_time >= '2025-10-13'\nAND a.user_id = 143\n;\n\nselect * from leads\nwhere crm_configuration_id = 39; # 112 -> ac. 178, 109 => op. 1707\n\nSELECT * FROM activities WHERE id IN (356013,616188,616202,616310,407509,407375,356001,356008);\nSELECT * FROM activities WHERE id IN (356013,616188,616202,616310);\nSELECT * FROM activities WHERE id IN (407509,407375); # leads: 112, 109 | status - 198\nSELECT * FROM activities WHERE id IN (356001, 356008); # contacts:\n\nSELECT * FROM opportunities WHERE id IN (1707);\nSELECT * FROM stages where id IN (204, 198);\nSELECT * FROM opportunities WHERE account_id IN (178);\nSELECT * FROM opportunities WHERE crm_configuration_id = 39 AND created_at > '2025-01-01';\nSELECT * FROM contacts WHERE account_id IN (178); # 4118 Musaibe, 4448 Ceco Personal\n\nSELECT * FROM activities where crm_configuration_id = 39\nAND opportunity_id IS NULL\nAND is_internal = false\nand status = 'completed' and recording_state = 'recorded'\nAND actual_start_time >= '2025-10-13'\nAND (lead_id IS NOT NULL OR contact_id IS NOT NULL OR account_id IS NOT NULL)\n# AND lead_id IN (112, 109)\n;\n\nSELECT * FROM crm_profiles WHERE user_id = 143;\n\nselect * from inboxes; # 212\nselect * from users where id = 143; # 143\nselect * from inbox_email_batches where inbox_id = 212\nand updated_at >= '2026-01-28 00:00:00' order by id desc;\nselect * from inbox_emails where inbox_id = 212\nand batch_id = 95885 order by id desc;\nselect * from email_messages where origin_user_id = 143;\nselect * from activities where user_id = 143 and updated_at >= '2026-01-28 00:00:00';\nselect * from participants where activity_id = 620247;\n\nselect * from crm_profiles where user_id = 143;\n\nSELECT * FROM activities WHERE uuid_to_bin('458cf915-b914-4000-b083-5687b32b2956') = uuid; # 356001\nselect * from transcription where activity_id = 356001; # 6943\nselect * from ai_prompts where transcription_id = 6943;\nSELECT * FROM activity_summary_logs where activity_id = 356001;\n\nSELECT * FROM social_accounts WHERE sociable_id = 143;\n\n# ************************************************************************************\nSELECT * FROM activities WHERE uuid_to_bin('0164a4fb-cb95-454e-9edd-4d804e4999bd') = uuid;\n# 422515 softphone tr. 8100\n\nSELECT * FROM activities WHERE uuid_to_bin('7520add8-8d87-41a5-98e5-fc4edf96f21e') = uuid;\n# 407509 conference tr. 7670 crmId: 00UD1000002J9aTMAS\n\nselect * from ai_prompts where transcription_id IN (8100, 7670);\nselect * from activity_summary_logs where activity_id = 407509;\n\nselect * from sidekick_settings;\nselect * from default_activity_types;\n\nSELECT * FROM contacts WHERE crm_configuration_id = 39 and email = 'm.kogoj@gmx.at';\nSELECT * FROM leads WHERE crm_configuration_id = 39 and email = 'm.kogoj@gmx.at';\n\nSELECT * FROM activity_searches where user_id = 143;\nSELECT * FROM groups where team_id = 1;\n\nselect * from teams where id = 1;\nselect * from groups where team_id = 1; # 1150 - 7e75f8025c22\nselect id, name, group_id, status, deleted_at, email\nfrom users where team_id = 1 order by group_id desc ;\n\nselect * from activity_searches where id in (1977, 1978, 1979);\nselect * from activity_search_filters where activity_search_id IN (1977, 1978, 1979);\nselect * from activity_search_filters where filter = 'group_id' and value = '443f26b8-8512-437e-a9f9-7e75f8025c22'; # 10268, 10272, 10277\nselect * from nudges where activity_search_id IN (1977, 1978, 1979); # 877, 878, 879\n\nINSERT INTO `activity_search_filters`\n(`activity_search_id`, `filter`, `value`) VALUES\n(1977, 'group_id', '443f26b8-8512-437e-a9f9-7e75f8025c22'),\n(1978, 'group_id', '443f26b8-8512-437e-a9f9-7e75f8025c22'),\n(1979, 'group_id', '443f26b8-8512-437e-a9f9-7e75f8025c22')\n;\n\nselect * from crm_configurations where id = 39;\n\nselect * from teams where id = 1;\nselect * from team_features where team_id = 1;\nselect * from features;\n\nSELECT * FROM activity_searches where id = 1982; # 1981\nSELECT * FROM activity_search_filters WHERE activity_search_id = 1982;\n\nSELECT * FROM automated_reports where id = 68;\nSELECT * FROM automated_report_results where id = 275;\n\nSELECT * FROM automated_reports order by id desc;\nSELECT * FROM automated_report_results order by id desc;\nselect * from activity_searches where user_id = 143;\nselect * from ask_anything_prompts;\n\nSELECT * FROM groups WHERE id = 1439;\nSELECT * FROM users WHERE group_id = 1439;\n\nselect * from permissions; # 158\nselect * from roles;\nselect * from permission_role\n\nselect * from teams where id = 1;\nselect * from groups g JOIN playbooks p on g.playbook_id = p.id where g.team_id = 1;\nselect * from groups where id = 28;\nselect * from playbooks where team_id = 1;\nselect * from playbooks where id = 179;\nselect * from playbook_categories where id = 1391;\nselect * from users where id = 143;\nselect * from crm_profiles where user_id = 143;\nselect * from activities where crm_configuration_id = 39 and type = 'conference'\nand crm_provider_id IS NOT NULL ORDER by id desc;\nselect * from activities where id = 422003; # 00UO400000pB6fpMAC\n\nSELECT ar.id, ar.uuid, ar.media_type, ar.status, a.type\nFROM automated_report_results ar\nJOIN automated_reports a ON a.id = ar.report_id\nWHERE a.type = 'ask_jiminny'\nLIMIT 10;\n\n\nselect * from teams where id = 3143;\nselect * from crm_configurations where id = 500;\nselect * from users where name = 'Integration Account'; # 1695\nSELECT * FROM social_accounts WHERE sociable_id = 1695;","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Project","depth":3,"role_description":"text"},{"role":"AXButton","text":"Project","depth":3,"bounds":{"left":0.011968086,"top":0.047885075,"width":0.024268618,"height":0.024740623},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"New File or Directory…","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Expand Selected","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Collapse All","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Options","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
467660169672458461
|
6397958702907200333
|
click
|
accessibility
|
NULL
|
Project: faVsco.js, menu
#11894 on JY-18909-automa Project: faVsco.js, menu
#11894 on JY-18909-automated-reports-ask-jiminny, menu
Start Listening for PHP Debug Connections
RequestGenerateAskJiminnyReportJobTest
Run 'RequestGenerateAskJiminnyReportJobTest'
Debug 'RequestGenerateAskJiminnyReportJobTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Code changed:
Hide
Sync Changes
Hide This Notification
1
14
4
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Tests\Unit\Jobs\AutomatedReports;
use Carbon\Carbon;
use Jiminny\Component\ProphetAi\Exceptions\ProphetException;
use Jiminny\Component\ProphetAi\ProphetClient;
use Jiminny\Jobs\AutomatedReports\RequestGenerateAskJiminnyReportJob;
use Jiminny\Models\AutomatedReport;
use Jiminny\Models\AutomatedReportResult;
use Jiminny\Models\Team;
use Jiminny\Models\User;
use Jiminny\Services\Kiosk\AutomatedReports\AskJiminnyReportActivityService;
use Jiminny\Services\Kiosk\AutomatedReports\AutomatedReportsService;
use PHPUnit\Framework\MockObject\MockObject;
use PHPUnit\Framework\TestCase;
use Psr\Log\LoggerInterface;
class RequestGenerateAskJiminnyReportJobTest extends TestCase
{
private AutomatedReportsService&MockObject $reportService;
private AskJiminnyReportActivityService&MockObject $activityService;
private ProphetClient&MockObject $prophetClient;
private LoggerInterface&MockObject $logger;
protected function setUp(): void
{
$this->reportService = $this->createMock(AutomatedReportsService::class);
$this->activityService = $this->createMock(AskJiminnyReportActivityService::class);
$this->prophetClient = $this->createMock(ProphetClient::class);
$this->logger = $this->createMock(LoggerInterface::class);
}
private function makeJob(string $uuid = 'report-uuid'): RequestGenerateAskJiminnyReportJob
{
return new RequestGenerateAskJiminnyReportJob($uuid);
}
private function makeActiveReport(
string $type = AutomatedReportsService::TYPE_ASK_JIMINNY,
bool $status = true,
string $teamStatus = Team::STATUS_ACTIVE,
): AutomatedReport&MockObject { // @phpstan-ignore-line
$team = $this->createMock(Team::class);
$team->method('getStatus')->willReturn($teamStatus);
$report = $this->createMock(AutomatedReport::class);
$report->method('getType')->willReturn($type);
$report->method('getStatus')->willReturn($status);
$report->method('getTeam')->willReturn($team);
return $report;
}
public function testUniqueIdReturnsReportUuid(): void
{
$job = $this->makeJob('my-unique-uuid');
$this->assertEquals('my-unique-uuid', $job->uniqueId());
}
public function testHandleSkipsWhenReportTypeIsNotAskJiminny(): void
{
$report = $this->makeActiveReport(type: 'exec_summary');
$this->reportService->expects($this->once())
->method('getReport')
->willReturn($report);
$this->logger->expects($this->once())
->method('info')
->with($this->stringContains('Started'));
$this->logger->expects($this->once())
->method('warning')
->with($this->stringContains('not an ask_jiminny report'));
$this->reportService->expects($this->never())->method('getOrCreateReportResult');
$job = $this->makeJob();
$job->handle($this->reportService, $this->activityService, $this->prophetClient, $this->logger);
}
public function testHandleSkipsWhenReportIsInactive(): void
{
$report = $this->makeActiveReport(status: false);
$this->reportService->expects($this->once())
->method('getReport')
->willReturn($report);
$this->logger->expects($this->exactly(2))
->method('info');
$this->reportService->expects($this->never())->method('getOrCreateReportResult');
$job = $this->makeJob();
$job->handle($this->reportService, $this->activityService, $this->prophetClient, $this->logger);
}
public function testHandleSkipsWhenTeamIsInactive(): void
{
$report = $this->makeActiveReport(teamStatus: Team::STATUS_DEACTIVATED);
$this->reportService->expects($this->once())
->method('getReport')
->willReturn($report);
$this->logger->expects($this->exactly(2))
->method('info');
$this->reportService->expects($this->never())->method('getOrCreateReportResult');
$job = $this->makeJob();
$job->handle($this->reportService, $this->activityService, $this->prophetClient, $this->logger);
}
public function testHandleSkipsWhenCreatorIsNull(): void
{
$report = $this->makeActiveReport();
$report->method('getCreator')->willReturn(null);
$this->reportService->expects($this->once())
->method('getReport')
->willReturn($report);
$this->logger->expects($this->once())
->method('warning')
->with($this->stringContains('report creator not found'));
$this->reportService->expects($this->never())->method('getOrCreateReportResult');
$job = $this->makeJob();
$job->handle($this->reportService, $this->activityService, $this->prophetClient, $this->logger);
}
public function testHandleSkipsWhenSavedSearchIsNull(): void
{
$creator = $this->createMock(User::class);
$report = $this->makeActiveReport();
$report->method('getCreator')->willReturn($creator);
$report->method('getSavedSearch')->willReturn(null);
$this->reportService->expects($this->once())
->method('getReport')
->willReturn($report);
$this->logger->expects($this->once())
->method('warning')
->with($this->stringContains('saved search not found'));
$this->reportService->expects($this->never())->method('getOrCreateReportResult');
$job = $this->makeJob();
$job->handle($this->reportService, $this->activityService, $this->prophetClient, $this->logger);
}
public function testHandleSkipsWhenPromptIsNull(): void
{
$creator = $this->createMock(User::class);
$savedSearch = $this->createMock(\Jiminny\Models\Activity\Search::class);
$report = $this->makeActiveReport();
$report->method('getCreator')->willReturn($creator);
$report->method('getSavedSearch')->willReturn($savedSearch);
$report->method('getAskAnythingPrompt')->willReturn(null);
$this->reportService->expects($this->once())
->method('getReport')
->willReturn($report);
$this->logger->expects($this->once())
->method('warning')
->with($this->stringContains('ask anything prompt not found'));
$this->reportService->expects($this->never())->method('getOrCreateReportResult');
$job = $this->makeJob();
$job->handle($this->reportService, $this->activityService, $this->prophetClient, $this->logger);
}
public function testHandleFailsReportWhenNotEnoughActivities(): void
{
$creator = $this->createMock(User::class);
$savedSearch = $this->createMock(\Jiminny\Models\Activity\Search::class);
$prompt = $this->createMock(\Jiminny\Models\AskAnything\AskAnythingPrompt::class);
$report = $this->makeActiveReport();
$report->method('getCreator')->willReturn($creator);
$report->method('getSavedSearch')->willReturn($savedSearch);
$report->method('getAskAnythingPrompt')->willReturn($prompt);
$reportResult = $this->createMock(AutomatedReportResult::class);
$reportResult->expects($this->once())
->method('update')
->with($this->callback(fn ($data) => $data['status'] === AutomatedReportResult::STATUS_FAILED
&& $data['reason'] === AutomatedReportResult::REASON_NOT_ENOUGH_ACTIVITIES));
$this->reportService->expects($this->once())
->method('getReport')
->willReturn($report);
$this->reportService->expects($this->once())
->method('getOrCreateReportResult')
->willReturn($reportResult);
$this->activityService->expects($this->once())
->method('getActivityIdsForSavedSearch')
->willReturn([]);
$this->logger->expects($this->exactly(3))
->method('info');
$job = $this->makeJob();
$job->handle($this->reportService, $this->activityService, $this->prophetClient, $this->logger);
}
public function testHandleSuccessfullyRequestsReport(): void
{
Carbon::setTestNow(Carbon::parse('2026-04-07 10:00:00'));
$creator = $this->createMock(User::class);
$savedSearch = $this->createMock(\Jiminny\Models\Activity\Search::class);
$prompt = $this->createMock(\Jiminny\Models\AskAnything\AskAnythingPrompt::class);
$report = $this->makeActiveReport();
$report->method('getCreator')->willReturn($creator);
$report->method('getSavedSearch')->willReturn($savedSearch);
$report->method('getAskAnythingPrompt')->willReturn($prompt);
$report->method('getUuid')->willReturn('report-uuid');
$reportResult = $this->createMock(AutomatedReportResult::class);
$reportResult->method('getUuid')->willReturn('result-uuid');
$reportResult->expects($this->once())
->method('update')
->with($this->callback(fn ($data) => $data['status'] === AutomatedReportResult::STATUS_REQUESTED
&& isset($data['name'], $data['payload'], $data['requested_at'])));
$this->reportService->expects($this->once())
->method('getReport')
->willReturn($report);
$this->reportService->expects($this->once())
->method('getOrCreateReportResult')
->willReturn($reportResult);
$this->reportService->expects($this->once())
->method('getAskJiminnyGenerateReportPayload')
->willReturn(['key' => 'value']);
$this->reportService->expects($this->once())
->method('getReportFileName')
->willReturn('My Report - 7 Apr 2026');
$this->activityService->expects($this->once())
->method('getActivityIdsForSavedSearch')
->willReturn(['act-1', 'act-2']);
$this->prophetClient->expects($this->once())
->method('sendRequest')
->willReturn(new \Jiminny\Component\ProphetAi\Dtos\ProphetResponseDto([]));
$this->logger->expects($this->exactly(4))
->method('info');
$job = $this->makeJob();
$job->handle($this->reportService, $this->activityService, $this->prophetClient, $this->logger);
Carbon::setTestNow();
}
public function testHandleCatchesGenericExceptionAndLogsError(): void
{
$this->reportService->expects($this->once())
->method('getReport')
->willThrowException(new \RuntimeException('DB error'));
$this->logger->expects($this->once())
->method('error')
->with($this->stringContains('Error'));
$job = $this->makeJob();
$reflection = new \ReflectionClass($job);
$triesProp = $reflection->getProperty('tries');
$triesProp->setAccessible(true);
$job->handle($this->reportService, $this->activityService, $this->prophetClient, $this->logger);
}
public function testHandleCatchesProphetExceptionAndSetsCorrectReason(): void
{
$creator = $this->createMock(User::class);
$savedSearch = $this->createMock(\Jiminny\Models\Activity\Search::class);
$prompt = $this->createMock(\Jiminny\Models\AskAnything\AskAnythingPrompt::class);
$report = $this->makeActiveReport();
$report->method('getCreator')->willReturn($creator);
$report->method('getSavedSearch')->willReturn($savedSearch);
$report->method('getAskAnythingPrompt')->willReturn($prompt);
$reportResult = $this->createMock(AutomatedReportResult::class);
$reportResult->method('getUuid')->willReturn('result-uuid');
$reportResult->expects($this->once())
->method('update')
->with($this->callback(fn ($data) => $data['reason'] === AutomatedReportResult::REASON_PROPHET_API_ERROR));
$this->reportService->expects($this->once())
->method('getReport')
->willReturn($report);
$this->reportService->expects($this->once())
->method('getOrCreateReportResult')
->willReturn($reportResult);
$this->activityService->expects($this->once())
->method('getActivityIdsForSavedSearch')
->willThrowException(new ProphetException('Prophet failed'));
$this->logger->expects($this->once())
->method('error');
$job = $this->makeJob();
$job->handle($this->reportService, $this->activityService, $this->prophetClient, $this->logger);
}
public function testHandleCreatesReportResultBeforeActivityFetch(): void
{
$creator = $this->createMock(User::class);
$savedSearch = $this->createMock(\Jiminny\Models\Activity\Search::class);
$prompt = $this->createMock(\Jiminny\Models\AskAnything\AskAnythingPrompt::class);
$report = $this->makeActiveReport();
$report->method('getCreator')->willReturn($creator);
$report->method('getSavedSearch')->willReturn($savedSearch);
$report->method('getAskAnythingPrompt')->willReturn($prompt);
$reportResult = $this->createMock(AutomatedReportResult::class);
$reportResult->method('getUuid')->willReturn('result-uuid');
$callOrder = [];
$this->reportService->expects($this->once())
->method('getReport')
->willReturn($report);
$this->reportService->expects($this->once())
->method('getOrCreateReportResult')
->willReturnCallback(function () use ($reportResult, &$callOrder) {
$callOrder[] = 'getOrCreateReportResult';
return $reportResult;
});
$this->activityService->expects($this->once())
->method('getActivityIdsForSavedSearch')
->willReturnCallback(function () use (&$callOrder) {
$callOrder[] = 'getActivityIds';
return [];
});
$job = $this->makeJob();
$job->handle($this->reportService, $this->activityService, $this->prophetClient, $this->logger);
$this->assertEquals(['getOrCreateReportResult', 'getActivityIds'], $callOrder);
}
public function testHandlePassesCorrectDataToCreateReportResult(): void
{
$creator = $this->createMock(User::class);
$savedSearch = $this->createMock(\Jiminny\Models\Activity\Search::class);
$prompt = $this->createMock(\Jiminny\Models\AskAnything\AskAnythingPrompt::class);
$report = $this->makeActiveReport();
$report->method('getCreator')->willReturn($creator);
$report->method('getSavedSearch')->willReturn($savedSearch);
$report->method('getAskAnythingPrompt')->willReturn($prompt);
$reportResult = $this->createMock(AutomatedReportResult::class);
$reportResult->method('getUuid')->willReturn('result-uuid');
$reportResult->method('update')->willReturn(true);
$this->reportService->expects($this->once())
->method('getReport')
->willReturn($report);
$this->reportService->expects($this->once())
->method('getOrCreateReportResult')
->with(
automatedReport: $report,
data: $this->callback(fn ($data) => $data['status'] === AutomatedReportResult::STATUS_DEFAULT
&& $data['media_type'] === AutomatedReportsService::MEDIA_TYPE_PDF)
)
->willReturn($reportResult);
$this->activityService->expects($this->once())
->method('getActivityIdsForSavedSearch')
->willReturn([]);
$job = $this->makeJob();
$job->handle($this->reportService, $this->activityService, $this->prophetClient, $this->logger);
}
}
Execute
Explain Plan
Browse Query History
View Parameters
Open Query Execution Settings…
In-Editor Results
Tx: Auto
Cancel Running Statements
Playground
jiminny
Code changed:
Hide
Sync Changes
Hide This Notification
9
12
2
4
Previous Highlighted Error
Next Highlighted Error
SELECT a.id, a.uuid, a.actual_start_time, o.id, o.uuid FROM opportunities o
JOIN activities a ON o.id = a.opportunity_id
WHERE a.crm_configuration_id = 39
AND a.actual_start_time > '2025-10-13'
AND a.type IN ('conference', 'softphone-inbound', 'softphone-outbound')
;
SELECT * FROM activities
WHERE crm_configuration_id = 39 and user_id = 143
and actual_start_time >= '2025-10-13'
AND type IN ('conference', 'softphone-inbound', 'softphone-outbound')
;
SELECT * FROM opportunities WHERE account_id IN (178);
select * from activities where id IN (620137, 620187, 620188, 620189, 620230);
# HS
SELECT * FROM opportunities WHERE id IN (238);
select * from activities where id IN (477,2076);
select * from users;
SELECT COUNT(*) FROM users;
SELECT COUNT(*) FROM activities;
SELECT COUNT(*) FROM opportunities;
UPDATE activities
SET
actual_start_time = '2025-12-19 09:00:00',
actual_end_time = '2025-12-19 10:30:00',
scheduled_start_time = '2025-12-19 09:00:00',
scheduled_end_time = '2025-12-19 10:30:00'
WHERE id IN (407509,407375);
select * from partners;
SELECT id, uuid, type, actual_start_time, user_id, crm_configuration_id
FROM activities
WHERE user_id = 143
AND actual_start_time >= '2025-10-13 00:00:00'
AND actual_start_time <= '2026-01-13 23:59:59'
ORDER BY actual_start_time DESC;
SELECT * FROM activities WHERE uuid_to_bin('78eda160-3086-435f-88a5-bb0c71b6008d') = uuid;
SELECT * FROM crm_layouts where crm_configuration_id = 39;
SELECT * FROM crm_layout_entities WHERE crm_layout_id = 282;
# lead_id
# account_id 177
# contact_id 3969
# opportunity_id
# stage_id 203
SELECT * FROM opportunities WHERE opportunities.crm_configuration_id = id = 282;
SELECT * FROM activities where crm_configuration_id = 39 AND type = 'conference'
AND user_id = 143 and actual_start_time >= '2025-10-13';
SELECT * FROM activities a
# JOIN opportunities o ON a.opportunity_id = o.id
WHERE a.crm_configuration_id = 39 AND a.type = 'conference'
and status = 'completed' and recording_state = 'recorded'
and a.actual_start_time >= '2025-10-13'
AND a.user_id = 143
;
select * from leads
where crm_configuration_id = 39; # 112 -> ac. 178, 109 => op. 1707
SELECT * FROM activities WHERE id IN (356013,616188,616202,616310,407509,407375,356001,356008);
SELECT * FROM activities WHERE id IN (356013,616188,616202,616310);
SELECT * FROM activities WHERE id IN (407509,407375); # leads: 112, 109 | status - 198
SELECT * FROM activities WHERE id IN (356001, 356008); # contacts:
SELECT * FROM opportunities WHERE id IN (1707);
SELECT * FROM stages where id IN (204, 198);
SELECT * FROM opportunities WHERE account_id IN (178);
SELECT * FROM opportunities WHERE crm_configuration_id = 39 AND created_at > '2025-01-01';
SELECT * FROM contacts WHERE account_id IN (178); # 4118 Musaibe, 4448 Ceco Personal
SELECT * FROM activities where crm_configuration_id = 39
AND opportunity_id IS NULL
AND is_internal = false
and status = 'completed' and recording_state = 'recorded'
AND actual_start_time >= '2025-10-13'
AND (lead_id IS NOT NULL OR contact_id IS NOT NULL OR account_id IS NOT NULL)
# AND lead_id IN (112, 109)
;
SELECT * FROM crm_profiles WHERE user_id = 143;
select * from inboxes; # 212
select * from users where id = 143; # 143
select * from inbox_email_batches where inbox_id = 212
and updated_at >= '2026-01-28 00:00:00' order by id desc;
select * from inbox_emails where inbox_id = 212
and batch_id = 95885 order by id desc;
select * from email_messages where origin_user_id = 143;
select * from activities where user_id = 143 and updated_at >= '2026-01-28 00:00:00';
select * from participants where activity_id = 620247;
select * from crm_profiles where user_id = 143;
SELECT * FROM activities WHERE uuid_to_bin('458cf915-b914-4000-b083-5687b32b2956') = uuid; # 356001
select * from transcription where activity_id = 356001; # 6943
select * from ai_prompts where transcription_id = 6943;
SELECT * FROM activity_summary_logs where activity_id = 356001;
SELECT * FROM social_accounts WHERE sociable_id = 143;
# [PASSWORD_DOTS]
SELECT * FROM activities WHERE uuid_to_bin('0164a4fb-cb95-454e-9edd-4d804e4999bd') = uuid;
# 422515 softphone tr. 8100
SELECT * FROM activities WHERE uuid_to_bin('7520add8-8d87-41a5-98e5-fc4edf96f21e') = uuid;
# 407509 conference tr. 7670 crmId: 00UD1000002J9aTMAS
select * from ai_prompts where transcription_id IN (8100, 7670);
select * from activity_summary_logs where activity_id = 407509;
select * from sidekick_settings;
select * from default_activity_types;
SELECT * FROM contacts WHERE crm_configuration_id = 39 and email = '[EMAIL]';
SELECT * FROM leads WHERE crm_configuration_id = 39 and email = '[EMAIL]';
SELECT * FROM activity_searches where user_id = 143;
SELECT * FROM groups where team_id = 1;
select * from teams where id = 1;
select * from groups where team_id = 1; # 1150 - 7e75f8025c22
select id, name, group_id, status, deleted_at, email
from users where team_id = 1 order by group_id desc ;
select * from activity_searches where id in (1977, 1978, 1979);
select * from activity_search_filters where activity_search_id IN (1977, 1978, 1979);
select * from activity_search_filters where filter = 'group_id' and value = '443f26b8-8512-437e-a9f9-7e75f8025c22'; # 10268, 10272, 10277
select * from nudges where activity_search_id IN (1977, 1978, 1979); # 877, 878, 879
INSERT INTO `activity_search_filters`
(`activity_search_id`, `filter`, `value`) VALUES
(1977, 'group_id', '443f26b8-8512-437e-a9f9-7e75f8025c22'),
(1978, 'group_id', '443f26b8-8512-437e-a9f9-7e75f8025c22'),
(1979, 'group_id', '443f26b8-8512-437e-a9f9-7e75f8025c22')
;
select * from crm_configurations where id = 39;
select * from teams where id = 1;
select * from team_features where team_id = 1;
select * from features;
SELECT * FROM activity_searches where id = 1982; # 1981
SELECT * FROM activity_search_filters WHERE activity_search_id = 1982;
SELECT * FROM automated_reports where id = 68;
SELECT * FROM automated_report_results where id = 275;
SELECT * FROM automated_reports order by id desc;
SELECT * FROM automated_report_results order by id desc;
select * from activity_searches where user_id = 143;
select * from ask_anything_prompts;
SELECT * FROM groups WHERE id = 1439;
SELECT * FROM users WHERE group_id = 1439;
select * from permissions; # 158
select * from roles;
select * from permission_role
select * from teams where id = 1;
select * from groups g JOIN playbooks p on g.playbook_id = p.id where g.team_id = 1;
select * from groups where id = 28;
select * from playbooks where team_id = 1;
select * from playbooks where id = 179;
select * from playbook_categories where id = 1391;
select * from users where id = 143;
select * from crm_profiles where user_id = 143;
select * from activities where crm_configuration_id = 39 and type = 'conference'
and crm_provider_id IS NOT NULL ORDER by id desc;
select * from activities where id = 422003; # 00UO400000pB6fpMAC
SELECT ar.id, ar.uuid, ar.media_type, ar.status, a.type
FROM automated_report_results ar
JOIN automated_reports a ON a.id = ar.report_id
WHERE a.type = 'ask_jiminny'
LIMIT 10;
select * from teams where id = 3143;
select * from crm_configurations where id = 500;
select * from users where name = 'Integration Account'; # 1695
SELECT * FROM social_accounts WHERE sociable_id = 1695;
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide...
|
NULL
|
|
54503
|
NULL
|
0
|
2026-04-20T09:01:53.535017+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-20/1776 /Users/lukas/.screenpipe/data/data/2026-04-20/1776675713535_m1.jpg...
|
PhpStorm
|
faVsco.js – RequestGenerateAskJiminnyReportJobTest faVsco.js – RequestGenerateAskJiminnyReportJobTest.php...
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
#11894 on JY-18909-automa Project: faVsco.js, menu
#11894 on JY-18909-automated-reports-ask-jiminny, menu
Start Listening for PHP Debug Connections
RequestGenerateAskJiminnyReportJobTest
Run 'RequestGenerateAskJiminnyReportJobTest'
Debug 'RequestGenerateAskJiminnyReportJobTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Code changed:
Hide
Sync Changes
Hide This Notification
1
14
4
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Tests\Unit\Jobs\AutomatedReports;
use Carbon\Carbon;
use Jiminny\Component\ProphetAi\Exceptions\ProphetException;
use Jiminny\Component\ProphetAi\ProphetClient;
use Jiminny\Jobs\AutomatedReports\RequestGenerateAskJiminnyReportJob;
use Jiminny\Models\AutomatedReport;
use Jiminny\Models\AutomatedReportResult;
use Jiminny\Models\Team;
use Jiminny\Models\User;
use Jiminny\Services\Kiosk\AutomatedReports\AskJiminnyReportActivityService;
use Jiminny\Services\Kiosk\AutomatedReports\AutomatedReportsService;
use PHPUnit\Framework\MockObject\MockObject;
use PHPUnit\Framework\TestCase;
use Psr\Log\LoggerInterface;
class RequestGenerateAskJiminnyReportJobTest extends TestCase
{
private AutomatedReportsService&MockObject $reportService;
private AskJiminnyReportActivityService&MockObject $activityService;
private ProphetClient&MockObject $prophetClient;
private LoggerInterface&MockObject $logger;
protected function setUp(): void
{
$this->reportService = $this->createMock(AutomatedReportsService::class);
$this->activityService = $this->createMock(AskJiminnyReportActivityService::class);
$this->prophetClient = $this->createMock(ProphetClient::class);
$this->logger = $this->createMock(LoggerInterface::class);
}
private function makeJob(string $uuid = 'report-uuid'): RequestGenerateAskJiminnyReportJob
{
return new RequestGenerateAskJiminnyReportJob($uuid);
}
private function makeActiveReport(
string $type = AutomatedReportsService::TYPE_ASK_JIMINNY,
bool $status = true,
string $teamStatus = Team::STATUS_ACTIVE,
): AutomatedReport&MockObject { // @phpstan-ignore-line
$team = $this->createMock(Team::class);
$team->method('getStatus')->willReturn($teamStatus);
$report = $this->createMock(AutomatedReport::class);
$report->method('getType')->willReturn($type);
$report->method('getStatus')->willReturn($status);
$report->method('getTeam')->willReturn($team);
return $report;
}
public function testUniqueIdReturnsReportUuid(): void
{
$job = $this->makeJob('my-unique-uuid');
$this->assertEquals('my-unique-uuid', $job->uniqueId());
}
public function testHandleSkipsWhenReportTypeIsNotAskJiminny(): void
{
$report = $this->makeActiveReport(type: 'exec_summary');
$this->reportService->expects($this->once())
->method('getReport')
->willReturn($report);
$this->logger->expects($this->once())
->method('info')
->with($this->stringContains('Started'));
$this->logger->expects($this->once())
->method('warning')
->with($this->stringContains('not an ask_jiminny report'));
$this->reportService->expects($this->never())->method('getOrCreateReportResult');
$job = $this->makeJob();
$job->handle($this->reportService, $this->activityService, $this->prophetClient, $this->logger);
}
public function testHandleSkipsWhenReportIsInactive(): void
{
$report = $this->makeActiveReport(status: false);
$this->reportService->expects($this->once())
->method('getReport')
->willReturn($report);
$this->logger->expects($this->exactly(2))
->method('info');
$this->reportService->expects($this->never())->method('getOrCreateReportResult');
$job = $this->makeJob();
$job->handle($this->reportService, $this->activityService, $this->prophetClient, $this->logger);
}
public function testHandleSkipsWhenTeamIsInactive(): void
{
$report = $this->makeActiveReport(teamStatus: Team::STATUS_DEACTIVATED);
$this->reportService->expects($this->once())
->method('getReport')
->willReturn($report);
$this->logger->expects($this->exactly(2))
->method('info');
$this->reportService->expects($this->never())->method('getOrCreateReportResult');
$job = $this->makeJob();
$job->handle($this->reportService, $this->activityService, $this->prophetClient, $this->logger);
}
public function testHandleSkipsWhenCreatorIsNull(): void
{
$report = $this->makeActiveReport();
$report->method('getCreator')->willReturn(null);
$this->reportService->expects($this->once())
->method('getReport')
->willReturn($report);
$this->logger->expects($this->once())
->method('warning')
->with($this->stringContains('report creator not found'));
$this->reportService->expects($this->never())->method('getOrCreateReportResult');
$job = $this->makeJob();
$job->handle($this->reportService, $this->activityService, $this->prophetClient, $this->logger);
}
public function testHandleSkipsWhenSavedSearchIsNull(): void
{
$creator = $this->createMock(User::class);
$report = $this->makeActiveReport();
$report->method('getCreator')->willReturn($creator);
$report->method('getSavedSearch')->willReturn(null);
$this->reportService->expects($this->once())
->method('getReport')
->willReturn($report);
$this->logger->expects($this->once())
->method('warning')
->with($this->stringContains('saved search not found'));
$this->reportService->expects($this->never())->method('getOrCreateReportResult');
$job = $this->makeJob();
$job->handle($this->reportService, $this->activityService, $this->prophetClient, $this->logger);
}
public function testHandleSkipsWhenPromptIsNull(): void
{
$creator = $this->createMock(User::class);
$savedSearch = $this->createMock(\Jiminny\Models\Activity\Search::class);
$report = $this->makeActiveReport();
$report->method('getCreator')->willReturn($creator);
$report->method('getSavedSearch')->willReturn($savedSearch);
$report->method('getAskAnythingPrompt')->willReturn(null);
$this->reportService->expects($this->once())
->method('getReport')
->willReturn($report);
$this->logger->expects($this->once())
->method('warning')
->with($this->stringContains('ask anything prompt not found'));
$this->reportService->expects($this->never())->method('getOrCreateReportResult');
$job = $this->makeJob();
$job->handle($this->reportService, $this->activityService, $this->prophetClient, $this->logger);
}
public function testHandleFailsReportWhenNotEnoughActivities(): void
{
$creator = $this->createMock(User::class);
$savedSearch = $this->createMock(\Jiminny\Models\Activity\Search::class);
$prompt = $this->createMock(\Jiminny\Models\AskAnything\AskAnythingPrompt::class);
$report = $this->makeActiveReport();
$report->method('getCreator')->willReturn($creator);
$report->method('getSavedSearch')->willReturn($savedSearch);
$report->method('getAskAnythingPrompt')->willReturn($prompt);
$reportResult = $this->createMock(AutomatedReportResult::class);
$reportResult->expects($this->once())
->method('update')
->with($this->callback(fn ($data) => $data['status'] === AutomatedReportResult::STATUS_FAILED
&& $data['reason'] === AutomatedReportResult::REASON_NOT_ENOUGH_ACTIVITIES));
$this->reportService->expects($this->once())
->method('getReport')
->willReturn($report);
$this->reportService->expects($this->once())
->method('getOrCreateReportResult')
->willReturn($reportResult);
$this->activityService->expects($this->once())
->method('getActivityIdsForSavedSearch')
->willReturn([]);
$this->logger->expects($this->exactly(3))
->method('info');
$job = $this->makeJob();
$job->handle($this->reportService, $this->activityService, $this->prophetClient, $this->logger);
}
public function testHandleSuccessfullyRequestsReport(): void
{
Carbon::setTestNow(Carbon::parse('2026-04-07 10:00:00'));
$creator = $this->createMock(User::class);
$savedSearch = $this->createMock(\Jiminny\Models\Activity\Search::class);
$prompt = $this->createMock(\Jiminny\Models\AskAnything\AskAnythingPrompt::class);
$report = $this->makeActiveReport();
$report->method('getCreator')->willReturn($creator);
$report->method('getSavedSearch')->willReturn($savedSearch);
$report->method('getAskAnythingPrompt')->willReturn($prompt);
$report->method('getUuid')->willReturn('report-uuid');
$reportResult = $this->createMock(AutomatedReportResult::class);
$reportResult->method('getUuid')->willReturn('result-uuid');
$reportResult->expects($this->once())
->method('update')
->with($this->callback(fn ($data) => $data['status'] === AutomatedReportResult::STATUS_REQUESTED
&& isset($data['name'], $data['payload'], $data['requested_at'])));
$this->reportService->expects($this->once())
->method('getReport')
->willReturn($report);
$this->reportService->expects($this->once())
->method('getOrCreateReportResult')
->willReturn($reportResult);
$this->reportService->expects($this->once())
->method('getAskJiminnyGenerateReportPayload')
->willReturn(['key' => 'value']);
$this->reportService->expects($this->once())
->method('getReportFileName')
->willReturn('My Report - 7 Apr 2026');
$this->activityService->expects($this->once())
->method('getActivityIdsForSavedSearch')
->willReturn(['act-1', 'act-2']);
$this->prophetClient->expects($this->once())
->method('sendRequest')
->willReturn(new \Jiminny\Component\ProphetAi\Dtos\ProphetResponseDto([]));
$this->logger->expects($this->exactly(4))
->method('info');
$job = $this->makeJob();
$job->handle($this->reportService, $this->activityService, $this->prophetClient, $this->logger);
Carbon::setTestNow();
}
public function testHandleCatchesGenericExceptionAndLogsError(): void
{
$this->reportService->expects($this->once())
->method('getReport')
->willThrowException(new \RuntimeException('DB error'));
$this->logger->expects($this->once())
->method('error')
->with($this->stringContains('Error'));
$job = $this->makeJob();
$reflection = new \ReflectionClass($job);
$triesProp = $reflection->getProperty('tries');
$triesProp->setAccessible(true);
$job->handle($this->reportService, $this->activityService, $this->prophetClient, $this->logger);
}
public function testHandleCatchesProphetExceptionAndSetsCorrectReason(): void
{
$creator = $this->createMock(User::class);
$savedSearch = $this->createMock(\Jiminny\Models\Activity\Search::class);
$prompt = $this->createMock(\Jiminny\Models\AskAnything\AskAnythingPrompt::class);
$report = $this->makeActiveReport();
$report->method('getCreator')->willReturn($creator);
$report->method('getSavedSearch')->willReturn($savedSearch);
$report->method('getAskAnythingPrompt')->willReturn($prompt);
$reportResult = $this->createMock(AutomatedReportResult::class);
$reportResult->method('getUuid')->willReturn('result-uuid');
$reportResult->expects($this->once())
->method('update')
->with($this->callback(fn ($data) => $data['reason'] === AutomatedReportResult::REASON_PROPHET_API_ERROR));
$this->reportService->expects($this->once())
->method('getReport')
->willReturn($report);
$this->reportService->expects($this->once())
->method('getOrCreateReportResult')
->willReturn($reportResult);
$this->activityService->expects($this->once())
->method('getActivityIdsForSavedSearch')
->willThrowException(new ProphetException('Prophet failed'));
$this->logger->expects($this->once())
->method('error');
$job = $this->makeJob();
$job->handle($this->reportService, $this->activityService, $this->prophetClient, $this->logger);
}
public function testHandleCreatesReportResultBeforeActivityFetch(): void
{
$creator = $this->createMock(User::class);
$savedSearch = $this->createMock(\Jiminny\Models\Activity\Search::class);
$prompt = $this->createMock(\Jiminny\Models\AskAnything\AskAnythingPrompt::class);
$report = $this->makeActiveReport();
$report->method('getCreator')->willReturn($creator);
$report->method('getSavedSearch')->willReturn($savedSearch);
$report->method('getAskAnythingPrompt')->willReturn($prompt);
$reportResult = $this->createMock(AutomatedReportResult::class);
$reportResult->method('getUuid')->willReturn('result-uuid');
$callOrder = [];
$this->reportService->expects($this->once())
->method('getReport')
->willReturn($report);
$this->reportService->expects($this->once())
->method('getOrCreateReportResult')
->willReturnCallback(function () use ($reportResult, &$callOrder) {
$callOrder[] = 'getOrCreateReportResult';
return $reportResult;
});
$this->activityService->expects($this->once())
->method('getActivityIdsForSavedSearch')
->willReturnCallback(function () use (&$callOrder) {
$callOrder[] = 'getActivityIds';
return [];
});
$job = $this->makeJob();
$job->handle($this->reportService, $this->activityService, $this->prophetClient, $this->logger);
$this->assertEquals(['getOrCreateReportResult', 'getActivityIds'], $callOrder);
}
public function testHandlePassesCorrectDataToCreateReportResult(): void
{
$creator = $this->createMock(User::class);
$savedSearch = $this->createMock(\Jiminny\Models\Activity\Search::class);
$prompt = $this->createMock(\Jiminny\Models\AskAnything\AskAnythingPrompt::class);
$report = $this->makeActiveReport();
$report->method('getCreator')->willReturn($creator);
$report->method('getSavedSearch')->willReturn($savedSearch);
$report->method('getAskAnythingPrompt')->willReturn($prompt);
$reportResult = $this->createMock(AutomatedReportResult::class);
$reportResult->method('getUuid')->willReturn('result-uuid');
$reportResult->method('update')->willReturn(true);
$this->reportService->expects($this->once())
->method('getReport')
->willReturn($report);
$this->reportService->expects($this->once())
->method('getOrCreateReportResult')
->with(
automatedReport: $report,
data: $this->callback(fn ($data) => $data['status'] === AutomatedReportResult::STATUS_DEFAULT
&& $data['media_type'] === AutomatedReportsService::MEDIA_TYPE_PDF)
)
->willReturn($reportResult);
$this->activityService->expects($this->once())
->method('getActivityIdsForSavedSearch')
->willReturn([]);
$job = $this->makeJob();
$job->handle($this->reportService, $this->activityService, $this->prophetClient, $this->logger);
}
}
Execute
Explain Plan
Browse Query History
View Parameters
Open Query Execution Settings…
In-Editor Results
Tx: Auto
Cancel Running Statements
Playground
jiminny
Code changed:
Hide
Sync Changes
Hide This Notification
9
12
2
4
Previous Highlighted Error
Next Highlighted Error
SELECT a.id, a.uuid, a.actual_start_time, o.id, o.uuid FROM opportunities o
JOIN activities a ON o.id = a.opportunity_id
WHERE a.crm_configuration_id = 39
AND a.actual_start_time > '2025-10-13'
AND a.type IN ('conference', 'softphone-inbound', 'softphone-outbound')
;
SELECT * FROM activities
WHERE crm_configuration_id = 39 and user_id = 143
and actual_start_time >= '2025-10-13'
AND type IN ('conference', 'softphone-inbound', 'softphone-outbound')
;
SELECT * FROM opportunities WHERE account_id IN (178);
select * from activities where id IN (620137, 620187, 620188, 620189, 620230);
# HS
SELECT * FROM opportunities WHERE id IN (238);
select * from activities where id IN (477,2076);
select * from users;
SELECT COUNT(*) FROM users;
SELECT COUNT(*) FROM activities;
SELECT COUNT(*) FROM opportunities;
UPDATE activities
SET
actual_start_time = '2025-12-19 09:00:00',
actual_end_time = '2025-12-19 10:30:00',
scheduled_start_time = '2025-12-19 09:00:00',
scheduled_end_time = '2025-12-19 10:30:00'
WHERE id IN (407509,407375);
select * from partners;
SELECT id, uuid, type, actual_start_time, user_id, crm_configuration_id
FROM activities
WHERE user_id = 143
AND actual_start_time >= '2025-10-13 00:00:00'
AND actual_start_time <= '2026-01-13 23:59:59'
ORDER BY actual_start_time DESC;
SELECT * FROM activities WHERE uuid_to_bin('78eda160-3086-435f-88a5-bb0c71b6008d') = uuid;
SELECT * FROM crm_layouts where crm_configuration_id = 39;
SELECT * FROM crm_layout_entities WHERE crm_layout_id = 282;
# lead_id
# account_id 177
# contact_id 3969
# opportunity_id
# stage_id 203
SELECT * FROM opportunities WHERE opportunities.crm_configuration_id = id = 282;
SELECT * FROM activities where crm_configuration_id = 39 AND type = 'conference'
AND user_id = 143 and actual_start_time >= '2025-10-13';
SELECT * FROM activities a
# JOIN opportunities o ON a.opportunity_id = o.id
WHERE a.crm_configuration_id = 39 AND a.type = 'conference'
and status = 'completed' and recording_state = 'recorded'
and a.actual_start_time >= '2025-10-13'
AND a.user_id = 143
;
select * from leads
where crm_configuration_id = 39; # 112 -> ac. 178, 109 => op. 1707
SELECT * FROM activities WHERE id IN (356013,616188,616202,616310,407509,407375,356001,356008);
SELECT * FROM activities WHERE id IN (356013,616188,616202,616310);
SELECT * FROM activities WHERE id IN (407509,407375); # leads: 112, 109 | status - 198
SELECT * FROM activities WHERE id IN (356001, 356008); # contacts:
SELECT * FROM opportunities WHERE id IN (1707);
SELECT * FROM stages where id IN (204, 198);
SELECT * FROM opportunities WHERE account_id IN (178);
SELECT * FROM opportunities WHERE crm_configuration_id = 39 AND created_at > '2025-01-01';
SELECT * FROM contacts WHERE account_id IN (178); # 4118 Musaibe, 4448 Ceco Personal
SELECT * FROM activities where crm_configuration_id = 39
AND opportunity_id IS NULL
AND is_internal = false
and status = 'completed' and recording_state = 'recorded'
AND actual_start_time >= '2025-10-13'
AND (lead_id IS NOT NULL OR contact_id IS NOT NULL OR account_id IS NOT NULL)
# AND lead_id IN (112, 109)
;
SELECT * FROM crm_profiles WHERE user_id = 143;
select * from inboxes; # 212
select * from users where id = 143; # 143
select * from inbox_email_batches where inbox_id = 212
and updated_at >= '2026-01-28 00:00:00' order by id desc;
select * from inbox_emails where inbox_id = 212
and batch_id = 95885 order by id desc;
select * from email_messages where origin_user_id = 143;
select * from activities where user_id = 143 and updated_at >= '2026-01-28 00:00:00';
select * from participants where activity_id = 620247;
select * from crm_profiles where user_id = 143;
SELECT * FROM activities WHERE uuid_to_bin('458cf915-b914-4000-b083-5687b32b2956') = uuid; # 356001
select * from transcription where activity_id = 356001; # 6943
select * from ai_prompts where transcription_id = 6943;
SELECT * FROM activity_summary_logs where activity_id = 356001;
SELECT * FROM social_accounts WHERE sociable_id = 143;
# [PASSWORD_DOTS]
SELECT * FROM activities WHERE uuid_to_bin('0164a4fb-cb95-454e-9edd-4d804e4999bd') = uuid;
# 422515 softphone tr. 8100
SELECT * FROM activities WHERE uuid_to_bin('7520add8-8d87-41a5-98e5-fc4edf96f21e') = uuid;
# 407509 conference tr. 7670 crmId: 00UD1000002J9aTMAS
select * from ai_prompts where transcription_id IN (8100, 7670);
select * from activity_summary_logs where activity_id = 407509;
select * from sidekick_settings;
select * from default_activity_types;
SELECT * FROM contacts WHERE crm_configuration_id = 39 and email = '[EMAIL]';
SELECT * FROM leads WHERE crm_configuration_id = 39 and email = '[EMAIL]';
SELECT * FROM activity_searches where user_id = 143;
SELECT * FROM groups where team_id = 1;
select * from teams where id = 1;
select * from groups where team_id = 1; # 1150 - 7e75f8025c22
select id, name, group_id, status, deleted_at, email
from users where team_id = 1 order by group_id desc ;
select * from activity_searches where id in (1977, 1978, 1979);
select * from activity_search_filters where activity_search_id IN (1977, 1978, 1979);
select * from activity_search_filters where filter = 'group_id' and value = '443f26b8-8512-437e-a9f9-7e75f8025c22'; # 10268, 10272, 10277
select * from nudges where activity_search_id IN (1977, 1978, 1979); # 877, 878, 879
INSERT INTO `activity_search_filters`
(`activity_search_id`, `filter`, `value`) VALUES
(1977, 'group_id', '443f26b8-8512-437e-a9f9-7e75f8025c22'),
(1978, 'group_id', '443f26b8-8512-437e-a9f9-7e75f8025c22'),
(1979, 'group_id', '443f26b8-8512-437e-a9f9-7e75f8025c22')
;
select * from crm_configurations where id = 39;
select * from teams where id = 1;
select * from team_features where team_id = 1;
select * from features;
SELECT * FROM activity_searches where id = 1982; # 1981
SELECT * FROM activity_search_filters WHERE activity_search_id = 1982;
SELECT * FROM automated_reports where id = 68;
SELECT * FROM automated_report_results where id = 275;
SELECT * FROM automated_reports order by id desc;
SELECT * FROM automated_report_results order by id desc;
select * from activity_searches where user_id = 143;
select * from ask_anything_prompts;
SELECT * FROM groups WHERE id = 1439;
SELECT * FROM users WHERE group_id = 1439;
select * from permissions; # 158
select * from roles;
select * from permission_role
select * from teams where id = 1;
select * from groups g JOIN playbooks p on g.playbook_id = p.id where g.team_id = 1;
select * from groups where id = 28;
select * from playbooks where team_id = 1;
select * from playbooks where id = 179;
select * from playbook_categories where id = 1391;
select * from users where id = 143;
select * from crm_profiles where user_id = 143;
select * from activities where crm_configuration_id = 39 and type = 'conference'
and crm_provider_id IS NOT NULL ORDER by id desc;
select * from activities where id = 422003; # 00UO400000pB6fpMAC
SELECT ar.id, ar.uuid, ar.media_type, ar.status, a.type
FROM automated_report_results ar
JOIN automated_reports a ON a.id = ar.report_id
WHERE a.type = 'ask_jiminny'
LIMIT 10;
select * from teams where id = 3143;
select * from crm_configurations where id = 500;
select * from users where name = 'Integration Account'; # 1695
SELECT * FROM social_accounts WHERE sociable_id = 1695;
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"#11894 on JY-18909-automated-reports-ask-jiminny, menu","depth":5,"help_text":"Pull request #11894 exists for current branch JY-18909-automated-reports-ask-jiminny","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"RequestGenerateAskJiminnyReportJobTest","depth":6,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run 'RequestGenerateAskJiminnyReportJobTest'","depth":6,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'RequestGenerateAskJiminnyReportJobTest'","depth":6,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"More Actions","depth":6,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JetBrains AI","depth":5,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Search Everywhere","depth":5,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"IDE and Project Settings","depth":5,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.088194445,"height":0.027777778},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"1","depth":4,"role_description":"text"},{"role":"AXStaticText","text":"14","depth":4,"role_description":"text"},{"role":"AXStaticText","text":"4","depth":4,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Tests\\Unit\\Jobs\\AutomatedReports;\n\nuse Carbon\\Carbon;\nuse Jiminny\\Component\\ProphetAi\\Exceptions\\ProphetException;\nuse Jiminny\\Component\\ProphetAi\\ProphetClient;\nuse Jiminny\\Jobs\\AutomatedReports\\RequestGenerateAskJiminnyReportJob;\nuse Jiminny\\Models\\AutomatedReport;\nuse Jiminny\\Models\\AutomatedReportResult;\nuse Jiminny\\Models\\Team;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Services\\Kiosk\\AutomatedReports\\AskJiminnyReportActivityService;\nuse Jiminny\\Services\\Kiosk\\AutomatedReports\\AutomatedReportsService;\nuse PHPUnit\\Framework\\MockObject\\MockObject;\nuse PHPUnit\\Framework\\TestCase;\nuse Psr\\Log\\LoggerInterface;\n\nclass RequestGenerateAskJiminnyReportJobTest extends TestCase\n{\n private AutomatedReportsService&MockObject $reportService;\n private AskJiminnyReportActivityService&MockObject $activityService;\n private ProphetClient&MockObject $prophetClient;\n private LoggerInterface&MockObject $logger;\n\n protected function setUp(): void\n {\n $this->reportService = $this->createMock(AutomatedReportsService::class);\n $this->activityService = $this->createMock(AskJiminnyReportActivityService::class);\n $this->prophetClient = $this->createMock(ProphetClient::class);\n $this->logger = $this->createMock(LoggerInterface::class);\n }\n\n private function makeJob(string $uuid = 'report-uuid'): RequestGenerateAskJiminnyReportJob\n {\n return new RequestGenerateAskJiminnyReportJob($uuid);\n }\n\n private function makeActiveReport(\n string $type = AutomatedReportsService::TYPE_ASK_JIMINNY,\n bool $status = true,\n string $teamStatus = Team::STATUS_ACTIVE,\n ): AutomatedReport&MockObject { // @phpstan-ignore-line\n $team = $this->createMock(Team::class);\n $team->method('getStatus')->willReturn($teamStatus);\n\n $report = $this->createMock(AutomatedReport::class);\n $report->method('getType')->willReturn($type);\n $report->method('getStatus')->willReturn($status);\n $report->method('getTeam')->willReturn($team);\n\n return $report;\n }\n\n public function testUniqueIdReturnsReportUuid(): void\n {\n $job = $this->makeJob('my-unique-uuid');\n\n $this->assertEquals('my-unique-uuid', $job->uniqueId());\n }\n\n public function testHandleSkipsWhenReportTypeIsNotAskJiminny(): void\n {\n $report = $this->makeActiveReport(type: 'exec_summary');\n\n $this->reportService->expects($this->once())\n ->method('getReport')\n ->willReturn($report);\n\n $this->logger->expects($this->once())\n ->method('info')\n ->with($this->stringContains('Started'));\n\n $this->logger->expects($this->once())\n ->method('warning')\n ->with($this->stringContains('not an ask_jiminny report'));\n\n $this->reportService->expects($this->never())->method('getOrCreateReportResult');\n\n $job = $this->makeJob();\n $job->handle($this->reportService, $this->activityService, $this->prophetClient, $this->logger);\n }\n\n public function testHandleSkipsWhenReportIsInactive(): void\n {\n $report = $this->makeActiveReport(status: false);\n\n $this->reportService->expects($this->once())\n ->method('getReport')\n ->willReturn($report);\n\n $this->logger->expects($this->exactly(2))\n ->method('info');\n\n $this->reportService->expects($this->never())->method('getOrCreateReportResult');\n\n $job = $this->makeJob();\n $job->handle($this->reportService, $this->activityService, $this->prophetClient, $this->logger);\n }\n\n public function testHandleSkipsWhenTeamIsInactive(): void\n {\n $report = $this->makeActiveReport(teamStatus: Team::STATUS_DEACTIVATED);\n\n $this->reportService->expects($this->once())\n ->method('getReport')\n ->willReturn($report);\n\n $this->logger->expects($this->exactly(2))\n ->method('info');\n\n $this->reportService->expects($this->never())->method('getOrCreateReportResult');\n\n $job = $this->makeJob();\n $job->handle($this->reportService, $this->activityService, $this->prophetClient, $this->logger);\n }\n\n public function testHandleSkipsWhenCreatorIsNull(): void\n {\n $report = $this->makeActiveReport();\n $report->method('getCreator')->willReturn(null);\n\n $this->reportService->expects($this->once())\n ->method('getReport')\n ->willReturn($report);\n\n $this->logger->expects($this->once())\n ->method('warning')\n ->with($this->stringContains('report creator not found'));\n\n $this->reportService->expects($this->never())->method('getOrCreateReportResult');\n\n $job = $this->makeJob();\n $job->handle($this->reportService, $this->activityService, $this->prophetClient, $this->logger);\n }\n\n public function testHandleSkipsWhenSavedSearchIsNull(): void\n {\n $creator = $this->createMock(User::class);\n\n $report = $this->makeActiveReport();\n $report->method('getCreator')->willReturn($creator);\n $report->method('getSavedSearch')->willReturn(null);\n\n $this->reportService->expects($this->once())\n ->method('getReport')\n ->willReturn($report);\n\n $this->logger->expects($this->once())\n ->method('warning')\n ->with($this->stringContains('saved search not found'));\n\n $this->reportService->expects($this->never())->method('getOrCreateReportResult');\n\n $job = $this->makeJob();\n $job->handle($this->reportService, $this->activityService, $this->prophetClient, $this->logger);\n }\n\n public function testHandleSkipsWhenPromptIsNull(): void\n {\n $creator = $this->createMock(User::class);\n $savedSearch = $this->createMock(\\Jiminny\\Models\\Activity\\Search::class);\n\n $report = $this->makeActiveReport();\n $report->method('getCreator')->willReturn($creator);\n $report->method('getSavedSearch')->willReturn($savedSearch);\n $report->method('getAskAnythingPrompt')->willReturn(null);\n\n $this->reportService->expects($this->once())\n ->method('getReport')\n ->willReturn($report);\n\n $this->logger->expects($this->once())\n ->method('warning')\n ->with($this->stringContains('ask anything prompt not found'));\n\n $this->reportService->expects($this->never())->method('getOrCreateReportResult');\n\n $job = $this->makeJob();\n $job->handle($this->reportService, $this->activityService, $this->prophetClient, $this->logger);\n }\n\n public function testHandleFailsReportWhenNotEnoughActivities(): void\n {\n $creator = $this->createMock(User::class);\n $savedSearch = $this->createMock(\\Jiminny\\Models\\Activity\\Search::class);\n $prompt = $this->createMock(\\Jiminny\\Models\\AskAnything\\AskAnythingPrompt::class);\n\n $report = $this->makeActiveReport();\n $report->method('getCreator')->willReturn($creator);\n $report->method('getSavedSearch')->willReturn($savedSearch);\n $report->method('getAskAnythingPrompt')->willReturn($prompt);\n\n $reportResult = $this->createMock(AutomatedReportResult::class);\n $reportResult->expects($this->once())\n ->method('update')\n ->with($this->callback(fn ($data) => $data['status'] === AutomatedReportResult::STATUS_FAILED\n && $data['reason'] === AutomatedReportResult::REASON_NOT_ENOUGH_ACTIVITIES));\n\n $this->reportService->expects($this->once())\n ->method('getReport')\n ->willReturn($report);\n\n $this->reportService->expects($this->once())\n ->method('getOrCreateReportResult')\n ->willReturn($reportResult);\n\n $this->activityService->expects($this->once())\n ->method('getActivityIdsForSavedSearch')\n ->willReturn([]);\n\n $this->logger->expects($this->exactly(3))\n ->method('info');\n\n $job = $this->makeJob();\n $job->handle($this->reportService, $this->activityService, $this->prophetClient, $this->logger);\n }\n\n public function testHandleSuccessfullyRequestsReport(): void\n {\n Carbon::setTestNow(Carbon::parse('2026-04-07 10:00:00'));\n\n $creator = $this->createMock(User::class);\n $savedSearch = $this->createMock(\\Jiminny\\Models\\Activity\\Search::class);\n $prompt = $this->createMock(\\Jiminny\\Models\\AskAnything\\AskAnythingPrompt::class);\n\n $report = $this->makeActiveReport();\n $report->method('getCreator')->willReturn($creator);\n $report->method('getSavedSearch')->willReturn($savedSearch);\n $report->method('getAskAnythingPrompt')->willReturn($prompt);\n $report->method('getUuid')->willReturn('report-uuid');\n\n $reportResult = $this->createMock(AutomatedReportResult::class);\n $reportResult->method('getUuid')->willReturn('result-uuid');\n $reportResult->expects($this->once())\n ->method('update')\n ->with($this->callback(fn ($data) => $data['status'] === AutomatedReportResult::STATUS_REQUESTED\n && isset($data['name'], $data['payload'], $data['requested_at'])));\n\n $this->reportService->expects($this->once())\n ->method('getReport')\n ->willReturn($report);\n\n $this->reportService->expects($this->once())\n ->method('getOrCreateReportResult')\n ->willReturn($reportResult);\n\n $this->reportService->expects($this->once())\n ->method('getAskJiminnyGenerateReportPayload')\n ->willReturn(['key' => 'value']);\n\n $this->reportService->expects($this->once())\n ->method('getReportFileName')\n ->willReturn('My Report - 7 Apr 2026');\n\n $this->activityService->expects($this->once())\n ->method('getActivityIdsForSavedSearch')\n ->willReturn(['act-1', 'act-2']);\n\n $this->prophetClient->expects($this->once())\n ->method('sendRequest')\n ->willReturn(new \\Jiminny\\Component\\ProphetAi\\Dtos\\ProphetResponseDto([]));\n\n $this->logger->expects($this->exactly(4))\n ->method('info');\n\n $job = $this->makeJob();\n $job->handle($this->reportService, $this->activityService, $this->prophetClient, $this->logger);\n\n Carbon::setTestNow();\n }\n\n public function testHandleCatchesGenericExceptionAndLogsError(): void\n {\n $this->reportService->expects($this->once())\n ->method('getReport')\n ->willThrowException(new \\RuntimeException('DB error'));\n\n $this->logger->expects($this->once())\n ->method('error')\n ->with($this->stringContains('Error'));\n\n $job = $this->makeJob();\n\n $reflection = new \\ReflectionClass($job);\n $triesProp = $reflection->getProperty('tries');\n $triesProp->setAccessible(true);\n\n $job->handle($this->reportService, $this->activityService, $this->prophetClient, $this->logger);\n }\n\n public function testHandleCatchesProphetExceptionAndSetsCorrectReason(): void\n {\n $creator = $this->createMock(User::class);\n $savedSearch = $this->createMock(\\Jiminny\\Models\\Activity\\Search::class);\n $prompt = $this->createMock(\\Jiminny\\Models\\AskAnything\\AskAnythingPrompt::class);\n\n $report = $this->makeActiveReport();\n $report->method('getCreator')->willReturn($creator);\n $report->method('getSavedSearch')->willReturn($savedSearch);\n $report->method('getAskAnythingPrompt')->willReturn($prompt);\n\n $reportResult = $this->createMock(AutomatedReportResult::class);\n $reportResult->method('getUuid')->willReturn('result-uuid');\n $reportResult->expects($this->once())\n ->method('update')\n ->with($this->callback(fn ($data) => $data['reason'] === AutomatedReportResult::REASON_PROPHET_API_ERROR));\n\n $this->reportService->expects($this->once())\n ->method('getReport')\n ->willReturn($report);\n\n $this->reportService->expects($this->once())\n ->method('getOrCreateReportResult')\n ->willReturn($reportResult);\n\n $this->activityService->expects($this->once())\n ->method('getActivityIdsForSavedSearch')\n ->willThrowException(new ProphetException('Prophet failed'));\n\n $this->logger->expects($this->once())\n ->method('error');\n\n $job = $this->makeJob();\n $job->handle($this->reportService, $this->activityService, $this->prophetClient, $this->logger);\n }\n\n public function testHandleCreatesReportResultBeforeActivityFetch(): void\n {\n $creator = $this->createMock(User::class);\n $savedSearch = $this->createMock(\\Jiminny\\Models\\Activity\\Search::class);\n $prompt = $this->createMock(\\Jiminny\\Models\\AskAnything\\AskAnythingPrompt::class);\n\n $report = $this->makeActiveReport();\n $report->method('getCreator')->willReturn($creator);\n $report->method('getSavedSearch')->willReturn($savedSearch);\n $report->method('getAskAnythingPrompt')->willReturn($prompt);\n\n $reportResult = $this->createMock(AutomatedReportResult::class);\n $reportResult->method('getUuid')->willReturn('result-uuid');\n\n $callOrder = [];\n\n $this->reportService->expects($this->once())\n ->method('getReport')\n ->willReturn($report);\n\n $this->reportService->expects($this->once())\n ->method('getOrCreateReportResult')\n ->willReturnCallback(function () use ($reportResult, &$callOrder) {\n $callOrder[] = 'getOrCreateReportResult';\n\n return $reportResult;\n });\n\n $this->activityService->expects($this->once())\n ->method('getActivityIdsForSavedSearch')\n ->willReturnCallback(function () use (&$callOrder) {\n $callOrder[] = 'getActivityIds';\n\n return [];\n });\n\n $job = $this->makeJob();\n $job->handle($this->reportService, $this->activityService, $this->prophetClient, $this->logger);\n\n $this->assertEquals(['getOrCreateReportResult', 'getActivityIds'], $callOrder);\n }\n\n public function testHandlePassesCorrectDataToCreateReportResult(): void\n {\n $creator = $this->createMock(User::class);\n $savedSearch = $this->createMock(\\Jiminny\\Models\\Activity\\Search::class);\n $prompt = $this->createMock(\\Jiminny\\Models\\AskAnything\\AskAnythingPrompt::class);\n\n $report = $this->makeActiveReport();\n $report->method('getCreator')->willReturn($creator);\n $report->method('getSavedSearch')->willReturn($savedSearch);\n $report->method('getAskAnythingPrompt')->willReturn($prompt);\n\n $reportResult = $this->createMock(AutomatedReportResult::class);\n $reportResult->method('getUuid')->willReturn('result-uuid');\n $reportResult->method('update')->willReturn(true);\n\n $this->reportService->expects($this->once())\n ->method('getReport')\n ->willReturn($report);\n\n $this->reportService->expects($this->once())\n ->method('getOrCreateReportResult')\n ->with(\n automatedReport: $report,\n data: $this->callback(fn ($data) => $data['status'] === AutomatedReportResult::STATUS_DEFAULT\n && $data['media_type'] === AutomatedReportsService::MEDIA_TYPE_PDF)\n )\n ->willReturn($reportResult);\n\n $this->activityService->expects($this->once())\n ->method('getActivityIdsForSavedSearch')\n ->willReturn([]);\n\n $job = $this->makeJob();\n $job->handle($this->reportService, $this->activityService, $this->prophetClient, $this->logger);\n }\n}","depth":4,"value":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Tests\\Unit\\Jobs\\AutomatedReports;\n\nuse Carbon\\Carbon;\nuse Jiminny\\Component\\ProphetAi\\Exceptions\\ProphetException;\nuse Jiminny\\Component\\ProphetAi\\ProphetClient;\nuse Jiminny\\Jobs\\AutomatedReports\\RequestGenerateAskJiminnyReportJob;\nuse Jiminny\\Models\\AutomatedReport;\nuse Jiminny\\Models\\AutomatedReportResult;\nuse Jiminny\\Models\\Team;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Services\\Kiosk\\AutomatedReports\\AskJiminnyReportActivityService;\nuse Jiminny\\Services\\Kiosk\\AutomatedReports\\AutomatedReportsService;\nuse PHPUnit\\Framework\\MockObject\\MockObject;\nuse PHPUnit\\Framework\\TestCase;\nuse Psr\\Log\\LoggerInterface;\n\nclass RequestGenerateAskJiminnyReportJobTest extends TestCase\n{\n private AutomatedReportsService&MockObject $reportService;\n private AskJiminnyReportActivityService&MockObject $activityService;\n private ProphetClient&MockObject $prophetClient;\n private LoggerInterface&MockObject $logger;\n\n protected function setUp(): void\n {\n $this->reportService = $this->createMock(AutomatedReportsService::class);\n $this->activityService = $this->createMock(AskJiminnyReportActivityService::class);\n $this->prophetClient = $this->createMock(ProphetClient::class);\n $this->logger = $this->createMock(LoggerInterface::class);\n }\n\n private function makeJob(string $uuid = 'report-uuid'): RequestGenerateAskJiminnyReportJob\n {\n return new RequestGenerateAskJiminnyReportJob($uuid);\n }\n\n private function makeActiveReport(\n string $type = AutomatedReportsService::TYPE_ASK_JIMINNY,\n bool $status = true,\n string $teamStatus = Team::STATUS_ACTIVE,\n ): AutomatedReport&MockObject { // @phpstan-ignore-line\n $team = $this->createMock(Team::class);\n $team->method('getStatus')->willReturn($teamStatus);\n\n $report = $this->createMock(AutomatedReport::class);\n $report->method('getType')->willReturn($type);\n $report->method('getStatus')->willReturn($status);\n $report->method('getTeam')->willReturn($team);\n\n return $report;\n }\n\n public function testUniqueIdReturnsReportUuid(): void\n {\n $job = $this->makeJob('my-unique-uuid');\n\n $this->assertEquals('my-unique-uuid', $job->uniqueId());\n }\n\n public function testHandleSkipsWhenReportTypeIsNotAskJiminny(): void\n {\n $report = $this->makeActiveReport(type: 'exec_summary');\n\n $this->reportService->expects($this->once())\n ->method('getReport')\n ->willReturn($report);\n\n $this->logger->expects($this->once())\n ->method('info')\n ->with($this->stringContains('Started'));\n\n $this->logger->expects($this->once())\n ->method('warning')\n ->with($this->stringContains('not an ask_jiminny report'));\n\n $this->reportService->expects($this->never())->method('getOrCreateReportResult');\n\n $job = $this->makeJob();\n $job->handle($this->reportService, $this->activityService, $this->prophetClient, $this->logger);\n }\n\n public function testHandleSkipsWhenReportIsInactive(): void\n {\n $report = $this->makeActiveReport(status: false);\n\n $this->reportService->expects($this->once())\n ->method('getReport')\n ->willReturn($report);\n\n $this->logger->expects($this->exactly(2))\n ->method('info');\n\n $this->reportService->expects($this->never())->method('getOrCreateReportResult');\n\n $job = $this->makeJob();\n $job->handle($this->reportService, $this->activityService, $this->prophetClient, $this->logger);\n }\n\n public function testHandleSkipsWhenTeamIsInactive(): void\n {\n $report = $this->makeActiveReport(teamStatus: Team::STATUS_DEACTIVATED);\n\n $this->reportService->expects($this->once())\n ->method('getReport')\n ->willReturn($report);\n\n $this->logger->expects($this->exactly(2))\n ->method('info');\n\n $this->reportService->expects($this->never())->method('getOrCreateReportResult');\n\n $job = $this->makeJob();\n $job->handle($this->reportService, $this->activityService, $this->prophetClient, $this->logger);\n }\n\n public function testHandleSkipsWhenCreatorIsNull(): void\n {\n $report = $this->makeActiveReport();\n $report->method('getCreator')->willReturn(null);\n\n $this->reportService->expects($this->once())\n ->method('getReport')\n ->willReturn($report);\n\n $this->logger->expects($this->once())\n ->method('warning')\n ->with($this->stringContains('report creator not found'));\n\n $this->reportService->expects($this->never())->method('getOrCreateReportResult');\n\n $job = $this->makeJob();\n $job->handle($this->reportService, $this->activityService, $this->prophetClient, $this->logger);\n }\n\n public function testHandleSkipsWhenSavedSearchIsNull(): void\n {\n $creator = $this->createMock(User::class);\n\n $report = $this->makeActiveReport();\n $report->method('getCreator')->willReturn($creator);\n $report->method('getSavedSearch')->willReturn(null);\n\n $this->reportService->expects($this->once())\n ->method('getReport')\n ->willReturn($report);\n\n $this->logger->expects($this->once())\n ->method('warning')\n ->with($this->stringContains('saved search not found'));\n\n $this->reportService->expects($this->never())->method('getOrCreateReportResult');\n\n $job = $this->makeJob();\n $job->handle($this->reportService, $this->activityService, $this->prophetClient, $this->logger);\n }\n\n public function testHandleSkipsWhenPromptIsNull(): void\n {\n $creator = $this->createMock(User::class);\n $savedSearch = $this->createMock(\\Jiminny\\Models\\Activity\\Search::class);\n\n $report = $this->makeActiveReport();\n $report->method('getCreator')->willReturn($creator);\n $report->method('getSavedSearch')->willReturn($savedSearch);\n $report->method('getAskAnythingPrompt')->willReturn(null);\n\n $this->reportService->expects($this->once())\n ->method('getReport')\n ->willReturn($report);\n\n $this->logger->expects($this->once())\n ->method('warning')\n ->with($this->stringContains('ask anything prompt not found'));\n\n $this->reportService->expects($this->never())->method('getOrCreateReportResult');\n\n $job = $this->makeJob();\n $job->handle($this->reportService, $this->activityService, $this->prophetClient, $this->logger);\n }\n\n public function testHandleFailsReportWhenNotEnoughActivities(): void\n {\n $creator = $this->createMock(User::class);\n $savedSearch = $this->createMock(\\Jiminny\\Models\\Activity\\Search::class);\n $prompt = $this->createMock(\\Jiminny\\Models\\AskAnything\\AskAnythingPrompt::class);\n\n $report = $this->makeActiveReport();\n $report->method('getCreator')->willReturn($creator);\n $report->method('getSavedSearch')->willReturn($savedSearch);\n $report->method('getAskAnythingPrompt')->willReturn($prompt);\n\n $reportResult = $this->createMock(AutomatedReportResult::class);\n $reportResult->expects($this->once())\n ->method('update')\n ->with($this->callback(fn ($data) => $data['status'] === AutomatedReportResult::STATUS_FAILED\n && $data['reason'] === AutomatedReportResult::REASON_NOT_ENOUGH_ACTIVITIES));\n\n $this->reportService->expects($this->once())\n ->method('getReport')\n ->willReturn($report);\n\n $this->reportService->expects($this->once())\n ->method('getOrCreateReportResult')\n ->willReturn($reportResult);\n\n $this->activityService->expects($this->once())\n ->method('getActivityIdsForSavedSearch')\n ->willReturn([]);\n\n $this->logger->expects($this->exactly(3))\n ->method('info');\n\n $job = $this->makeJob();\n $job->handle($this->reportService, $this->activityService, $this->prophetClient, $this->logger);\n }\n\n public function testHandleSuccessfullyRequestsReport(): void\n {\n Carbon::setTestNow(Carbon::parse('2026-04-07 10:00:00'));\n\n $creator = $this->createMock(User::class);\n $savedSearch = $this->createMock(\\Jiminny\\Models\\Activity\\Search::class);\n $prompt = $this->createMock(\\Jiminny\\Models\\AskAnything\\AskAnythingPrompt::class);\n\n $report = $this->makeActiveReport();\n $report->method('getCreator')->willReturn($creator);\n $report->method('getSavedSearch')->willReturn($savedSearch);\n $report->method('getAskAnythingPrompt')->willReturn($prompt);\n $report->method('getUuid')->willReturn('report-uuid');\n\n $reportResult = $this->createMock(AutomatedReportResult::class);\n $reportResult->method('getUuid')->willReturn('result-uuid');\n $reportResult->expects($this->once())\n ->method('update')\n ->with($this->callback(fn ($data) => $data['status'] === AutomatedReportResult::STATUS_REQUESTED\n && isset($data['name'], $data['payload'], $data['requested_at'])));\n\n $this->reportService->expects($this->once())\n ->method('getReport')\n ->willReturn($report);\n\n $this->reportService->expects($this->once())\n ->method('getOrCreateReportResult')\n ->willReturn($reportResult);\n\n $this->reportService->expects($this->once())\n ->method('getAskJiminnyGenerateReportPayload')\n ->willReturn(['key' => 'value']);\n\n $this->reportService->expects($this->once())\n ->method('getReportFileName')\n ->willReturn('My Report - 7 Apr 2026');\n\n $this->activityService->expects($this->once())\n ->method('getActivityIdsForSavedSearch')\n ->willReturn(['act-1', 'act-2']);\n\n $this->prophetClient->expects($this->once())\n ->method('sendRequest')\n ->willReturn(new \\Jiminny\\Component\\ProphetAi\\Dtos\\ProphetResponseDto([]));\n\n $this->logger->expects($this->exactly(4))\n ->method('info');\n\n $job = $this->makeJob();\n $job->handle($this->reportService, $this->activityService, $this->prophetClient, $this->logger);\n\n Carbon::setTestNow();\n }\n\n public function testHandleCatchesGenericExceptionAndLogsError(): void\n {\n $this->reportService->expects($this->once())\n ->method('getReport')\n ->willThrowException(new \\RuntimeException('DB error'));\n\n $this->logger->expects($this->once())\n ->method('error')\n ->with($this->stringContains('Error'));\n\n $job = $this->makeJob();\n\n $reflection = new \\ReflectionClass($job);\n $triesProp = $reflection->getProperty('tries');\n $triesProp->setAccessible(true);\n\n $job->handle($this->reportService, $this->activityService, $this->prophetClient, $this->logger);\n }\n\n public function testHandleCatchesProphetExceptionAndSetsCorrectReason(): void\n {\n $creator = $this->createMock(User::class);\n $savedSearch = $this->createMock(\\Jiminny\\Models\\Activity\\Search::class);\n $prompt = $this->createMock(\\Jiminny\\Models\\AskAnything\\AskAnythingPrompt::class);\n\n $report = $this->makeActiveReport();\n $report->method('getCreator')->willReturn($creator);\n $report->method('getSavedSearch')->willReturn($savedSearch);\n $report->method('getAskAnythingPrompt')->willReturn($prompt);\n\n $reportResult = $this->createMock(AutomatedReportResult::class);\n $reportResult->method('getUuid')->willReturn('result-uuid');\n $reportResult->expects($this->once())\n ->method('update')\n ->with($this->callback(fn ($data) => $data['reason'] === AutomatedReportResult::REASON_PROPHET_API_ERROR));\n\n $this->reportService->expects($this->once())\n ->method('getReport')\n ->willReturn($report);\n\n $this->reportService->expects($this->once())\n ->method('getOrCreateReportResult')\n ->willReturn($reportResult);\n\n $this->activityService->expects($this->once())\n ->method('getActivityIdsForSavedSearch')\n ->willThrowException(new ProphetException('Prophet failed'));\n\n $this->logger->expects($this->once())\n ->method('error');\n\n $job = $this->makeJob();\n $job->handle($this->reportService, $this->activityService, $this->prophetClient, $this->logger);\n }\n\n public function testHandleCreatesReportResultBeforeActivityFetch(): void\n {\n $creator = $this->createMock(User::class);\n $savedSearch = $this->createMock(\\Jiminny\\Models\\Activity\\Search::class);\n $prompt = $this->createMock(\\Jiminny\\Models\\AskAnything\\AskAnythingPrompt::class);\n\n $report = $this->makeActiveReport();\n $report->method('getCreator')->willReturn($creator);\n $report->method('getSavedSearch')->willReturn($savedSearch);\n $report->method('getAskAnythingPrompt')->willReturn($prompt);\n\n $reportResult = $this->createMock(AutomatedReportResult::class);\n $reportResult->method('getUuid')->willReturn('result-uuid');\n\n $callOrder = [];\n\n $this->reportService->expects($this->once())\n ->method('getReport')\n ->willReturn($report);\n\n $this->reportService->expects($this->once())\n ->method('getOrCreateReportResult')\n ->willReturnCallback(function () use ($reportResult, &$callOrder) {\n $callOrder[] = 'getOrCreateReportResult';\n\n return $reportResult;\n });\n\n $this->activityService->expects($this->once())\n ->method('getActivityIdsForSavedSearch')\n ->willReturnCallback(function () use (&$callOrder) {\n $callOrder[] = 'getActivityIds';\n\n return [];\n });\n\n $job = $this->makeJob();\n $job->handle($this->reportService, $this->activityService, $this->prophetClient, $this->logger);\n\n $this->assertEquals(['getOrCreateReportResult', 'getActivityIds'], $callOrder);\n }\n\n public function testHandlePassesCorrectDataToCreateReportResult(): void\n {\n $creator = $this->createMock(User::class);\n $savedSearch = $this->createMock(\\Jiminny\\Models\\Activity\\Search::class);\n $prompt = $this->createMock(\\Jiminny\\Models\\AskAnything\\AskAnythingPrompt::class);\n\n $report = $this->makeActiveReport();\n $report->method('getCreator')->willReturn($creator);\n $report->method('getSavedSearch')->willReturn($savedSearch);\n $report->method('getAskAnythingPrompt')->willReturn($prompt);\n\n $reportResult = $this->createMock(AutomatedReportResult::class);\n $reportResult->method('getUuid')->willReturn('result-uuid');\n $reportResult->method('update')->willReturn(true);\n\n $this->reportService->expects($this->once())\n ->method('getReport')\n ->willReturn($report);\n\n $this->reportService->expects($this->once())\n ->method('getOrCreateReportResult')\n ->with(\n automatedReport: $report,\n data: $this->callback(fn ($data) => $data['status'] === AutomatedReportResult::STATUS_DEFAULT\n && $data['media_type'] === AutomatedReportsService::MEDIA_TYPE_PDF)\n )\n ->willReturn($reportResult);\n\n $this->activityService->expects($this->once())\n ->method('getActivityIdsForSavedSearch')\n ->willReturn([]);\n\n $job = $this->makeJob();\n $job->handle($this->reportService, $this->activityService, $this->prophetClient, $this->logger);\n }\n}","role_description":"text entry area","is_enabled":true,"is_focused":true,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Execute","depth":4,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Explain Plan","depth":4,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Browse Query History","depth":4,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"View Parameters","depth":4,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Open Query Execution Settings…","depth":4,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"In-Editor Results","depth":4,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Tx: Auto","depth":4,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Cancel Running Statements","depth":4,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Playground","depth":4,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"jiminny","depth":4,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.088194445,"height":0.027777778},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"9","depth":4,"role_description":"text"},{"role":"AXStaticText","text":"12","depth":4,"role_description":"text"},{"role":"AXStaticText","text":"2","depth":4,"role_description":"text"},{"role":"AXStaticText","text":"4","depth":4,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"SELECT a.id, a.uuid, a.actual_start_time, o.id, o.uuid FROM opportunities o\nJOIN activities a ON o.id = a.opportunity_id\nWHERE a.crm_configuration_id = 39\nAND a.actual_start_time > '2025-10-13'\nAND a.type IN ('conference', 'softphone-inbound', 'softphone-outbound')\n;\n\nSELECT * FROM activities\nWHERE crm_configuration_id = 39 and user_id = 143\nand actual_start_time >= '2025-10-13'\nAND type IN ('conference', 'softphone-inbound', 'softphone-outbound')\n;\n\nSELECT * FROM opportunities WHERE account_id IN (178);\nselect * from activities where id IN (620137, 620187, 620188, 620189, 620230);\n\n# HS\nSELECT * FROM opportunities WHERE id IN (238);\nselect * from activities where id IN (477,2076);\n\nselect * from users;\n\nSELECT COUNT(*) FROM users;\nSELECT COUNT(*) FROM activities;\nSELECT COUNT(*) FROM opportunities;\n\nUPDATE activities\nSET\n actual_start_time = '2025-12-19 09:00:00',\n actual_end_time = '2025-12-19 10:30:00',\n scheduled_start_time = '2025-12-19 09:00:00',\n scheduled_end_time = '2025-12-19 10:30:00'\nWHERE id IN (407509,407375);\n\nselect * from partners;\n\nSELECT id, uuid, type, actual_start_time, user_id, crm_configuration_id\nFROM activities\nWHERE user_id = 143\nAND actual_start_time >= '2025-10-13 00:00:00'\nAND actual_start_time <= '2026-01-13 23:59:59'\nORDER BY actual_start_time DESC;\n\nSELECT * FROM activities WHERE uuid_to_bin('78eda160-3086-435f-88a5-bb0c71b6008d') = uuid;\nSELECT * FROM crm_layouts where crm_configuration_id = 39;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 282;\n# lead_id\n# account_id 177\n# contact_id 3969\n# opportunity_id\n# stage_id 203\n\nSELECT * FROM opportunities WHERE opportunities.crm_configuration_id = id = 282;\n\nSELECT * FROM activities where crm_configuration_id = 39 AND type = 'conference'\nAND user_id = 143 and actual_start_time >= '2025-10-13';\n\nSELECT * FROM activities a\n# JOIN opportunities o ON a.opportunity_id = o.id\nWHERE a.crm_configuration_id = 39 AND a.type = 'conference'\nand status = 'completed' and recording_state = 'recorded'\nand a.actual_start_time >= '2025-10-13'\nAND a.user_id = 143\n;\n\nselect * from leads\nwhere crm_configuration_id = 39; # 112 -> ac. 178, 109 => op. 1707\n\nSELECT * FROM activities WHERE id IN (356013,616188,616202,616310,407509,407375,356001,356008);\nSELECT * FROM activities WHERE id IN (356013,616188,616202,616310);\nSELECT * FROM activities WHERE id IN (407509,407375); # leads: 112, 109 | status - 198\nSELECT * FROM activities WHERE id IN (356001, 356008); # contacts:\n\nSELECT * FROM opportunities WHERE id IN (1707);\nSELECT * FROM stages where id IN (204, 198);\nSELECT * FROM opportunities WHERE account_id IN (178);\nSELECT * FROM opportunities WHERE crm_configuration_id = 39 AND created_at > '2025-01-01';\nSELECT * FROM contacts WHERE account_id IN (178); # 4118 Musaibe, 4448 Ceco Personal\n\nSELECT * FROM activities where crm_configuration_id = 39\nAND opportunity_id IS NULL\nAND is_internal = false\nand status = 'completed' and recording_state = 'recorded'\nAND actual_start_time >= '2025-10-13'\nAND (lead_id IS NOT NULL OR contact_id IS NOT NULL OR account_id IS NOT NULL)\n# AND lead_id IN (112, 109)\n;\n\nSELECT * FROM crm_profiles WHERE user_id = 143;\n\nselect * from inboxes; # 212\nselect * from users where id = 143; # 143\nselect * from inbox_email_batches where inbox_id = 212\nand updated_at >= '2026-01-28 00:00:00' order by id desc;\nselect * from inbox_emails where inbox_id = 212\nand batch_id = 95885 order by id desc;\nselect * from email_messages where origin_user_id = 143;\nselect * from activities where user_id = 143 and updated_at >= '2026-01-28 00:00:00';\nselect * from participants where activity_id = 620247;\n\nselect * from crm_profiles where user_id = 143;\n\nSELECT * FROM activities WHERE uuid_to_bin('458cf915-b914-4000-b083-5687b32b2956') = uuid; # 356001\nselect * from transcription where activity_id = 356001; # 6943\nselect * from ai_prompts where transcription_id = 6943;\nSELECT * FROM activity_summary_logs where activity_id = 356001;\n\nSELECT * FROM social_accounts WHERE sociable_id = 143;\n\n# ************************************************************************************\nSELECT * FROM activities WHERE uuid_to_bin('0164a4fb-cb95-454e-9edd-4d804e4999bd') = uuid;\n# 422515 softphone tr. 8100\n\nSELECT * FROM activities WHERE uuid_to_bin('7520add8-8d87-41a5-98e5-fc4edf96f21e') = uuid;\n# 407509 conference tr. 7670 crmId: 00UD1000002J9aTMAS\n\nselect * from ai_prompts where transcription_id IN (8100, 7670);\nselect * from activity_summary_logs where activity_id = 407509;\n\nselect * from sidekick_settings;\nselect * from default_activity_types;\n\nSELECT * FROM contacts WHERE crm_configuration_id = 39 and email = 'm.kogoj@gmx.at';\nSELECT * FROM leads WHERE crm_configuration_id = 39 and email = 'm.kogoj@gmx.at';\n\nSELECT * FROM activity_searches where user_id = 143;\nSELECT * FROM groups where team_id = 1;\n\nselect * from teams where id = 1;\nselect * from groups where team_id = 1; # 1150 - 7e75f8025c22\nselect id, name, group_id, status, deleted_at, email\nfrom users where team_id = 1 order by group_id desc ;\n\nselect * from activity_searches where id in (1977, 1978, 1979);\nselect * from activity_search_filters where activity_search_id IN (1977, 1978, 1979);\nselect * from activity_search_filters where filter = 'group_id' and value = '443f26b8-8512-437e-a9f9-7e75f8025c22'; # 10268, 10272, 10277\nselect * from nudges where activity_search_id IN (1977, 1978, 1979); # 877, 878, 879\n\nINSERT INTO `activity_search_filters`\n(`activity_search_id`, `filter`, `value`) VALUES\n(1977, 'group_id', '443f26b8-8512-437e-a9f9-7e75f8025c22'),\n(1978, 'group_id', '443f26b8-8512-437e-a9f9-7e75f8025c22'),\n(1979, 'group_id', '443f26b8-8512-437e-a9f9-7e75f8025c22')\n;\n\nselect * from crm_configurations where id = 39;\n\nselect * from teams where id = 1;\nselect * from team_features where team_id = 1;\nselect * from features;\n\nSELECT * FROM activity_searches where id = 1982; # 1981\nSELECT * FROM activity_search_filters WHERE activity_search_id = 1982;\n\nSELECT * FROM automated_reports where id = 68;\nSELECT * FROM automated_report_results where id = 275;\n\nSELECT * FROM automated_reports order by id desc;\nSELECT * FROM automated_report_results order by id desc;\nselect * from activity_searches where user_id = 143;\nselect * from ask_anything_prompts;\n\nSELECT * FROM groups WHERE id = 1439;\nSELECT * FROM users WHERE group_id = 1439;\n\nselect * from permissions; # 158\nselect * from roles;\nselect * from permission_role\n\nselect * from teams where id = 1;\nselect * from groups g JOIN playbooks p on g.playbook_id = p.id where g.team_id = 1;\nselect * from groups where id = 28;\nselect * from playbooks where team_id = 1;\nselect * from playbooks where id = 179;\nselect * from playbook_categories where id = 1391;\nselect * from users where id = 143;\nselect * from crm_profiles where user_id = 143;\nselect * from activities where crm_configuration_id = 39 and type = 'conference'\nand crm_provider_id IS NOT NULL ORDER by id desc;\nselect * from activities where id = 422003; # 00UO400000pB6fpMAC\n\nSELECT ar.id, ar.uuid, ar.media_type, ar.status, a.type\nFROM automated_report_results ar\nJOIN automated_reports a ON a.id = ar.report_id\nWHERE a.type = 'ask_jiminny'\nLIMIT 10;\n\n\nselect * from teams where id = 3143;\nselect * from crm_configurations where id = 500;\nselect * from users where name = 'Integration Account'; # 1695\nSELECT * FROM social_accounts WHERE sociable_id = 1695;","depth":4,"value":"SELECT a.id, a.uuid, a.actual_start_time, o.id, o.uuid FROM opportunities o\nJOIN activities a ON o.id = a.opportunity_id\nWHERE a.crm_configuration_id = 39\nAND a.actual_start_time > '2025-10-13'\nAND a.type IN ('conference', 'softphone-inbound', 'softphone-outbound')\n;\n\nSELECT * FROM activities\nWHERE crm_configuration_id = 39 and user_id = 143\nand actual_start_time >= '2025-10-13'\nAND type IN ('conference', 'softphone-inbound', 'softphone-outbound')\n;\n\nSELECT * FROM opportunities WHERE account_id IN (178);\nselect * from activities where id IN (620137, 620187, 620188, 620189, 620230);\n\n# HS\nSELECT * FROM opportunities WHERE id IN (238);\nselect * from activities where id IN (477,2076);\n\nselect * from users;\n\nSELECT COUNT(*) FROM users;\nSELECT COUNT(*) FROM activities;\nSELECT COUNT(*) FROM opportunities;\n\nUPDATE activities\nSET\n actual_start_time = '2025-12-19 09:00:00',\n actual_end_time = '2025-12-19 10:30:00',\n scheduled_start_time = '2025-12-19 09:00:00',\n scheduled_end_time = '2025-12-19 10:30:00'\nWHERE id IN (407509,407375);\n\nselect * from partners;\n\nSELECT id, uuid, type, actual_start_time, user_id, crm_configuration_id\nFROM activities\nWHERE user_id = 143\nAND actual_start_time >= '2025-10-13 00:00:00'\nAND actual_start_time <= '2026-01-13 23:59:59'\nORDER BY actual_start_time DESC;\n\nSELECT * FROM activities WHERE uuid_to_bin('78eda160-3086-435f-88a5-bb0c71b6008d') = uuid;\nSELECT * FROM crm_layouts where crm_configuration_id = 39;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 282;\n# lead_id\n# account_id 177\n# contact_id 3969\n# opportunity_id\n# stage_id 203\n\nSELECT * FROM opportunities WHERE opportunities.crm_configuration_id = id = 282;\n\nSELECT * FROM activities where crm_configuration_id = 39 AND type = 'conference'\nAND user_id = 143 and actual_start_time >= '2025-10-13';\n\nSELECT * FROM activities a\n# JOIN opportunities o ON a.opportunity_id = o.id\nWHERE a.crm_configuration_id = 39 AND a.type = 'conference'\nand status = 'completed' and recording_state = 'recorded'\nand a.actual_start_time >= '2025-10-13'\nAND a.user_id = 143\n;\n\nselect * from leads\nwhere crm_configuration_id = 39; # 112 -> ac. 178, 109 => op. 1707\n\nSELECT * FROM activities WHERE id IN (356013,616188,616202,616310,407509,407375,356001,356008);\nSELECT * FROM activities WHERE id IN (356013,616188,616202,616310);\nSELECT * FROM activities WHERE id IN (407509,407375); # leads: 112, 109 | status - 198\nSELECT * FROM activities WHERE id IN (356001, 356008); # contacts:\n\nSELECT * FROM opportunities WHERE id IN (1707);\nSELECT * FROM stages where id IN (204, 198);\nSELECT * FROM opportunities WHERE account_id IN (178);\nSELECT * FROM opportunities WHERE crm_configuration_id = 39 AND created_at > '2025-01-01';\nSELECT * FROM contacts WHERE account_id IN (178); # 4118 Musaibe, 4448 Ceco Personal\n\nSELECT * FROM activities where crm_configuration_id = 39\nAND opportunity_id IS NULL\nAND is_internal = false\nand status = 'completed' and recording_state = 'recorded'\nAND actual_start_time >= '2025-10-13'\nAND (lead_id IS NOT NULL OR contact_id IS NOT NULL OR account_id IS NOT NULL)\n# AND lead_id IN (112, 109)\n;\n\nSELECT * FROM crm_profiles WHERE user_id = 143;\n\nselect * from inboxes; # 212\nselect * from users where id = 143; # 143\nselect * from inbox_email_batches where inbox_id = 212\nand updated_at >= '2026-01-28 00:00:00' order by id desc;\nselect * from inbox_emails where inbox_id = 212\nand batch_id = 95885 order by id desc;\nselect * from email_messages where origin_user_id = 143;\nselect * from activities where user_id = 143 and updated_at >= '2026-01-28 00:00:00';\nselect * from participants where activity_id = 620247;\n\nselect * from crm_profiles where user_id = 143;\n\nSELECT * FROM activities WHERE uuid_to_bin('458cf915-b914-4000-b083-5687b32b2956') = uuid; # 356001\nselect * from transcription where activity_id = 356001; # 6943\nselect * from ai_prompts where transcription_id = 6943;\nSELECT * FROM activity_summary_logs where activity_id = 356001;\n\nSELECT * FROM social_accounts WHERE sociable_id = 143;\n\n# ************************************************************************************\nSELECT * FROM activities WHERE uuid_to_bin('0164a4fb-cb95-454e-9edd-4d804e4999bd') = uuid;\n# 422515 softphone tr. 8100\n\nSELECT * FROM activities WHERE uuid_to_bin('7520add8-8d87-41a5-98e5-fc4edf96f21e') = uuid;\n# 407509 conference tr. 7670 crmId: 00UD1000002J9aTMAS\n\nselect * from ai_prompts where transcription_id IN (8100, 7670);\nselect * from activity_summary_logs where activity_id = 407509;\n\nselect * from sidekick_settings;\nselect * from default_activity_types;\n\nSELECT * FROM contacts WHERE crm_configuration_id = 39 and email = 'm.kogoj@gmx.at';\nSELECT * FROM leads WHERE crm_configuration_id = 39 and email = 'm.kogoj@gmx.at';\n\nSELECT * FROM activity_searches where user_id = 143;\nSELECT * FROM groups where team_id = 1;\n\nselect * from teams where id = 1;\nselect * from groups where team_id = 1; # 1150 - 7e75f8025c22\nselect id, name, group_id, status, deleted_at, email\nfrom users where team_id = 1 order by group_id desc ;\n\nselect * from activity_searches where id in (1977, 1978, 1979);\nselect * from activity_search_filters where activity_search_id IN (1977, 1978, 1979);\nselect * from activity_search_filters where filter = 'group_id' and value = '443f26b8-8512-437e-a9f9-7e75f8025c22'; # 10268, 10272, 10277\nselect * from nudges where activity_search_id IN (1977, 1978, 1979); # 877, 878, 879\n\nINSERT INTO `activity_search_filters`\n(`activity_search_id`, `filter`, `value`) VALUES\n(1977, 'group_id', '443f26b8-8512-437e-a9f9-7e75f8025c22'),\n(1978, 'group_id', '443f26b8-8512-437e-a9f9-7e75f8025c22'),\n(1979, 'group_id', '443f26b8-8512-437e-a9f9-7e75f8025c22')\n;\n\nselect * from crm_configurations where id = 39;\n\nselect * from teams where id = 1;\nselect * from team_features where team_id = 1;\nselect * from features;\n\nSELECT * FROM activity_searches where id = 1982; # 1981\nSELECT * FROM activity_search_filters WHERE activity_search_id = 1982;\n\nSELECT * FROM automated_reports where id = 68;\nSELECT * FROM automated_report_results where id = 275;\n\nSELECT * FROM automated_reports order by id desc;\nSELECT * FROM automated_report_results order by id desc;\nselect * from activity_searches where user_id = 143;\nselect * from ask_anything_prompts;\n\nSELECT * FROM groups WHERE id = 1439;\nSELECT * FROM users WHERE group_id = 1439;\n\nselect * from permissions; # 158\nselect * from roles;\nselect * from permission_role\n\nselect * from teams where id = 1;\nselect * from groups g JOIN playbooks p on g.playbook_id = p.id where g.team_id = 1;\nselect * from groups where id = 28;\nselect * from playbooks where team_id = 1;\nselect * from playbooks where id = 179;\nselect * from playbook_categories where id = 1391;\nselect * from users where id = 143;\nselect * from crm_profiles where user_id = 143;\nselect * from activities where crm_configuration_id = 39 and type = 'conference'\nand crm_provider_id IS NOT NULL ORDER by id desc;\nselect * from activities where id = 422003; # 00UO400000pB6fpMAC\n\nSELECT ar.id, ar.uuid, ar.media_type, ar.status, a.type\nFROM automated_report_results ar\nJOIN automated_reports a ON a.id = ar.report_id\nWHERE a.type = 'ask_jiminny'\nLIMIT 10;\n\n\nselect * from teams where id = 3143;\nselect * from crm_configurations where id = 500;\nselect * from users where name = 'Integration Account'; # 1695\nSELECT * FROM social_accounts WHERE sociable_id = 1695;","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Project","depth":3,"role_description":"text"},{"role":"AXButton","text":"Project","depth":3,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"New File or Directory…","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Expand Selected","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Collapse All","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Options","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
467660169672458461
|
6397958702907200333
|
click
|
accessibility
|
NULL
|
Project: faVsco.js, menu
#11894 on JY-18909-automa Project: faVsco.js, menu
#11894 on JY-18909-automated-reports-ask-jiminny, menu
Start Listening for PHP Debug Connections
RequestGenerateAskJiminnyReportJobTest
Run 'RequestGenerateAskJiminnyReportJobTest'
Debug 'RequestGenerateAskJiminnyReportJobTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Code changed:
Hide
Sync Changes
Hide This Notification
1
14
4
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Tests\Unit\Jobs\AutomatedReports;
use Carbon\Carbon;
use Jiminny\Component\ProphetAi\Exceptions\ProphetException;
use Jiminny\Component\ProphetAi\ProphetClient;
use Jiminny\Jobs\AutomatedReports\RequestGenerateAskJiminnyReportJob;
use Jiminny\Models\AutomatedReport;
use Jiminny\Models\AutomatedReportResult;
use Jiminny\Models\Team;
use Jiminny\Models\User;
use Jiminny\Services\Kiosk\AutomatedReports\AskJiminnyReportActivityService;
use Jiminny\Services\Kiosk\AutomatedReports\AutomatedReportsService;
use PHPUnit\Framework\MockObject\MockObject;
use PHPUnit\Framework\TestCase;
use Psr\Log\LoggerInterface;
class RequestGenerateAskJiminnyReportJobTest extends TestCase
{
private AutomatedReportsService&MockObject $reportService;
private AskJiminnyReportActivityService&MockObject $activityService;
private ProphetClient&MockObject $prophetClient;
private LoggerInterface&MockObject $logger;
protected function setUp(): void
{
$this->reportService = $this->createMock(AutomatedReportsService::class);
$this->activityService = $this->createMock(AskJiminnyReportActivityService::class);
$this->prophetClient = $this->createMock(ProphetClient::class);
$this->logger = $this->createMock(LoggerInterface::class);
}
private function makeJob(string $uuid = 'report-uuid'): RequestGenerateAskJiminnyReportJob
{
return new RequestGenerateAskJiminnyReportJob($uuid);
}
private function makeActiveReport(
string $type = AutomatedReportsService::TYPE_ASK_JIMINNY,
bool $status = true,
string $teamStatus = Team::STATUS_ACTIVE,
): AutomatedReport&MockObject { // @phpstan-ignore-line
$team = $this->createMock(Team::class);
$team->method('getStatus')->willReturn($teamStatus);
$report = $this->createMock(AutomatedReport::class);
$report->method('getType')->willReturn($type);
$report->method('getStatus')->willReturn($status);
$report->method('getTeam')->willReturn($team);
return $report;
}
public function testUniqueIdReturnsReportUuid(): void
{
$job = $this->makeJob('my-unique-uuid');
$this->assertEquals('my-unique-uuid', $job->uniqueId());
}
public function testHandleSkipsWhenReportTypeIsNotAskJiminny(): void
{
$report = $this->makeActiveReport(type: 'exec_summary');
$this->reportService->expects($this->once())
->method('getReport')
->willReturn($report);
$this->logger->expects($this->once())
->method('info')
->with($this->stringContains('Started'));
$this->logger->expects($this->once())
->method('warning')
->with($this->stringContains('not an ask_jiminny report'));
$this->reportService->expects($this->never())->method('getOrCreateReportResult');
$job = $this->makeJob();
$job->handle($this->reportService, $this->activityService, $this->prophetClient, $this->logger);
}
public function testHandleSkipsWhenReportIsInactive(): void
{
$report = $this->makeActiveReport(status: false);
$this->reportService->expects($this->once())
->method('getReport')
->willReturn($report);
$this->logger->expects($this->exactly(2))
->method('info');
$this->reportService->expects($this->never())->method('getOrCreateReportResult');
$job = $this->makeJob();
$job->handle($this->reportService, $this->activityService, $this->prophetClient, $this->logger);
}
public function testHandleSkipsWhenTeamIsInactive(): void
{
$report = $this->makeActiveReport(teamStatus: Team::STATUS_DEACTIVATED);
$this->reportService->expects($this->once())
->method('getReport')
->willReturn($report);
$this->logger->expects($this->exactly(2))
->method('info');
$this->reportService->expects($this->never())->method('getOrCreateReportResult');
$job = $this->makeJob();
$job->handle($this->reportService, $this->activityService, $this->prophetClient, $this->logger);
}
public function testHandleSkipsWhenCreatorIsNull(): void
{
$report = $this->makeActiveReport();
$report->method('getCreator')->willReturn(null);
$this->reportService->expects($this->once())
->method('getReport')
->willReturn($report);
$this->logger->expects($this->once())
->method('warning')
->with($this->stringContains('report creator not found'));
$this->reportService->expects($this->never())->method('getOrCreateReportResult');
$job = $this->makeJob();
$job->handle($this->reportService, $this->activityService, $this->prophetClient, $this->logger);
}
public function testHandleSkipsWhenSavedSearchIsNull(): void
{
$creator = $this->createMock(User::class);
$report = $this->makeActiveReport();
$report->method('getCreator')->willReturn($creator);
$report->method('getSavedSearch')->willReturn(null);
$this->reportService->expects($this->once())
->method('getReport')
->willReturn($report);
$this->logger->expects($this->once())
->method('warning')
->with($this->stringContains('saved search not found'));
$this->reportService->expects($this->never())->method('getOrCreateReportResult');
$job = $this->makeJob();
$job->handle($this->reportService, $this->activityService, $this->prophetClient, $this->logger);
}
public function testHandleSkipsWhenPromptIsNull(): void
{
$creator = $this->createMock(User::class);
$savedSearch = $this->createMock(\Jiminny\Models\Activity\Search::class);
$report = $this->makeActiveReport();
$report->method('getCreator')->willReturn($creator);
$report->method('getSavedSearch')->willReturn($savedSearch);
$report->method('getAskAnythingPrompt')->willReturn(null);
$this->reportService->expects($this->once())
->method('getReport')
->willReturn($report);
$this->logger->expects($this->once())
->method('warning')
->with($this->stringContains('ask anything prompt not found'));
$this->reportService->expects($this->never())->method('getOrCreateReportResult');
$job = $this->makeJob();
$job->handle($this->reportService, $this->activityService, $this->prophetClient, $this->logger);
}
public function testHandleFailsReportWhenNotEnoughActivities(): void
{
$creator = $this->createMock(User::class);
$savedSearch = $this->createMock(\Jiminny\Models\Activity\Search::class);
$prompt = $this->createMock(\Jiminny\Models\AskAnything\AskAnythingPrompt::class);
$report = $this->makeActiveReport();
$report->method('getCreator')->willReturn($creator);
$report->method('getSavedSearch')->willReturn($savedSearch);
$report->method('getAskAnythingPrompt')->willReturn($prompt);
$reportResult = $this->createMock(AutomatedReportResult::class);
$reportResult->expects($this->once())
->method('update')
->with($this->callback(fn ($data) => $data['status'] === AutomatedReportResult::STATUS_FAILED
&& $data['reason'] === AutomatedReportResult::REASON_NOT_ENOUGH_ACTIVITIES));
$this->reportService->expects($this->once())
->method('getReport')
->willReturn($report);
$this->reportService->expects($this->once())
->method('getOrCreateReportResult')
->willReturn($reportResult);
$this->activityService->expects($this->once())
->method('getActivityIdsForSavedSearch')
->willReturn([]);
$this->logger->expects($this->exactly(3))
->method('info');
$job = $this->makeJob();
$job->handle($this->reportService, $this->activityService, $this->prophetClient, $this->logger);
}
public function testHandleSuccessfullyRequestsReport(): void
{
Carbon::setTestNow(Carbon::parse('2026-04-07 10:00:00'));
$creator = $this->createMock(User::class);
$savedSearch = $this->createMock(\Jiminny\Models\Activity\Search::class);
$prompt = $this->createMock(\Jiminny\Models\AskAnything\AskAnythingPrompt::class);
$report = $this->makeActiveReport();
$report->method('getCreator')->willReturn($creator);
$report->method('getSavedSearch')->willReturn($savedSearch);
$report->method('getAskAnythingPrompt')->willReturn($prompt);
$report->method('getUuid')->willReturn('report-uuid');
$reportResult = $this->createMock(AutomatedReportResult::class);
$reportResult->method('getUuid')->willReturn('result-uuid');
$reportResult->expects($this->once())
->method('update')
->with($this->callback(fn ($data) => $data['status'] === AutomatedReportResult::STATUS_REQUESTED
&& isset($data['name'], $data['payload'], $data['requested_at'])));
$this->reportService->expects($this->once())
->method('getReport')
->willReturn($report);
$this->reportService->expects($this->once())
->method('getOrCreateReportResult')
->willReturn($reportResult);
$this->reportService->expects($this->once())
->method('getAskJiminnyGenerateReportPayload')
->willReturn(['key' => 'value']);
$this->reportService->expects($this->once())
->method('getReportFileName')
->willReturn('My Report - 7 Apr 2026');
$this->activityService->expects($this->once())
->method('getActivityIdsForSavedSearch')
->willReturn(['act-1', 'act-2']);
$this->prophetClient->expects($this->once())
->method('sendRequest')
->willReturn(new \Jiminny\Component\ProphetAi\Dtos\ProphetResponseDto([]));
$this->logger->expects($this->exactly(4))
->method('info');
$job = $this->makeJob();
$job->handle($this->reportService, $this->activityService, $this->prophetClient, $this->logger);
Carbon::setTestNow();
}
public function testHandleCatchesGenericExceptionAndLogsError(): void
{
$this->reportService->expects($this->once())
->method('getReport')
->willThrowException(new \RuntimeException('DB error'));
$this->logger->expects($this->once())
->method('error')
->with($this->stringContains('Error'));
$job = $this->makeJob();
$reflection = new \ReflectionClass($job);
$triesProp = $reflection->getProperty('tries');
$triesProp->setAccessible(true);
$job->handle($this->reportService, $this->activityService, $this->prophetClient, $this->logger);
}
public function testHandleCatchesProphetExceptionAndSetsCorrectReason(): void
{
$creator = $this->createMock(User::class);
$savedSearch = $this->createMock(\Jiminny\Models\Activity\Search::class);
$prompt = $this->createMock(\Jiminny\Models\AskAnything\AskAnythingPrompt::class);
$report = $this->makeActiveReport();
$report->method('getCreator')->willReturn($creator);
$report->method('getSavedSearch')->willReturn($savedSearch);
$report->method('getAskAnythingPrompt')->willReturn($prompt);
$reportResult = $this->createMock(AutomatedReportResult::class);
$reportResult->method('getUuid')->willReturn('result-uuid');
$reportResult->expects($this->once())
->method('update')
->with($this->callback(fn ($data) => $data['reason'] === AutomatedReportResult::REASON_PROPHET_API_ERROR));
$this->reportService->expects($this->once())
->method('getReport')
->willReturn($report);
$this->reportService->expects($this->once())
->method('getOrCreateReportResult')
->willReturn($reportResult);
$this->activityService->expects($this->once())
->method('getActivityIdsForSavedSearch')
->willThrowException(new ProphetException('Prophet failed'));
$this->logger->expects($this->once())
->method('error');
$job = $this->makeJob();
$job->handle($this->reportService, $this->activityService, $this->prophetClient, $this->logger);
}
public function testHandleCreatesReportResultBeforeActivityFetch(): void
{
$creator = $this->createMock(User::class);
$savedSearch = $this->createMock(\Jiminny\Models\Activity\Search::class);
$prompt = $this->createMock(\Jiminny\Models\AskAnything\AskAnythingPrompt::class);
$report = $this->makeActiveReport();
$report->method('getCreator')->willReturn($creator);
$report->method('getSavedSearch')->willReturn($savedSearch);
$report->method('getAskAnythingPrompt')->willReturn($prompt);
$reportResult = $this->createMock(AutomatedReportResult::class);
$reportResult->method('getUuid')->willReturn('result-uuid');
$callOrder = [];
$this->reportService->expects($this->once())
->method('getReport')
->willReturn($report);
$this->reportService->expects($this->once())
->method('getOrCreateReportResult')
->willReturnCallback(function () use ($reportResult, &$callOrder) {
$callOrder[] = 'getOrCreateReportResult';
return $reportResult;
});
$this->activityService->expects($this->once())
->method('getActivityIdsForSavedSearch')
->willReturnCallback(function () use (&$callOrder) {
$callOrder[] = 'getActivityIds';
return [];
});
$job = $this->makeJob();
$job->handle($this->reportService, $this->activityService, $this->prophetClient, $this->logger);
$this->assertEquals(['getOrCreateReportResult', 'getActivityIds'], $callOrder);
}
public function testHandlePassesCorrectDataToCreateReportResult(): void
{
$creator = $this->createMock(User::class);
$savedSearch = $this->createMock(\Jiminny\Models\Activity\Search::class);
$prompt = $this->createMock(\Jiminny\Models\AskAnything\AskAnythingPrompt::class);
$report = $this->makeActiveReport();
$report->method('getCreator')->willReturn($creator);
$report->method('getSavedSearch')->willReturn($savedSearch);
$report->method('getAskAnythingPrompt')->willReturn($prompt);
$reportResult = $this->createMock(AutomatedReportResult::class);
$reportResult->method('getUuid')->willReturn('result-uuid');
$reportResult->method('update')->willReturn(true);
$this->reportService->expects($this->once())
->method('getReport')
->willReturn($report);
$this->reportService->expects($this->once())
->method('getOrCreateReportResult')
->with(
automatedReport: $report,
data: $this->callback(fn ($data) => $data['status'] === AutomatedReportResult::STATUS_DEFAULT
&& $data['media_type'] === AutomatedReportsService::MEDIA_TYPE_PDF)
)
->willReturn($reportResult);
$this->activityService->expects($this->once())
->method('getActivityIdsForSavedSearch')
->willReturn([]);
$job = $this->makeJob();
$job->handle($this->reportService, $this->activityService, $this->prophetClient, $this->logger);
}
}
Execute
Explain Plan
Browse Query History
View Parameters
Open Query Execution Settings…
In-Editor Results
Tx: Auto
Cancel Running Statements
Playground
jiminny
Code changed:
Hide
Sync Changes
Hide This Notification
9
12
2
4
Previous Highlighted Error
Next Highlighted Error
SELECT a.id, a.uuid, a.actual_start_time, o.id, o.uuid FROM opportunities o
JOIN activities a ON o.id = a.opportunity_id
WHERE a.crm_configuration_id = 39
AND a.actual_start_time > '2025-10-13'
AND a.type IN ('conference', 'softphone-inbound', 'softphone-outbound')
;
SELECT * FROM activities
WHERE crm_configuration_id = 39 and user_id = 143
and actual_start_time >= '2025-10-13'
AND type IN ('conference', 'softphone-inbound', 'softphone-outbound')
;
SELECT * FROM opportunities WHERE account_id IN (178);
select * from activities where id IN (620137, 620187, 620188, 620189, 620230);
# HS
SELECT * FROM opportunities WHERE id IN (238);
select * from activities where id IN (477,2076);
select * from users;
SELECT COUNT(*) FROM users;
SELECT COUNT(*) FROM activities;
SELECT COUNT(*) FROM opportunities;
UPDATE activities
SET
actual_start_time = '2025-12-19 09:00:00',
actual_end_time = '2025-12-19 10:30:00',
scheduled_start_time = '2025-12-19 09:00:00',
scheduled_end_time = '2025-12-19 10:30:00'
WHERE id IN (407509,407375);
select * from partners;
SELECT id, uuid, type, actual_start_time, user_id, crm_configuration_id
FROM activities
WHERE user_id = 143
AND actual_start_time >= '2025-10-13 00:00:00'
AND actual_start_time <= '2026-01-13 23:59:59'
ORDER BY actual_start_time DESC;
SELECT * FROM activities WHERE uuid_to_bin('78eda160-3086-435f-88a5-bb0c71b6008d') = uuid;
SELECT * FROM crm_layouts where crm_configuration_id = 39;
SELECT * FROM crm_layout_entities WHERE crm_layout_id = 282;
# lead_id
# account_id 177
# contact_id 3969
# opportunity_id
# stage_id 203
SELECT * FROM opportunities WHERE opportunities.crm_configuration_id = id = 282;
SELECT * FROM activities where crm_configuration_id = 39 AND type = 'conference'
AND user_id = 143 and actual_start_time >= '2025-10-13';
SELECT * FROM activities a
# JOIN opportunities o ON a.opportunity_id = o.id
WHERE a.crm_configuration_id = 39 AND a.type = 'conference'
and status = 'completed' and recording_state = 'recorded'
and a.actual_start_time >= '2025-10-13'
AND a.user_id = 143
;
select * from leads
where crm_configuration_id = 39; # 112 -> ac. 178, 109 => op. 1707
SELECT * FROM activities WHERE id IN (356013,616188,616202,616310,407509,407375,356001,356008);
SELECT * FROM activities WHERE id IN (356013,616188,616202,616310);
SELECT * FROM activities WHERE id IN (407509,407375); # leads: 112, 109 | status - 198
SELECT * FROM activities WHERE id IN (356001, 356008); # contacts:
SELECT * FROM opportunities WHERE id IN (1707);
SELECT * FROM stages where id IN (204, 198);
SELECT * FROM opportunities WHERE account_id IN (178);
SELECT * FROM opportunities WHERE crm_configuration_id = 39 AND created_at > '2025-01-01';
SELECT * FROM contacts WHERE account_id IN (178); # 4118 Musaibe, 4448 Ceco Personal
SELECT * FROM activities where crm_configuration_id = 39
AND opportunity_id IS NULL
AND is_internal = false
and status = 'completed' and recording_state = 'recorded'
AND actual_start_time >= '2025-10-13'
AND (lead_id IS NOT NULL OR contact_id IS NOT NULL OR account_id IS NOT NULL)
# AND lead_id IN (112, 109)
;
SELECT * FROM crm_profiles WHERE user_id = 143;
select * from inboxes; # 212
select * from users where id = 143; # 143
select * from inbox_email_batches where inbox_id = 212
and updated_at >= '2026-01-28 00:00:00' order by id desc;
select * from inbox_emails where inbox_id = 212
and batch_id = 95885 order by id desc;
select * from email_messages where origin_user_id = 143;
select * from activities where user_id = 143 and updated_at >= '2026-01-28 00:00:00';
select * from participants where activity_id = 620247;
select * from crm_profiles where user_id = 143;
SELECT * FROM activities WHERE uuid_to_bin('458cf915-b914-4000-b083-5687b32b2956') = uuid; # 356001
select * from transcription where activity_id = 356001; # 6943
select * from ai_prompts where transcription_id = 6943;
SELECT * FROM activity_summary_logs where activity_id = 356001;
SELECT * FROM social_accounts WHERE sociable_id = 143;
# [PASSWORD_DOTS]
SELECT * FROM activities WHERE uuid_to_bin('0164a4fb-cb95-454e-9edd-4d804e4999bd') = uuid;
# 422515 softphone tr. 8100
SELECT * FROM activities WHERE uuid_to_bin('7520add8-8d87-41a5-98e5-fc4edf96f21e') = uuid;
# 407509 conference tr. 7670 crmId: 00UD1000002J9aTMAS
select * from ai_prompts where transcription_id IN (8100, 7670);
select * from activity_summary_logs where activity_id = 407509;
select * from sidekick_settings;
select * from default_activity_types;
SELECT * FROM contacts WHERE crm_configuration_id = 39 and email = '[EMAIL]';
SELECT * FROM leads WHERE crm_configuration_id = 39 and email = '[EMAIL]';
SELECT * FROM activity_searches where user_id = 143;
SELECT * FROM groups where team_id = 1;
select * from teams where id = 1;
select * from groups where team_id = 1; # 1150 - 7e75f8025c22
select id, name, group_id, status, deleted_at, email
from users where team_id = 1 order by group_id desc ;
select * from activity_searches where id in (1977, 1978, 1979);
select * from activity_search_filters where activity_search_id IN (1977, 1978, 1979);
select * from activity_search_filters where filter = 'group_id' and value = '443f26b8-8512-437e-a9f9-7e75f8025c22'; # 10268, 10272, 10277
select * from nudges where activity_search_id IN (1977, 1978, 1979); # 877, 878, 879
INSERT INTO `activity_search_filters`
(`activity_search_id`, `filter`, `value`) VALUES
(1977, 'group_id', '443f26b8-8512-437e-a9f9-7e75f8025c22'),
(1978, 'group_id', '443f26b8-8512-437e-a9f9-7e75f8025c22'),
(1979, 'group_id', '443f26b8-8512-437e-a9f9-7e75f8025c22')
;
select * from crm_configurations where id = 39;
select * from teams where id = 1;
select * from team_features where team_id = 1;
select * from features;
SELECT * FROM activity_searches where id = 1982; # 1981
SELECT * FROM activity_search_filters WHERE activity_search_id = 1982;
SELECT * FROM automated_reports where id = 68;
SELECT * FROM automated_report_results where id = 275;
SELECT * FROM automated_reports order by id desc;
SELECT * FROM automated_report_results order by id desc;
select * from activity_searches where user_id = 143;
select * from ask_anything_prompts;
SELECT * FROM groups WHERE id = 1439;
SELECT * FROM users WHERE group_id = 1439;
select * from permissions; # 158
select * from roles;
select * from permission_role
select * from teams where id = 1;
select * from groups g JOIN playbooks p on g.playbook_id = p.id where g.team_id = 1;
select * from groups where id = 28;
select * from playbooks where team_id = 1;
select * from playbooks where id = 179;
select * from playbook_categories where id = 1391;
select * from users where id = 143;
select * from crm_profiles where user_id = 143;
select * from activities where crm_configuration_id = 39 and type = 'conference'
and crm_provider_id IS NOT NULL ORDER by id desc;
select * from activities where id = 422003; # 00UO400000pB6fpMAC
SELECT ar.id, ar.uuid, ar.media_type, ar.status, a.type
FROM automated_report_results ar
JOIN automated_reports a ON a.id = ar.report_id
WHERE a.type = 'ask_jiminny'
LIMIT 10;
select * from teams where id = 3143;
select * from crm_configurations where id = 500;
select * from users where name = 'Integration Account'; # 1695
SELECT * FROM social_accounts WHERE sociable_id = 1695;
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide...
|
NULL
|
|
54587
|
NULL
|
0
|
2026-04-20T09:06:35.645363+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-20/1776 /Users/lukas/.screenpipe/data/data/2026-04-20/1776675995645_m2.jpg...
|
iTerm2
|
-zsh
|
True
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Last login: Mon Apr 20 10:16:57 on ttys010
Poetry Last login: Mon Apr 20 10:16:57 on ttys010
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe
8.8G /Users/lukas/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe/*
4.0K /Users/lukas/.screenpipe/config.json
4.9G /Users/lukas/.screenpipe/data
3.9G /Users/lukas/.screenpipe/db.sqlite
64K /Users/lukas/.screenpipe/db.sqlite-shm
15M /Users/lukas/.screenpipe/db.sqlite-wal
36K /Users/lukas/.screenpipe/pipes
132K /Users/lukas/.screenpipe/screenpipe.2026-04-09.0.log
96K /Users/lukas/.screenpipe/screenpipe.2026-04-11.0.log
72K /Users/lukas/.screenpipe/screenpipe.2026-04-12.0.log
72K /Users/lukas/.screenpipe/screenpipe.2026-04-13.0.log
160K /Users/lukas/.screenpipe/screenpipe.2026-04-14.0.log
172K /Users/lukas/.screenpipe/screenpipe.2026-04-15.0.log
196K /Users/lukas/.screenpipe/screenpipe.2026-04-16.0.log
204K /Users/lukas/.screenpipe/screenpipe.2026-04-17.0.log
64K /Users/lukas/.screenpipe/screenpipe.2026-04-18.0.log
196K /Users/lukas/.screenpipe/screenpipe.2026-04-20.0.log
16K /Users/lukas/.screenpipe/screenpipe_sync.sh
24K /Users/lukas/.screenpipe/sync.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $
DOCKER
Close Tab
DEV (docker)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
screenpipe"
Close Tab
-zsh
Close Tab
⌥⌘1
-zsh...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":"Last login: Mon Apr 20 10:16:57 on ttys010\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe \n8.8G\u0000\u0000\u0000\t/Users/lukas/.screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe/*\n4.0K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/config.json\n4.9G\u0000\u0000\u0000\t/Users/lukas/.screenpipe/data\n3.9G\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite\n 64K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite-shm\n 15M\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite-wal\n 36K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/pipes\n132K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-09.0.log\n 96K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-11.0.log\n 72K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-12.0.log\n 72K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-13.0.log\n160K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-14.0.log\n172K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-15.0.log\n196K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-16.0.log\n204K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-17.0.log\n 64K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-18.0.log\n196K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-20.0.log\n 16K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe_sync.sh\n 24K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/sync.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.4800532,"height":-0.06304872},"value":"Last login: Mon Apr 20 10:16:57 on ttys010\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe \n8.8G\u0000\u0000\u0000\t/Users/lukas/.screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe/*\n4.0K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/config.json\n4.9G\u0000\u0000\u0000\t/Users/lukas/.screenpipe/data\n3.9G\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite\n 64K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite-shm\n 15M\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite-wal\n 36K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/pipes\n132K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-09.0.log\n 96K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-11.0.log\n 72K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-12.0.log\n 72K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-13.0.log\n160K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-14.0.log\n172K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-15.0.log\n196K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-16.0.log\n204K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-17.0.log\n 64K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-18.0.log\n196K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-20.0.log\n 16K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe_sync.sh\n 24K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/sync.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $","is_focused":true},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.27027926,"top":1.0,"width":0.0787899,"height":-0.042298436},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.27227393,"top":1.0,"width":0.005319149,"height":-0.04549086},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"DEV (docker)","depth":2,"bounds":{"left":0.34906915,"top":1.0,"width":0.0787899,"height":-0.042298436},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.35106382,"top":1.0,"width":0.005319149,"height":-0.04549086},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"APP (-zsh)","depth":2,"bounds":{"left":0.42785904,"top":1.0,"width":0.07862367,"height":-0.042298436},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.42985374,"top":1.0,"width":0.005319149,"height":-0.04549086},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.5064827,"top":1.0,"width":0.07862367,"height":-0.042298436},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.5084774,"top":1.0,"width":0.005319149,"height":-0.04549086},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"screenpipe\"","depth":2,"bounds":{"left":0.5851064,"top":1.0,"width":0.07862367,"height":-0.042298436},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.58710104,"top":1.0,"width":0.005319149,"height":-0.04549086},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.66373,"top":1.0,"width":0.07862367,"height":-0.042298436},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.66572475,"top":1.0,"width":0.005319149,"height":-0.04549086},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"⌥⌘1","depth":1,"bounds":{"left":0.7287234,"top":1.0,"width":0.01861702,"height":-0.023144484},"automation_id":"_NS:8","role_description":"text"},{"role":"AXStaticText","text":"-zsh","depth":1,"bounds":{"left":0.5046542,"top":1.0,"width":0.010970744,"height":-0.02394259},"role_description":"text"}]...
|
3394355443974518968
|
-3061367755569443119
|
visual_change
|
accessibility
|
NULL
|
Last login: Mon Apr 20 10:16:57 on ttys010
Poetry Last login: Mon Apr 20 10:16:57 on ttys010
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe
8.8G /Users/lukas/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe/*
4.0K /Users/lukas/.screenpipe/config.json
4.9G /Users/lukas/.screenpipe/data
3.9G /Users/lukas/.screenpipe/db.sqlite
64K /Users/lukas/.screenpipe/db.sqlite-shm
15M /Users/lukas/.screenpipe/db.sqlite-wal
36K /Users/lukas/.screenpipe/pipes
132K /Users/lukas/.screenpipe/screenpipe.2026-04-09.0.log
96K /Users/lukas/.screenpipe/screenpipe.2026-04-11.0.log
72K /Users/lukas/.screenpipe/screenpipe.2026-04-12.0.log
72K /Users/lukas/.screenpipe/screenpipe.2026-04-13.0.log
160K /Users/lukas/.screenpipe/screenpipe.2026-04-14.0.log
172K /Users/lukas/.screenpipe/screenpipe.2026-04-15.0.log
196K /Users/lukas/.screenpipe/screenpipe.2026-04-16.0.log
204K /Users/lukas/.screenpipe/screenpipe.2026-04-17.0.log
64K /Users/lukas/.screenpipe/screenpipe.2026-04-18.0.log
196K /Users/lukas/.screenpipe/screenpipe.2026-04-20.0.log
16K /Users/lukas/.screenpipe/screenpipe_sync.sh
24K /Users/lukas/.screenpipe/sync.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $
DOCKER
Close Tab
DEV (docker)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
screenpipe"
Close Tab
-zsh
Close Tab
⌥⌘1
-zsh...
|
54584
|
|
54588
|
NULL
|
0
|
2026-04-20T09:06:37.882284+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-20/1776 /Users/lukas/.screenpipe/data/data/2026-04-20/1776675997882_m1.jpg...
|
iTerm2
|
-zsh
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Last login: Mon Apr 20 10:16:57 on ttys010
Poetry Last login: Mon Apr 20 10:16:57 on ttys010
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe
8.8G /Users/lukas/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe/*
4.0K /Users/lukas/.screenpipe/config.json
4.9G /Users/lukas/.screenpipe/data
3.9G /Users/lukas/.screenpipe/db.sqlite
64K /Users/lukas/.screenpipe/db.sqlite-shm
15M /Users/lukas/.screenpipe/db.sqlite-wal
36K /Users/lukas/.screenpipe/pipes
132K /Users/lukas/.screenpipe/screenpipe.2026-04-09.0.log
96K /Users/lukas/.screenpipe/screenpipe.2026-04-11.0.log
72K /Users/lukas/.screenpipe/screenpipe.2026-04-12.0.log
72K /Users/lukas/.screenpipe/screenpipe.2026-04-13.0.log
160K /Users/lukas/.screenpipe/screenpipe.2026-04-14.0.log
172K /Users/lukas/.screenpipe/screenpipe.2026-04-15.0.log
196K /Users/lukas/.screenpipe/screenpipe.2026-04-16.0.log
204K /Users/lukas/.screenpipe/screenpipe.2026-04-17.0.log
64K /Users/lukas/.screenpipe/screenpipe.2026-04-18.0.log
196K /Users/lukas/.screenpipe/screenpipe.2026-04-20.0.log
16K /Users/lukas/.screenpipe/screenpipe_sync.sh
24K /Users/lukas/.screenpipe/sync.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $
DOCKER
Close Tab
DEV (docker)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
screenpipe"
Close Tab
-zsh
Close Tab
⌥⌘1
-zsh...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":"Last login: Mon Apr 20 10:16:57 on ttys010\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe \n8.8G\u0000\u0000\u0000\t/Users/lukas/.screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe/*\n4.0K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/config.json\n4.9G\u0000\u0000\u0000\t/Users/lukas/.screenpipe/data\n3.9G\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite\n 64K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite-shm\n 15M\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite-wal\n 36K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/pipes\n132K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-09.0.log\n 96K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-11.0.log\n 72K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-12.0.log\n 72K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-13.0.log\n160K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-14.0.log\n172K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-15.0.log\n196K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-16.0.log\n204K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-17.0.log\n 64K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-18.0.log\n196K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-20.0.log\n 16K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe_sync.sh\n 24K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/sync.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $","depth":4,"bounds":{"left":0.0,"top":0.08777778,"width":1.0,"height":0.9122222},"value":"Last login: Mon Apr 20 10:16:57 on ttys010\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\n\nPoetry could not find a pyproject.toml file in /Users/lukas or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe \n8.8G\u0000\u0000\u0000\t/Users/lukas/.screenpipe\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe/*\n4.0K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/config.json\n4.9G\u0000\u0000\u0000\t/Users/lukas/.screenpipe/data\n3.9G\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite\n 64K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite-shm\n 15M\u0000\u0000\u0000\t/Users/lukas/.screenpipe/db.sqlite-wal\n 36K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/pipes\n132K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-09.0.log\n 96K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-11.0.log\n 72K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-12.0.log\n 72K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-13.0.log\n160K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-14.0.log\n172K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-15.0.log\n196K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-16.0.log\n204K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-17.0.log\n 64K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-18.0.log\n196K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe.2026-04-20.0.log\n 16K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/screenpipe_sync.sh\n 24K\u0000\u0000\u0000\t/Users/lukas/.screenpipe/sync.log\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $","is_focused":true},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.0,"top":0.05888889,"width":0.16458334,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.004166667,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"DEV (docker)","depth":2,"bounds":{"left":0.16458334,"top":0.05888889,"width":0.16458334,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.16875,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"APP (-zsh)","depth":2,"bounds":{"left":0.32916668,"top":0.05888889,"width":0.16423611,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.33333334,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.49340278,"top":0.05888889,"width":0.16423611,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.49756944,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"screenpipe\"","depth":2,"bounds":{"left":0.6576389,"top":0.05888889,"width":0.16423611,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.66180557,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.821875,"top":0.05888889,"width":0.16423611,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.82604164,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"⌥⌘1","depth":1,"bounds":{"left":0.95763886,"top":0.032222223,"width":0.03888889,"height":0.018888889},"automation_id":"_NS:8","role_description":"text"},{"role":"AXStaticText","text":"-zsh","depth":1,"bounds":{"left":0.48958334,"top":0.033333335,"width":0.022916667,"height":0.017777778},"role_description":"text"}]...
|
3394355443974518968
|
-3061367755569443119
|
visual_change
|
accessibility
|
NULL
|
Last login: Mon Apr 20 10:16:57 on ttys010
Poetry Last login: Mon Apr 20 10:16:57 on ttys010
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
Poetry could not find a pyproject.toml file in /Users/lukas or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe
8.8G /Users/lukas/.screenpipe
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ du -sh ~/.screenpipe/*
4.0K /Users/lukas/.screenpipe/config.json
4.9G /Users/lukas/.screenpipe/data
3.9G /Users/lukas/.screenpipe/db.sqlite
64K /Users/lukas/.screenpipe/db.sqlite-shm
15M /Users/lukas/.screenpipe/db.sqlite-wal
36K /Users/lukas/.screenpipe/pipes
132K /Users/lukas/.screenpipe/screenpipe.2026-04-09.0.log
96K /Users/lukas/.screenpipe/screenpipe.2026-04-11.0.log
72K /Users/lukas/.screenpipe/screenpipe.2026-04-12.0.log
72K /Users/lukas/.screenpipe/screenpipe.2026-04-13.0.log
160K /Users/lukas/.screenpipe/screenpipe.2026-04-14.0.log
172K /Users/lukas/.screenpipe/screenpipe.2026-04-15.0.log
196K /Users/lukas/.screenpipe/screenpipe.2026-04-16.0.log
204K /Users/lukas/.screenpipe/screenpipe.2026-04-17.0.log
64K /Users/lukas/.screenpipe/screenpipe.2026-04-18.0.log
196K /Users/lukas/.screenpipe/screenpipe.2026-04-20.0.log
16K /Users/lukas/.screenpipe/screenpipe_sync.sh
24K /Users/lukas/.screenpipe/sync.log
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $
DOCKER
Close Tab
DEV (docker)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
screenpipe"
Close Tab
-zsh
Close Tab
⌥⌘1
-zsh...
|
NULL
|
|
54643
|
NULL
|
0
|
2026-04-20T09:11:55.090496+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-20/1776 /Users/lukas/.screenpipe/data/data/2026-04-20/1776676315090_m1.jpg...
|
PhpStorm
|
faVsco.js – SF [jiminny@localhost]
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
#11894 on JY-18909-automa Project: faVsco.js, menu
#11894 on JY-18909-automated-reports-ask-jiminny, menu
Start Listening for PHP Debug Connections
AskJiminnyReportActivityServiceTest
Run 'AskJiminnyReportActivityServiceTest'
Debug 'AskJiminnyReportActivityServiceTest'
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 Carbon\CarbonImmutable;
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\Services\Kiosk\AutomatedReports\AutomatedReportsService;
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);
}
public static function frequencyDateRangeProvider(): array
{
return [
'daily' => [
AutomatedReportsService::FREQUENCY_DAILY,
'2025-06-15 00:00:00',
'2025-06-15 23:59:59',
],
'weekly' => [
AutomatedReportsService::FREQUENCY_WEEKLY,
'2025-06-09 00:00:00',
'2025-06-15 23:59:59',
],
'monthly' => [
AutomatedReportsService::FREQUENCY_MONTHLY,
'2025-05-01 00:00:00',
'2025-05-31 23:59:59',
],
'quarterly' => [
AutomatedReportsService::FREQUENCY_QUARTERLY,
'2025-01-01 00:00:00',
'2025-03-31 23:59:59',
],
];
}
/**
* @dataProvider frequencyDateRangeProvider
*/
public function testGetActivityIdsInjectsDateRangeForFrequency(
string $frequency,
string $expectedStartDate,
string $expectedEndDate,
): void {
CarbonImmutable::setTestNow('2025-06-16 12:00:00');
try {
$user = $this->makeUser();
$savedSearch = $this->makeSavedSearch([]);
$filterSet = $this->createMock(FilterDefinitionCollection::class);
$this->activitySearch->method('getArrayFilterKeys')->willReturn([]);
$this->logger->method('info');
$this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);
$capturedCriteria = null;
$this->activitySearch->expects($this->once())
->method('getOnDemandPageFilterSet')
->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {
$capturedCriteria = $criteria;
return $filterSet;
});
$this->service->getActivityIdsForSavedSearch($savedSearch, $user, $frequency);
$this->assertNotNull($capturedCriteria);
$this->assertSame($expectedStartDate, $capturedCriteria->getStartDate()->format('Y-m-d H:i:s'));
$this->assertSame($expectedEndDate, $capturedCriteria->getEndDate()->format('Y-m-d H:i:s'));
} finally {
CarbonImmutable::setTestNow();
}
}
public function testGetActivityIdsWithNullFrequencyDoesNotInjectDates(): void
{
$user = $this->makeUser();
$savedSearch = $this->makeSavedSearch([]);
$filterSet = $this->createMock(FilterDefinitionCollection::class);
$this->activitySearch->method('getArrayFilterKeys')->willReturn([]);
$this->logger->method('info');
$this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);
$capturedCriteria = null;
$this->activitySearch->expects($this->once())
->method('getOnDemandPageFilterSet')
->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {
$capturedCriteria = $criteria;
return $filterSet;
});
$this->service->getActivityIdsForSavedSearch($savedSearch, $user, null);
$this->assertNotNull($capturedCriteria);
$this->assertNull($capturedCriteria->getStartDate());
$this->assertNull($capturedCriteria->getEndDate());
}
public function testGetActivityIdsWithUnknownFrequencyDoesNotInjectDates(): void
{
$user = $this->makeUser();
$savedSearch = $this->makeSavedSearch([]);
$filterSet = $this->createMock(FilterDefinitionCollection::class);
$this->activitySearch->method('getArrayFilterKeys')->willReturn([]);
$this->logger->method('info');
$this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);
$capturedCriteria = null;
$this->activitySearch->expects($this->once())
->method('getOnDemandPageFilterSet')
->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {
$capturedCriteria = $criteria;
return $filterSet;
});
$this->service->getActivityIdsForSavedSearch($savedSearch, $user, AutomatedReportsService::FREQUENCY_ONE_OFF);
$this->assertNotNull($capturedCriteria);
$this->assertNull($capturedCriteria->getStartDate());
$this->assertNull($capturedCriteria->getEndDate());
}
public function testGetActivityIdsFrequencyDateRangeOverridesSavedSearchDateFilters(): void
{
CarbonImmutable::setTestNow('2025-06-16 12:00:00');
try {
$user = $this->makeUser();
$startDateFilter = $this->makeFilter(ActivityActualDate::PARAM_START_DATE, '2024-01-01 00:00:00');
$endDateFilter = $this->makeFilter(ActivityActualDate::PARAM_END_DATE, '2024-12-31 23:59:59');
$savedSearch = $this->makeSavedSearch([$startDateFilter, $endDateFilter]);
$filterSet = $this->createMock(FilterDefinitionCollection::class);
$this->activitySearch->method('getArrayFilterKeys')->willReturn([]);
$this->logger->method('info');
$this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);
$capturedCriteria = null;
$this->activitySearch->expects($this->once())
->method('getOnDemandPageFilterSet')
->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {
$capturedCriteria = $criteria;
return $filterSet;
});
$this->service->getActivityIdsForSavedSearch($savedSearch, $user, AutomatedReportsService::FREQUENCY_DAILY);
$this->assertNotNull($capturedCriteria);
$this->assertSame('2025-06-15 00:00:00', $capturedCriteria->getStartDate()->format('Y-m-d H:i:s'));
$this->assertSame('2025-06-15 23:59:59', $capturedCriteria->getEndDate()->format('Y-m-d H:i:s'));
} finally {
CarbonImmutable::setTestNow();
}
}
}
Execute
Explain Plan
Browse Query History
View Parameters
Open Query Execution Settings…
In-Editor Results
Tx: Auto
Cancel Running Statements
Playground
jiminny
Code changed:
Hide
Sync Changes
Hide This Notification
9
12
2
4
Previous Highlighted Error
Next Highlighted Error
SELECT a.id, a.uuid, a.actual_start_time, o.id, o.uuid FROM opportunities o
JOIN activities a ON o.id = a.opportunity_id
WHERE a.crm_configuration_id = 39
AND a.actual_start_time > '2025-10-13'
AND a.type IN ('conference', 'softphone-inbound', 'softphone-outbound')
;
SELECT * FROM activities
WHERE crm_configuration_id = 39 and user_id = 143
and actual_start_time >= '2025-10-13'
AND type IN ('conference', 'softphone-inbound', 'softphone-outbound')
;
SELECT * FROM opportunities WHERE account_id IN (178);
select * from activities where id IN (620137, 620187, 620188, 620189, 620230);
# HS
SELECT * FROM opportunities WHERE id IN (238);
select * from activities where id IN (477,2076);
select * from users;
SELECT COUNT(*) FROM users;
SELECT COUNT(*) FROM activities;
SELECT COUNT(*) FROM opportunities;
UPDATE activities
SET
actual_start_time = '2025-12-19 09:00:00',
actual_end_time = '2025-12-19 10:30:00',
scheduled_start_time = '2025-12-19 09:00:00',
scheduled_end_time = '2025-12-19 10:30:00'
WHERE id IN (407509,407375);
select * from partners;
SELECT id, uuid, type, actual_start_time, user_id, crm_configuration_id
FROM activities
WHERE user_id = 143
AND actual_start_time >= '2025-10-13 00:00:00'
AND actual_start_time <= '2026-01-13 23:59:59'
ORDER BY actual_start_time DESC;
SELECT * FROM activities WHERE uuid_to_bin('78eda160-3086-435f-88a5-bb0c71b6008d') = uuid;
SELECT * FROM crm_layouts where crm_configuration_id = 39;
SELECT * FROM crm_layout_entities WHERE crm_layout_id = 282;
# lead_id
# account_id 177
# contact_id 3969
# opportunity_id
# stage_id 203
SELECT * FROM opportunities WHERE opportunities.crm_configuration_id = id = 282;
SELECT * FROM activities where crm_configuration_id = 39 AND type = 'conference'
AND user_id = 143 and actual_start_time >= '2025-10-13';
SELECT * FROM activities a
# JOIN opportunities o ON a.opportunity_id = o.id
WHERE a.crm_configuration_id = 39 AND a.type = 'conference'
and status = 'completed' and recording_state = 'recorded'
and a.actual_start_time >= '2025-10-13'
AND a.user_id = 143
;
select * from leads
where crm_configuration_id = 39; # 112 -> ac. 178, 109 => op. 1707
SELECT * FROM activities WHERE id IN (356013,616188,616202,616310,407509,407375,356001,356008);
SELECT * FROM activities WHERE id IN (356013,616188,616202,616310);
SELECT * FROM activities WHERE id IN (407509,407375); # leads: 112, 109 | status - 198
SELECT * FROM activities WHERE id IN (356001, 356008); # contacts:
SELECT * FROM opportunities WHERE id IN (1707);
SELECT * FROM stages where id IN (204, 198);
SELECT * FROM opportunities WHERE account_id IN (178);
SELECT * FROM opportunities WHERE crm_configuration_id = 39 AND created_at > '2025-01-01';
SELECT * FROM contacts WHERE account_id IN (178); # 4118 Musaibe, 4448 Ceco Personal
SELECT * FROM activities where crm_configuration_id = 39
AND opportunity_id IS NULL
AND is_internal = false
and status = 'completed' and recording_state = 'recorded'
AND actual_start_time >= '2025-10-13'
AND (lead_id IS NOT NULL OR contact_id IS NOT NULL OR account_id IS NOT NULL)
# AND lead_id IN (112, 109)
;
SELECT * FROM crm_profiles WHERE user_id = 143;
select * from inboxes; # 212
select * from users where id = 143; # 143
select * from inbox_email_batches where inbox_id = 212
and updated_at >= '2026-01-28 00:00:00' order by id desc;
select * from inbox_emails where inbox_id = 212
and batch_id = 95885 order by id desc;
select * from email_messages where origin_user_id = 143;
select * from activities where user_id = 143 and updated_at >= '2026-01-28 00:00:00';
select * from participants where activity_id = 620247;
select * from crm_profiles where user_id = 143;
SELECT * FROM activities WHERE uuid_to_bin('458cf915-b914-4000-b083-5687b32b2956') = uuid; # 356001
select * from transcription where activity_id = 356001; # 6943
select * from ai_prompts where transcription_id = 6943;
SELECT * FROM activity_summary_logs where activity_id = 356001;
SELECT * FROM social_accounts WHERE sociable_id = 143;
# [PASSWORD_DOTS]
SELECT * FROM activities WHERE uuid_to_bin('0164a4fb-cb95-454e-9edd-4d804e4999bd') = uuid;
# 422515 softphone tr. 8100
SELECT * FROM activities WHERE uuid_to_bin('7520add8-8d87-41a5-98e5-fc4edf96f21e') = uuid;
# 407509 conference tr. 7670 crmId: 00UD1000002J9aTMAS
select * from ai_prompts where transcription_id IN (8100, 7670);
select * from activity_summary_logs where activity_id = 407509;
select * from sidekick_settings;
select * from default_activity_types;
SELECT * FROM contacts WHERE crm_configuration_id = 39 and email = '[EMAIL]';
SELECT * FROM leads WHERE crm_configuration_id = 39 and email = '[EMAIL]';
SELECT * FROM activity_searches where user_id = 143;
SELECT * FROM groups where team_id = 1;
select * from teams where id = 1;
select * from groups where team_id = 1; # 1150 - 7e75f8025c22
select id, name, group_id, status, deleted_at, email
from users where team_id = 1 order by group_id desc ;
select * from activity_searches where id in (1977, 1978, 1979);
select * from activity_search_filters where activity_search_id IN (1977, 1978, 1979);
select * from activity_search_filters where filter = 'group_id' and value = '443f26b8-8512-437e-a9f9-7e75f8025c22'; # 10268, 10272, 10277
select * from nudges where activity_search_id IN (1977, 1978, 1979); # 877, 878, 879
INSERT INTO `activity_search_filters`
(`activity_search_id`, `filter`, `value`) VALUES
(1977, 'group_id', '443f26b8-8512-437e-a9f9-7e75f8025c22'),
(1978, 'group_id', '443f26b8-8512-437e-a9f9-7e75f8025c22'),
(1979, 'group_id', '443f26b8-8512-437e-a9f9-7e75f8025c22')
;
select * from crm_configurations where id = 39;
select * from teams where id = 1;
select * from team_features where team_id = 1;
select * from features;
SELECT * FROM activity_searches where id = 1982; # 1981
SELECT * FROM activity_search_filters WHERE activity_search_id = 1982;
SELECT * FROM automated_reports where id = 68;
SELECT * FROM automated_report_results where id = 275;
SELECT * FROM automated_reports order by id desc;
SELECT * FROM automated_report_results order by id desc;
select * from activity_searches where user_id = 143;
select * from ask_anything_prompts;
SELECT * FROM groups WHERE id = 1439;
SELECT * FROM users WHERE group_id = 1439;
select * from permissions; # 158
select * from roles;
select * from permission_role
select * from teams where id = 1;
select * from groups g JOIN playbooks p on g.playbook_id = p.id where g.team_id = 1;
select * from groups where id = 28;
select * from playbooks where team_id = 1;
select * from playbooks where id = 179;
select * from playbook_categories where id = 1391;
select * from users where id = 143;
select * from crm_profiles where user_id = 143;
select * from activities where crm_configuration_id = 39 and type = 'conference'
and crm_provider_id IS NOT NULL ORDER by id desc;
select * from activities where id = 422003; # 00UO400000pB6fpMAC
SELECT ar.id, ar.uuid, ar.media_type, ar.status, a.type
FROM automated_report_results ar
JOIN automated_reports a ON a.id = ar.report_id
WHERE a.type = 'ask_jiminny'
LIMIT 10;
select * from teams where id = 3143;
select * from crm_configurations where id = 500;
select * from users where name = 'Integration Account'; # 1695
SELECT * FROM social_accounts WHERE sociable_id = 1695;
select * from activities where crm_configuration_id = 39
and status = 'completed' and actual_start_time >= '2025-01-01'
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"#11894 on JY-18909-automated-reports-ask-jiminny, menu","depth":5,"help_text":"Pull request #11894 exists for current branch JY-18909-automated-reports-ask-jiminny","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"AskJiminnyReportActivityServiceTest","depth":6,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run 'AskJiminnyReportActivityServiceTest'","depth":6,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'AskJiminnyReportActivityServiceTest'","depth":6,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"More Actions","depth":6,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JetBrains AI","depth":5,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Search Everywhere","depth":5,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"IDE and Project Settings","depth":5,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.088194445,"height":0.027777778},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"2","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.016666668,"height":0.02111111},"role_description":"text"},{"role":"AXStaticText","text":"3","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.016666668,"height":0.02111111},"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.015277778,"height":0.025555555},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.014583333,"height":0.025555555},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Tests\\Unit\\Services\\Kiosk\\AutomatedReports;\n\nuse Carbon\\CarbonImmutable;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinition\\ActivityActualDate;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinition\\ActivityUpdatedDate;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinition\\DealInsights\\ClosingPeriodFilter;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinitionCollection;\nuse Jiminny\\Component\\ActivitySearch\\Service\\ActivitySearch;\nuse Jiminny\\Models\\Activity\\Search;\nuse Jiminny\\Models\\Activity\\SearchFilter;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Repositories\\ElasticActivityRepository;\nuse Jiminny\\Services\\Kiosk\\AutomatedReports\\AskJiminnyReportActivityService;\nuse Jiminny\\Services\\Kiosk\\AutomatedReports\\AutomatedReportsService;\nuse Jiminny\\VO\\Repository\\OnDemandActivitySearch\\Criteria;\nuse PHPUnit\\Framework\\MockObject\\MockObject;\nuse PHPUnit\\Framework\\TestCase;\nuse Psr\\Log\\LoggerInterface;\n\nclass AskJiminnyReportActivityServiceTest extends TestCase\n{\n private ActivitySearch&MockObject $activitySearch;\n private ElasticActivityRepository&MockObject $elasticRepository;\n private LoggerInterface&MockObject $logger;\n private AskJiminnyReportActivityService $service;\n\n protected function setUp(): void\n {\n $this->activitySearch = $this->createMock(ActivitySearch::class);\n $this->elasticRepository = $this->createMock(ElasticActivityRepository::class);\n $this->logger = $this->createMock(LoggerInterface::class);\n\n $this->service = new AskJiminnyReportActivityService(\n $this->activitySearch,\n $this->elasticRepository,\n $this->logger,\n );\n }\n\n private function makeFilter(string $key, ?string $value): SearchFilter&MockObject\n {\n $filter = $this->createMock(SearchFilter::class);\n $filter->method('getFilterProperty')->willReturn($key);\n $filter->method('getFilterValue')->willReturn($value);\n\n return $filter;\n }\n\n private function makeUser(): User&MockObject\n {\n $tz = new \\DateTimeZone('UTC');\n $user = $this->createMock(User::class);\n $user->method('getTimezone')->willReturn($tz);\n $user->method('getId')->willReturn(1);\n $user->method('getUuid')->willReturn('user-uuid');\n\n return $user;\n }\n\n private function makeSavedSearch(array $filters): Search&MockObject\n {\n $savedSearch = $this->createMock(Search::class);\n $savedSearch->method('getId')->willReturn(42);\n $savedSearch->method('getFilters')->willReturn(new \\Illuminate\\Support\\LazyCollection($filters));\n\n return $savedSearch;\n }\n\n public function testGetActivityIdsForSavedSearchReturnsIds(): void\n {\n $user = $this->makeUser();\n $savedSearch = $this->makeSavedSearch([]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->expects($this->once())\n ->method('getArrayFilterKeys')\n ->with($user)\n ->willReturn([]);\n\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturn($filterSet);\n\n $this->elasticRepository->expects($this->once())\n ->method('onDemandSearchIdsOnly')\n ->willReturn(['id-1', 'id-2', 'id-3']);\n\n $this->logger->expects($this->once())\n ->method('info')\n ->with('[AskJiminnyReport] Fetched activity IDs for saved search');\n\n $result = $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertEquals(['id-1', 'id-2', 'id-3'], $result);\n }\n\n public function testGetActivityIdsForSavedSearchReturnsEmptyWhenNoResults(): void\n {\n $user = $this->makeUser();\n $savedSearch = $this->makeSavedSearch([]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->activitySearch->method('getOnDemandPageFilterSet')->willReturn($filterSet);\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);\n\n $this->logger->expects($this->once())->method('info');\n\n $result = $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertEmpty($result);\n }\n\n public function testGetActivityIdsFiltersOutDateFilters(): void\n {\n $user = $this->makeUser();\n\n $nonDateFilter = $this->makeFilter('owner_id', '123');\n $startDateFilter = $this->makeFilter(ActivityActualDate::PARAM_START_DATE, '2025-01-01 00:00:00');\n $endDateFilter = $this->makeFilter(ActivityActualDate::PARAM_END_DATE, '2025-01-31 23:59:59');\n $updatedFromFilter = $this->makeFilter(ActivityUpdatedDate::PARAM_UPDATED_FROM, '2025-01-01 00:00:00');\n $updatedToFilter = $this->makeFilter(ActivityUpdatedDate::PARAM_UPDATED_TO, '2025-01-31 23:59:59');\n\n $savedSearch = $this->makeSavedSearch([\n $nonDateFilter,\n $startDateFilter,\n $endDateFilter,\n $updatedFromFilter,\n $updatedToFilter,\n ]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n\n $capturedCriteria = null;\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {\n $capturedCriteria = $criteria;\n\n return $filterSet;\n });\n\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);\n $this->logger->method('info');\n\n $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertNotNull($capturedCriteria);\n }\n\n public function testGetActivityIdsFiltersOutClosingPeriodDateFilters(): void\n {\n $user = $this->makeUser();\n\n $closingStartFilter = $this->makeFilter(ClosingPeriodFilter::KEY_START_DATE, '2025-01-01');\n $closingEndFilter = $this->makeFilter(ClosingPeriodFilter::KEY_END_DATE, '2025-03-31');\n $regularFilter = $this->makeFilter('rep_id', '99');\n\n $savedSearch = $this->makeSavedSearch([\n $closingStartFilter,\n $closingEndFilter,\n $regularFilter,\n ]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturn($filterSet);\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn(['id-1']);\n $this->logger->method('info');\n\n $result = $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertEquals(['id-1'], $result);\n }\n\n public function testGetActivityIdsHandlesArrayFilters(): void\n {\n $user = $this->makeUser();\n\n $filter1 = $this->makeFilter('outcome', 'positive');\n $filter2 = $this->makeFilter('outcome', 'negative');\n\n $savedSearch = $this->makeSavedSearch([$filter1, $filter2]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn(['outcome']);\n $this->activitySearch->method('getOnDemandPageFilterSet')->willReturn($filterSet);\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn(['id-1']);\n $this->logger->method('info');\n\n $result = $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertEquals(['id-1'], $result);\n }\n\n public function testGetActivityIdsHandlesScalarFilters(): void\n {\n $user = $this->makeUser();\n\n $filter = $this->makeFilter('direction', 'inbound');\n $savedSearch = $this->makeSavedSearch([$filter]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->activitySearch->method('getOnDemandPageFilterSet')->willReturn($filterSet);\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn(['id-5']);\n $this->logger->method('info');\n\n $result = $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertEquals(['id-5'], $result);\n }\n\n public function testGetActivityIdsPassesNonZeroSequenceNumberToDisableFirstRequestDefaults(): void\n {\n $user = $this->makeUser();\n $savedSearch = $this->makeSavedSearch([]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n\n $capturedCriteria = null;\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {\n $capturedCriteria = $criteria;\n\n return $filterSet;\n });\n\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);\n $this->logger->method('info');\n\n $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertNotNull($capturedCriteria);\n $this->assertFalse($capturedCriteria->isFirstRequest());\n }\n\n public function testGetActivityIdsLogsWithCorrectContext(): void\n {\n $user = $this->makeUser();\n $savedSearch = $this->makeSavedSearch([]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->activitySearch->method('getOnDemandPageFilterSet')->willReturn($filterSet);\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn(['a', 'b']);\n\n $this->logger->expects($this->once())\n ->method('info')\n ->with(\n '[AskJiminnyReport] Fetched activity IDs for saved search',\n $this->callback(fn ($context) => $context['saved_search_id'] === 42\n && $context['user_id'] === 1\n && $context['activity_count'] === 2)\n );\n\n $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n }\n\n public static function frequencyDateRangeProvider(): array\n {\n return [\n 'daily' => [\n AutomatedReportsService::FREQUENCY_DAILY,\n '2025-06-15 00:00:00',\n '2025-06-15 23:59:59',\n ],\n 'weekly' => [\n AutomatedReportsService::FREQUENCY_WEEKLY,\n '2025-06-09 00:00:00',\n '2025-06-15 23:59:59',\n ],\n 'monthly' => [\n AutomatedReportsService::FREQUENCY_MONTHLY,\n '2025-05-01 00:00:00',\n '2025-05-31 23:59:59',\n ],\n 'quarterly' => [\n AutomatedReportsService::FREQUENCY_QUARTERLY,\n '2025-01-01 00:00:00',\n '2025-03-31 23:59:59',\n ],\n ];\n }\n\n /**\n * @dataProvider frequencyDateRangeProvider\n */\n public function testGetActivityIdsInjectsDateRangeForFrequency(\n string $frequency,\n string $expectedStartDate,\n string $expectedEndDate,\n ): void {\n CarbonImmutable::setTestNow('2025-06-16 12:00:00');\n\n try {\n $user = $this->makeUser();\n $savedSearch = $this->makeSavedSearch([]);\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->logger->method('info');\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);\n\n $capturedCriteria = null;\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {\n $capturedCriteria = $criteria;\n\n return $filterSet;\n });\n\n $this->service->getActivityIdsForSavedSearch($savedSearch, $user, $frequency);\n\n $this->assertNotNull($capturedCriteria);\n $this->assertSame($expectedStartDate, $capturedCriteria->getStartDate()->format('Y-m-d H:i:s'));\n $this->assertSame($expectedEndDate, $capturedCriteria->getEndDate()->format('Y-m-d H:i:s'));\n } finally {\n CarbonImmutable::setTestNow();\n }\n }\n\n public function testGetActivityIdsWithNullFrequencyDoesNotInjectDates(): void\n {\n $user = $this->makeUser();\n $savedSearch = $this->makeSavedSearch([]);\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->logger->method('info');\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);\n\n $capturedCriteria = null;\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {\n $capturedCriteria = $criteria;\n\n return $filterSet;\n });\n\n $this->service->getActivityIdsForSavedSearch($savedSearch, $user, null);\n\n $this->assertNotNull($capturedCriteria);\n $this->assertNull($capturedCriteria->getStartDate());\n $this->assertNull($capturedCriteria->getEndDate());\n }\n\n public function testGetActivityIdsWithUnknownFrequencyDoesNotInjectDates(): void\n {\n $user = $this->makeUser();\n $savedSearch = $this->makeSavedSearch([]);\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->logger->method('info');\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);\n\n $capturedCriteria = null;\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {\n $capturedCriteria = $criteria;\n\n return $filterSet;\n });\n\n $this->service->getActivityIdsForSavedSearch($savedSearch, $user, AutomatedReportsService::FREQUENCY_ONE_OFF);\n\n $this->assertNotNull($capturedCriteria);\n $this->assertNull($capturedCriteria->getStartDate());\n $this->assertNull($capturedCriteria->getEndDate());\n }\n\n public function testGetActivityIdsFrequencyDateRangeOverridesSavedSearchDateFilters(): void\n {\n CarbonImmutable::setTestNow('2025-06-16 12:00:00');\n\n try {\n $user = $this->makeUser();\n\n $startDateFilter = $this->makeFilter(ActivityActualDate::PARAM_START_DATE, '2024-01-01 00:00:00');\n $endDateFilter = $this->makeFilter(ActivityActualDate::PARAM_END_DATE, '2024-12-31 23:59:59');\n $savedSearch = $this->makeSavedSearch([$startDateFilter, $endDateFilter]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->logger->method('info');\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);\n\n $capturedCriteria = null;\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {\n $capturedCriteria = $criteria;\n\n return $filterSet;\n });\n\n $this->service->getActivityIdsForSavedSearch($savedSearch, $user, AutomatedReportsService::FREQUENCY_DAILY);\n\n $this->assertNotNull($capturedCriteria);\n $this->assertSame('2025-06-15 00:00:00', $capturedCriteria->getStartDate()->format('Y-m-d H:i:s'));\n $this->assertSame('2025-06-15 23:59:59', $capturedCriteria->getEndDate()->format('Y-m-d H:i:s'));\n } finally {\n CarbonImmutable::setTestNow();\n }\n }\n}","depth":4,"value":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Tests\\Unit\\Services\\Kiosk\\AutomatedReports;\n\nuse Carbon\\CarbonImmutable;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinition\\ActivityActualDate;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinition\\ActivityUpdatedDate;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinition\\DealInsights\\ClosingPeriodFilter;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinitionCollection;\nuse Jiminny\\Component\\ActivitySearch\\Service\\ActivitySearch;\nuse Jiminny\\Models\\Activity\\Search;\nuse Jiminny\\Models\\Activity\\SearchFilter;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Repositories\\ElasticActivityRepository;\nuse Jiminny\\Services\\Kiosk\\AutomatedReports\\AskJiminnyReportActivityService;\nuse Jiminny\\Services\\Kiosk\\AutomatedReports\\AutomatedReportsService;\nuse Jiminny\\VO\\Repository\\OnDemandActivitySearch\\Criteria;\nuse PHPUnit\\Framework\\MockObject\\MockObject;\nuse PHPUnit\\Framework\\TestCase;\nuse Psr\\Log\\LoggerInterface;\n\nclass AskJiminnyReportActivityServiceTest extends TestCase\n{\n private ActivitySearch&MockObject $activitySearch;\n private ElasticActivityRepository&MockObject $elasticRepository;\n private LoggerInterface&MockObject $logger;\n private AskJiminnyReportActivityService $service;\n\n protected function setUp(): void\n {\n $this->activitySearch = $this->createMock(ActivitySearch::class);\n $this->elasticRepository = $this->createMock(ElasticActivityRepository::class);\n $this->logger = $this->createMock(LoggerInterface::class);\n\n $this->service = new AskJiminnyReportActivityService(\n $this->activitySearch,\n $this->elasticRepository,\n $this->logger,\n );\n }\n\n private function makeFilter(string $key, ?string $value): SearchFilter&MockObject\n {\n $filter = $this->createMock(SearchFilter::class);\n $filter->method('getFilterProperty')->willReturn($key);\n $filter->method('getFilterValue')->willReturn($value);\n\n return $filter;\n }\n\n private function makeUser(): User&MockObject\n {\n $tz = new \\DateTimeZone('UTC');\n $user = $this->createMock(User::class);\n $user->method('getTimezone')->willReturn($tz);\n $user->method('getId')->willReturn(1);\n $user->method('getUuid')->willReturn('user-uuid');\n\n return $user;\n }\n\n private function makeSavedSearch(array $filters): Search&MockObject\n {\n $savedSearch = $this->createMock(Search::class);\n $savedSearch->method('getId')->willReturn(42);\n $savedSearch->method('getFilters')->willReturn(new \\Illuminate\\Support\\LazyCollection($filters));\n\n return $savedSearch;\n }\n\n public function testGetActivityIdsForSavedSearchReturnsIds(): void\n {\n $user = $this->makeUser();\n $savedSearch = $this->makeSavedSearch([]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->expects($this->once())\n ->method('getArrayFilterKeys')\n ->with($user)\n ->willReturn([]);\n\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturn($filterSet);\n\n $this->elasticRepository->expects($this->once())\n ->method('onDemandSearchIdsOnly')\n ->willReturn(['id-1', 'id-2', 'id-3']);\n\n $this->logger->expects($this->once())\n ->method('info')\n ->with('[AskJiminnyReport] Fetched activity IDs for saved search');\n\n $result = $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertEquals(['id-1', 'id-2', 'id-3'], $result);\n }\n\n public function testGetActivityIdsForSavedSearchReturnsEmptyWhenNoResults(): void\n {\n $user = $this->makeUser();\n $savedSearch = $this->makeSavedSearch([]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->activitySearch->method('getOnDemandPageFilterSet')->willReturn($filterSet);\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);\n\n $this->logger->expects($this->once())->method('info');\n\n $result = $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertEmpty($result);\n }\n\n public function testGetActivityIdsFiltersOutDateFilters(): void\n {\n $user = $this->makeUser();\n\n $nonDateFilter = $this->makeFilter('owner_id', '123');\n $startDateFilter = $this->makeFilter(ActivityActualDate::PARAM_START_DATE, '2025-01-01 00:00:00');\n $endDateFilter = $this->makeFilter(ActivityActualDate::PARAM_END_DATE, '2025-01-31 23:59:59');\n $updatedFromFilter = $this->makeFilter(ActivityUpdatedDate::PARAM_UPDATED_FROM, '2025-01-01 00:00:00');\n $updatedToFilter = $this->makeFilter(ActivityUpdatedDate::PARAM_UPDATED_TO, '2025-01-31 23:59:59');\n\n $savedSearch = $this->makeSavedSearch([\n $nonDateFilter,\n $startDateFilter,\n $endDateFilter,\n $updatedFromFilter,\n $updatedToFilter,\n ]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n\n $capturedCriteria = null;\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {\n $capturedCriteria = $criteria;\n\n return $filterSet;\n });\n\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);\n $this->logger->method('info');\n\n $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertNotNull($capturedCriteria);\n }\n\n public function testGetActivityIdsFiltersOutClosingPeriodDateFilters(): void\n {\n $user = $this->makeUser();\n\n $closingStartFilter = $this->makeFilter(ClosingPeriodFilter::KEY_START_DATE, '2025-01-01');\n $closingEndFilter = $this->makeFilter(ClosingPeriodFilter::KEY_END_DATE, '2025-03-31');\n $regularFilter = $this->makeFilter('rep_id', '99');\n\n $savedSearch = $this->makeSavedSearch([\n $closingStartFilter,\n $closingEndFilter,\n $regularFilter,\n ]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturn($filterSet);\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn(['id-1']);\n $this->logger->method('info');\n\n $result = $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertEquals(['id-1'], $result);\n }\n\n public function testGetActivityIdsHandlesArrayFilters(): void\n {\n $user = $this->makeUser();\n\n $filter1 = $this->makeFilter('outcome', 'positive');\n $filter2 = $this->makeFilter('outcome', 'negative');\n\n $savedSearch = $this->makeSavedSearch([$filter1, $filter2]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn(['outcome']);\n $this->activitySearch->method('getOnDemandPageFilterSet')->willReturn($filterSet);\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn(['id-1']);\n $this->logger->method('info');\n\n $result = $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertEquals(['id-1'], $result);\n }\n\n public function testGetActivityIdsHandlesScalarFilters(): void\n {\n $user = $this->makeUser();\n\n $filter = $this->makeFilter('direction', 'inbound');\n $savedSearch = $this->makeSavedSearch([$filter]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->activitySearch->method('getOnDemandPageFilterSet')->willReturn($filterSet);\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn(['id-5']);\n $this->logger->method('info');\n\n $result = $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertEquals(['id-5'], $result);\n }\n\n public function testGetActivityIdsPassesNonZeroSequenceNumberToDisableFirstRequestDefaults(): void\n {\n $user = $this->makeUser();\n $savedSearch = $this->makeSavedSearch([]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n\n $capturedCriteria = null;\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {\n $capturedCriteria = $criteria;\n\n return $filterSet;\n });\n\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);\n $this->logger->method('info');\n\n $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertNotNull($capturedCriteria);\n $this->assertFalse($capturedCriteria->isFirstRequest());\n }\n\n public function testGetActivityIdsLogsWithCorrectContext(): void\n {\n $user = $this->makeUser();\n $savedSearch = $this->makeSavedSearch([]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->activitySearch->method('getOnDemandPageFilterSet')->willReturn($filterSet);\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn(['a', 'b']);\n\n $this->logger->expects($this->once())\n ->method('info')\n ->with(\n '[AskJiminnyReport] Fetched activity IDs for saved search',\n $this->callback(fn ($context) => $context['saved_search_id'] === 42\n && $context['user_id'] === 1\n && $context['activity_count'] === 2)\n );\n\n $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n }\n\n public static function frequencyDateRangeProvider(): array\n {\n return [\n 'daily' => [\n AutomatedReportsService::FREQUENCY_DAILY,\n '2025-06-15 00:00:00',\n '2025-06-15 23:59:59',\n ],\n 'weekly' => [\n AutomatedReportsService::FREQUENCY_WEEKLY,\n '2025-06-09 00:00:00',\n '2025-06-15 23:59:59',\n ],\n 'monthly' => [\n AutomatedReportsService::FREQUENCY_MONTHLY,\n '2025-05-01 00:00:00',\n '2025-05-31 23:59:59',\n ],\n 'quarterly' => [\n AutomatedReportsService::FREQUENCY_QUARTERLY,\n '2025-01-01 00:00:00',\n '2025-03-31 23:59:59',\n ],\n ];\n }\n\n /**\n * @dataProvider frequencyDateRangeProvider\n */\n public function testGetActivityIdsInjectsDateRangeForFrequency(\n string $frequency,\n string $expectedStartDate,\n string $expectedEndDate,\n ): void {\n CarbonImmutable::setTestNow('2025-06-16 12:00:00');\n\n try {\n $user = $this->makeUser();\n $savedSearch = $this->makeSavedSearch([]);\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->logger->method('info');\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);\n\n $capturedCriteria = null;\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {\n $capturedCriteria = $criteria;\n\n return $filterSet;\n });\n\n $this->service->getActivityIdsForSavedSearch($savedSearch, $user, $frequency);\n\n $this->assertNotNull($capturedCriteria);\n $this->assertSame($expectedStartDate, $capturedCriteria->getStartDate()->format('Y-m-d H:i:s'));\n $this->assertSame($expectedEndDate, $capturedCriteria->getEndDate()->format('Y-m-d H:i:s'));\n } finally {\n CarbonImmutable::setTestNow();\n }\n }\n\n public function testGetActivityIdsWithNullFrequencyDoesNotInjectDates(): void\n {\n $user = $this->makeUser();\n $savedSearch = $this->makeSavedSearch([]);\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->logger->method('info');\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);\n\n $capturedCriteria = null;\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {\n $capturedCriteria = $criteria;\n\n return $filterSet;\n });\n\n $this->service->getActivityIdsForSavedSearch($savedSearch, $user, null);\n\n $this->assertNotNull($capturedCriteria);\n $this->assertNull($capturedCriteria->getStartDate());\n $this->assertNull($capturedCriteria->getEndDate());\n }\n\n public function testGetActivityIdsWithUnknownFrequencyDoesNotInjectDates(): void\n {\n $user = $this->makeUser();\n $savedSearch = $this->makeSavedSearch([]);\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->logger->method('info');\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);\n\n $capturedCriteria = null;\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {\n $capturedCriteria = $criteria;\n\n return $filterSet;\n });\n\n $this->service->getActivityIdsForSavedSearch($savedSearch, $user, AutomatedReportsService::FREQUENCY_ONE_OFF);\n\n $this->assertNotNull($capturedCriteria);\n $this->assertNull($capturedCriteria->getStartDate());\n $this->assertNull($capturedCriteria->getEndDate());\n }\n\n public function testGetActivityIdsFrequencyDateRangeOverridesSavedSearchDateFilters(): void\n {\n CarbonImmutable::setTestNow('2025-06-16 12:00:00');\n\n try {\n $user = $this->makeUser();\n\n $startDateFilter = $this->makeFilter(ActivityActualDate::PARAM_START_DATE, '2024-01-01 00:00:00');\n $endDateFilter = $this->makeFilter(ActivityActualDate::PARAM_END_DATE, '2024-12-31 23:59:59');\n $savedSearch = $this->makeSavedSearch([$startDateFilter, $endDateFilter]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->logger->method('info');\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);\n\n $capturedCriteria = null;\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {\n $capturedCriteria = $criteria;\n\n return $filterSet;\n });\n\n $this->service->getActivityIdsForSavedSearch($savedSearch, $user, AutomatedReportsService::FREQUENCY_DAILY);\n\n $this->assertNotNull($capturedCriteria);\n $this->assertSame('2025-06-15 00:00:00', $capturedCriteria->getStartDate()->format('Y-m-d H:i:s'));\n $this->assertSame('2025-06-15 23:59:59', $capturedCriteria->getEndDate()->format('Y-m-d H:i:s'));\n } finally {\n CarbonImmutable::setTestNow();\n }\n }\n}","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Execute","depth":4,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Explain Plan","depth":4,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Browse Query History","depth":4,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"View Parameters","depth":4,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Open Query Execution Settings…","depth":4,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"In-Editor Results","depth":4,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Tx: Auto","depth":4,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Cancel Running Statements","depth":4,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Playground","depth":4,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"jiminny","depth":4,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.088194445,"height":0.027777778},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"9","depth":4,"role_description":"text"},{"role":"AXStaticText","text":"12","depth":4,"role_description":"text"},{"role":"AXStaticText","text":"2","depth":4,"role_description":"text"},{"role":"AXStaticText","text":"4","depth":4,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"SELECT a.id, a.uuid, a.actual_start_time, o.id, o.uuid FROM opportunities o\nJOIN activities a ON o.id = a.opportunity_id\nWHERE a.crm_configuration_id = 39\nAND a.actual_start_time > '2025-10-13'\nAND a.type IN ('conference', 'softphone-inbound', 'softphone-outbound')\n;\n\nSELECT * FROM activities\nWHERE crm_configuration_id = 39 and user_id = 143\nand actual_start_time >= '2025-10-13'\nAND type IN ('conference', 'softphone-inbound', 'softphone-outbound')\n;\n\nSELECT * FROM opportunities WHERE account_id IN (178);\nselect * from activities where id IN (620137, 620187, 620188, 620189, 620230);\n\n# HS\nSELECT * FROM opportunities WHERE id IN (238);\nselect * from activities where id IN (477,2076);\n\nselect * from users;\n\nSELECT COUNT(*) FROM users;\nSELECT COUNT(*) FROM activities;\nSELECT COUNT(*) FROM opportunities;\n\nUPDATE activities\nSET\n actual_start_time = '2025-12-19 09:00:00',\n actual_end_time = '2025-12-19 10:30:00',\n scheduled_start_time = '2025-12-19 09:00:00',\n scheduled_end_time = '2025-12-19 10:30:00'\nWHERE id IN (407509,407375);\n\nselect * from partners;\n\nSELECT id, uuid, type, actual_start_time, user_id, crm_configuration_id\nFROM activities\nWHERE user_id = 143\nAND actual_start_time >= '2025-10-13 00:00:00'\nAND actual_start_time <= '2026-01-13 23:59:59'\nORDER BY actual_start_time DESC;\n\nSELECT * FROM activities WHERE uuid_to_bin('78eda160-3086-435f-88a5-bb0c71b6008d') = uuid;\nSELECT * FROM crm_layouts where crm_configuration_id = 39;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 282;\n# lead_id\n# account_id 177\n# contact_id 3969\n# opportunity_id\n# stage_id 203\n\nSELECT * FROM opportunities WHERE opportunities.crm_configuration_id = id = 282;\n\nSELECT * FROM activities where crm_configuration_id = 39 AND type = 'conference'\nAND user_id = 143 and actual_start_time >= '2025-10-13';\n\nSELECT * FROM activities a\n# JOIN opportunities o ON a.opportunity_id = o.id\nWHERE a.crm_configuration_id = 39 AND a.type = 'conference'\nand status = 'completed' and recording_state = 'recorded'\nand a.actual_start_time >= '2025-10-13'\nAND a.user_id = 143\n;\n\nselect * from leads\nwhere crm_configuration_id = 39; # 112 -> ac. 178, 109 => op. 1707\n\nSELECT * FROM activities WHERE id IN (356013,616188,616202,616310,407509,407375,356001,356008);\nSELECT * FROM activities WHERE id IN (356013,616188,616202,616310);\nSELECT * FROM activities WHERE id IN (407509,407375); # leads: 112, 109 | status - 198\nSELECT * FROM activities WHERE id IN (356001, 356008); # contacts:\n\nSELECT * FROM opportunities WHERE id IN (1707);\nSELECT * FROM stages where id IN (204, 198);\nSELECT * FROM opportunities WHERE account_id IN (178);\nSELECT * FROM opportunities WHERE crm_configuration_id = 39 AND created_at > '2025-01-01';\nSELECT * FROM contacts WHERE account_id IN (178); # 4118 Musaibe, 4448 Ceco Personal\n\nSELECT * FROM activities where crm_configuration_id = 39\nAND opportunity_id IS NULL\nAND is_internal = false\nand status = 'completed' and recording_state = 'recorded'\nAND actual_start_time >= '2025-10-13'\nAND (lead_id IS NOT NULL OR contact_id IS NOT NULL OR account_id IS NOT NULL)\n# AND lead_id IN (112, 109)\n;\n\nSELECT * FROM crm_profiles WHERE user_id = 143;\n\nselect * from inboxes; # 212\nselect * from users where id = 143; # 143\nselect * from inbox_email_batches where inbox_id = 212\nand updated_at >= '2026-01-28 00:00:00' order by id desc;\nselect * from inbox_emails where inbox_id = 212\nand batch_id = 95885 order by id desc;\nselect * from email_messages where origin_user_id = 143;\nselect * from activities where user_id = 143 and updated_at >= '2026-01-28 00:00:00';\nselect * from participants where activity_id = 620247;\n\nselect * from crm_profiles where user_id = 143;\n\nSELECT * FROM activities WHERE uuid_to_bin('458cf915-b914-4000-b083-5687b32b2956') = uuid; # 356001\nselect * from transcription where activity_id = 356001; # 6943\nselect * from ai_prompts where transcription_id = 6943;\nSELECT * FROM activity_summary_logs where activity_id = 356001;\n\nSELECT * FROM social_accounts WHERE sociable_id = 143;\n\n# ************************************************************************************\nSELECT * FROM activities WHERE uuid_to_bin('0164a4fb-cb95-454e-9edd-4d804e4999bd') = uuid;\n# 422515 softphone tr. 8100\n\nSELECT * FROM activities WHERE uuid_to_bin('7520add8-8d87-41a5-98e5-fc4edf96f21e') = uuid;\n# 407509 conference tr. 7670 crmId: 00UD1000002J9aTMAS\n\nselect * from ai_prompts where transcription_id IN (8100, 7670);\nselect * from activity_summary_logs where activity_id = 407509;\n\nselect * from sidekick_settings;\nselect * from default_activity_types;\n\nSELECT * FROM contacts WHERE crm_configuration_id = 39 and email = 'm.kogoj@gmx.at';\nSELECT * FROM leads WHERE crm_configuration_id = 39 and email = 'm.kogoj@gmx.at';\n\nSELECT * FROM activity_searches where user_id = 143;\nSELECT * FROM groups where team_id = 1;\n\nselect * from teams where id = 1;\nselect * from groups where team_id = 1; # 1150 - 7e75f8025c22\nselect id, name, group_id, status, deleted_at, email\nfrom users where team_id = 1 order by group_id desc ;\n\nselect * from activity_searches where id in (1977, 1978, 1979);\nselect * from activity_search_filters where activity_search_id IN (1977, 1978, 1979);\nselect * from activity_search_filters where filter = 'group_id' and value = '443f26b8-8512-437e-a9f9-7e75f8025c22'; # 10268, 10272, 10277\nselect * from nudges where activity_search_id IN (1977, 1978, 1979); # 877, 878, 879\n\nINSERT INTO `activity_search_filters`\n(`activity_search_id`, `filter`, `value`) VALUES\n(1977, 'group_id', '443f26b8-8512-437e-a9f9-7e75f8025c22'),\n(1978, 'group_id', '443f26b8-8512-437e-a9f9-7e75f8025c22'),\n(1979, 'group_id', '443f26b8-8512-437e-a9f9-7e75f8025c22')\n;\n\nselect * from crm_configurations where id = 39;\n\nselect * from teams where id = 1;\nselect * from team_features where team_id = 1;\nselect * from features;\n\nSELECT * FROM activity_searches where id = 1982; # 1981\nSELECT * FROM activity_search_filters WHERE activity_search_id = 1982;\n\nSELECT * FROM automated_reports where id = 68;\nSELECT * FROM automated_report_results where id = 275;\n\nSELECT * FROM automated_reports order by id desc;\nSELECT * FROM automated_report_results order by id desc;\nselect * from activity_searches where user_id = 143;\nselect * from ask_anything_prompts;\n\nSELECT * FROM groups WHERE id = 1439;\nSELECT * FROM users WHERE group_id = 1439;\n\nselect * from permissions; # 158\nselect * from roles;\nselect * from permission_role\n\nselect * from teams where id = 1;\nselect * from groups g JOIN playbooks p on g.playbook_id = p.id where g.team_id = 1;\nselect * from groups where id = 28;\nselect * from playbooks where team_id = 1;\nselect * from playbooks where id = 179;\nselect * from playbook_categories where id = 1391;\nselect * from users where id = 143;\nselect * from crm_profiles where user_id = 143;\nselect * from activities where crm_configuration_id = 39 and type = 'conference'\nand crm_provider_id IS NOT NULL ORDER by id desc;\nselect * from activities where id = 422003; # 00UO400000pB6fpMAC\n\nSELECT ar.id, ar.uuid, ar.media_type, ar.status, a.type\nFROM automated_report_results ar\nJOIN automated_reports a ON a.id = ar.report_id\nWHERE a.type = 'ask_jiminny'\nLIMIT 10;\n\n\nselect * from teams where id = 3143;\nselect * from crm_configurations where id = 500;\nselect * from users where name = 'Integration Account'; # 1695\nSELECT * FROM social_accounts WHERE sociable_id = 1695;\n\nselect * from activities where crm_configuration_id = 39\nand status = 'completed' and actual_start_time >= '2025-01-01'","depth":4,"value":"SELECT a.id, a.uuid, a.actual_start_time, o.id, o.uuid FROM opportunities o\nJOIN activities a ON o.id = a.opportunity_id\nWHERE a.crm_configuration_id = 39\nAND a.actual_start_time > '2025-10-13'\nAND a.type IN ('conference', 'softphone-inbound', 'softphone-outbound')\n;\n\nSELECT * FROM activities\nWHERE crm_configuration_id = 39 and user_id = 143\nand actual_start_time >= '2025-10-13'\nAND type IN ('conference', 'softphone-inbound', 'softphone-outbound')\n;\n\nSELECT * FROM opportunities WHERE account_id IN (178);\nselect * from activities where id IN (620137, 620187, 620188, 620189, 620230);\n\n# HS\nSELECT * FROM opportunities WHERE id IN (238);\nselect * from activities where id IN (477,2076);\n\nselect * from users;\n\nSELECT COUNT(*) FROM users;\nSELECT COUNT(*) FROM activities;\nSELECT COUNT(*) FROM opportunities;\n\nUPDATE activities\nSET\n actual_start_time = '2025-12-19 09:00:00',\n actual_end_time = '2025-12-19 10:30:00',\n scheduled_start_time = '2025-12-19 09:00:00',\n scheduled_end_time = '2025-12-19 10:30:00'\nWHERE id IN (407509,407375);\n\nselect * from partners;\n\nSELECT id, uuid, type, actual_start_time, user_id, crm_configuration_id\nFROM activities\nWHERE user_id = 143\nAND actual_start_time >= '2025-10-13 00:00:00'\nAND actual_start_time <= '2026-01-13 23:59:59'\nORDER BY actual_start_time DESC;\n\nSELECT * FROM activities WHERE uuid_to_bin('78eda160-3086-435f-88a5-bb0c71b6008d') = uuid;\nSELECT * FROM crm_layouts where crm_configuration_id = 39;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 282;\n# lead_id\n# account_id 177\n# contact_id 3969\n# opportunity_id\n# stage_id 203\n\nSELECT * FROM opportunities WHERE opportunities.crm_configuration_id = id = 282;\n\nSELECT * FROM activities where crm_configuration_id = 39 AND type = 'conference'\nAND user_id = 143 and actual_start_time >= '2025-10-13';\n\nSELECT * FROM activities a\n# JOIN opportunities o ON a.opportunity_id = o.id\nWHERE a.crm_configuration_id = 39 AND a.type = 'conference'\nand status = 'completed' and recording_state = 'recorded'\nand a.actual_start_time >= '2025-10-13'\nAND a.user_id = 143\n;\n\nselect * from leads\nwhere crm_configuration_id = 39; # 112 -> ac. 178, 109 => op. 1707\n\nSELECT * FROM activities WHERE id IN (356013,616188,616202,616310,407509,407375,356001,356008);\nSELECT * FROM activities WHERE id IN (356013,616188,616202,616310);\nSELECT * FROM activities WHERE id IN (407509,407375); # leads: 112, 109 | status - 198\nSELECT * FROM activities WHERE id IN (356001, 356008); # contacts:\n\nSELECT * FROM opportunities WHERE id IN (1707);\nSELECT * FROM stages where id IN (204, 198);\nSELECT * FROM opportunities WHERE account_id IN (178);\nSELECT * FROM opportunities WHERE crm_configuration_id = 39 AND created_at > '2025-01-01';\nSELECT * FROM contacts WHERE account_id IN (178); # 4118 Musaibe, 4448 Ceco Personal\n\nSELECT * FROM activities where crm_configuration_id = 39\nAND opportunity_id IS NULL\nAND is_internal = false\nand status = 'completed' and recording_state = 'recorded'\nAND actual_start_time >= '2025-10-13'\nAND (lead_id IS NOT NULL OR contact_id IS NOT NULL OR account_id IS NOT NULL)\n# AND lead_id IN (112, 109)\n;\n\nSELECT * FROM crm_profiles WHERE user_id = 143;\n\nselect * from inboxes; # 212\nselect * from users where id = 143; # 143\nselect * from inbox_email_batches where inbox_id = 212\nand updated_at >= '2026-01-28 00:00:00' order by id desc;\nselect * from inbox_emails where inbox_id = 212\nand batch_id = 95885 order by id desc;\nselect * from email_messages where origin_user_id = 143;\nselect * from activities where user_id = 143 and updated_at >= '2026-01-28 00:00:00';\nselect * from participants where activity_id = 620247;\n\nselect * from crm_profiles where user_id = 143;\n\nSELECT * FROM activities WHERE uuid_to_bin('458cf915-b914-4000-b083-5687b32b2956') = uuid; # 356001\nselect * from transcription where activity_id = 356001; # 6943\nselect * from ai_prompts where transcription_id = 6943;\nSELECT * FROM activity_summary_logs where activity_id = 356001;\n\nSELECT * FROM social_accounts WHERE sociable_id = 143;\n\n# ************************************************************************************\nSELECT * FROM activities WHERE uuid_to_bin('0164a4fb-cb95-454e-9edd-4d804e4999bd') = uuid;\n# 422515 softphone tr. 8100\n\nSELECT * FROM activities WHERE uuid_to_bin('7520add8-8d87-41a5-98e5-fc4edf96f21e') = uuid;\n# 407509 conference tr. 7670 crmId: 00UD1000002J9aTMAS\n\nselect * from ai_prompts where transcription_id IN (8100, 7670);\nselect * from activity_summary_logs where activity_id = 407509;\n\nselect * from sidekick_settings;\nselect * from default_activity_types;\n\nSELECT * FROM contacts WHERE crm_configuration_id = 39 and email = 'm.kogoj@gmx.at';\nSELECT * FROM leads WHERE crm_configuration_id = 39 and email = 'm.kogoj@gmx.at';\n\nSELECT * FROM activity_searches where user_id = 143;\nSELECT * FROM groups where team_id = 1;\n\nselect * from teams where id = 1;\nselect * from groups where team_id = 1; # 1150 - 7e75f8025c22\nselect id, name, group_id, status, deleted_at, email\nfrom users where team_id = 1 order by group_id desc ;\n\nselect * from activity_searches where id in (1977, 1978, 1979);\nselect * from activity_search_filters where activity_search_id IN (1977, 1978, 1979);\nselect * from activity_search_filters where filter = 'group_id' and value = '443f26b8-8512-437e-a9f9-7e75f8025c22'; # 10268, 10272, 10277\nselect * from nudges where activity_search_id IN (1977, 1978, 1979); # 877, 878, 879\n\nINSERT INTO `activity_search_filters`\n(`activity_search_id`, `filter`, `value`) VALUES\n(1977, 'group_id', '443f26b8-8512-437e-a9f9-7e75f8025c22'),\n(1978, 'group_id', '443f26b8-8512-437e-a9f9-7e75f8025c22'),\n(1979, 'group_id', '443f26b8-8512-437e-a9f9-7e75f8025c22')\n;\n\nselect * from crm_configurations where id = 39;\n\nselect * from teams where id = 1;\nselect * from team_features where team_id = 1;\nselect * from features;\n\nSELECT * FROM activity_searches where id = 1982; # 1981\nSELECT * FROM activity_search_filters WHERE activity_search_id = 1982;\n\nSELECT * FROM automated_reports where id = 68;\nSELECT * FROM automated_report_results where id = 275;\n\nSELECT * FROM automated_reports order by id desc;\nSELECT * FROM automated_report_results order by id desc;\nselect * from activity_searches where user_id = 143;\nselect * from ask_anything_prompts;\n\nSELECT * FROM groups WHERE id = 1439;\nSELECT * FROM users WHERE group_id = 1439;\n\nselect * from permissions; # 158\nselect * from roles;\nselect * from permission_role\n\nselect * from teams where id = 1;\nselect * from groups g JOIN playbooks p on g.playbook_id = p.id where g.team_id = 1;\nselect * from groups where id = 28;\nselect * from playbooks where team_id = 1;\nselect * from playbooks where id = 179;\nselect * from playbook_categories where id = 1391;\nselect * from users where id = 143;\nselect * from crm_profiles where user_id = 143;\nselect * from activities where crm_configuration_id = 39 and type = 'conference'\nand crm_provider_id IS NOT NULL ORDER by id desc;\nselect * from activities where id = 422003; # 00UO400000pB6fpMAC\n\nSELECT ar.id, ar.uuid, ar.media_type, ar.status, a.type\nFROM automated_report_results ar\nJOIN automated_reports a ON a.id = ar.report_id\nWHERE a.type = 'ask_jiminny'\nLIMIT 10;\n\n\nselect * from teams where id = 3143;\nselect * from crm_configurations where id = 500;\nselect * from users where name = 'Integration Account'; # 1695\nSELECT * FROM social_accounts WHERE sociable_id = 1695;\n\nselect * from activities where crm_configuration_id = 39\nand status = 'completed' and actual_start_time >= '2025-01-01'","role_description":"text entry area","is_enabled":true,"is_focused":true,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Project","depth":3,"role_description":"text"},{"role":"AXButton","text":"Project","depth":3,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"New File or Directory…","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Expand Selected","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Collapse All","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Options","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
-5696139294825716137
|
2146703024167786053
|
visual_change
|
accessibility
|
NULL
|
Project: faVsco.js, menu
#11894 on JY-18909-automa Project: faVsco.js, menu
#11894 on JY-18909-automated-reports-ask-jiminny, menu
Start Listening for PHP Debug Connections
AskJiminnyReportActivityServiceTest
Run 'AskJiminnyReportActivityServiceTest'
Debug 'AskJiminnyReportActivityServiceTest'
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 Carbon\CarbonImmutable;
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\Services\Kiosk\AutomatedReports\AutomatedReportsService;
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);
}
public static function frequencyDateRangeProvider(): array
{
return [
'daily' => [
AutomatedReportsService::FREQUENCY_DAILY,
'2025-06-15 00:00:00',
'2025-06-15 23:59:59',
],
'weekly' => [
AutomatedReportsService::FREQUENCY_WEEKLY,
'2025-06-09 00:00:00',
'2025-06-15 23:59:59',
],
'monthly' => [
AutomatedReportsService::FREQUENCY_MONTHLY,
'2025-05-01 00:00:00',
'2025-05-31 23:59:59',
],
'quarterly' => [
AutomatedReportsService::FREQUENCY_QUARTERLY,
'2025-01-01 00:00:00',
'2025-03-31 23:59:59',
],
];
}
/**
* @dataProvider frequencyDateRangeProvider
*/
public function testGetActivityIdsInjectsDateRangeForFrequency(
string $frequency,
string $expectedStartDate,
string $expectedEndDate,
): void {
CarbonImmutable::setTestNow('2025-06-16 12:00:00');
try {
$user = $this->makeUser();
$savedSearch = $this->makeSavedSearch([]);
$filterSet = $this->createMock(FilterDefinitionCollection::class);
$this->activitySearch->method('getArrayFilterKeys')->willReturn([]);
$this->logger->method('info');
$this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);
$capturedCriteria = null;
$this->activitySearch->expects($this->once())
->method('getOnDemandPageFilterSet')
->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {
$capturedCriteria = $criteria;
return $filterSet;
});
$this->service->getActivityIdsForSavedSearch($savedSearch, $user, $frequency);
$this->assertNotNull($capturedCriteria);
$this->assertSame($expectedStartDate, $capturedCriteria->getStartDate()->format('Y-m-d H:i:s'));
$this->assertSame($expectedEndDate, $capturedCriteria->getEndDate()->format('Y-m-d H:i:s'));
} finally {
CarbonImmutable::setTestNow();
}
}
public function testGetActivityIdsWithNullFrequencyDoesNotInjectDates(): void
{
$user = $this->makeUser();
$savedSearch = $this->makeSavedSearch([]);
$filterSet = $this->createMock(FilterDefinitionCollection::class);
$this->activitySearch->method('getArrayFilterKeys')->willReturn([]);
$this->logger->method('info');
$this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);
$capturedCriteria = null;
$this->activitySearch->expects($this->once())
->method('getOnDemandPageFilterSet')
->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {
$capturedCriteria = $criteria;
return $filterSet;
});
$this->service->getActivityIdsForSavedSearch($savedSearch, $user, null);
$this->assertNotNull($capturedCriteria);
$this->assertNull($capturedCriteria->getStartDate());
$this->assertNull($capturedCriteria->getEndDate());
}
public function testGetActivityIdsWithUnknownFrequencyDoesNotInjectDates(): void
{
$user = $this->makeUser();
$savedSearch = $this->makeSavedSearch([]);
$filterSet = $this->createMock(FilterDefinitionCollection::class);
$this->activitySearch->method('getArrayFilterKeys')->willReturn([]);
$this->logger->method('info');
$this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);
$capturedCriteria = null;
$this->activitySearch->expects($this->once())
->method('getOnDemandPageFilterSet')
->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {
$capturedCriteria = $criteria;
return $filterSet;
});
$this->service->getActivityIdsForSavedSearch($savedSearch, $user, AutomatedReportsService::FREQUENCY_ONE_OFF);
$this->assertNotNull($capturedCriteria);
$this->assertNull($capturedCriteria->getStartDate());
$this->assertNull($capturedCriteria->getEndDate());
}
public function testGetActivityIdsFrequencyDateRangeOverridesSavedSearchDateFilters(): void
{
CarbonImmutable::setTestNow('2025-06-16 12:00:00');
try {
$user = $this->makeUser();
$startDateFilter = $this->makeFilter(ActivityActualDate::PARAM_START_DATE, '2024-01-01 00:00:00');
$endDateFilter = $this->makeFilter(ActivityActualDate::PARAM_END_DATE, '2024-12-31 23:59:59');
$savedSearch = $this->makeSavedSearch([$startDateFilter, $endDateFilter]);
$filterSet = $this->createMock(FilterDefinitionCollection::class);
$this->activitySearch->method('getArrayFilterKeys')->willReturn([]);
$this->logger->method('info');
$this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);
$capturedCriteria = null;
$this->activitySearch->expects($this->once())
->method('getOnDemandPageFilterSet')
->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {
$capturedCriteria = $criteria;
return $filterSet;
});
$this->service->getActivityIdsForSavedSearch($savedSearch, $user, AutomatedReportsService::FREQUENCY_DAILY);
$this->assertNotNull($capturedCriteria);
$this->assertSame('2025-06-15 00:00:00', $capturedCriteria->getStartDate()->format('Y-m-d H:i:s'));
$this->assertSame('2025-06-15 23:59:59', $capturedCriteria->getEndDate()->format('Y-m-d H:i:s'));
} finally {
CarbonImmutable::setTestNow();
}
}
}
Execute
Explain Plan
Browse Query History
View Parameters
Open Query Execution Settings…
In-Editor Results
Tx: Auto
Cancel Running Statements
Playground
jiminny
Code changed:
Hide
Sync Changes
Hide This Notification
9
12
2
4
Previous Highlighted Error
Next Highlighted Error
SELECT a.id, a.uuid, a.actual_start_time, o.id, o.uuid FROM opportunities o
JOIN activities a ON o.id = a.opportunity_id
WHERE a.crm_configuration_id = 39
AND a.actual_start_time > '2025-10-13'
AND a.type IN ('conference', 'softphone-inbound', 'softphone-outbound')
;
SELECT * FROM activities
WHERE crm_configuration_id = 39 and user_id = 143
and actual_start_time >= '2025-10-13'
AND type IN ('conference', 'softphone-inbound', 'softphone-outbound')
;
SELECT * FROM opportunities WHERE account_id IN (178);
select * from activities where id IN (620137, 620187, 620188, 620189, 620230);
# HS
SELECT * FROM opportunities WHERE id IN (238);
select * from activities where id IN (477,2076);
select * from users;
SELECT COUNT(*) FROM users;
SELECT COUNT(*) FROM activities;
SELECT COUNT(*) FROM opportunities;
UPDATE activities
SET
actual_start_time = '2025-12-19 09:00:00',
actual_end_time = '2025-12-19 10:30:00',
scheduled_start_time = '2025-12-19 09:00:00',
scheduled_end_time = '2025-12-19 10:30:00'
WHERE id IN (407509,407375);
select * from partners;
SELECT id, uuid, type, actual_start_time, user_id, crm_configuration_id
FROM activities
WHERE user_id = 143
AND actual_start_time >= '2025-10-13 00:00:00'
AND actual_start_time <= '2026-01-13 23:59:59'
ORDER BY actual_start_time DESC;
SELECT * FROM activities WHERE uuid_to_bin('78eda160-3086-435f-88a5-bb0c71b6008d') = uuid;
SELECT * FROM crm_layouts where crm_configuration_id = 39;
SELECT * FROM crm_layout_entities WHERE crm_layout_id = 282;
# lead_id
# account_id 177
# contact_id 3969
# opportunity_id
# stage_id 203
SELECT * FROM opportunities WHERE opportunities.crm_configuration_id = id = 282;
SELECT * FROM activities where crm_configuration_id = 39 AND type = 'conference'
AND user_id = 143 and actual_start_time >= '2025-10-13';
SELECT * FROM activities a
# JOIN opportunities o ON a.opportunity_id = o.id
WHERE a.crm_configuration_id = 39 AND a.type = 'conference'
and status = 'completed' and recording_state = 'recorded'
and a.actual_start_time >= '2025-10-13'
AND a.user_id = 143
;
select * from leads
where crm_configuration_id = 39; # 112 -> ac. 178, 109 => op. 1707
SELECT * FROM activities WHERE id IN (356013,616188,616202,616310,407509,407375,356001,356008);
SELECT * FROM activities WHERE id IN (356013,616188,616202,616310);
SELECT * FROM activities WHERE id IN (407509,407375); # leads: 112, 109 | status - 198
SELECT * FROM activities WHERE id IN (356001, 356008); # contacts:
SELECT * FROM opportunities WHERE id IN (1707);
SELECT * FROM stages where id IN (204, 198);
SELECT * FROM opportunities WHERE account_id IN (178);
SELECT * FROM opportunities WHERE crm_configuration_id = 39 AND created_at > '2025-01-01';
SELECT * FROM contacts WHERE account_id IN (178); # 4118 Musaibe, 4448 Ceco Personal
SELECT * FROM activities where crm_configuration_id = 39
AND opportunity_id IS NULL
AND is_internal = false
and status = 'completed' and recording_state = 'recorded'
AND actual_start_time >= '2025-10-13'
AND (lead_id IS NOT NULL OR contact_id IS NOT NULL OR account_id IS NOT NULL)
# AND lead_id IN (112, 109)
;
SELECT * FROM crm_profiles WHERE user_id = 143;
select * from inboxes; # 212
select * from users where id = 143; # 143
select * from inbox_email_batches where inbox_id = 212
and updated_at >= '2026-01-28 00:00:00' order by id desc;
select * from inbox_emails where inbox_id = 212
and batch_id = 95885 order by id desc;
select * from email_messages where origin_user_id = 143;
select * from activities where user_id = 143 and updated_at >= '2026-01-28 00:00:00';
select * from participants where activity_id = 620247;
select * from crm_profiles where user_id = 143;
SELECT * FROM activities WHERE uuid_to_bin('458cf915-b914-4000-b083-5687b32b2956') = uuid; # 356001
select * from transcription where activity_id = 356001; # 6943
select * from ai_prompts where transcription_id = 6943;
SELECT * FROM activity_summary_logs where activity_id = 356001;
SELECT * FROM social_accounts WHERE sociable_id = 143;
# [PASSWORD_DOTS]
SELECT * FROM activities WHERE uuid_to_bin('0164a4fb-cb95-454e-9edd-4d804e4999bd') = uuid;
# 422515 softphone tr. 8100
SELECT * FROM activities WHERE uuid_to_bin('7520add8-8d87-41a5-98e5-fc4edf96f21e') = uuid;
# 407509 conference tr. 7670 crmId: 00UD1000002J9aTMAS
select * from ai_prompts where transcription_id IN (8100, 7670);
select * from activity_summary_logs where activity_id = 407509;
select * from sidekick_settings;
select * from default_activity_types;
SELECT * FROM contacts WHERE crm_configuration_id = 39 and email = '[EMAIL]';
SELECT * FROM leads WHERE crm_configuration_id = 39 and email = '[EMAIL]';
SELECT * FROM activity_searches where user_id = 143;
SELECT * FROM groups where team_id = 1;
select * from teams where id = 1;
select * from groups where team_id = 1; # 1150 - 7e75f8025c22
select id, name, group_id, status, deleted_at, email
from users where team_id = 1 order by group_id desc ;
select * from activity_searches where id in (1977, 1978, 1979);
select * from activity_search_filters where activity_search_id IN (1977, 1978, 1979);
select * from activity_search_filters where filter = 'group_id' and value = '443f26b8-8512-437e-a9f9-7e75f8025c22'; # 10268, 10272, 10277
select * from nudges where activity_search_id IN (1977, 1978, 1979); # 877, 878, 879
INSERT INTO `activity_search_filters`
(`activity_search_id`, `filter`, `value`) VALUES
(1977, 'group_id', '443f26b8-8512-437e-a9f9-7e75f8025c22'),
(1978, 'group_id', '443f26b8-8512-437e-a9f9-7e75f8025c22'),
(1979, 'group_id', '443f26b8-8512-437e-a9f9-7e75f8025c22')
;
select * from crm_configurations where id = 39;
select * from teams where id = 1;
select * from team_features where team_id = 1;
select * from features;
SELECT * FROM activity_searches where id = 1982; # 1981
SELECT * FROM activity_search_filters WHERE activity_search_id = 1982;
SELECT * FROM automated_reports where id = 68;
SELECT * FROM automated_report_results where id = 275;
SELECT * FROM automated_reports order by id desc;
SELECT * FROM automated_report_results order by id desc;
select * from activity_searches where user_id = 143;
select * from ask_anything_prompts;
SELECT * FROM groups WHERE id = 1439;
SELECT * FROM users WHERE group_id = 1439;
select * from permissions; # 158
select * from roles;
select * from permission_role
select * from teams where id = 1;
select * from groups g JOIN playbooks p on g.playbook_id = p.id where g.team_id = 1;
select * from groups where id = 28;
select * from playbooks where team_id = 1;
select * from playbooks where id = 179;
select * from playbook_categories where id = 1391;
select * from users where id = 143;
select * from crm_profiles where user_id = 143;
select * from activities where crm_configuration_id = 39 and type = 'conference'
and crm_provider_id IS NOT NULL ORDER by id desc;
select * from activities where id = 422003; # 00UO400000pB6fpMAC
SELECT ar.id, ar.uuid, ar.media_type, ar.status, a.type
FROM automated_report_results ar
JOIN automated_reports a ON a.id = ar.report_id
WHERE a.type = 'ask_jiminny'
LIMIT 10;
select * from teams where id = 3143;
select * from crm_configurations where id = 500;
select * from users where name = 'Integration Account'; # 1695
SELECT * FROM social_accounts WHERE sociable_id = 1695;
select * from activities where crm_configuration_id = 39
and status = 'completed' and actual_start_time >= '2025-01-01'
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide...
|
54642
|
|
54644
|
NULL
|
0
|
2026-04-20T09:12:02.176027+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-20/1776 /Users/lukas/.screenpipe/data/data/2026-04-20/1776676322176_m2.jpg...
|
PhpStorm
|
faVsco.js – SF [jiminny@localhost]
|
True
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
#11894 on JY-18909-automa Project: faVsco.js, menu
#11894 on JY-18909-automated-reports-ask-jiminny, menu
Start Listening for PHP Debug Connections
AskJiminnyReportActivityServiceTest
Run 'AskJiminnyReportActivityServiceTest'
Debug 'AskJiminnyReportActivityServiceTest'
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 Carbon\CarbonImmutable;
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\Services\Kiosk\AutomatedReports\AutomatedReportsService;
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);
}
public static function frequencyDateRangeProvider(): array
{
return [
'daily' => [
AutomatedReportsService::FREQUENCY_DAILY,
'2025-06-15 00:00:00',
'2025-06-15 23:59:59',
],
'weekly' => [
AutomatedReportsService::FREQUENCY_WEEKLY,
'2025-06-09 00:00:00',
'2025-06-15 23:59:59',
],
'monthly' => [
AutomatedReportsService::FREQUENCY_MONTHLY,
'2025-05-01 00:00:00',
'2025-05-31 23:59:59',
],
'quarterly' => [
AutomatedReportsService::FREQUENCY_QUARTERLY,
'2025-01-01 00:00:00',
'2025-03-31 23:59:59',
],
];
}
/**
* @dataProvider frequencyDateRangeProvider
*/
public function testGetActivityIdsInjectsDateRangeForFrequency(
string $frequency,
string $expectedStartDate,
string $expectedEndDate,
): void {
CarbonImmutable::setTestNow('2025-06-16 12:00:00');
try {
$user = $this->makeUser();
$savedSearch = $this->makeSavedSearch([]);
$filterSet = $this->createMock(FilterDefinitionCollection::class);
$this->activitySearch->method('getArrayFilterKeys')->willReturn([]);
$this->logger->method('info');
$this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);
$capturedCriteria = null;
$this->activitySearch->expects($this->once())
->method('getOnDemandPageFilterSet')
->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {
$capturedCriteria = $criteria;
return $filterSet;
});
$this->service->getActivityIdsForSavedSearch($savedSearch, $user, $frequency);
$this->assertNotNull($capturedCriteria);
$this->assertSame($expectedStartDate, $capturedCriteria->getStartDate()->format('Y-m-d H:i:s'));
$this->assertSame($expectedEndDate, $capturedCriteria->getEndDate()->format('Y-m-d H:i:s'));
} finally {
CarbonImmutable::setTestNow();
}
}
public function testGetActivityIdsWithNullFrequencyDoesNotInjectDates(): void
{
$user = $this->makeUser();
$savedSearch = $this->makeSavedSearch([]);
$filterSet = $this->createMock(FilterDefinitionCollection::class);
$this->activitySearch->method('getArrayFilterKeys')->willReturn([]);
$this->logger->method('info');
$this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);
$capturedCriteria = null;
$this->activitySearch->expects($this->once())
->method('getOnDemandPageFilterSet')
->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {
$capturedCriteria = $criteria;
return $filterSet;
});
$this->service->getActivityIdsForSavedSearch($savedSearch, $user, null);
$this->assertNotNull($capturedCriteria);
$this->assertNull($capturedCriteria->getStartDate());
$this->assertNull($capturedCriteria->getEndDate());
}
public function testGetActivityIdsWithUnknownFrequencyDoesNotInjectDates(): void
{
$user = $this->makeUser();
$savedSearch = $this->makeSavedSearch([]);
$filterSet = $this->createMock(FilterDefinitionCollection::class);
$this->activitySearch->method('getArrayFilterKeys')->willReturn([]);
$this->logger->method('info');
$this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);
$capturedCriteria = null;
$this->activitySearch->expects($this->once())
->method('getOnDemandPageFilterSet')
->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {
$capturedCriteria = $criteria;
return $filterSet;
});
$this->service->getActivityIdsForSavedSearch($savedSearch, $user, AutomatedReportsService::FREQUENCY_ONE_OFF);
$this->assertNotNull($capturedCriteria);
$this->assertNull($capturedCriteria->getStartDate());
$this->assertNull($capturedCriteria->getEndDate());
}
public function testGetActivityIdsFrequencyDateRangeOverridesSavedSearchDateFilters(): void
{
CarbonImmutable::setTestNow('2025-06-16 12:00:00');
try {
$user = $this->makeUser();
$startDateFilter = $this->makeFilter(ActivityActualDate::PARAM_START_DATE, '2024-01-01 00:00:00');
$endDateFilter = $this->makeFilter(ActivityActualDate::PARAM_END_DATE, '2024-12-31 23:59:59');
$savedSearch = $this->makeSavedSearch([$startDateFilter, $endDateFilter]);
$filterSet = $this->createMock(FilterDefinitionCollection::class);
$this->activitySearch->method('getArrayFilterKeys')->willReturn([]);
$this->logger->method('info');
$this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);
$capturedCriteria = null;
$this->activitySearch->expects($this->once())
->method('getOnDemandPageFilterSet')
->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {
$capturedCriteria = $criteria;
return $filterSet;
});
$this->service->getActivityIdsForSavedSearch($savedSearch, $user, AutomatedReportsService::FREQUENCY_DAILY);
$this->assertNotNull($capturedCriteria);
$this->assertSame('2025-06-15 00:00:00', $capturedCriteria->getStartDate()->format('Y-m-d H:i:s'));
$this->assertSame('2025-06-15 23:59:59', $capturedCriteria->getEndDate()->format('Y-m-d H:i:s'));
} finally {
CarbonImmutable::setTestNow();
}
}
}
Execute
Explain Plan
Browse Query History
View Parameters
Open Query Execution Settings…
In-Editor Results
Tx: Auto
Cancel Running Statements
Playground
jiminny
Code changed:
Hide
Sync Changes
Hide This Notification
9
12
2
4
Previous Highlighted Error
Next Highlighted Error
SELECT a.id, a.uuid, a.actual_start_time, o.id, o.uuid FROM opportunities o
JOIN activities a ON o.id = a.opportunity_id
WHERE a.crm_configuration_id = 39
AND a.actual_start_time > '2025-10-13'
AND a.type IN ('conference', 'softphone-inbound', 'softphone-outbound')
;
SELECT * FROM activities
WHERE crm_configuration_id = 39 and user_id = 143
and actual_start_time >= '2025-10-13'
AND type IN ('conference', 'softphone-inbound', 'softphone-outbound')
;
SELECT * FROM opportunities WHERE account_id IN (178);
select * from activities where id IN (620137, 620187, 620188, 620189, 620230);
# HS
SELECT * FROM opportunities WHERE id IN (238);
select * from activities where id IN (477,2076);
select * from users;
SELECT COUNT(*) FROM users;
SELECT COUNT(*) FROM activities;
SELECT COUNT(*) FROM opportunities;
UPDATE activities
SET
actual_start_time = '2025-12-19 09:00:00',
actual_end_time = '2025-12-19 10:30:00',
scheduled_start_time = '2025-12-19 09:00:00',
scheduled_end_time = '2025-12-19 10:30:00'
WHERE id IN (407509,407375);
select * from partners;
SELECT id, uuid, type, actual_start_time, user_id, crm_configuration_id
FROM activities
WHERE user_id = 143
AND actual_start_time >= '2025-10-13 00:00:00'
AND actual_start_time <= '2026-01-13 23:59:59'
ORDER BY actual_start_time DESC;
SELECT * FROM activities WHERE uuid_to_bin('78eda160-3086-435f-88a5-bb0c71b6008d') = uuid;
SELECT * FROM crm_layouts where crm_configuration_id = 39;
SELECT * FROM crm_layout_entities WHERE crm_layout_id = 282;
# lead_id
# account_id 177
# contact_id 3969
# opportunity_id
# stage_id 203
SELECT * FROM opportunities WHERE opportunities.crm_configuration_id = id = 282;
SELECT * FROM activities where crm_configuration_id = 39 AND type = 'conference'
AND user_id = 143 and actual_start_time >= '2025-10-13';
SELECT * FROM activities a
# JOIN opportunities o ON a.opportunity_id = o.id
WHERE a.crm_configuration_id = 39 AND a.type = 'conference'
and status = 'completed' and recording_state = 'recorded'
and a.actual_start_time >= '2025-10-13'
AND a.user_id = 143
;
select * from leads
where crm_configuration_id = 39; # 112 -> ac. 178, 109 => op. 1707
SELECT * FROM activities WHERE id IN (356013,616188,616202,616310,407509,407375,356001,356008);
SELECT * FROM activities WHERE id IN (356013,616188,616202,616310);
SELECT * FROM activities WHERE id IN (407509,407375); # leads: 112, 109 | status - 198
SELECT * FROM activities WHERE id IN (356001, 356008); # contacts:
SELECT * FROM opportunities WHERE id IN (1707);
SELECT * FROM stages where id IN (204, 198);
SELECT * FROM opportunities WHERE account_id IN (178);
SELECT * FROM opportunities WHERE crm_configuration_id = 39 AND created_at > '2025-01-01';
SELECT * FROM contacts WHERE account_id IN (178); # 4118 Musaibe, 4448 Ceco Personal
SELECT * FROM activities where crm_configuration_id = 39
AND opportunity_id IS NULL
AND is_internal = false
and status = 'completed' and recording_state = 'recorded'
AND actual_start_time >= '2025-10-13'
AND (lead_id IS NOT NULL OR contact_id IS NOT NULL OR account_id IS NOT NULL)
# AND lead_id IN (112, 109)
;
SELECT * FROM crm_profiles WHERE user_id = 143;
select * from inboxes; # 212
select * from users where id = 143; # 143
select * from inbox_email_batches where inbox_id = 212
and updated_at >= '2026-01-28 00:00:00' order by id desc;
select * from inbox_emails where inbox_id = 212
and batch_id = 95885 order by id desc;
select * from email_messages where origin_user_id = 143;
select * from activities where user_id = 143 and updated_at >= '2026-01-28 00:00:00';
select * from participants where activity_id = 620247;
select * from crm_profiles where user_id = 143;
SELECT * FROM activities WHERE uuid_to_bin('458cf915-b914-4000-b083-5687b32b2956') = uuid; # 356001
select * from transcription where activity_id = 356001; # 6943
select * from ai_prompts where transcription_id = 6943;
SELECT * FROM activity_summary_logs where activity_id = 356001;
SELECT * FROM social_accounts WHERE sociable_id = 143;
# [PASSWORD_DOTS]
SELECT * FROM activities WHERE uuid_to_bin('0164a4fb-cb95-454e-9edd-4d804e4999bd') = uuid;
# 422515 softphone tr. 8100
SELECT * FROM activities WHERE uuid_to_bin('7520add8-8d87-41a5-98e5-fc4edf96f21e') = uuid;
# 407509 conference tr. 7670 crmId: 00UD1000002J9aTMAS
select * from ai_prompts where transcription_id IN (8100, 7670);
select * from activity_summary_logs where activity_id = 407509;
select * from sidekick_settings;
select * from default_activity_types;
SELECT * FROM contacts WHERE crm_configuration_id = 39 and email = '[EMAIL]';
SELECT * FROM leads WHERE crm_configuration_id = 39 and email = '[EMAIL]';
SELECT * FROM activity_searches where user_id = 143;
SELECT * FROM groups where team_id = 1;
select * from teams where id = 1;
select * from groups where team_id = 1; # 1150 - 7e75f8025c22
select id, name, group_id, status, deleted_at, email
from users where team_id = 1 order by group_id desc ;
select * from activity_searches where id in (1977, 1978, 1979);
select * from activity_search_filters where activity_search_id IN (1977, 1978, 1979);
select * from activity_search_filters where filter = 'group_id' and value = '443f26b8-8512-437e-a9f9-7e75f8025c22'; # 10268, 10272, 10277
select * from nudges where activity_search_id IN (1977, 1978, 1979); # 877, 878, 879
INSERT INTO `activity_search_filters`
(`activity_search_id`, `filter`, `value`) VALUES
(1977, 'group_id', '443f26b8-8512-437e-a9f9-7e75f8025c22'),
(1978, 'group_id', '443f26b8-8512-437e-a9f9-7e75f8025c22'),
(1979, 'group_id', '443f26b8-8512-437e-a9f9-7e75f8025c22')
;
select * from crm_configurations where id = 39;
select * from teams where id = 1;
select * from team_features where team_id = 1;
select * from features;
SELECT * FROM activity_searches where id = 1982; # 1981
SELECT * FROM activity_search_filters WHERE activity_search_id = 1982;
SELECT * FROM automated_reports where id = 68;
SELECT * FROM automated_report_results where id = 275;
SELECT * FROM automated_reports order by id desc;
SELECT * FROM automated_report_results order by id desc;
select * from activity_searches where user_id = 143;
select * from ask_anything_prompts;
SELECT * FROM groups WHERE id = 1439;
SELECT * FROM users WHERE group_id = 1439;
select * from permissions; # 158
select * from roles;
select * from permission_role
select * from teams where id = 1;
select * from groups g JOIN playbooks p on g.playbook_id = p.id where g.team_id = 1;
select * from groups where id = 28;
select * from playbooks where team_id = 1;
select * from playbooks where id = 179;
select * from playbook_categories where id = 1391;
select * from users where id = 143;
select * from crm_profiles where user_id = 143;
select * from activities where crm_configuration_id = 39 and type = 'conference'
and crm_provider_id IS NOT NULL ORDER by id desc;
select * from activities where id = 422003; # 00UO400000pB6fpMAC
SELECT ar.id, ar.uuid, ar.media_type, ar.status, a.type
FROM automated_report_results ar
JOIN automated_reports a ON a.id = ar.report_id
WHERE a.type = 'ask_jiminny'
LIMIT 10;
select * from teams where id = 3143;
select * from crm_configurations where id = 500;
select * from users where name = 'Integration Account'; # 1695
SELECT * FROM social_accounts WHERE sociable_id = 1695;
select * from activities where crm_configuration_id = 39
and status = 'completed' and actual_start_time >= '2025-01-01'
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"bounds":{"left":0.025930852,"top":0.019952115,"width":0.03856383,"height":0.025538707},"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"#11894 on JY-18909-automated-reports-ask-jiminny, menu","depth":5,"bounds":{"left":0.064494684,"top":0.019952115,"width":0.12134308,"height":0.025538707},"help_text":"Pull request #11894 exists for current branch JY-18909-automated-reports-ask-jiminny","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"bounds":{"left":0.8081782,"top":0.019952115,"width":0.011303191,"height":0.025538707},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"AskJiminnyReportActivityServiceTest","depth":6,"bounds":{"left":0.8234708,"top":0.019952115,"width":0.09208777,"height":0.025538707},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run 'AskJiminnyReportActivityServiceTest'","depth":6,"bounds":{"left":0.9155585,"top":0.019952115,"width":0.011303191,"height":0.025538707},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'AskJiminnyReportActivityServiceTest'","depth":6,"bounds":{"left":0.9268617,"top":0.019952115,"width":0.011303191,"height":0.025538707},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"More Actions","depth":6,"bounds":{"left":0.9381649,"top":0.019952115,"width":0.011303191,"height":0.025538707},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JetBrains AI","depth":5,"bounds":{"left":0.96609044,"top":0.019952115,"width":0.011303191,"height":0.025538707},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Search Everywhere","depth":5,"bounds":{"left":0.9773936,"top":0.019952115,"width":0.011303191,"height":0.025538707},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"IDE and Project Settings","depth":5,"bounds":{"left":0.9886968,"top":0.019952115,"width":0.011303186,"height":0.025538707},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.042220745,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"2","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.007978723,"height":0.0},"role_description":"text"},{"role":"AXStaticText","text":"3","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.007978723,"height":0.0},"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.00731383,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.006981383,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Tests\\Unit\\Services\\Kiosk\\AutomatedReports;\n\nuse Carbon\\CarbonImmutable;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinition\\ActivityActualDate;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinition\\ActivityUpdatedDate;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinition\\DealInsights\\ClosingPeriodFilter;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinitionCollection;\nuse Jiminny\\Component\\ActivitySearch\\Service\\ActivitySearch;\nuse Jiminny\\Models\\Activity\\Search;\nuse Jiminny\\Models\\Activity\\SearchFilter;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Repositories\\ElasticActivityRepository;\nuse Jiminny\\Services\\Kiosk\\AutomatedReports\\AskJiminnyReportActivityService;\nuse Jiminny\\Services\\Kiosk\\AutomatedReports\\AutomatedReportsService;\nuse Jiminny\\VO\\Repository\\OnDemandActivitySearch\\Criteria;\nuse PHPUnit\\Framework\\MockObject\\MockObject;\nuse PHPUnit\\Framework\\TestCase;\nuse Psr\\Log\\LoggerInterface;\n\nclass AskJiminnyReportActivityServiceTest extends TestCase\n{\n private ActivitySearch&MockObject $activitySearch;\n private ElasticActivityRepository&MockObject $elasticRepository;\n private LoggerInterface&MockObject $logger;\n private AskJiminnyReportActivityService $service;\n\n protected function setUp(): void\n {\n $this->activitySearch = $this->createMock(ActivitySearch::class);\n $this->elasticRepository = $this->createMock(ElasticActivityRepository::class);\n $this->logger = $this->createMock(LoggerInterface::class);\n\n $this->service = new AskJiminnyReportActivityService(\n $this->activitySearch,\n $this->elasticRepository,\n $this->logger,\n );\n }\n\n private function makeFilter(string $key, ?string $value): SearchFilter&MockObject\n {\n $filter = $this->createMock(SearchFilter::class);\n $filter->method('getFilterProperty')->willReturn($key);\n $filter->method('getFilterValue')->willReturn($value);\n\n return $filter;\n }\n\n private function makeUser(): User&MockObject\n {\n $tz = new \\DateTimeZone('UTC');\n $user = $this->createMock(User::class);\n $user->method('getTimezone')->willReturn($tz);\n $user->method('getId')->willReturn(1);\n $user->method('getUuid')->willReturn('user-uuid');\n\n return $user;\n }\n\n private function makeSavedSearch(array $filters): Search&MockObject\n {\n $savedSearch = $this->createMock(Search::class);\n $savedSearch->method('getId')->willReturn(42);\n $savedSearch->method('getFilters')->willReturn(new \\Illuminate\\Support\\LazyCollection($filters));\n\n return $savedSearch;\n }\n\n public function testGetActivityIdsForSavedSearchReturnsIds(): void\n {\n $user = $this->makeUser();\n $savedSearch = $this->makeSavedSearch([]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->expects($this->once())\n ->method('getArrayFilterKeys')\n ->with($user)\n ->willReturn([]);\n\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturn($filterSet);\n\n $this->elasticRepository->expects($this->once())\n ->method('onDemandSearchIdsOnly')\n ->willReturn(['id-1', 'id-2', 'id-3']);\n\n $this->logger->expects($this->once())\n ->method('info')\n ->with('[AskJiminnyReport] Fetched activity IDs for saved search');\n\n $result = $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertEquals(['id-1', 'id-2', 'id-3'], $result);\n }\n\n public function testGetActivityIdsForSavedSearchReturnsEmptyWhenNoResults(): void\n {\n $user = $this->makeUser();\n $savedSearch = $this->makeSavedSearch([]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->activitySearch->method('getOnDemandPageFilterSet')->willReturn($filterSet);\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);\n\n $this->logger->expects($this->once())->method('info');\n\n $result = $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertEmpty($result);\n }\n\n public function testGetActivityIdsFiltersOutDateFilters(): void\n {\n $user = $this->makeUser();\n\n $nonDateFilter = $this->makeFilter('owner_id', '123');\n $startDateFilter = $this->makeFilter(ActivityActualDate::PARAM_START_DATE, '2025-01-01 00:00:00');\n $endDateFilter = $this->makeFilter(ActivityActualDate::PARAM_END_DATE, '2025-01-31 23:59:59');\n $updatedFromFilter = $this->makeFilter(ActivityUpdatedDate::PARAM_UPDATED_FROM, '2025-01-01 00:00:00');\n $updatedToFilter = $this->makeFilter(ActivityUpdatedDate::PARAM_UPDATED_TO, '2025-01-31 23:59:59');\n\n $savedSearch = $this->makeSavedSearch([\n $nonDateFilter,\n $startDateFilter,\n $endDateFilter,\n $updatedFromFilter,\n $updatedToFilter,\n ]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n\n $capturedCriteria = null;\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {\n $capturedCriteria = $criteria;\n\n return $filterSet;\n });\n\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);\n $this->logger->method('info');\n\n $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertNotNull($capturedCriteria);\n }\n\n public function testGetActivityIdsFiltersOutClosingPeriodDateFilters(): void\n {\n $user = $this->makeUser();\n\n $closingStartFilter = $this->makeFilter(ClosingPeriodFilter::KEY_START_DATE, '2025-01-01');\n $closingEndFilter = $this->makeFilter(ClosingPeriodFilter::KEY_END_DATE, '2025-03-31');\n $regularFilter = $this->makeFilter('rep_id', '99');\n\n $savedSearch = $this->makeSavedSearch([\n $closingStartFilter,\n $closingEndFilter,\n $regularFilter,\n ]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturn($filterSet);\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn(['id-1']);\n $this->logger->method('info');\n\n $result = $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertEquals(['id-1'], $result);\n }\n\n public function testGetActivityIdsHandlesArrayFilters(): void\n {\n $user = $this->makeUser();\n\n $filter1 = $this->makeFilter('outcome', 'positive');\n $filter2 = $this->makeFilter('outcome', 'negative');\n\n $savedSearch = $this->makeSavedSearch([$filter1, $filter2]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn(['outcome']);\n $this->activitySearch->method('getOnDemandPageFilterSet')->willReturn($filterSet);\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn(['id-1']);\n $this->logger->method('info');\n\n $result = $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertEquals(['id-1'], $result);\n }\n\n public function testGetActivityIdsHandlesScalarFilters(): void\n {\n $user = $this->makeUser();\n\n $filter = $this->makeFilter('direction', 'inbound');\n $savedSearch = $this->makeSavedSearch([$filter]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->activitySearch->method('getOnDemandPageFilterSet')->willReturn($filterSet);\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn(['id-5']);\n $this->logger->method('info');\n\n $result = $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertEquals(['id-5'], $result);\n }\n\n public function testGetActivityIdsPassesNonZeroSequenceNumberToDisableFirstRequestDefaults(): void\n {\n $user = $this->makeUser();\n $savedSearch = $this->makeSavedSearch([]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n\n $capturedCriteria = null;\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {\n $capturedCriteria = $criteria;\n\n return $filterSet;\n });\n\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);\n $this->logger->method('info');\n\n $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertNotNull($capturedCriteria);\n $this->assertFalse($capturedCriteria->isFirstRequest());\n }\n\n public function testGetActivityIdsLogsWithCorrectContext(): void\n {\n $user = $this->makeUser();\n $savedSearch = $this->makeSavedSearch([]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->activitySearch->method('getOnDemandPageFilterSet')->willReturn($filterSet);\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn(['a', 'b']);\n\n $this->logger->expects($this->once())\n ->method('info')\n ->with(\n '[AskJiminnyReport] Fetched activity IDs for saved search',\n $this->callback(fn ($context) => $context['saved_search_id'] === 42\n && $context['user_id'] === 1\n && $context['activity_count'] === 2)\n );\n\n $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n }\n\n public static function frequencyDateRangeProvider(): array\n {\n return [\n 'daily' => [\n AutomatedReportsService::FREQUENCY_DAILY,\n '2025-06-15 00:00:00',\n '2025-06-15 23:59:59',\n ],\n 'weekly' => [\n AutomatedReportsService::FREQUENCY_WEEKLY,\n '2025-06-09 00:00:00',\n '2025-06-15 23:59:59',\n ],\n 'monthly' => [\n AutomatedReportsService::FREQUENCY_MONTHLY,\n '2025-05-01 00:00:00',\n '2025-05-31 23:59:59',\n ],\n 'quarterly' => [\n AutomatedReportsService::FREQUENCY_QUARTERLY,\n '2025-01-01 00:00:00',\n '2025-03-31 23:59:59',\n ],\n ];\n }\n\n /**\n * @dataProvider frequencyDateRangeProvider\n */\n public function testGetActivityIdsInjectsDateRangeForFrequency(\n string $frequency,\n string $expectedStartDate,\n string $expectedEndDate,\n ): void {\n CarbonImmutable::setTestNow('2025-06-16 12:00:00');\n\n try {\n $user = $this->makeUser();\n $savedSearch = $this->makeSavedSearch([]);\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->logger->method('info');\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);\n\n $capturedCriteria = null;\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {\n $capturedCriteria = $criteria;\n\n return $filterSet;\n });\n\n $this->service->getActivityIdsForSavedSearch($savedSearch, $user, $frequency);\n\n $this->assertNotNull($capturedCriteria);\n $this->assertSame($expectedStartDate, $capturedCriteria->getStartDate()->format('Y-m-d H:i:s'));\n $this->assertSame($expectedEndDate, $capturedCriteria->getEndDate()->format('Y-m-d H:i:s'));\n } finally {\n CarbonImmutable::setTestNow();\n }\n }\n\n public function testGetActivityIdsWithNullFrequencyDoesNotInjectDates(): void\n {\n $user = $this->makeUser();\n $savedSearch = $this->makeSavedSearch([]);\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->logger->method('info');\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);\n\n $capturedCriteria = null;\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {\n $capturedCriteria = $criteria;\n\n return $filterSet;\n });\n\n $this->service->getActivityIdsForSavedSearch($savedSearch, $user, null);\n\n $this->assertNotNull($capturedCriteria);\n $this->assertNull($capturedCriteria->getStartDate());\n $this->assertNull($capturedCriteria->getEndDate());\n }\n\n public function testGetActivityIdsWithUnknownFrequencyDoesNotInjectDates(): void\n {\n $user = $this->makeUser();\n $savedSearch = $this->makeSavedSearch([]);\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->logger->method('info');\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);\n\n $capturedCriteria = null;\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {\n $capturedCriteria = $criteria;\n\n return $filterSet;\n });\n\n $this->service->getActivityIdsForSavedSearch($savedSearch, $user, AutomatedReportsService::FREQUENCY_ONE_OFF);\n\n $this->assertNotNull($capturedCriteria);\n $this->assertNull($capturedCriteria->getStartDate());\n $this->assertNull($capturedCriteria->getEndDate());\n }\n\n public function testGetActivityIdsFrequencyDateRangeOverridesSavedSearchDateFilters(): void\n {\n CarbonImmutable::setTestNow('2025-06-16 12:00:00');\n\n try {\n $user = $this->makeUser();\n\n $startDateFilter = $this->makeFilter(ActivityActualDate::PARAM_START_DATE, '2024-01-01 00:00:00');\n $endDateFilter = $this->makeFilter(ActivityActualDate::PARAM_END_DATE, '2024-12-31 23:59:59');\n $savedSearch = $this->makeSavedSearch([$startDateFilter, $endDateFilter]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->logger->method('info');\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);\n\n $capturedCriteria = null;\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {\n $capturedCriteria = $criteria;\n\n return $filterSet;\n });\n\n $this->service->getActivityIdsForSavedSearch($savedSearch, $user, AutomatedReportsService::FREQUENCY_DAILY);\n\n $this->assertNotNull($capturedCriteria);\n $this->assertSame('2025-06-15 00:00:00', $capturedCriteria->getStartDate()->format('Y-m-d H:i:s'));\n $this->assertSame('2025-06-15 23:59:59', $capturedCriteria->getEndDate()->format('Y-m-d H:i:s'));\n } finally {\n CarbonImmutable::setTestNow();\n }\n }\n}","depth":4,"bounds":{"left":0.13863032,"top":0.27055067,"width":0.34375,"height":0.72944933},"value":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Tests\\Unit\\Services\\Kiosk\\AutomatedReports;\n\nuse Carbon\\CarbonImmutable;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinition\\ActivityActualDate;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinition\\ActivityUpdatedDate;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinition\\DealInsights\\ClosingPeriodFilter;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinitionCollection;\nuse Jiminny\\Component\\ActivitySearch\\Service\\ActivitySearch;\nuse Jiminny\\Models\\Activity\\Search;\nuse Jiminny\\Models\\Activity\\SearchFilter;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Repositories\\ElasticActivityRepository;\nuse Jiminny\\Services\\Kiosk\\AutomatedReports\\AskJiminnyReportActivityService;\nuse Jiminny\\Services\\Kiosk\\AutomatedReports\\AutomatedReportsService;\nuse Jiminny\\VO\\Repository\\OnDemandActivitySearch\\Criteria;\nuse PHPUnit\\Framework\\MockObject\\MockObject;\nuse PHPUnit\\Framework\\TestCase;\nuse Psr\\Log\\LoggerInterface;\n\nclass AskJiminnyReportActivityServiceTest extends TestCase\n{\n private ActivitySearch&MockObject $activitySearch;\n private ElasticActivityRepository&MockObject $elasticRepository;\n private LoggerInterface&MockObject $logger;\n private AskJiminnyReportActivityService $service;\n\n protected function setUp(): void\n {\n $this->activitySearch = $this->createMock(ActivitySearch::class);\n $this->elasticRepository = $this->createMock(ElasticActivityRepository::class);\n $this->logger = $this->createMock(LoggerInterface::class);\n\n $this->service = new AskJiminnyReportActivityService(\n $this->activitySearch,\n $this->elasticRepository,\n $this->logger,\n );\n }\n\n private function makeFilter(string $key, ?string $value): SearchFilter&MockObject\n {\n $filter = $this->createMock(SearchFilter::class);\n $filter->method('getFilterProperty')->willReturn($key);\n $filter->method('getFilterValue')->willReturn($value);\n\n return $filter;\n }\n\n private function makeUser(): User&MockObject\n {\n $tz = new \\DateTimeZone('UTC');\n $user = $this->createMock(User::class);\n $user->method('getTimezone')->willReturn($tz);\n $user->method('getId')->willReturn(1);\n $user->method('getUuid')->willReturn('user-uuid');\n\n return $user;\n }\n\n private function makeSavedSearch(array $filters): Search&MockObject\n {\n $savedSearch = $this->createMock(Search::class);\n $savedSearch->method('getId')->willReturn(42);\n $savedSearch->method('getFilters')->willReturn(new \\Illuminate\\Support\\LazyCollection($filters));\n\n return $savedSearch;\n }\n\n public function testGetActivityIdsForSavedSearchReturnsIds(): void\n {\n $user = $this->makeUser();\n $savedSearch = $this->makeSavedSearch([]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->expects($this->once())\n ->method('getArrayFilterKeys')\n ->with($user)\n ->willReturn([]);\n\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturn($filterSet);\n\n $this->elasticRepository->expects($this->once())\n ->method('onDemandSearchIdsOnly')\n ->willReturn(['id-1', 'id-2', 'id-3']);\n\n $this->logger->expects($this->once())\n ->method('info')\n ->with('[AskJiminnyReport] Fetched activity IDs for saved search');\n\n $result = $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertEquals(['id-1', 'id-2', 'id-3'], $result);\n }\n\n public function testGetActivityIdsForSavedSearchReturnsEmptyWhenNoResults(): void\n {\n $user = $this->makeUser();\n $savedSearch = $this->makeSavedSearch([]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->activitySearch->method('getOnDemandPageFilterSet')->willReturn($filterSet);\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);\n\n $this->logger->expects($this->once())->method('info');\n\n $result = $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertEmpty($result);\n }\n\n public function testGetActivityIdsFiltersOutDateFilters(): void\n {\n $user = $this->makeUser();\n\n $nonDateFilter = $this->makeFilter('owner_id', '123');\n $startDateFilter = $this->makeFilter(ActivityActualDate::PARAM_START_DATE, '2025-01-01 00:00:00');\n $endDateFilter = $this->makeFilter(ActivityActualDate::PARAM_END_DATE, '2025-01-31 23:59:59');\n $updatedFromFilter = $this->makeFilter(ActivityUpdatedDate::PARAM_UPDATED_FROM, '2025-01-01 00:00:00');\n $updatedToFilter = $this->makeFilter(ActivityUpdatedDate::PARAM_UPDATED_TO, '2025-01-31 23:59:59');\n\n $savedSearch = $this->makeSavedSearch([\n $nonDateFilter,\n $startDateFilter,\n $endDateFilter,\n $updatedFromFilter,\n $updatedToFilter,\n ]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n\n $capturedCriteria = null;\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {\n $capturedCriteria = $criteria;\n\n return $filterSet;\n });\n\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);\n $this->logger->method('info');\n\n $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertNotNull($capturedCriteria);\n }\n\n public function testGetActivityIdsFiltersOutClosingPeriodDateFilters(): void\n {\n $user = $this->makeUser();\n\n $closingStartFilter = $this->makeFilter(ClosingPeriodFilter::KEY_START_DATE, '2025-01-01');\n $closingEndFilter = $this->makeFilter(ClosingPeriodFilter::KEY_END_DATE, '2025-03-31');\n $regularFilter = $this->makeFilter('rep_id', '99');\n\n $savedSearch = $this->makeSavedSearch([\n $closingStartFilter,\n $closingEndFilter,\n $regularFilter,\n ]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturn($filterSet);\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn(['id-1']);\n $this->logger->method('info');\n\n $result = $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertEquals(['id-1'], $result);\n }\n\n public function testGetActivityIdsHandlesArrayFilters(): void\n {\n $user = $this->makeUser();\n\n $filter1 = $this->makeFilter('outcome', 'positive');\n $filter2 = $this->makeFilter('outcome', 'negative');\n\n $savedSearch = $this->makeSavedSearch([$filter1, $filter2]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn(['outcome']);\n $this->activitySearch->method('getOnDemandPageFilterSet')->willReturn($filterSet);\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn(['id-1']);\n $this->logger->method('info');\n\n $result = $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertEquals(['id-1'], $result);\n }\n\n public function testGetActivityIdsHandlesScalarFilters(): void\n {\n $user = $this->makeUser();\n\n $filter = $this->makeFilter('direction', 'inbound');\n $savedSearch = $this->makeSavedSearch([$filter]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->activitySearch->method('getOnDemandPageFilterSet')->willReturn($filterSet);\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn(['id-5']);\n $this->logger->method('info');\n\n $result = $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertEquals(['id-5'], $result);\n }\n\n public function testGetActivityIdsPassesNonZeroSequenceNumberToDisableFirstRequestDefaults(): void\n {\n $user = $this->makeUser();\n $savedSearch = $this->makeSavedSearch([]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n\n $capturedCriteria = null;\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {\n $capturedCriteria = $criteria;\n\n return $filterSet;\n });\n\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);\n $this->logger->method('info');\n\n $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertNotNull($capturedCriteria);\n $this->assertFalse($capturedCriteria->isFirstRequest());\n }\n\n public function testGetActivityIdsLogsWithCorrectContext(): void\n {\n $user = $this->makeUser();\n $savedSearch = $this->makeSavedSearch([]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->activitySearch->method('getOnDemandPageFilterSet')->willReturn($filterSet);\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn(['a', 'b']);\n\n $this->logger->expects($this->once())\n ->method('info')\n ->with(\n '[AskJiminnyReport] Fetched activity IDs for saved search',\n $this->callback(fn ($context) => $context['saved_search_id'] === 42\n && $context['user_id'] === 1\n && $context['activity_count'] === 2)\n );\n\n $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n }\n\n public static function frequencyDateRangeProvider(): array\n {\n return [\n 'daily' => [\n AutomatedReportsService::FREQUENCY_DAILY,\n '2025-06-15 00:00:00',\n '2025-06-15 23:59:59',\n ],\n 'weekly' => [\n AutomatedReportsService::FREQUENCY_WEEKLY,\n '2025-06-09 00:00:00',\n '2025-06-15 23:59:59',\n ],\n 'monthly' => [\n AutomatedReportsService::FREQUENCY_MONTHLY,\n '2025-05-01 00:00:00',\n '2025-05-31 23:59:59',\n ],\n 'quarterly' => [\n AutomatedReportsService::FREQUENCY_QUARTERLY,\n '2025-01-01 00:00:00',\n '2025-03-31 23:59:59',\n ],\n ];\n }\n\n /**\n * @dataProvider frequencyDateRangeProvider\n */\n public function testGetActivityIdsInjectsDateRangeForFrequency(\n string $frequency,\n string $expectedStartDate,\n string $expectedEndDate,\n ): void {\n CarbonImmutable::setTestNow('2025-06-16 12:00:00');\n\n try {\n $user = $this->makeUser();\n $savedSearch = $this->makeSavedSearch([]);\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->logger->method('info');\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);\n\n $capturedCriteria = null;\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {\n $capturedCriteria = $criteria;\n\n return $filterSet;\n });\n\n $this->service->getActivityIdsForSavedSearch($savedSearch, $user, $frequency);\n\n $this->assertNotNull($capturedCriteria);\n $this->assertSame($expectedStartDate, $capturedCriteria->getStartDate()->format('Y-m-d H:i:s'));\n $this->assertSame($expectedEndDate, $capturedCriteria->getEndDate()->format('Y-m-d H:i:s'));\n } finally {\n CarbonImmutable::setTestNow();\n }\n }\n\n public function testGetActivityIdsWithNullFrequencyDoesNotInjectDates(): void\n {\n $user = $this->makeUser();\n $savedSearch = $this->makeSavedSearch([]);\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->logger->method('info');\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);\n\n $capturedCriteria = null;\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {\n $capturedCriteria = $criteria;\n\n return $filterSet;\n });\n\n $this->service->getActivityIdsForSavedSearch($savedSearch, $user, null);\n\n $this->assertNotNull($capturedCriteria);\n $this->assertNull($capturedCriteria->getStartDate());\n $this->assertNull($capturedCriteria->getEndDate());\n }\n\n public function testGetActivityIdsWithUnknownFrequencyDoesNotInjectDates(): void\n {\n $user = $this->makeUser();\n $savedSearch = $this->makeSavedSearch([]);\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->logger->method('info');\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);\n\n $capturedCriteria = null;\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {\n $capturedCriteria = $criteria;\n\n return $filterSet;\n });\n\n $this->service->getActivityIdsForSavedSearch($savedSearch, $user, AutomatedReportsService::FREQUENCY_ONE_OFF);\n\n $this->assertNotNull($capturedCriteria);\n $this->assertNull($capturedCriteria->getStartDate());\n $this->assertNull($capturedCriteria->getEndDate());\n }\n\n public function testGetActivityIdsFrequencyDateRangeOverridesSavedSearchDateFilters(): void\n {\n CarbonImmutable::setTestNow('2025-06-16 12:00:00');\n\n try {\n $user = $this->makeUser();\n\n $startDateFilter = $this->makeFilter(ActivityActualDate::PARAM_START_DATE, '2024-01-01 00:00:00');\n $endDateFilter = $this->makeFilter(ActivityActualDate::PARAM_END_DATE, '2024-12-31 23:59:59');\n $savedSearch = $this->makeSavedSearch([$startDateFilter, $endDateFilter]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->logger->method('info');\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);\n\n $capturedCriteria = null;\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {\n $capturedCriteria = $criteria;\n\n return $filterSet;\n });\n\n $this->service->getActivityIdsForSavedSearch($savedSearch, $user, AutomatedReportsService::FREQUENCY_DAILY);\n\n $this->assertNotNull($capturedCriteria);\n $this->assertSame('2025-06-15 00:00:00', $capturedCriteria->getStartDate()->format('Y-m-d H:i:s'));\n $this->assertSame('2025-06-15 23:59:59', $capturedCriteria->getEndDate()->format('Y-m-d H:i:s'));\n } finally {\n CarbonImmutable::setTestNow();\n }\n }\n}","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Execute","depth":4,"bounds":{"left":0.40492022,"top":0.09896249,"width":0.008643617,"height":0.01915403},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Explain Plan","depth":4,"bounds":{"left":0.41356382,"top":0.09896249,"width":0.008643617,"height":0.01915403},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Browse Query History","depth":4,"bounds":{"left":0.4245346,"top":0.09896249,"width":0.008643617,"height":0.01915403},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"View Parameters","depth":4,"bounds":{"left":0.4331782,"top":0.09896249,"width":0.008643617,"height":0.01915403},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Open Query Execution Settings…","depth":4,"bounds":{"left":0.4418218,"top":0.09896249,"width":0.008643617,"height":0.01915403},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"In-Editor Results","depth":4,"bounds":{"left":0.45279256,"top":0.09896249,"width":0.008643617,"height":0.01915403},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Tx: Auto","depth":4,"bounds":{"left":0.4637633,"top":0.09896249,"width":0.024268618,"height":0.01915403},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Cancel Running Statements","depth":4,"bounds":{"left":0.49035904,"top":0.09896249,"width":0.008643617,"height":0.01915403},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Playground","depth":4,"bounds":{"left":0.5013298,"top":0.09896249,"width":0.029587766,"height":0.01915403},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"jiminny","depth":4,"bounds":{"left":0.69913566,"top":0.09896249,"width":0.02825798,"height":0.01915403},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.042220745,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"9","depth":4,"bounds":{"left":0.6732048,"top":0.123703115,"width":0.007978723,"height":0.015163607},"role_description":"text"},{"role":"AXStaticText","text":"12","depth":4,"bounds":{"left":0.6831782,"top":0.123703115,"width":0.009640957,"height":0.015163607},"role_description":"text"},{"role":"AXStaticText","text":"2","depth":4,"bounds":{"left":0.69481385,"top":0.123703115,"width":0.007978723,"height":0.015163607},"role_description":"text"},{"role":"AXStaticText","text":"4","depth":4,"bounds":{"left":0.70478725,"top":0.123703115,"width":0.007978723,"height":0.015163607},"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.7144282,"top":0.12210695,"width":0.00731383,"height":0.018355945},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"bounds":{"left":0.72174203,"top":0.12210695,"width":0.006981383,"height":0.018355945},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"SELECT a.id, a.uuid, a.actual_start_time, o.id, o.uuid FROM opportunities o\nJOIN activities a ON o.id = a.opportunity_id\nWHERE a.crm_configuration_id = 39\nAND a.actual_start_time > '2025-10-13'\nAND a.type IN ('conference', 'softphone-inbound', 'softphone-outbound')\n;\n\nSELECT * FROM activities\nWHERE crm_configuration_id = 39 and user_id = 143\nand actual_start_time >= '2025-10-13'\nAND type IN ('conference', 'softphone-inbound', 'softphone-outbound')\n;\n\nSELECT * FROM opportunities WHERE account_id IN (178);\nselect * from activities where id IN (620137, 620187, 620188, 620189, 620230);\n\n# HS\nSELECT * FROM opportunities WHERE id IN (238);\nselect * from activities where id IN (477,2076);\n\nselect * from users;\n\nSELECT COUNT(*) FROM users;\nSELECT COUNT(*) FROM activities;\nSELECT COUNT(*) FROM opportunities;\n\nUPDATE activities\nSET\n actual_start_time = '2025-12-19 09:00:00',\n actual_end_time = '2025-12-19 10:30:00',\n scheduled_start_time = '2025-12-19 09:00:00',\n scheduled_end_time = '2025-12-19 10:30:00'\nWHERE id IN (407509,407375);\n\nselect * from partners;\n\nSELECT id, uuid, type, actual_start_time, user_id, crm_configuration_id\nFROM activities\nWHERE user_id = 143\nAND actual_start_time >= '2025-10-13 00:00:00'\nAND actual_start_time <= '2026-01-13 23:59:59'\nORDER BY actual_start_time DESC;\n\nSELECT * FROM activities WHERE uuid_to_bin('78eda160-3086-435f-88a5-bb0c71b6008d') = uuid;\nSELECT * FROM crm_layouts where crm_configuration_id = 39;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 282;\n# lead_id\n# account_id 177\n# contact_id 3969\n# opportunity_id\n# stage_id 203\n\nSELECT * FROM opportunities WHERE opportunities.crm_configuration_id = id = 282;\n\nSELECT * FROM activities where crm_configuration_id = 39 AND type = 'conference'\nAND user_id = 143 and actual_start_time >= '2025-10-13';\n\nSELECT * FROM activities a\n# JOIN opportunities o ON a.opportunity_id = o.id\nWHERE a.crm_configuration_id = 39 AND a.type = 'conference'\nand status = 'completed' and recording_state = 'recorded'\nand a.actual_start_time >= '2025-10-13'\nAND a.user_id = 143\n;\n\nselect * from leads\nwhere crm_configuration_id = 39; # 112 -> ac. 178, 109 => op. 1707\n\nSELECT * FROM activities WHERE id IN (356013,616188,616202,616310,407509,407375,356001,356008);\nSELECT * FROM activities WHERE id IN (356013,616188,616202,616310);\nSELECT * FROM activities WHERE id IN (407509,407375); # leads: 112, 109 | status - 198\nSELECT * FROM activities WHERE id IN (356001, 356008); # contacts:\n\nSELECT * FROM opportunities WHERE id IN (1707);\nSELECT * FROM stages where id IN (204, 198);\nSELECT * FROM opportunities WHERE account_id IN (178);\nSELECT * FROM opportunities WHERE crm_configuration_id = 39 AND created_at > '2025-01-01';\nSELECT * FROM contacts WHERE account_id IN (178); # 4118 Musaibe, 4448 Ceco Personal\n\nSELECT * FROM activities where crm_configuration_id = 39\nAND opportunity_id IS NULL\nAND is_internal = false\nand status = 'completed' and recording_state = 'recorded'\nAND actual_start_time >= '2025-10-13'\nAND (lead_id IS NOT NULL OR contact_id IS NOT NULL OR account_id IS NOT NULL)\n# AND lead_id IN (112, 109)\n;\n\nSELECT * FROM crm_profiles WHERE user_id = 143;\n\nselect * from inboxes; # 212\nselect * from users where id = 143; # 143\nselect * from inbox_email_batches where inbox_id = 212\nand updated_at >= '2026-01-28 00:00:00' order by id desc;\nselect * from inbox_emails where inbox_id = 212\nand batch_id = 95885 order by id desc;\nselect * from email_messages where origin_user_id = 143;\nselect * from activities where user_id = 143 and updated_at >= '2026-01-28 00:00:00';\nselect * from participants where activity_id = 620247;\n\nselect * from crm_profiles where user_id = 143;\n\nSELECT * FROM activities WHERE uuid_to_bin('458cf915-b914-4000-b083-5687b32b2956') = uuid; # 356001\nselect * from transcription where activity_id = 356001; # 6943\nselect * from ai_prompts where transcription_id = 6943;\nSELECT * FROM activity_summary_logs where activity_id = 356001;\n\nSELECT * FROM social_accounts WHERE sociable_id = 143;\n\n# ************************************************************************************\nSELECT * FROM activities WHERE uuid_to_bin('0164a4fb-cb95-454e-9edd-4d804e4999bd') = uuid;\n# 422515 softphone tr. 8100\n\nSELECT * FROM activities WHERE uuid_to_bin('7520add8-8d87-41a5-98e5-fc4edf96f21e') = uuid;\n# 407509 conference tr. 7670 crmId: 00UD1000002J9aTMAS\n\nselect * from ai_prompts where transcription_id IN (8100, 7670);\nselect * from activity_summary_logs where activity_id = 407509;\n\nselect * from sidekick_settings;\nselect * from default_activity_types;\n\nSELECT * FROM contacts WHERE crm_configuration_id = 39 and email = 'm.kogoj@gmx.at';\nSELECT * FROM leads WHERE crm_configuration_id = 39 and email = 'm.kogoj@gmx.at';\n\nSELECT * FROM activity_searches where user_id = 143;\nSELECT * FROM groups where team_id = 1;\n\nselect * from teams where id = 1;\nselect * from groups where team_id = 1; # 1150 - 7e75f8025c22\nselect id, name, group_id, status, deleted_at, email\nfrom users where team_id = 1 order by group_id desc ;\n\nselect * from activity_searches where id in (1977, 1978, 1979);\nselect * from activity_search_filters where activity_search_id IN (1977, 1978, 1979);\nselect * from activity_search_filters where filter = 'group_id' and value = '443f26b8-8512-437e-a9f9-7e75f8025c22'; # 10268, 10272, 10277\nselect * from nudges where activity_search_id IN (1977, 1978, 1979); # 877, 878, 879\n\nINSERT INTO `activity_search_filters`\n(`activity_search_id`, `filter`, `value`) VALUES\n(1977, 'group_id', '443f26b8-8512-437e-a9f9-7e75f8025c22'),\n(1978, 'group_id', '443f26b8-8512-437e-a9f9-7e75f8025c22'),\n(1979, 'group_id', '443f26b8-8512-437e-a9f9-7e75f8025c22')\n;\n\nselect * from crm_configurations where id = 39;\n\nselect * from teams where id = 1;\nselect * from team_features where team_id = 1;\nselect * from features;\n\nSELECT * FROM activity_searches where id = 1982; # 1981\nSELECT * FROM activity_search_filters WHERE activity_search_id = 1982;\n\nSELECT * FROM automated_reports where id = 68;\nSELECT * FROM automated_report_results where id = 275;\n\nSELECT * FROM automated_reports order by id desc;\nSELECT * FROM automated_report_results order by id desc;\nselect * from activity_searches where user_id = 143;\nselect * from ask_anything_prompts;\n\nSELECT * FROM groups WHERE id = 1439;\nSELECT * FROM users WHERE group_id = 1439;\n\nselect * from permissions; # 158\nselect * from roles;\nselect * from permission_role\n\nselect * from teams where id = 1;\nselect * from groups g JOIN playbooks p on g.playbook_id = p.id where g.team_id = 1;\nselect * from groups where id = 28;\nselect * from playbooks where team_id = 1;\nselect * from playbooks where id = 179;\nselect * from playbook_categories where id = 1391;\nselect * from users where id = 143;\nselect * from crm_profiles where user_id = 143;\nselect * from activities where crm_configuration_id = 39 and type = 'conference'\nand crm_provider_id IS NOT NULL ORDER by id desc;\nselect * from activities where id = 422003; # 00UO400000pB6fpMAC\n\nSELECT ar.id, ar.uuid, ar.media_type, ar.status, a.type\nFROM automated_report_results ar\nJOIN automated_reports a ON a.id = ar.report_id\nWHERE a.type = 'ask_jiminny'\nLIMIT 10;\n\n\nselect * from teams where id = 3143;\nselect * from crm_configurations where id = 500;\nselect * from users where name = 'Integration Account'; # 1695\nSELECT * FROM social_accounts WHERE sociable_id = 1695;\n\nselect * from activities where crm_configuration_id = 39\nand status = 'completed' and actual_start_time >= '2025-01-01'","depth":4,"value":"SELECT a.id, a.uuid, a.actual_start_time, o.id, o.uuid FROM opportunities o\nJOIN activities a ON o.id = a.opportunity_id\nWHERE a.crm_configuration_id = 39\nAND a.actual_start_time > '2025-10-13'\nAND a.type IN ('conference', 'softphone-inbound', 'softphone-outbound')\n;\n\nSELECT * FROM activities\nWHERE crm_configuration_id = 39 and user_id = 143\nand actual_start_time >= '2025-10-13'\nAND type IN ('conference', 'softphone-inbound', 'softphone-outbound')\n;\n\nSELECT * FROM opportunities WHERE account_id IN (178);\nselect * from activities where id IN (620137, 620187, 620188, 620189, 620230);\n\n# HS\nSELECT * FROM opportunities WHERE id IN (238);\nselect * from activities where id IN (477,2076);\n\nselect * from users;\n\nSELECT COUNT(*) FROM users;\nSELECT COUNT(*) FROM activities;\nSELECT COUNT(*) FROM opportunities;\n\nUPDATE activities\nSET\n actual_start_time = '2025-12-19 09:00:00',\n actual_end_time = '2025-12-19 10:30:00',\n scheduled_start_time = '2025-12-19 09:00:00',\n scheduled_end_time = '2025-12-19 10:30:00'\nWHERE id IN (407509,407375);\n\nselect * from partners;\n\nSELECT id, uuid, type, actual_start_time, user_id, crm_configuration_id\nFROM activities\nWHERE user_id = 143\nAND actual_start_time >= '2025-10-13 00:00:00'\nAND actual_start_time <= '2026-01-13 23:59:59'\nORDER BY actual_start_time DESC;\n\nSELECT * FROM activities WHERE uuid_to_bin('78eda160-3086-435f-88a5-bb0c71b6008d') = uuid;\nSELECT * FROM crm_layouts where crm_configuration_id = 39;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 282;\n# lead_id\n# account_id 177\n# contact_id 3969\n# opportunity_id\n# stage_id 203\n\nSELECT * FROM opportunities WHERE opportunities.crm_configuration_id = id = 282;\n\nSELECT * FROM activities where crm_configuration_id = 39 AND type = 'conference'\nAND user_id = 143 and actual_start_time >= '2025-10-13';\n\nSELECT * FROM activities a\n# JOIN opportunities o ON a.opportunity_id = o.id\nWHERE a.crm_configuration_id = 39 AND a.type = 'conference'\nand status = 'completed' and recording_state = 'recorded'\nand a.actual_start_time >= '2025-10-13'\nAND a.user_id = 143\n;\n\nselect * from leads\nwhere crm_configuration_id = 39; # 112 -> ac. 178, 109 => op. 1707\n\nSELECT * FROM activities WHERE id IN (356013,616188,616202,616310,407509,407375,356001,356008);\nSELECT * FROM activities WHERE id IN (356013,616188,616202,616310);\nSELECT * FROM activities WHERE id IN (407509,407375); # leads: 112, 109 | status - 198\nSELECT * FROM activities WHERE id IN (356001, 356008); # contacts:\n\nSELECT * FROM opportunities WHERE id IN (1707);\nSELECT * FROM stages where id IN (204, 198);\nSELECT * FROM opportunities WHERE account_id IN (178);\nSELECT * FROM opportunities WHERE crm_configuration_id = 39 AND created_at > '2025-01-01';\nSELECT * FROM contacts WHERE account_id IN (178); # 4118 Musaibe, 4448 Ceco Personal\n\nSELECT * FROM activities where crm_configuration_id = 39\nAND opportunity_id IS NULL\nAND is_internal = false\nand status = 'completed' and recording_state = 'recorded'\nAND actual_start_time >= '2025-10-13'\nAND (lead_id IS NOT NULL OR contact_id IS NOT NULL OR account_id IS NOT NULL)\n# AND lead_id IN (112, 109)\n;\n\nSELECT * FROM crm_profiles WHERE user_id = 143;\n\nselect * from inboxes; # 212\nselect * from users where id = 143; # 143\nselect * from inbox_email_batches where inbox_id = 212\nand updated_at >= '2026-01-28 00:00:00' order by id desc;\nselect * from inbox_emails where inbox_id = 212\nand batch_id = 95885 order by id desc;\nselect * from email_messages where origin_user_id = 143;\nselect * from activities where user_id = 143 and updated_at >= '2026-01-28 00:00:00';\nselect * from participants where activity_id = 620247;\n\nselect * from crm_profiles where user_id = 143;\n\nSELECT * FROM activities WHERE uuid_to_bin('458cf915-b914-4000-b083-5687b32b2956') = uuid; # 356001\nselect * from transcription where activity_id = 356001; # 6943\nselect * from ai_prompts where transcription_id = 6943;\nSELECT * FROM activity_summary_logs where activity_id = 356001;\n\nSELECT * FROM social_accounts WHERE sociable_id = 143;\n\n# ************************************************************************************\nSELECT * FROM activities WHERE uuid_to_bin('0164a4fb-cb95-454e-9edd-4d804e4999bd') = uuid;\n# 422515 softphone tr. 8100\n\nSELECT * FROM activities WHERE uuid_to_bin('7520add8-8d87-41a5-98e5-fc4edf96f21e') = uuid;\n# 407509 conference tr. 7670 crmId: 00UD1000002J9aTMAS\n\nselect * from ai_prompts where transcription_id IN (8100, 7670);\nselect * from activity_summary_logs where activity_id = 407509;\n\nselect * from sidekick_settings;\nselect * from default_activity_types;\n\nSELECT * FROM contacts WHERE crm_configuration_id = 39 and email = 'm.kogoj@gmx.at';\nSELECT * FROM leads WHERE crm_configuration_id = 39 and email = 'm.kogoj@gmx.at';\n\nSELECT * FROM activity_searches where user_id = 143;\nSELECT * FROM groups where team_id = 1;\n\nselect * from teams where id = 1;\nselect * from groups where team_id = 1; # 1150 - 7e75f8025c22\nselect id, name, group_id, status, deleted_at, email\nfrom users where team_id = 1 order by group_id desc ;\n\nselect * from activity_searches where id in (1977, 1978, 1979);\nselect * from activity_search_filters where activity_search_id IN (1977, 1978, 1979);\nselect * from activity_search_filters where filter = 'group_id' and value = '443f26b8-8512-437e-a9f9-7e75f8025c22'; # 10268, 10272, 10277\nselect * from nudges where activity_search_id IN (1977, 1978, 1979); # 877, 878, 879\n\nINSERT INTO `activity_search_filters`\n(`activity_search_id`, `filter`, `value`) VALUES\n(1977, 'group_id', '443f26b8-8512-437e-a9f9-7e75f8025c22'),\n(1978, 'group_id', '443f26b8-8512-437e-a9f9-7e75f8025c22'),\n(1979, 'group_id', '443f26b8-8512-437e-a9f9-7e75f8025c22')\n;\n\nselect * from crm_configurations where id = 39;\n\nselect * from teams where id = 1;\nselect * from team_features where team_id = 1;\nselect * from features;\n\nSELECT * FROM activity_searches where id = 1982; # 1981\nSELECT * FROM activity_search_filters WHERE activity_search_id = 1982;\n\nSELECT * FROM automated_reports where id = 68;\nSELECT * FROM automated_report_results where id = 275;\n\nSELECT * FROM automated_reports order by id desc;\nSELECT * FROM automated_report_results order by id desc;\nselect * from activity_searches where user_id = 143;\nselect * from ask_anything_prompts;\n\nSELECT * FROM groups WHERE id = 1439;\nSELECT * FROM users WHERE group_id = 1439;\n\nselect * from permissions; # 158\nselect * from roles;\nselect * from permission_role\n\nselect * from teams where id = 1;\nselect * from groups g JOIN playbooks p on g.playbook_id = p.id where g.team_id = 1;\nselect * from groups where id = 28;\nselect * from playbooks where team_id = 1;\nselect * from playbooks where id = 179;\nselect * from playbook_categories where id = 1391;\nselect * from users where id = 143;\nselect * from crm_profiles where user_id = 143;\nselect * from activities where crm_configuration_id = 39 and type = 'conference'\nand crm_provider_id IS NOT NULL ORDER by id desc;\nselect * from activities where id = 422003; # 00UO400000pB6fpMAC\n\nSELECT ar.id, ar.uuid, ar.media_type, ar.status, a.type\nFROM automated_report_results ar\nJOIN automated_reports a ON a.id = ar.report_id\nWHERE a.type = 'ask_jiminny'\nLIMIT 10;\n\n\nselect * from teams where id = 3143;\nselect * from crm_configurations where id = 500;\nselect * from users where name = 'Integration Account'; # 1695\nSELECT * FROM social_accounts WHERE sociable_id = 1695;\n\nselect * from activities where crm_configuration_id = 39\nand status = 'completed' and actual_start_time >= '2025-01-01'","role_description":"text entry area","is_enabled":true,"is_focused":true,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Project","depth":3,"role_description":"text"},{"role":"AXButton","text":"Project","depth":3,"bounds":{"left":0.011968086,"top":0.047885075,"width":0.024268618,"height":0.024740623},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"New File or Directory…","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Expand Selected","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Collapse All","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Options","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
-5696139294825716137
|
2146703024167786053
|
idle
|
accessibility
|
NULL
|
Project: faVsco.js, menu
#11894 on JY-18909-automa Project: faVsco.js, menu
#11894 on JY-18909-automated-reports-ask-jiminny, menu
Start Listening for PHP Debug Connections
AskJiminnyReportActivityServiceTest
Run 'AskJiminnyReportActivityServiceTest'
Debug 'AskJiminnyReportActivityServiceTest'
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 Carbon\CarbonImmutable;
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\Services\Kiosk\AutomatedReports\AutomatedReportsService;
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);
}
public static function frequencyDateRangeProvider(): array
{
return [
'daily' => [
AutomatedReportsService::FREQUENCY_DAILY,
'2025-06-15 00:00:00',
'2025-06-15 23:59:59',
],
'weekly' => [
AutomatedReportsService::FREQUENCY_WEEKLY,
'2025-06-09 00:00:00',
'2025-06-15 23:59:59',
],
'monthly' => [
AutomatedReportsService::FREQUENCY_MONTHLY,
'2025-05-01 00:00:00',
'2025-05-31 23:59:59',
],
'quarterly' => [
AutomatedReportsService::FREQUENCY_QUARTERLY,
'2025-01-01 00:00:00',
'2025-03-31 23:59:59',
],
];
}
/**
* @dataProvider frequencyDateRangeProvider
*/
public function testGetActivityIdsInjectsDateRangeForFrequency(
string $frequency,
string $expectedStartDate,
string $expectedEndDate,
): void {
CarbonImmutable::setTestNow('2025-06-16 12:00:00');
try {
$user = $this->makeUser();
$savedSearch = $this->makeSavedSearch([]);
$filterSet = $this->createMock(FilterDefinitionCollection::class);
$this->activitySearch->method('getArrayFilterKeys')->willReturn([]);
$this->logger->method('info');
$this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);
$capturedCriteria = null;
$this->activitySearch->expects($this->once())
->method('getOnDemandPageFilterSet')
->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {
$capturedCriteria = $criteria;
return $filterSet;
});
$this->service->getActivityIdsForSavedSearch($savedSearch, $user, $frequency);
$this->assertNotNull($capturedCriteria);
$this->assertSame($expectedStartDate, $capturedCriteria->getStartDate()->format('Y-m-d H:i:s'));
$this->assertSame($expectedEndDate, $capturedCriteria->getEndDate()->format('Y-m-d H:i:s'));
} finally {
CarbonImmutable::setTestNow();
}
}
public function testGetActivityIdsWithNullFrequencyDoesNotInjectDates(): void
{
$user = $this->makeUser();
$savedSearch = $this->makeSavedSearch([]);
$filterSet = $this->createMock(FilterDefinitionCollection::class);
$this->activitySearch->method('getArrayFilterKeys')->willReturn([]);
$this->logger->method('info');
$this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);
$capturedCriteria = null;
$this->activitySearch->expects($this->once())
->method('getOnDemandPageFilterSet')
->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {
$capturedCriteria = $criteria;
return $filterSet;
});
$this->service->getActivityIdsForSavedSearch($savedSearch, $user, null);
$this->assertNotNull($capturedCriteria);
$this->assertNull($capturedCriteria->getStartDate());
$this->assertNull($capturedCriteria->getEndDate());
}
public function testGetActivityIdsWithUnknownFrequencyDoesNotInjectDates(): void
{
$user = $this->makeUser();
$savedSearch = $this->makeSavedSearch([]);
$filterSet = $this->createMock(FilterDefinitionCollection::class);
$this->activitySearch->method('getArrayFilterKeys')->willReturn([]);
$this->logger->method('info');
$this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);
$capturedCriteria = null;
$this->activitySearch->expects($this->once())
->method('getOnDemandPageFilterSet')
->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {
$capturedCriteria = $criteria;
return $filterSet;
});
$this->service->getActivityIdsForSavedSearch($savedSearch, $user, AutomatedReportsService::FREQUENCY_ONE_OFF);
$this->assertNotNull($capturedCriteria);
$this->assertNull($capturedCriteria->getStartDate());
$this->assertNull($capturedCriteria->getEndDate());
}
public function testGetActivityIdsFrequencyDateRangeOverridesSavedSearchDateFilters(): void
{
CarbonImmutable::setTestNow('2025-06-16 12:00:00');
try {
$user = $this->makeUser();
$startDateFilter = $this->makeFilter(ActivityActualDate::PARAM_START_DATE, '2024-01-01 00:00:00');
$endDateFilter = $this->makeFilter(ActivityActualDate::PARAM_END_DATE, '2024-12-31 23:59:59');
$savedSearch = $this->makeSavedSearch([$startDateFilter, $endDateFilter]);
$filterSet = $this->createMock(FilterDefinitionCollection::class);
$this->activitySearch->method('getArrayFilterKeys')->willReturn([]);
$this->logger->method('info');
$this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);
$capturedCriteria = null;
$this->activitySearch->expects($this->once())
->method('getOnDemandPageFilterSet')
->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {
$capturedCriteria = $criteria;
return $filterSet;
});
$this->service->getActivityIdsForSavedSearch($savedSearch, $user, AutomatedReportsService::FREQUENCY_DAILY);
$this->assertNotNull($capturedCriteria);
$this->assertSame('2025-06-15 00:00:00', $capturedCriteria->getStartDate()->format('Y-m-d H:i:s'));
$this->assertSame('2025-06-15 23:59:59', $capturedCriteria->getEndDate()->format('Y-m-d H:i:s'));
} finally {
CarbonImmutable::setTestNow();
}
}
}
Execute
Explain Plan
Browse Query History
View Parameters
Open Query Execution Settings…
In-Editor Results
Tx: Auto
Cancel Running Statements
Playground
jiminny
Code changed:
Hide
Sync Changes
Hide This Notification
9
12
2
4
Previous Highlighted Error
Next Highlighted Error
SELECT a.id, a.uuid, a.actual_start_time, o.id, o.uuid FROM opportunities o
JOIN activities a ON o.id = a.opportunity_id
WHERE a.crm_configuration_id = 39
AND a.actual_start_time > '2025-10-13'
AND a.type IN ('conference', 'softphone-inbound', 'softphone-outbound')
;
SELECT * FROM activities
WHERE crm_configuration_id = 39 and user_id = 143
and actual_start_time >= '2025-10-13'
AND type IN ('conference', 'softphone-inbound', 'softphone-outbound')
;
SELECT * FROM opportunities WHERE account_id IN (178);
select * from activities where id IN (620137, 620187, 620188, 620189, 620230);
# HS
SELECT * FROM opportunities WHERE id IN (238);
select * from activities where id IN (477,2076);
select * from users;
SELECT COUNT(*) FROM users;
SELECT COUNT(*) FROM activities;
SELECT COUNT(*) FROM opportunities;
UPDATE activities
SET
actual_start_time = '2025-12-19 09:00:00',
actual_end_time = '2025-12-19 10:30:00',
scheduled_start_time = '2025-12-19 09:00:00',
scheduled_end_time = '2025-12-19 10:30:00'
WHERE id IN (407509,407375);
select * from partners;
SELECT id, uuid, type, actual_start_time, user_id, crm_configuration_id
FROM activities
WHERE user_id = 143
AND actual_start_time >= '2025-10-13 00:00:00'
AND actual_start_time <= '2026-01-13 23:59:59'
ORDER BY actual_start_time DESC;
SELECT * FROM activities WHERE uuid_to_bin('78eda160-3086-435f-88a5-bb0c71b6008d') = uuid;
SELECT * FROM crm_layouts where crm_configuration_id = 39;
SELECT * FROM crm_layout_entities WHERE crm_layout_id = 282;
# lead_id
# account_id 177
# contact_id 3969
# opportunity_id
# stage_id 203
SELECT * FROM opportunities WHERE opportunities.crm_configuration_id = id = 282;
SELECT * FROM activities where crm_configuration_id = 39 AND type = 'conference'
AND user_id = 143 and actual_start_time >= '2025-10-13';
SELECT * FROM activities a
# JOIN opportunities o ON a.opportunity_id = o.id
WHERE a.crm_configuration_id = 39 AND a.type = 'conference'
and status = 'completed' and recording_state = 'recorded'
and a.actual_start_time >= '2025-10-13'
AND a.user_id = 143
;
select * from leads
where crm_configuration_id = 39; # 112 -> ac. 178, 109 => op. 1707
SELECT * FROM activities WHERE id IN (356013,616188,616202,616310,407509,407375,356001,356008);
SELECT * FROM activities WHERE id IN (356013,616188,616202,616310);
SELECT * FROM activities WHERE id IN (407509,407375); # leads: 112, 109 | status - 198
SELECT * FROM activities WHERE id IN (356001, 356008); # contacts:
SELECT * FROM opportunities WHERE id IN (1707);
SELECT * FROM stages where id IN (204, 198);
SELECT * FROM opportunities WHERE account_id IN (178);
SELECT * FROM opportunities WHERE crm_configuration_id = 39 AND created_at > '2025-01-01';
SELECT * FROM contacts WHERE account_id IN (178); # 4118 Musaibe, 4448 Ceco Personal
SELECT * FROM activities where crm_configuration_id = 39
AND opportunity_id IS NULL
AND is_internal = false
and status = 'completed' and recording_state = 'recorded'
AND actual_start_time >= '2025-10-13'
AND (lead_id IS NOT NULL OR contact_id IS NOT NULL OR account_id IS NOT NULL)
# AND lead_id IN (112, 109)
;
SELECT * FROM crm_profiles WHERE user_id = 143;
select * from inboxes; # 212
select * from users where id = 143; # 143
select * from inbox_email_batches where inbox_id = 212
and updated_at >= '2026-01-28 00:00:00' order by id desc;
select * from inbox_emails where inbox_id = 212
and batch_id = 95885 order by id desc;
select * from email_messages where origin_user_id = 143;
select * from activities where user_id = 143 and updated_at >= '2026-01-28 00:00:00';
select * from participants where activity_id = 620247;
select * from crm_profiles where user_id = 143;
SELECT * FROM activities WHERE uuid_to_bin('458cf915-b914-4000-b083-5687b32b2956') = uuid; # 356001
select * from transcription where activity_id = 356001; # 6943
select * from ai_prompts where transcription_id = 6943;
SELECT * FROM activity_summary_logs where activity_id = 356001;
SELECT * FROM social_accounts WHERE sociable_id = 143;
# [PASSWORD_DOTS]
SELECT * FROM activities WHERE uuid_to_bin('0164a4fb-cb95-454e-9edd-4d804e4999bd') = uuid;
# 422515 softphone tr. 8100
SELECT * FROM activities WHERE uuid_to_bin('7520add8-8d87-41a5-98e5-fc4edf96f21e') = uuid;
# 407509 conference tr. 7670 crmId: 00UD1000002J9aTMAS
select * from ai_prompts where transcription_id IN (8100, 7670);
select * from activity_summary_logs where activity_id = 407509;
select * from sidekick_settings;
select * from default_activity_types;
SELECT * FROM contacts WHERE crm_configuration_id = 39 and email = '[EMAIL]';
SELECT * FROM leads WHERE crm_configuration_id = 39 and email = '[EMAIL]';
SELECT * FROM activity_searches where user_id = 143;
SELECT * FROM groups where team_id = 1;
select * from teams where id = 1;
select * from groups where team_id = 1; # 1150 - 7e75f8025c22
select id, name, group_id, status, deleted_at, email
from users where team_id = 1 order by group_id desc ;
select * from activity_searches where id in (1977, 1978, 1979);
select * from activity_search_filters where activity_search_id IN (1977, 1978, 1979);
select * from activity_search_filters where filter = 'group_id' and value = '443f26b8-8512-437e-a9f9-7e75f8025c22'; # 10268, 10272, 10277
select * from nudges where activity_search_id IN (1977, 1978, 1979); # 877, 878, 879
INSERT INTO `activity_search_filters`
(`activity_search_id`, `filter`, `value`) VALUES
(1977, 'group_id', '443f26b8-8512-437e-a9f9-7e75f8025c22'),
(1978, 'group_id', '443f26b8-8512-437e-a9f9-7e75f8025c22'),
(1979, 'group_id', '443f26b8-8512-437e-a9f9-7e75f8025c22')
;
select * from crm_configurations where id = 39;
select * from teams where id = 1;
select * from team_features where team_id = 1;
select * from features;
SELECT * FROM activity_searches where id = 1982; # 1981
SELECT * FROM activity_search_filters WHERE activity_search_id = 1982;
SELECT * FROM automated_reports where id = 68;
SELECT * FROM automated_report_results where id = 275;
SELECT * FROM automated_reports order by id desc;
SELECT * FROM automated_report_results order by id desc;
select * from activity_searches where user_id = 143;
select * from ask_anything_prompts;
SELECT * FROM groups WHERE id = 1439;
SELECT * FROM users WHERE group_id = 1439;
select * from permissions; # 158
select * from roles;
select * from permission_role
select * from teams where id = 1;
select * from groups g JOIN playbooks p on g.playbook_id = p.id where g.team_id = 1;
select * from groups where id = 28;
select * from playbooks where team_id = 1;
select * from playbooks where id = 179;
select * from playbook_categories where id = 1391;
select * from users where id = 143;
select * from crm_profiles where user_id = 143;
select * from activities where crm_configuration_id = 39 and type = 'conference'
and crm_provider_id IS NOT NULL ORDER by id desc;
select * from activities where id = 422003; # 00UO400000pB6fpMAC
SELECT ar.id, ar.uuid, ar.media_type, ar.status, a.type
FROM automated_report_results ar
JOIN automated_reports a ON a.id = ar.report_id
WHERE a.type = 'ask_jiminny'
LIMIT 10;
select * from teams where id = 3143;
select * from crm_configurations where id = 500;
select * from users where name = 'Integration Account'; # 1695
SELECT * FROM social_accounts WHERE sociable_id = 1695;
select * from activities where crm_configuration_id = 39
and status = 'completed' and actual_start_time >= '2025-01-01'
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide...
|
54641
|
|
54728
|
NULL
|
0
|
2026-04-20T09:17:15.768156+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-20/1776 /Users/lukas/.screenpipe/data/data/2026-04-20/1776676635768_m2.jpg...
|
PhpStorm
|
faVsco.js – SF [jiminny@localhost]
|
True
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
#11894 on JY-18909-automa Project: faVsco.js, menu
#11894 on JY-18909-automated-reports-ask-jiminny, menu
Start Listening for PHP Debug Connections
AskJiminnyReportActivityServiceTest
Run 'AskJiminnyReportActivityServiceTest'
Debug 'AskJiminnyReportActivityServiceTest'
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 Carbon\CarbonImmutable;
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\Services\Kiosk\AutomatedReports\AutomatedReportsService;
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);
}
public static function frequencyDateRangeProvider(): array
{
return [
'daily' => [
AutomatedReportsService::FREQUENCY_DAILY,
'2025-06-15 00:00:00',
'2025-06-15 23:59:59',
],
'weekly' => [
AutomatedReportsService::FREQUENCY_WEEKLY,
'2025-06-09 00:00:00',
'2025-06-15 23:59:59',
],
'monthly' => [
AutomatedReportsService::FREQUENCY_MONTHLY,
'2025-05-01 00:00:00',
'2025-05-31 23:59:59',
],
'quarterly' => [
AutomatedReportsService::FREQUENCY_QUARTERLY,
'2025-01-01 00:00:00',
'2025-03-31 23:59:59',
],
];
}
/**
* @dataProvider frequencyDateRangeProvider
*/
public function testGetActivityIdsInjectsDateRangeForFrequency(
string $frequency,
string $expectedStartDate,
string $expectedEndDate,
): void {
CarbonImmutable::setTestNow('2025-06-16 12:00:00');
try {
$user = $this->makeUser();
$savedSearch = $this->makeSavedSearch([]);
$filterSet = $this->createMock(FilterDefinitionCollection::class);
$this->activitySearch->method('getArrayFilterKeys')->willReturn([]);
$this->logger->method('info');
$this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);
$capturedCriteria = null;
$this->activitySearch->expects($this->once())
->method('getOnDemandPageFilterSet')
->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {
$capturedCriteria = $criteria;
return $filterSet;
});
$this->service->getActivityIdsForSavedSearch($savedSearch, $user, $frequency);
$this->assertNotNull($capturedCriteria);
$this->assertSame($expectedStartDate, $capturedCriteria->getStartDate()->format('Y-m-d H:i:s'));
$this->assertSame($expectedEndDate, $capturedCriteria->getEndDate()->format('Y-m-d H:i:s'));
} finally {
CarbonImmutable::setTestNow();
}
}
public function testGetActivityIdsWithNullFrequencyDoesNotInjectDates(): void
{
$user = $this->makeUser();
$savedSearch = $this->makeSavedSearch([]);
$filterSet = $this->createMock(FilterDefinitionCollection::class);
$this->activitySearch->method('getArrayFilterKeys')->willReturn([]);
$this->logger->method('info');
$this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);
$capturedCriteria = null;
$this->activitySearch->expects($this->once())
->method('getOnDemandPageFilterSet')
->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {
$capturedCriteria = $criteria;
return $filterSet;
});
$this->service->getActivityIdsForSavedSearch($savedSearch, $user, null);
$this->assertNotNull($capturedCriteria);
$this->assertNull($capturedCriteria->getStartDate());
$this->assertNull($capturedCriteria->getEndDate());
}
public function testGetActivityIdsWithUnknownFrequencyDoesNotInjectDates(): void
{
$user = $this->makeUser();
$savedSearch = $this->makeSavedSearch([]);
$filterSet = $this->createMock(FilterDefinitionCollection::class);
$this->activitySearch->method('getArrayFilterKeys')->willReturn([]);
$this->logger->method('info');
$this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);
$capturedCriteria = null;
$this->activitySearch->expects($this->once())
->method('getOnDemandPageFilterSet')
->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {
$capturedCriteria = $criteria;
return $filterSet;
});
$this->service->getActivityIdsForSavedSearch($savedSearch, $user, AutomatedReportsService::FREQUENCY_ONE_OFF);
$this->assertNotNull($capturedCriteria);
$this->assertNull($capturedCriteria->getStartDate());
$this->assertNull($capturedCriteria->getEndDate());
}
public function testGetActivityIdsFrequencyDateRangeOverridesSavedSearchDateFilters(): void
{
CarbonImmutable::setTestNow('2025-06-16 12:00:00');
try {
$user = $this->makeUser();
$startDateFilter = $this->makeFilter(ActivityActualDate::PARAM_START_DATE, '2024-01-01 00:00:00');
$endDateFilter = $this->makeFilter(ActivityActualDate::PARAM_END_DATE, '2024-12-31 23:59:59');
$savedSearch = $this->makeSavedSearch([$startDateFilter, $endDateFilter]);
$filterSet = $this->createMock(FilterDefinitionCollection::class);
$this->activitySearch->method('getArrayFilterKeys')->willReturn([]);
$this->logger->method('info');
$this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);
$capturedCriteria = null;
$this->activitySearch->expects($this->once())
->method('getOnDemandPageFilterSet')
->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {
$capturedCriteria = $criteria;
return $filterSet;
});
$this->service->getActivityIdsForSavedSearch($savedSearch, $user, AutomatedReportsService::FREQUENCY_DAILY);
$this->assertNotNull($capturedCriteria);
$this->assertSame('2025-06-15 00:00:00', $capturedCriteria->getStartDate()->format('Y-m-d H:i:s'));
$this->assertSame('2025-06-15 23:59:59', $capturedCriteria->getEndDate()->format('Y-m-d H:i:s'));
} finally {
CarbonImmutable::setTestNow();
}
}
}
Execute
Explain Plan
Browse Query History
View Parameters
Open Query Execution Settings…
In-Editor Results
Tx: Auto
Cancel Running Statements
Playground
jiminny
Code changed:
Hide
Sync Changes
Hide This Notification
10
12
2
4
Previous Highlighted Error
Next Highlighted Error
SELECT a.id, a.uuid, a.actual_start_time, o.id, o.uuid FROM opportunities o
JOIN activities a ON o.id = a.opportunity_id
WHERE a.crm_configuration_id = 39
AND a.actual_start_time > '2025-10-13'
AND a.type IN ('conference', 'softphone-inbound', 'softphone-outbound')
;
SELECT * FROM activities
WHERE crm_configuration_id = 39 and user_id = 143
and actual_start_time >= '2025-10-13'
AND type IN ('conference', 'softphone-inbound', 'softphone-outbound')
;
SELECT * FROM opportunities WHERE account_id IN (178);
select * from activities where id IN (620137, 620187, 620188, 620189, 620230);
# HS
SELECT * FROM opportunities WHERE id IN (238);
select * from activities where id IN (477,2076);
select * from users;
SELECT COUNT(*) FROM users;
SELECT COUNT(*) FROM activities;
SELECT COUNT(*) FROM opportunities;
UPDATE activities
SET
actual_start_time = '2025-12-19 09:00:00',
actual_end_time = '2025-12-19 10:30:00',
scheduled_start_time = '2025-12-19 09:00:00',
scheduled_end_time = '2025-12-19 10:30:00'
WHERE id IN (407509,407375);
select * from partners;
SELECT id, uuid, type, actual_start_time, user_id, crm_configuration_id
FROM activities
WHERE user_id = 143
AND actual_start_time >= '2025-10-13 00:00:00'
AND actual_start_time <= '2026-01-13 23:59:59'
ORDER BY actual_start_time DESC;
SELECT * FROM activities WHERE uuid_to_bin('78eda160-3086-435f-88a5-bb0c71b6008d') = uuid;
SELECT * FROM crm_layouts where crm_configuration_id = 39;
SELECT * FROM crm_layout_entities WHERE crm_layout_id = 282;
# lead_id
# account_id 177
# contact_id 3969
# opportunity_id
# stage_id 203
SELECT * FROM opportunities WHERE opportunities.crm_configuration_id = id = 282;
SELECT * FROM activities where crm_configuration_id = 39 AND type = 'conference'
AND user_id = 143 and actual_start_time >= '2025-10-13';
SELECT * FROM activities a
# JOIN opportunities o ON a.opportunity_id = o.id
WHERE a.crm_configuration_id = 39 AND a.type = 'conference'
and status = 'completed' and recording_state = 'recorded'
and a.actual_start_time >= '2025-10-13'
AND a.user_id = 143
;
select * from leads
where crm_configuration_id = 39; # 112 -> ac. 178, 109 => op. 1707
SELECT * FROM activities WHERE id IN (356013,616188,616202,616310,407509,407375,356001,356008);
SELECT * FROM activities WHERE id IN (356013,616188,616202,616310);
SELECT * FROM activities WHERE id IN (407509,407375); # leads: 112, 109 | status - 198
SELECT * FROM activities WHERE id IN (356001, 356008); # contacts:
SELECT * FROM opportunities WHERE id IN (1707);
SELECT * FROM stages where id IN (204, 198);
SELECT * FROM opportunities WHERE account_id IN (178);
SELECT * FROM opportunities WHERE crm_configuration_id = 39 AND created_at > '2025-01-01';
SELECT * FROM contacts WHERE account_id IN (178); # 4118 Musaibe, 4448 Ceco Personal
SELECT * FROM activities where crm_configuration_id = 39
AND opportunity_id IS NULL
AND is_internal = false
and status = 'completed' and recording_state = 'recorded'
AND actual_start_time >= '2025-10-13'
AND (lead_id IS NOT NULL OR contact_id IS NOT NULL OR account_id IS NOT NULL)
# AND lead_id IN (112, 109)
;
SELECT * FROM crm_profiles WHERE user_id = 143;
select * from inboxes; # 212
select * from users where id = 143; # 143
select * from inbox_email_batches where inbox_id = 212
and updated_at >= '2026-01-28 00:00:00' order by id desc;
select * from inbox_emails where inbox_id = 212
and batch_id = 95885 order by id desc;
select * from email_messages where origin_user_id = 143;
select * from activities where user_id = 143 and updated_at >= '2026-01-28 00:00:00';
select * from participants where activity_id = 620247;
select * from crm_profiles where user_id = 143;
SELECT * FROM activities WHERE uuid_to_bin('458cf915-b914-4000-b083-5687b32b2956') = uuid; # 356001
select * from transcription where activity_id = 356001; # 6943
select * from ai_prompts where transcription_id = 6943;
SELECT * FROM activity_summary_logs where activity_id = 356001;
SELECT * FROM social_accounts WHERE sociable_id = 143;
# [PASSWORD_DOTS]
SELECT * FROM activities WHERE uuid_to_bin('0164a4fb-cb95-454e-9edd-4d804e4999bd') = uuid;
# 422515 softphone tr. 8100
SELECT * FROM activities WHERE uuid_to_bin('7520add8-8d87-41a5-98e5-fc4edf96f21e') = uuid;
# 407509 conference tr. 7670 crmId: 00UD1000002J9aTMAS
select * from ai_prompts where transcription_id IN (8100, 7670);
select * from activity_summary_logs where activity_id = 407509;
select * from sidekick_settings;
select * from default_activity_types;
SELECT * FROM contacts WHERE crm_configuration_id = 39 and email = '[EMAIL]';
SELECT * FROM leads WHERE crm_configuration_id = 39 and email = '[EMAIL]';
SELECT * FROM activity_searches where user_id = 143;
SELECT * FROM groups where team_id = 1;
select * from teams where id = 1;
select * from groups where team_id = 1; # 1150 - 7e75f8025c22
select id, name, group_id, status, deleted_at, email
from users where team_id = 1 order by group_id desc ;
select * from activity_searches where id in (1977, 1978, 1979);
select * from activity_search_filters where activity_search_id IN (1977, 1978, 1979);
select * from activity_search_filters where filter = 'group_id' and value = '443f26b8-8512-437e-a9f9-7e75f8025c22'; # 10268, 10272, 10277
select * from nudges where activity_search_id IN (1977, 1978, 1979); # 877, 878, 879
INSERT INTO `activity_search_filters`
(`activity_search_id`, `filter`, `value`) VALUES
(1977, 'group_id', '443f26b8-8512-437e-a9f9-7e75f8025c22'),
(1978, 'group_id', '443f26b8-8512-437e-a9f9-7e75f8025c22'),
(1979, 'group_id', '443f26b8-8512-437e-a9f9-7e75f8025c22')
;
select * from crm_configurations where id = 39;
select * from teams where id = 1;
select * from team_features where team_id = 1;
select * from features;
SELECT * FROM activity_searches where id = 1982; # 1981
SELECT * FROM activity_search_filters WHERE activity_search_id = 1982;
SELECT * FROM automated_reports where id = 68;
SELECT * FROM automated_report_results where id = 275;
SELECT * FROM automated_reports order by id desc;
SELECT * FROM automated_report_results order by id desc;
select * from activity_searches where user_id = 143;
select * from ask_anything_prompts;
SELECT * FROM groups WHERE id = 1439;
SELECT * FROM users WHERE group_id = 1439;
select * from permissions; # 158
select * from roles;
select * from permission_role
select * from teams where id = 1;
select * from groups g JOIN playbooks p on g.playbook_id = p.id where g.team_id = 1;
select * from groups where id = 28;
select * from playbooks where team_id = 1;
select * from playbooks where id = 179;
select * from playbook_categories where id = 1391;
select * from users where id = 143;
select * from crm_profiles where user_id = 143;
select * from activities where crm_configuration_id = 39 and type = 'conference'
and crm_provider_id IS NOT NULL ORDER by id desc;
select * from activities where id = 422003; # 00UO400000pB6fpMAC
SELECT ar.id, ar.uuid, ar.media_type, ar.status, a.type
FROM automated_report_results ar
JOIN automated_reports a ON a.id = ar.report_id
WHERE a.type = 'ask_jiminny'
LIMIT 10;
select * from teams where id = 3143;
select * from crm_configurations where id = 500;
select * from users where name = 'Integration Account'; # 1695
SELECT * FROM social_accounts WHERE sociable_id = 1695;
select * from activities where crm_configuration_id = 39
and recording_state = 'recorded' and duration > 60
and status = 'completed' and actual_start_time >= '2025-12-01'
SELECT * FROM activities WHERE uuid_to_bin('458cf915-b914-4000-b083-5687b32b2956') = uuid;
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"bounds":{"left":0.025930852,"top":0.019952115,"width":0.03856383,"height":0.025538707},"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"#11894 on JY-18909-automated-reports-ask-jiminny, menu","depth":5,"bounds":{"left":0.064494684,"top":0.019952115,"width":0.12134308,"height":0.025538707},"help_text":"Pull request #11894 exists for current branch JY-18909-automated-reports-ask-jiminny","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"bounds":{"left":0.8081782,"top":0.019952115,"width":0.011303191,"height":0.025538707},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"AskJiminnyReportActivityServiceTest","depth":6,"bounds":{"left":0.8234708,"top":0.019952115,"width":0.09208777,"height":0.025538707},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run 'AskJiminnyReportActivityServiceTest'","depth":6,"bounds":{"left":0.9155585,"top":0.019952115,"width":0.011303191,"height":0.025538707},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'AskJiminnyReportActivityServiceTest'","depth":6,"bounds":{"left":0.9268617,"top":0.019952115,"width":0.011303191,"height":0.025538707},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"More Actions","depth":6,"bounds":{"left":0.9381649,"top":0.019952115,"width":0.011303191,"height":0.025538707},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JetBrains AI","depth":5,"bounds":{"left":0.96609044,"top":0.019952115,"width":0.011303191,"height":0.025538707},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Search Everywhere","depth":5,"bounds":{"left":0.9773936,"top":0.019952115,"width":0.011303191,"height":0.025538707},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"IDE and Project Settings","depth":5,"bounds":{"left":0.9886968,"top":0.019952115,"width":0.011303186,"height":0.025538707},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.042220745,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"2","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.007978723,"height":0.0},"role_description":"text"},{"role":"AXStaticText","text":"3","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.007978723,"height":0.0},"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.00731383,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.006981383,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Tests\\Unit\\Services\\Kiosk\\AutomatedReports;\n\nuse Carbon\\CarbonImmutable;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinition\\ActivityActualDate;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinition\\ActivityUpdatedDate;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinition\\DealInsights\\ClosingPeriodFilter;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinitionCollection;\nuse Jiminny\\Component\\ActivitySearch\\Service\\ActivitySearch;\nuse Jiminny\\Models\\Activity\\Search;\nuse Jiminny\\Models\\Activity\\SearchFilter;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Repositories\\ElasticActivityRepository;\nuse Jiminny\\Services\\Kiosk\\AutomatedReports\\AskJiminnyReportActivityService;\nuse Jiminny\\Services\\Kiosk\\AutomatedReports\\AutomatedReportsService;\nuse Jiminny\\VO\\Repository\\OnDemandActivitySearch\\Criteria;\nuse PHPUnit\\Framework\\MockObject\\MockObject;\nuse PHPUnit\\Framework\\TestCase;\nuse Psr\\Log\\LoggerInterface;\n\nclass AskJiminnyReportActivityServiceTest extends TestCase\n{\n private ActivitySearch&MockObject $activitySearch;\n private ElasticActivityRepository&MockObject $elasticRepository;\n private LoggerInterface&MockObject $logger;\n private AskJiminnyReportActivityService $service;\n\n protected function setUp(): void\n {\n $this->activitySearch = $this->createMock(ActivitySearch::class);\n $this->elasticRepository = $this->createMock(ElasticActivityRepository::class);\n $this->logger = $this->createMock(LoggerInterface::class);\n\n $this->service = new AskJiminnyReportActivityService(\n $this->activitySearch,\n $this->elasticRepository,\n $this->logger,\n );\n }\n\n private function makeFilter(string $key, ?string $value): SearchFilter&MockObject\n {\n $filter = $this->createMock(SearchFilter::class);\n $filter->method('getFilterProperty')->willReturn($key);\n $filter->method('getFilterValue')->willReturn($value);\n\n return $filter;\n }\n\n private function makeUser(): User&MockObject\n {\n $tz = new \\DateTimeZone('UTC');\n $user = $this->createMock(User::class);\n $user->method('getTimezone')->willReturn($tz);\n $user->method('getId')->willReturn(1);\n $user->method('getUuid')->willReturn('user-uuid');\n\n return $user;\n }\n\n private function makeSavedSearch(array $filters): Search&MockObject\n {\n $savedSearch = $this->createMock(Search::class);\n $savedSearch->method('getId')->willReturn(42);\n $savedSearch->method('getFilters')->willReturn(new \\Illuminate\\Support\\LazyCollection($filters));\n\n return $savedSearch;\n }\n\n public function testGetActivityIdsForSavedSearchReturnsIds(): void\n {\n $user = $this->makeUser();\n $savedSearch = $this->makeSavedSearch([]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->expects($this->once())\n ->method('getArrayFilterKeys')\n ->with($user)\n ->willReturn([]);\n\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturn($filterSet);\n\n $this->elasticRepository->expects($this->once())\n ->method('onDemandSearchIdsOnly')\n ->willReturn(['id-1', 'id-2', 'id-3']);\n\n $this->logger->expects($this->once())\n ->method('info')\n ->with('[AskJiminnyReport] Fetched activity IDs for saved search');\n\n $result = $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertEquals(['id-1', 'id-2', 'id-3'], $result);\n }\n\n public function testGetActivityIdsForSavedSearchReturnsEmptyWhenNoResults(): void\n {\n $user = $this->makeUser();\n $savedSearch = $this->makeSavedSearch([]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->activitySearch->method('getOnDemandPageFilterSet')->willReturn($filterSet);\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);\n\n $this->logger->expects($this->once())->method('info');\n\n $result = $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertEmpty($result);\n }\n\n public function testGetActivityIdsFiltersOutDateFilters(): void\n {\n $user = $this->makeUser();\n\n $nonDateFilter = $this->makeFilter('owner_id', '123');\n $startDateFilter = $this->makeFilter(ActivityActualDate::PARAM_START_DATE, '2025-01-01 00:00:00');\n $endDateFilter = $this->makeFilter(ActivityActualDate::PARAM_END_DATE, '2025-01-31 23:59:59');\n $updatedFromFilter = $this->makeFilter(ActivityUpdatedDate::PARAM_UPDATED_FROM, '2025-01-01 00:00:00');\n $updatedToFilter = $this->makeFilter(ActivityUpdatedDate::PARAM_UPDATED_TO, '2025-01-31 23:59:59');\n\n $savedSearch = $this->makeSavedSearch([\n $nonDateFilter,\n $startDateFilter,\n $endDateFilter,\n $updatedFromFilter,\n $updatedToFilter,\n ]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n\n $capturedCriteria = null;\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {\n $capturedCriteria = $criteria;\n\n return $filterSet;\n });\n\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);\n $this->logger->method('info');\n\n $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertNotNull($capturedCriteria);\n }\n\n public function testGetActivityIdsFiltersOutClosingPeriodDateFilters(): void\n {\n $user = $this->makeUser();\n\n $closingStartFilter = $this->makeFilter(ClosingPeriodFilter::KEY_START_DATE, '2025-01-01');\n $closingEndFilter = $this->makeFilter(ClosingPeriodFilter::KEY_END_DATE, '2025-03-31');\n $regularFilter = $this->makeFilter('rep_id', '99');\n\n $savedSearch = $this->makeSavedSearch([\n $closingStartFilter,\n $closingEndFilter,\n $regularFilter,\n ]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturn($filterSet);\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn(['id-1']);\n $this->logger->method('info');\n\n $result = $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertEquals(['id-1'], $result);\n }\n\n public function testGetActivityIdsHandlesArrayFilters(): void\n {\n $user = $this->makeUser();\n\n $filter1 = $this->makeFilter('outcome', 'positive');\n $filter2 = $this->makeFilter('outcome', 'negative');\n\n $savedSearch = $this->makeSavedSearch([$filter1, $filter2]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn(['outcome']);\n $this->activitySearch->method('getOnDemandPageFilterSet')->willReturn($filterSet);\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn(['id-1']);\n $this->logger->method('info');\n\n $result = $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertEquals(['id-1'], $result);\n }\n\n public function testGetActivityIdsHandlesScalarFilters(): void\n {\n $user = $this->makeUser();\n\n $filter = $this->makeFilter('direction', 'inbound');\n $savedSearch = $this->makeSavedSearch([$filter]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->activitySearch->method('getOnDemandPageFilterSet')->willReturn($filterSet);\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn(['id-5']);\n $this->logger->method('info');\n\n $result = $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertEquals(['id-5'], $result);\n }\n\n public function testGetActivityIdsPassesNonZeroSequenceNumberToDisableFirstRequestDefaults(): void\n {\n $user = $this->makeUser();\n $savedSearch = $this->makeSavedSearch([]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n\n $capturedCriteria = null;\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {\n $capturedCriteria = $criteria;\n\n return $filterSet;\n });\n\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);\n $this->logger->method('info');\n\n $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertNotNull($capturedCriteria);\n $this->assertFalse($capturedCriteria->isFirstRequest());\n }\n\n public function testGetActivityIdsLogsWithCorrectContext(): void\n {\n $user = $this->makeUser();\n $savedSearch = $this->makeSavedSearch([]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->activitySearch->method('getOnDemandPageFilterSet')->willReturn($filterSet);\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn(['a', 'b']);\n\n $this->logger->expects($this->once())\n ->method('info')\n ->with(\n '[AskJiminnyReport] Fetched activity IDs for saved search',\n $this->callback(fn ($context) => $context['saved_search_id'] === 42\n && $context['user_id'] === 1\n && $context['activity_count'] === 2)\n );\n\n $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n }\n\n public static function frequencyDateRangeProvider(): array\n {\n return [\n 'daily' => [\n AutomatedReportsService::FREQUENCY_DAILY,\n '2025-06-15 00:00:00',\n '2025-06-15 23:59:59',\n ],\n 'weekly' => [\n AutomatedReportsService::FREQUENCY_WEEKLY,\n '2025-06-09 00:00:00',\n '2025-06-15 23:59:59',\n ],\n 'monthly' => [\n AutomatedReportsService::FREQUENCY_MONTHLY,\n '2025-05-01 00:00:00',\n '2025-05-31 23:59:59',\n ],\n 'quarterly' => [\n AutomatedReportsService::FREQUENCY_QUARTERLY,\n '2025-01-01 00:00:00',\n '2025-03-31 23:59:59',\n ],\n ];\n }\n\n /**\n * @dataProvider frequencyDateRangeProvider\n */\n public function testGetActivityIdsInjectsDateRangeForFrequency(\n string $frequency,\n string $expectedStartDate,\n string $expectedEndDate,\n ): void {\n CarbonImmutable::setTestNow('2025-06-16 12:00:00');\n\n try {\n $user = $this->makeUser();\n $savedSearch = $this->makeSavedSearch([]);\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->logger->method('info');\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);\n\n $capturedCriteria = null;\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {\n $capturedCriteria = $criteria;\n\n return $filterSet;\n });\n\n $this->service->getActivityIdsForSavedSearch($savedSearch, $user, $frequency);\n\n $this->assertNotNull($capturedCriteria);\n $this->assertSame($expectedStartDate, $capturedCriteria->getStartDate()->format('Y-m-d H:i:s'));\n $this->assertSame($expectedEndDate, $capturedCriteria->getEndDate()->format('Y-m-d H:i:s'));\n } finally {\n CarbonImmutable::setTestNow();\n }\n }\n\n public function testGetActivityIdsWithNullFrequencyDoesNotInjectDates(): void\n {\n $user = $this->makeUser();\n $savedSearch = $this->makeSavedSearch([]);\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->logger->method('info');\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);\n\n $capturedCriteria = null;\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {\n $capturedCriteria = $criteria;\n\n return $filterSet;\n });\n\n $this->service->getActivityIdsForSavedSearch($savedSearch, $user, null);\n\n $this->assertNotNull($capturedCriteria);\n $this->assertNull($capturedCriteria->getStartDate());\n $this->assertNull($capturedCriteria->getEndDate());\n }\n\n public function testGetActivityIdsWithUnknownFrequencyDoesNotInjectDates(): void\n {\n $user = $this->makeUser();\n $savedSearch = $this->makeSavedSearch([]);\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->logger->method('info');\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);\n\n $capturedCriteria = null;\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {\n $capturedCriteria = $criteria;\n\n return $filterSet;\n });\n\n $this->service->getActivityIdsForSavedSearch($savedSearch, $user, AutomatedReportsService::FREQUENCY_ONE_OFF);\n\n $this->assertNotNull($capturedCriteria);\n $this->assertNull($capturedCriteria->getStartDate());\n $this->assertNull($capturedCriteria->getEndDate());\n }\n\n public function testGetActivityIdsFrequencyDateRangeOverridesSavedSearchDateFilters(): void\n {\n CarbonImmutable::setTestNow('2025-06-16 12:00:00');\n\n try {\n $user = $this->makeUser();\n\n $startDateFilter = $this->makeFilter(ActivityActualDate::PARAM_START_DATE, '2024-01-01 00:00:00');\n $endDateFilter = $this->makeFilter(ActivityActualDate::PARAM_END_DATE, '2024-12-31 23:59:59');\n $savedSearch = $this->makeSavedSearch([$startDateFilter, $endDateFilter]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->logger->method('info');\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);\n\n $capturedCriteria = null;\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {\n $capturedCriteria = $criteria;\n\n return $filterSet;\n });\n\n $this->service->getActivityIdsForSavedSearch($savedSearch, $user, AutomatedReportsService::FREQUENCY_DAILY);\n\n $this->assertNotNull($capturedCriteria);\n $this->assertSame('2025-06-15 00:00:00', $capturedCriteria->getStartDate()->format('Y-m-d H:i:s'));\n $this->assertSame('2025-06-15 23:59:59', $capturedCriteria->getEndDate()->format('Y-m-d H:i:s'));\n } finally {\n CarbonImmutable::setTestNow();\n }\n }\n}","depth":4,"bounds":{"left":0.13863032,"top":0.27055067,"width":0.34375,"height":0.72944933},"value":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Tests\\Unit\\Services\\Kiosk\\AutomatedReports;\n\nuse Carbon\\CarbonImmutable;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinition\\ActivityActualDate;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinition\\ActivityUpdatedDate;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinition\\DealInsights\\ClosingPeriodFilter;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinitionCollection;\nuse Jiminny\\Component\\ActivitySearch\\Service\\ActivitySearch;\nuse Jiminny\\Models\\Activity\\Search;\nuse Jiminny\\Models\\Activity\\SearchFilter;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Repositories\\ElasticActivityRepository;\nuse Jiminny\\Services\\Kiosk\\AutomatedReports\\AskJiminnyReportActivityService;\nuse Jiminny\\Services\\Kiosk\\AutomatedReports\\AutomatedReportsService;\nuse Jiminny\\VO\\Repository\\OnDemandActivitySearch\\Criteria;\nuse PHPUnit\\Framework\\MockObject\\MockObject;\nuse PHPUnit\\Framework\\TestCase;\nuse Psr\\Log\\LoggerInterface;\n\nclass AskJiminnyReportActivityServiceTest extends TestCase\n{\n private ActivitySearch&MockObject $activitySearch;\n private ElasticActivityRepository&MockObject $elasticRepository;\n private LoggerInterface&MockObject $logger;\n private AskJiminnyReportActivityService $service;\n\n protected function setUp(): void\n {\n $this->activitySearch = $this->createMock(ActivitySearch::class);\n $this->elasticRepository = $this->createMock(ElasticActivityRepository::class);\n $this->logger = $this->createMock(LoggerInterface::class);\n\n $this->service = new AskJiminnyReportActivityService(\n $this->activitySearch,\n $this->elasticRepository,\n $this->logger,\n );\n }\n\n private function makeFilter(string $key, ?string $value): SearchFilter&MockObject\n {\n $filter = $this->createMock(SearchFilter::class);\n $filter->method('getFilterProperty')->willReturn($key);\n $filter->method('getFilterValue')->willReturn($value);\n\n return $filter;\n }\n\n private function makeUser(): User&MockObject\n {\n $tz = new \\DateTimeZone('UTC');\n $user = $this->createMock(User::class);\n $user->method('getTimezone')->willReturn($tz);\n $user->method('getId')->willReturn(1);\n $user->method('getUuid')->willReturn('user-uuid');\n\n return $user;\n }\n\n private function makeSavedSearch(array $filters): Search&MockObject\n {\n $savedSearch = $this->createMock(Search::class);\n $savedSearch->method('getId')->willReturn(42);\n $savedSearch->method('getFilters')->willReturn(new \\Illuminate\\Support\\LazyCollection($filters));\n\n return $savedSearch;\n }\n\n public function testGetActivityIdsForSavedSearchReturnsIds(): void\n {\n $user = $this->makeUser();\n $savedSearch = $this->makeSavedSearch([]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->expects($this->once())\n ->method('getArrayFilterKeys')\n ->with($user)\n ->willReturn([]);\n\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturn($filterSet);\n\n $this->elasticRepository->expects($this->once())\n ->method('onDemandSearchIdsOnly')\n ->willReturn(['id-1', 'id-2', 'id-3']);\n\n $this->logger->expects($this->once())\n ->method('info')\n ->with('[AskJiminnyReport] Fetched activity IDs for saved search');\n\n $result = $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertEquals(['id-1', 'id-2', 'id-3'], $result);\n }\n\n public function testGetActivityIdsForSavedSearchReturnsEmptyWhenNoResults(): void\n {\n $user = $this->makeUser();\n $savedSearch = $this->makeSavedSearch([]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->activitySearch->method('getOnDemandPageFilterSet')->willReturn($filterSet);\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);\n\n $this->logger->expects($this->once())->method('info');\n\n $result = $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertEmpty($result);\n }\n\n public function testGetActivityIdsFiltersOutDateFilters(): void\n {\n $user = $this->makeUser();\n\n $nonDateFilter = $this->makeFilter('owner_id', '123');\n $startDateFilter = $this->makeFilter(ActivityActualDate::PARAM_START_DATE, '2025-01-01 00:00:00');\n $endDateFilter = $this->makeFilter(ActivityActualDate::PARAM_END_DATE, '2025-01-31 23:59:59');\n $updatedFromFilter = $this->makeFilter(ActivityUpdatedDate::PARAM_UPDATED_FROM, '2025-01-01 00:00:00');\n $updatedToFilter = $this->makeFilter(ActivityUpdatedDate::PARAM_UPDATED_TO, '2025-01-31 23:59:59');\n\n $savedSearch = $this->makeSavedSearch([\n $nonDateFilter,\n $startDateFilter,\n $endDateFilter,\n $updatedFromFilter,\n $updatedToFilter,\n ]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n\n $capturedCriteria = null;\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {\n $capturedCriteria = $criteria;\n\n return $filterSet;\n });\n\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);\n $this->logger->method('info');\n\n $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertNotNull($capturedCriteria);\n }\n\n public function testGetActivityIdsFiltersOutClosingPeriodDateFilters(): void\n {\n $user = $this->makeUser();\n\n $closingStartFilter = $this->makeFilter(ClosingPeriodFilter::KEY_START_DATE, '2025-01-01');\n $closingEndFilter = $this->makeFilter(ClosingPeriodFilter::KEY_END_DATE, '2025-03-31');\n $regularFilter = $this->makeFilter('rep_id', '99');\n\n $savedSearch = $this->makeSavedSearch([\n $closingStartFilter,\n $closingEndFilter,\n $regularFilter,\n ]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturn($filterSet);\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn(['id-1']);\n $this->logger->method('info');\n\n $result = $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertEquals(['id-1'], $result);\n }\n\n public function testGetActivityIdsHandlesArrayFilters(): void\n {\n $user = $this->makeUser();\n\n $filter1 = $this->makeFilter('outcome', 'positive');\n $filter2 = $this->makeFilter('outcome', 'negative');\n\n $savedSearch = $this->makeSavedSearch([$filter1, $filter2]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn(['outcome']);\n $this->activitySearch->method('getOnDemandPageFilterSet')->willReturn($filterSet);\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn(['id-1']);\n $this->logger->method('info');\n\n $result = $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertEquals(['id-1'], $result);\n }\n\n public function testGetActivityIdsHandlesScalarFilters(): void\n {\n $user = $this->makeUser();\n\n $filter = $this->makeFilter('direction', 'inbound');\n $savedSearch = $this->makeSavedSearch([$filter]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->activitySearch->method('getOnDemandPageFilterSet')->willReturn($filterSet);\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn(['id-5']);\n $this->logger->method('info');\n\n $result = $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertEquals(['id-5'], $result);\n }\n\n public function testGetActivityIdsPassesNonZeroSequenceNumberToDisableFirstRequestDefaults(): void\n {\n $user = $this->makeUser();\n $savedSearch = $this->makeSavedSearch([]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n\n $capturedCriteria = null;\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {\n $capturedCriteria = $criteria;\n\n return $filterSet;\n });\n\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);\n $this->logger->method('info');\n\n $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertNotNull($capturedCriteria);\n $this->assertFalse($capturedCriteria->isFirstRequest());\n }\n\n public function testGetActivityIdsLogsWithCorrectContext(): void\n {\n $user = $this->makeUser();\n $savedSearch = $this->makeSavedSearch([]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->activitySearch->method('getOnDemandPageFilterSet')->willReturn($filterSet);\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn(['a', 'b']);\n\n $this->logger->expects($this->once())\n ->method('info')\n ->with(\n '[AskJiminnyReport] Fetched activity IDs for saved search',\n $this->callback(fn ($context) => $context['saved_search_id'] === 42\n && $context['user_id'] === 1\n && $context['activity_count'] === 2)\n );\n\n $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n }\n\n public static function frequencyDateRangeProvider(): array\n {\n return [\n 'daily' => [\n AutomatedReportsService::FREQUENCY_DAILY,\n '2025-06-15 00:00:00',\n '2025-06-15 23:59:59',\n ],\n 'weekly' => [\n AutomatedReportsService::FREQUENCY_WEEKLY,\n '2025-06-09 00:00:00',\n '2025-06-15 23:59:59',\n ],\n 'monthly' => [\n AutomatedReportsService::FREQUENCY_MONTHLY,\n '2025-05-01 00:00:00',\n '2025-05-31 23:59:59',\n ],\n 'quarterly' => [\n AutomatedReportsService::FREQUENCY_QUARTERLY,\n '2025-01-01 00:00:00',\n '2025-03-31 23:59:59',\n ],\n ];\n }\n\n /**\n * @dataProvider frequencyDateRangeProvider\n */\n public function testGetActivityIdsInjectsDateRangeForFrequency(\n string $frequency,\n string $expectedStartDate,\n string $expectedEndDate,\n ): void {\n CarbonImmutable::setTestNow('2025-06-16 12:00:00');\n\n try {\n $user = $this->makeUser();\n $savedSearch = $this->makeSavedSearch([]);\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->logger->method('info');\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);\n\n $capturedCriteria = null;\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {\n $capturedCriteria = $criteria;\n\n return $filterSet;\n });\n\n $this->service->getActivityIdsForSavedSearch($savedSearch, $user, $frequency);\n\n $this->assertNotNull($capturedCriteria);\n $this->assertSame($expectedStartDate, $capturedCriteria->getStartDate()->format('Y-m-d H:i:s'));\n $this->assertSame($expectedEndDate, $capturedCriteria->getEndDate()->format('Y-m-d H:i:s'));\n } finally {\n CarbonImmutable::setTestNow();\n }\n }\n\n public function testGetActivityIdsWithNullFrequencyDoesNotInjectDates(): void\n {\n $user = $this->makeUser();\n $savedSearch = $this->makeSavedSearch([]);\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->logger->method('info');\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);\n\n $capturedCriteria = null;\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {\n $capturedCriteria = $criteria;\n\n return $filterSet;\n });\n\n $this->service->getActivityIdsForSavedSearch($savedSearch, $user, null);\n\n $this->assertNotNull($capturedCriteria);\n $this->assertNull($capturedCriteria->getStartDate());\n $this->assertNull($capturedCriteria->getEndDate());\n }\n\n public function testGetActivityIdsWithUnknownFrequencyDoesNotInjectDates(): void\n {\n $user = $this->makeUser();\n $savedSearch = $this->makeSavedSearch([]);\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->logger->method('info');\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);\n\n $capturedCriteria = null;\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {\n $capturedCriteria = $criteria;\n\n return $filterSet;\n });\n\n $this->service->getActivityIdsForSavedSearch($savedSearch, $user, AutomatedReportsService::FREQUENCY_ONE_OFF);\n\n $this->assertNotNull($capturedCriteria);\n $this->assertNull($capturedCriteria->getStartDate());\n $this->assertNull($capturedCriteria->getEndDate());\n }\n\n public function testGetActivityIdsFrequencyDateRangeOverridesSavedSearchDateFilters(): void\n {\n CarbonImmutable::setTestNow('2025-06-16 12:00:00');\n\n try {\n $user = $this->makeUser();\n\n $startDateFilter = $this->makeFilter(ActivityActualDate::PARAM_START_DATE, '2024-01-01 00:00:00');\n $endDateFilter = $this->makeFilter(ActivityActualDate::PARAM_END_DATE, '2024-12-31 23:59:59');\n $savedSearch = $this->makeSavedSearch([$startDateFilter, $endDateFilter]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->logger->method('info');\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);\n\n $capturedCriteria = null;\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {\n $capturedCriteria = $criteria;\n\n return $filterSet;\n });\n\n $this->service->getActivityIdsForSavedSearch($savedSearch, $user, AutomatedReportsService::FREQUENCY_DAILY);\n\n $this->assertNotNull($capturedCriteria);\n $this->assertSame('2025-06-15 00:00:00', $capturedCriteria->getStartDate()->format('Y-m-d H:i:s'));\n $this->assertSame('2025-06-15 23:59:59', $capturedCriteria->getEndDate()->format('Y-m-d H:i:s'));\n } finally {\n CarbonImmutable::setTestNow();\n }\n }\n}","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Execute","depth":4,"bounds":{"left":0.40492022,"top":0.09896249,"width":0.008643617,"height":0.01915403},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Explain Plan","depth":4,"bounds":{"left":0.41356382,"top":0.09896249,"width":0.008643617,"height":0.01915403},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Browse Query History","depth":4,"bounds":{"left":0.4245346,"top":0.09896249,"width":0.008643617,"height":0.01915403},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"View Parameters","depth":4,"bounds":{"left":0.4331782,"top":0.09896249,"width":0.008643617,"height":0.01915403},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Open Query Execution Settings…","depth":4,"bounds":{"left":0.4418218,"top":0.09896249,"width":0.008643617,"height":0.01915403},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"In-Editor Results","depth":4,"bounds":{"left":0.45279256,"top":0.09896249,"width":0.008643617,"height":0.01915403},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Tx: Auto","depth":4,"bounds":{"left":0.4637633,"top":0.09896249,"width":0.024268618,"height":0.01915403},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Cancel Running Statements","depth":4,"bounds":{"left":0.49035904,"top":0.09896249,"width":0.008643617,"height":0.01915403},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Playground","depth":4,"bounds":{"left":0.5013298,"top":0.09896249,"width":0.029587766,"height":0.01915403},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"jiminny","depth":4,"bounds":{"left":0.69913566,"top":0.09896249,"width":0.02825798,"height":0.01915403},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.042220745,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"10","depth":4,"bounds":{"left":0.6715425,"top":0.123703115,"width":0.009640957,"height":0.015163607},"role_description":"text"},{"role":"AXStaticText","text":"12","depth":4,"bounds":{"left":0.6831782,"top":0.123703115,"width":0.009640957,"height":0.015163607},"role_description":"text"},{"role":"AXStaticText","text":"2","depth":4,"bounds":{"left":0.69481385,"top":0.123703115,"width":0.007978723,"height":0.015163607},"role_description":"text"},{"role":"AXStaticText","text":"4","depth":4,"bounds":{"left":0.70478725,"top":0.123703115,"width":0.007978723,"height":0.015163607},"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.7144282,"top":0.12210695,"width":0.00731383,"height":0.018355945},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"bounds":{"left":0.72174203,"top":0.12210695,"width":0.006981383,"height":0.018355945},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"SELECT a.id, a.uuid, a.actual_start_time, o.id, o.uuid FROM opportunities o\nJOIN activities a ON o.id = a.opportunity_id\nWHERE a.crm_configuration_id = 39\nAND a.actual_start_time > '2025-10-13'\nAND a.type IN ('conference', 'softphone-inbound', 'softphone-outbound')\n;\n\nSELECT * FROM activities\nWHERE crm_configuration_id = 39 and user_id = 143\nand actual_start_time >= '2025-10-13'\nAND type IN ('conference', 'softphone-inbound', 'softphone-outbound')\n;\n\nSELECT * FROM opportunities WHERE account_id IN (178);\nselect * from activities where id IN (620137, 620187, 620188, 620189, 620230);\n\n# HS\nSELECT * FROM opportunities WHERE id IN (238);\nselect * from activities where id IN (477,2076);\n\nselect * from users;\n\nSELECT COUNT(*) FROM users;\nSELECT COUNT(*) FROM activities;\nSELECT COUNT(*) FROM opportunities;\n\nUPDATE activities\nSET\n actual_start_time = '2025-12-19 09:00:00',\n actual_end_time = '2025-12-19 10:30:00',\n scheduled_start_time = '2025-12-19 09:00:00',\n scheduled_end_time = '2025-12-19 10:30:00'\nWHERE id IN (407509,407375);\n\nselect * from partners;\n\nSELECT id, uuid, type, actual_start_time, user_id, crm_configuration_id\nFROM activities\nWHERE user_id = 143\nAND actual_start_time >= '2025-10-13 00:00:00'\nAND actual_start_time <= '2026-01-13 23:59:59'\nORDER BY actual_start_time DESC;\n\nSELECT * FROM activities WHERE uuid_to_bin('78eda160-3086-435f-88a5-bb0c71b6008d') = uuid;\nSELECT * FROM crm_layouts where crm_configuration_id = 39;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 282;\n# lead_id\n# account_id 177\n# contact_id 3969\n# opportunity_id\n# stage_id 203\n\nSELECT * FROM opportunities WHERE opportunities.crm_configuration_id = id = 282;\n\nSELECT * FROM activities where crm_configuration_id = 39 AND type = 'conference'\nAND user_id = 143 and actual_start_time >= '2025-10-13';\n\nSELECT * FROM activities a\n# JOIN opportunities o ON a.opportunity_id = o.id\nWHERE a.crm_configuration_id = 39 AND a.type = 'conference'\nand status = 'completed' and recording_state = 'recorded'\nand a.actual_start_time >= '2025-10-13'\nAND a.user_id = 143\n;\n\nselect * from leads\nwhere crm_configuration_id = 39; # 112 -> ac. 178, 109 => op. 1707\n\nSELECT * FROM activities WHERE id IN (356013,616188,616202,616310,407509,407375,356001,356008);\nSELECT * FROM activities WHERE id IN (356013,616188,616202,616310);\nSELECT * FROM activities WHERE id IN (407509,407375); # leads: 112, 109 | status - 198\nSELECT * FROM activities WHERE id IN (356001, 356008); # contacts:\n\nSELECT * FROM opportunities WHERE id IN (1707);\nSELECT * FROM stages where id IN (204, 198);\nSELECT * FROM opportunities WHERE account_id IN (178);\nSELECT * FROM opportunities WHERE crm_configuration_id = 39 AND created_at > '2025-01-01';\nSELECT * FROM contacts WHERE account_id IN (178); # 4118 Musaibe, 4448 Ceco Personal\n\nSELECT * FROM activities where crm_configuration_id = 39\nAND opportunity_id IS NULL\nAND is_internal = false\nand status = 'completed' and recording_state = 'recorded'\nAND actual_start_time >= '2025-10-13'\nAND (lead_id IS NOT NULL OR contact_id IS NOT NULL OR account_id IS NOT NULL)\n# AND lead_id IN (112, 109)\n;\n\nSELECT * FROM crm_profiles WHERE user_id = 143;\n\nselect * from inboxes; # 212\nselect * from users where id = 143; # 143\nselect * from inbox_email_batches where inbox_id = 212\nand updated_at >= '2026-01-28 00:00:00' order by id desc;\nselect * from inbox_emails where inbox_id = 212\nand batch_id = 95885 order by id desc;\nselect * from email_messages where origin_user_id = 143;\nselect * from activities where user_id = 143 and updated_at >= '2026-01-28 00:00:00';\nselect * from participants where activity_id = 620247;\n\nselect * from crm_profiles where user_id = 143;\n\nSELECT * FROM activities WHERE uuid_to_bin('458cf915-b914-4000-b083-5687b32b2956') = uuid; # 356001\nselect * from transcription where activity_id = 356001; # 6943\nselect * from ai_prompts where transcription_id = 6943;\nSELECT * FROM activity_summary_logs where activity_id = 356001;\n\nSELECT * FROM social_accounts WHERE sociable_id = 143;\n\n# ************************************************************************************\nSELECT * FROM activities WHERE uuid_to_bin('0164a4fb-cb95-454e-9edd-4d804e4999bd') = uuid;\n# 422515 softphone tr. 8100\n\nSELECT * FROM activities WHERE uuid_to_bin('7520add8-8d87-41a5-98e5-fc4edf96f21e') = uuid;\n# 407509 conference tr. 7670 crmId: 00UD1000002J9aTMAS\n\nselect * from ai_prompts where transcription_id IN (8100, 7670);\nselect * from activity_summary_logs where activity_id = 407509;\n\nselect * from sidekick_settings;\nselect * from default_activity_types;\n\nSELECT * FROM contacts WHERE crm_configuration_id = 39 and email = 'm.kogoj@gmx.at';\nSELECT * FROM leads WHERE crm_configuration_id = 39 and email = 'm.kogoj@gmx.at';\n\nSELECT * FROM activity_searches where user_id = 143;\nSELECT * FROM groups where team_id = 1;\n\nselect * from teams where id = 1;\nselect * from groups where team_id = 1; # 1150 - 7e75f8025c22\nselect id, name, group_id, status, deleted_at, email\nfrom users where team_id = 1 order by group_id desc ;\n\nselect * from activity_searches where id in (1977, 1978, 1979);\nselect * from activity_search_filters where activity_search_id IN (1977, 1978, 1979);\nselect * from activity_search_filters where filter = 'group_id' and value = '443f26b8-8512-437e-a9f9-7e75f8025c22'; # 10268, 10272, 10277\nselect * from nudges where activity_search_id IN (1977, 1978, 1979); # 877, 878, 879\n\nINSERT INTO `activity_search_filters`\n(`activity_search_id`, `filter`, `value`) VALUES\n(1977, 'group_id', '443f26b8-8512-437e-a9f9-7e75f8025c22'),\n(1978, 'group_id', '443f26b8-8512-437e-a9f9-7e75f8025c22'),\n(1979, 'group_id', '443f26b8-8512-437e-a9f9-7e75f8025c22')\n;\n\nselect * from crm_configurations where id = 39;\n\nselect * from teams where id = 1;\nselect * from team_features where team_id = 1;\nselect * from features;\n\nSELECT * FROM activity_searches where id = 1982; # 1981\nSELECT * FROM activity_search_filters WHERE activity_search_id = 1982;\n\nSELECT * FROM automated_reports where id = 68;\nSELECT * FROM automated_report_results where id = 275;\n\nSELECT * FROM automated_reports order by id desc;\nSELECT * FROM automated_report_results order by id desc;\nselect * from activity_searches where user_id = 143;\nselect * from ask_anything_prompts;\n\nSELECT * FROM groups WHERE id = 1439;\nSELECT * FROM users WHERE group_id = 1439;\n\nselect * from permissions; # 158\nselect * from roles;\nselect * from permission_role\n\nselect * from teams where id = 1;\nselect * from groups g JOIN playbooks p on g.playbook_id = p.id where g.team_id = 1;\nselect * from groups where id = 28;\nselect * from playbooks where team_id = 1;\nselect * from playbooks where id = 179;\nselect * from playbook_categories where id = 1391;\nselect * from users where id = 143;\nselect * from crm_profiles where user_id = 143;\nselect * from activities where crm_configuration_id = 39 and type = 'conference'\nand crm_provider_id IS NOT NULL ORDER by id desc;\nselect * from activities where id = 422003; # 00UO400000pB6fpMAC\n\nSELECT ar.id, ar.uuid, ar.media_type, ar.status, a.type\nFROM automated_report_results ar\nJOIN automated_reports a ON a.id = ar.report_id\nWHERE a.type = 'ask_jiminny'\nLIMIT 10;\n\n\nselect * from teams where id = 3143;\nselect * from crm_configurations where id = 500;\nselect * from users where name = 'Integration Account'; # 1695\nSELECT * FROM social_accounts WHERE sociable_id = 1695;\n\nselect * from activities where crm_configuration_id = 39\nand recording_state = 'recorded' and duration > 60\nand status = 'completed' and actual_start_time >= '2025-12-01'\n\nSELECT * FROM activities WHERE uuid_to_bin('458cf915-b914-4000-b083-5687b32b2956') = uuid;","depth":4,"value":"SELECT a.id, a.uuid, a.actual_start_time, o.id, o.uuid FROM opportunities o\nJOIN activities a ON o.id = a.opportunity_id\nWHERE a.crm_configuration_id = 39\nAND a.actual_start_time > '2025-10-13'\nAND a.type IN ('conference', 'softphone-inbound', 'softphone-outbound')\n;\n\nSELECT * FROM activities\nWHERE crm_configuration_id = 39 and user_id = 143\nand actual_start_time >= '2025-10-13'\nAND type IN ('conference', 'softphone-inbound', 'softphone-outbound')\n;\n\nSELECT * FROM opportunities WHERE account_id IN (178);\nselect * from activities where id IN (620137, 620187, 620188, 620189, 620230);\n\n# HS\nSELECT * FROM opportunities WHERE id IN (238);\nselect * from activities where id IN (477,2076);\n\nselect * from users;\n\nSELECT COUNT(*) FROM users;\nSELECT COUNT(*) FROM activities;\nSELECT COUNT(*) FROM opportunities;\n\nUPDATE activities\nSET\n actual_start_time = '2025-12-19 09:00:00',\n actual_end_time = '2025-12-19 10:30:00',\n scheduled_start_time = '2025-12-19 09:00:00',\n scheduled_end_time = '2025-12-19 10:30:00'\nWHERE id IN (407509,407375);\n\nselect * from partners;\n\nSELECT id, uuid, type, actual_start_time, user_id, crm_configuration_id\nFROM activities\nWHERE user_id = 143\nAND actual_start_time >= '2025-10-13 00:00:00'\nAND actual_start_time <= '2026-01-13 23:59:59'\nORDER BY actual_start_time DESC;\n\nSELECT * FROM activities WHERE uuid_to_bin('78eda160-3086-435f-88a5-bb0c71b6008d') = uuid;\nSELECT * FROM crm_layouts where crm_configuration_id = 39;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 282;\n# lead_id\n# account_id 177\n# contact_id 3969\n# opportunity_id\n# stage_id 203\n\nSELECT * FROM opportunities WHERE opportunities.crm_configuration_id = id = 282;\n\nSELECT * FROM activities where crm_configuration_id = 39 AND type = 'conference'\nAND user_id = 143 and actual_start_time >= '2025-10-13';\n\nSELECT * FROM activities a\n# JOIN opportunities o ON a.opportunity_id = o.id\nWHERE a.crm_configuration_id = 39 AND a.type = 'conference'\nand status = 'completed' and recording_state = 'recorded'\nand a.actual_start_time >= '2025-10-13'\nAND a.user_id = 143\n;\n\nselect * from leads\nwhere crm_configuration_id = 39; # 112 -> ac. 178, 109 => op. 1707\n\nSELECT * FROM activities WHERE id IN (356013,616188,616202,616310,407509,407375,356001,356008);\nSELECT * FROM activities WHERE id IN (356013,616188,616202,616310);\nSELECT * FROM activities WHERE id IN (407509,407375); # leads: 112, 109 | status - 198\nSELECT * FROM activities WHERE id IN (356001, 356008); # contacts:\n\nSELECT * FROM opportunities WHERE id IN (1707);\nSELECT * FROM stages where id IN (204, 198);\nSELECT * FROM opportunities WHERE account_id IN (178);\nSELECT * FROM opportunities WHERE crm_configuration_id = 39 AND created_at > '2025-01-01';\nSELECT * FROM contacts WHERE account_id IN (178); # 4118 Musaibe, 4448 Ceco Personal\n\nSELECT * FROM activities where crm_configuration_id = 39\nAND opportunity_id IS NULL\nAND is_internal = false\nand status = 'completed' and recording_state = 'recorded'\nAND actual_start_time >= '2025-10-13'\nAND (lead_id IS NOT NULL OR contact_id IS NOT NULL OR account_id IS NOT NULL)\n# AND lead_id IN (112, 109)\n;\n\nSELECT * FROM crm_profiles WHERE user_id = 143;\n\nselect * from inboxes; # 212\nselect * from users where id = 143; # 143\nselect * from inbox_email_batches where inbox_id = 212\nand updated_at >= '2026-01-28 00:00:00' order by id desc;\nselect * from inbox_emails where inbox_id = 212\nand batch_id = 95885 order by id desc;\nselect * from email_messages where origin_user_id = 143;\nselect * from activities where user_id = 143 and updated_at >= '2026-01-28 00:00:00';\nselect * from participants where activity_id = 620247;\n\nselect * from crm_profiles where user_id = 143;\n\nSELECT * FROM activities WHERE uuid_to_bin('458cf915-b914-4000-b083-5687b32b2956') = uuid; # 356001\nselect * from transcription where activity_id = 356001; # 6943\nselect * from ai_prompts where transcription_id = 6943;\nSELECT * FROM activity_summary_logs where activity_id = 356001;\n\nSELECT * FROM social_accounts WHERE sociable_id = 143;\n\n# ************************************************************************************\nSELECT * FROM activities WHERE uuid_to_bin('0164a4fb-cb95-454e-9edd-4d804e4999bd') = uuid;\n# 422515 softphone tr. 8100\n\nSELECT * FROM activities WHERE uuid_to_bin('7520add8-8d87-41a5-98e5-fc4edf96f21e') = uuid;\n# 407509 conference tr. 7670 crmId: 00UD1000002J9aTMAS\n\nselect * from ai_prompts where transcription_id IN (8100, 7670);\nselect * from activity_summary_logs where activity_id = 407509;\n\nselect * from sidekick_settings;\nselect * from default_activity_types;\n\nSELECT * FROM contacts WHERE crm_configuration_id = 39 and email = 'm.kogoj@gmx.at';\nSELECT * FROM leads WHERE crm_configuration_id = 39 and email = 'm.kogoj@gmx.at';\n\nSELECT * FROM activity_searches where user_id = 143;\nSELECT * FROM groups where team_id = 1;\n\nselect * from teams where id = 1;\nselect * from groups where team_id = 1; # 1150 - 7e75f8025c22\nselect id, name, group_id, status, deleted_at, email\nfrom users where team_id = 1 order by group_id desc ;\n\nselect * from activity_searches where id in (1977, 1978, 1979);\nselect * from activity_search_filters where activity_search_id IN (1977, 1978, 1979);\nselect * from activity_search_filters where filter = 'group_id' and value = '443f26b8-8512-437e-a9f9-7e75f8025c22'; # 10268, 10272, 10277\nselect * from nudges where activity_search_id IN (1977, 1978, 1979); # 877, 878, 879\n\nINSERT INTO `activity_search_filters`\n(`activity_search_id`, `filter`, `value`) VALUES\n(1977, 'group_id', '443f26b8-8512-437e-a9f9-7e75f8025c22'),\n(1978, 'group_id', '443f26b8-8512-437e-a9f9-7e75f8025c22'),\n(1979, 'group_id', '443f26b8-8512-437e-a9f9-7e75f8025c22')\n;\n\nselect * from crm_configurations where id = 39;\n\nselect * from teams where id = 1;\nselect * from team_features where team_id = 1;\nselect * from features;\n\nSELECT * FROM activity_searches where id = 1982; # 1981\nSELECT * FROM activity_search_filters WHERE activity_search_id = 1982;\n\nSELECT * FROM automated_reports where id = 68;\nSELECT * FROM automated_report_results where id = 275;\n\nSELECT * FROM automated_reports order by id desc;\nSELECT * FROM automated_report_results order by id desc;\nselect * from activity_searches where user_id = 143;\nselect * from ask_anything_prompts;\n\nSELECT * FROM groups WHERE id = 1439;\nSELECT * FROM users WHERE group_id = 1439;\n\nselect * from permissions; # 158\nselect * from roles;\nselect * from permission_role\n\nselect * from teams where id = 1;\nselect * from groups g JOIN playbooks p on g.playbook_id = p.id where g.team_id = 1;\nselect * from groups where id = 28;\nselect * from playbooks where team_id = 1;\nselect * from playbooks where id = 179;\nselect * from playbook_categories where id = 1391;\nselect * from users where id = 143;\nselect * from crm_profiles where user_id = 143;\nselect * from activities where crm_configuration_id = 39 and type = 'conference'\nand crm_provider_id IS NOT NULL ORDER by id desc;\nselect * from activities where id = 422003; # 00UO400000pB6fpMAC\n\nSELECT ar.id, ar.uuid, ar.media_type, ar.status, a.type\nFROM automated_report_results ar\nJOIN automated_reports a ON a.id = ar.report_id\nWHERE a.type = 'ask_jiminny'\nLIMIT 10;\n\n\nselect * from teams where id = 3143;\nselect * from crm_configurations where id = 500;\nselect * from users where name = 'Integration Account'; # 1695\nSELECT * FROM social_accounts WHERE sociable_id = 1695;\n\nselect * from activities where crm_configuration_id = 39\nand recording_state = 'recorded' and duration > 60\nand status = 'completed' and actual_start_time >= '2025-12-01'\n\nSELECT * FROM activities WHERE uuid_to_bin('458cf915-b914-4000-b083-5687b32b2956') = uuid;","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Project","depth":3,"role_description":"text"},{"role":"AXButton","text":"Project","depth":3,"bounds":{"left":0.011968086,"top":0.047885075,"width":0.024268618,"height":0.024740623},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"New File or Directory…","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Expand Selected","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Collapse All","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Options","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
8870240212666235116
|
2146703058527524421
|
click
|
accessibility
|
NULL
|
Project: faVsco.js, menu
#11894 on JY-18909-automa Project: faVsco.js, menu
#11894 on JY-18909-automated-reports-ask-jiminny, menu
Start Listening for PHP Debug Connections
AskJiminnyReportActivityServiceTest
Run 'AskJiminnyReportActivityServiceTest'
Debug 'AskJiminnyReportActivityServiceTest'
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 Carbon\CarbonImmutable;
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\Services\Kiosk\AutomatedReports\AutomatedReportsService;
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);
}
public static function frequencyDateRangeProvider(): array
{
return [
'daily' => [
AutomatedReportsService::FREQUENCY_DAILY,
'2025-06-15 00:00:00',
'2025-06-15 23:59:59',
],
'weekly' => [
AutomatedReportsService::FREQUENCY_WEEKLY,
'2025-06-09 00:00:00',
'2025-06-15 23:59:59',
],
'monthly' => [
AutomatedReportsService::FREQUENCY_MONTHLY,
'2025-05-01 00:00:00',
'2025-05-31 23:59:59',
],
'quarterly' => [
AutomatedReportsService::FREQUENCY_QUARTERLY,
'2025-01-01 00:00:00',
'2025-03-31 23:59:59',
],
];
}
/**
* @dataProvider frequencyDateRangeProvider
*/
public function testGetActivityIdsInjectsDateRangeForFrequency(
string $frequency,
string $expectedStartDate,
string $expectedEndDate,
): void {
CarbonImmutable::setTestNow('2025-06-16 12:00:00');
try {
$user = $this->makeUser();
$savedSearch = $this->makeSavedSearch([]);
$filterSet = $this->createMock(FilterDefinitionCollection::class);
$this->activitySearch->method('getArrayFilterKeys')->willReturn([]);
$this->logger->method('info');
$this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);
$capturedCriteria = null;
$this->activitySearch->expects($this->once())
->method('getOnDemandPageFilterSet')
->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {
$capturedCriteria = $criteria;
return $filterSet;
});
$this->service->getActivityIdsForSavedSearch($savedSearch, $user, $frequency);
$this->assertNotNull($capturedCriteria);
$this->assertSame($expectedStartDate, $capturedCriteria->getStartDate()->format('Y-m-d H:i:s'));
$this->assertSame($expectedEndDate, $capturedCriteria->getEndDate()->format('Y-m-d H:i:s'));
} finally {
CarbonImmutable::setTestNow();
}
}
public function testGetActivityIdsWithNullFrequencyDoesNotInjectDates(): void
{
$user = $this->makeUser();
$savedSearch = $this->makeSavedSearch([]);
$filterSet = $this->createMock(FilterDefinitionCollection::class);
$this->activitySearch->method('getArrayFilterKeys')->willReturn([]);
$this->logger->method('info');
$this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);
$capturedCriteria = null;
$this->activitySearch->expects($this->once())
->method('getOnDemandPageFilterSet')
->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {
$capturedCriteria = $criteria;
return $filterSet;
});
$this->service->getActivityIdsForSavedSearch($savedSearch, $user, null);
$this->assertNotNull($capturedCriteria);
$this->assertNull($capturedCriteria->getStartDate());
$this->assertNull($capturedCriteria->getEndDate());
}
public function testGetActivityIdsWithUnknownFrequencyDoesNotInjectDates(): void
{
$user = $this->makeUser();
$savedSearch = $this->makeSavedSearch([]);
$filterSet = $this->createMock(FilterDefinitionCollection::class);
$this->activitySearch->method('getArrayFilterKeys')->willReturn([]);
$this->logger->method('info');
$this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);
$capturedCriteria = null;
$this->activitySearch->expects($this->once())
->method('getOnDemandPageFilterSet')
->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {
$capturedCriteria = $criteria;
return $filterSet;
});
$this->service->getActivityIdsForSavedSearch($savedSearch, $user, AutomatedReportsService::FREQUENCY_ONE_OFF);
$this->assertNotNull($capturedCriteria);
$this->assertNull($capturedCriteria->getStartDate());
$this->assertNull($capturedCriteria->getEndDate());
}
public function testGetActivityIdsFrequencyDateRangeOverridesSavedSearchDateFilters(): void
{
CarbonImmutable::setTestNow('2025-06-16 12:00:00');
try {
$user = $this->makeUser();
$startDateFilter = $this->makeFilter(ActivityActualDate::PARAM_START_DATE, '2024-01-01 00:00:00');
$endDateFilter = $this->makeFilter(ActivityActualDate::PARAM_END_DATE, '2024-12-31 23:59:59');
$savedSearch = $this->makeSavedSearch([$startDateFilter, $endDateFilter]);
$filterSet = $this->createMock(FilterDefinitionCollection::class);
$this->activitySearch->method('getArrayFilterKeys')->willReturn([]);
$this->logger->method('info');
$this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);
$capturedCriteria = null;
$this->activitySearch->expects($this->once())
->method('getOnDemandPageFilterSet')
->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {
$capturedCriteria = $criteria;
return $filterSet;
});
$this->service->getActivityIdsForSavedSearch($savedSearch, $user, AutomatedReportsService::FREQUENCY_DAILY);
$this->assertNotNull($capturedCriteria);
$this->assertSame('2025-06-15 00:00:00', $capturedCriteria->getStartDate()->format('Y-m-d H:i:s'));
$this->assertSame('2025-06-15 23:59:59', $capturedCriteria->getEndDate()->format('Y-m-d H:i:s'));
} finally {
CarbonImmutable::setTestNow();
}
}
}
Execute
Explain Plan
Browse Query History
View Parameters
Open Query Execution Settings…
In-Editor Results
Tx: Auto
Cancel Running Statements
Playground
jiminny
Code changed:
Hide
Sync Changes
Hide This Notification
10
12
2
4
Previous Highlighted Error
Next Highlighted Error
SELECT a.id, a.uuid, a.actual_start_time, o.id, o.uuid FROM opportunities o
JOIN activities a ON o.id = a.opportunity_id
WHERE a.crm_configuration_id = 39
AND a.actual_start_time > '2025-10-13'
AND a.type IN ('conference', 'softphone-inbound', 'softphone-outbound')
;
SELECT * FROM activities
WHERE crm_configuration_id = 39 and user_id = 143
and actual_start_time >= '2025-10-13'
AND type IN ('conference', 'softphone-inbound', 'softphone-outbound')
;
SELECT * FROM opportunities WHERE account_id IN (178);
select * from activities where id IN (620137, 620187, 620188, 620189, 620230);
# HS
SELECT * FROM opportunities WHERE id IN (238);
select * from activities where id IN (477,2076);
select * from users;
SELECT COUNT(*) FROM users;
SELECT COUNT(*) FROM activities;
SELECT COUNT(*) FROM opportunities;
UPDATE activities
SET
actual_start_time = '2025-12-19 09:00:00',
actual_end_time = '2025-12-19 10:30:00',
scheduled_start_time = '2025-12-19 09:00:00',
scheduled_end_time = '2025-12-19 10:30:00'
WHERE id IN (407509,407375);
select * from partners;
SELECT id, uuid, type, actual_start_time, user_id, crm_configuration_id
FROM activities
WHERE user_id = 143
AND actual_start_time >= '2025-10-13 00:00:00'
AND actual_start_time <= '2026-01-13 23:59:59'
ORDER BY actual_start_time DESC;
SELECT * FROM activities WHERE uuid_to_bin('78eda160-3086-435f-88a5-bb0c71b6008d') = uuid;
SELECT * FROM crm_layouts where crm_configuration_id = 39;
SELECT * FROM crm_layout_entities WHERE crm_layout_id = 282;
# lead_id
# account_id 177
# contact_id 3969
# opportunity_id
# stage_id 203
SELECT * FROM opportunities WHERE opportunities.crm_configuration_id = id = 282;
SELECT * FROM activities where crm_configuration_id = 39 AND type = 'conference'
AND user_id = 143 and actual_start_time >= '2025-10-13';
SELECT * FROM activities a
# JOIN opportunities o ON a.opportunity_id = o.id
WHERE a.crm_configuration_id = 39 AND a.type = 'conference'
and status = 'completed' and recording_state = 'recorded'
and a.actual_start_time >= '2025-10-13'
AND a.user_id = 143
;
select * from leads
where crm_configuration_id = 39; # 112 -> ac. 178, 109 => op. 1707
SELECT * FROM activities WHERE id IN (356013,616188,616202,616310,407509,407375,356001,356008);
SELECT * FROM activities WHERE id IN (356013,616188,616202,616310);
SELECT * FROM activities WHERE id IN (407509,407375); # leads: 112, 109 | status - 198
SELECT * FROM activities WHERE id IN (356001, 356008); # contacts:
SELECT * FROM opportunities WHERE id IN (1707);
SELECT * FROM stages where id IN (204, 198);
SELECT * FROM opportunities WHERE account_id IN (178);
SELECT * FROM opportunities WHERE crm_configuration_id = 39 AND created_at > '2025-01-01';
SELECT * FROM contacts WHERE account_id IN (178); # 4118 Musaibe, 4448 Ceco Personal
SELECT * FROM activities where crm_configuration_id = 39
AND opportunity_id IS NULL
AND is_internal = false
and status = 'completed' and recording_state = 'recorded'
AND actual_start_time >= '2025-10-13'
AND (lead_id IS NOT NULL OR contact_id IS NOT NULL OR account_id IS NOT NULL)
# AND lead_id IN (112, 109)
;
SELECT * FROM crm_profiles WHERE user_id = 143;
select * from inboxes; # 212
select * from users where id = 143; # 143
select * from inbox_email_batches where inbox_id = 212
and updated_at >= '2026-01-28 00:00:00' order by id desc;
select * from inbox_emails where inbox_id = 212
and batch_id = 95885 order by id desc;
select * from email_messages where origin_user_id = 143;
select * from activities where user_id = 143 and updated_at >= '2026-01-28 00:00:00';
select * from participants where activity_id = 620247;
select * from crm_profiles where user_id = 143;
SELECT * FROM activities WHERE uuid_to_bin('458cf915-b914-4000-b083-5687b32b2956') = uuid; # 356001
select * from transcription where activity_id = 356001; # 6943
select * from ai_prompts where transcription_id = 6943;
SELECT * FROM activity_summary_logs where activity_id = 356001;
SELECT * FROM social_accounts WHERE sociable_id = 143;
# [PASSWORD_DOTS]
SELECT * FROM activities WHERE uuid_to_bin('0164a4fb-cb95-454e-9edd-4d804e4999bd') = uuid;
# 422515 softphone tr. 8100
SELECT * FROM activities WHERE uuid_to_bin('7520add8-8d87-41a5-98e5-fc4edf96f21e') = uuid;
# 407509 conference tr. 7670 crmId: 00UD1000002J9aTMAS
select * from ai_prompts where transcription_id IN (8100, 7670);
select * from activity_summary_logs where activity_id = 407509;
select * from sidekick_settings;
select * from default_activity_types;
SELECT * FROM contacts WHERE crm_configuration_id = 39 and email = '[EMAIL]';
SELECT * FROM leads WHERE crm_configuration_id = 39 and email = '[EMAIL]';
SELECT * FROM activity_searches where user_id = 143;
SELECT * FROM groups where team_id = 1;
select * from teams where id = 1;
select * from groups where team_id = 1; # 1150 - 7e75f8025c22
select id, name, group_id, status, deleted_at, email
from users where team_id = 1 order by group_id desc ;
select * from activity_searches where id in (1977, 1978, 1979);
select * from activity_search_filters where activity_search_id IN (1977, 1978, 1979);
select * from activity_search_filters where filter = 'group_id' and value = '443f26b8-8512-437e-a9f9-7e75f8025c22'; # 10268, 10272, 10277
select * from nudges where activity_search_id IN (1977, 1978, 1979); # 877, 878, 879
INSERT INTO `activity_search_filters`
(`activity_search_id`, `filter`, `value`) VALUES
(1977, 'group_id', '443f26b8-8512-437e-a9f9-7e75f8025c22'),
(1978, 'group_id', '443f26b8-8512-437e-a9f9-7e75f8025c22'),
(1979, 'group_id', '443f26b8-8512-437e-a9f9-7e75f8025c22')
;
select * from crm_configurations where id = 39;
select * from teams where id = 1;
select * from team_features where team_id = 1;
select * from features;
SELECT * FROM activity_searches where id = 1982; # 1981
SELECT * FROM activity_search_filters WHERE activity_search_id = 1982;
SELECT * FROM automated_reports where id = 68;
SELECT * FROM automated_report_results where id = 275;
SELECT * FROM automated_reports order by id desc;
SELECT * FROM automated_report_results order by id desc;
select * from activity_searches where user_id = 143;
select * from ask_anything_prompts;
SELECT * FROM groups WHERE id = 1439;
SELECT * FROM users WHERE group_id = 1439;
select * from permissions; # 158
select * from roles;
select * from permission_role
select * from teams where id = 1;
select * from groups g JOIN playbooks p on g.playbook_id = p.id where g.team_id = 1;
select * from groups where id = 28;
select * from playbooks where team_id = 1;
select * from playbooks where id = 179;
select * from playbook_categories where id = 1391;
select * from users where id = 143;
select * from crm_profiles where user_id = 143;
select * from activities where crm_configuration_id = 39 and type = 'conference'
and crm_provider_id IS NOT NULL ORDER by id desc;
select * from activities where id = 422003; # 00UO400000pB6fpMAC
SELECT ar.id, ar.uuid, ar.media_type, ar.status, a.type
FROM automated_report_results ar
JOIN automated_reports a ON a.id = ar.report_id
WHERE a.type = 'ask_jiminny'
LIMIT 10;
select * from teams where id = 3143;
select * from crm_configurations where id = 500;
select * from users where name = 'Integration Account'; # 1695
SELECT * FROM social_accounts WHERE sociable_id = 1695;
select * from activities where crm_configuration_id = 39
and recording_state = 'recorded' and duration > 60
and status = 'completed' and actual_start_time >= '2025-12-01'
SELECT * FROM activities WHERE uuid_to_bin('458cf915-b914-4000-b083-5687b32b2956') = uuid;
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide...
|
54727
|
|
54729
|
NULL
|
0
|
2026-04-20T09:17:19.473373+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-20/1776 /Users/lukas/.screenpipe/data/data/2026-04-20/1776676639473_m1.jpg...
|
PhpStorm
|
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
January
February
March
April
May
June
July
August
September
October
November
December
2026
10
:
30
:
0...
|
[{"role":"AXStaticText","text& [{"role":"AXStaticText","text":"1","depth":6,"role_description":"text"},{"role":"AXStaticText","text":"2","depth":6,"role_description":"text"},{"role":"AXStaticText","text":"3","depth":6,"role_description":"text"},{"role":"AXStaticText","text":"4","depth":6,"role_description":"text"},{"role":"AXStaticText","text":"5","depth":6,"role_description":"text"},{"role":"AXStaticText","text":"6","depth":6,"role_description":"text"},{"role":"AXStaticText","text":"7","depth":6,"role_description":"text"},{"role":"AXStaticText","text":"8","depth":6,"role_description":"text"},{"role":"AXStaticText","text":"9","depth":6,"role_description":"text"},{"role":"AXStaticText","text":"10","depth":6,"role_description":"text"},{"role":"AXStaticText","text":"11","depth":6,"role_description":"text"},{"role":"AXStaticText","text":"12","depth":6,"role_description":"text"},{"role":"AXStaticText","text":"13","depth":6,"role_description":"text"},{"role":"AXStaticText","text":"14","depth":6,"role_description":"text"},{"role":"AXStaticText","text":"15","depth":6,"role_description":"text"},{"role":"AXStaticText","text":"16","depth":6,"role_description":"text"},{"role":"AXStaticText","text":"17","depth":6,"role_description":"text"},{"role":"AXStaticText","text":"18","depth":6,"role_description":"text"},{"role":"AXStaticText","text":"19","depth":6,"role_description":"text"},{"role":"AXStaticText","text":"20","depth":6,"role_description":"text"},{"role":"AXStaticText","text":"21","depth":6,"role_description":"text"},{"role":"AXStaticText","text":"22","depth":6,"role_description":"text"},{"role":"AXStaticText","text":"23","depth":6,"role_description":"text"},{"role":"AXStaticText","text":"24","depth":6,"role_description":"text"},{"role":"AXStaticText","text":"25","depth":6,"role_description":"text"},{"role":"AXStaticText","text":"26","depth":6,"role_description":"text"},{"role":"AXStaticText","text":"27","depth":6,"role_description":"text"},{"role":"AXStaticText","text":"28","depth":6,"role_description":"text"},{"role":"AXStaticText","text":"29","depth":6,"role_description":"text"},{"role":"AXStaticText","text":"30","depth":6,"role_description":"text"},{"role":"AXStaticText","text":"31","depth":6,"role_description":"text"},{"role":"AXStaticText","text":"January","depth":6,"role_description":"text"},{"role":"AXStaticText","text":"February","depth":6,"role_description":"text"},{"role":"AXStaticText","text":"March","depth":6,"role_description":"text"},{"role":"AXStaticText","text":"April","depth":6,"role_description":"text"},{"role":"AXStaticText","text":"May","depth":6,"role_description":"text"},{"role":"AXStaticText","text":"June","depth":6,"role_description":"text"},{"role":"AXStaticText","text":"July","depth":6,"role_description":"text"},{"role":"AXStaticText","text":"August","depth":6,"role_description":"text"},{"role":"AXStaticText","text":"September","depth":6,"role_description":"text"},{"role":"AXStaticText","text":"October","depth":6,"role_description":"text"},{"role":"AXStaticText","text":"November","depth":6,"role_description":"text"},{"role":"AXStaticText","text":"December","depth":6,"role_description":"text"},{"role":"AXTextField","text":"2026","depth":2,"value":"2026","role_description":"text field","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextField","text":"10","depth":2,"value":"10","role_description":"text field","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":":","depth":1,"role_description":"text"},{"role":"AXTextField","text":"30","depth":2,"value":"30","role_description":"text field","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":":","depth":1,"role_description":"text"},{"role":"AXTextField","text":"0","depth":2,"value":"0","role_description":"text field","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
-4438512630616932095
|
-350000261908515320
|
click
|
accessibility
|
NULL
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
January
February
March
April
May
June
July
August
September
October
November
December
2026
10
:
30
:
0...
|
NULL
|
|
54882
|
NULL
|
0
|
2026-04-20T09:22:27.697787+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-20/1776 /Users/lukas/.screenpipe/data/data/2026-04-20/1776676947697_m1.jpg...
|
PhpStorm
|
faVsco.js – AskJiminnyReportActivityServiceTest.ph faVsco.js – AskJiminnyReportActivityServiceTest.php...
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
#11894 on JY-18909-automa Project: faVsco.js, menu
#11894 on JY-18909-automated-reports-ask-jiminny, menu
Start Listening for PHP Debug Connections
AskJiminnyReportActivityServiceTest
Run 'AskJiminnyReportActivityServiceTest'
Debug 'AskJiminnyReportActivityServiceTest'
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 Carbon\CarbonImmutable;
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\Services\Kiosk\AutomatedReports\AutomatedReportsService;
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);
}
public static function frequencyDateRangeProvider(): array
{
return [
'daily' => [
AutomatedReportsService::FREQUENCY_DAILY,
'2025-06-15 00:00:00',
'2025-06-15 23:59:59',
],
'weekly' => [
AutomatedReportsService::FREQUENCY_WEEKLY,
'2025-06-09 00:00:00',
'2025-06-15 23:59:59',
],
'monthly' => [
AutomatedReportsService::FREQUENCY_MONTHLY,
'2025-05-01 00:00:00',
'2025-05-31 23:59:59',
],
'quarterly' => [
AutomatedReportsService::FREQUENCY_QUARTERLY,
'2025-01-01 00:00:00',
'2025-03-31 23:59:59',
],
];
}
/**
* @dataProvider frequencyDateRangeProvider
*/
public function testGetActivityIdsInjectsDateRangeForFrequency(
string $frequency,
string $expectedStartDate,
string $expectedEndDate,
): void {
CarbonImmutable::setTestNow('2025-06-16 12:00:00');
try {
$user = $this->makeUser();
$savedSearch = $this->makeSavedSearch([]);
$filterSet = $this->createMock(FilterDefinitionCollection::class);
$this->activitySearch->method('getArrayFilterKeys')->willReturn([]);
$this->logger->method('info');
$this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);
$capturedCriteria = null;
$this->activitySearch->expects($this->once())
->method('getOnDemandPageFilterSet')
->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {
$capturedCriteria = $criteria;
return $filterSet;
});
$this->service->getActivityIdsForSavedSearch($savedSearch, $user, $frequency);
$this->assertNotNull($capturedCriteria);
$this->assertSame($expectedStartDate, $capturedCriteria->getStartDate()->format('Y-m-d H:i:s'));
$this->assertSame($expectedEndDate, $capturedCriteria->getEndDate()->format('Y-m-d H:i:s'));
} finally {
CarbonImmutable::setTestNow();
}
}
public function testGetActivityIdsWithNullFrequencyDoesNotInjectDates(): void
{
$user = $this->makeUser();
$savedSearch = $this->makeSavedSearch([]);
$filterSet = $this->createMock(FilterDefinitionCollection::class);
$this->activitySearch->method('getArrayFilterKeys')->willReturn([]);
$this->logger->method('info');
$this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);
$capturedCriteria = null;
$this->activitySearch->expects($this->once())
->method('getOnDemandPageFilterSet')
->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {
$capturedCriteria = $criteria;
return $filterSet;
});
$this->service->getActivityIdsForSavedSearch($savedSearch, $user, null);
$this->assertNotNull($capturedCriteria);
$this->assertNull($capturedCriteria->getStartDate());
$this->assertNull($capturedCriteria->getEndDate());
}
public function testGetActivityIdsWithUnknownFrequencyDoesNotInjectDates(): void
{
$user = $this->makeUser();
$savedSearch = $this->makeSavedSearch([]);
$filterSet = $this->createMock(FilterDefinitionCollection::class);
$this->activitySearch->method('getArrayFilterKeys')->willReturn([]);
$this->logger->method('info');
$this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);
$capturedCriteria = null;
$this->activitySearch->expects($this->once())
->method('getOnDemandPageFilterSet')
->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {
$capturedCriteria = $criteria;
return $filterSet;
});
$this->service->getActivityIdsForSavedSearch($savedSearch, $user, AutomatedReportsService::FREQUENCY_ONE_OFF);
$this->assertNotNull($capturedCriteria);
$this->assertNull($capturedCriteria->getStartDate());
$this->assertNull($capturedCriteria->getEndDate());
}
public function testGetActivityIdsFrequencyDateRangeOverridesSavedSearchDateFilters(): void
{
CarbonImmutable::setTestNow('2025-06-16 12:00:00');
try {
$user = $this->makeUser();
$startDateFilter = $this->makeFilter(ActivityActualDate::PARAM_START_DATE, '2024-01-01 00:00:00');
$endDateFilter = $this->makeFilter(ActivityActualDate::PARAM_END_DATE, '2024-12-31 23:59:59');
$savedSearch = $this->makeSavedSearch([$startDateFilter, $endDateFilter]);
$filterSet = $this->createMock(FilterDefinitionCollection::class);
$this->activitySearch->method('getArrayFilterKeys')->willReturn([]);
$this->logger->method('info');
$this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);
$capturedCriteria = null;
$this->activitySearch->expects($this->once())
->method('getOnDemandPageFilterSet')
->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {
$capturedCriteria = $criteria;
return $filterSet;
});
$this->service->getActivityIdsForSavedSearch($savedSearch, $user, AutomatedReportsService::FREQUENCY_DAILY);
$this->assertNotNull($capturedCriteria);
$this->assertSame('2025-06-15 00:00:00', $capturedCriteria->getStartDate()->format('Y-m-d H:i:s'));
$this->assertSame('2025-06-15 23:59:59', $capturedCriteria->getEndDate()->format('Y-m-d H:i:s'));
} finally {
CarbonImmutable::setTestNow();
}
}
}
Code changed:
Hide
Sync Changes
Hide This Notification
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
DealInsights, folder
Security
TeamInsights
ActivityActualDate.php, class
ActivityChannel.php, final class
ActivityDurationRange.php, class
ActivityFilter.php, final class
ActivityPlaylistIn.php, final class
ActivityProviderIn.php, final class
ActivityRecorded.php, class
ActivityRecordingStopped.php, final class
ActivityScheduledDate.php, final class
ActivityStatusIn.php, class
ActivityType.php, final class
ActivityUpdatedDate.php, final class
AiCallScoreFilter.php, final class
AutoScoreFilter.php, final class
ClosedDealsFilter.php, final class
CoachingFeedbackAverageScore.php, final class
CoachingFeedbackCoachUserIn.php, final class
CommentCountRange.php, final class
CrmFieldCollection.php, final class
CurrentStage.php, final class
Customer.php, final class
CustomerMonologueDuration.php, final class
CustomerQuestionCount.php, final class
DealAge.php, final class
DealCloseDate.php, final class
DealValue.php, final class
EngagingQuestionCount.php, final class
ExternalId.php, final class
HasPendingAiCrmNotes.php, final class
HasTopicTriggersFilterDefinition.php, final class...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"#11894 on JY-18909-automated-reports-ask-jiminny, menu","depth":5,"help_text":"Pull request #11894 exists for current branch JY-18909-automated-reports-ask-jiminny","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"AskJiminnyReportActivityServiceTest","depth":6,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run 'AskJiminnyReportActivityServiceTest'","depth":6,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'AskJiminnyReportActivityServiceTest'","depth":6,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"More Actions","depth":6,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JetBrains AI","depth":5,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Search Everywhere","depth":5,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"IDE and Project Settings","depth":5,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.088194445,"height":0.027777778},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"2","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.016666668,"height":0.02111111},"role_description":"text"},{"role":"AXStaticText","text":"3","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.016666668,"height":0.02111111},"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.015277778,"height":0.025555555},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.014583333,"height":0.025555555},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Tests\\Unit\\Services\\Kiosk\\AutomatedReports;\n\nuse Carbon\\CarbonImmutable;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinition\\ActivityActualDate;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinition\\ActivityUpdatedDate;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinition\\DealInsights\\ClosingPeriodFilter;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinitionCollection;\nuse Jiminny\\Component\\ActivitySearch\\Service\\ActivitySearch;\nuse Jiminny\\Models\\Activity\\Search;\nuse Jiminny\\Models\\Activity\\SearchFilter;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Repositories\\ElasticActivityRepository;\nuse Jiminny\\Services\\Kiosk\\AutomatedReports\\AskJiminnyReportActivityService;\nuse Jiminny\\Services\\Kiosk\\AutomatedReports\\AutomatedReportsService;\nuse Jiminny\\VO\\Repository\\OnDemandActivitySearch\\Criteria;\nuse PHPUnit\\Framework\\MockObject\\MockObject;\nuse PHPUnit\\Framework\\TestCase;\nuse Psr\\Log\\LoggerInterface;\n\nclass AskJiminnyReportActivityServiceTest extends TestCase\n{\n private ActivitySearch&MockObject $activitySearch;\n private ElasticActivityRepository&MockObject $elasticRepository;\n private LoggerInterface&MockObject $logger;\n private AskJiminnyReportActivityService $service;\n\n protected function setUp(): void\n {\n $this->activitySearch = $this->createMock(ActivitySearch::class);\n $this->elasticRepository = $this->createMock(ElasticActivityRepository::class);\n $this->logger = $this->createMock(LoggerInterface::class);\n\n $this->service = new AskJiminnyReportActivityService(\n $this->activitySearch,\n $this->elasticRepository,\n $this->logger,\n );\n }\n\n private function makeFilter(string $key, ?string $value): SearchFilter&MockObject\n {\n $filter = $this->createMock(SearchFilter::class);\n $filter->method('getFilterProperty')->willReturn($key);\n $filter->method('getFilterValue')->willReturn($value);\n\n return $filter;\n }\n\n private function makeUser(): User&MockObject\n {\n $tz = new \\DateTimeZone('UTC');\n $user = $this->createMock(User::class);\n $user->method('getTimezone')->willReturn($tz);\n $user->method('getId')->willReturn(1);\n $user->method('getUuid')->willReturn('user-uuid');\n\n return $user;\n }\n\n private function makeSavedSearch(array $filters): Search&MockObject\n {\n $savedSearch = $this->createMock(Search::class);\n $savedSearch->method('getId')->willReturn(42);\n $savedSearch->method('getFilters')->willReturn(new \\Illuminate\\Support\\LazyCollection($filters));\n\n return $savedSearch;\n }\n\n public function testGetActivityIdsForSavedSearchReturnsIds(): void\n {\n $user = $this->makeUser();\n $savedSearch = $this->makeSavedSearch([]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->expects($this->once())\n ->method('getArrayFilterKeys')\n ->with($user)\n ->willReturn([]);\n\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturn($filterSet);\n\n $this->elasticRepository->expects($this->once())\n ->method('onDemandSearchIdsOnly')\n ->willReturn(['id-1', 'id-2', 'id-3']);\n\n $this->logger->expects($this->once())\n ->method('info')\n ->with('[AskJiminnyReport] Fetched activity IDs for saved search');\n\n $result = $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertEquals(['id-1', 'id-2', 'id-3'], $result);\n }\n\n public function testGetActivityIdsForSavedSearchReturnsEmptyWhenNoResults(): void\n {\n $user = $this->makeUser();\n $savedSearch = $this->makeSavedSearch([]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->activitySearch->method('getOnDemandPageFilterSet')->willReturn($filterSet);\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);\n\n $this->logger->expects($this->once())->method('info');\n\n $result = $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertEmpty($result);\n }\n\n public function testGetActivityIdsFiltersOutDateFilters(): void\n {\n $user = $this->makeUser();\n\n $nonDateFilter = $this->makeFilter('owner_id', '123');\n $startDateFilter = $this->makeFilter(ActivityActualDate::PARAM_START_DATE, '2025-01-01 00:00:00');\n $endDateFilter = $this->makeFilter(ActivityActualDate::PARAM_END_DATE, '2025-01-31 23:59:59');\n $updatedFromFilter = $this->makeFilter(ActivityUpdatedDate::PARAM_UPDATED_FROM, '2025-01-01 00:00:00');\n $updatedToFilter = $this->makeFilter(ActivityUpdatedDate::PARAM_UPDATED_TO, '2025-01-31 23:59:59');\n\n $savedSearch = $this->makeSavedSearch([\n $nonDateFilter,\n $startDateFilter,\n $endDateFilter,\n $updatedFromFilter,\n $updatedToFilter,\n ]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n\n $capturedCriteria = null;\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {\n $capturedCriteria = $criteria;\n\n return $filterSet;\n });\n\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);\n $this->logger->method('info');\n\n $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertNotNull($capturedCriteria);\n }\n\n public function testGetActivityIdsFiltersOutClosingPeriodDateFilters(): void\n {\n $user = $this->makeUser();\n\n $closingStartFilter = $this->makeFilter(ClosingPeriodFilter::KEY_START_DATE, '2025-01-01');\n $closingEndFilter = $this->makeFilter(ClosingPeriodFilter::KEY_END_DATE, '2025-03-31');\n $regularFilter = $this->makeFilter('rep_id', '99');\n\n $savedSearch = $this->makeSavedSearch([\n $closingStartFilter,\n $closingEndFilter,\n $regularFilter,\n ]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturn($filterSet);\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn(['id-1']);\n $this->logger->method('info');\n\n $result = $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertEquals(['id-1'], $result);\n }\n\n public function testGetActivityIdsHandlesArrayFilters(): void\n {\n $user = $this->makeUser();\n\n $filter1 = $this->makeFilter('outcome', 'positive');\n $filter2 = $this->makeFilter('outcome', 'negative');\n\n $savedSearch = $this->makeSavedSearch([$filter1, $filter2]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn(['outcome']);\n $this->activitySearch->method('getOnDemandPageFilterSet')->willReturn($filterSet);\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn(['id-1']);\n $this->logger->method('info');\n\n $result = $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertEquals(['id-1'], $result);\n }\n\n public function testGetActivityIdsHandlesScalarFilters(): void\n {\n $user = $this->makeUser();\n\n $filter = $this->makeFilter('direction', 'inbound');\n $savedSearch = $this->makeSavedSearch([$filter]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->activitySearch->method('getOnDemandPageFilterSet')->willReturn($filterSet);\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn(['id-5']);\n $this->logger->method('info');\n\n $result = $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertEquals(['id-5'], $result);\n }\n\n public function testGetActivityIdsPassesNonZeroSequenceNumberToDisableFirstRequestDefaults(): void\n {\n $user = $this->makeUser();\n $savedSearch = $this->makeSavedSearch([]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n\n $capturedCriteria = null;\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {\n $capturedCriteria = $criteria;\n\n return $filterSet;\n });\n\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);\n $this->logger->method('info');\n\n $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertNotNull($capturedCriteria);\n $this->assertFalse($capturedCriteria->isFirstRequest());\n }\n\n public function testGetActivityIdsLogsWithCorrectContext(): void\n {\n $user = $this->makeUser();\n $savedSearch = $this->makeSavedSearch([]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->activitySearch->method('getOnDemandPageFilterSet')->willReturn($filterSet);\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn(['a', 'b']);\n\n $this->logger->expects($this->once())\n ->method('info')\n ->with(\n '[AskJiminnyReport] Fetched activity IDs for saved search',\n $this->callback(fn ($context) => $context['saved_search_id'] === 42\n && $context['user_id'] === 1\n && $context['activity_count'] === 2)\n );\n\n $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n }\n\n public static function frequencyDateRangeProvider(): array\n {\n return [\n 'daily' => [\n AutomatedReportsService::FREQUENCY_DAILY,\n '2025-06-15 00:00:00',\n '2025-06-15 23:59:59',\n ],\n 'weekly' => [\n AutomatedReportsService::FREQUENCY_WEEKLY,\n '2025-06-09 00:00:00',\n '2025-06-15 23:59:59',\n ],\n 'monthly' => [\n AutomatedReportsService::FREQUENCY_MONTHLY,\n '2025-05-01 00:00:00',\n '2025-05-31 23:59:59',\n ],\n 'quarterly' => [\n AutomatedReportsService::FREQUENCY_QUARTERLY,\n '2025-01-01 00:00:00',\n '2025-03-31 23:59:59',\n ],\n ];\n }\n\n /**\n * @dataProvider frequencyDateRangeProvider\n */\n public function testGetActivityIdsInjectsDateRangeForFrequency(\n string $frequency,\n string $expectedStartDate,\n string $expectedEndDate,\n ): void {\n CarbonImmutable::setTestNow('2025-06-16 12:00:00');\n\n try {\n $user = $this->makeUser();\n $savedSearch = $this->makeSavedSearch([]);\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->logger->method('info');\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);\n\n $capturedCriteria = null;\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {\n $capturedCriteria = $criteria;\n\n return $filterSet;\n });\n\n $this->service->getActivityIdsForSavedSearch($savedSearch, $user, $frequency);\n\n $this->assertNotNull($capturedCriteria);\n $this->assertSame($expectedStartDate, $capturedCriteria->getStartDate()->format('Y-m-d H:i:s'));\n $this->assertSame($expectedEndDate, $capturedCriteria->getEndDate()->format('Y-m-d H:i:s'));\n } finally {\n CarbonImmutable::setTestNow();\n }\n }\n\n public function testGetActivityIdsWithNullFrequencyDoesNotInjectDates(): void\n {\n $user = $this->makeUser();\n $savedSearch = $this->makeSavedSearch([]);\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->logger->method('info');\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);\n\n $capturedCriteria = null;\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {\n $capturedCriteria = $criteria;\n\n return $filterSet;\n });\n\n $this->service->getActivityIdsForSavedSearch($savedSearch, $user, null);\n\n $this->assertNotNull($capturedCriteria);\n $this->assertNull($capturedCriteria->getStartDate());\n $this->assertNull($capturedCriteria->getEndDate());\n }\n\n public function testGetActivityIdsWithUnknownFrequencyDoesNotInjectDates(): void\n {\n $user = $this->makeUser();\n $savedSearch = $this->makeSavedSearch([]);\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->logger->method('info');\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);\n\n $capturedCriteria = null;\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {\n $capturedCriteria = $criteria;\n\n return $filterSet;\n });\n\n $this->service->getActivityIdsForSavedSearch($savedSearch, $user, AutomatedReportsService::FREQUENCY_ONE_OFF);\n\n $this->assertNotNull($capturedCriteria);\n $this->assertNull($capturedCriteria->getStartDate());\n $this->assertNull($capturedCriteria->getEndDate());\n }\n\n public function testGetActivityIdsFrequencyDateRangeOverridesSavedSearchDateFilters(): void\n {\n CarbonImmutable::setTestNow('2025-06-16 12:00:00');\n\n try {\n $user = $this->makeUser();\n\n $startDateFilter = $this->makeFilter(ActivityActualDate::PARAM_START_DATE, '2024-01-01 00:00:00');\n $endDateFilter = $this->makeFilter(ActivityActualDate::PARAM_END_DATE, '2024-12-31 23:59:59');\n $savedSearch = $this->makeSavedSearch([$startDateFilter, $endDateFilter]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->logger->method('info');\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);\n\n $capturedCriteria = null;\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {\n $capturedCriteria = $criteria;\n\n return $filterSet;\n });\n\n $this->service->getActivityIdsForSavedSearch($savedSearch, $user, AutomatedReportsService::FREQUENCY_DAILY);\n\n $this->assertNotNull($capturedCriteria);\n $this->assertSame('2025-06-15 00:00:00', $capturedCriteria->getStartDate()->format('Y-m-d H:i:s'));\n $this->assertSame('2025-06-15 23:59:59', $capturedCriteria->getEndDate()->format('Y-m-d H:i:s'));\n } finally {\n CarbonImmutable::setTestNow();\n }\n }\n}","depth":4,"value":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Tests\\Unit\\Services\\Kiosk\\AutomatedReports;\n\nuse Carbon\\CarbonImmutable;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinition\\ActivityActualDate;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinition\\ActivityUpdatedDate;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinition\\DealInsights\\ClosingPeriodFilter;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinitionCollection;\nuse Jiminny\\Component\\ActivitySearch\\Service\\ActivitySearch;\nuse Jiminny\\Models\\Activity\\Search;\nuse Jiminny\\Models\\Activity\\SearchFilter;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Repositories\\ElasticActivityRepository;\nuse Jiminny\\Services\\Kiosk\\AutomatedReports\\AskJiminnyReportActivityService;\nuse Jiminny\\Services\\Kiosk\\AutomatedReports\\AutomatedReportsService;\nuse Jiminny\\VO\\Repository\\OnDemandActivitySearch\\Criteria;\nuse PHPUnit\\Framework\\MockObject\\MockObject;\nuse PHPUnit\\Framework\\TestCase;\nuse Psr\\Log\\LoggerInterface;\n\nclass AskJiminnyReportActivityServiceTest extends TestCase\n{\n private ActivitySearch&MockObject $activitySearch;\n private ElasticActivityRepository&MockObject $elasticRepository;\n private LoggerInterface&MockObject $logger;\n private AskJiminnyReportActivityService $service;\n\n protected function setUp(): void\n {\n $this->activitySearch = $this->createMock(ActivitySearch::class);\n $this->elasticRepository = $this->createMock(ElasticActivityRepository::class);\n $this->logger = $this->createMock(LoggerInterface::class);\n\n $this->service = new AskJiminnyReportActivityService(\n $this->activitySearch,\n $this->elasticRepository,\n $this->logger,\n );\n }\n\n private function makeFilter(string $key, ?string $value): SearchFilter&MockObject\n {\n $filter = $this->createMock(SearchFilter::class);\n $filter->method('getFilterProperty')->willReturn($key);\n $filter->method('getFilterValue')->willReturn($value);\n\n return $filter;\n }\n\n private function makeUser(): User&MockObject\n {\n $tz = new \\DateTimeZone('UTC');\n $user = $this->createMock(User::class);\n $user->method('getTimezone')->willReturn($tz);\n $user->method('getId')->willReturn(1);\n $user->method('getUuid')->willReturn('user-uuid');\n\n return $user;\n }\n\n private function makeSavedSearch(array $filters): Search&MockObject\n {\n $savedSearch = $this->createMock(Search::class);\n $savedSearch->method('getId')->willReturn(42);\n $savedSearch->method('getFilters')->willReturn(new \\Illuminate\\Support\\LazyCollection($filters));\n\n return $savedSearch;\n }\n\n public function testGetActivityIdsForSavedSearchReturnsIds(): void\n {\n $user = $this->makeUser();\n $savedSearch = $this->makeSavedSearch([]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->expects($this->once())\n ->method('getArrayFilterKeys')\n ->with($user)\n ->willReturn([]);\n\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturn($filterSet);\n\n $this->elasticRepository->expects($this->once())\n ->method('onDemandSearchIdsOnly')\n ->willReturn(['id-1', 'id-2', 'id-3']);\n\n $this->logger->expects($this->once())\n ->method('info')\n ->with('[AskJiminnyReport] Fetched activity IDs for saved search');\n\n $result = $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertEquals(['id-1', 'id-2', 'id-3'], $result);\n }\n\n public function testGetActivityIdsForSavedSearchReturnsEmptyWhenNoResults(): void\n {\n $user = $this->makeUser();\n $savedSearch = $this->makeSavedSearch([]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->activitySearch->method('getOnDemandPageFilterSet')->willReturn($filterSet);\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);\n\n $this->logger->expects($this->once())->method('info');\n\n $result = $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertEmpty($result);\n }\n\n public function testGetActivityIdsFiltersOutDateFilters(): void\n {\n $user = $this->makeUser();\n\n $nonDateFilter = $this->makeFilter('owner_id', '123');\n $startDateFilter = $this->makeFilter(ActivityActualDate::PARAM_START_DATE, '2025-01-01 00:00:00');\n $endDateFilter = $this->makeFilter(ActivityActualDate::PARAM_END_DATE, '2025-01-31 23:59:59');\n $updatedFromFilter = $this->makeFilter(ActivityUpdatedDate::PARAM_UPDATED_FROM, '2025-01-01 00:00:00');\n $updatedToFilter = $this->makeFilter(ActivityUpdatedDate::PARAM_UPDATED_TO, '2025-01-31 23:59:59');\n\n $savedSearch = $this->makeSavedSearch([\n $nonDateFilter,\n $startDateFilter,\n $endDateFilter,\n $updatedFromFilter,\n $updatedToFilter,\n ]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n\n $capturedCriteria = null;\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {\n $capturedCriteria = $criteria;\n\n return $filterSet;\n });\n\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);\n $this->logger->method('info');\n\n $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertNotNull($capturedCriteria);\n }\n\n public function testGetActivityIdsFiltersOutClosingPeriodDateFilters(): void\n {\n $user = $this->makeUser();\n\n $closingStartFilter = $this->makeFilter(ClosingPeriodFilter::KEY_START_DATE, '2025-01-01');\n $closingEndFilter = $this->makeFilter(ClosingPeriodFilter::KEY_END_DATE, '2025-03-31');\n $regularFilter = $this->makeFilter('rep_id', '99');\n\n $savedSearch = $this->makeSavedSearch([\n $closingStartFilter,\n $closingEndFilter,\n $regularFilter,\n ]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturn($filterSet);\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn(['id-1']);\n $this->logger->method('info');\n\n $result = $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertEquals(['id-1'], $result);\n }\n\n public function testGetActivityIdsHandlesArrayFilters(): void\n {\n $user = $this->makeUser();\n\n $filter1 = $this->makeFilter('outcome', 'positive');\n $filter2 = $this->makeFilter('outcome', 'negative');\n\n $savedSearch = $this->makeSavedSearch([$filter1, $filter2]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn(['outcome']);\n $this->activitySearch->method('getOnDemandPageFilterSet')->willReturn($filterSet);\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn(['id-1']);\n $this->logger->method('info');\n\n $result = $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertEquals(['id-1'], $result);\n }\n\n public function testGetActivityIdsHandlesScalarFilters(): void\n {\n $user = $this->makeUser();\n\n $filter = $this->makeFilter('direction', 'inbound');\n $savedSearch = $this->makeSavedSearch([$filter]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->activitySearch->method('getOnDemandPageFilterSet')->willReturn($filterSet);\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn(['id-5']);\n $this->logger->method('info');\n\n $result = $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertEquals(['id-5'], $result);\n }\n\n public function testGetActivityIdsPassesNonZeroSequenceNumberToDisableFirstRequestDefaults(): void\n {\n $user = $this->makeUser();\n $savedSearch = $this->makeSavedSearch([]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n\n $capturedCriteria = null;\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {\n $capturedCriteria = $criteria;\n\n return $filterSet;\n });\n\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);\n $this->logger->method('info');\n\n $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertNotNull($capturedCriteria);\n $this->assertFalse($capturedCriteria->isFirstRequest());\n }\n\n public function testGetActivityIdsLogsWithCorrectContext(): void\n {\n $user = $this->makeUser();\n $savedSearch = $this->makeSavedSearch([]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->activitySearch->method('getOnDemandPageFilterSet')->willReturn($filterSet);\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn(['a', 'b']);\n\n $this->logger->expects($this->once())\n ->method('info')\n ->with(\n '[AskJiminnyReport] Fetched activity IDs for saved search',\n $this->callback(fn ($context) => $context['saved_search_id'] === 42\n && $context['user_id'] === 1\n && $context['activity_count'] === 2)\n );\n\n $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n }\n\n public static function frequencyDateRangeProvider(): array\n {\n return [\n 'daily' => [\n AutomatedReportsService::FREQUENCY_DAILY,\n '2025-06-15 00:00:00',\n '2025-06-15 23:59:59',\n ],\n 'weekly' => [\n AutomatedReportsService::FREQUENCY_WEEKLY,\n '2025-06-09 00:00:00',\n '2025-06-15 23:59:59',\n ],\n 'monthly' => [\n AutomatedReportsService::FREQUENCY_MONTHLY,\n '2025-05-01 00:00:00',\n '2025-05-31 23:59:59',\n ],\n 'quarterly' => [\n AutomatedReportsService::FREQUENCY_QUARTERLY,\n '2025-01-01 00:00:00',\n '2025-03-31 23:59:59',\n ],\n ];\n }\n\n /**\n * @dataProvider frequencyDateRangeProvider\n */\n public function testGetActivityIdsInjectsDateRangeForFrequency(\n string $frequency,\n string $expectedStartDate,\n string $expectedEndDate,\n ): void {\n CarbonImmutable::setTestNow('2025-06-16 12:00:00');\n\n try {\n $user = $this->makeUser();\n $savedSearch = $this->makeSavedSearch([]);\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->logger->method('info');\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);\n\n $capturedCriteria = null;\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {\n $capturedCriteria = $criteria;\n\n return $filterSet;\n });\n\n $this->service->getActivityIdsForSavedSearch($savedSearch, $user, $frequency);\n\n $this->assertNotNull($capturedCriteria);\n $this->assertSame($expectedStartDate, $capturedCriteria->getStartDate()->format('Y-m-d H:i:s'));\n $this->assertSame($expectedEndDate, $capturedCriteria->getEndDate()->format('Y-m-d H:i:s'));\n } finally {\n CarbonImmutable::setTestNow();\n }\n }\n\n public function testGetActivityIdsWithNullFrequencyDoesNotInjectDates(): void\n {\n $user = $this->makeUser();\n $savedSearch = $this->makeSavedSearch([]);\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->logger->method('info');\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);\n\n $capturedCriteria = null;\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {\n $capturedCriteria = $criteria;\n\n return $filterSet;\n });\n\n $this->service->getActivityIdsForSavedSearch($savedSearch, $user, null);\n\n $this->assertNotNull($capturedCriteria);\n $this->assertNull($capturedCriteria->getStartDate());\n $this->assertNull($capturedCriteria->getEndDate());\n }\n\n public function testGetActivityIdsWithUnknownFrequencyDoesNotInjectDates(): void\n {\n $user = $this->makeUser();\n $savedSearch = $this->makeSavedSearch([]);\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->logger->method('info');\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);\n\n $capturedCriteria = null;\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {\n $capturedCriteria = $criteria;\n\n return $filterSet;\n });\n\n $this->service->getActivityIdsForSavedSearch($savedSearch, $user, AutomatedReportsService::FREQUENCY_ONE_OFF);\n\n $this->assertNotNull($capturedCriteria);\n $this->assertNull($capturedCriteria->getStartDate());\n $this->assertNull($capturedCriteria->getEndDate());\n }\n\n public function testGetActivityIdsFrequencyDateRangeOverridesSavedSearchDateFilters(): void\n {\n CarbonImmutable::setTestNow('2025-06-16 12:00:00');\n\n try {\n $user = $this->makeUser();\n\n $startDateFilter = $this->makeFilter(ActivityActualDate::PARAM_START_DATE, '2024-01-01 00:00:00');\n $endDateFilter = $this->makeFilter(ActivityActualDate::PARAM_END_DATE, '2024-12-31 23:59:59');\n $savedSearch = $this->makeSavedSearch([$startDateFilter, $endDateFilter]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->logger->method('info');\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);\n\n $capturedCriteria = null;\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {\n $capturedCriteria = $criteria;\n\n return $filterSet;\n });\n\n $this->service->getActivityIdsForSavedSearch($savedSearch, $user, AutomatedReportsService::FREQUENCY_DAILY);\n\n $this->assertNotNull($capturedCriteria);\n $this->assertSame('2025-06-15 00:00:00', $capturedCriteria->getStartDate()->format('Y-m-d H:i:s'));\n $this->assertSame('2025-06-15 23:59:59', $capturedCriteria->getEndDate()->format('Y-m-d H:i:s'));\n } finally {\n CarbonImmutable::setTestNow();\n }\n }\n}","role_description":"text entry area","is_enabled":true,"is_focused":true,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.088194445,"height":0.027777778},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"","depth":4,"value":"","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Project","depth":3,"role_description":"text"},{"role":"AXButton","text":"Project","depth":3,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"New File or Directory…","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Expand Selected","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Collapse All","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Options","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"app ~/jiminny/app","depth":6,"role_description":"text"},{"role":"AXStaticText","text":".circleci","depth":7,"role_description":"text"},{"role":"AXStaticText","text":".cursor","depth":7,"role_description":"text"},{"role":"AXStaticText","text":".github","depth":7,"role_description":"text"},{"role":"AXStaticText","text":".sonarlint","depth":7,"role_description":"text"},{"role":"AXStaticText","text":".vscode","depth":7,"role_description":"text"},{"role":"AXStaticText","text":".windsurf","depth":7,"role_description":"text"},{"role":"AXStaticText","text":"app, sources root","depth":7,"role_description":"text"},{"role":"AXStaticText","text":"Actions","depth":8,"role_description":"text"},{"role":"AXStaticText","text":"Component","depth":8,"role_description":"text"},{"role":"AXStaticText","text":"Acl, folder","depth":9,"role_description":"text"},{"role":"AXStaticText","text":"ActionItems, folder","depth":9,"role_description":"text"},{"role":"AXStaticText","text":"Activity, folder","depth":9,"role_description":"text"},{"role":"AXStaticText","text":"ActivityAnalytics, folder","depth":9,"role_description":"text"},{"role":"AXStaticText","text":"ActivitySearch, folder","depth":9,"role_description":"text"},{"role":"AXStaticText","text":"EventSubscriber, folder","depth":10,"role_description":"text"},{"role":"AXStaticText","text":"FilterDefinition, folder","depth":10,"role_description":"text"},{"role":"AXStaticText","text":"DealInsights, folder","depth":11,"role_description":"text"},{"role":"AXStaticText","text":"Security","depth":11,"role_description":"text"},{"role":"AXStaticText","text":"TeamInsights","depth":11,"role_description":"text"},{"role":"AXStaticText","text":"ActivityActualDate.php, class","depth":11,"role_description":"text"},{"role":"AXStaticText","text":"ActivityChannel.php, final class","depth":11,"role_description":"text"},{"role":"AXStaticText","text":"ActivityDurationRange.php, class","depth":11,"role_description":"text"},{"role":"AXStaticText","text":"ActivityFilter.php, final class","depth":11,"role_description":"text"},{"role":"AXStaticText","text":"ActivityPlaylistIn.php, final class","depth":11,"role_description":"text"},{"role":"AXStaticText","text":"ActivityProviderIn.php, final class","depth":11,"role_description":"text"},{"role":"AXStaticText","text":"ActivityRecorded.php, class","depth":11,"role_description":"text"},{"role":"AXStaticText","text":"ActivityRecordingStopped.php, final class","depth":11,"role_description":"text"},{"role":"AXStaticText","text":"ActivityScheduledDate.php, final class","depth":11,"role_description":"text"},{"role":"AXStaticText","text":"ActivityStatusIn.php, class","depth":11,"role_description":"text"},{"role":"AXStaticText","text":"ActivityType.php, final class","depth":11,"role_description":"text"},{"role":"AXStaticText","text":"ActivityUpdatedDate.php, final class","depth":11,"role_description":"text"},{"role":"AXStaticText","text":"AiCallScoreFilter.php, final class","depth":11,"role_description":"text"},{"role":"AXStaticText","text":"AutoScoreFilter.php, final class","depth":11,"role_description":"text"},{"role":"AXStaticText","text":"ClosedDealsFilter.php, final class","depth":11,"role_description":"text"},{"role":"AXStaticText","text":"CoachingFeedbackAverageScore.php, final class","depth":11,"role_description":"text"},{"role":"AXStaticText","text":"CoachingFeedbackCoachUserIn.php, final class","depth":11,"role_description":"text"},{"role":"AXStaticText","text":"CommentCountRange.php, final class","depth":11,"role_description":"text"},{"role":"AXStaticText","text":"CrmFieldCollection.php, final class","depth":11,"role_description":"text"},{"role":"AXStaticText","text":"CurrentStage.php, final class","depth":11,"role_description":"text"},{"role":"AXStaticText","text":"Customer.php, final class","depth":11,"role_description":"text"},{"role":"AXStaticText","text":"CustomerMonologueDuration.php, final class","depth":11,"role_description":"text"},{"role":"AXStaticText","text":"CustomerQuestionCount.php, final class","depth":11,"role_description":"text"},{"role":"AXStaticText","text":"DealAge.php, final class","depth":11,"role_description":"text"},{"role":"AXStaticText","text":"DealCloseDate.php, final class","depth":11,"role_description":"text"},{"role":"AXStaticText","text":"DealValue.php, final class","depth":11,"role_description":"text"},{"role":"AXStaticText","text":"EngagingQuestionCount.php, final class","depth":11,"role_description":"text"},{"role":"AXStaticText","text":"ExternalId.php, final class","depth":11,"role_description":"text"},{"role":"AXStaticText","text":"HasPendingAiCrmNotes.php, final class","depth":11,"role_description":"text"},{"role":"AXStaticText","text":"HasTopicTriggersFilterDefinition.php, final class","depth":11,"role_description":"text"}]...
|
9186995013950281446
|
956156618775664006
|
click
|
accessibility
|
NULL
|
Project: faVsco.js, menu
#11894 on JY-18909-automa Project: faVsco.js, menu
#11894 on JY-18909-automated-reports-ask-jiminny, menu
Start Listening for PHP Debug Connections
AskJiminnyReportActivityServiceTest
Run 'AskJiminnyReportActivityServiceTest'
Debug 'AskJiminnyReportActivityServiceTest'
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 Carbon\CarbonImmutable;
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\Services\Kiosk\AutomatedReports\AutomatedReportsService;
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);
}
public static function frequencyDateRangeProvider(): array
{
return [
'daily' => [
AutomatedReportsService::FREQUENCY_DAILY,
'2025-06-15 00:00:00',
'2025-06-15 23:59:59',
],
'weekly' => [
AutomatedReportsService::FREQUENCY_WEEKLY,
'2025-06-09 00:00:00',
'2025-06-15 23:59:59',
],
'monthly' => [
AutomatedReportsService::FREQUENCY_MONTHLY,
'2025-05-01 00:00:00',
'2025-05-31 23:59:59',
],
'quarterly' => [
AutomatedReportsService::FREQUENCY_QUARTERLY,
'2025-01-01 00:00:00',
'2025-03-31 23:59:59',
],
];
}
/**
* @dataProvider frequencyDateRangeProvider
*/
public function testGetActivityIdsInjectsDateRangeForFrequency(
string $frequency,
string $expectedStartDate,
string $expectedEndDate,
): void {
CarbonImmutable::setTestNow('2025-06-16 12:00:00');
try {
$user = $this->makeUser();
$savedSearch = $this->makeSavedSearch([]);
$filterSet = $this->createMock(FilterDefinitionCollection::class);
$this->activitySearch->method('getArrayFilterKeys')->willReturn([]);
$this->logger->method('info');
$this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);
$capturedCriteria = null;
$this->activitySearch->expects($this->once())
->method('getOnDemandPageFilterSet')
->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {
$capturedCriteria = $criteria;
return $filterSet;
});
$this->service->getActivityIdsForSavedSearch($savedSearch, $user, $frequency);
$this->assertNotNull($capturedCriteria);
$this->assertSame($expectedStartDate, $capturedCriteria->getStartDate()->format('Y-m-d H:i:s'));
$this->assertSame($expectedEndDate, $capturedCriteria->getEndDate()->format('Y-m-d H:i:s'));
} finally {
CarbonImmutable::setTestNow();
}
}
public function testGetActivityIdsWithNullFrequencyDoesNotInjectDates(): void
{
$user = $this->makeUser();
$savedSearch = $this->makeSavedSearch([]);
$filterSet = $this->createMock(FilterDefinitionCollection::class);
$this->activitySearch->method('getArrayFilterKeys')->willReturn([]);
$this->logger->method('info');
$this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);
$capturedCriteria = null;
$this->activitySearch->expects($this->once())
->method('getOnDemandPageFilterSet')
->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {
$capturedCriteria = $criteria;
return $filterSet;
});
$this->service->getActivityIdsForSavedSearch($savedSearch, $user, null);
$this->assertNotNull($capturedCriteria);
$this->assertNull($capturedCriteria->getStartDate());
$this->assertNull($capturedCriteria->getEndDate());
}
public function testGetActivityIdsWithUnknownFrequencyDoesNotInjectDates(): void
{
$user = $this->makeUser();
$savedSearch = $this->makeSavedSearch([]);
$filterSet = $this->createMock(FilterDefinitionCollection::class);
$this->activitySearch->method('getArrayFilterKeys')->willReturn([]);
$this->logger->method('info');
$this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);
$capturedCriteria = null;
$this->activitySearch->expects($this->once())
->method('getOnDemandPageFilterSet')
->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {
$capturedCriteria = $criteria;
return $filterSet;
});
$this->service->getActivityIdsForSavedSearch($savedSearch, $user, AutomatedReportsService::FREQUENCY_ONE_OFF);
$this->assertNotNull($capturedCriteria);
$this->assertNull($capturedCriteria->getStartDate());
$this->assertNull($capturedCriteria->getEndDate());
}
public function testGetActivityIdsFrequencyDateRangeOverridesSavedSearchDateFilters(): void
{
CarbonImmutable::setTestNow('2025-06-16 12:00:00');
try {
$user = $this->makeUser();
$startDateFilter = $this->makeFilter(ActivityActualDate::PARAM_START_DATE, '2024-01-01 00:00:00');
$endDateFilter = $this->makeFilter(ActivityActualDate::PARAM_END_DATE, '2024-12-31 23:59:59');
$savedSearch = $this->makeSavedSearch([$startDateFilter, $endDateFilter]);
$filterSet = $this->createMock(FilterDefinitionCollection::class);
$this->activitySearch->method('getArrayFilterKeys')->willReturn([]);
$this->logger->method('info');
$this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);
$capturedCriteria = null;
$this->activitySearch->expects($this->once())
->method('getOnDemandPageFilterSet')
->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {
$capturedCriteria = $criteria;
return $filterSet;
});
$this->service->getActivityIdsForSavedSearch($savedSearch, $user, AutomatedReportsService::FREQUENCY_DAILY);
$this->assertNotNull($capturedCriteria);
$this->assertSame('2025-06-15 00:00:00', $capturedCriteria->getStartDate()->format('Y-m-d H:i:s'));
$this->assertSame('2025-06-15 23:59:59', $capturedCriteria->getEndDate()->format('Y-m-d H:i:s'));
} finally {
CarbonImmutable::setTestNow();
}
}
}
Code changed:
Hide
Sync Changes
Hide This Notification
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
DealInsights, folder
Security
TeamInsights
ActivityActualDate.php, class
ActivityChannel.php, final class
ActivityDurationRange.php, class
ActivityFilter.php, final class
ActivityPlaylistIn.php, final class
ActivityProviderIn.php, final class
ActivityRecorded.php, class
ActivityRecordingStopped.php, final class
ActivityScheduledDate.php, final class
ActivityStatusIn.php, class
ActivityType.php, final class
ActivityUpdatedDate.php, final class
AiCallScoreFilter.php, final class
AutoScoreFilter.php, final class
ClosedDealsFilter.php, final class
CoachingFeedbackAverageScore.php, final class
CoachingFeedbackCoachUserIn.php, final class
CommentCountRange.php, final class
CrmFieldCollection.php, final class
CurrentStage.php, final class
Customer.php, final class
CustomerMonologueDuration.php, final class
CustomerQuestionCount.php, final class
DealAge.php, final class
DealCloseDate.php, final class
DealValue.php, final class
EngagingQuestionCount.php, final class
ExternalId.php, final class
HasPendingAiCrmNotes.php, final class
HasTopicTriggersFilterDefinition.php, final class...
|
54879
|
|
54883
|
NULL
|
0
|
2026-04-20T09:22:28.423426+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-20/1776 /Users/lukas/.screenpipe/data/data/2026-04-20/1776676948423_m2.jpg...
|
PhpStorm
|
faVsco.js – AskJiminnyReportActivityServiceTest.ph faVsco.js – AskJiminnyReportActivityServiceTest.php...
|
True
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
#11894 on JY-18909-automa Project: faVsco.js, menu
#11894 on JY-18909-automated-reports-ask-jiminny, menu
Start Listening for PHP Debug Connections
AskJiminnyReportActivityServiceTest
Run 'AskJiminnyReportActivityServiceTest'
Debug 'AskJiminnyReportActivityServiceTest'
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 Carbon\CarbonImmutable;
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\Services\Kiosk\AutomatedReports\AutomatedReportsService;
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);
}
public static function frequencyDateRangeProvider(): array
{
return [
'daily' => [
AutomatedReportsService::FREQUENCY_DAILY,
'2025-06-15 00:00:00',
'2025-06-15 23:59:59',
],
'weekly' => [
AutomatedReportsService::FREQUENCY_WEEKLY,
'2025-06-09 00:00:00',
'2025-06-15 23:59:59',
],
'monthly' => [
AutomatedReportsService::FREQUENCY_MONTHLY,
'2025-05-01 00:00:00',
'2025-05-31 23:59:59',
],
'quarterly' => [
AutomatedReportsService::FREQUENCY_QUARTERLY,
'2025-01-01 00:00:00',
'2025-03-31 23:59:59',
],
];
}
/**
* @dataProvider frequencyDateRangeProvider
*/
public function testGetActivityIdsInjectsDateRangeForFrequency(
string $frequency,
string $expectedStartDate,
string $expectedEndDate,
): void {
CarbonImmutable::setTestNow('2025-06-16 12:00:00');
try {
$user = $this->makeUser();
$savedSearch = $this->makeSavedSearch([]);
$filterSet = $this->createMock(FilterDefinitionCollection::class);
$this->activitySearch->method('getArrayFilterKeys')->willReturn([]);
$this->logger->method('info');
$this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);
$capturedCriteria = null;
$this->activitySearch->expects($this->once())
->method('getOnDemandPageFilterSet')
->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {
$capturedCriteria = $criteria;
return $filterSet;
});
$this->service->getActivityIdsForSavedSearch($savedSearch, $user, $frequency);
$this->assertNotNull($capturedCriteria);
$this->assertSame($expectedStartDate, $capturedCriteria->getStartDate()->format('Y-m-d H:i:s'));
$this->assertSame($expectedEndDate, $capturedCriteria->getEndDate()->format('Y-m-d H:i:s'));
} finally {
CarbonImmutable::setTestNow();
}
}
public function testGetActivityIdsWithNullFrequencyDoesNotInjectDates(): void
{
$user = $this->makeUser();
$savedSearch = $this->makeSavedSearch([]);
$filterSet = $this->createMock(FilterDefinitionCollection::class);
$this->activitySearch->method('getArrayFilterKeys')->willReturn([]);
$this->logger->method('info');
$this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);
$capturedCriteria = null;
$this->activitySearch->expects($this->once())
->method('getOnDemandPageFilterSet')
->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {
$capturedCriteria = $criteria;
return $filterSet;
});
$this->service->getActivityIdsForSavedSearch($savedSearch, $user, null);
$this->assertNotNull($capturedCriteria);
$this->assertNull($capturedCriteria->getStartDate());
$this->assertNull($capturedCriteria->getEndDate());
}
public function testGetActivityIdsWithUnknownFrequencyDoesNotInjectDates(): void
{
$user = $this->makeUser();
$savedSearch = $this->makeSavedSearch([]);
$filterSet = $this->createMock(FilterDefinitionCollection::class);
$this->activitySearch->method('getArrayFilterKeys')->willReturn([]);
$this->logger->method('info');
$this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);
$capturedCriteria = null;
$this->activitySearch->expects($this->once())
->method('getOnDemandPageFilterSet')
->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {
$capturedCriteria = $criteria;
return $filterSet;
});
$this->service->getActivityIdsForSavedSearch($savedSearch, $user, AutomatedReportsService::FREQUENCY_ONE_OFF);
$this->assertNotNull($capturedCriteria);
$this->assertNull($capturedCriteria->getStartDate());
$this->assertNull($capturedCriteria->getEndDate());
}
public function testGetActivityIdsFrequencyDateRangeOverridesSavedSearchDateFilters(): void
{
CarbonImmutable::setTestNow('2025-06-16 12:00:00');
try {
$user = $this->makeUser();
$startDateFilter = $this->makeFilter(ActivityActualDate::PARAM_START_DATE, '2024-01-01 00:00:00');
$endDateFilter = $this->makeFilter(ActivityActualDate::PARAM_END_DATE, '2024-12-31 23:59:59');
$savedSearch = $this->makeSavedSearch([$startDateFilter, $endDateFilter]);
$filterSet = $this->createMock(FilterDefinitionCollection::class);
$this->activitySearch->method('getArrayFilterKeys')->willReturn([]);
$this->logger->method('info');
$this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);
$capturedCriteria = null;
$this->activitySearch->expects($this->once())
->method('getOnDemandPageFilterSet')
->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {
$capturedCriteria = $criteria;
return $filterSet;
});
$this->service->getActivityIdsForSavedSearch($savedSearch, $user, AutomatedReportsService::FREQUENCY_DAILY);
$this->assertNotNull($capturedCriteria);
$this->assertSame('2025-06-15 00:00:00', $capturedCriteria->getStartDate()->format('Y-m-d H:i:s'));
$this->assertSame('2025-06-15 23:59:59', $capturedCriteria->getEndDate()->format('Y-m-d H:i:s'));
} finally {
CarbonImmutable::setTestNow();
}
}
}
Code changed:
Hide
Sync Changes
Hide This Notification
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
DealInsights, folder
Security
TeamInsights
ActivityActualDate.php, class
ActivityChannel.php, final class
ActivityDurationRange.php, class
ActivityFilter.php, final class
ActivityPlaylistIn.php, final class
ActivityProviderIn.php, final class
ActivityRecorded.php, class
ActivityRecordingStopped.php, final class
ActivityScheduledDate.php, final class
ActivityStatusIn.php, class
ActivityType.php, final class
ActivityUpdatedDate.php, final class
AiCallScoreFilter.php, final class
AutoScoreFilter.php, final class
ClosedDealsFilter.php, final class
CoachingFeedbackAverageScore.php, final class
CoachingFeedbackCoachUserIn.php, final class
CommentCountRange.php, final class
CrmFieldCollection.php, final class
CurrentStage.php, final class
Customer.php, final class
CustomerMonologueDuration.php, final class
CustomerQuestionCount.php, final class
DealAge.php, final class
DealCloseDate.php, final class
DealValue.php, final class
EngagingQuestionCount.php, final class
ExternalId.php, final class
HasPendingAiCrmNotes.php, final class
HasTopicTriggersFilterDefinition.php, final class
HasTranscription.php, final class
InputTypeEnum.php, final class
InsightfulQuestionCount.php, final class
LanguageFilterDefinition.php, final class
LoggedToCrm.php, final class
NudgeRunId.php, final class
OnlyActiveUsers.php, final class
OrganiserGroupIn.php, class
OrganiserTeamIn.php, final class
OrganiserUserIn.php, class
OrganiserUserNotIn.php, final class
ParticipantUserIn.php, final class
PartnerFilterDefinition.php, final class
PatienceRange.php, final class
PlaybackTopicFilterDefinition.php, final class
ProviderFilterDefinition.php, final class
ShowInternalExternalActivitiesFilter.php, final class
SortBy.php, final class
SpeechRate.php, final class
StageAtCallFilterDefinition.php, class
TalkTimeRatio.php, final class
TeamMemberUserIn.php, final class
TranscriptionComposite.php, final class
UserGroupInOptionalFilter.php, final class
UserMonologueDuration.php, final class
UserQuestionCount.php, final class
Service
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
ParagraphBreaker
ParticipantSpeech
PartitionedCookie
PlaybackPage
Playlist
Prophet
ProphetAi
ProsperWorks
Queue
Router
Saml2
SCIM
Seeder
Sentry
Serializer
Settings
Sidekick
Slack
TeamInsights
TimeMemoryMapper
Transcription...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"bounds":{"left":0.025930852,"top":0.019952115,"width":0.03856383,"height":0.025538707},"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"#11894 on JY-18909-automated-reports-ask-jiminny, menu","depth":5,"bounds":{"left":0.064494684,"top":0.019952115,"width":0.12134308,"height":0.025538707},"help_text":"Pull request #11894 exists for current branch JY-18909-automated-reports-ask-jiminny","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"bounds":{"left":0.8081782,"top":0.019952115,"width":0.011303191,"height":0.025538707},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"AskJiminnyReportActivityServiceTest","depth":6,"bounds":{"left":0.8234708,"top":0.019952115,"width":0.09208777,"height":0.025538707},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run 'AskJiminnyReportActivityServiceTest'","depth":6,"bounds":{"left":0.9155585,"top":0.019952115,"width":0.011303191,"height":0.025538707},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'AskJiminnyReportActivityServiceTest'","depth":6,"bounds":{"left":0.9268617,"top":0.019952115,"width":0.011303191,"height":0.025538707},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"More Actions","depth":6,"bounds":{"left":0.9381649,"top":0.019952115,"width":0.011303191,"height":0.025538707},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JetBrains AI","depth":5,"bounds":{"left":0.96609044,"top":0.019952115,"width":0.011303191,"height":0.025538707},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Search Everywhere","depth":5,"bounds":{"left":0.9773936,"top":0.019952115,"width":0.011303191,"height":0.025538707},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"IDE and Project Settings","depth":5,"bounds":{"left":0.9886968,"top":0.019952115,"width":0.011303186,"height":0.025538707},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.042220745,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"2","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.007978723,"height":0.0},"role_description":"text"},{"role":"AXStaticText","text":"3","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.007978723,"height":0.0},"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.00731383,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.006981383,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Tests\\Unit\\Services\\Kiosk\\AutomatedReports;\n\nuse Carbon\\CarbonImmutable;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinition\\ActivityActualDate;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinition\\ActivityUpdatedDate;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinition\\DealInsights\\ClosingPeriodFilter;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinitionCollection;\nuse Jiminny\\Component\\ActivitySearch\\Service\\ActivitySearch;\nuse Jiminny\\Models\\Activity\\Search;\nuse Jiminny\\Models\\Activity\\SearchFilter;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Repositories\\ElasticActivityRepository;\nuse Jiminny\\Services\\Kiosk\\AutomatedReports\\AskJiminnyReportActivityService;\nuse Jiminny\\Services\\Kiosk\\AutomatedReports\\AutomatedReportsService;\nuse Jiminny\\VO\\Repository\\OnDemandActivitySearch\\Criteria;\nuse PHPUnit\\Framework\\MockObject\\MockObject;\nuse PHPUnit\\Framework\\TestCase;\nuse Psr\\Log\\LoggerInterface;\n\nclass AskJiminnyReportActivityServiceTest extends TestCase\n{\n private ActivitySearch&MockObject $activitySearch;\n private ElasticActivityRepository&MockObject $elasticRepository;\n private LoggerInterface&MockObject $logger;\n private AskJiminnyReportActivityService $service;\n\n protected function setUp(): void\n {\n $this->activitySearch = $this->createMock(ActivitySearch::class);\n $this->elasticRepository = $this->createMock(ElasticActivityRepository::class);\n $this->logger = $this->createMock(LoggerInterface::class);\n\n $this->service = new AskJiminnyReportActivityService(\n $this->activitySearch,\n $this->elasticRepository,\n $this->logger,\n );\n }\n\n private function makeFilter(string $key, ?string $value): SearchFilter&MockObject\n {\n $filter = $this->createMock(SearchFilter::class);\n $filter->method('getFilterProperty')->willReturn($key);\n $filter->method('getFilterValue')->willReturn($value);\n\n return $filter;\n }\n\n private function makeUser(): User&MockObject\n {\n $tz = new \\DateTimeZone('UTC');\n $user = $this->createMock(User::class);\n $user->method('getTimezone')->willReturn($tz);\n $user->method('getId')->willReturn(1);\n $user->method('getUuid')->willReturn('user-uuid');\n\n return $user;\n }\n\n private function makeSavedSearch(array $filters): Search&MockObject\n {\n $savedSearch = $this->createMock(Search::class);\n $savedSearch->method('getId')->willReturn(42);\n $savedSearch->method('getFilters')->willReturn(new \\Illuminate\\Support\\LazyCollection($filters));\n\n return $savedSearch;\n }\n\n public function testGetActivityIdsForSavedSearchReturnsIds(): void\n {\n $user = $this->makeUser();\n $savedSearch = $this->makeSavedSearch([]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->expects($this->once())\n ->method('getArrayFilterKeys')\n ->with($user)\n ->willReturn([]);\n\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturn($filterSet);\n\n $this->elasticRepository->expects($this->once())\n ->method('onDemandSearchIdsOnly')\n ->willReturn(['id-1', 'id-2', 'id-3']);\n\n $this->logger->expects($this->once())\n ->method('info')\n ->with('[AskJiminnyReport] Fetched activity IDs for saved search');\n\n $result = $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertEquals(['id-1', 'id-2', 'id-3'], $result);\n }\n\n public function testGetActivityIdsForSavedSearchReturnsEmptyWhenNoResults(): void\n {\n $user = $this->makeUser();\n $savedSearch = $this->makeSavedSearch([]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->activitySearch->method('getOnDemandPageFilterSet')->willReturn($filterSet);\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);\n\n $this->logger->expects($this->once())->method('info');\n\n $result = $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertEmpty($result);\n }\n\n public function testGetActivityIdsFiltersOutDateFilters(): void\n {\n $user = $this->makeUser();\n\n $nonDateFilter = $this->makeFilter('owner_id', '123');\n $startDateFilter = $this->makeFilter(ActivityActualDate::PARAM_START_DATE, '2025-01-01 00:00:00');\n $endDateFilter = $this->makeFilter(ActivityActualDate::PARAM_END_DATE, '2025-01-31 23:59:59');\n $updatedFromFilter = $this->makeFilter(ActivityUpdatedDate::PARAM_UPDATED_FROM, '2025-01-01 00:00:00');\n $updatedToFilter = $this->makeFilter(ActivityUpdatedDate::PARAM_UPDATED_TO, '2025-01-31 23:59:59');\n\n $savedSearch = $this->makeSavedSearch([\n $nonDateFilter,\n $startDateFilter,\n $endDateFilter,\n $updatedFromFilter,\n $updatedToFilter,\n ]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n\n $capturedCriteria = null;\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {\n $capturedCriteria = $criteria;\n\n return $filterSet;\n });\n\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);\n $this->logger->method('info');\n\n $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertNotNull($capturedCriteria);\n }\n\n public function testGetActivityIdsFiltersOutClosingPeriodDateFilters(): void\n {\n $user = $this->makeUser();\n\n $closingStartFilter = $this->makeFilter(ClosingPeriodFilter::KEY_START_DATE, '2025-01-01');\n $closingEndFilter = $this->makeFilter(ClosingPeriodFilter::KEY_END_DATE, '2025-03-31');\n $regularFilter = $this->makeFilter('rep_id', '99');\n\n $savedSearch = $this->makeSavedSearch([\n $closingStartFilter,\n $closingEndFilter,\n $regularFilter,\n ]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturn($filterSet);\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn(['id-1']);\n $this->logger->method('info');\n\n $result = $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertEquals(['id-1'], $result);\n }\n\n public function testGetActivityIdsHandlesArrayFilters(): void\n {\n $user = $this->makeUser();\n\n $filter1 = $this->makeFilter('outcome', 'positive');\n $filter2 = $this->makeFilter('outcome', 'negative');\n\n $savedSearch = $this->makeSavedSearch([$filter1, $filter2]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn(['outcome']);\n $this->activitySearch->method('getOnDemandPageFilterSet')->willReturn($filterSet);\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn(['id-1']);\n $this->logger->method('info');\n\n $result = $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertEquals(['id-1'], $result);\n }\n\n public function testGetActivityIdsHandlesScalarFilters(): void\n {\n $user = $this->makeUser();\n\n $filter = $this->makeFilter('direction', 'inbound');\n $savedSearch = $this->makeSavedSearch([$filter]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->activitySearch->method('getOnDemandPageFilterSet')->willReturn($filterSet);\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn(['id-5']);\n $this->logger->method('info');\n\n $result = $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertEquals(['id-5'], $result);\n }\n\n public function testGetActivityIdsPassesNonZeroSequenceNumberToDisableFirstRequestDefaults(): void\n {\n $user = $this->makeUser();\n $savedSearch = $this->makeSavedSearch([]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n\n $capturedCriteria = null;\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {\n $capturedCriteria = $criteria;\n\n return $filterSet;\n });\n\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);\n $this->logger->method('info');\n\n $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertNotNull($capturedCriteria);\n $this->assertFalse($capturedCriteria->isFirstRequest());\n }\n\n public function testGetActivityIdsLogsWithCorrectContext(): void\n {\n $user = $this->makeUser();\n $savedSearch = $this->makeSavedSearch([]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->activitySearch->method('getOnDemandPageFilterSet')->willReturn($filterSet);\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn(['a', 'b']);\n\n $this->logger->expects($this->once())\n ->method('info')\n ->with(\n '[AskJiminnyReport] Fetched activity IDs for saved search',\n $this->callback(fn ($context) => $context['saved_search_id'] === 42\n && $context['user_id'] === 1\n && $context['activity_count'] === 2)\n );\n\n $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n }\n\n public static function frequencyDateRangeProvider(): array\n {\n return [\n 'daily' => [\n AutomatedReportsService::FREQUENCY_DAILY,\n '2025-06-15 00:00:00',\n '2025-06-15 23:59:59',\n ],\n 'weekly' => [\n AutomatedReportsService::FREQUENCY_WEEKLY,\n '2025-06-09 00:00:00',\n '2025-06-15 23:59:59',\n ],\n 'monthly' => [\n AutomatedReportsService::FREQUENCY_MONTHLY,\n '2025-05-01 00:00:00',\n '2025-05-31 23:59:59',\n ],\n 'quarterly' => [\n AutomatedReportsService::FREQUENCY_QUARTERLY,\n '2025-01-01 00:00:00',\n '2025-03-31 23:59:59',\n ],\n ];\n }\n\n /**\n * @dataProvider frequencyDateRangeProvider\n */\n public function testGetActivityIdsInjectsDateRangeForFrequency(\n string $frequency,\n string $expectedStartDate,\n string $expectedEndDate,\n ): void {\n CarbonImmutable::setTestNow('2025-06-16 12:00:00');\n\n try {\n $user = $this->makeUser();\n $savedSearch = $this->makeSavedSearch([]);\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->logger->method('info');\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);\n\n $capturedCriteria = null;\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {\n $capturedCriteria = $criteria;\n\n return $filterSet;\n });\n\n $this->service->getActivityIdsForSavedSearch($savedSearch, $user, $frequency);\n\n $this->assertNotNull($capturedCriteria);\n $this->assertSame($expectedStartDate, $capturedCriteria->getStartDate()->format('Y-m-d H:i:s'));\n $this->assertSame($expectedEndDate, $capturedCriteria->getEndDate()->format('Y-m-d H:i:s'));\n } finally {\n CarbonImmutable::setTestNow();\n }\n }\n\n public function testGetActivityIdsWithNullFrequencyDoesNotInjectDates(): void\n {\n $user = $this->makeUser();\n $savedSearch = $this->makeSavedSearch([]);\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->logger->method('info');\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);\n\n $capturedCriteria = null;\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {\n $capturedCriteria = $criteria;\n\n return $filterSet;\n });\n\n $this->service->getActivityIdsForSavedSearch($savedSearch, $user, null);\n\n $this->assertNotNull($capturedCriteria);\n $this->assertNull($capturedCriteria->getStartDate());\n $this->assertNull($capturedCriteria->getEndDate());\n }\n\n public function testGetActivityIdsWithUnknownFrequencyDoesNotInjectDates(): void\n {\n $user = $this->makeUser();\n $savedSearch = $this->makeSavedSearch([]);\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->logger->method('info');\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);\n\n $capturedCriteria = null;\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {\n $capturedCriteria = $criteria;\n\n return $filterSet;\n });\n\n $this->service->getActivityIdsForSavedSearch($savedSearch, $user, AutomatedReportsService::FREQUENCY_ONE_OFF);\n\n $this->assertNotNull($capturedCriteria);\n $this->assertNull($capturedCriteria->getStartDate());\n $this->assertNull($capturedCriteria->getEndDate());\n }\n\n public function testGetActivityIdsFrequencyDateRangeOverridesSavedSearchDateFilters(): void\n {\n CarbonImmutable::setTestNow('2025-06-16 12:00:00');\n\n try {\n $user = $this->makeUser();\n\n $startDateFilter = $this->makeFilter(ActivityActualDate::PARAM_START_DATE, '2024-01-01 00:00:00');\n $endDateFilter = $this->makeFilter(ActivityActualDate::PARAM_END_DATE, '2024-12-31 23:59:59');\n $savedSearch = $this->makeSavedSearch([$startDateFilter, $endDateFilter]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->logger->method('info');\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);\n\n $capturedCriteria = null;\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {\n $capturedCriteria = $criteria;\n\n return $filterSet;\n });\n\n $this->service->getActivityIdsForSavedSearch($savedSearch, $user, AutomatedReportsService::FREQUENCY_DAILY);\n\n $this->assertNotNull($capturedCriteria);\n $this->assertSame('2025-06-15 00:00:00', $capturedCriteria->getStartDate()->format('Y-m-d H:i:s'));\n $this->assertSame('2025-06-15 23:59:59', $capturedCriteria->getEndDate()->format('Y-m-d H:i:s'));\n } finally {\n CarbonImmutable::setTestNow();\n }\n }\n}","depth":4,"bounds":{"left":0.13863032,"top":0.27055067,"width":0.34375,"height":0.72944933},"value":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Tests\\Unit\\Services\\Kiosk\\AutomatedReports;\n\nuse Carbon\\CarbonImmutable;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinition\\ActivityActualDate;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinition\\ActivityUpdatedDate;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinition\\DealInsights\\ClosingPeriodFilter;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinitionCollection;\nuse Jiminny\\Component\\ActivitySearch\\Service\\ActivitySearch;\nuse Jiminny\\Models\\Activity\\Search;\nuse Jiminny\\Models\\Activity\\SearchFilter;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Repositories\\ElasticActivityRepository;\nuse Jiminny\\Services\\Kiosk\\AutomatedReports\\AskJiminnyReportActivityService;\nuse Jiminny\\Services\\Kiosk\\AutomatedReports\\AutomatedReportsService;\nuse Jiminny\\VO\\Repository\\OnDemandActivitySearch\\Criteria;\nuse PHPUnit\\Framework\\MockObject\\MockObject;\nuse PHPUnit\\Framework\\TestCase;\nuse Psr\\Log\\LoggerInterface;\n\nclass AskJiminnyReportActivityServiceTest extends TestCase\n{\n private ActivitySearch&MockObject $activitySearch;\n private ElasticActivityRepository&MockObject $elasticRepository;\n private LoggerInterface&MockObject $logger;\n private AskJiminnyReportActivityService $service;\n\n protected function setUp(): void\n {\n $this->activitySearch = $this->createMock(ActivitySearch::class);\n $this->elasticRepository = $this->createMock(ElasticActivityRepository::class);\n $this->logger = $this->createMock(LoggerInterface::class);\n\n $this->service = new AskJiminnyReportActivityService(\n $this->activitySearch,\n $this->elasticRepository,\n $this->logger,\n );\n }\n\n private function makeFilter(string $key, ?string $value): SearchFilter&MockObject\n {\n $filter = $this->createMock(SearchFilter::class);\n $filter->method('getFilterProperty')->willReturn($key);\n $filter->method('getFilterValue')->willReturn($value);\n\n return $filter;\n }\n\n private function makeUser(): User&MockObject\n {\n $tz = new \\DateTimeZone('UTC');\n $user = $this->createMock(User::class);\n $user->method('getTimezone')->willReturn($tz);\n $user->method('getId')->willReturn(1);\n $user->method('getUuid')->willReturn('user-uuid');\n\n return $user;\n }\n\n private function makeSavedSearch(array $filters): Search&MockObject\n {\n $savedSearch = $this->createMock(Search::class);\n $savedSearch->method('getId')->willReturn(42);\n $savedSearch->method('getFilters')->willReturn(new \\Illuminate\\Support\\LazyCollection($filters));\n\n return $savedSearch;\n }\n\n public function testGetActivityIdsForSavedSearchReturnsIds(): void\n {\n $user = $this->makeUser();\n $savedSearch = $this->makeSavedSearch([]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->expects($this->once())\n ->method('getArrayFilterKeys')\n ->with($user)\n ->willReturn([]);\n\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturn($filterSet);\n\n $this->elasticRepository->expects($this->once())\n ->method('onDemandSearchIdsOnly')\n ->willReturn(['id-1', 'id-2', 'id-3']);\n\n $this->logger->expects($this->once())\n ->method('info')\n ->with('[AskJiminnyReport] Fetched activity IDs for saved search');\n\n $result = $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertEquals(['id-1', 'id-2', 'id-3'], $result);\n }\n\n public function testGetActivityIdsForSavedSearchReturnsEmptyWhenNoResults(): void\n {\n $user = $this->makeUser();\n $savedSearch = $this->makeSavedSearch([]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->activitySearch->method('getOnDemandPageFilterSet')->willReturn($filterSet);\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);\n\n $this->logger->expects($this->once())->method('info');\n\n $result = $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertEmpty($result);\n }\n\n public function testGetActivityIdsFiltersOutDateFilters(): void\n {\n $user = $this->makeUser();\n\n $nonDateFilter = $this->makeFilter('owner_id', '123');\n $startDateFilter = $this->makeFilter(ActivityActualDate::PARAM_START_DATE, '2025-01-01 00:00:00');\n $endDateFilter = $this->makeFilter(ActivityActualDate::PARAM_END_DATE, '2025-01-31 23:59:59');\n $updatedFromFilter = $this->makeFilter(ActivityUpdatedDate::PARAM_UPDATED_FROM, '2025-01-01 00:00:00');\n $updatedToFilter = $this->makeFilter(ActivityUpdatedDate::PARAM_UPDATED_TO, '2025-01-31 23:59:59');\n\n $savedSearch = $this->makeSavedSearch([\n $nonDateFilter,\n $startDateFilter,\n $endDateFilter,\n $updatedFromFilter,\n $updatedToFilter,\n ]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n\n $capturedCriteria = null;\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {\n $capturedCriteria = $criteria;\n\n return $filterSet;\n });\n\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);\n $this->logger->method('info');\n\n $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertNotNull($capturedCriteria);\n }\n\n public function testGetActivityIdsFiltersOutClosingPeriodDateFilters(): void\n {\n $user = $this->makeUser();\n\n $closingStartFilter = $this->makeFilter(ClosingPeriodFilter::KEY_START_DATE, '2025-01-01');\n $closingEndFilter = $this->makeFilter(ClosingPeriodFilter::KEY_END_DATE, '2025-03-31');\n $regularFilter = $this->makeFilter('rep_id', '99');\n\n $savedSearch = $this->makeSavedSearch([\n $closingStartFilter,\n $closingEndFilter,\n $regularFilter,\n ]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturn($filterSet);\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn(['id-1']);\n $this->logger->method('info');\n\n $result = $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertEquals(['id-1'], $result);\n }\n\n public function testGetActivityIdsHandlesArrayFilters(): void\n {\n $user = $this->makeUser();\n\n $filter1 = $this->makeFilter('outcome', 'positive');\n $filter2 = $this->makeFilter('outcome', 'negative');\n\n $savedSearch = $this->makeSavedSearch([$filter1, $filter2]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn(['outcome']);\n $this->activitySearch->method('getOnDemandPageFilterSet')->willReturn($filterSet);\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn(['id-1']);\n $this->logger->method('info');\n\n $result = $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertEquals(['id-1'], $result);\n }\n\n public function testGetActivityIdsHandlesScalarFilters(): void\n {\n $user = $this->makeUser();\n\n $filter = $this->makeFilter('direction', 'inbound');\n $savedSearch = $this->makeSavedSearch([$filter]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->activitySearch->method('getOnDemandPageFilterSet')->willReturn($filterSet);\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn(['id-5']);\n $this->logger->method('info');\n\n $result = $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertEquals(['id-5'], $result);\n }\n\n public function testGetActivityIdsPassesNonZeroSequenceNumberToDisableFirstRequestDefaults(): void\n {\n $user = $this->makeUser();\n $savedSearch = $this->makeSavedSearch([]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n\n $capturedCriteria = null;\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {\n $capturedCriteria = $criteria;\n\n return $filterSet;\n });\n\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);\n $this->logger->method('info');\n\n $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertNotNull($capturedCriteria);\n $this->assertFalse($capturedCriteria->isFirstRequest());\n }\n\n public function testGetActivityIdsLogsWithCorrectContext(): void\n {\n $user = $this->makeUser();\n $savedSearch = $this->makeSavedSearch([]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->activitySearch->method('getOnDemandPageFilterSet')->willReturn($filterSet);\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn(['a', 'b']);\n\n $this->logger->expects($this->once())\n ->method('info')\n ->with(\n '[AskJiminnyReport] Fetched activity IDs for saved search',\n $this->callback(fn ($context) => $context['saved_search_id'] === 42\n && $context['user_id'] === 1\n && $context['activity_count'] === 2)\n );\n\n $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n }\n\n public static function frequencyDateRangeProvider(): array\n {\n return [\n 'daily' => [\n AutomatedReportsService::FREQUENCY_DAILY,\n '2025-06-15 00:00:00',\n '2025-06-15 23:59:59',\n ],\n 'weekly' => [\n AutomatedReportsService::FREQUENCY_WEEKLY,\n '2025-06-09 00:00:00',\n '2025-06-15 23:59:59',\n ],\n 'monthly' => [\n AutomatedReportsService::FREQUENCY_MONTHLY,\n '2025-05-01 00:00:00',\n '2025-05-31 23:59:59',\n ],\n 'quarterly' => [\n AutomatedReportsService::FREQUENCY_QUARTERLY,\n '2025-01-01 00:00:00',\n '2025-03-31 23:59:59',\n ],\n ];\n }\n\n /**\n * @dataProvider frequencyDateRangeProvider\n */\n public function testGetActivityIdsInjectsDateRangeForFrequency(\n string $frequency,\n string $expectedStartDate,\n string $expectedEndDate,\n ): void {\n CarbonImmutable::setTestNow('2025-06-16 12:00:00');\n\n try {\n $user = $this->makeUser();\n $savedSearch = $this->makeSavedSearch([]);\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->logger->method('info');\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);\n\n $capturedCriteria = null;\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {\n $capturedCriteria = $criteria;\n\n return $filterSet;\n });\n\n $this->service->getActivityIdsForSavedSearch($savedSearch, $user, $frequency);\n\n $this->assertNotNull($capturedCriteria);\n $this->assertSame($expectedStartDate, $capturedCriteria->getStartDate()->format('Y-m-d H:i:s'));\n $this->assertSame($expectedEndDate, $capturedCriteria->getEndDate()->format('Y-m-d H:i:s'));\n } finally {\n CarbonImmutable::setTestNow();\n }\n }\n\n public function testGetActivityIdsWithNullFrequencyDoesNotInjectDates(): void\n {\n $user = $this->makeUser();\n $savedSearch = $this->makeSavedSearch([]);\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->logger->method('info');\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);\n\n $capturedCriteria = null;\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {\n $capturedCriteria = $criteria;\n\n return $filterSet;\n });\n\n $this->service->getActivityIdsForSavedSearch($savedSearch, $user, null);\n\n $this->assertNotNull($capturedCriteria);\n $this->assertNull($capturedCriteria->getStartDate());\n $this->assertNull($capturedCriteria->getEndDate());\n }\n\n public function testGetActivityIdsWithUnknownFrequencyDoesNotInjectDates(): void\n {\n $user = $this->makeUser();\n $savedSearch = $this->makeSavedSearch([]);\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->logger->method('info');\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);\n\n $capturedCriteria = null;\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {\n $capturedCriteria = $criteria;\n\n return $filterSet;\n });\n\n $this->service->getActivityIdsForSavedSearch($savedSearch, $user, AutomatedReportsService::FREQUENCY_ONE_OFF);\n\n $this->assertNotNull($capturedCriteria);\n $this->assertNull($capturedCriteria->getStartDate());\n $this->assertNull($capturedCriteria->getEndDate());\n }\n\n public function testGetActivityIdsFrequencyDateRangeOverridesSavedSearchDateFilters(): void\n {\n CarbonImmutable::setTestNow('2025-06-16 12:00:00');\n\n try {\n $user = $this->makeUser();\n\n $startDateFilter = $this->makeFilter(ActivityActualDate::PARAM_START_DATE, '2024-01-01 00:00:00');\n $endDateFilter = $this->makeFilter(ActivityActualDate::PARAM_END_DATE, '2024-12-31 23:59:59');\n $savedSearch = $this->makeSavedSearch([$startDateFilter, $endDateFilter]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->logger->method('info');\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);\n\n $capturedCriteria = null;\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {\n $capturedCriteria = $criteria;\n\n return $filterSet;\n });\n\n $this->service->getActivityIdsForSavedSearch($savedSearch, $user, AutomatedReportsService::FREQUENCY_DAILY);\n\n $this->assertNotNull($capturedCriteria);\n $this->assertSame('2025-06-15 00:00:00', $capturedCriteria->getStartDate()->format('Y-m-d H:i:s'));\n $this->assertSame('2025-06-15 23:59:59', $capturedCriteria->getEndDate()->format('Y-m-d H:i:s'));\n } finally {\n CarbonImmutable::setTestNow();\n }\n }\n}","role_description":"text entry area","is_enabled":true,"is_focused":true,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.042220745,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"","depth":4,"bounds":{"left":0.4225399,"top":0.09736632,"width":0.30618352,"height":0.8818835},"value":"","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Project","depth":3,"role_description":"text"},{"role":"AXButton","text":"Project","depth":3,"bounds":{"left":0.011968086,"top":0.047885075,"width":0.024268618,"height":0.024740623},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"New File or Directory…","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Expand Selected","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Collapse All","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Options","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"app ~/jiminny/app","depth":6,"role_description":"text"},{"role":"AXStaticText","text":".circleci","depth":7,"role_description":"text"},{"role":"AXStaticText","text":".cursor","depth":7,"role_description":"text"},{"role":"AXStaticText","text":".github","depth":7,"role_description":"text"},{"role":"AXStaticText","text":".sonarlint","depth":7,"role_description":"text"},{"role":"AXStaticText","text":".vscode","depth":7,"role_description":"text"},{"role":"AXStaticText","text":".windsurf","depth":7,"role_description":"text"},{"role":"AXStaticText","text":"app, sources root","depth":7,"role_description":"text"},{"role":"AXStaticText","text":"Actions","depth":8,"role_description":"text"},{"role":"AXStaticText","text":"Component","depth":8,"role_description":"text"},{"role":"AXStaticText","text":"Acl, folder","depth":9,"role_description":"text"},{"role":"AXStaticText","text":"ActionItems, folder","depth":9,"role_description":"text"},{"role":"AXStaticText","text":"Activity, folder","depth":9,"role_description":"text"},{"role":"AXStaticText","text":"ActivityAnalytics, folder","depth":9,"role_description":"text"},{"role":"AXStaticText","text":"ActivitySearch, folder","depth":9,"role_description":"text"},{"role":"AXStaticText","text":"EventSubscriber, folder","depth":10,"role_description":"text"},{"role":"AXStaticText","text":"FilterDefinition, folder","depth":10,"role_description":"text"},{"role":"AXStaticText","text":"DealInsights, folder","depth":11,"role_description":"text"},{"role":"AXStaticText","text":"Security","depth":11,"role_description":"text"},{"role":"AXStaticText","text":"TeamInsights","depth":11,"role_description":"text"},{"role":"AXStaticText","text":"ActivityActualDate.php, class","depth":11,"role_description":"text"},{"role":"AXStaticText","text":"ActivityChannel.php, final class","depth":11,"role_description":"text"},{"role":"AXStaticText","text":"ActivityDurationRange.php, class","depth":11,"role_description":"text"},{"role":"AXStaticText","text":"ActivityFilter.php, final class","depth":11,"role_description":"text"},{"role":"AXStaticText","text":"ActivityPlaylistIn.php, final class","depth":11,"role_description":"text"},{"role":"AXStaticText","text":"ActivityProviderIn.php, final class","depth":11,"role_description":"text"},{"role":"AXStaticText","text":"ActivityRecorded.php, class","depth":11,"role_description":"text"},{"role":"AXStaticText","text":"ActivityRecordingStopped.php, final class","depth":11,"role_description":"text"},{"role":"AXStaticText","text":"ActivityScheduledDate.php, final class","depth":11,"role_description":"text"},{"role":"AXStaticText","text":"ActivityStatusIn.php, class","depth":11,"role_description":"text"},{"role":"AXStaticText","text":"ActivityType.php, final class","depth":11,"role_description":"text"},{"role":"AXStaticText","text":"ActivityUpdatedDate.php, final class","depth":11,"role_description":"text"},{"role":"AXStaticText","text":"AiCallScoreFilter.php, final class","depth":11,"role_description":"text"},{"role":"AXStaticText","text":"AutoScoreFilter.php, final class","depth":11,"role_description":"text"},{"role":"AXStaticText","text":"ClosedDealsFilter.php, final class","depth":11,"role_description":"text"},{"role":"AXStaticText","text":"CoachingFeedbackAverageScore.php, final class","depth":11,"role_description":"text"},{"role":"AXStaticText","text":"CoachingFeedbackCoachUserIn.php, final class","depth":11,"role_description":"text"},{"role":"AXStaticText","text":"CommentCountRange.php, final class","depth":11,"role_description":"text"},{"role":"AXStaticText","text":"CrmFieldCollection.php, final class","depth":11,"role_description":"text"},{"role":"AXStaticText","text":"CurrentStage.php, final class","depth":11,"role_description":"text"},{"role":"AXStaticText","text":"Customer.php, final class","depth":11,"role_description":"text"},{"role":"AXStaticText","text":"CustomerMonologueDuration.php, final class","depth":11,"role_description":"text"},{"role":"AXStaticText","text":"CustomerQuestionCount.php, final class","depth":11,"role_description":"text"},{"role":"AXStaticText","text":"DealAge.php, final class","depth":11,"role_description":"text"},{"role":"AXStaticText","text":"DealCloseDate.php, final class","depth":11,"role_description":"text"},{"role":"AXStaticText","text":"DealValue.php, final class","depth":11,"role_description":"text"},{"role":"AXStaticText","text":"EngagingQuestionCount.php, final class","depth":11,"role_description":"text"},{"role":"AXStaticText","text":"ExternalId.php, final class","depth":11,"role_description":"text"},{"role":"AXStaticText","text":"HasPendingAiCrmNotes.php, final class","depth":11,"role_description":"text"},{"role":"AXStaticText","text":"HasTopicTriggersFilterDefinition.php, final class","depth":11,"role_description":"text"},{"role":"AXStaticText","text":"HasTranscription.php, final class","depth":11,"role_description":"text"},{"role":"AXStaticText","text":"InputTypeEnum.php, final class","depth":11,"role_description":"text"},{"role":"AXStaticText","text":"InsightfulQuestionCount.php, final class","depth":11,"role_description":"text"},{"role":"AXStaticText","text":"LanguageFilterDefinition.php, final class","depth":11,"role_description":"text"},{"role":"AXStaticText","text":"LoggedToCrm.php, final class","depth":11,"role_description":"text"},{"role":"AXStaticText","text":"NudgeRunId.php, final class","depth":11,"role_description":"text"},{"role":"AXStaticText","text":"OnlyActiveUsers.php, final class","depth":11,"role_description":"text"},{"role":"AXStaticText","text":"OrganiserGroupIn.php, class","depth":11,"role_description":"text"},{"role":"AXStaticText","text":"OrganiserTeamIn.php, final class","depth":11,"role_description":"text"},{"role":"AXStaticText","text":"OrganiserUserIn.php, class","depth":11,"role_description":"text"},{"role":"AXStaticText","text":"OrganiserUserNotIn.php, final class","depth":11,"role_description":"text"},{"role":"AXStaticText","text":"ParticipantUserIn.php, final class","depth":11,"role_description":"text"},{"role":"AXStaticText","text":"PartnerFilterDefinition.php, final class","depth":11,"role_description":"text"},{"role":"AXStaticText","text":"PatienceRange.php, final class","depth":11,"role_description":"text"},{"role":"AXStaticText","text":"PlaybackTopicFilterDefinition.php, final class","depth":11,"role_description":"text"},{"role":"AXStaticText","text":"ProviderFilterDefinition.php, final class","depth":11,"role_description":"text"},{"role":"AXStaticText","text":"ShowInternalExternalActivitiesFilter.php, final class","depth":11,"role_description":"text"},{"role":"AXStaticText","text":"SortBy.php, final class","depth":11,"role_description":"text"},{"role":"AXStaticText","text":"SpeechRate.php, final class","depth":11,"role_description":"text"},{"role":"AXStaticText","text":"StageAtCallFilterDefinition.php, class","depth":11,"role_description":"text"},{"role":"AXStaticText","text":"TalkTimeRatio.php, final class","depth":11,"role_description":"text"},{"role":"AXStaticText","text":"TeamMemberUserIn.php, final class","depth":11,"role_description":"text"},{"role":"AXStaticText","text":"TranscriptionComposite.php, final class","depth":11,"role_description":"text"},{"role":"AXStaticText","text":"UserGroupInOptionalFilter.php, final class","depth":11,"role_description":"text"},{"role":"AXStaticText","text":"UserMonologueDuration.php, final class","depth":11,"role_description":"text"},{"role":"AXStaticText","text":"UserQuestionCount.php, final class","depth":11,"role_description":"text"},{"role":"AXStaticText","text":"Service","depth":10,"role_description":"text"},{"role":"AXStaticText","text":"AbstractStageFilterDefinition.php, abstract class","depth":10,"role_description":"text"},{"role":"AXStaticText","text":"ActivitySearchServiceProvider.php, final class","depth":10,"role_description":"text"},{"role":"AXStaticText","text":"DealInsightsPeriodFilterFactory.php","depth":10,"role_description":"text"},{"role":"AXStaticText","text":"DealInsightsPeriodFilterFactoryInterface.php, interface","depth":10,"role_description":"text"},{"role":"AXStaticText","text":"FilterDefinition.php, abstract class","depth":10,"role_description":"text"},{"role":"AXStaticText","text":"FilterDefinitionCollection.php, class","depth":10,"role_description":"text"},{"role":"AXStaticText","text":"FilterDefinitionQuery.php, class","depth":10,"role_description":"text"},{"role":"AXStaticText","text":"FilterDefinitionQueryCollection.php, class","depth":10,"role_description":"text"},{"role":"AXStaticText","text":"FilteredValueContainerInterface.php, interface","depth":10,"role_description":"text"},{"role":"AXStaticText","text":"IntMinMaxRange.php, class","depth":10,"role_description":"text"},{"role":"AXStaticText","text":"AiActivityType","depth":9,"role_description":"text"},{"role":"AXStaticText","text":"AiAutomation","depth":9,"role_description":"text"},{"role":"AXStaticText","text":"AiCallScoring","depth":9,"role_description":"text"},{"role":"AXStaticText","text":"AskAnything","depth":9,"role_description":"text"},{"role":"AXStaticText","text":"AskJiminnyAi","depth":9,"role_description":"text"},{"role":"AXStaticText","text":"AWS","depth":9,"role_description":"text"},{"role":"AXStaticText","text":"BillingManagement","depth":9,"role_description":"text"},{"role":"AXStaticText","text":"Cache","depth":9,"role_description":"text"},{"role":"AXStaticText","text":"CoachingFeedback","depth":9,"role_description":"text"},{"role":"AXStaticText","text":"Country","depth":9,"role_description":"text"},{"role":"AXStaticText","text":"CustomerApi","depth":9,"role_description":"text"},{"role":"AXStaticText","text":"Database","depth":9,"role_description":"text"},{"role":"AXStaticText","text":"Datadog","depth":9,"role_description":"text"},{"role":"AXStaticText","text":"DateTime","depth":9,"role_description":"text"},{"role":"AXStaticText","text":"DealInsights","depth":9,"role_description":"text"},{"role":"AXStaticText","text":"DealRisks","depth":9,"role_description":"text"},{"role":"AXStaticText","text":"ElasticSearch","depth":9,"role_description":"text"},{"role":"AXStaticText","text":"Eloquent","depth":9,"role_description":"text"},{"role":"AXStaticText","text":"Encoding","depth":9,"role_description":"text"},{"role":"AXStaticText","text":"Encryption","depth":9,"role_description":"text"},{"role":"AXStaticText","text":"ES","depth":9,"role_description":"text"},{"role":"AXStaticText","text":"Faker","depth":9,"role_description":"text"},{"role":"AXStaticText","text":"FeatureFlags","depth":9,"role_description":"text"},{"role":"AXStaticText","text":"FFMpeg","depth":9,"role_description":"text"},{"role":"AXStaticText","text":"FileSystem","depth":9,"role_description":"text"},{"role":"AXStaticText","text":"Gecko","depth":9,"role_description":"text"},{"role":"AXStaticText","text":"Gong","depth":9,"role_description":"text"},{"role":"AXStaticText","text":"GuzzleHttp","depth":9,"role_description":"text"},{"role":"AXStaticText","text":"KeyPoints","depth":9,"role_description":"text"},{"role":"AXStaticText","text":"Kiosk","depth":9,"role_description":"text"},{"role":"AXStaticText","text":"LanguageDetection","depth":9,"role_description":"text"},{"role":"AXStaticText","text":"LiveFeed","depth":9,"role_description":"text"},{"role":"AXStaticText","text":"Locks","depth":9,"role_description":"text"},{"role":"AXStaticText","text":"Math","depth":9,"role_description":"text"},{"role":"AXStaticText","text":"MediaPipeline","depth":9,"role_description":"text"},{"role":"AXStaticText","text":"MeetingBot","depth":9,"role_description":"text"},{"role":"AXStaticText","text":"MobileSettings","depth":9,"role_description":"text"},{"role":"AXStaticText","text":"Model","depth":9,"role_description":"text"},{"role":"AXStaticText","text":"Notification","depth":9,"role_description":"text"},{"role":"AXStaticText","text":"Nudge","depth":9,"role_description":"text"},{"role":"AXStaticText","text":"ParagraphBreaker","depth":9,"role_description":"text"},{"role":"AXStaticText","text":"ParticipantSpeech","depth":9,"role_description":"text"},{"role":"AXStaticText","text":"PartitionedCookie","depth":9,"role_description":"text"},{"role":"AXStaticText","text":"PlaybackPage","depth":9,"role_description":"text"},{"role":"AXStaticText","text":"Playlist","depth":9,"role_description":"text"},{"role":"AXStaticText","text":"Prophet","depth":9,"role_description":"text"},{"role":"AXStaticText","text":"ProphetAi","depth":9,"role_description":"text"},{"role":"AXStaticText","text":"ProsperWorks","depth":9,"role_description":"text"},{"role":"AXStaticText","text":"Queue","depth":9,"role_description":"text"},{"role":"AXStaticText","text":"Router","depth":9,"role_description":"text"},{"role":"AXStaticText","text":"Saml2","depth":9,"role_description":"text"},{"role":"AXStaticText","text":"SCIM","depth":9,"role_description":"text"},{"role":"AXStaticText","text":"Seeder","depth":9,"role_description":"text"},{"role":"AXStaticText","text":"Sentry","depth":9,"role_description":"text"},{"role":"AXStaticText","text":"Serializer","depth":9,"role_description":"text"},{"role":"AXStaticText","text":"Settings","depth":9,"role_description":"text"},{"role":"AXStaticText","text":"Sidekick","depth":9,"role_description":"text"},{"role":"AXStaticText","text":"Slack","depth":9,"role_description":"text"},{"role":"AXStaticText","text":"TeamInsights","depth":9,"role_description":"text"},{"role":"AXStaticText","text":"TimeMemoryMapper","depth":9,"role_description":"text"},{"role":"AXStaticText","text":"Transcription","depth":9,"role_description":"text"}]...
|
-7383354862135176937
|
956156635419710870
|
visual_change
|
accessibility
|
NULL
|
Project: faVsco.js, menu
#11894 on JY-18909-automa Project: faVsco.js, menu
#11894 on JY-18909-automated-reports-ask-jiminny, menu
Start Listening for PHP Debug Connections
AskJiminnyReportActivityServiceTest
Run 'AskJiminnyReportActivityServiceTest'
Debug 'AskJiminnyReportActivityServiceTest'
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 Carbon\CarbonImmutable;
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\Services\Kiosk\AutomatedReports\AutomatedReportsService;
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);
}
public static function frequencyDateRangeProvider(): array
{
return [
'daily' => [
AutomatedReportsService::FREQUENCY_DAILY,
'2025-06-15 00:00:00',
'2025-06-15 23:59:59',
],
'weekly' => [
AutomatedReportsService::FREQUENCY_WEEKLY,
'2025-06-09 00:00:00',
'2025-06-15 23:59:59',
],
'monthly' => [
AutomatedReportsService::FREQUENCY_MONTHLY,
'2025-05-01 00:00:00',
'2025-05-31 23:59:59',
],
'quarterly' => [
AutomatedReportsService::FREQUENCY_QUARTERLY,
'2025-01-01 00:00:00',
'2025-03-31 23:59:59',
],
];
}
/**
* @dataProvider frequencyDateRangeProvider
*/
public function testGetActivityIdsInjectsDateRangeForFrequency(
string $frequency,
string $expectedStartDate,
string $expectedEndDate,
): void {
CarbonImmutable::setTestNow('2025-06-16 12:00:00');
try {
$user = $this->makeUser();
$savedSearch = $this->makeSavedSearch([]);
$filterSet = $this->createMock(FilterDefinitionCollection::class);
$this->activitySearch->method('getArrayFilterKeys')->willReturn([]);
$this->logger->method('info');
$this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);
$capturedCriteria = null;
$this->activitySearch->expects($this->once())
->method('getOnDemandPageFilterSet')
->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {
$capturedCriteria = $criteria;
return $filterSet;
});
$this->service->getActivityIdsForSavedSearch($savedSearch, $user, $frequency);
$this->assertNotNull($capturedCriteria);
$this->assertSame($expectedStartDate, $capturedCriteria->getStartDate()->format('Y-m-d H:i:s'));
$this->assertSame($expectedEndDate, $capturedCriteria->getEndDate()->format('Y-m-d H:i:s'));
} finally {
CarbonImmutable::setTestNow();
}
}
public function testGetActivityIdsWithNullFrequencyDoesNotInjectDates(): void
{
$user = $this->makeUser();
$savedSearch = $this->makeSavedSearch([]);
$filterSet = $this->createMock(FilterDefinitionCollection::class);
$this->activitySearch->method('getArrayFilterKeys')->willReturn([]);
$this->logger->method('info');
$this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);
$capturedCriteria = null;
$this->activitySearch->expects($this->once())
->method('getOnDemandPageFilterSet')
->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {
$capturedCriteria = $criteria;
return $filterSet;
});
$this->service->getActivityIdsForSavedSearch($savedSearch, $user, null);
$this->assertNotNull($capturedCriteria);
$this->assertNull($capturedCriteria->getStartDate());
$this->assertNull($capturedCriteria->getEndDate());
}
public function testGetActivityIdsWithUnknownFrequencyDoesNotInjectDates(): void
{
$user = $this->makeUser();
$savedSearch = $this->makeSavedSearch([]);
$filterSet = $this->createMock(FilterDefinitionCollection::class);
$this->activitySearch->method('getArrayFilterKeys')->willReturn([]);
$this->logger->method('info');
$this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);
$capturedCriteria = null;
$this->activitySearch->expects($this->once())
->method('getOnDemandPageFilterSet')
->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {
$capturedCriteria = $criteria;
return $filterSet;
});
$this->service->getActivityIdsForSavedSearch($savedSearch, $user, AutomatedReportsService::FREQUENCY_ONE_OFF);
$this->assertNotNull($capturedCriteria);
$this->assertNull($capturedCriteria->getStartDate());
$this->assertNull($capturedCriteria->getEndDate());
}
public function testGetActivityIdsFrequencyDateRangeOverridesSavedSearchDateFilters(): void
{
CarbonImmutable::setTestNow('2025-06-16 12:00:00');
try {
$user = $this->makeUser();
$startDateFilter = $this->makeFilter(ActivityActualDate::PARAM_START_DATE, '2024-01-01 00:00:00');
$endDateFilter = $this->makeFilter(ActivityActualDate::PARAM_END_DATE, '2024-12-31 23:59:59');
$savedSearch = $this->makeSavedSearch([$startDateFilter, $endDateFilter]);
$filterSet = $this->createMock(FilterDefinitionCollection::class);
$this->activitySearch->method('getArrayFilterKeys')->willReturn([]);
$this->logger->method('info');
$this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);
$capturedCriteria = null;
$this->activitySearch->expects($this->once())
->method('getOnDemandPageFilterSet')
->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {
$capturedCriteria = $criteria;
return $filterSet;
});
$this->service->getActivityIdsForSavedSearch($savedSearch, $user, AutomatedReportsService::FREQUENCY_DAILY);
$this->assertNotNull($capturedCriteria);
$this->assertSame('2025-06-15 00:00:00', $capturedCriteria->getStartDate()->format('Y-m-d H:i:s'));
$this->assertSame('2025-06-15 23:59:59', $capturedCriteria->getEndDate()->format('Y-m-d H:i:s'));
} finally {
CarbonImmutable::setTestNow();
}
}
}
Code changed:
Hide
Sync Changes
Hide This Notification
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
DealInsights, folder
Security
TeamInsights
ActivityActualDate.php, class
ActivityChannel.php, final class
ActivityDurationRange.php, class
ActivityFilter.php, final class
ActivityPlaylistIn.php, final class
ActivityProviderIn.php, final class
ActivityRecorded.php, class
ActivityRecordingStopped.php, final class
ActivityScheduledDate.php, final class
ActivityStatusIn.php, class
ActivityType.php, final class
ActivityUpdatedDate.php, final class
AiCallScoreFilter.php, final class
AutoScoreFilter.php, final class
ClosedDealsFilter.php, final class
CoachingFeedbackAverageScore.php, final class
CoachingFeedbackCoachUserIn.php, final class
CommentCountRange.php, final class
CrmFieldCollection.php, final class
CurrentStage.php, final class
Customer.php, final class
CustomerMonologueDuration.php, final class
CustomerQuestionCount.php, final class
DealAge.php, final class
DealCloseDate.php, final class
DealValue.php, final class
EngagingQuestionCount.php, final class
ExternalId.php, final class
HasPendingAiCrmNotes.php, final class
HasTopicTriggersFilterDefinition.php, final class
HasTranscription.php, final class
InputTypeEnum.php, final class
InsightfulQuestionCount.php, final class
LanguageFilterDefinition.php, final class
LoggedToCrm.php, final class
NudgeRunId.php, final class
OnlyActiveUsers.php, final class
OrganiserGroupIn.php, class
OrganiserTeamIn.php, final class
OrganiserUserIn.php, class
OrganiserUserNotIn.php, final class
ParticipantUserIn.php, final class
PartnerFilterDefinition.php, final class
PatienceRange.php, final class
PlaybackTopicFilterDefinition.php, final class
ProviderFilterDefinition.php, final class
ShowInternalExternalActivitiesFilter.php, final class
SortBy.php, final class
SpeechRate.php, final class
StageAtCallFilterDefinition.php, class
TalkTimeRatio.php, final class
TeamMemberUserIn.php, final class
TranscriptionComposite.php, final class
UserGroupInOptionalFilter.php, final class
UserMonologueDuration.php, final class
UserQuestionCount.php, final class
Service
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
ParagraphBreaker
ParticipantSpeech
PartitionedCookie
PlaybackPage
Playlist
Prophet
ProphetAi
ProsperWorks
Queue
Router
Saml2
SCIM
Seeder
Sentry
Serializer
Settings
Sidekick
Slack
TeamInsights
TimeMemoryMapper
Transcription...
|
NULL
|
|
54989
|
NULL
|
0
|
2026-04-20T09:27:33.843069+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-20/1776 /Users/lukas/.screenpipe/data/data/2026-04-20/1776677253843_m1.jpg...
|
PhpStorm
|
faVsco.js – SF [jiminny@localhost]
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
#11894 on JY-18909-automa Project: faVsco.js, menu
#11894 on JY-18909-automated-reports-ask-jiminny, menu
Start Listening for PHP Debug Connections
AskJiminnyReportActivityServiceTest
Run 'AskJiminnyReportActivityServiceTest'
Debug 'AskJiminnyReportActivityServiceTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
1
9
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Http\Controllers\API\V2;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
use Jiminny\Exceptions\InvalidArgumentException;
use Jiminny\Exceptions\ModelNotFoundException;
use Jiminny\Models\AutomatedReport;
use Jiminny\Models\User;
use Jiminny\Services\Kiosk\AutomatedReports\AutomatedReportsService;
use Psr\Log\LoggerInterface;
use Symfony\Component\HttpFoundation\Response;
use Throwable;
class AskJiminnyReportsController extends Controller
{
public function __construct(
private readonly AutomatedReportsService $automatedReportsService,
private readonly LoggerInterface $logger,
) {
}
private function isNotOwnedByUser(AutomatedReport $report, User $user): bool
{
return $report->getTeamId() !== $user->getTeamId()
|| $report->getAttribute('created_by') !== $user->getId();
}
public function getFormData(Request $request, ?string $uuid = null): JsonResponse
{
/** @var User $user */
$user = $request->user();
try {
$report = $uuid ? $this->automatedReportsService->getReport($uuid) : null;
return new JsonResponse(
$this->automatedReportsService->getAskJiminnyReportFormData($user, $report)
);
} catch (ModelNotFoundException $e) {
return new JsonResponse(['error' => $e->getMessage()], Response::HTTP_NOT_FOUND);
} catch (Throwable $e) {
$this->logger->error('Failed to fetch Ask Jiminny report form data', [
'error' => $e->getMessage(),
'user_id' => $user->getId(),
'uuid' => $uuid,
]);
return new JsonResponse(
['error' => 'Failed to fetch form data'],
Response::HTTP_INTERNAL_SERVER_ERROR
);
}
}
/**
* Create a new Ask Jiminny report.
*/
public function create(Request $request): JsonResponse
{
/** @var User $user */
$user = $request->user();
try {
$data = $this->automatedReportsService->createAskJiminnyReport($request->all(), $user);
return new JsonResponse($data);
} catch (InvalidArgumentException $e) {
return new JsonResponse(['error' => $e->getMessage()], Response::HTTP_UNPROCESSABLE_ENTITY);
} catch (Throwable $e) {
$this->logger->error('Failed to create Ask Jiminny report', [
'error' => $e->getMessage(),
'user_id' => $user->getId(),
]);
return new JsonResponse(
['error' => 'Failed to create report'],
Response::HTTP_INTERNAL_SERVER_ERROR
);
}
}
/**
* Update an existing Ask Jiminny report.
*/
public function update(Request $request, string $uuid): JsonResponse
{
\Illuminate\Support\Facades\Log::channel('custom_channel')->info("UPDATE");
/** @var User $user */
$user = $request->user();
try {
$report = $this->automatedReportsService->getReport($uuid);
if ($this->isNotOwnedByUser($report, $user)) {
return new JsonResponse(['error' => 'Report not found'], Response::HTTP_NOT_FOUND);
}
$data = $this->automatedReportsService->updateAskJiminnyReport($report, $request->all(), $user);
return new JsonResponse($data);
} catch (ModelNotFoundException $e) {
return new JsonResponse(['error' => $e->getMessage()], Response::HTTP_NOT_FOUND);
} catch (InvalidArgumentException $e) {
return new JsonResponse(['error' => $e->getMessage()], Response::HTTP_UNPROCESSABLE_ENTITY);
} catch (Throwable $e) {
$this->logger->error('Failed to update Ask Jiminny report', [
'error' => $e->getMessage(),
'user_id' => $user->getId(),
'uuid' => $uuid,
]);
return new JsonResponse(
['error' => 'Failed to update report'],
Response::HTTP_INTERNAL_SERVER_ERROR
);
}
}
/**
* Toggle Ask Jiminny report status (enable/disable).
*/
public function toggleStatus(Request $request, string $uuid): JsonResponse
{
/** @var User $user */
$user = $request->user();
try {
$report = $this->automatedReportsService->getReport($uuid);
if ($this->isNotOwnedByUser($report, $user)) {
return new JsonResponse(['error' => 'Report not found'], Response::HTTP_NOT_FOUND);
}
$data = $this->automatedReportsService->updateAskJiminnyReportStatus(
$report,
(bool) $request->input('enabled'),
);
return new JsonResponse($data);
} catch (ModelNotFoundException $e) {
return new JsonResponse(['error' => $e->getMessage()], Response::HTTP_NOT_FOUND);
} catch (Throwable $e) {
$this->logger->error('Failed to toggle Ask Jiminny report status', [
'error' => $e->getMessage(),
'user_id' => $user->getId(),
'uuid' => $uuid,
]);
return new JsonResponse(
['error' => 'Failed to toggle report status'],
Response::HTTP_INTERNAL_SERVER_ERROR
);
}
}
/**
* List all Ask Jiminny reports.
*/
public function list(Request $request): JsonResponse
{
/** @var User $user */
$user = $request->user();
try {
$sortColumn = $request->input('sort_column', 'created_at');
$sortDirection = $request->input('sort_direction', 'desc');
$data = $this->automatedReportsService->listAskJiminnyReports($user, $sortColumn, $sortDirection);
return new JsonResponse($data);
} catch (Throwable $e) {
$this->logger->error('Failed to list Ask Jiminny reports', [
'error' => $e->getMessage(),
'user_id' => $user->getId(),
]);
return new JsonResponse(
['error' => 'Failed to fetch reports'],
Response::HTTP_INTERNAL_SERVER_ERROR
);
}
}
/**
* Get a single Ask Jiminny report.
*/
public function get(Request $request, string $uuid): JsonResponse
{
/** @var User $user */
$user = $request->user();
try {
$report = $this->automatedReportsService->getReport($uuid);
if ($this->isNotOwnedByUser($report, $user)) {
return new JsonResponse(['error' => 'Report not found'], Response::HTTP_NOT_FOUND);
}
return new JsonResponse($this->automatedReportsService->get($uuid));
} catch (ModelNotFoundException $e) {
return new JsonResponse(['error' => $e->getMessage()], Response::HTTP_NOT_FOUND);
} catch (Throwable $e) {
$this->logger->error('Failed to get Ask Jiminny report', [
'error' => $e->getMessage(),
'user_id' => $user->getId(),
'uuid' => $uuid,
]);
return new JsonResponse(
['error' => 'Failed to fetch report'],
Response::HTTP_INTERNAL_SERVER_ERROR
);
}
}
public function getReportsCount(Request $request, string $uuid): JsonResponse
{
/** @var User $user */
$user = $request->user();
try {
$report = $this->automatedReportsService->getReport($uuid);
if ($this->isNotOwnedByUser($report, $user)) {
return new JsonResponse(['error' => 'Report not found'], Response::HTTP_NOT_FOUND);
}
$resultsCount = $this->automatedReportsService->getReportResults($report)->count();
return new JsonResponse(['count' => $resultsCount]);
} catch (ModelNotFoundException $e) {
return new JsonResponse(['error' => $e->getMessage()], Response::HTTP_NOT_FOUND);
} catch (Throwable $e) {
$this->logger->error('Failed to count report results', [
'error' => $e->getMessage(),
'user_id' => $user->getId(),
'report_uuid' => $uuid,
]);
return new JsonResponse(
['error' => 'Failed to count report results'],
Response::HTTP_INTERNAL_SERVER_ERROR
);
}
}
/**
* Delete an Ask Jiminny report.
*/
public function delete(Request $request, string $uuid): JsonResponse
{
/** @var User $user */
$user = $request->user();
try {
if ($request->boolean('delete_generated_reports')) {
$this->automatedReportsService->deleteReportResults($uuid);
}
$report = $this->automatedReportsService->getReport($uuid);
if ($this->isNotOwnedByUser($report, $user)) {
return new JsonResponse(['error' => 'Report not found'], Response::HTTP_NOT_FOUND);
}
$this->automatedReportsService->delete($uuid);
return new JsonResponse(null, Response::HTTP_NO_CONTENT);
} catch (ModelNotFoundException $e) {
return new JsonResponse(['error' => $e->getMessage()], Response::HTTP_NOT_FOUND);
} catch (Throwable $e) {
$this->logger->error('Failed to delete Ask Jiminny report', [
'error' => $e->getMessage(),
'user_id' => $user->getId(),
'uuid' => $uuid,
]);
return new JsonResponse(
['error' => 'Failed to delete report'],
Response::HTTP_INTERNAL_SERVER_ERROR
);
}
}
public function getFilters(Request $request): JsonResponse
{
/** @var User $user */
$user = $request->user();
try {
$filters = $this->automatedReportsService->getAskJiminnyReportFilters($user);
return new JsonResponse(['filters' => $filters]);
} catch (Throwable $e) {
$this->logger->error('Failed to fetch Ask Jiminny report filters', [
'error' => $e->getMessage(),
'user_id' => $user->getId(),
]);
return new JsonResponse(
['error' => 'Failed to fetch filters'],
Response::HTTP_INTERNAL_SERVER_ERROR
);
}
}
}
Execute
Explain Plan
Browse Query History
View Parameters
Open Query Execution Settings…
In-Editor Results
Tx: Auto
Cancel Running Statements
Playground
jiminny
Code changed:
Hide
Sync Changes
Hide This Notification
10
12
2
4
Previous Highlighted Error
Next Highlighted Error
SELECT a.id, a.uuid, a.actual_start_time, o.id, o.uuid FROM opportunities o
JOIN activities a ON o.id = a.opportunity_id
WHERE a.crm_configuration_id = 39
AND a.actual_start_time > '2025-10-13'
AND a.type IN ('conference', 'softphone-inbound', 'softphone-outbound')
;
SELECT * FROM activities
WHERE crm_configuration_id = 39 and user_id = 143
and actual_start_time >= '2025-10-13'
AND type IN ('conference', 'softphone-inbound', 'softphone-outbound')
;
SELECT * FROM opportunities WHERE account_id IN (178);
select * from activities where id IN (620137, 620187, 620188, 620189, 620230);
# HS
SELECT * FROM opportunities WHERE id IN (238);
select * from activities where id IN (477,2076);
select * from users;
SELECT COUNT(*) FROM users;
SELECT COUNT(*) FROM activities;
SELECT COUNT(*) FROM opportunities;
UPDATE activities
SET
actual_start_time = '2025-12-19 09:00:00',
actual_end_time = '2025-12-19 10:30:00',
scheduled_start_time = '2025-12-19 09:00:00',
scheduled_end_time = '2025-12-19 10:30:00'
WHERE id IN (407509,407375);
select * from partners;
SELECT id, uuid, type, actual_start_time, user_id, crm_configuration_id
FROM activities
WHERE user_id = 143
AND actual_start_time >= '2025-10-13 00:00:00'
AND actual_start_time <= '2026-01-13 23:59:59'
ORDER BY actual_start_time DESC;
SELECT * FROM activities WHERE uuid_to_bin('78eda160-3086-435f-88a5-bb0c71b6008d') = uuid;
SELECT * FROM crm_layouts where crm_configuration_id = 39;
SELECT * FROM crm_layout_entities WHERE crm_layout_id = 282;
# lead_id
# account_id 177
# contact_id 3969
# opportunity_id
# stage_id 203
SELECT * FROM opportunities WHERE opportunities.crm_configuration_id = id = 282;
SELECT * FROM activities where crm_configuration_id = 39 AND type = 'conference'
AND user_id = 143 and actual_start_time >= '2025-10-13';
SELECT * FROM activities a
# JOIN opportunities o ON a.opportunity_id = o.id
WHERE a.crm_configuration_id = 39 AND a.type = 'conference'
and status = 'completed' and recording_state = 'recorded'
and a.actual_start_time >= '2025-10-13'
AND a.user_id = 143
;
select * from leads
where crm_configuration_id = 39; # 112 -> ac. 178, 109 => op. 1707
SELECT * FROM activities WHERE id IN (356013,616188,616202,616310,407509,407375,356001,356008);
SELECT * FROM activities WHERE id IN (356013,616188,616202,616310);
SELECT * FROM activities WHERE id IN (407509,407375); # leads: 112, 109 | status - 198
SELECT * FROM activities WHERE id IN (356001, 356008); # contacts:
SELECT * FROM opportunities WHERE id IN (1707);
SELECT * FROM stages where id IN (204, 198);
SELECT * FROM opportunities WHERE account_id IN (178);
SELECT * FROM opportunities WHERE crm_configuration_id = 39 AND created_at > '2025-01-01';
SELECT * FROM contacts WHERE account_id IN (178); # 4118 Musaibe, 4448 Ceco Personal
SELECT * FROM activities where crm_configuration_id = 39
AND opportunity_id IS NULL
AND is_internal = false
and status = 'completed' and recording_state = 'recorded'
AND actual_start_time >= '2025-10-13'
AND (lead_id IS NOT NULL OR contact_id IS NOT NULL OR account_id IS NOT NULL)
# AND lead_id IN (112, 109)
;
SELECT * FROM crm_profiles WHERE user_id = 143;
select * from inboxes; # 212
select * from users where id = 143; # 143
select * from inbox_email_batches where inbox_id = 212
and updated_at >= '2026-01-28 00:00:00' order by id desc;
select * from inbox_emails where inbox_id = 212
and batch_id = 95885 order by id desc;
select * from email_messages where origin_user_id = 143;
select * from activities where user_id = 143 and updated_at >= '2026-01-28 00:00:00';
select * from participants where activity_id = 620247;
select * from crm_profiles where user_id = 143;
SELECT * FROM activities WHERE uuid_to_bin('458cf915-b914-4000-b083-5687b32b2956') = uuid; # 356001
select * from transcription where activity_id = 356001; # 6943
select * from ai_prompts where transcription_id = 6943;
SELECT * FROM activity_summary_logs where activity_id = 356001;
SELECT * FROM social_accounts WHERE sociable_id = 143;
# [PASSWORD_DOTS]
SELECT * FROM activities WHERE uuid_to_bin('0164a4fb-cb95-454e-9edd-4d804e4999bd') = uuid;
# 422515 softphone tr. 8100
SELECT * FROM activities WHERE uuid_to_bin('7520add8-8d87-41a5-98e5-fc4edf96f21e') = uuid;
# 407509 conference tr. 7670 crmId: 00UD1000002J9aTMAS
select * from ai_prompts where transcription_id IN (8100, 7670);
select * from activity_summary_logs where activity_id = 407509;
select * from sidekick_settings;
select * from default_activity_types;
SELECT * FROM contacts WHERE crm_configuration_id = 39 and email = '[EMAIL]';
SELECT * FROM leads WHERE crm_configuration_id = 39 and email = '[EMAIL]';
SELECT * FROM activity_searches where user_id = 143;
SELECT * FROM groups where team_id = 1;
select * from teams where id = 1;
select * from groups where team_id = 1; # 1150 - 7e75f8025c22
select id, name, group_id, status, deleted_at, email
from users where team_id = 1 order by group_id desc ;
select * from activity_searches where id in (1977, 1978, 1979);
select * from activity_search_filters where activity_search_id IN (1977, 1978, 1979);
select * from activity_search_filters where filter = 'group_id' and value = '443f26b8-8512-437e-a9f9-7e75f8025c22'; # 10268, 10272, 10277
select * from nudges where activity_search_id IN (1977, 1978, 1979); # 877, 878, 879
INSERT INTO `activity_search_filters`
(`activity_search_id`, `filter`, `value`) VALUES
(1977, 'group_id', '443f26b8-8512-437e-a9f9-7e75f8025c22'),
(1978, 'group_id', '443f26b8-8512-437e-a9f9-7e75f8025c22'),
(1979, 'group_id', '443f26b8-8512-437e-a9f9-7e75f8025c22')
;
select * from crm_configurations where id = 39;
select * from teams where id = 1;
select * from team_features where team_id = 1;
select * from features;
SELECT * FROM activity_searches where id = 1982; # 1981
SELECT * FROM activity_search_filters WHERE activity_search_id = 1982;
SELECT * FROM automated_reports where id = 68;
SELECT * FROM automated_report_results where id = 275;
SELECT * FROM automated_reports order by id desc;
SELECT * FROM automated_report_results order by id desc;
select * from activity_searches where user_id = 143;
select * from ask_anything_prompts;
SELECT * FROM groups WHERE id = 1439;
SELECT * FROM users WHERE group_id = 1439;
select * from permissions; # 158
select * from roles;
select * from permission_role
select * from teams where id = 1;
select * from groups g JOIN playbooks p on g.playbook_id = p.id where g.team_id = 1;
select * from groups where id = 28;
select * from playbooks where team_id = 1;
select * from playbooks where id = 179;
select * from playbook_categories where id = 1391;
select * from users where id = 143;
select * from crm_profiles where user_id = 143;
select * from activities where crm_configuration_id = 39 and type = 'conference'
and crm_provider_id IS NOT NULL ORDER by id desc;
select * from activities where id = 422003; # 00UO400000pB6fpMAC
SELECT ar.id, ar.uuid, ar.media_type, ar.status, a.type
FROM automated_report_results ar
JOIN automated_reports a ON a.id = ar.report_id
WHERE a.type = 'ask_jiminny'
LIMIT 10;
select * from teams where id = 3143;
select * from crm_configurations where id = 500;
select * from users where name = 'Integration Account'; # 1695
SELECT * FROM social_accounts WHERE sociable_id = 1695;
select * from activities where crm_configuration_id = 39
and recording_state = 'recorded' and duration > 60
and status = 'completed' and actual_start_time >= '2025-12-01'
SELECT * FROM activities WHERE uuid_to_bin('458cf915-b914-4000-b083-5687b32b2956') = uuid;
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"#11894 on JY-18909-automated-reports-ask-jiminny, menu","depth":5,"help_text":"Pull request #11894 exists for current branch JY-18909-automated-reports-ask-jiminny","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"AskJiminnyReportActivityServiceTest","depth":6,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run 'AskJiminnyReportActivityServiceTest'","depth":6,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'AskJiminnyReportActivityServiceTest'","depth":6,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"More Actions","depth":6,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JetBrains AI","depth":5,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Search Everywhere","depth":5,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"IDE and Project Settings","depth":5,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.088194445,"height":0.027777778},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"1","depth":4,"role_description":"text"},{"role":"AXStaticText","text":"9","depth":4,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Http\\Controllers\\API\\V2;\n\nuse Illuminate\\Http\\JsonResponse;\nuse Illuminate\\Http\\Request;\nuse Illuminate\\Routing\\Controller;\nuse Jiminny\\Exceptions\\InvalidArgumentException;\nuse Jiminny\\Exceptions\\ModelNotFoundException;\nuse Jiminny\\Models\\AutomatedReport;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Services\\Kiosk\\AutomatedReports\\AutomatedReportsService;\nuse Psr\\Log\\LoggerInterface;\nuse Symfony\\Component\\HttpFoundation\\Response;\nuse Throwable;\n\nclass AskJiminnyReportsController extends Controller\n{\n public function __construct(\n private readonly AutomatedReportsService $automatedReportsService,\n private readonly LoggerInterface $logger,\n ) {\n }\n\n private function isNotOwnedByUser(AutomatedReport $report, User $user): bool\n {\n return $report->getTeamId() !== $user->getTeamId()\n || $report->getAttribute('created_by') !== $user->getId();\n }\n\n public function getFormData(Request $request, ?string $uuid = null): JsonResponse\n {\n /** @var User $user */\n $user = $request->user();\n\n try {\n $report = $uuid ? $this->automatedReportsService->getReport($uuid) : null;\n\n return new JsonResponse(\n $this->automatedReportsService->getAskJiminnyReportFormData($user, $report)\n );\n } catch (ModelNotFoundException $e) {\n return new JsonResponse(['error' => $e->getMessage()], Response::HTTP_NOT_FOUND);\n } catch (Throwable $e) {\n $this->logger->error('Failed to fetch Ask Jiminny report form data', [\n 'error' => $e->getMessage(),\n 'user_id' => $user->getId(),\n 'uuid' => $uuid,\n ]);\n\n return new JsonResponse(\n ['error' => 'Failed to fetch form data'],\n Response::HTTP_INTERNAL_SERVER_ERROR\n );\n }\n }\n\n /**\n * Create a new Ask Jiminny report.\n */\n public function create(Request $request): JsonResponse\n {\n /** @var User $user */\n $user = $request->user();\n\n try {\n $data = $this->automatedReportsService->createAskJiminnyReport($request->all(), $user);\n\n return new JsonResponse($data);\n } catch (InvalidArgumentException $e) {\n return new JsonResponse(['error' => $e->getMessage()], Response::HTTP_UNPROCESSABLE_ENTITY);\n } catch (Throwable $e) {\n $this->logger->error('Failed to create Ask Jiminny report', [\n 'error' => $e->getMessage(),\n 'user_id' => $user->getId(),\n ]);\n\n return new JsonResponse(\n ['error' => 'Failed to create report'],\n Response::HTTP_INTERNAL_SERVER_ERROR\n );\n }\n }\n\n /**\n * Update an existing Ask Jiminny report.\n */\n public function update(Request $request, string $uuid): JsonResponse\n {\n \\Illuminate\\Support\\Facades\\Log::channel('custom_channel')->info(\"UPDATE\");\n /** @var User $user */\n $user = $request->user();\n\n try {\n $report = $this->automatedReportsService->getReport($uuid);\n\n if ($this->isNotOwnedByUser($report, $user)) {\n return new JsonResponse(['error' => 'Report not found'], Response::HTTP_NOT_FOUND);\n }\n\n $data = $this->automatedReportsService->updateAskJiminnyReport($report, $request->all(), $user);\n\n return new JsonResponse($data);\n } catch (ModelNotFoundException $e) {\n return new JsonResponse(['error' => $e->getMessage()], Response::HTTP_NOT_FOUND);\n } catch (InvalidArgumentException $e) {\n return new JsonResponse(['error' => $e->getMessage()], Response::HTTP_UNPROCESSABLE_ENTITY);\n } catch (Throwable $e) {\n $this->logger->error('Failed to update Ask Jiminny report', [\n 'error' => $e->getMessage(),\n 'user_id' => $user->getId(),\n 'uuid' => $uuid,\n ]);\n\n return new JsonResponse(\n ['error' => 'Failed to update report'],\n Response::HTTP_INTERNAL_SERVER_ERROR\n );\n }\n }\n\n /**\n * Toggle Ask Jiminny report status (enable/disable).\n */\n public function toggleStatus(Request $request, string $uuid): JsonResponse\n {\n /** @var User $user */\n $user = $request->user();\n\n try {\n $report = $this->automatedReportsService->getReport($uuid);\n\n if ($this->isNotOwnedByUser($report, $user)) {\n return new JsonResponse(['error' => 'Report not found'], Response::HTTP_NOT_FOUND);\n }\n\n $data = $this->automatedReportsService->updateAskJiminnyReportStatus(\n $report,\n (bool) $request->input('enabled'),\n );\n\n return new JsonResponse($data);\n } catch (ModelNotFoundException $e) {\n return new JsonResponse(['error' => $e->getMessage()], Response::HTTP_NOT_FOUND);\n } catch (Throwable $e) {\n $this->logger->error('Failed to toggle Ask Jiminny report status', [\n 'error' => $e->getMessage(),\n 'user_id' => $user->getId(),\n 'uuid' => $uuid,\n ]);\n\n return new JsonResponse(\n ['error' => 'Failed to toggle report status'],\n Response::HTTP_INTERNAL_SERVER_ERROR\n );\n }\n }\n\n /**\n * List all Ask Jiminny reports.\n */\n public function list(Request $request): JsonResponse\n {\n /** @var User $user */\n $user = $request->user();\n\n try {\n $sortColumn = $request->input('sort_column', 'created_at');\n $sortDirection = $request->input('sort_direction', 'desc');\n\n $data = $this->automatedReportsService->listAskJiminnyReports($user, $sortColumn, $sortDirection);\n\n return new JsonResponse($data);\n } catch (Throwable $e) {\n $this->logger->error('Failed to list Ask Jiminny reports', [\n 'error' => $e->getMessage(),\n 'user_id' => $user->getId(),\n ]);\n\n return new JsonResponse(\n ['error' => 'Failed to fetch reports'],\n Response::HTTP_INTERNAL_SERVER_ERROR\n );\n }\n }\n\n /**\n * Get a single Ask Jiminny report.\n */\n public function get(Request $request, string $uuid): JsonResponse\n {\n /** @var User $user */\n $user = $request->user();\n\n try {\n $report = $this->automatedReportsService->getReport($uuid);\n\n if ($this->isNotOwnedByUser($report, $user)) {\n return new JsonResponse(['error' => 'Report not found'], Response::HTTP_NOT_FOUND);\n }\n\n return new JsonResponse($this->automatedReportsService->get($uuid));\n } catch (ModelNotFoundException $e) {\n return new JsonResponse(['error' => $e->getMessage()], Response::HTTP_NOT_FOUND);\n } catch (Throwable $e) {\n $this->logger->error('Failed to get Ask Jiminny report', [\n 'error' => $e->getMessage(),\n 'user_id' => $user->getId(),\n 'uuid' => $uuid,\n ]);\n\n return new JsonResponse(\n ['error' => 'Failed to fetch report'],\n Response::HTTP_INTERNAL_SERVER_ERROR\n );\n }\n }\n\n public function getReportsCount(Request $request, string $uuid): JsonResponse\n {\n /** @var User $user */\n $user = $request->user();\n\n try {\n $report = $this->automatedReportsService->getReport($uuid);\n\n if ($this->isNotOwnedByUser($report, $user)) {\n return new JsonResponse(['error' => 'Report not found'], Response::HTTP_NOT_FOUND);\n }\n\n $resultsCount = $this->automatedReportsService->getReportResults($report)->count();\n\n return new JsonResponse(['count' => $resultsCount]);\n } catch (ModelNotFoundException $e) {\n return new JsonResponse(['error' => $e->getMessage()], Response::HTTP_NOT_FOUND);\n } catch (Throwable $e) {\n $this->logger->error('Failed to count report results', [\n 'error' => $e->getMessage(),\n 'user_id' => $user->getId(),\n 'report_uuid' => $uuid,\n ]);\n\n return new JsonResponse(\n ['error' => 'Failed to count report results'],\n Response::HTTP_INTERNAL_SERVER_ERROR\n );\n }\n }\n\n /**\n * Delete an Ask Jiminny report.\n */\n public function delete(Request $request, string $uuid): JsonResponse\n {\n /** @var User $user */\n $user = $request->user();\n\n try {\n if ($request->boolean('delete_generated_reports')) {\n $this->automatedReportsService->deleteReportResults($uuid);\n }\n\n $report = $this->automatedReportsService->getReport($uuid);\n\n if ($this->isNotOwnedByUser($report, $user)) {\n return new JsonResponse(['error' => 'Report not found'], Response::HTTP_NOT_FOUND);\n }\n\n $this->automatedReportsService->delete($uuid);\n\n return new JsonResponse(null, Response::HTTP_NO_CONTENT);\n } catch (ModelNotFoundException $e) {\n return new JsonResponse(['error' => $e->getMessage()], Response::HTTP_NOT_FOUND);\n } catch (Throwable $e) {\n $this->logger->error('Failed to delete Ask Jiminny report', [\n 'error' => $e->getMessage(),\n 'user_id' => $user->getId(),\n 'uuid' => $uuid,\n ]);\n\n return new JsonResponse(\n ['error' => 'Failed to delete report'],\n Response::HTTP_INTERNAL_SERVER_ERROR\n );\n }\n }\n\n public function getFilters(Request $request): JsonResponse\n {\n /** @var User $user */\n $user = $request->user();\n\n try {\n $filters = $this->automatedReportsService->getAskJiminnyReportFilters($user);\n\n return new JsonResponse(['filters' => $filters]);\n } catch (Throwable $e) {\n $this->logger->error('Failed to fetch Ask Jiminny report filters', [\n 'error' => $e->getMessage(),\n 'user_id' => $user->getId(),\n ]);\n\n return new JsonResponse(\n ['error' => 'Failed to fetch filters'],\n Response::HTTP_INTERNAL_SERVER_ERROR\n );\n }\n }\n}","depth":4,"value":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Http\\Controllers\\API\\V2;\n\nuse Illuminate\\Http\\JsonResponse;\nuse Illuminate\\Http\\Request;\nuse Illuminate\\Routing\\Controller;\nuse Jiminny\\Exceptions\\InvalidArgumentException;\nuse Jiminny\\Exceptions\\ModelNotFoundException;\nuse Jiminny\\Models\\AutomatedReport;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Services\\Kiosk\\AutomatedReports\\AutomatedReportsService;\nuse Psr\\Log\\LoggerInterface;\nuse Symfony\\Component\\HttpFoundation\\Response;\nuse Throwable;\n\nclass AskJiminnyReportsController extends Controller\n{\n public function __construct(\n private readonly AutomatedReportsService $automatedReportsService,\n private readonly LoggerInterface $logger,\n ) {\n }\n\n private function isNotOwnedByUser(AutomatedReport $report, User $user): bool\n {\n return $report->getTeamId() !== $user->getTeamId()\n || $report->getAttribute('created_by') !== $user->getId();\n }\n\n public function getFormData(Request $request, ?string $uuid = null): JsonResponse\n {\n /** @var User $user */\n $user = $request->user();\n\n try {\n $report = $uuid ? $this->automatedReportsService->getReport($uuid) : null;\n\n return new JsonResponse(\n $this->automatedReportsService->getAskJiminnyReportFormData($user, $report)\n );\n } catch (ModelNotFoundException $e) {\n return new JsonResponse(['error' => $e->getMessage()], Response::HTTP_NOT_FOUND);\n } catch (Throwable $e) {\n $this->logger->error('Failed to fetch Ask Jiminny report form data', [\n 'error' => $e->getMessage(),\n 'user_id' => $user->getId(),\n 'uuid' => $uuid,\n ]);\n\n return new JsonResponse(\n ['error' => 'Failed to fetch form data'],\n Response::HTTP_INTERNAL_SERVER_ERROR\n );\n }\n }\n\n /**\n * Create a new Ask Jiminny report.\n */\n public function create(Request $request): JsonResponse\n {\n /** @var User $user */\n $user = $request->user();\n\n try {\n $data = $this->automatedReportsService->createAskJiminnyReport($request->all(), $user);\n\n return new JsonResponse($data);\n } catch (InvalidArgumentException $e) {\n return new JsonResponse(['error' => $e->getMessage()], Response::HTTP_UNPROCESSABLE_ENTITY);\n } catch (Throwable $e) {\n $this->logger->error('Failed to create Ask Jiminny report', [\n 'error' => $e->getMessage(),\n 'user_id' => $user->getId(),\n ]);\n\n return new JsonResponse(\n ['error' => 'Failed to create report'],\n Response::HTTP_INTERNAL_SERVER_ERROR\n );\n }\n }\n\n /**\n * Update an existing Ask Jiminny report.\n */\n public function update(Request $request, string $uuid): JsonResponse\n {\n \\Illuminate\\Support\\Facades\\Log::channel('custom_channel')->info(\"UPDATE\");\n /** @var User $user */\n $user = $request->user();\n\n try {\n $report = $this->automatedReportsService->getReport($uuid);\n\n if ($this->isNotOwnedByUser($report, $user)) {\n return new JsonResponse(['error' => 'Report not found'], Response::HTTP_NOT_FOUND);\n }\n\n $data = $this->automatedReportsService->updateAskJiminnyReport($report, $request->all(), $user);\n\n return new JsonResponse($data);\n } catch (ModelNotFoundException $e) {\n return new JsonResponse(['error' => $e->getMessage()], Response::HTTP_NOT_FOUND);\n } catch (InvalidArgumentException $e) {\n return new JsonResponse(['error' => $e->getMessage()], Response::HTTP_UNPROCESSABLE_ENTITY);\n } catch (Throwable $e) {\n $this->logger->error('Failed to update Ask Jiminny report', [\n 'error' => $e->getMessage(),\n 'user_id' => $user->getId(),\n 'uuid' => $uuid,\n ]);\n\n return new JsonResponse(\n ['error' => 'Failed to update report'],\n Response::HTTP_INTERNAL_SERVER_ERROR\n );\n }\n }\n\n /**\n * Toggle Ask Jiminny report status (enable/disable).\n */\n public function toggleStatus(Request $request, string $uuid): JsonResponse\n {\n /** @var User $user */\n $user = $request->user();\n\n try {\n $report = $this->automatedReportsService->getReport($uuid);\n\n if ($this->isNotOwnedByUser($report, $user)) {\n return new JsonResponse(['error' => 'Report not found'], Response::HTTP_NOT_FOUND);\n }\n\n $data = $this->automatedReportsService->updateAskJiminnyReportStatus(\n $report,\n (bool) $request->input('enabled'),\n );\n\n return new JsonResponse($data);\n } catch (ModelNotFoundException $e) {\n return new JsonResponse(['error' => $e->getMessage()], Response::HTTP_NOT_FOUND);\n } catch (Throwable $e) {\n $this->logger->error('Failed to toggle Ask Jiminny report status', [\n 'error' => $e->getMessage(),\n 'user_id' => $user->getId(),\n 'uuid' => $uuid,\n ]);\n\n return new JsonResponse(\n ['error' => 'Failed to toggle report status'],\n Response::HTTP_INTERNAL_SERVER_ERROR\n );\n }\n }\n\n /**\n * List all Ask Jiminny reports.\n */\n public function list(Request $request): JsonResponse\n {\n /** @var User $user */\n $user = $request->user();\n\n try {\n $sortColumn = $request->input('sort_column', 'created_at');\n $sortDirection = $request->input('sort_direction', 'desc');\n\n $data = $this->automatedReportsService->listAskJiminnyReports($user, $sortColumn, $sortDirection);\n\n return new JsonResponse($data);\n } catch (Throwable $e) {\n $this->logger->error('Failed to list Ask Jiminny reports', [\n 'error' => $e->getMessage(),\n 'user_id' => $user->getId(),\n ]);\n\n return new JsonResponse(\n ['error' => 'Failed to fetch reports'],\n Response::HTTP_INTERNAL_SERVER_ERROR\n );\n }\n }\n\n /**\n * Get a single Ask Jiminny report.\n */\n public function get(Request $request, string $uuid): JsonResponse\n {\n /** @var User $user */\n $user = $request->user();\n\n try {\n $report = $this->automatedReportsService->getReport($uuid);\n\n if ($this->isNotOwnedByUser($report, $user)) {\n return new JsonResponse(['error' => 'Report not found'], Response::HTTP_NOT_FOUND);\n }\n\n return new JsonResponse($this->automatedReportsService->get($uuid));\n } catch (ModelNotFoundException $e) {\n return new JsonResponse(['error' => $e->getMessage()], Response::HTTP_NOT_FOUND);\n } catch (Throwable $e) {\n $this->logger->error('Failed to get Ask Jiminny report', [\n 'error' => $e->getMessage(),\n 'user_id' => $user->getId(),\n 'uuid' => $uuid,\n ]);\n\n return new JsonResponse(\n ['error' => 'Failed to fetch report'],\n Response::HTTP_INTERNAL_SERVER_ERROR\n );\n }\n }\n\n public function getReportsCount(Request $request, string $uuid): JsonResponse\n {\n /** @var User $user */\n $user = $request->user();\n\n try {\n $report = $this->automatedReportsService->getReport($uuid);\n\n if ($this->isNotOwnedByUser($report, $user)) {\n return new JsonResponse(['error' => 'Report not found'], Response::HTTP_NOT_FOUND);\n }\n\n $resultsCount = $this->automatedReportsService->getReportResults($report)->count();\n\n return new JsonResponse(['count' => $resultsCount]);\n } catch (ModelNotFoundException $e) {\n return new JsonResponse(['error' => $e->getMessage()], Response::HTTP_NOT_FOUND);\n } catch (Throwable $e) {\n $this->logger->error('Failed to count report results', [\n 'error' => $e->getMessage(),\n 'user_id' => $user->getId(),\n 'report_uuid' => $uuid,\n ]);\n\n return new JsonResponse(\n ['error' => 'Failed to count report results'],\n Response::HTTP_INTERNAL_SERVER_ERROR\n );\n }\n }\n\n /**\n * Delete an Ask Jiminny report.\n */\n public function delete(Request $request, string $uuid): JsonResponse\n {\n /** @var User $user */\n $user = $request->user();\n\n try {\n if ($request->boolean('delete_generated_reports')) {\n $this->automatedReportsService->deleteReportResults($uuid);\n }\n\n $report = $this->automatedReportsService->getReport($uuid);\n\n if ($this->isNotOwnedByUser($report, $user)) {\n return new JsonResponse(['error' => 'Report not found'], Response::HTTP_NOT_FOUND);\n }\n\n $this->automatedReportsService->delete($uuid);\n\n return new JsonResponse(null, Response::HTTP_NO_CONTENT);\n } catch (ModelNotFoundException $e) {\n return new JsonResponse(['error' => $e->getMessage()], Response::HTTP_NOT_FOUND);\n } catch (Throwable $e) {\n $this->logger->error('Failed to delete Ask Jiminny report', [\n 'error' => $e->getMessage(),\n 'user_id' => $user->getId(),\n 'uuid' => $uuid,\n ]);\n\n return new JsonResponse(\n ['error' => 'Failed to delete report'],\n Response::HTTP_INTERNAL_SERVER_ERROR\n );\n }\n }\n\n public function getFilters(Request $request): JsonResponse\n {\n /** @var User $user */\n $user = $request->user();\n\n try {\n $filters = $this->automatedReportsService->getAskJiminnyReportFilters($user);\n\n return new JsonResponse(['filters' => $filters]);\n } catch (Throwable $e) {\n $this->logger->error('Failed to fetch Ask Jiminny report filters', [\n 'error' => $e->getMessage(),\n 'user_id' => $user->getId(),\n ]);\n\n return new JsonResponse(\n ['error' => 'Failed to fetch filters'],\n Response::HTTP_INTERNAL_SERVER_ERROR\n );\n }\n }\n}","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Execute","depth":4,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Explain Plan","depth":4,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Browse Query History","depth":4,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"View Parameters","depth":4,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Open Query Execution Settings…","depth":4,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"In-Editor Results","depth":4,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Tx: Auto","depth":4,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Cancel Running Statements","depth":4,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Playground","depth":4,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"jiminny","depth":4,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.088194445,"height":0.027777778},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"10","depth":4,"role_description":"text"},{"role":"AXStaticText","text":"12","depth":4,"role_description":"text"},{"role":"AXStaticText","text":"2","depth":4,"role_description":"text"},{"role":"AXStaticText","text":"4","depth":4,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"SELECT a.id, a.uuid, a.actual_start_time, o.id, o.uuid FROM opportunities o\nJOIN activities a ON o.id = a.opportunity_id\nWHERE a.crm_configuration_id = 39\nAND a.actual_start_time > '2025-10-13'\nAND a.type IN ('conference', 'softphone-inbound', 'softphone-outbound')\n;\n\nSELECT * FROM activities\nWHERE crm_configuration_id = 39 and user_id = 143\nand actual_start_time >= '2025-10-13'\nAND type IN ('conference', 'softphone-inbound', 'softphone-outbound')\n;\n\nSELECT * FROM opportunities WHERE account_id IN (178);\nselect * from activities where id IN (620137, 620187, 620188, 620189, 620230);\n\n# HS\nSELECT * FROM opportunities WHERE id IN (238);\nselect * from activities where id IN (477,2076);\n\nselect * from users;\n\nSELECT COUNT(*) FROM users;\nSELECT COUNT(*) FROM activities;\nSELECT COUNT(*) FROM opportunities;\n\nUPDATE activities\nSET\n actual_start_time = '2025-12-19 09:00:00',\n actual_end_time = '2025-12-19 10:30:00',\n scheduled_start_time = '2025-12-19 09:00:00',\n scheduled_end_time = '2025-12-19 10:30:00'\nWHERE id IN (407509,407375);\n\nselect * from partners;\n\nSELECT id, uuid, type, actual_start_time, user_id, crm_configuration_id\nFROM activities\nWHERE user_id = 143\nAND actual_start_time >= '2025-10-13 00:00:00'\nAND actual_start_time <= '2026-01-13 23:59:59'\nORDER BY actual_start_time DESC;\n\nSELECT * FROM activities WHERE uuid_to_bin('78eda160-3086-435f-88a5-bb0c71b6008d') = uuid;\nSELECT * FROM crm_layouts where crm_configuration_id = 39;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 282;\n# lead_id\n# account_id 177\n# contact_id 3969\n# opportunity_id\n# stage_id 203\n\nSELECT * FROM opportunities WHERE opportunities.crm_configuration_id = id = 282;\n\nSELECT * FROM activities where crm_configuration_id = 39 AND type = 'conference'\nAND user_id = 143 and actual_start_time >= '2025-10-13';\n\nSELECT * FROM activities a\n# JOIN opportunities o ON a.opportunity_id = o.id\nWHERE a.crm_configuration_id = 39 AND a.type = 'conference'\nand status = 'completed' and recording_state = 'recorded'\nand a.actual_start_time >= '2025-10-13'\nAND a.user_id = 143\n;\n\nselect * from leads\nwhere crm_configuration_id = 39; # 112 -> ac. 178, 109 => op. 1707\n\nSELECT * FROM activities WHERE id IN (356013,616188,616202,616310,407509,407375,356001,356008);\nSELECT * FROM activities WHERE id IN (356013,616188,616202,616310);\nSELECT * FROM activities WHERE id IN (407509,407375); # leads: 112, 109 | status - 198\nSELECT * FROM activities WHERE id IN (356001, 356008); # contacts:\n\nSELECT * FROM opportunities WHERE id IN (1707);\nSELECT * FROM stages where id IN (204, 198);\nSELECT * FROM opportunities WHERE account_id IN (178);\nSELECT * FROM opportunities WHERE crm_configuration_id = 39 AND created_at > '2025-01-01';\nSELECT * FROM contacts WHERE account_id IN (178); # 4118 Musaibe, 4448 Ceco Personal\n\nSELECT * FROM activities where crm_configuration_id = 39\nAND opportunity_id IS NULL\nAND is_internal = false\nand status = 'completed' and recording_state = 'recorded'\nAND actual_start_time >= '2025-10-13'\nAND (lead_id IS NOT NULL OR contact_id IS NOT NULL OR account_id IS NOT NULL)\n# AND lead_id IN (112, 109)\n;\n\nSELECT * FROM crm_profiles WHERE user_id = 143;\n\nselect * from inboxes; # 212\nselect * from users where id = 143; # 143\nselect * from inbox_email_batches where inbox_id = 212\nand updated_at >= '2026-01-28 00:00:00' order by id desc;\nselect * from inbox_emails where inbox_id = 212\nand batch_id = 95885 order by id desc;\nselect * from email_messages where origin_user_id = 143;\nselect * from activities where user_id = 143 and updated_at >= '2026-01-28 00:00:00';\nselect * from participants where activity_id = 620247;\n\nselect * from crm_profiles where user_id = 143;\n\nSELECT * FROM activities WHERE uuid_to_bin('458cf915-b914-4000-b083-5687b32b2956') = uuid; # 356001\nselect * from transcription where activity_id = 356001; # 6943\nselect * from ai_prompts where transcription_id = 6943;\nSELECT * FROM activity_summary_logs where activity_id = 356001;\n\nSELECT * FROM social_accounts WHERE sociable_id = 143;\n\n# ************************************************************************************\nSELECT * FROM activities WHERE uuid_to_bin('0164a4fb-cb95-454e-9edd-4d804e4999bd') = uuid;\n# 422515 softphone tr. 8100\n\nSELECT * FROM activities WHERE uuid_to_bin('7520add8-8d87-41a5-98e5-fc4edf96f21e') = uuid;\n# 407509 conference tr. 7670 crmId: 00UD1000002J9aTMAS\n\nselect * from ai_prompts where transcription_id IN (8100, 7670);\nselect * from activity_summary_logs where activity_id = 407509;\n\nselect * from sidekick_settings;\nselect * from default_activity_types;\n\nSELECT * FROM contacts WHERE crm_configuration_id = 39 and email = 'm.kogoj@gmx.at';\nSELECT * FROM leads WHERE crm_configuration_id = 39 and email = 'm.kogoj@gmx.at';\n\nSELECT * FROM activity_searches where user_id = 143;\nSELECT * FROM groups where team_id = 1;\n\nselect * from teams where id = 1;\nselect * from groups where team_id = 1; # 1150 - 7e75f8025c22\nselect id, name, group_id, status, deleted_at, email\nfrom users where team_id = 1 order by group_id desc ;\n\nselect * from activity_searches where id in (1977, 1978, 1979);\nselect * from activity_search_filters where activity_search_id IN (1977, 1978, 1979);\nselect * from activity_search_filters where filter = 'group_id' and value = '443f26b8-8512-437e-a9f9-7e75f8025c22'; # 10268, 10272, 10277\nselect * from nudges where activity_search_id IN (1977, 1978, 1979); # 877, 878, 879\n\nINSERT INTO `activity_search_filters`\n(`activity_search_id`, `filter`, `value`) VALUES\n(1977, 'group_id', '443f26b8-8512-437e-a9f9-7e75f8025c22'),\n(1978, 'group_id', '443f26b8-8512-437e-a9f9-7e75f8025c22'),\n(1979, 'group_id', '443f26b8-8512-437e-a9f9-7e75f8025c22')\n;\n\nselect * from crm_configurations where id = 39;\n\nselect * from teams where id = 1;\nselect * from team_features where team_id = 1;\nselect * from features;\n\nSELECT * FROM activity_searches where id = 1982; # 1981\nSELECT * FROM activity_search_filters WHERE activity_search_id = 1982;\n\nSELECT * FROM automated_reports where id = 68;\nSELECT * FROM automated_report_results where id = 275;\n\nSELECT * FROM automated_reports order by id desc;\nSELECT * FROM automated_report_results order by id desc;\nselect * from activity_searches where user_id = 143;\nselect * from ask_anything_prompts;\n\nSELECT * FROM groups WHERE id = 1439;\nSELECT * FROM users WHERE group_id = 1439;\n\nselect * from permissions; # 158\nselect * from roles;\nselect * from permission_role\n\nselect * from teams where id = 1;\nselect * from groups g JOIN playbooks p on g.playbook_id = p.id where g.team_id = 1;\nselect * from groups where id = 28;\nselect * from playbooks where team_id = 1;\nselect * from playbooks where id = 179;\nselect * from playbook_categories where id = 1391;\nselect * from users where id = 143;\nselect * from crm_profiles where user_id = 143;\nselect * from activities where crm_configuration_id = 39 and type = 'conference'\nand crm_provider_id IS NOT NULL ORDER by id desc;\nselect * from activities where id = 422003; # 00UO400000pB6fpMAC\n\nSELECT ar.id, ar.uuid, ar.media_type, ar.status, a.type\nFROM automated_report_results ar\nJOIN automated_reports a ON a.id = ar.report_id\nWHERE a.type = 'ask_jiminny'\nLIMIT 10;\n\n\nselect * from teams where id = 3143;\nselect * from crm_configurations where id = 500;\nselect * from users where name = 'Integration Account'; # 1695\nSELECT * FROM social_accounts WHERE sociable_id = 1695;\n\nselect * from activities where crm_configuration_id = 39\nand recording_state = 'recorded' and duration > 60\nand status = 'completed' and actual_start_time >= '2025-12-01'\n\nSELECT * FROM activities WHERE uuid_to_bin('458cf915-b914-4000-b083-5687b32b2956') = uuid;","depth":4,"value":"SELECT a.id, a.uuid, a.actual_start_time, o.id, o.uuid FROM opportunities o\nJOIN activities a ON o.id = a.opportunity_id\nWHERE a.crm_configuration_id = 39\nAND a.actual_start_time > '2025-10-13'\nAND a.type IN ('conference', 'softphone-inbound', 'softphone-outbound')\n;\n\nSELECT * FROM activities\nWHERE crm_configuration_id = 39 and user_id = 143\nand actual_start_time >= '2025-10-13'\nAND type IN ('conference', 'softphone-inbound', 'softphone-outbound')\n;\n\nSELECT * FROM opportunities WHERE account_id IN (178);\nselect * from activities where id IN (620137, 620187, 620188, 620189, 620230);\n\n# HS\nSELECT * FROM opportunities WHERE id IN (238);\nselect * from activities where id IN (477,2076);\n\nselect * from users;\n\nSELECT COUNT(*) FROM users;\nSELECT COUNT(*) FROM activities;\nSELECT COUNT(*) FROM opportunities;\n\nUPDATE activities\nSET\n actual_start_time = '2025-12-19 09:00:00',\n actual_end_time = '2025-12-19 10:30:00',\n scheduled_start_time = '2025-12-19 09:00:00',\n scheduled_end_time = '2025-12-19 10:30:00'\nWHERE id IN (407509,407375);\n\nselect * from partners;\n\nSELECT id, uuid, type, actual_start_time, user_id, crm_configuration_id\nFROM activities\nWHERE user_id = 143\nAND actual_start_time >= '2025-10-13 00:00:00'\nAND actual_start_time <= '2026-01-13 23:59:59'\nORDER BY actual_start_time DESC;\n\nSELECT * FROM activities WHERE uuid_to_bin('78eda160-3086-435f-88a5-bb0c71b6008d') = uuid;\nSELECT * FROM crm_layouts where crm_configuration_id = 39;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 282;\n# lead_id\n# account_id 177\n# contact_id 3969\n# opportunity_id\n# stage_id 203\n\nSELECT * FROM opportunities WHERE opportunities.crm_configuration_id = id = 282;\n\nSELECT * FROM activities where crm_configuration_id = 39 AND type = 'conference'\nAND user_id = 143 and actual_start_time >= '2025-10-13';\n\nSELECT * FROM activities a\n# JOIN opportunities o ON a.opportunity_id = o.id\nWHERE a.crm_configuration_id = 39 AND a.type = 'conference'\nand status = 'completed' and recording_state = 'recorded'\nand a.actual_start_time >= '2025-10-13'\nAND a.user_id = 143\n;\n\nselect * from leads\nwhere crm_configuration_id = 39; # 112 -> ac. 178, 109 => op. 1707\n\nSELECT * FROM activities WHERE id IN (356013,616188,616202,616310,407509,407375,356001,356008);\nSELECT * FROM activities WHERE id IN (356013,616188,616202,616310);\nSELECT * FROM activities WHERE id IN (407509,407375); # leads: 112, 109 | status - 198\nSELECT * FROM activities WHERE id IN (356001, 356008); # contacts:\n\nSELECT * FROM opportunities WHERE id IN (1707);\nSELECT * FROM stages where id IN (204, 198);\nSELECT * FROM opportunities WHERE account_id IN (178);\nSELECT * FROM opportunities WHERE crm_configuration_id = 39 AND created_at > '2025-01-01';\nSELECT * FROM contacts WHERE account_id IN (178); # 4118 Musaibe, 4448 Ceco Personal\n\nSELECT * FROM activities where crm_configuration_id = 39\nAND opportunity_id IS NULL\nAND is_internal = false\nand status = 'completed' and recording_state = 'recorded'\nAND actual_start_time >= '2025-10-13'\nAND (lead_id IS NOT NULL OR contact_id IS NOT NULL OR account_id IS NOT NULL)\n# AND lead_id IN (112, 109)\n;\n\nSELECT * FROM crm_profiles WHERE user_id = 143;\n\nselect * from inboxes; # 212\nselect * from users where id = 143; # 143\nselect * from inbox_email_batches where inbox_id = 212\nand updated_at >= '2026-01-28 00:00:00' order by id desc;\nselect * from inbox_emails where inbox_id = 212\nand batch_id = 95885 order by id desc;\nselect * from email_messages where origin_user_id = 143;\nselect * from activities where user_id = 143 and updated_at >= '2026-01-28 00:00:00';\nselect * from participants where activity_id = 620247;\n\nselect * from crm_profiles where user_id = 143;\n\nSELECT * FROM activities WHERE uuid_to_bin('458cf915-b914-4000-b083-5687b32b2956') = uuid; # 356001\nselect * from transcription where activity_id = 356001; # 6943\nselect * from ai_prompts where transcription_id = 6943;\nSELECT * FROM activity_summary_logs where activity_id = 356001;\n\nSELECT * FROM social_accounts WHERE sociable_id = 143;\n\n# ************************************************************************************\nSELECT * FROM activities WHERE uuid_to_bin('0164a4fb-cb95-454e-9edd-4d804e4999bd') = uuid;\n# 422515 softphone tr. 8100\n\nSELECT * FROM activities WHERE uuid_to_bin('7520add8-8d87-41a5-98e5-fc4edf96f21e') = uuid;\n# 407509 conference tr. 7670 crmId: 00UD1000002J9aTMAS\n\nselect * from ai_prompts where transcription_id IN (8100, 7670);\nselect * from activity_summary_logs where activity_id = 407509;\n\nselect * from sidekick_settings;\nselect * from default_activity_types;\n\nSELECT * FROM contacts WHERE crm_configuration_id = 39 and email = 'm.kogoj@gmx.at';\nSELECT * FROM leads WHERE crm_configuration_id = 39 and email = 'm.kogoj@gmx.at';\n\nSELECT * FROM activity_searches where user_id = 143;\nSELECT * FROM groups where team_id = 1;\n\nselect * from teams where id = 1;\nselect * from groups where team_id = 1; # 1150 - 7e75f8025c22\nselect id, name, group_id, status, deleted_at, email\nfrom users where team_id = 1 order by group_id desc ;\n\nselect * from activity_searches where id in (1977, 1978, 1979);\nselect * from activity_search_filters where activity_search_id IN (1977, 1978, 1979);\nselect * from activity_search_filters where filter = 'group_id' and value = '443f26b8-8512-437e-a9f9-7e75f8025c22'; # 10268, 10272, 10277\nselect * from nudges where activity_search_id IN (1977, 1978, 1979); # 877, 878, 879\n\nINSERT INTO `activity_search_filters`\n(`activity_search_id`, `filter`, `value`) VALUES\n(1977, 'group_id', '443f26b8-8512-437e-a9f9-7e75f8025c22'),\n(1978, 'group_id', '443f26b8-8512-437e-a9f9-7e75f8025c22'),\n(1979, 'group_id', '443f26b8-8512-437e-a9f9-7e75f8025c22')\n;\n\nselect * from crm_configurations where id = 39;\n\nselect * from teams where id = 1;\nselect * from team_features where team_id = 1;\nselect * from features;\n\nSELECT * FROM activity_searches where id = 1982; # 1981\nSELECT * FROM activity_search_filters WHERE activity_search_id = 1982;\n\nSELECT * FROM automated_reports where id = 68;\nSELECT * FROM automated_report_results where id = 275;\n\nSELECT * FROM automated_reports order by id desc;\nSELECT * FROM automated_report_results order by id desc;\nselect * from activity_searches where user_id = 143;\nselect * from ask_anything_prompts;\n\nSELECT * FROM groups WHERE id = 1439;\nSELECT * FROM users WHERE group_id = 1439;\n\nselect * from permissions; # 158\nselect * from roles;\nselect * from permission_role\n\nselect * from teams where id = 1;\nselect * from groups g JOIN playbooks p on g.playbook_id = p.id where g.team_id = 1;\nselect * from groups where id = 28;\nselect * from playbooks where team_id = 1;\nselect * from playbooks where id = 179;\nselect * from playbook_categories where id = 1391;\nselect * from users where id = 143;\nselect * from crm_profiles where user_id = 143;\nselect * from activities where crm_configuration_id = 39 and type = 'conference'\nand crm_provider_id IS NOT NULL ORDER by id desc;\nselect * from activities where id = 422003; # 00UO400000pB6fpMAC\n\nSELECT ar.id, ar.uuid, ar.media_type, ar.status, a.type\nFROM automated_report_results ar\nJOIN automated_reports a ON a.id = ar.report_id\nWHERE a.type = 'ask_jiminny'\nLIMIT 10;\n\n\nselect * from teams where id = 3143;\nselect * from crm_configurations where id = 500;\nselect * from users where name = 'Integration Account'; # 1695\nSELECT * FROM social_accounts WHERE sociable_id = 1695;\n\nselect * from activities where crm_configuration_id = 39\nand recording_state = 'recorded' and duration > 60\nand status = 'completed' and actual_start_time >= '2025-12-01'\n\nSELECT * FROM activities WHERE uuid_to_bin('458cf915-b914-4000-b083-5687b32b2956') = uuid;","role_description":"text entry area","is_enabled":true,"is_focused":true,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Project","depth":3,"role_description":"text"},{"role":"AXButton","text":"Project","depth":3,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"New File or Directory…","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Expand Selected","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Collapse All","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Options","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
-7301178313361766127
|
-7003273557753482683
|
click
|
accessibility
|
NULL
|
Project: faVsco.js, menu
#11894 on JY-18909-automa Project: faVsco.js, menu
#11894 on JY-18909-automated-reports-ask-jiminny, menu
Start Listening for PHP Debug Connections
AskJiminnyReportActivityServiceTest
Run 'AskJiminnyReportActivityServiceTest'
Debug 'AskJiminnyReportActivityServiceTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
1
9
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Http\Controllers\API\V2;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
use Jiminny\Exceptions\InvalidArgumentException;
use Jiminny\Exceptions\ModelNotFoundException;
use Jiminny\Models\AutomatedReport;
use Jiminny\Models\User;
use Jiminny\Services\Kiosk\AutomatedReports\AutomatedReportsService;
use Psr\Log\LoggerInterface;
use Symfony\Component\HttpFoundation\Response;
use Throwable;
class AskJiminnyReportsController extends Controller
{
public function __construct(
private readonly AutomatedReportsService $automatedReportsService,
private readonly LoggerInterface $logger,
) {
}
private function isNotOwnedByUser(AutomatedReport $report, User $user): bool
{
return $report->getTeamId() !== $user->getTeamId()
|| $report->getAttribute('created_by') !== $user->getId();
}
public function getFormData(Request $request, ?string $uuid = null): JsonResponse
{
/** @var User $user */
$user = $request->user();
try {
$report = $uuid ? $this->automatedReportsService->getReport($uuid) : null;
return new JsonResponse(
$this->automatedReportsService->getAskJiminnyReportFormData($user, $report)
);
} catch (ModelNotFoundException $e) {
return new JsonResponse(['error' => $e->getMessage()], Response::HTTP_NOT_FOUND);
} catch (Throwable $e) {
$this->logger->error('Failed to fetch Ask Jiminny report form data', [
'error' => $e->getMessage(),
'user_id' => $user->getId(),
'uuid' => $uuid,
]);
return new JsonResponse(
['error' => 'Failed to fetch form data'],
Response::HTTP_INTERNAL_SERVER_ERROR
);
}
}
/**
* Create a new Ask Jiminny report.
*/
public function create(Request $request): JsonResponse
{
/** @var User $user */
$user = $request->user();
try {
$data = $this->automatedReportsService->createAskJiminnyReport($request->all(), $user);
return new JsonResponse($data);
} catch (InvalidArgumentException $e) {
return new JsonResponse(['error' => $e->getMessage()], Response::HTTP_UNPROCESSABLE_ENTITY);
} catch (Throwable $e) {
$this->logger->error('Failed to create Ask Jiminny report', [
'error' => $e->getMessage(),
'user_id' => $user->getId(),
]);
return new JsonResponse(
['error' => 'Failed to create report'],
Response::HTTP_INTERNAL_SERVER_ERROR
);
}
}
/**
* Update an existing Ask Jiminny report.
*/
public function update(Request $request, string $uuid): JsonResponse
{
\Illuminate\Support\Facades\Log::channel('custom_channel')->info("UPDATE");
/** @var User $user */
$user = $request->user();
try {
$report = $this->automatedReportsService->getReport($uuid);
if ($this->isNotOwnedByUser($report, $user)) {
return new JsonResponse(['error' => 'Report not found'], Response::HTTP_NOT_FOUND);
}
$data = $this->automatedReportsService->updateAskJiminnyReport($report, $request->all(), $user);
return new JsonResponse($data);
} catch (ModelNotFoundException $e) {
return new JsonResponse(['error' => $e->getMessage()], Response::HTTP_NOT_FOUND);
} catch (InvalidArgumentException $e) {
return new JsonResponse(['error' => $e->getMessage()], Response::HTTP_UNPROCESSABLE_ENTITY);
} catch (Throwable $e) {
$this->logger->error('Failed to update Ask Jiminny report', [
'error' => $e->getMessage(),
'user_id' => $user->getId(),
'uuid' => $uuid,
]);
return new JsonResponse(
['error' => 'Failed to update report'],
Response::HTTP_INTERNAL_SERVER_ERROR
);
}
}
/**
* Toggle Ask Jiminny report status (enable/disable).
*/
public function toggleStatus(Request $request, string $uuid): JsonResponse
{
/** @var User $user */
$user = $request->user();
try {
$report = $this->automatedReportsService->getReport($uuid);
if ($this->isNotOwnedByUser($report, $user)) {
return new JsonResponse(['error' => 'Report not found'], Response::HTTP_NOT_FOUND);
}
$data = $this->automatedReportsService->updateAskJiminnyReportStatus(
$report,
(bool) $request->input('enabled'),
);
return new JsonResponse($data);
} catch (ModelNotFoundException $e) {
return new JsonResponse(['error' => $e->getMessage()], Response::HTTP_NOT_FOUND);
} catch (Throwable $e) {
$this->logger->error('Failed to toggle Ask Jiminny report status', [
'error' => $e->getMessage(),
'user_id' => $user->getId(),
'uuid' => $uuid,
]);
return new JsonResponse(
['error' => 'Failed to toggle report status'],
Response::HTTP_INTERNAL_SERVER_ERROR
);
}
}
/**
* List all Ask Jiminny reports.
*/
public function list(Request $request): JsonResponse
{
/** @var User $user */
$user = $request->user();
try {
$sortColumn = $request->input('sort_column', 'created_at');
$sortDirection = $request->input('sort_direction', 'desc');
$data = $this->automatedReportsService->listAskJiminnyReports($user, $sortColumn, $sortDirection);
return new JsonResponse($data);
} catch (Throwable $e) {
$this->logger->error('Failed to list Ask Jiminny reports', [
'error' => $e->getMessage(),
'user_id' => $user->getId(),
]);
return new JsonResponse(
['error' => 'Failed to fetch reports'],
Response::HTTP_INTERNAL_SERVER_ERROR
);
}
}
/**
* Get a single Ask Jiminny report.
*/
public function get(Request $request, string $uuid): JsonResponse
{
/** @var User $user */
$user = $request->user();
try {
$report = $this->automatedReportsService->getReport($uuid);
if ($this->isNotOwnedByUser($report, $user)) {
return new JsonResponse(['error' => 'Report not found'], Response::HTTP_NOT_FOUND);
}
return new JsonResponse($this->automatedReportsService->get($uuid));
} catch (ModelNotFoundException $e) {
return new JsonResponse(['error' => $e->getMessage()], Response::HTTP_NOT_FOUND);
} catch (Throwable $e) {
$this->logger->error('Failed to get Ask Jiminny report', [
'error' => $e->getMessage(),
'user_id' => $user->getId(),
'uuid' => $uuid,
]);
return new JsonResponse(
['error' => 'Failed to fetch report'],
Response::HTTP_INTERNAL_SERVER_ERROR
);
}
}
public function getReportsCount(Request $request, string $uuid): JsonResponse
{
/** @var User $user */
$user = $request->user();
try {
$report = $this->automatedReportsService->getReport($uuid);
if ($this->isNotOwnedByUser($report, $user)) {
return new JsonResponse(['error' => 'Report not found'], Response::HTTP_NOT_FOUND);
}
$resultsCount = $this->automatedReportsService->getReportResults($report)->count();
return new JsonResponse(['count' => $resultsCount]);
} catch (ModelNotFoundException $e) {
return new JsonResponse(['error' => $e->getMessage()], Response::HTTP_NOT_FOUND);
} catch (Throwable $e) {
$this->logger->error('Failed to count report results', [
'error' => $e->getMessage(),
'user_id' => $user->getId(),
'report_uuid' => $uuid,
]);
return new JsonResponse(
['error' => 'Failed to count report results'],
Response::HTTP_INTERNAL_SERVER_ERROR
);
}
}
/**
* Delete an Ask Jiminny report.
*/
public function delete(Request $request, string $uuid): JsonResponse
{
/** @var User $user */
$user = $request->user();
try {
if ($request->boolean('delete_generated_reports')) {
$this->automatedReportsService->deleteReportResults($uuid);
}
$report = $this->automatedReportsService->getReport($uuid);
if ($this->isNotOwnedByUser($report, $user)) {
return new JsonResponse(['error' => 'Report not found'], Response::HTTP_NOT_FOUND);
}
$this->automatedReportsService->delete($uuid);
return new JsonResponse(null, Response::HTTP_NO_CONTENT);
} catch (ModelNotFoundException $e) {
return new JsonResponse(['error' => $e->getMessage()], Response::HTTP_NOT_FOUND);
} catch (Throwable $e) {
$this->logger->error('Failed to delete Ask Jiminny report', [
'error' => $e->getMessage(),
'user_id' => $user->getId(),
'uuid' => $uuid,
]);
return new JsonResponse(
['error' => 'Failed to delete report'],
Response::HTTP_INTERNAL_SERVER_ERROR
);
}
}
public function getFilters(Request $request): JsonResponse
{
/** @var User $user */
$user = $request->user();
try {
$filters = $this->automatedReportsService->getAskJiminnyReportFilters($user);
return new JsonResponse(['filters' => $filters]);
} catch (Throwable $e) {
$this->logger->error('Failed to fetch Ask Jiminny report filters', [
'error' => $e->getMessage(),
'user_id' => $user->getId(),
]);
return new JsonResponse(
['error' => 'Failed to fetch filters'],
Response::HTTP_INTERNAL_SERVER_ERROR
);
}
}
}
Execute
Explain Plan
Browse Query History
View Parameters
Open Query Execution Settings…
In-Editor Results
Tx: Auto
Cancel Running Statements
Playground
jiminny
Code changed:
Hide
Sync Changes
Hide This Notification
10
12
2
4
Previous Highlighted Error
Next Highlighted Error
SELECT a.id, a.uuid, a.actual_start_time, o.id, o.uuid FROM opportunities o
JOIN activities a ON o.id = a.opportunity_id
WHERE a.crm_configuration_id = 39
AND a.actual_start_time > '2025-10-13'
AND a.type IN ('conference', 'softphone-inbound', 'softphone-outbound')
;
SELECT * FROM activities
WHERE crm_configuration_id = 39 and user_id = 143
and actual_start_time >= '2025-10-13'
AND type IN ('conference', 'softphone-inbound', 'softphone-outbound')
;
SELECT * FROM opportunities WHERE account_id IN (178);
select * from activities where id IN (620137, 620187, 620188, 620189, 620230);
# HS
SELECT * FROM opportunities WHERE id IN (238);
select * from activities where id IN (477,2076);
select * from users;
SELECT COUNT(*) FROM users;
SELECT COUNT(*) FROM activities;
SELECT COUNT(*) FROM opportunities;
UPDATE activities
SET
actual_start_time = '2025-12-19 09:00:00',
actual_end_time = '2025-12-19 10:30:00',
scheduled_start_time = '2025-12-19 09:00:00',
scheduled_end_time = '2025-12-19 10:30:00'
WHERE id IN (407509,407375);
select * from partners;
SELECT id, uuid, type, actual_start_time, user_id, crm_configuration_id
FROM activities
WHERE user_id = 143
AND actual_start_time >= '2025-10-13 00:00:00'
AND actual_start_time <= '2026-01-13 23:59:59'
ORDER BY actual_start_time DESC;
SELECT * FROM activities WHERE uuid_to_bin('78eda160-3086-435f-88a5-bb0c71b6008d') = uuid;
SELECT * FROM crm_layouts where crm_configuration_id = 39;
SELECT * FROM crm_layout_entities WHERE crm_layout_id = 282;
# lead_id
# account_id 177
# contact_id 3969
# opportunity_id
# stage_id 203
SELECT * FROM opportunities WHERE opportunities.crm_configuration_id = id = 282;
SELECT * FROM activities where crm_configuration_id = 39 AND type = 'conference'
AND user_id = 143 and actual_start_time >= '2025-10-13';
SELECT * FROM activities a
# JOIN opportunities o ON a.opportunity_id = o.id
WHERE a.crm_configuration_id = 39 AND a.type = 'conference'
and status = 'completed' and recording_state = 'recorded'
and a.actual_start_time >= '2025-10-13'
AND a.user_id = 143
;
select * from leads
where crm_configuration_id = 39; # 112 -> ac. 178, 109 => op. 1707
SELECT * FROM activities WHERE id IN (356013,616188,616202,616310,407509,407375,356001,356008);
SELECT * FROM activities WHERE id IN (356013,616188,616202,616310);
SELECT * FROM activities WHERE id IN (407509,407375); # leads: 112, 109 | status - 198
SELECT * FROM activities WHERE id IN (356001, 356008); # contacts:
SELECT * FROM opportunities WHERE id IN (1707);
SELECT * FROM stages where id IN (204, 198);
SELECT * FROM opportunities WHERE account_id IN (178);
SELECT * FROM opportunities WHERE crm_configuration_id = 39 AND created_at > '2025-01-01';
SELECT * FROM contacts WHERE account_id IN (178); # 4118 Musaibe, 4448 Ceco Personal
SELECT * FROM activities where crm_configuration_id = 39
AND opportunity_id IS NULL
AND is_internal = false
and status = 'completed' and recording_state = 'recorded'
AND actual_start_time >= '2025-10-13'
AND (lead_id IS NOT NULL OR contact_id IS NOT NULL OR account_id IS NOT NULL)
# AND lead_id IN (112, 109)
;
SELECT * FROM crm_profiles WHERE user_id = 143;
select * from inboxes; # 212
select * from users where id = 143; # 143
select * from inbox_email_batches where inbox_id = 212
and updated_at >= '2026-01-28 00:00:00' order by id desc;
select * from inbox_emails where inbox_id = 212
and batch_id = 95885 order by id desc;
select * from email_messages where origin_user_id = 143;
select * from activities where user_id = 143 and updated_at >= '2026-01-28 00:00:00';
select * from participants where activity_id = 620247;
select * from crm_profiles where user_id = 143;
SELECT * FROM activities WHERE uuid_to_bin('458cf915-b914-4000-b083-5687b32b2956') = uuid; # 356001
select * from transcription where activity_id = 356001; # 6943
select * from ai_prompts where transcription_id = 6943;
SELECT * FROM activity_summary_logs where activity_id = 356001;
SELECT * FROM social_accounts WHERE sociable_id = 143;
# [PASSWORD_DOTS]
SELECT * FROM activities WHERE uuid_to_bin('0164a4fb-cb95-454e-9edd-4d804e4999bd') = uuid;
# 422515 softphone tr. 8100
SELECT * FROM activities WHERE uuid_to_bin('7520add8-8d87-41a5-98e5-fc4edf96f21e') = uuid;
# 407509 conference tr. 7670 crmId: 00UD1000002J9aTMAS
select * from ai_prompts where transcription_id IN (8100, 7670);
select * from activity_summary_logs where activity_id = 407509;
select * from sidekick_settings;
select * from default_activity_types;
SELECT * FROM contacts WHERE crm_configuration_id = 39 and email = '[EMAIL]';
SELECT * FROM leads WHERE crm_configuration_id = 39 and email = '[EMAIL]';
SELECT * FROM activity_searches where user_id = 143;
SELECT * FROM groups where team_id = 1;
select * from teams where id = 1;
select * from groups where team_id = 1; # 1150 - 7e75f8025c22
select id, name, group_id, status, deleted_at, email
from users where team_id = 1 order by group_id desc ;
select * from activity_searches where id in (1977, 1978, 1979);
select * from activity_search_filters where activity_search_id IN (1977, 1978, 1979);
select * from activity_search_filters where filter = 'group_id' and value = '443f26b8-8512-437e-a9f9-7e75f8025c22'; # 10268, 10272, 10277
select * from nudges where activity_search_id IN (1977, 1978, 1979); # 877, 878, 879
INSERT INTO `activity_search_filters`
(`activity_search_id`, `filter`, `value`) VALUES
(1977, 'group_id', '443f26b8-8512-437e-a9f9-7e75f8025c22'),
(1978, 'group_id', '443f26b8-8512-437e-a9f9-7e75f8025c22'),
(1979, 'group_id', '443f26b8-8512-437e-a9f9-7e75f8025c22')
;
select * from crm_configurations where id = 39;
select * from teams where id = 1;
select * from team_features where team_id = 1;
select * from features;
SELECT * FROM activity_searches where id = 1982; # 1981
SELECT * FROM activity_search_filters WHERE activity_search_id = 1982;
SELECT * FROM automated_reports where id = 68;
SELECT * FROM automated_report_results where id = 275;
SELECT * FROM automated_reports order by id desc;
SELECT * FROM automated_report_results order by id desc;
select * from activity_searches where user_id = 143;
select * from ask_anything_prompts;
SELECT * FROM groups WHERE id = 1439;
SELECT * FROM users WHERE group_id = 1439;
select * from permissions; # 158
select * from roles;
select * from permission_role
select * from teams where id = 1;
select * from groups g JOIN playbooks p on g.playbook_id = p.id where g.team_id = 1;
select * from groups where id = 28;
select * from playbooks where team_id = 1;
select * from playbooks where id = 179;
select * from playbook_categories where id = 1391;
select * from users where id = 143;
select * from crm_profiles where user_id = 143;
select * from activities where crm_configuration_id = 39 and type = 'conference'
and crm_provider_id IS NOT NULL ORDER by id desc;
select * from activities where id = 422003; # 00UO400000pB6fpMAC
SELECT ar.id, ar.uuid, ar.media_type, ar.status, a.type
FROM automated_report_results ar
JOIN automated_reports a ON a.id = ar.report_id
WHERE a.type = 'ask_jiminny'
LIMIT 10;
select * from teams where id = 3143;
select * from crm_configurations where id = 500;
select * from users where name = 'Integration Account'; # 1695
SELECT * FROM social_accounts WHERE sociable_id = 1695;
select * from activities where crm_configuration_id = 39
and recording_state = 'recorded' and duration > 60
and status = 'completed' and actual_start_time >= '2025-12-01'
SELECT * FROM activities WHERE uuid_to_bin('458cf915-b914-4000-b083-5687b32b2956') = uuid;
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide...
|
NULL
|
|
54990
|
NULL
|
0
|
2026-04-20T09:27:33.843292+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-20/1776 /Users/lukas/.screenpipe/data/data/2026-04-20/1776677253843_m2.jpg...
|
PhpStorm
|
faVsco.js – SF [jiminny@localhost]
|
True
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
#11894 on JY-18909-automa Project: faVsco.js, menu
#11894 on JY-18909-automated-reports-ask-jiminny, menu
Start Listening for PHP Debug Connections
AskJiminnyReportActivityServiceTest
Run 'AskJiminnyReportActivityServiceTest'
Debug 'AskJiminnyReportActivityServiceTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
1
9
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Http\Controllers\API\V2;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
use Jiminny\Exceptions\InvalidArgumentException;
use Jiminny\Exceptions\ModelNotFoundException;
use Jiminny\Models\AutomatedReport;
use Jiminny\Models\User;
use Jiminny\Services\Kiosk\AutomatedReports\AutomatedReportsService;
use Psr\Log\LoggerInterface;
use Symfony\Component\HttpFoundation\Response;
use Throwable;
class AskJiminnyReportsController extends Controller
{
public function __construct(
private readonly AutomatedReportsService $automatedReportsService,
private readonly LoggerInterface $logger,
) {
}
private function isNotOwnedByUser(AutomatedReport $report, User $user): bool
{
return $report->getTeamId() !== $user->getTeamId()
|| $report->getAttribute('created_by') !== $user->getId();
}
public function getFormData(Request $request, ?string $uuid = null): JsonResponse
{
/** @var User $user */
$user = $request->user();
try {
$report = $uuid ? $this->automatedReportsService->getReport($uuid) : null;
return new JsonResponse(
$this->automatedReportsService->getAskJiminnyReportFormData($user, $report)
);
} catch (ModelNotFoundException $e) {
return new JsonResponse(['error' => $e->getMessage()], Response::HTTP_NOT_FOUND);
} catch (Throwable $e) {
$this->logger->error('Failed to fetch Ask Jiminny report form data', [
'error' => $e->getMessage(),
'user_id' => $user->getId(),
'uuid' => $uuid,
]);
return new JsonResponse(
['error' => 'Failed to fetch form data'],
Response::HTTP_INTERNAL_SERVER_ERROR
);
}
}
/**
* Create a new Ask Jiminny report.
*/
public function create(Request $request): JsonResponse
{
/** @var User $user */
$user = $request->user();
try {
$data = $this->automatedReportsService->createAskJiminnyReport($request->all(), $user);
return new JsonResponse($data);
} catch (InvalidArgumentException $e) {
return new JsonResponse(['error' => $e->getMessage()], Response::HTTP_UNPROCESSABLE_ENTITY);
} catch (Throwable $e) {
$this->logger->error('Failed to create Ask Jiminny report', [
'error' => $e->getMessage(),
'user_id' => $user->getId(),
]);
return new JsonResponse(
['error' => 'Failed to create report'],
Response::HTTP_INTERNAL_SERVER_ERROR
);
}
}
/**
* Update an existing Ask Jiminny report.
*/
public function update(Request $request, string $uuid): JsonResponse
{
\Illuminate\Support\Facades\Log::channel('custom_channel')->info("UPDATE");
/** @var User $user */
$user = $request->user();
try {
$report = $this->automatedReportsService->getReport($uuid);
if ($this->isNotOwnedByUser($report, $user)) {
return new JsonResponse(['error' => 'Report not found'], Response::HTTP_NOT_FOUND);
}
$data = $this->automatedReportsService->updateAskJiminnyReport($report, $request->all(), $user);
return new JsonResponse($data);
} catch (ModelNotFoundException $e) {
return new JsonResponse(['error' => $e->getMessage()], Response::HTTP_NOT_FOUND);
} catch (InvalidArgumentException $e) {
return new JsonResponse(['error' => $e->getMessage()], Response::HTTP_UNPROCESSABLE_ENTITY);
} catch (Throwable $e) {
$this->logger->error('Failed to update Ask Jiminny report', [
'error' => $e->getMessage(),
'user_id' => $user->getId(),
'uuid' => $uuid,
]);
return new JsonResponse(
['error' => 'Failed to update report'],
Response::HTTP_INTERNAL_SERVER_ERROR
);
}
}
/**
* Toggle Ask Jiminny report status (enable/disable).
*/
public function toggleStatus(Request $request, string $uuid): JsonResponse
{
/** @var User $user */
$user = $request->user();
try {
$report = $this->automatedReportsService->getReport($uuid);
if ($this->isNotOwnedByUser($report, $user)) {
return new JsonResponse(['error' => 'Report not found'], Response::HTTP_NOT_FOUND);
}
$data = $this->automatedReportsService->updateAskJiminnyReportStatus(
$report,
(bool) $request->input('enabled'),
);
return new JsonResponse($data);
} catch (ModelNotFoundException $e) {
return new JsonResponse(['error' => $e->getMessage()], Response::HTTP_NOT_FOUND);
} catch (Throwable $e) {
$this->logger->error('Failed to toggle Ask Jiminny report status', [
'error' => $e->getMessage(),
'user_id' => $user->getId(),
'uuid' => $uuid,
]);
return new JsonResponse(
['error' => 'Failed to toggle report status'],
Response::HTTP_INTERNAL_SERVER_ERROR
);
}
}
/**
* List all Ask Jiminny reports.
*/
public function list(Request $request): JsonResponse
{
/** @var User $user */
$user = $request->user();
try {
$sortColumn = $request->input('sort_column', 'created_at');
$sortDirection = $request->input('sort_direction', 'desc');
$data = $this->automatedReportsService->listAskJiminnyReports($user, $sortColumn, $sortDirection);
return new JsonResponse($data);
} catch (Throwable $e) {
$this->logger->error('Failed to list Ask Jiminny reports', [
'error' => $e->getMessage(),
'user_id' => $user->getId(),
]);
return new JsonResponse(
['error' => 'Failed to fetch reports'],
Response::HTTP_INTERNAL_SERVER_ERROR
);
}
}
/**
* Get a single Ask Jiminny report.
*/
public function get(Request $request, string $uuid): JsonResponse
{
/** @var User $user */
$user = $request->user();
try {
$report = $this->automatedReportsService->getReport($uuid);
if ($this->isNotOwnedByUser($report, $user)) {
return new JsonResponse(['error' => 'Report not found'], Response::HTTP_NOT_FOUND);
}
return new JsonResponse($this->automatedReportsService->get($uuid));
} catch (ModelNotFoundException $e) {
return new JsonResponse(['error' => $e->getMessage()], Response::HTTP_NOT_FOUND);
} catch (Throwable $e) {
$this->logger->error('Failed to get Ask Jiminny report', [
'error' => $e->getMessage(),
'user_id' => $user->getId(),
'uuid' => $uuid,
]);
return new JsonResponse(
['error' => 'Failed to fetch report'],
Response::HTTP_INTERNAL_SERVER_ERROR
);
}
}
public function getReportsCount(Request $request, string $uuid): JsonResponse
{
/** @var User $user */
$user = $request->user();
try {
$report = $this->automatedReportsService->getReport($uuid);
if ($this->isNotOwnedByUser($report, $user)) {
return new JsonResponse(['error' => 'Report not found'], Response::HTTP_NOT_FOUND);
}
$resultsCount = $this->automatedReportsService->getReportResults($report)->count();
return new JsonResponse(['count' => $resultsCount]);
} catch (ModelNotFoundException $e) {
return new JsonResponse(['error' => $e->getMessage()], Response::HTTP_NOT_FOUND);
} catch (Throwable $e) {
$this->logger->error('Failed to count report results', [
'error' => $e->getMessage(),
'user_id' => $user->getId(),
'report_uuid' => $uuid,
]);
return new JsonResponse(
['error' => 'Failed to count report results'],
Response::HTTP_INTERNAL_SERVER_ERROR
);
}
}
/**
* Delete an Ask Jiminny report.
*/
public function delete(Request $request, string $uuid): JsonResponse
{
/** @var User $user */
$user = $request->user();
try {
if ($request->boolean('delete_generated_reports')) {
$this->automatedReportsService->deleteReportResults($uuid);
}
$report = $this->automatedReportsService->getReport($uuid);
if ($this->isNotOwnedByUser($report, $user)) {
return new JsonResponse(['error' => 'Report not found'], Response::HTTP_NOT_FOUND);
}
$this->automatedReportsService->delete($uuid);
return new JsonResponse(null, Response::HTTP_NO_CONTENT);
} catch (ModelNotFoundException $e) {
return new JsonResponse(['error' => $e->getMessage()], Response::HTTP_NOT_FOUND);
} catch (Throwable $e) {
$this->logger->error('Failed to delete Ask Jiminny report', [
'error' => $e->getMessage(),
'user_id' => $user->getId(),
'uuid' => $uuid,
]);
return new JsonResponse(
['error' => 'Failed to delete report'],
Response::HTTP_INTERNAL_SERVER_ERROR
);
}
}
public function getFilters(Request $request): JsonResponse
{
/** @var User $user */
$user = $request->user();
try {
$filters = $this->automatedReportsService->getAskJiminnyReportFilters($user);
return new JsonResponse(['filters' => $filters]);
} catch (Throwable $e) {
$this->logger->error('Failed to fetch Ask Jiminny report filters', [
'error' => $e->getMessage(),
'user_id' => $user->getId(),
]);
return new JsonResponse(
['error' => 'Failed to fetch filters'],
Response::HTTP_INTERNAL_SERVER_ERROR
);
}
}
}
Execute
Explain Plan
Browse Query History
View Parameters
Open Query Execution Settings…
In-Editor Results
Tx: Auto
Cancel Running Statements
Playground
jiminny
Code changed:
Hide
Sync Changes
Hide This Notification
10
12
2
4
Previous Highlighted Error
Next Highlighted Error
SELECT a.id, a.uuid, a.actual_start_time, o.id, o.uuid FROM opportunities o
JOIN activities a ON o.id = a.opportunity_id
WHERE a.crm_configuration_id = 39
AND a.actual_start_time > '2025-10-13'
AND a.type IN ('conference', 'softphone-inbound', 'softphone-outbound')
;
SELECT * FROM activities
WHERE crm_configuration_id = 39 and user_id = 143
and actual_start_time >= '2025-10-13'
AND type IN ('conference', 'softphone-inbound', 'softphone-outbound')
;
SELECT * FROM opportunities WHERE account_id IN (178);
select * from activities where id IN (620137, 620187, 620188, 620189, 620230);
# HS
SELECT * FROM opportunities WHERE id IN (238);
select * from activities where id IN (477,2076);
select * from users;
SELECT COUNT(*) FROM users;
SELECT COUNT(*) FROM activities;
SELECT COUNT(*) FROM opportunities;
UPDATE activities
SET
actual_start_time = '2025-12-19 09:00:00',
actual_end_time = '2025-12-19 10:30:00',
scheduled_start_time = '2025-12-19 09:00:00',
scheduled_end_time = '2025-12-19 10:30:00'
WHERE id IN (407509,407375);
select * from partners;
SELECT id, uuid, type, actual_start_time, user_id, crm_configuration_id
FROM activities
WHERE user_id = 143
AND actual_start_time >= '2025-10-13 00:00:00'
AND actual_start_time <= '2026-01-13 23:59:59'
ORDER BY actual_start_time DESC;
SELECT * FROM activities WHERE uuid_to_bin('78eda160-3086-435f-88a5-bb0c71b6008d') = uuid;
SELECT * FROM crm_layouts where crm_configuration_id = 39;
SELECT * FROM crm_layout_entities WHERE crm_layout_id = 282;
# lead_id
# account_id 177
# contact_id 3969
# opportunity_id
# stage_id 203
SELECT * FROM opportunities WHERE opportunities.crm_configuration_id = id = 282;
SELECT * FROM activities where crm_configuration_id = 39 AND type = 'conference'
AND user_id = 143 and actual_start_time >= '2025-10-13';
SELECT * FROM activities a
# JOIN opportunities o ON a.opportunity_id = o.id
WHERE a.crm_configuration_id = 39 AND a.type = 'conference'
and status = 'completed' and recording_state = 'recorded'
and a.actual_start_time >= '2025-10-13'
AND a.user_id = 143
;
select * from leads
where crm_configuration_id = 39; # 112 -> ac. 178, 109 => op. 1707
SELECT * FROM activities WHERE id IN (356013,616188,616202,616310,407509,407375,356001,356008);
SELECT * FROM activities WHERE id IN (356013,616188,616202,616310);
SELECT * FROM activities WHERE id IN (407509,407375); # leads: 112, 109 | status - 198
SELECT * FROM activities WHERE id IN (356001, 356008); # contacts:
SELECT * FROM opportunities WHERE id IN (1707);
SELECT * FROM stages where id IN (204, 198);
SELECT * FROM opportunities WHERE account_id IN (178);
SELECT * FROM opportunities WHERE crm_configuration_id = 39 AND created_at > '2025-01-01';
SELECT * FROM contacts WHERE account_id IN (178); # 4118 Musaibe, 4448 Ceco Personal
SELECT * FROM activities where crm_configuration_id = 39
AND opportunity_id IS NULL
AND is_internal = false
and status = 'completed' and recording_state = 'recorded'
AND actual_start_time >= '2025-10-13'
AND (lead_id IS NOT NULL OR contact_id IS NOT NULL OR account_id IS NOT NULL)
# AND lead_id IN (112, 109)
;
SELECT * FROM crm_profiles WHERE user_id = 143;
select * from inboxes; # 212
select * from users where id = 143; # 143
select * from inbox_email_batches where inbox_id = 212
and updated_at >= '2026-01-28 00:00:00' order by id desc;
select * from inbox_emails where inbox_id = 212
and batch_id = 95885 order by id desc;
select * from email_messages where origin_user_id = 143;
select * from activities where user_id = 143 and updated_at >= '2026-01-28 00:00:00';
select * from participants where activity_id = 620247;
select * from crm_profiles where user_id = 143;
SELECT * FROM activities WHERE uuid_to_bin('458cf915-b914-4000-b083-5687b32b2956') = uuid; # 356001
select * from transcription where activity_id = 356001; # 6943
select * from ai_prompts where transcription_id = 6943;
SELECT * FROM activity_summary_logs where activity_id = 356001;
SELECT * FROM social_accounts WHERE sociable_id = 143;
# [PASSWORD_DOTS]
SELECT * FROM activities WHERE uuid_to_bin('0164a4fb-cb95-454e-9edd-4d804e4999bd') = uuid;
# 422515 softphone tr. 8100
SELECT * FROM activities WHERE uuid_to_bin('7520add8-8d87-41a5-98e5-fc4edf96f21e') = uuid;
# 407509 conference tr. 7670 crmId: 00UD1000002J9aTMAS
select * from ai_prompts where transcription_id IN (8100, 7670);
select * from activity_summary_logs where activity_id = 407509;
select * from sidekick_settings;
select * from default_activity_types;
SELECT * FROM contacts WHERE crm_configuration_id = 39 and email = '[EMAIL]';
SELECT * FROM leads WHERE crm_configuration_id = 39 and email = '[EMAIL]';
SELECT * FROM activity_searches where user_id = 143;
SELECT * FROM groups where team_id = 1;
select * from teams where id = 1;
select * from groups where team_id = 1; # 1150 - 7e75f8025c22
select id, name, group_id, status, deleted_at, email
from users where team_id = 1 order by group_id desc ;
select * from activity_searches where id in (1977, 1978, 1979);
select * from activity_search_filters where activity_search_id IN (1977, 1978, 1979);
select * from activity_search_filters where filter = 'group_id' and value = '443f26b8-8512-437e-a9f9-7e75f8025c22'; # 10268, 10272, 10277
select * from nudges where activity_search_id IN (1977, 1978, 1979); # 877, 878, 879
INSERT INTO `activity_search_filters`
(`activity_search_id`, `filter`, `value`) VALUES
(1977, 'group_id', '443f26b8-8512-437e-a9f9-7e75f8025c22'),
(1978, 'group_id', '443f26b8-8512-437e-a9f9-7e75f8025c22'),
(1979, 'group_id', '443f26b8-8512-437e-a9f9-7e75f8025c22')
;
select * from crm_configurations where id = 39;
select * from teams where id = 1;
select * from team_features where team_id = 1;
select * from features;
SELECT * FROM activity_searches where id = 1982; # 1981
SELECT * FROM activity_search_filters WHERE activity_search_id = 1982;
SELECT * FROM automated_reports where id = 68;
SELECT * FROM automated_report_results where id = 275;
SELECT * FROM automated_reports order by id desc;
SELECT * FROM automated_report_results order by id desc;
select * from activity_searches where user_id = 143;
select * from ask_anything_prompts;
SELECT * FROM groups WHERE id = 1439;
SELECT * FROM users WHERE group_id = 1439;
select * from permissions; # 158
select * from roles;
select * from permission_role
select * from teams where id = 1;
select * from groups g JOIN playbooks p on g.playbook_id = p.id where g.team_id = 1;
select * from groups where id = 28;
select * from playbooks where team_id = 1;
select * from playbooks where id = 179;
select * from playbook_categories where id = 1391;
select * from users where id = 143;
select * from crm_profiles where user_id = 143;
select * from activities where crm_configuration_id = 39 and type = 'conference'
and crm_provider_id IS NOT NULL ORDER by id desc;
select * from activities where id = 422003; # 00UO400000pB6fpMAC
SELECT ar.id, ar.uuid, ar.media_type, ar.status, a.type
FROM automated_report_results ar
JOIN automated_reports a ON a.id = ar.report_id
WHERE a.type = 'ask_jiminny'
LIMIT 10;
select * from teams where id = 3143;
select * from crm_configurations where id = 500;
select * from users where name = 'Integration Account'; # 1695
SELECT * FROM social_accounts WHERE sociable_id = 1695;
select * from activities where crm_configuration_id = 39
and recording_state = 'recorded' and duration > 60
and status = 'completed' and actual_start_time >= '2025-12-01'
SELECT * FROM activities WHERE uuid_to_bin('458cf915-b914-4000-b083-5687b32b2956') = uuid;
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"bounds":{"left":0.025930852,"top":0.019952115,"width":0.03856383,"height":0.025538707},"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"#11894 on JY-18909-automated-reports-ask-jiminny, menu","depth":5,"bounds":{"left":0.064494684,"top":0.019952115,"width":0.12134308,"height":0.025538707},"help_text":"Pull request #11894 exists for current branch JY-18909-automated-reports-ask-jiminny","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"bounds":{"left":0.8081782,"top":0.019952115,"width":0.011303191,"height":0.025538707},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"AskJiminnyReportActivityServiceTest","depth":6,"bounds":{"left":0.8234708,"top":0.019952115,"width":0.09208777,"height":0.025538707},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run 'AskJiminnyReportActivityServiceTest'","depth":6,"bounds":{"left":0.9155585,"top":0.019952115,"width":0.011303191,"height":0.025538707},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'AskJiminnyReportActivityServiceTest'","depth":6,"bounds":{"left":0.9268617,"top":0.019952115,"width":0.011303191,"height":0.025538707},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"More Actions","depth":6,"bounds":{"left":0.9381649,"top":0.019952115,"width":0.011303191,"height":0.025538707},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JetBrains AI","depth":5,"bounds":{"left":0.96609044,"top":0.019952115,"width":0.011303191,"height":0.025538707},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Search Everywhere","depth":5,"bounds":{"left":0.9773936,"top":0.019952115,"width":0.011303191,"height":0.025538707},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"IDE and Project Settings","depth":5,"bounds":{"left":0.9886968,"top":0.019952115,"width":0.011303186,"height":0.025538707},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.042220745,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"1","depth":4,"bounds":{"left":0.3700133,"top":0.273743,"width":0.00731383,"height":0.015163607},"role_description":"text"},{"role":"AXStaticText","text":"9","depth":4,"bounds":{"left":0.3793218,"top":0.273743,"width":0.007978723,"height":0.015163607},"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.38896278,"top":0.27214685,"width":0.00731383,"height":0.018355945},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"bounds":{"left":0.3962766,"top":0.27214685,"width":0.006981383,"height":0.018355945},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Http\\Controllers\\API\\V2;\n\nuse Illuminate\\Http\\JsonResponse;\nuse Illuminate\\Http\\Request;\nuse Illuminate\\Routing\\Controller;\nuse Jiminny\\Exceptions\\InvalidArgumentException;\nuse Jiminny\\Exceptions\\ModelNotFoundException;\nuse Jiminny\\Models\\AutomatedReport;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Services\\Kiosk\\AutomatedReports\\AutomatedReportsService;\nuse Psr\\Log\\LoggerInterface;\nuse Symfony\\Component\\HttpFoundation\\Response;\nuse Throwable;\n\nclass AskJiminnyReportsController extends Controller\n{\n public function __construct(\n private readonly AutomatedReportsService $automatedReportsService,\n private readonly LoggerInterface $logger,\n ) {\n }\n\n private function isNotOwnedByUser(AutomatedReport $report, User $user): bool\n {\n return $report->getTeamId() !== $user->getTeamId()\n || $report->getAttribute('created_by') !== $user->getId();\n }\n\n public function getFormData(Request $request, ?string $uuid = null): JsonResponse\n {\n /** @var User $user */\n $user = $request->user();\n\n try {\n $report = $uuid ? $this->automatedReportsService->getReport($uuid) : null;\n\n return new JsonResponse(\n $this->automatedReportsService->getAskJiminnyReportFormData($user, $report)\n );\n } catch (ModelNotFoundException $e) {\n return new JsonResponse(['error' => $e->getMessage()], Response::HTTP_NOT_FOUND);\n } catch (Throwable $e) {\n $this->logger->error('Failed to fetch Ask Jiminny report form data', [\n 'error' => $e->getMessage(),\n 'user_id' => $user->getId(),\n 'uuid' => $uuid,\n ]);\n\n return new JsonResponse(\n ['error' => 'Failed to fetch form data'],\n Response::HTTP_INTERNAL_SERVER_ERROR\n );\n }\n }\n\n /**\n * Create a new Ask Jiminny report.\n */\n public function create(Request $request): JsonResponse\n {\n /** @var User $user */\n $user = $request->user();\n\n try {\n $data = $this->automatedReportsService->createAskJiminnyReport($request->all(), $user);\n\n return new JsonResponse($data);\n } catch (InvalidArgumentException $e) {\n return new JsonResponse(['error' => $e->getMessage()], Response::HTTP_UNPROCESSABLE_ENTITY);\n } catch (Throwable $e) {\n $this->logger->error('Failed to create Ask Jiminny report', [\n 'error' => $e->getMessage(),\n 'user_id' => $user->getId(),\n ]);\n\n return new JsonResponse(\n ['error' => 'Failed to create report'],\n Response::HTTP_INTERNAL_SERVER_ERROR\n );\n }\n }\n\n /**\n * Update an existing Ask Jiminny report.\n */\n public function update(Request $request, string $uuid): JsonResponse\n {\n \\Illuminate\\Support\\Facades\\Log::channel('custom_channel')->info(\"UPDATE\");\n /** @var User $user */\n $user = $request->user();\n\n try {\n $report = $this->automatedReportsService->getReport($uuid);\n\n if ($this->isNotOwnedByUser($report, $user)) {\n return new JsonResponse(['error' => 'Report not found'], Response::HTTP_NOT_FOUND);\n }\n\n $data = $this->automatedReportsService->updateAskJiminnyReport($report, $request->all(), $user);\n\n return new JsonResponse($data);\n } catch (ModelNotFoundException $e) {\n return new JsonResponse(['error' => $e->getMessage()], Response::HTTP_NOT_FOUND);\n } catch (InvalidArgumentException $e) {\n return new JsonResponse(['error' => $e->getMessage()], Response::HTTP_UNPROCESSABLE_ENTITY);\n } catch (Throwable $e) {\n $this->logger->error('Failed to update Ask Jiminny report', [\n 'error' => $e->getMessage(),\n 'user_id' => $user->getId(),\n 'uuid' => $uuid,\n ]);\n\n return new JsonResponse(\n ['error' => 'Failed to update report'],\n Response::HTTP_INTERNAL_SERVER_ERROR\n );\n }\n }\n\n /**\n * Toggle Ask Jiminny report status (enable/disable).\n */\n public function toggleStatus(Request $request, string $uuid): JsonResponse\n {\n /** @var User $user */\n $user = $request->user();\n\n try {\n $report = $this->automatedReportsService->getReport($uuid);\n\n if ($this->isNotOwnedByUser($report, $user)) {\n return new JsonResponse(['error' => 'Report not found'], Response::HTTP_NOT_FOUND);\n }\n\n $data = $this->automatedReportsService->updateAskJiminnyReportStatus(\n $report,\n (bool) $request->input('enabled'),\n );\n\n return new JsonResponse($data);\n } catch (ModelNotFoundException $e) {\n return new JsonResponse(['error' => $e->getMessage()], Response::HTTP_NOT_FOUND);\n } catch (Throwable $e) {\n $this->logger->error('Failed to toggle Ask Jiminny report status', [\n 'error' => $e->getMessage(),\n 'user_id' => $user->getId(),\n 'uuid' => $uuid,\n ]);\n\n return new JsonResponse(\n ['error' => 'Failed to toggle report status'],\n Response::HTTP_INTERNAL_SERVER_ERROR\n );\n }\n }\n\n /**\n * List all Ask Jiminny reports.\n */\n public function list(Request $request): JsonResponse\n {\n /** @var User $user */\n $user = $request->user();\n\n try {\n $sortColumn = $request->input('sort_column', 'created_at');\n $sortDirection = $request->input('sort_direction', 'desc');\n\n $data = $this->automatedReportsService->listAskJiminnyReports($user, $sortColumn, $sortDirection);\n\n return new JsonResponse($data);\n } catch (Throwable $e) {\n $this->logger->error('Failed to list Ask Jiminny reports', [\n 'error' => $e->getMessage(),\n 'user_id' => $user->getId(),\n ]);\n\n return new JsonResponse(\n ['error' => 'Failed to fetch reports'],\n Response::HTTP_INTERNAL_SERVER_ERROR\n );\n }\n }\n\n /**\n * Get a single Ask Jiminny report.\n */\n public function get(Request $request, string $uuid): JsonResponse\n {\n /** @var User $user */\n $user = $request->user();\n\n try {\n $report = $this->automatedReportsService->getReport($uuid);\n\n if ($this->isNotOwnedByUser($report, $user)) {\n return new JsonResponse(['error' => 'Report not found'], Response::HTTP_NOT_FOUND);\n }\n\n return new JsonResponse($this->automatedReportsService->get($uuid));\n } catch (ModelNotFoundException $e) {\n return new JsonResponse(['error' => $e->getMessage()], Response::HTTP_NOT_FOUND);\n } catch (Throwable $e) {\n $this->logger->error('Failed to get Ask Jiminny report', [\n 'error' => $e->getMessage(),\n 'user_id' => $user->getId(),\n 'uuid' => $uuid,\n ]);\n\n return new JsonResponse(\n ['error' => 'Failed to fetch report'],\n Response::HTTP_INTERNAL_SERVER_ERROR\n );\n }\n }\n\n public function getReportsCount(Request $request, string $uuid): JsonResponse\n {\n /** @var User $user */\n $user = $request->user();\n\n try {\n $report = $this->automatedReportsService->getReport($uuid);\n\n if ($this->isNotOwnedByUser($report, $user)) {\n return new JsonResponse(['error' => 'Report not found'], Response::HTTP_NOT_FOUND);\n }\n\n $resultsCount = $this->automatedReportsService->getReportResults($report)->count();\n\n return new JsonResponse(['count' => $resultsCount]);\n } catch (ModelNotFoundException $e) {\n return new JsonResponse(['error' => $e->getMessage()], Response::HTTP_NOT_FOUND);\n } catch (Throwable $e) {\n $this->logger->error('Failed to count report results', [\n 'error' => $e->getMessage(),\n 'user_id' => $user->getId(),\n 'report_uuid' => $uuid,\n ]);\n\n return new JsonResponse(\n ['error' => 'Failed to count report results'],\n Response::HTTP_INTERNAL_SERVER_ERROR\n );\n }\n }\n\n /**\n * Delete an Ask Jiminny report.\n */\n public function delete(Request $request, string $uuid): JsonResponse\n {\n /** @var User $user */\n $user = $request->user();\n\n try {\n if ($request->boolean('delete_generated_reports')) {\n $this->automatedReportsService->deleteReportResults($uuid);\n }\n\n $report = $this->automatedReportsService->getReport($uuid);\n\n if ($this->isNotOwnedByUser($report, $user)) {\n return new JsonResponse(['error' => 'Report not found'], Response::HTTP_NOT_FOUND);\n }\n\n $this->automatedReportsService->delete($uuid);\n\n return new JsonResponse(null, Response::HTTP_NO_CONTENT);\n } catch (ModelNotFoundException $e) {\n return new JsonResponse(['error' => $e->getMessage()], Response::HTTP_NOT_FOUND);\n } catch (Throwable $e) {\n $this->logger->error('Failed to delete Ask Jiminny report', [\n 'error' => $e->getMessage(),\n 'user_id' => $user->getId(),\n 'uuid' => $uuid,\n ]);\n\n return new JsonResponse(\n ['error' => 'Failed to delete report'],\n Response::HTTP_INTERNAL_SERVER_ERROR\n );\n }\n }\n\n public function getFilters(Request $request): JsonResponse\n {\n /** @var User $user */\n $user = $request->user();\n\n try {\n $filters = $this->automatedReportsService->getAskJiminnyReportFilters($user);\n\n return new JsonResponse(['filters' => $filters]);\n } catch (Throwable $e) {\n $this->logger->error('Failed to fetch Ask Jiminny report filters', [\n 'error' => $e->getMessage(),\n 'user_id' => $user->getId(),\n ]);\n\n return new JsonResponse(\n ['error' => 'Failed to fetch filters'],\n Response::HTTP_INTERNAL_SERVER_ERROR\n );\n }\n }\n}","depth":4,"value":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Http\\Controllers\\API\\V2;\n\nuse Illuminate\\Http\\JsonResponse;\nuse Illuminate\\Http\\Request;\nuse Illuminate\\Routing\\Controller;\nuse Jiminny\\Exceptions\\InvalidArgumentException;\nuse Jiminny\\Exceptions\\ModelNotFoundException;\nuse Jiminny\\Models\\AutomatedReport;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Services\\Kiosk\\AutomatedReports\\AutomatedReportsService;\nuse Psr\\Log\\LoggerInterface;\nuse Symfony\\Component\\HttpFoundation\\Response;\nuse Throwable;\n\nclass AskJiminnyReportsController extends Controller\n{\n public function __construct(\n private readonly AutomatedReportsService $automatedReportsService,\n private readonly LoggerInterface $logger,\n ) {\n }\n\n private function isNotOwnedByUser(AutomatedReport $report, User $user): bool\n {\n return $report->getTeamId() !== $user->getTeamId()\n || $report->getAttribute('created_by') !== $user->getId();\n }\n\n public function getFormData(Request $request, ?string $uuid = null): JsonResponse\n {\n /** @var User $user */\n $user = $request->user();\n\n try {\n $report = $uuid ? $this->automatedReportsService->getReport($uuid) : null;\n\n return new JsonResponse(\n $this->automatedReportsService->getAskJiminnyReportFormData($user, $report)\n );\n } catch (ModelNotFoundException $e) {\n return new JsonResponse(['error' => $e->getMessage()], Response::HTTP_NOT_FOUND);\n } catch (Throwable $e) {\n $this->logger->error('Failed to fetch Ask Jiminny report form data', [\n 'error' => $e->getMessage(),\n 'user_id' => $user->getId(),\n 'uuid' => $uuid,\n ]);\n\n return new JsonResponse(\n ['error' => 'Failed to fetch form data'],\n Response::HTTP_INTERNAL_SERVER_ERROR\n );\n }\n }\n\n /**\n * Create a new Ask Jiminny report.\n */\n public function create(Request $request): JsonResponse\n {\n /** @var User $user */\n $user = $request->user();\n\n try {\n $data = $this->automatedReportsService->createAskJiminnyReport($request->all(), $user);\n\n return new JsonResponse($data);\n } catch (InvalidArgumentException $e) {\n return new JsonResponse(['error' => $e->getMessage()], Response::HTTP_UNPROCESSABLE_ENTITY);\n } catch (Throwable $e) {\n $this->logger->error('Failed to create Ask Jiminny report', [\n 'error' => $e->getMessage(),\n 'user_id' => $user->getId(),\n ]);\n\n return new JsonResponse(\n ['error' => 'Failed to create report'],\n Response::HTTP_INTERNAL_SERVER_ERROR\n );\n }\n }\n\n /**\n * Update an existing Ask Jiminny report.\n */\n public function update(Request $request, string $uuid): JsonResponse\n {\n \\Illuminate\\Support\\Facades\\Log::channel('custom_channel')->info(\"UPDATE\");\n /** @var User $user */\n $user = $request->user();\n\n try {\n $report = $this->automatedReportsService->getReport($uuid);\n\n if ($this->isNotOwnedByUser($report, $user)) {\n return new JsonResponse(['error' => 'Report not found'], Response::HTTP_NOT_FOUND);\n }\n\n $data = $this->automatedReportsService->updateAskJiminnyReport($report, $request->all(), $user);\n\n return new JsonResponse($data);\n } catch (ModelNotFoundException $e) {\n return new JsonResponse(['error' => $e->getMessage()], Response::HTTP_NOT_FOUND);\n } catch (InvalidArgumentException $e) {\n return new JsonResponse(['error' => $e->getMessage()], Response::HTTP_UNPROCESSABLE_ENTITY);\n } catch (Throwable $e) {\n $this->logger->error('Failed to update Ask Jiminny report', [\n 'error' => $e->getMessage(),\n 'user_id' => $user->getId(),\n 'uuid' => $uuid,\n ]);\n\n return new JsonResponse(\n ['error' => 'Failed to update report'],\n Response::HTTP_INTERNAL_SERVER_ERROR\n );\n }\n }\n\n /**\n * Toggle Ask Jiminny report status (enable/disable).\n */\n public function toggleStatus(Request $request, string $uuid): JsonResponse\n {\n /** @var User $user */\n $user = $request->user();\n\n try {\n $report = $this->automatedReportsService->getReport($uuid);\n\n if ($this->isNotOwnedByUser($report, $user)) {\n return new JsonResponse(['error' => 'Report not found'], Response::HTTP_NOT_FOUND);\n }\n\n $data = $this->automatedReportsService->updateAskJiminnyReportStatus(\n $report,\n (bool) $request->input('enabled'),\n );\n\n return new JsonResponse($data);\n } catch (ModelNotFoundException $e) {\n return new JsonResponse(['error' => $e->getMessage()], Response::HTTP_NOT_FOUND);\n } catch (Throwable $e) {\n $this->logger->error('Failed to toggle Ask Jiminny report status', [\n 'error' => $e->getMessage(),\n 'user_id' => $user->getId(),\n 'uuid' => $uuid,\n ]);\n\n return new JsonResponse(\n ['error' => 'Failed to toggle report status'],\n Response::HTTP_INTERNAL_SERVER_ERROR\n );\n }\n }\n\n /**\n * List all Ask Jiminny reports.\n */\n public function list(Request $request): JsonResponse\n {\n /** @var User $user */\n $user = $request->user();\n\n try {\n $sortColumn = $request->input('sort_column', 'created_at');\n $sortDirection = $request->input('sort_direction', 'desc');\n\n $data = $this->automatedReportsService->listAskJiminnyReports($user, $sortColumn, $sortDirection);\n\n return new JsonResponse($data);\n } catch (Throwable $e) {\n $this->logger->error('Failed to list Ask Jiminny reports', [\n 'error' => $e->getMessage(),\n 'user_id' => $user->getId(),\n ]);\n\n return new JsonResponse(\n ['error' => 'Failed to fetch reports'],\n Response::HTTP_INTERNAL_SERVER_ERROR\n );\n }\n }\n\n /**\n * Get a single Ask Jiminny report.\n */\n public function get(Request $request, string $uuid): JsonResponse\n {\n /** @var User $user */\n $user = $request->user();\n\n try {\n $report = $this->automatedReportsService->getReport($uuid);\n\n if ($this->isNotOwnedByUser($report, $user)) {\n return new JsonResponse(['error' => 'Report not found'], Response::HTTP_NOT_FOUND);\n }\n\n return new JsonResponse($this->automatedReportsService->get($uuid));\n } catch (ModelNotFoundException $e) {\n return new JsonResponse(['error' => $e->getMessage()], Response::HTTP_NOT_FOUND);\n } catch (Throwable $e) {\n $this->logger->error('Failed to get Ask Jiminny report', [\n 'error' => $e->getMessage(),\n 'user_id' => $user->getId(),\n 'uuid' => $uuid,\n ]);\n\n return new JsonResponse(\n ['error' => 'Failed to fetch report'],\n Response::HTTP_INTERNAL_SERVER_ERROR\n );\n }\n }\n\n public function getReportsCount(Request $request, string $uuid): JsonResponse\n {\n /** @var User $user */\n $user = $request->user();\n\n try {\n $report = $this->automatedReportsService->getReport($uuid);\n\n if ($this->isNotOwnedByUser($report, $user)) {\n return new JsonResponse(['error' => 'Report not found'], Response::HTTP_NOT_FOUND);\n }\n\n $resultsCount = $this->automatedReportsService->getReportResults($report)->count();\n\n return new JsonResponse(['count' => $resultsCount]);\n } catch (ModelNotFoundException $e) {\n return new JsonResponse(['error' => $e->getMessage()], Response::HTTP_NOT_FOUND);\n } catch (Throwable $e) {\n $this->logger->error('Failed to count report results', [\n 'error' => $e->getMessage(),\n 'user_id' => $user->getId(),\n 'report_uuid' => $uuid,\n ]);\n\n return new JsonResponse(\n ['error' => 'Failed to count report results'],\n Response::HTTP_INTERNAL_SERVER_ERROR\n );\n }\n }\n\n /**\n * Delete an Ask Jiminny report.\n */\n public function delete(Request $request, string $uuid): JsonResponse\n {\n /** @var User $user */\n $user = $request->user();\n\n try {\n if ($request->boolean('delete_generated_reports')) {\n $this->automatedReportsService->deleteReportResults($uuid);\n }\n\n $report = $this->automatedReportsService->getReport($uuid);\n\n if ($this->isNotOwnedByUser($report, $user)) {\n return new JsonResponse(['error' => 'Report not found'], Response::HTTP_NOT_FOUND);\n }\n\n $this->automatedReportsService->delete($uuid);\n\n return new JsonResponse(null, Response::HTTP_NO_CONTENT);\n } catch (ModelNotFoundException $e) {\n return new JsonResponse(['error' => $e->getMessage()], Response::HTTP_NOT_FOUND);\n } catch (Throwable $e) {\n $this->logger->error('Failed to delete Ask Jiminny report', [\n 'error' => $e->getMessage(),\n 'user_id' => $user->getId(),\n 'uuid' => $uuid,\n ]);\n\n return new JsonResponse(\n ['error' => 'Failed to delete report'],\n Response::HTTP_INTERNAL_SERVER_ERROR\n );\n }\n }\n\n public function getFilters(Request $request): JsonResponse\n {\n /** @var User $user */\n $user = $request->user();\n\n try {\n $filters = $this->automatedReportsService->getAskJiminnyReportFilters($user);\n\n return new JsonResponse(['filters' => $filters]);\n } catch (Throwable $e) {\n $this->logger->error('Failed to fetch Ask Jiminny report filters', [\n 'error' => $e->getMessage(),\n 'user_id' => $user->getId(),\n ]);\n\n return new JsonResponse(\n ['error' => 'Failed to fetch filters'],\n Response::HTTP_INTERNAL_SERVER_ERROR\n );\n }\n }\n}","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Execute","depth":4,"bounds":{"left":0.40492022,"top":0.09896249,"width":0.008643617,"height":0.01915403},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Explain Plan","depth":4,"bounds":{"left":0.41356382,"top":0.09896249,"width":0.008643617,"height":0.01915403},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Browse Query History","depth":4,"bounds":{"left":0.4245346,"top":0.09896249,"width":0.008643617,"height":0.01915403},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"View Parameters","depth":4,"bounds":{"left":0.4331782,"top":0.09896249,"width":0.008643617,"height":0.01915403},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Open Query Execution Settings…","depth":4,"bounds":{"left":0.4418218,"top":0.09896249,"width":0.008643617,"height":0.01915403},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"In-Editor Results","depth":4,"bounds":{"left":0.45279256,"top":0.09896249,"width":0.008643617,"height":0.01915403},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Tx: Auto","depth":4,"bounds":{"left":0.4637633,"top":0.09896249,"width":0.024268618,"height":0.01915403},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Cancel Running Statements","depth":4,"bounds":{"left":0.49035904,"top":0.09896249,"width":0.008643617,"height":0.01915403},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Playground","depth":4,"bounds":{"left":0.5013298,"top":0.09896249,"width":0.029587766,"height":0.01915403},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"jiminny","depth":4,"bounds":{"left":0.69913566,"top":0.09896249,"width":0.02825798,"height":0.01915403},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.042220745,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"10","depth":4,"bounds":{"left":0.6715425,"top":0.123703115,"width":0.009640957,"height":0.015163607},"role_description":"text"},{"role":"AXStaticText","text":"12","depth":4,"bounds":{"left":0.6831782,"top":0.123703115,"width":0.009640957,"height":0.015163607},"role_description":"text"},{"role":"AXStaticText","text":"2","depth":4,"bounds":{"left":0.69481385,"top":0.123703115,"width":0.007978723,"height":0.015163607},"role_description":"text"},{"role":"AXStaticText","text":"4","depth":4,"bounds":{"left":0.70478725,"top":0.123703115,"width":0.007978723,"height":0.015163607},"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.7144282,"top":0.12210695,"width":0.00731383,"height":0.018355945},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"bounds":{"left":0.72174203,"top":0.12210695,"width":0.006981383,"height":0.018355945},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"SELECT a.id, a.uuid, a.actual_start_time, o.id, o.uuid FROM opportunities o\nJOIN activities a ON o.id = a.opportunity_id\nWHERE a.crm_configuration_id = 39\nAND a.actual_start_time > '2025-10-13'\nAND a.type IN ('conference', 'softphone-inbound', 'softphone-outbound')\n;\n\nSELECT * FROM activities\nWHERE crm_configuration_id = 39 and user_id = 143\nand actual_start_time >= '2025-10-13'\nAND type IN ('conference', 'softphone-inbound', 'softphone-outbound')\n;\n\nSELECT * FROM opportunities WHERE account_id IN (178);\nselect * from activities where id IN (620137, 620187, 620188, 620189, 620230);\n\n# HS\nSELECT * FROM opportunities WHERE id IN (238);\nselect * from activities where id IN (477,2076);\n\nselect * from users;\n\nSELECT COUNT(*) FROM users;\nSELECT COUNT(*) FROM activities;\nSELECT COUNT(*) FROM opportunities;\n\nUPDATE activities\nSET\n actual_start_time = '2025-12-19 09:00:00',\n actual_end_time = '2025-12-19 10:30:00',\n scheduled_start_time = '2025-12-19 09:00:00',\n scheduled_end_time = '2025-12-19 10:30:00'\nWHERE id IN (407509,407375);\n\nselect * from partners;\n\nSELECT id, uuid, type, actual_start_time, user_id, crm_configuration_id\nFROM activities\nWHERE user_id = 143\nAND actual_start_time >= '2025-10-13 00:00:00'\nAND actual_start_time <= '2026-01-13 23:59:59'\nORDER BY actual_start_time DESC;\n\nSELECT * FROM activities WHERE uuid_to_bin('78eda160-3086-435f-88a5-bb0c71b6008d') = uuid;\nSELECT * FROM crm_layouts where crm_configuration_id = 39;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 282;\n# lead_id\n# account_id 177\n# contact_id 3969\n# opportunity_id\n# stage_id 203\n\nSELECT * FROM opportunities WHERE opportunities.crm_configuration_id = id = 282;\n\nSELECT * FROM activities where crm_configuration_id = 39 AND type = 'conference'\nAND user_id = 143 and actual_start_time >= '2025-10-13';\n\nSELECT * FROM activities a\n# JOIN opportunities o ON a.opportunity_id = o.id\nWHERE a.crm_configuration_id = 39 AND a.type = 'conference'\nand status = 'completed' and recording_state = 'recorded'\nand a.actual_start_time >= '2025-10-13'\nAND a.user_id = 143\n;\n\nselect * from leads\nwhere crm_configuration_id = 39; # 112 -> ac. 178, 109 => op. 1707\n\nSELECT * FROM activities WHERE id IN (356013,616188,616202,616310,407509,407375,356001,356008);\nSELECT * FROM activities WHERE id IN (356013,616188,616202,616310);\nSELECT * FROM activities WHERE id IN (407509,407375); # leads: 112, 109 | status - 198\nSELECT * FROM activities WHERE id IN (356001, 356008); # contacts:\n\nSELECT * FROM opportunities WHERE id IN (1707);\nSELECT * FROM stages where id IN (204, 198);\nSELECT * FROM opportunities WHERE account_id IN (178);\nSELECT * FROM opportunities WHERE crm_configuration_id = 39 AND created_at > '2025-01-01';\nSELECT * FROM contacts WHERE account_id IN (178); # 4118 Musaibe, 4448 Ceco Personal\n\nSELECT * FROM activities where crm_configuration_id = 39\nAND opportunity_id IS NULL\nAND is_internal = false\nand status = 'completed' and recording_state = 'recorded'\nAND actual_start_time >= '2025-10-13'\nAND (lead_id IS NOT NULL OR contact_id IS NOT NULL OR account_id IS NOT NULL)\n# AND lead_id IN (112, 109)\n;\n\nSELECT * FROM crm_profiles WHERE user_id = 143;\n\nselect * from inboxes; # 212\nselect * from users where id = 143; # 143\nselect * from inbox_email_batches where inbox_id = 212\nand updated_at >= '2026-01-28 00:00:00' order by id desc;\nselect * from inbox_emails where inbox_id = 212\nand batch_id = 95885 order by id desc;\nselect * from email_messages where origin_user_id = 143;\nselect * from activities where user_id = 143 and updated_at >= '2026-01-28 00:00:00';\nselect * from participants where activity_id = 620247;\n\nselect * from crm_profiles where user_id = 143;\n\nSELECT * FROM activities WHERE uuid_to_bin('458cf915-b914-4000-b083-5687b32b2956') = uuid; # 356001\nselect * from transcription where activity_id = 356001; # 6943\nselect * from ai_prompts where transcription_id = 6943;\nSELECT * FROM activity_summary_logs where activity_id = 356001;\n\nSELECT * FROM social_accounts WHERE sociable_id = 143;\n\n# ************************************************************************************\nSELECT * FROM activities WHERE uuid_to_bin('0164a4fb-cb95-454e-9edd-4d804e4999bd') = uuid;\n# 422515 softphone tr. 8100\n\nSELECT * FROM activities WHERE uuid_to_bin('7520add8-8d87-41a5-98e5-fc4edf96f21e') = uuid;\n# 407509 conference tr. 7670 crmId: 00UD1000002J9aTMAS\n\nselect * from ai_prompts where transcription_id IN (8100, 7670);\nselect * from activity_summary_logs where activity_id = 407509;\n\nselect * from sidekick_settings;\nselect * from default_activity_types;\n\nSELECT * FROM contacts WHERE crm_configuration_id = 39 and email = 'm.kogoj@gmx.at';\nSELECT * FROM leads WHERE crm_configuration_id = 39 and email = 'm.kogoj@gmx.at';\n\nSELECT * FROM activity_searches where user_id = 143;\nSELECT * FROM groups where team_id = 1;\n\nselect * from teams where id = 1;\nselect * from groups where team_id = 1; # 1150 - 7e75f8025c22\nselect id, name, group_id, status, deleted_at, email\nfrom users where team_id = 1 order by group_id desc ;\n\nselect * from activity_searches where id in (1977, 1978, 1979);\nselect * from activity_search_filters where activity_search_id IN (1977, 1978, 1979);\nselect * from activity_search_filters where filter = 'group_id' and value = '443f26b8-8512-437e-a9f9-7e75f8025c22'; # 10268, 10272, 10277\nselect * from nudges where activity_search_id IN (1977, 1978, 1979); # 877, 878, 879\n\nINSERT INTO `activity_search_filters`\n(`activity_search_id`, `filter`, `value`) VALUES\n(1977, 'group_id', '443f26b8-8512-437e-a9f9-7e75f8025c22'),\n(1978, 'group_id', '443f26b8-8512-437e-a9f9-7e75f8025c22'),\n(1979, 'group_id', '443f26b8-8512-437e-a9f9-7e75f8025c22')\n;\n\nselect * from crm_configurations where id = 39;\n\nselect * from teams where id = 1;\nselect * from team_features where team_id = 1;\nselect * from features;\n\nSELECT * FROM activity_searches where id = 1982; # 1981\nSELECT * FROM activity_search_filters WHERE activity_search_id = 1982;\n\nSELECT * FROM automated_reports where id = 68;\nSELECT * FROM automated_report_results where id = 275;\n\nSELECT * FROM automated_reports order by id desc;\nSELECT * FROM automated_report_results order by id desc;\nselect * from activity_searches where user_id = 143;\nselect * from ask_anything_prompts;\n\nSELECT * FROM groups WHERE id = 1439;\nSELECT * FROM users WHERE group_id = 1439;\n\nselect * from permissions; # 158\nselect * from roles;\nselect * from permission_role\n\nselect * from teams where id = 1;\nselect * from groups g JOIN playbooks p on g.playbook_id = p.id where g.team_id = 1;\nselect * from groups where id = 28;\nselect * from playbooks where team_id = 1;\nselect * from playbooks where id = 179;\nselect * from playbook_categories where id = 1391;\nselect * from users where id = 143;\nselect * from crm_profiles where user_id = 143;\nselect * from activities where crm_configuration_id = 39 and type = 'conference'\nand crm_provider_id IS NOT NULL ORDER by id desc;\nselect * from activities where id = 422003; # 00UO400000pB6fpMAC\n\nSELECT ar.id, ar.uuid, ar.media_type, ar.status, a.type\nFROM automated_report_results ar\nJOIN automated_reports a ON a.id = ar.report_id\nWHERE a.type = 'ask_jiminny'\nLIMIT 10;\n\n\nselect * from teams where id = 3143;\nselect * from crm_configurations where id = 500;\nselect * from users where name = 'Integration Account'; # 1695\nSELECT * FROM social_accounts WHERE sociable_id = 1695;\n\nselect * from activities where crm_configuration_id = 39\nand recording_state = 'recorded' and duration > 60\nand status = 'completed' and actual_start_time >= '2025-12-01'\n\nSELECT * FROM activities WHERE uuid_to_bin('458cf915-b914-4000-b083-5687b32b2956') = uuid;","depth":4,"value":"SELECT a.id, a.uuid, a.actual_start_time, o.id, o.uuid FROM opportunities o\nJOIN activities a ON o.id = a.opportunity_id\nWHERE a.crm_configuration_id = 39\nAND a.actual_start_time > '2025-10-13'\nAND a.type IN ('conference', 'softphone-inbound', 'softphone-outbound')\n;\n\nSELECT * FROM activities\nWHERE crm_configuration_id = 39 and user_id = 143\nand actual_start_time >= '2025-10-13'\nAND type IN ('conference', 'softphone-inbound', 'softphone-outbound')\n;\n\nSELECT * FROM opportunities WHERE account_id IN (178);\nselect * from activities where id IN (620137, 620187, 620188, 620189, 620230);\n\n# HS\nSELECT * FROM opportunities WHERE id IN (238);\nselect * from activities where id IN (477,2076);\n\nselect * from users;\n\nSELECT COUNT(*) FROM users;\nSELECT COUNT(*) FROM activities;\nSELECT COUNT(*) FROM opportunities;\n\nUPDATE activities\nSET\n actual_start_time = '2025-12-19 09:00:00',\n actual_end_time = '2025-12-19 10:30:00',\n scheduled_start_time = '2025-12-19 09:00:00',\n scheduled_end_time = '2025-12-19 10:30:00'\nWHERE id IN (407509,407375);\n\nselect * from partners;\n\nSELECT id, uuid, type, actual_start_time, user_id, crm_configuration_id\nFROM activities\nWHERE user_id = 143\nAND actual_start_time >= '2025-10-13 00:00:00'\nAND actual_start_time <= '2026-01-13 23:59:59'\nORDER BY actual_start_time DESC;\n\nSELECT * FROM activities WHERE uuid_to_bin('78eda160-3086-435f-88a5-bb0c71b6008d') = uuid;\nSELECT * FROM crm_layouts where crm_configuration_id = 39;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 282;\n# lead_id\n# account_id 177\n# contact_id 3969\n# opportunity_id\n# stage_id 203\n\nSELECT * FROM opportunities WHERE opportunities.crm_configuration_id = id = 282;\n\nSELECT * FROM activities where crm_configuration_id = 39 AND type = 'conference'\nAND user_id = 143 and actual_start_time >= '2025-10-13';\n\nSELECT * FROM activities a\n# JOIN opportunities o ON a.opportunity_id = o.id\nWHERE a.crm_configuration_id = 39 AND a.type = 'conference'\nand status = 'completed' and recording_state = 'recorded'\nand a.actual_start_time >= '2025-10-13'\nAND a.user_id = 143\n;\n\nselect * from leads\nwhere crm_configuration_id = 39; # 112 -> ac. 178, 109 => op. 1707\n\nSELECT * FROM activities WHERE id IN (356013,616188,616202,616310,407509,407375,356001,356008);\nSELECT * FROM activities WHERE id IN (356013,616188,616202,616310);\nSELECT * FROM activities WHERE id IN (407509,407375); # leads: 112, 109 | status - 198\nSELECT * FROM activities WHERE id IN (356001, 356008); # contacts:\n\nSELECT * FROM opportunities WHERE id IN (1707);\nSELECT * FROM stages where id IN (204, 198);\nSELECT * FROM opportunities WHERE account_id IN (178);\nSELECT * FROM opportunities WHERE crm_configuration_id = 39 AND created_at > '2025-01-01';\nSELECT * FROM contacts WHERE account_id IN (178); # 4118 Musaibe, 4448 Ceco Personal\n\nSELECT * FROM activities where crm_configuration_id = 39\nAND opportunity_id IS NULL\nAND is_internal = false\nand status = 'completed' and recording_state = 'recorded'\nAND actual_start_time >= '2025-10-13'\nAND (lead_id IS NOT NULL OR contact_id IS NOT NULL OR account_id IS NOT NULL)\n# AND lead_id IN (112, 109)\n;\n\nSELECT * FROM crm_profiles WHERE user_id = 143;\n\nselect * from inboxes; # 212\nselect * from users where id = 143; # 143\nselect * from inbox_email_batches where inbox_id = 212\nand updated_at >= '2026-01-28 00:00:00' order by id desc;\nselect * from inbox_emails where inbox_id = 212\nand batch_id = 95885 order by id desc;\nselect * from email_messages where origin_user_id = 143;\nselect * from activities where user_id = 143 and updated_at >= '2026-01-28 00:00:00';\nselect * from participants where activity_id = 620247;\n\nselect * from crm_profiles where user_id = 143;\n\nSELECT * FROM activities WHERE uuid_to_bin('458cf915-b914-4000-b083-5687b32b2956') = uuid; # 356001\nselect * from transcription where activity_id = 356001; # 6943\nselect * from ai_prompts where transcription_id = 6943;\nSELECT * FROM activity_summary_logs where activity_id = 356001;\n\nSELECT * FROM social_accounts WHERE sociable_id = 143;\n\n# ************************************************************************************\nSELECT * FROM activities WHERE uuid_to_bin('0164a4fb-cb95-454e-9edd-4d804e4999bd') = uuid;\n# 422515 softphone tr. 8100\n\nSELECT * FROM activities WHERE uuid_to_bin('7520add8-8d87-41a5-98e5-fc4edf96f21e') = uuid;\n# 407509 conference tr. 7670 crmId: 00UD1000002J9aTMAS\n\nselect * from ai_prompts where transcription_id IN (8100, 7670);\nselect * from activity_summary_logs where activity_id = 407509;\n\nselect * from sidekick_settings;\nselect * from default_activity_types;\n\nSELECT * FROM contacts WHERE crm_configuration_id = 39 and email = 'm.kogoj@gmx.at';\nSELECT * FROM leads WHERE crm_configuration_id = 39 and email = 'm.kogoj@gmx.at';\n\nSELECT * FROM activity_searches where user_id = 143;\nSELECT * FROM groups where team_id = 1;\n\nselect * from teams where id = 1;\nselect * from groups where team_id = 1; # 1150 - 7e75f8025c22\nselect id, name, group_id, status, deleted_at, email\nfrom users where team_id = 1 order by group_id desc ;\n\nselect * from activity_searches where id in (1977, 1978, 1979);\nselect * from activity_search_filters where activity_search_id IN (1977, 1978, 1979);\nselect * from activity_search_filters where filter = 'group_id' and value = '443f26b8-8512-437e-a9f9-7e75f8025c22'; # 10268, 10272, 10277\nselect * from nudges where activity_search_id IN (1977, 1978, 1979); # 877, 878, 879\n\nINSERT INTO `activity_search_filters`\n(`activity_search_id`, `filter`, `value`) VALUES\n(1977, 'group_id', '443f26b8-8512-437e-a9f9-7e75f8025c22'),\n(1978, 'group_id', '443f26b8-8512-437e-a9f9-7e75f8025c22'),\n(1979, 'group_id', '443f26b8-8512-437e-a9f9-7e75f8025c22')\n;\n\nselect * from crm_configurations where id = 39;\n\nselect * from teams where id = 1;\nselect * from team_features where team_id = 1;\nselect * from features;\n\nSELECT * FROM activity_searches where id = 1982; # 1981\nSELECT * FROM activity_search_filters WHERE activity_search_id = 1982;\n\nSELECT * FROM automated_reports where id = 68;\nSELECT * FROM automated_report_results where id = 275;\n\nSELECT * FROM automated_reports order by id desc;\nSELECT * FROM automated_report_results order by id desc;\nselect * from activity_searches where user_id = 143;\nselect * from ask_anything_prompts;\n\nSELECT * FROM groups WHERE id = 1439;\nSELECT * FROM users WHERE group_id = 1439;\n\nselect * from permissions; # 158\nselect * from roles;\nselect * from permission_role\n\nselect * from teams where id = 1;\nselect * from groups g JOIN playbooks p on g.playbook_id = p.id where g.team_id = 1;\nselect * from groups where id = 28;\nselect * from playbooks where team_id = 1;\nselect * from playbooks where id = 179;\nselect * from playbook_categories where id = 1391;\nselect * from users where id = 143;\nselect * from crm_profiles where user_id = 143;\nselect * from activities where crm_configuration_id = 39 and type = 'conference'\nand crm_provider_id IS NOT NULL ORDER by id desc;\nselect * from activities where id = 422003; # 00UO400000pB6fpMAC\n\nSELECT ar.id, ar.uuid, ar.media_type, ar.status, a.type\nFROM automated_report_results ar\nJOIN automated_reports a ON a.id = ar.report_id\nWHERE a.type = 'ask_jiminny'\nLIMIT 10;\n\n\nselect * from teams where id = 3143;\nselect * from crm_configurations where id = 500;\nselect * from users where name = 'Integration Account'; # 1695\nSELECT * FROM social_accounts WHERE sociable_id = 1695;\n\nselect * from activities where crm_configuration_id = 39\nand recording_state = 'recorded' and duration > 60\nand status = 'completed' and actual_start_time >= '2025-12-01'\n\nSELECT * FROM activities WHERE uuid_to_bin('458cf915-b914-4000-b083-5687b32b2956') = uuid;","role_description":"text entry area","is_enabled":true,"is_focused":true,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Project","depth":3,"role_description":"text"},{"role":"AXButton","text":"Project","depth":3,"bounds":{"left":0.011968086,"top":0.047885075,"width":0.024268618,"height":0.024740623},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"New File or Directory…","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Expand Selected","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Collapse All","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Options","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
-7301178313361766127
|
-7003273557753482683
|
click
|
accessibility
|
NULL
|
Project: faVsco.js, menu
#11894 on JY-18909-automa Project: faVsco.js, menu
#11894 on JY-18909-automated-reports-ask-jiminny, menu
Start Listening for PHP Debug Connections
AskJiminnyReportActivityServiceTest
Run 'AskJiminnyReportActivityServiceTest'
Debug 'AskJiminnyReportActivityServiceTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
1
9
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Http\Controllers\API\V2;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
use Jiminny\Exceptions\InvalidArgumentException;
use Jiminny\Exceptions\ModelNotFoundException;
use Jiminny\Models\AutomatedReport;
use Jiminny\Models\User;
use Jiminny\Services\Kiosk\AutomatedReports\AutomatedReportsService;
use Psr\Log\LoggerInterface;
use Symfony\Component\HttpFoundation\Response;
use Throwable;
class AskJiminnyReportsController extends Controller
{
public function __construct(
private readonly AutomatedReportsService $automatedReportsService,
private readonly LoggerInterface $logger,
) {
}
private function isNotOwnedByUser(AutomatedReport $report, User $user): bool
{
return $report->getTeamId() !== $user->getTeamId()
|| $report->getAttribute('created_by') !== $user->getId();
}
public function getFormData(Request $request, ?string $uuid = null): JsonResponse
{
/** @var User $user */
$user = $request->user();
try {
$report = $uuid ? $this->automatedReportsService->getReport($uuid) : null;
return new JsonResponse(
$this->automatedReportsService->getAskJiminnyReportFormData($user, $report)
);
} catch (ModelNotFoundException $e) {
return new JsonResponse(['error' => $e->getMessage()], Response::HTTP_NOT_FOUND);
} catch (Throwable $e) {
$this->logger->error('Failed to fetch Ask Jiminny report form data', [
'error' => $e->getMessage(),
'user_id' => $user->getId(),
'uuid' => $uuid,
]);
return new JsonResponse(
['error' => 'Failed to fetch form data'],
Response::HTTP_INTERNAL_SERVER_ERROR
);
}
}
/**
* Create a new Ask Jiminny report.
*/
public function create(Request $request): JsonResponse
{
/** @var User $user */
$user = $request->user();
try {
$data = $this->automatedReportsService->createAskJiminnyReport($request->all(), $user);
return new JsonResponse($data);
} catch (InvalidArgumentException $e) {
return new JsonResponse(['error' => $e->getMessage()], Response::HTTP_UNPROCESSABLE_ENTITY);
} catch (Throwable $e) {
$this->logger->error('Failed to create Ask Jiminny report', [
'error' => $e->getMessage(),
'user_id' => $user->getId(),
]);
return new JsonResponse(
['error' => 'Failed to create report'],
Response::HTTP_INTERNAL_SERVER_ERROR
);
}
}
/**
* Update an existing Ask Jiminny report.
*/
public function update(Request $request, string $uuid): JsonResponse
{
\Illuminate\Support\Facades\Log::channel('custom_channel')->info("UPDATE");
/** @var User $user */
$user = $request->user();
try {
$report = $this->automatedReportsService->getReport($uuid);
if ($this->isNotOwnedByUser($report, $user)) {
return new JsonResponse(['error' => 'Report not found'], Response::HTTP_NOT_FOUND);
}
$data = $this->automatedReportsService->updateAskJiminnyReport($report, $request->all(), $user);
return new JsonResponse($data);
} catch (ModelNotFoundException $e) {
return new JsonResponse(['error' => $e->getMessage()], Response::HTTP_NOT_FOUND);
} catch (InvalidArgumentException $e) {
return new JsonResponse(['error' => $e->getMessage()], Response::HTTP_UNPROCESSABLE_ENTITY);
} catch (Throwable $e) {
$this->logger->error('Failed to update Ask Jiminny report', [
'error' => $e->getMessage(),
'user_id' => $user->getId(),
'uuid' => $uuid,
]);
return new JsonResponse(
['error' => 'Failed to update report'],
Response::HTTP_INTERNAL_SERVER_ERROR
);
}
}
/**
* Toggle Ask Jiminny report status (enable/disable).
*/
public function toggleStatus(Request $request, string $uuid): JsonResponse
{
/** @var User $user */
$user = $request->user();
try {
$report = $this->automatedReportsService->getReport($uuid);
if ($this->isNotOwnedByUser($report, $user)) {
return new JsonResponse(['error' => 'Report not found'], Response::HTTP_NOT_FOUND);
}
$data = $this->automatedReportsService->updateAskJiminnyReportStatus(
$report,
(bool) $request->input('enabled'),
);
return new JsonResponse($data);
} catch (ModelNotFoundException $e) {
return new JsonResponse(['error' => $e->getMessage()], Response::HTTP_NOT_FOUND);
} catch (Throwable $e) {
$this->logger->error('Failed to toggle Ask Jiminny report status', [
'error' => $e->getMessage(),
'user_id' => $user->getId(),
'uuid' => $uuid,
]);
return new JsonResponse(
['error' => 'Failed to toggle report status'],
Response::HTTP_INTERNAL_SERVER_ERROR
);
}
}
/**
* List all Ask Jiminny reports.
*/
public function list(Request $request): JsonResponse
{
/** @var User $user */
$user = $request->user();
try {
$sortColumn = $request->input('sort_column', 'created_at');
$sortDirection = $request->input('sort_direction', 'desc');
$data = $this->automatedReportsService->listAskJiminnyReports($user, $sortColumn, $sortDirection);
return new JsonResponse($data);
} catch (Throwable $e) {
$this->logger->error('Failed to list Ask Jiminny reports', [
'error' => $e->getMessage(),
'user_id' => $user->getId(),
]);
return new JsonResponse(
['error' => 'Failed to fetch reports'],
Response::HTTP_INTERNAL_SERVER_ERROR
);
}
}
/**
* Get a single Ask Jiminny report.
*/
public function get(Request $request, string $uuid): JsonResponse
{
/** @var User $user */
$user = $request->user();
try {
$report = $this->automatedReportsService->getReport($uuid);
if ($this->isNotOwnedByUser($report, $user)) {
return new JsonResponse(['error' => 'Report not found'], Response::HTTP_NOT_FOUND);
}
return new JsonResponse($this->automatedReportsService->get($uuid));
} catch (ModelNotFoundException $e) {
return new JsonResponse(['error' => $e->getMessage()], Response::HTTP_NOT_FOUND);
} catch (Throwable $e) {
$this->logger->error('Failed to get Ask Jiminny report', [
'error' => $e->getMessage(),
'user_id' => $user->getId(),
'uuid' => $uuid,
]);
return new JsonResponse(
['error' => 'Failed to fetch report'],
Response::HTTP_INTERNAL_SERVER_ERROR
);
}
}
public function getReportsCount(Request $request, string $uuid): JsonResponse
{
/** @var User $user */
$user = $request->user();
try {
$report = $this->automatedReportsService->getReport($uuid);
if ($this->isNotOwnedByUser($report, $user)) {
return new JsonResponse(['error' => 'Report not found'], Response::HTTP_NOT_FOUND);
}
$resultsCount = $this->automatedReportsService->getReportResults($report)->count();
return new JsonResponse(['count' => $resultsCount]);
} catch (ModelNotFoundException $e) {
return new JsonResponse(['error' => $e->getMessage()], Response::HTTP_NOT_FOUND);
} catch (Throwable $e) {
$this->logger->error('Failed to count report results', [
'error' => $e->getMessage(),
'user_id' => $user->getId(),
'report_uuid' => $uuid,
]);
return new JsonResponse(
['error' => 'Failed to count report results'],
Response::HTTP_INTERNAL_SERVER_ERROR
);
}
}
/**
* Delete an Ask Jiminny report.
*/
public function delete(Request $request, string $uuid): JsonResponse
{
/** @var User $user */
$user = $request->user();
try {
if ($request->boolean('delete_generated_reports')) {
$this->automatedReportsService->deleteReportResults($uuid);
}
$report = $this->automatedReportsService->getReport($uuid);
if ($this->isNotOwnedByUser($report, $user)) {
return new JsonResponse(['error' => 'Report not found'], Response::HTTP_NOT_FOUND);
}
$this->automatedReportsService->delete($uuid);
return new JsonResponse(null, Response::HTTP_NO_CONTENT);
} catch (ModelNotFoundException $e) {
return new JsonResponse(['error' => $e->getMessage()], Response::HTTP_NOT_FOUND);
} catch (Throwable $e) {
$this->logger->error('Failed to delete Ask Jiminny report', [
'error' => $e->getMessage(),
'user_id' => $user->getId(),
'uuid' => $uuid,
]);
return new JsonResponse(
['error' => 'Failed to delete report'],
Response::HTTP_INTERNAL_SERVER_ERROR
);
}
}
public function getFilters(Request $request): JsonResponse
{
/** @var User $user */
$user = $request->user();
try {
$filters = $this->automatedReportsService->getAskJiminnyReportFilters($user);
return new JsonResponse(['filters' => $filters]);
} catch (Throwable $e) {
$this->logger->error('Failed to fetch Ask Jiminny report filters', [
'error' => $e->getMessage(),
'user_id' => $user->getId(),
]);
return new JsonResponse(
['error' => 'Failed to fetch filters'],
Response::HTTP_INTERNAL_SERVER_ERROR
);
}
}
}
Execute
Explain Plan
Browse Query History
View Parameters
Open Query Execution Settings…
In-Editor Results
Tx: Auto
Cancel Running Statements
Playground
jiminny
Code changed:
Hide
Sync Changes
Hide This Notification
10
12
2
4
Previous Highlighted Error
Next Highlighted Error
SELECT a.id, a.uuid, a.actual_start_time, o.id, o.uuid FROM opportunities o
JOIN activities a ON o.id = a.opportunity_id
WHERE a.crm_configuration_id = 39
AND a.actual_start_time > '2025-10-13'
AND a.type IN ('conference', 'softphone-inbound', 'softphone-outbound')
;
SELECT * FROM activities
WHERE crm_configuration_id = 39 and user_id = 143
and actual_start_time >= '2025-10-13'
AND type IN ('conference', 'softphone-inbound', 'softphone-outbound')
;
SELECT * FROM opportunities WHERE account_id IN (178);
select * from activities where id IN (620137, 620187, 620188, 620189, 620230);
# HS
SELECT * FROM opportunities WHERE id IN (238);
select * from activities where id IN (477,2076);
select * from users;
SELECT COUNT(*) FROM users;
SELECT COUNT(*) FROM activities;
SELECT COUNT(*) FROM opportunities;
UPDATE activities
SET
actual_start_time = '2025-12-19 09:00:00',
actual_end_time = '2025-12-19 10:30:00',
scheduled_start_time = '2025-12-19 09:00:00',
scheduled_end_time = '2025-12-19 10:30:00'
WHERE id IN (407509,407375);
select * from partners;
SELECT id, uuid, type, actual_start_time, user_id, crm_configuration_id
FROM activities
WHERE user_id = 143
AND actual_start_time >= '2025-10-13 00:00:00'
AND actual_start_time <= '2026-01-13 23:59:59'
ORDER BY actual_start_time DESC;
SELECT * FROM activities WHERE uuid_to_bin('78eda160-3086-435f-88a5-bb0c71b6008d') = uuid;
SELECT * FROM crm_layouts where crm_configuration_id = 39;
SELECT * FROM crm_layout_entities WHERE crm_layout_id = 282;
# lead_id
# account_id 177
# contact_id 3969
# opportunity_id
# stage_id 203
SELECT * FROM opportunities WHERE opportunities.crm_configuration_id = id = 282;
SELECT * FROM activities where crm_configuration_id = 39 AND type = 'conference'
AND user_id = 143 and actual_start_time >= '2025-10-13';
SELECT * FROM activities a
# JOIN opportunities o ON a.opportunity_id = o.id
WHERE a.crm_configuration_id = 39 AND a.type = 'conference'
and status = 'completed' and recording_state = 'recorded'
and a.actual_start_time >= '2025-10-13'
AND a.user_id = 143
;
select * from leads
where crm_configuration_id = 39; # 112 -> ac. 178, 109 => op. 1707
SELECT * FROM activities WHERE id IN (356013,616188,616202,616310,407509,407375,356001,356008);
SELECT * FROM activities WHERE id IN (356013,616188,616202,616310);
SELECT * FROM activities WHERE id IN (407509,407375); # leads: 112, 109 | status - 198
SELECT * FROM activities WHERE id IN (356001, 356008); # contacts:
SELECT * FROM opportunities WHERE id IN (1707);
SELECT * FROM stages where id IN (204, 198);
SELECT * FROM opportunities WHERE account_id IN (178);
SELECT * FROM opportunities WHERE crm_configuration_id = 39 AND created_at > '2025-01-01';
SELECT * FROM contacts WHERE account_id IN (178); # 4118 Musaibe, 4448 Ceco Personal
SELECT * FROM activities where crm_configuration_id = 39
AND opportunity_id IS NULL
AND is_internal = false
and status = 'completed' and recording_state = 'recorded'
AND actual_start_time >= '2025-10-13'
AND (lead_id IS NOT NULL OR contact_id IS NOT NULL OR account_id IS NOT NULL)
# AND lead_id IN (112, 109)
;
SELECT * FROM crm_profiles WHERE user_id = 143;
select * from inboxes; # 212
select * from users where id = 143; # 143
select * from inbox_email_batches where inbox_id = 212
and updated_at >= '2026-01-28 00:00:00' order by id desc;
select * from inbox_emails where inbox_id = 212
and batch_id = 95885 order by id desc;
select * from email_messages where origin_user_id = 143;
select * from activities where user_id = 143 and updated_at >= '2026-01-28 00:00:00';
select * from participants where activity_id = 620247;
select * from crm_profiles where user_id = 143;
SELECT * FROM activities WHERE uuid_to_bin('458cf915-b914-4000-b083-5687b32b2956') = uuid; # 356001
select * from transcription where activity_id = 356001; # 6943
select * from ai_prompts where transcription_id = 6943;
SELECT * FROM activity_summary_logs where activity_id = 356001;
SELECT * FROM social_accounts WHERE sociable_id = 143;
# [PASSWORD_DOTS]
SELECT * FROM activities WHERE uuid_to_bin('0164a4fb-cb95-454e-9edd-4d804e4999bd') = uuid;
# 422515 softphone tr. 8100
SELECT * FROM activities WHERE uuid_to_bin('7520add8-8d87-41a5-98e5-fc4edf96f21e') = uuid;
# 407509 conference tr. 7670 crmId: 00UD1000002J9aTMAS
select * from ai_prompts where transcription_id IN (8100, 7670);
select * from activity_summary_logs where activity_id = 407509;
select * from sidekick_settings;
select * from default_activity_types;
SELECT * FROM contacts WHERE crm_configuration_id = 39 and email = '[EMAIL]';
SELECT * FROM leads WHERE crm_configuration_id = 39 and email = '[EMAIL]';
SELECT * FROM activity_searches where user_id = 143;
SELECT * FROM groups where team_id = 1;
select * from teams where id = 1;
select * from groups where team_id = 1; # 1150 - 7e75f8025c22
select id, name, group_id, status, deleted_at, email
from users where team_id = 1 order by group_id desc ;
select * from activity_searches where id in (1977, 1978, 1979);
select * from activity_search_filters where activity_search_id IN (1977, 1978, 1979);
select * from activity_search_filters where filter = 'group_id' and value = '443f26b8-8512-437e-a9f9-7e75f8025c22'; # 10268, 10272, 10277
select * from nudges where activity_search_id IN (1977, 1978, 1979); # 877, 878, 879
INSERT INTO `activity_search_filters`
(`activity_search_id`, `filter`, `value`) VALUES
(1977, 'group_id', '443f26b8-8512-437e-a9f9-7e75f8025c22'),
(1978, 'group_id', '443f26b8-8512-437e-a9f9-7e75f8025c22'),
(1979, 'group_id', '443f26b8-8512-437e-a9f9-7e75f8025c22')
;
select * from crm_configurations where id = 39;
select * from teams where id = 1;
select * from team_features where team_id = 1;
select * from features;
SELECT * FROM activity_searches where id = 1982; # 1981
SELECT * FROM activity_search_filters WHERE activity_search_id = 1982;
SELECT * FROM automated_reports where id = 68;
SELECT * FROM automated_report_results where id = 275;
SELECT * FROM automated_reports order by id desc;
SELECT * FROM automated_report_results order by id desc;
select * from activity_searches where user_id = 143;
select * from ask_anything_prompts;
SELECT * FROM groups WHERE id = 1439;
SELECT * FROM users WHERE group_id = 1439;
select * from permissions; # 158
select * from roles;
select * from permission_role
select * from teams where id = 1;
select * from groups g JOIN playbooks p on g.playbook_id = p.id where g.team_id = 1;
select * from groups where id = 28;
select * from playbooks where team_id = 1;
select * from playbooks where id = 179;
select * from playbook_categories where id = 1391;
select * from users where id = 143;
select * from crm_profiles where user_id = 143;
select * from activities where crm_configuration_id = 39 and type = 'conference'
and crm_provider_id IS NOT NULL ORDER by id desc;
select * from activities where id = 422003; # 00UO400000pB6fpMAC
SELECT ar.id, ar.uuid, ar.media_type, ar.status, a.type
FROM automated_report_results ar
JOIN automated_reports a ON a.id = ar.report_id
WHERE a.type = 'ask_jiminny'
LIMIT 10;
select * from teams where id = 3143;
select * from crm_configurations where id = 500;
select * from users where name = 'Integration Account'; # 1695
SELECT * FROM social_accounts WHERE sociable_id = 1695;
select * from activities where crm_configuration_id = 39
and recording_state = 'recorded' and duration > 60
and status = 'completed' and actual_start_time >= '2025-12-01'
SELECT * FROM activities WHERE uuid_to_bin('458cf915-b914-4000-b083-5687b32b2956') = uuid;
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide...
|
NULL
|
|
55057
|
NULL
|
0
|
2026-04-20T09:32:50.937555+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-20/1776 /Users/lukas/.screenpipe/data/data/2026-04-20/1776677570937_m2.jpg...
|
iTerm2
|
APP (-zsh)
|
True
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Last login: Mon Apr 20 10:16:41 on ttys007
Poetry Last login: Mon Apr 20 10:16:41 on ttys007
Poetry could not find a pyproject.toml file in /Users/lukas/jiminny/app or its parents
Poetry could not find a pyproject.toml file in /Users/lukas/jiminny/app or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-18909-automated-reports-ask-jiminny) $ ;xd
docker exec -it docker_lamp_1 bash -c "mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini"
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-18909-automated-reports-ask-jiminny) $ co master
error: Your local changes to the following files would be overwritten by checkout:
app/Listeners/AutomatedReports/UserPilot/TrackAutomatedReportGeneratedEvent.php
tests/Unit/Listeners/AutomatedReports/UserPilot/TrackAutomatedReportGeneratedEventTest.php
Please commit your changes or stash them before you switch branches.
Aborting
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-18909-automated-reports-ask-jiminny) $ csfix
docker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff
PHP CS Fixer 3.87.1 Alexander by Fabien Potencier, Dariusz Ruminski and contributors.
PHP runtime: 8.3.30
Running analysis on 7 cores with 10 files per process.
Parallel runner is an experimental feature and may be unstable, use it at your own risk. Feedback highly appreciated!
Loaded config default from ".php-cs-fixer.dist.php".
5603/5603 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%
Fixed 0 of 5603 files in 30.988 seconds, 60.00 MB memory used
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (master) $ co JY-18909-automated-reports-ask-jiminny
M .env.local
M app/Console/Commands/JiminnyDebugCommand.php
M app/Http/Controllers/API/ActivityController.php
M app/Jobs/Team/SyncToIntercom.php
M app/Services/PlaybackService.php
M config/logging.php
M routes/web.php
Switched to branch 'JY-18909-automated-reports-ask-jiminny'
Your branch and 'origin/JY-18909-automated-reports-ask-jiminny' have diverged,
and have 1 and 1 different commits each, respectively.
(use "git pull" to merge the remote branch into yours)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-18909-automated-reports-ask-jiminny) $ git status
On branch JY-18909-automated-reports-ask-jiminny
Your branch and 'origin/JY-18909-automated-reports-ask-jiminny' have diverged,
and have 1 and 1 different commits each, respectively.
(use "git pull" to merge the remote branch into yours)
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: .env.local
modified: app/Console/Commands/JiminnyDebugCommand.php
modified: app/Http/Controllers/API/ActivityController.php
modified: app/Jobs/Team/SyncToIntercom.php
modified: app/Services/PlaybackService.php
modified: config/logging.php
modified: routes/web.php
Untracked files:
(use "git add <file>..." to include in what will be committed)
.env.nikilocal
.env.other
WEBHOOK_FILTERING_IMPLEMENTATION.md
app/Console/Commands/Crm/Hubspot/SimulateWebhooksCommand.php
app/Console/Commands/Reports/CreateMockAskJiminnyReportResultCommand.php
ids.txt
raw_sql_query.sql
tests/Unit/Policies/CanAccessAiReportsTest.php
no changes added to commit (use "git add" and/or "git commit -a")
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-18909-automated-reports-ask-jiminny) $ git pull
Merge made by the 'ort' strategy.
app/Jobs/AutomatedReports/RequestGenerateAskJiminnyReportJob.php | 2 +-
app/Repositories/AutomatedReportsRepository.php | 9 +++++++++
app/Services/Kiosk/AutomatedReports/AutomatedReportsService.php | 13 +++++++++++++
tests/Unit/Jobs/AutomatedReports/RequestGenerateAskJiminnyReportJobTest.php | 26 +++++++++++++-------------
4 files changed, 36 insertions(+), 14 deletions(-)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-18909-automated-reports-ask-jiminny) $ git status
On branch JY-18909-automated-reports-ask-jiminny
Your branch is ahead of 'origin/JY-18909-automated-reports-ask-jiminny' by 2 commits.
(use "git push" to publish your local commits)
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: .env.local
modified: app/Console/Commands/JiminnyDebugCommand.php
modified: app/Http/Controllers/API/ActivityController.php
modified: app/Jobs/Team/SyncToIntercom.php
modified: app/Services/PlaybackService.php
modified: config/logging.php
modified: routes/web.php
Untracked files:
(use "git add <file>..." to include in what will be committed)
.env.nikilocal
.env.other
WEBHOOK_FILTERING_IMPLEMENTATION.md
app/Console/Commands/Crm/Hubspot/SimulateWebhooksCommand.php
app/Console/Commands/Reports/CreateMockAskJiminnyReportResultCommand.php
ids.txt
raw_sql_query.sql
tests/Unit/Policies/CanAccessAiReportsTest.php
no changes added to commit (use "git add" and/or "git commit -a")
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-18909-automated-reports-ask-jiminny) $ git push
Enumerating objects: 38, done.
Counting objects: 100% (32/32), done.
Delta compression using up to 8 threads
Compressing objects: 100% (16/16), done.
Writing objects: 100% (18/18), 1.97 KiB | 1008.00 KiB/s, done.
Total 18 (delta 12), reused 0 (delta 0), pack-reused 0
remote: Resolving deltas: 100% (12/12), completed with 9 local objects.
remote:
remote: GitHub found 22 vulnerabilities on jiminny/app's default branch (10 high, 12 moderate). To find out more, visit:
remote: [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-18909-automated-reports-ask-jiminny) $ co master
M .env.local
M app/Console/Commands/JiminnyDebugCommand.php
M app/Http/Controllers/API/ActivityController.php
M app/Jobs/Team/SyncToIntercom.php
M app/Services/PlaybackService.php
M config/logging.php
M routes/web.php
Switched to branch 'master'
Your branch is up to date with 'origin/master'.
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pull
Already up to date.
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $
DOCKER
Close Tab
DEV (docker)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
screenpipe"
Close Tab
-zsh
Close Tab
⌥⌘1
APP (-zsh)...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":"Last login: Mon Apr 20 10:16:41 on ttys007\n\nPoetry could not find a pyproject.toml file in /Users/lukas/jiminny/app or its parents\n\nPoetry could not find a pyproject.toml file in /Users/lukas/jiminny/app or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-18909-automated-reports-ask-jiminny) $ ;xd\ndocker exec -it docker_lamp_1 bash -c \"mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini\"\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\ndocker exec -it docker_lamp_1 supervisorctl restart all\njiminny-worker-processing-2:jiminny-worker-processing-2_00: stopped\njiminny-worker-processing-3:jiminny-worker-processing-3_00: stopped\njiminny-worker-processing-4:jiminny-worker-processing-4_00: stopped\njiminny-worker-processing-5:jiminny-worker-processing-5_00: stopped\njiminny-worker-processing-delayed:jiminny-worker-processing-delayed_00: stopped\nworker-analytics:worker-analytics_00: stopped\nworker-crm-update:worker-crm-update_00: stopped\nworker-download:worker-download_00: stopped\nworker-nudges:worker-nudges_00: stopped\nworker-conferences:worker-conferences_00: stopped\njiminny-worker-processing-1:jiminny-worker-processing-1_00: stopped\nworker:worker_00: stopped\nworker-audio:worker-audio_00: stopped\nworker-calendar:worker-calendar_00: stopped\nworker-crm-sync:worker-crm-sync_00: stopped\nworker-emails:worker-emails_00: stopped\nartisan-schedule:artisan-schedule_00: stopped\nworker-es-update:worker-es-update_00: stopped\nartisan-schedule:artisan-schedule_00: started\njiminny-worker-processing-1:jiminny-worker-processing-1_00: started\njiminny-worker-processing-2:jiminny-worker-processing-2_00: started\njiminny-worker-processing-3:jiminny-worker-processing-3_00: started\njiminny-worker-processing-4:jiminny-worker-processing-4_00: started\njiminny-worker-processing-5:jiminny-worker-processing-5_00: started\njiminny-worker-processing-delayed:jiminny-worker-processing-delayed_00: started\nworker:worker_00: started\nworker-analytics:worker-analytics_00: started\nworker-audio:worker-audio_00: started\nworker-calendar:worker-calendar_00: started\nworker-conferences:worker-conferences_00: started\nworker-crm-sync:worker-crm-sync_00: started\nworker-crm-update:worker-crm-update_00: started\nworker-download:worker-download_00: started\nworker-emails:worker-emails_00: started\nworker-es-update:worker-es-update_00: started\nworker-nudges:worker-nudges_00: started\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\ndocker exec -it docker_lamp_1 php -v\nPHP 8.3.30 (cli) (built: Mar 16 2026 22:32:32) (NTS)\nCopyright (c) The PHP Group\nZend Engine v4.3.30, Copyright (c) Zend Technologies\n with Zend OPcache v8.3.30, Copyright (c), by Zend Technologies\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-18909-automated-reports-ask-jiminny) $ co master\nerror: Your local changes to the following files would be overwritten by checkout:\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Listeners/AutomatedReports/UserPilot/TrackAutomatedReportGeneratedEvent.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\ttests/Unit/Listeners/AutomatedReports/UserPilot/TrackAutomatedReportGeneratedEventTest.php\nPlease commit your changes or stash them before you switch branches.\nAborting\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-18909-automated-reports-ask-jiminny) $ csfix\ndocker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff \nPHP CS Fixer 3.87.1 Alexander by Fabien Potencier, Dariusz Ruminski and contributors.\nPHP runtime: 8.3.30\nRunning analysis on 7 cores with 10 files per process.\nParallel runner is an experimental feature and may be unstable, use it at your own risk. Feedback highly appreciated!\nLoaded config default from \".php-cs-fixer.dist.php\".\n 5603/5603 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%\n\n\nFixed 0 of 5603 files in 30.988 seconds, 60.00 MB memory used\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-18909-automated-reports-ask-jiminny) $ co master\nM\u0000\u0000\u0000\u0000\u0000\u0000\t.env.local\nM\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Console/Commands/JiminnyDebugCommand.php\nM\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Http/Controllers/API/ActivityController.php\nM\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Jobs/Team/SyncToIntercom.php\nM\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Services/PlaybackService.php\nM\u0000\u0000\u0000\u0000\u0000\u0000\tconfig/logging.php\nM\u0000\u0000\u0000\u0000\u0000\u0000\troutes/web.php\nSwitched to branch 'master'\nYour branch is up to date with 'origin/master'.\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pull\nremote: Enumerating objects: 73, done.\nremote: Counting objects: 100% (73/73), done.\nremote: Compressing objects: 100% (35/35), done.\nremote: Total 73 (delta 40), reused 69 (delta 38), pack-reused 0 (from 0)\nUnpacking objects: 100% (73/73), 12.37 KiB | 218.00 KiB/s, done.\nFrom github.com:jiminny/app\n eb5bb80e5b..12ac2f1273 master -> origin/master\n da535e5554..24292b55b9 JY-18909-automated-reports-ask-jiminny -> origin/JY-18909-automated-reports-ask-jiminny\n + f6c0ec3d8b...5928f606d3 JY-20553-debug-crm-sync-delays -> origin/JY-20553-debug-crm-sync-delays (forced update)\n + 3d7234a4c4...1d10796eec JY-20701-reschedule-HubSpot-processing -> origin/JY-20701-reschedule-HubSpot-processing (forced update)\nUpdating eb5bb80e5b..12ac2f1273\nFast-forward\n composer.lock | 46 +++++++++++++++++++++++-----------------------\n 1 file changed, 23 insertions(+), 23 deletions(-)\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ co JY-18909-automated-reports-ask-jiminny\nM\u0000\u0000\u0000\u0000\u0000\u0000\t.env.local\nM\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Console/Commands/JiminnyDebugCommand.php\nM\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Http/Controllers/API/ActivityController.php\nM\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Jobs/Team/SyncToIntercom.php\nM\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Services/PlaybackService.php\nM\u0000\u0000\u0000\u0000\u0000\u0000\tconfig/logging.php\nM\u0000\u0000\u0000\u0000\u0000\u0000\troutes/web.php\nSwitched to branch 'JY-18909-automated-reports-ask-jiminny'\nYour branch and 'origin/JY-18909-automated-reports-ask-jiminny' have diverged,\nand have 1 and 1 different commits each, respectively.\n (use \"git pull\" to merge the remote branch into yours)\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-18909-automated-reports-ask-jiminny) $ git status\nOn branch JY-18909-automated-reports-ask-jiminny\nYour branch and 'origin/JY-18909-automated-reports-ask-jiminny' have diverged,\nand have 1 and 1 different commits each, respectively.\n (use \"git pull\" to merge the remote branch into yours)\n\nChanges not staged for commit:\n (use \"git add <file>...\" to update what will be committed)\n (use \"git restore <file>...\" to discard changes in working directory)\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: .env.local\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: app/Console/Commands/JiminnyDebugCommand.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: app/Http/Controllers/API/ActivityController.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: app/Jobs/Team/SyncToIntercom.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: app/Services/PlaybackService.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: config/logging.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: routes/web.php\n\nUntracked files:\n (use \"git add <file>...\" to include in what will be committed)\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t.env.nikilocal\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t.env.other\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tWEBHOOK_FILTERING_IMPLEMENTATION.md\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Console/Commands/Crm/Hubspot/SimulateWebhooksCommand.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Console/Commands/Reports/CreateMockAskJiminnyReportResultCommand.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tids.txt\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\traw_sql_query.sql\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\ttests/Unit/Policies/CanAccessAiReportsTest.php\n\nno changes added to commit (use \"git add\" and/or \"git commit -a\")\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-18909-automated-reports-ask-jiminny) $ git pull\nMerge made by the 'ort' strategy.\n app/Jobs/AutomatedReports/RequestGenerateAskJiminnyReportJob.php | 2 +-\n app/Repositories/AutomatedReportsRepository.php | 9 +++++++++\n app/Services/Kiosk/AutomatedReports/AutomatedReportsService.php | 13 +++++++++++++\n tests/Unit/Jobs/AutomatedReports/RequestGenerateAskJiminnyReportJobTest.php | 26 +++++++++++++-------------\n 4 files changed, 36 insertions(+), 14 deletions(-)\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-18909-automated-reports-ask-jiminny) $ git status\nOn branch JY-18909-automated-reports-ask-jiminny\nYour branch is ahead of 'origin/JY-18909-automated-reports-ask-jiminny' by 2 commits.\n (use \"git push\" to publish your local commits)\n\nChanges not staged for commit:\n (use \"git add <file>...\" to update what will be committed)\n (use \"git restore <file>...\" to discard changes in working directory)\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: .env.local\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: app/Console/Commands/JiminnyDebugCommand.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: app/Http/Controllers/API/ActivityController.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: app/Jobs/Team/SyncToIntercom.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: app/Services/PlaybackService.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: config/logging.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: routes/web.php\n\nUntracked files:\n (use \"git add <file>...\" to include in what will be committed)\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t.env.nikilocal\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t.env.other\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tWEBHOOK_FILTERING_IMPLEMENTATION.md\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Console/Commands/Crm/Hubspot/SimulateWebhooksCommand.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Console/Commands/Reports/CreateMockAskJiminnyReportResultCommand.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tids.txt\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\traw_sql_query.sql\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\ttests/Unit/Policies/CanAccessAiReportsTest.php\n\nno changes added to commit (use \"git add\" and/or \"git commit -a\")\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-18909-automated-reports-ask-jiminny) $ git push\nEnumerating objects: 38, done.\nCounting objects: 100% (32/32), done.\nDelta compression using up to 8 threads\nCompressing objects: 100% (16/16), done.\nWriting objects: 100% (18/18), 1.97 KiB | 1008.00 KiB/s, done.\nTotal 18 (delta 12), reused 0 (delta 0), pack-reused 0\nremote: Resolving deltas: 100% (12/12), completed with 9 local objects.\nremote: \nremote: GitHub found 22 vulnerabilities on jiminny/app's default branch (10 high, 12 moderate). To find out more, visit:\nremote: https://github.com/jiminny/app/security/dependabot\nremote: \nTo github.com:jiminny/app.git\n 24292b55b9..a72e71cc23 JY-18909-automated-reports-ask-jiminny -> JY-18909-automated-reports-ask-jiminny\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-18909-automated-reports-ask-jiminny) $ co master\nM\u0000\u0000\u0000\u0000\u0000\u0000\t.env.local\nM\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Console/Commands/JiminnyDebugCommand.php\nM\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Http/Controllers/API/ActivityController.php\nM\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Jobs/Team/SyncToIntercom.php\nM\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Services/PlaybackService.php\nM\u0000\u0000\u0000\u0000\u0000\u0000\tconfig/logging.php\nM\u0000\u0000\u0000\u0000\u0000\u0000\troutes/web.php\nSwitched to branch 'master'\nYour branch is up to date with 'origin/master'.\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pull\nAlready up to date.\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $","depth":4,"value":"Last login: Mon Apr 20 10:16:41 on ttys007\n\nPoetry could not find a pyproject.toml file in /Users/lukas/jiminny/app or its parents\n\nPoetry could not find a pyproject.toml file in /Users/lukas/jiminny/app or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-18909-automated-reports-ask-jiminny) $ ;xd\ndocker exec -it docker_lamp_1 bash -c \"mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini\"\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\ndocker exec -it docker_lamp_1 supervisorctl restart all\njiminny-worker-processing-2:jiminny-worker-processing-2_00: stopped\njiminny-worker-processing-3:jiminny-worker-processing-3_00: stopped\njiminny-worker-processing-4:jiminny-worker-processing-4_00: stopped\njiminny-worker-processing-5:jiminny-worker-processing-5_00: stopped\njiminny-worker-processing-delayed:jiminny-worker-processing-delayed_00: stopped\nworker-analytics:worker-analytics_00: stopped\nworker-crm-update:worker-crm-update_00: stopped\nworker-download:worker-download_00: stopped\nworker-nudges:worker-nudges_00: stopped\nworker-conferences:worker-conferences_00: stopped\njiminny-worker-processing-1:jiminny-worker-processing-1_00: stopped\nworker:worker_00: stopped\nworker-audio:worker-audio_00: stopped\nworker-calendar:worker-calendar_00: stopped\nworker-crm-sync:worker-crm-sync_00: stopped\nworker-emails:worker-emails_00: stopped\nartisan-schedule:artisan-schedule_00: stopped\nworker-es-update:worker-es-update_00: stopped\nartisan-schedule:artisan-schedule_00: started\njiminny-worker-processing-1:jiminny-worker-processing-1_00: started\njiminny-worker-processing-2:jiminny-worker-processing-2_00: started\njiminny-worker-processing-3:jiminny-worker-processing-3_00: started\njiminny-worker-processing-4:jiminny-worker-processing-4_00: started\njiminny-worker-processing-5:jiminny-worker-processing-5_00: started\njiminny-worker-processing-delayed:jiminny-worker-processing-delayed_00: started\nworker:worker_00: started\nworker-analytics:worker-analytics_00: started\nworker-audio:worker-audio_00: started\nworker-calendar:worker-calendar_00: started\nworker-conferences:worker-conferences_00: started\nworker-crm-sync:worker-crm-sync_00: started\nworker-crm-update:worker-crm-update_00: started\nworker-download:worker-download_00: started\nworker-emails:worker-emails_00: started\nworker-es-update:worker-es-update_00: started\nworker-nudges:worker-nudges_00: started\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\ndocker exec -it docker_lamp_1 php -v\nPHP 8.3.30 (cli) (built: Mar 16 2026 22:32:32) (NTS)\nCopyright (c) The PHP Group\nZend Engine v4.3.30, Copyright (c) Zend Technologies\n with Zend OPcache v8.3.30, Copyright (c), by Zend Technologies\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-18909-automated-reports-ask-jiminny) $ co master\nerror: Your local changes to the following files would be overwritten by checkout:\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Listeners/AutomatedReports/UserPilot/TrackAutomatedReportGeneratedEvent.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\ttests/Unit/Listeners/AutomatedReports/UserPilot/TrackAutomatedReportGeneratedEventTest.php\nPlease commit your changes or stash them before you switch branches.\nAborting\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-18909-automated-reports-ask-jiminny) $ csfix\ndocker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff \nPHP CS Fixer 3.87.1 Alexander by Fabien Potencier, Dariusz Ruminski and contributors.\nPHP runtime: 8.3.30\nRunning analysis on 7 cores with 10 files per process.\nParallel runner is an experimental feature and may be unstable, use it at your own risk. Feedback highly appreciated!\nLoaded config default from \".php-cs-fixer.dist.php\".\n 5603/5603 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%\n\n\nFixed 0 of 5603 files in 30.988 seconds, 60.00 MB memory used\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-18909-automated-reports-ask-jiminny) $ co master\nM\u0000\u0000\u0000\u0000\u0000\u0000\t.env.local\nM\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Console/Commands/JiminnyDebugCommand.php\nM\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Http/Controllers/API/ActivityController.php\nM\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Jobs/Team/SyncToIntercom.php\nM\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Services/PlaybackService.php\nM\u0000\u0000\u0000\u0000\u0000\u0000\tconfig/logging.php\nM\u0000\u0000\u0000\u0000\u0000\u0000\troutes/web.php\nSwitched to branch 'master'\nYour branch is up to date with 'origin/master'.\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pull\nremote: Enumerating objects: 73, done.\nremote: Counting objects: 100% (73/73), done.\nremote: Compressing objects: 100% (35/35), done.\nremote: Total 73 (delta 40), reused 69 (delta 38), pack-reused 0 (from 0)\nUnpacking objects: 100% (73/73), 12.37 KiB | 218.00 KiB/s, done.\nFrom github.com:jiminny/app\n eb5bb80e5b..12ac2f1273 master -> origin/master\n da535e5554..24292b55b9 JY-18909-automated-reports-ask-jiminny -> origin/JY-18909-automated-reports-ask-jiminny\n + f6c0ec3d8b...5928f606d3 JY-20553-debug-crm-sync-delays -> origin/JY-20553-debug-crm-sync-delays (forced update)\n + 3d7234a4c4...1d10796eec JY-20701-reschedule-HubSpot-processing -> origin/JY-20701-reschedule-HubSpot-processing (forced update)\nUpdating eb5bb80e5b..12ac2f1273\nFast-forward\n composer.lock | 46 +++++++++++++++++++++++-----------------------\n 1 file changed, 23 insertions(+), 23 deletions(-)\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ co JY-18909-automated-reports-ask-jiminny\nM\u0000\u0000\u0000\u0000\u0000\u0000\t.env.local\nM\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Console/Commands/JiminnyDebugCommand.php\nM\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Http/Controllers/API/ActivityController.php\nM\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Jobs/Team/SyncToIntercom.php\nM\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Services/PlaybackService.php\nM\u0000\u0000\u0000\u0000\u0000\u0000\tconfig/logging.php\nM\u0000\u0000\u0000\u0000\u0000\u0000\troutes/web.php\nSwitched to branch 'JY-18909-automated-reports-ask-jiminny'\nYour branch and 'origin/JY-18909-automated-reports-ask-jiminny' have diverged,\nand have 1 and 1 different commits each, respectively.\n (use \"git pull\" to merge the remote branch into yours)\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-18909-automated-reports-ask-jiminny) $ git status\nOn branch JY-18909-automated-reports-ask-jiminny\nYour branch and 'origin/JY-18909-automated-reports-ask-jiminny' have diverged,\nand have 1 and 1 different commits each, respectively.\n (use \"git pull\" to merge the remote branch into yours)\n\nChanges not staged for commit:\n (use \"git add <file>...\" to update what will be committed)\n (use \"git restore <file>...\" to discard changes in working directory)\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: .env.local\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: app/Console/Commands/JiminnyDebugCommand.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: app/Http/Controllers/API/ActivityController.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: app/Jobs/Team/SyncToIntercom.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: app/Services/PlaybackService.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: config/logging.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: routes/web.php\n\nUntracked files:\n (use \"git add <file>...\" to include in what will be committed)\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t.env.nikilocal\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t.env.other\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tWEBHOOK_FILTERING_IMPLEMENTATION.md\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Console/Commands/Crm/Hubspot/SimulateWebhooksCommand.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Console/Commands/Reports/CreateMockAskJiminnyReportResultCommand.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tids.txt\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\traw_sql_query.sql\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\ttests/Unit/Policies/CanAccessAiReportsTest.php\n\nno changes added to commit (use \"git add\" and/or \"git commit -a\")\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-18909-automated-reports-ask-jiminny) $ git pull\nMerge made by the 'ort' strategy.\n app/Jobs/AutomatedReports/RequestGenerateAskJiminnyReportJob.php | 2 +-\n app/Repositories/AutomatedReportsRepository.php | 9 +++++++++\n app/Services/Kiosk/AutomatedReports/AutomatedReportsService.php | 13 +++++++++++++\n tests/Unit/Jobs/AutomatedReports/RequestGenerateAskJiminnyReportJobTest.php | 26 +++++++++++++-------------\n 4 files changed, 36 insertions(+), 14 deletions(-)\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-18909-automated-reports-ask-jiminny) $ git status\nOn branch JY-18909-automated-reports-ask-jiminny\nYour branch is ahead of 'origin/JY-18909-automated-reports-ask-jiminny' by 2 commits.\n (use \"git push\" to publish your local commits)\n\nChanges not staged for commit:\n (use \"git add <file>...\" to update what will be committed)\n (use \"git restore <file>...\" to discard changes in working directory)\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: .env.local\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: app/Console/Commands/JiminnyDebugCommand.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: app/Http/Controllers/API/ActivityController.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: app/Jobs/Team/SyncToIntercom.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: app/Services/PlaybackService.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: config/logging.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: routes/web.php\n\nUntracked files:\n (use \"git add <file>...\" to include in what will be committed)\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t.env.nikilocal\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t.env.other\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tWEBHOOK_FILTERING_IMPLEMENTATION.md\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Console/Commands/Crm/Hubspot/SimulateWebhooksCommand.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Console/Commands/Reports/CreateMockAskJiminnyReportResultCommand.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tids.txt\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\traw_sql_query.sql\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\ttests/Unit/Policies/CanAccessAiReportsTest.php\n\nno changes added to commit (use \"git add\" and/or \"git commit -a\")\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-18909-automated-reports-ask-jiminny) $ git push\nEnumerating objects: 38, done.\nCounting objects: 100% (32/32), done.\nDelta compression using up to 8 threads\nCompressing objects: 100% (16/16), done.\nWriting objects: 100% (18/18), 1.97 KiB | 1008.00 KiB/s, done.\nTotal 18 (delta 12), reused 0 (delta 0), pack-reused 0\nremote: Resolving deltas: 100% (12/12), completed with 9 local objects.\nremote: \nremote: GitHub found 22 vulnerabilities on jiminny/app's default branch (10 high, 12 moderate). To find out more, visit:\nremote: https://github.com/jiminny/app/security/dependabot\nremote: \nTo github.com:jiminny/app.git\n 24292b55b9..a72e71cc23 JY-18909-automated-reports-ask-jiminny -> JY-18909-automated-reports-ask-jiminny\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-18909-automated-reports-ask-jiminny) $ co master\nM\u0000\u0000\u0000\u0000\u0000\u0000\t.env.local\nM\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Console/Commands/JiminnyDebugCommand.php\nM\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Http/Controllers/API/ActivityController.php\nM\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Jobs/Team/SyncToIntercom.php\nM\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Services/PlaybackService.php\nM\u0000\u0000\u0000\u0000\u0000\u0000\tconfig/logging.php\nM\u0000\u0000\u0000\u0000\u0000\u0000\troutes/web.php\nSwitched to branch 'master'\nYour branch is up to date with 'origin/master'.\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pull\nAlready up to date.\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $","is_focused":true},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.27027926,"top":1.0,"width":0.0787899,"height":-0.042298436},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.27227393,"top":1.0,"width":0.005319149,"height":-0.04549086},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"DEV (docker)","depth":2,"bounds":{"left":0.34906915,"top":1.0,"width":0.0787899,"height":-0.042298436},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.35106382,"top":1.0,"width":0.005319149,"height":-0.04549086},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"APP (-zsh)","depth":2,"bounds":{"left":0.42785904,"top":1.0,"width":0.07862367,"height":-0.042298436},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.42985374,"top":1.0,"width":0.005319149,"height":-0.04549086},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.5064827,"top":1.0,"width":0.07862367,"height":-0.042298436},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.5084774,"top":1.0,"width":0.005319149,"height":-0.04549086},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"screenpipe\"","depth":2,"bounds":{"left":0.5851064,"top":1.0,"width":0.07862367,"height":-0.042298436},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.58710104,"top":1.0,"width":0.005319149,"height":-0.04549086},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.66373,"top":1.0,"width":0.07862367,"height":-0.042298436},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.66572475,"top":1.0,"width":0.005319149,"height":-0.04549086},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"⌥⌘1","depth":1,"bounds":{"left":0.7287234,"top":1.0,"width":0.01861702,"height":-0.023144484},"automation_id":"_NS:8","role_description":"text"},{"role":"AXStaticText","text":"APP (-zsh)","depth":1,"bounds":{"left":0.49800533,"top":1.0,"width":0.024601065,"height":-0.02394259},"role_description":"text"}]...
|
302347288687105374
|
-3130110898930441257
|
click
|
accessibility
|
NULL
|
Last login: Mon Apr 20 10:16:41 on ttys007
Poetry Last login: Mon Apr 20 10:16:41 on ttys007
Poetry could not find a pyproject.toml file in /Users/lukas/jiminny/app or its parents
Poetry could not find a pyproject.toml file in /Users/lukas/jiminny/app or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-18909-automated-reports-ask-jiminny) $ ;xd
docker exec -it docker_lamp_1 bash -c "mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini"
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-18909-automated-reports-ask-jiminny) $ co master
error: Your local changes to the following files would be overwritten by checkout:
app/Listeners/AutomatedReports/UserPilot/TrackAutomatedReportGeneratedEvent.php
tests/Unit/Listeners/AutomatedReports/UserPilot/TrackAutomatedReportGeneratedEventTest.php
Please commit your changes or stash them before you switch branches.
Aborting
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-18909-automated-reports-ask-jiminny) $ csfix
docker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff
PHP CS Fixer 3.87.1 Alexander by Fabien Potencier, Dariusz Ruminski and contributors.
PHP runtime: 8.3.30
Running analysis on 7 cores with 10 files per process.
Parallel runner is an experimental feature and may be unstable, use it at your own risk. Feedback highly appreciated!
Loaded config default from ".php-cs-fixer.dist.php".
5603/5603 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%
Fixed 0 of 5603 files in 30.988 seconds, 60.00 MB memory used
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (master) $ co JY-18909-automated-reports-ask-jiminny
M .env.local
M app/Console/Commands/JiminnyDebugCommand.php
M app/Http/Controllers/API/ActivityController.php
M app/Jobs/Team/SyncToIntercom.php
M app/Services/PlaybackService.php
M config/logging.php
M routes/web.php
Switched to branch 'JY-18909-automated-reports-ask-jiminny'
Your branch and 'origin/JY-18909-automated-reports-ask-jiminny' have diverged,
and have 1 and 1 different commits each, respectively.
(use "git pull" to merge the remote branch into yours)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-18909-automated-reports-ask-jiminny) $ git status
On branch JY-18909-automated-reports-ask-jiminny
Your branch and 'origin/JY-18909-automated-reports-ask-jiminny' have diverged,
and have 1 and 1 different commits each, respectively.
(use "git pull" to merge the remote branch into yours)
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: .env.local
modified: app/Console/Commands/JiminnyDebugCommand.php
modified: app/Http/Controllers/API/ActivityController.php
modified: app/Jobs/Team/SyncToIntercom.php
modified: app/Services/PlaybackService.php
modified: config/logging.php
modified: routes/web.php
Untracked files:
(use "git add <file>..." to include in what will be committed)
.env.nikilocal
.env.other
WEBHOOK_FILTERING_IMPLEMENTATION.md
app/Console/Commands/Crm/Hubspot/SimulateWebhooksCommand.php
app/Console/Commands/Reports/CreateMockAskJiminnyReportResultCommand.php
ids.txt
raw_sql_query.sql
tests/Unit/Policies/CanAccessAiReportsTest.php
no changes added to commit (use "git add" and/or "git commit -a")
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-18909-automated-reports-ask-jiminny) $ git pull
Merge made by the 'ort' strategy.
app/Jobs/AutomatedReports/RequestGenerateAskJiminnyReportJob.php | 2 +-
app/Repositories/AutomatedReportsRepository.php | 9 +++++++++
app/Services/Kiosk/AutomatedReports/AutomatedReportsService.php | 13 +++++++++++++
tests/Unit/Jobs/AutomatedReports/RequestGenerateAskJiminnyReportJobTest.php | 26 +++++++++++++-------------
4 files changed, 36 insertions(+), 14 deletions(-)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-18909-automated-reports-ask-jiminny) $ git status
On branch JY-18909-automated-reports-ask-jiminny
Your branch is ahead of 'origin/JY-18909-automated-reports-ask-jiminny' by 2 commits.
(use "git push" to publish your local commits)
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: .env.local
modified: app/Console/Commands/JiminnyDebugCommand.php
modified: app/Http/Controllers/API/ActivityController.php
modified: app/Jobs/Team/SyncToIntercom.php
modified: app/Services/PlaybackService.php
modified: config/logging.php
modified: routes/web.php
Untracked files:
(use "git add <file>..." to include in what will be committed)
.env.nikilocal
.env.other
WEBHOOK_FILTERING_IMPLEMENTATION.md
app/Console/Commands/Crm/Hubspot/SimulateWebhooksCommand.php
app/Console/Commands/Reports/CreateMockAskJiminnyReportResultCommand.php
ids.txt
raw_sql_query.sql
tests/Unit/Policies/CanAccessAiReportsTest.php
no changes added to commit (use "git add" and/or "git commit -a")
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-18909-automated-reports-ask-jiminny) $ git push
Enumerating objects: 38, done.
Counting objects: 100% (32/32), done.
Delta compression using up to 8 threads
Compressing objects: 100% (16/16), done.
Writing objects: 100% (18/18), 1.97 KiB | 1008.00 KiB/s, done.
Total 18 (delta 12), reused 0 (delta 0), pack-reused 0
remote: Resolving deltas: 100% (12/12), completed with 9 local objects.
remote:
remote: GitHub found 22 vulnerabilities on jiminny/app's default branch (10 high, 12 moderate). To find out more, visit:
remote: [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-18909-automated-reports-ask-jiminny) $ co master
M .env.local
M app/Console/Commands/JiminnyDebugCommand.php
M app/Http/Controllers/API/ActivityController.php
M app/Jobs/Team/SyncToIntercom.php
M app/Services/PlaybackService.php
M config/logging.php
M routes/web.php
Switched to branch 'master'
Your branch is up to date with 'origin/master'.
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pull
Already up to date.
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $
DOCKER
Close Tab
DEV (docker)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
screenpipe"
Close Tab
-zsh
Close Tab
⌥⌘1
APP (-zsh)...
|
NULL
|
|
55058
|
NULL
|
0
|
2026-04-20T09:32:51.032657+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-20/1776 /Users/lukas/.screenpipe/data/data/2026-04-20/1776677571032_m1.jpg...
|
iTerm2
|
APP (-zsh)
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Last login: Mon Apr 20 10:16:41 on ttys007
Poetry Last login: Mon Apr 20 10:16:41 on ttys007
Poetry could not find a pyproject.toml file in /Users/lukas/jiminny/app or its parents
Poetry could not find a pyproject.toml file in /Users/lukas/jiminny/app or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-18909-automated-reports-ask-jiminny) $ ;xd
docker exec -it docker_lamp_1 bash -c "mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini"
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-18909-automated-reports-ask-jiminny) $ co master
error: Your local changes to the following files would be overwritten by checkout:
app/Listeners/AutomatedReports/UserPilot/TrackAutomatedReportGeneratedEvent.php
tests/Unit/Listeners/AutomatedReports/UserPilot/TrackAutomatedReportGeneratedEventTest.php
Please commit your changes or stash them before you switch branches.
Aborting
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-18909-automated-reports-ask-jiminny) $ csfix
docker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff
PHP CS Fixer 3.87.1 Alexander by Fabien Potencier, Dariusz Ruminski and contributors.
PHP runtime: 8.3.30
Running analysis on 7 cores with 10 files per process.
Parallel runner is an experimental feature and may be unstable, use it at your own risk. Feedback highly appreciated!
Loaded config default from ".php-cs-fixer.dist.php".
5603/5603 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%
Fixed 0 of 5603 files in 30.988 seconds, 60.00 MB memory used
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (master) $ co JY-18909-automated-reports-ask-jiminny
M .env.local
M app/Console/Commands/JiminnyDebugCommand.php
M app/Http/Controllers/API/ActivityController.php
M app/Jobs/Team/SyncToIntercom.php
M app/Services/PlaybackService.php
M config/logging.php
M routes/web.php
Switched to branch 'JY-18909-automated-reports-ask-jiminny'
Your branch and 'origin/JY-18909-automated-reports-ask-jiminny' have diverged,
and have 1 and 1 different commits each, respectively.
(use "git pull" to merge the remote branch into yours)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-18909-automated-reports-ask-jiminny) $ git status
On branch JY-18909-automated-reports-ask-jiminny
Your branch and 'origin/JY-18909-automated-reports-ask-jiminny' have diverged,
and have 1 and 1 different commits each, respectively.
(use "git pull" to merge the remote branch into yours)
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: .env.local
modified: app/Console/Commands/JiminnyDebugCommand.php
modified: app/Http/Controllers/API/ActivityController.php
modified: app/Jobs/Team/SyncToIntercom.php
modified: app/Services/PlaybackService.php
modified: config/logging.php
modified: routes/web.php
Untracked files:
(use "git add <file>..." to include in what will be committed)
.env.nikilocal
.env.other
WEBHOOK_FILTERING_IMPLEMENTATION.md
app/Console/Commands/Crm/Hubspot/SimulateWebhooksCommand.php
app/Console/Commands/Reports/CreateMockAskJiminnyReportResultCommand.php
ids.txt
raw_sql_query.sql
tests/Unit/Policies/CanAccessAiReportsTest.php
no changes added to commit (use "git add" and/or "git commit -a")
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-18909-automated-reports-ask-jiminny) $ git pull
Merge made by the 'ort' strategy.
app/Jobs/AutomatedReports/RequestGenerateAskJiminnyReportJob.php | 2 +-
app/Repositories/AutomatedReportsRepository.php | 9 +++++++++
app/Services/Kiosk/AutomatedReports/AutomatedReportsService.php | 13 +++++++++++++
tests/Unit/Jobs/AutomatedReports/RequestGenerateAskJiminnyReportJobTest.php | 26 +++++++++++++-------------
4 files changed, 36 insertions(+), 14 deletions(-)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-18909-automated-reports-ask-jiminny) $ git status
On branch JY-18909-automated-reports-ask-jiminny
Your branch is ahead of 'origin/JY-18909-automated-reports-ask-jiminny' by 2 commits.
(use "git push" to publish your local commits)
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: .env.local
modified: app/Console/Commands/JiminnyDebugCommand.php
modified: app/Http/Controllers/API/ActivityController.php
modified: app/Jobs/Team/SyncToIntercom.php
modified: app/Services/PlaybackService.php
modified: config/logging.php
modified: routes/web.php
Untracked files:
(use "git add <file>..." to include in what will be committed)
.env.nikilocal
.env.other
WEBHOOK_FILTERING_IMPLEMENTATION.md
app/Console/Commands/Crm/Hubspot/SimulateWebhooksCommand.php
app/Console/Commands/Reports/CreateMockAskJiminnyReportResultCommand.php
ids.txt
raw_sql_query.sql
tests/Unit/Policies/CanAccessAiReportsTest.php
no changes added to commit (use "git add" and/or "git commit -a")
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-18909-automated-reports-ask-jiminny) $ git push
Enumerating objects: 38, done.
Counting objects: 100% (32/32), done.
Delta compression using up to 8 threads
Compressing objects: 100% (16/16), done.
Writing objects: 100% (18/18), 1.97 KiB | 1008.00 KiB/s, done.
Total 18 (delta 12), reused 0 (delta 0), pack-reused 0
remote: Resolving deltas: 100% (12/12), completed with 9 local objects.
remote:
remote: GitHub found 22 vulnerabilities on jiminny/app's default branch (10 high, 12 moderate). To find out more, visit:
remote: [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-18909-automated-reports-ask-jiminny) $ co master
M .env.local
M app/Console/Commands/JiminnyDebugCommand.php
M app/Http/Controllers/API/ActivityController.php
M app/Jobs/Team/SyncToIntercom.php
M app/Services/PlaybackService.php
M config/logging.php
M routes/web.php
Switched to branch 'master'
Your branch is up to date with 'origin/master'.
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pull
Already up to date.
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $
DOCKER
Close Tab
DEV (docker)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
screenpipe"
Close Tab
-zsh
Close Tab
⌥⌘1
APP (-zsh)...
|
[{"role":"AXTextArea","text [{"role":"AXTextArea","text":"Last login: Mon Apr 20 10:16:41 on ttys007\n\nPoetry could not find a pyproject.toml file in /Users/lukas/jiminny/app or its parents\n\nPoetry could not find a pyproject.toml file in /Users/lukas/jiminny/app or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-18909-automated-reports-ask-jiminny) $ ;xd\ndocker exec -it docker_lamp_1 bash -c \"mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini\"\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\ndocker exec -it docker_lamp_1 supervisorctl restart all\njiminny-worker-processing-2:jiminny-worker-processing-2_00: stopped\njiminny-worker-processing-3:jiminny-worker-processing-3_00: stopped\njiminny-worker-processing-4:jiminny-worker-processing-4_00: stopped\njiminny-worker-processing-5:jiminny-worker-processing-5_00: stopped\njiminny-worker-processing-delayed:jiminny-worker-processing-delayed_00: stopped\nworker-analytics:worker-analytics_00: stopped\nworker-crm-update:worker-crm-update_00: stopped\nworker-download:worker-download_00: stopped\nworker-nudges:worker-nudges_00: stopped\nworker-conferences:worker-conferences_00: stopped\njiminny-worker-processing-1:jiminny-worker-processing-1_00: stopped\nworker:worker_00: stopped\nworker-audio:worker-audio_00: stopped\nworker-calendar:worker-calendar_00: stopped\nworker-crm-sync:worker-crm-sync_00: stopped\nworker-emails:worker-emails_00: stopped\nartisan-schedule:artisan-schedule_00: stopped\nworker-es-update:worker-es-update_00: stopped\nartisan-schedule:artisan-schedule_00: started\njiminny-worker-processing-1:jiminny-worker-processing-1_00: started\njiminny-worker-processing-2:jiminny-worker-processing-2_00: started\njiminny-worker-processing-3:jiminny-worker-processing-3_00: started\njiminny-worker-processing-4:jiminny-worker-processing-4_00: started\njiminny-worker-processing-5:jiminny-worker-processing-5_00: started\njiminny-worker-processing-delayed:jiminny-worker-processing-delayed_00: started\nworker:worker_00: started\nworker-analytics:worker-analytics_00: started\nworker-audio:worker-audio_00: started\nworker-calendar:worker-calendar_00: started\nworker-conferences:worker-conferences_00: started\nworker-crm-sync:worker-crm-sync_00: started\nworker-crm-update:worker-crm-update_00: started\nworker-download:worker-download_00: started\nworker-emails:worker-emails_00: started\nworker-es-update:worker-es-update_00: started\nworker-nudges:worker-nudges_00: started\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\ndocker exec -it docker_lamp_1 php -v\nPHP 8.3.30 (cli) (built: Mar 16 2026 22:32:32) (NTS)\nCopyright (c) The PHP Group\nZend Engine v4.3.30, Copyright (c) Zend Technologies\n with Zend OPcache v8.3.30, Copyright (c), by Zend Technologies\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-18909-automated-reports-ask-jiminny) $ co master\nerror: Your local changes to the following files would be overwritten by checkout:\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Listeners/AutomatedReports/UserPilot/TrackAutomatedReportGeneratedEvent.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\ttests/Unit/Listeners/AutomatedReports/UserPilot/TrackAutomatedReportGeneratedEventTest.php\nPlease commit your changes or stash them before you switch branches.\nAborting\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-18909-automated-reports-ask-jiminny) $ csfix\ndocker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff \nPHP CS Fixer 3.87.1 Alexander by Fabien Potencier, Dariusz Ruminski and contributors.\nPHP runtime: 8.3.30\nRunning analysis on 7 cores with 10 files per process.\nParallel runner is an experimental feature and may be unstable, use it at your own risk. Feedback highly appreciated!\nLoaded config default from \".php-cs-fixer.dist.php\".\n 5603/5603 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%\n\n\nFixed 0 of 5603 files in 30.988 seconds, 60.00 MB memory used\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-18909-automated-reports-ask-jiminny) $ co master\nM\u0000\u0000\u0000\u0000\u0000\u0000\t.env.local\nM\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Console/Commands/JiminnyDebugCommand.php\nM\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Http/Controllers/API/ActivityController.php\nM\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Jobs/Team/SyncToIntercom.php\nM\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Services/PlaybackService.php\nM\u0000\u0000\u0000\u0000\u0000\u0000\tconfig/logging.php\nM\u0000\u0000\u0000\u0000\u0000\u0000\troutes/web.php\nSwitched to branch 'master'\nYour branch is up to date with 'origin/master'.\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pull\nremote: Enumerating objects: 73, done.\nremote: Counting objects: 100% (73/73), done.\nremote: Compressing objects: 100% (35/35), done.\nremote: Total 73 (delta 40), reused 69 (delta 38), pack-reused 0 (from 0)\nUnpacking objects: 100% (73/73), 12.37 KiB | 218.00 KiB/s, done.\nFrom github.com:jiminny/app\n eb5bb80e5b..12ac2f1273 master -> origin/master\n da535e5554..24292b55b9 JY-18909-automated-reports-ask-jiminny -> origin/JY-18909-automated-reports-ask-jiminny\n + f6c0ec3d8b...5928f606d3 JY-20553-debug-crm-sync-delays -> origin/JY-20553-debug-crm-sync-delays (forced update)\n + 3d7234a4c4...1d10796eec JY-20701-reschedule-HubSpot-processing -> origin/JY-20701-reschedule-HubSpot-processing (forced update)\nUpdating eb5bb80e5b..12ac2f1273\nFast-forward\n composer.lock | 46 +++++++++++++++++++++++-----------------------\n 1 file changed, 23 insertions(+), 23 deletions(-)\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ co JY-18909-automated-reports-ask-jiminny\nM\u0000\u0000\u0000\u0000\u0000\u0000\t.env.local\nM\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Console/Commands/JiminnyDebugCommand.php\nM\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Http/Controllers/API/ActivityController.php\nM\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Jobs/Team/SyncToIntercom.php\nM\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Services/PlaybackService.php\nM\u0000\u0000\u0000\u0000\u0000\u0000\tconfig/logging.php\nM\u0000\u0000\u0000\u0000\u0000\u0000\troutes/web.php\nSwitched to branch 'JY-18909-automated-reports-ask-jiminny'\nYour branch and 'origin/JY-18909-automated-reports-ask-jiminny' have diverged,\nand have 1 and 1 different commits each, respectively.\n (use \"git pull\" to merge the remote branch into yours)\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-18909-automated-reports-ask-jiminny) $ git status\nOn branch JY-18909-automated-reports-ask-jiminny\nYour branch and 'origin/JY-18909-automated-reports-ask-jiminny' have diverged,\nand have 1 and 1 different commits each, respectively.\n (use \"git pull\" to merge the remote branch into yours)\n\nChanges not staged for commit:\n (use \"git add <file>...\" to update what will be committed)\n (use \"git restore <file>...\" to discard changes in working directory)\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: .env.local\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: app/Console/Commands/JiminnyDebugCommand.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: app/Http/Controllers/API/ActivityController.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: app/Jobs/Team/SyncToIntercom.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: app/Services/PlaybackService.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: config/logging.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: routes/web.php\n\nUntracked files:\n (use \"git add <file>...\" to include in what will be committed)\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t.env.nikilocal\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t.env.other\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tWEBHOOK_FILTERING_IMPLEMENTATION.md\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Console/Commands/Crm/Hubspot/SimulateWebhooksCommand.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Console/Commands/Reports/CreateMockAskJiminnyReportResultCommand.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tids.txt\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\traw_sql_query.sql\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\ttests/Unit/Policies/CanAccessAiReportsTest.php\n\nno changes added to commit (use \"git add\" and/or \"git commit -a\")\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-18909-automated-reports-ask-jiminny) $ git pull\nMerge made by the 'ort' strategy.\n app/Jobs/AutomatedReports/RequestGenerateAskJiminnyReportJob.php | 2 +-\n app/Repositories/AutomatedReportsRepository.php | 9 +++++++++\n app/Services/Kiosk/AutomatedReports/AutomatedReportsService.php | 13 +++++++++++++\n tests/Unit/Jobs/AutomatedReports/RequestGenerateAskJiminnyReportJobTest.php | 26 +++++++++++++-------------\n 4 files changed, 36 insertions(+), 14 deletions(-)\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-18909-automated-reports-ask-jiminny) $ git status\nOn branch JY-18909-automated-reports-ask-jiminny\nYour branch is ahead of 'origin/JY-18909-automated-reports-ask-jiminny' by 2 commits.\n (use \"git push\" to publish your local commits)\n\nChanges not staged for commit:\n (use \"git add <file>...\" to update what will be committed)\n (use \"git restore <file>...\" to discard changes in working directory)\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: .env.local\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: app/Console/Commands/JiminnyDebugCommand.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: app/Http/Controllers/API/ActivityController.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: app/Jobs/Team/SyncToIntercom.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: app/Services/PlaybackService.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: config/logging.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: routes/web.php\n\nUntracked files:\n (use \"git add <file>...\" to include in what will be committed)\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t.env.nikilocal\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t.env.other\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tWEBHOOK_FILTERING_IMPLEMENTATION.md\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Console/Commands/Crm/Hubspot/SimulateWebhooksCommand.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Console/Commands/Reports/CreateMockAskJiminnyReportResultCommand.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tids.txt\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\traw_sql_query.sql\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\ttests/Unit/Policies/CanAccessAiReportsTest.php\n\nno changes added to commit (use \"git add\" and/or \"git commit -a\")\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-18909-automated-reports-ask-jiminny) $ git push\nEnumerating objects: 38, done.\nCounting objects: 100% (32/32), done.\nDelta compression using up to 8 threads\nCompressing objects: 100% (16/16), done.\nWriting objects: 100% (18/18), 1.97 KiB | 1008.00 KiB/s, done.\nTotal 18 (delta 12), reused 0 (delta 0), pack-reused 0\nremote: Resolving deltas: 100% (12/12), completed with 9 local objects.\nremote: \nremote: GitHub found 22 vulnerabilities on jiminny/app's default branch (10 high, 12 moderate). To find out more, visit:\nremote: https://github.com/jiminny/app/security/dependabot\nremote: \nTo github.com:jiminny/app.git\n 24292b55b9..a72e71cc23 JY-18909-automated-reports-ask-jiminny -> JY-18909-automated-reports-ask-jiminny\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-18909-automated-reports-ask-jiminny) $ co master\nM\u0000\u0000\u0000\u0000\u0000\u0000\t.env.local\nM\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Console/Commands/JiminnyDebugCommand.php\nM\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Http/Controllers/API/ActivityController.php\nM\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Jobs/Team/SyncToIntercom.php\nM\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Services/PlaybackService.php\nM\u0000\u0000\u0000\u0000\u0000\u0000\tconfig/logging.php\nM\u0000\u0000\u0000\u0000\u0000\u0000\troutes/web.php\nSwitched to branch 'master'\nYour branch is up to date with 'origin/master'.\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pull\nAlready up to date.\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $","depth":4,"value":"Last login: Mon Apr 20 10:16:41 on ttys007\n\nPoetry could not find a pyproject.toml file in /Users/lukas/jiminny/app or its parents\n\nPoetry could not find a pyproject.toml file in /Users/lukas/jiminny/app or its parents\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-18909-automated-reports-ask-jiminny) $ ;xd\ndocker exec -it docker_lamp_1 bash -c \"mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini\"\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\ndocker exec -it docker_lamp_1 supervisorctl restart all\njiminny-worker-processing-2:jiminny-worker-processing-2_00: stopped\njiminny-worker-processing-3:jiminny-worker-processing-3_00: stopped\njiminny-worker-processing-4:jiminny-worker-processing-4_00: stopped\njiminny-worker-processing-5:jiminny-worker-processing-5_00: stopped\njiminny-worker-processing-delayed:jiminny-worker-processing-delayed_00: stopped\nworker-analytics:worker-analytics_00: stopped\nworker-crm-update:worker-crm-update_00: stopped\nworker-download:worker-download_00: stopped\nworker-nudges:worker-nudges_00: stopped\nworker-conferences:worker-conferences_00: stopped\njiminny-worker-processing-1:jiminny-worker-processing-1_00: stopped\nworker:worker_00: stopped\nworker-audio:worker-audio_00: stopped\nworker-calendar:worker-calendar_00: stopped\nworker-crm-sync:worker-crm-sync_00: stopped\nworker-emails:worker-emails_00: stopped\nartisan-schedule:artisan-schedule_00: stopped\nworker-es-update:worker-es-update_00: stopped\nartisan-schedule:artisan-schedule_00: started\njiminny-worker-processing-1:jiminny-worker-processing-1_00: started\njiminny-worker-processing-2:jiminny-worker-processing-2_00: started\njiminny-worker-processing-3:jiminny-worker-processing-3_00: started\njiminny-worker-processing-4:jiminny-worker-processing-4_00: started\njiminny-worker-processing-5:jiminny-worker-processing-5_00: started\njiminny-worker-processing-delayed:jiminny-worker-processing-delayed_00: started\nworker:worker_00: started\nworker-analytics:worker-analytics_00: started\nworker-audio:worker-audio_00: started\nworker-calendar:worker-calendar_00: started\nworker-conferences:worker-conferences_00: started\nworker-crm-sync:worker-crm-sync_00: started\nworker-crm-update:worker-crm-update_00: started\nworker-download:worker-download_00: started\nworker-emails:worker-emails_00: started\nworker-es-update:worker-es-update_00: started\nworker-nudges:worker-nudges_00: started\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\ndocker exec -it docker_lamp_1 php -v\nPHP 8.3.30 (cli) (built: Mar 16 2026 22:32:32) (NTS)\nCopyright (c) The PHP Group\nZend Engine v4.3.30, Copyright (c) Zend Technologies\n with Zend OPcache v8.3.30, Copyright (c), by Zend Technologies\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-18909-automated-reports-ask-jiminny) $ co master\nerror: Your local changes to the following files would be overwritten by checkout:\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Listeners/AutomatedReports/UserPilot/TrackAutomatedReportGeneratedEvent.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\ttests/Unit/Listeners/AutomatedReports/UserPilot/TrackAutomatedReportGeneratedEventTest.php\nPlease commit your changes or stash them before you switch branches.\nAborting\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-18909-automated-reports-ask-jiminny) $ csfix\ndocker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff \nPHP CS Fixer 3.87.1 Alexander by Fabien Potencier, Dariusz Ruminski and contributors.\nPHP runtime: 8.3.30\nRunning analysis on 7 cores with 10 files per process.\nParallel runner is an experimental feature and may be unstable, use it at your own risk. Feedback highly appreciated!\nLoaded config default from \".php-cs-fixer.dist.php\".\n 5603/5603 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%\n\n\nFixed 0 of 5603 files in 30.988 seconds, 60.00 MB memory used\n\nWhat's next:\n Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1\n Learn more at https://docs.docker.com/go/debug-cli/\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-18909-automated-reports-ask-jiminny) $ co master\nM\u0000\u0000\u0000\u0000\u0000\u0000\t.env.local\nM\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Console/Commands/JiminnyDebugCommand.php\nM\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Http/Controllers/API/ActivityController.php\nM\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Jobs/Team/SyncToIntercom.php\nM\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Services/PlaybackService.php\nM\u0000\u0000\u0000\u0000\u0000\u0000\tconfig/logging.php\nM\u0000\u0000\u0000\u0000\u0000\u0000\troutes/web.php\nSwitched to branch 'master'\nYour branch is up to date with 'origin/master'.\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pull\nremote: Enumerating objects: 73, done.\nremote: Counting objects: 100% (73/73), done.\nremote: Compressing objects: 100% (35/35), done.\nremote: Total 73 (delta 40), reused 69 (delta 38), pack-reused 0 (from 0)\nUnpacking objects: 100% (73/73), 12.37 KiB | 218.00 KiB/s, done.\nFrom github.com:jiminny/app\n eb5bb80e5b..12ac2f1273 master -> origin/master\n da535e5554..24292b55b9 JY-18909-automated-reports-ask-jiminny -> origin/JY-18909-automated-reports-ask-jiminny\n + f6c0ec3d8b...5928f606d3 JY-20553-debug-crm-sync-delays -> origin/JY-20553-debug-crm-sync-delays (forced update)\n + 3d7234a4c4...1d10796eec JY-20701-reschedule-HubSpot-processing -> origin/JY-20701-reschedule-HubSpot-processing (forced update)\nUpdating eb5bb80e5b..12ac2f1273\nFast-forward\n composer.lock | 46 +++++++++++++++++++++++-----------------------\n 1 file changed, 23 insertions(+), 23 deletions(-)\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ co JY-18909-automated-reports-ask-jiminny\nM\u0000\u0000\u0000\u0000\u0000\u0000\t.env.local\nM\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Console/Commands/JiminnyDebugCommand.php\nM\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Http/Controllers/API/ActivityController.php\nM\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Jobs/Team/SyncToIntercom.php\nM\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Services/PlaybackService.php\nM\u0000\u0000\u0000\u0000\u0000\u0000\tconfig/logging.php\nM\u0000\u0000\u0000\u0000\u0000\u0000\troutes/web.php\nSwitched to branch 'JY-18909-automated-reports-ask-jiminny'\nYour branch and 'origin/JY-18909-automated-reports-ask-jiminny' have diverged,\nand have 1 and 1 different commits each, respectively.\n (use \"git pull\" to merge the remote branch into yours)\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-18909-automated-reports-ask-jiminny) $ git status\nOn branch JY-18909-automated-reports-ask-jiminny\nYour branch and 'origin/JY-18909-automated-reports-ask-jiminny' have diverged,\nand have 1 and 1 different commits each, respectively.\n (use \"git pull\" to merge the remote branch into yours)\n\nChanges not staged for commit:\n (use \"git add <file>...\" to update what will be committed)\n (use \"git restore <file>...\" to discard changes in working directory)\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: .env.local\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: app/Console/Commands/JiminnyDebugCommand.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: app/Http/Controllers/API/ActivityController.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: app/Jobs/Team/SyncToIntercom.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: app/Services/PlaybackService.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: config/logging.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: routes/web.php\n\nUntracked files:\n (use \"git add <file>...\" to include in what will be committed)\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t.env.nikilocal\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t.env.other\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tWEBHOOK_FILTERING_IMPLEMENTATION.md\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Console/Commands/Crm/Hubspot/SimulateWebhooksCommand.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Console/Commands/Reports/CreateMockAskJiminnyReportResultCommand.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tids.txt\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\traw_sql_query.sql\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\ttests/Unit/Policies/CanAccessAiReportsTest.php\n\nno changes added to commit (use \"git add\" and/or \"git commit -a\")\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-18909-automated-reports-ask-jiminny) $ git pull\nMerge made by the 'ort' strategy.\n app/Jobs/AutomatedReports/RequestGenerateAskJiminnyReportJob.php | 2 +-\n app/Repositories/AutomatedReportsRepository.php | 9 +++++++++\n app/Services/Kiosk/AutomatedReports/AutomatedReportsService.php | 13 +++++++++++++\n tests/Unit/Jobs/AutomatedReports/RequestGenerateAskJiminnyReportJobTest.php | 26 +++++++++++++-------------\n 4 files changed, 36 insertions(+), 14 deletions(-)\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-18909-automated-reports-ask-jiminny) $ git status\nOn branch JY-18909-automated-reports-ask-jiminny\nYour branch is ahead of 'origin/JY-18909-automated-reports-ask-jiminny' by 2 commits.\n (use \"git push\" to publish your local commits)\n\nChanges not staged for commit:\n (use \"git add <file>...\" to update what will be committed)\n (use \"git restore <file>...\" to discard changes in working directory)\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: .env.local\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: app/Console/Commands/JiminnyDebugCommand.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: app/Http/Controllers/API/ActivityController.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: app/Jobs/Team/SyncToIntercom.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: app/Services/PlaybackService.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: config/logging.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tmodified: routes/web.php\n\nUntracked files:\n (use \"git add <file>...\" to include in what will be committed)\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t.env.nikilocal\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\t.env.other\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tWEBHOOK_FILTERING_IMPLEMENTATION.md\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Console/Commands/Crm/Hubspot/SimulateWebhooksCommand.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Console/Commands/Reports/CreateMockAskJiminnyReportResultCommand.php\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\tids.txt\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\traw_sql_query.sql\n\u0000\u0000\u0000\u0000\u0000\u0000\u0000\ttests/Unit/Policies/CanAccessAiReportsTest.php\n\nno changes added to commit (use \"git add\" and/or \"git commit -a\")\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-18909-automated-reports-ask-jiminny) $ git push\nEnumerating objects: 38, done.\nCounting objects: 100% (32/32), done.\nDelta compression using up to 8 threads\nCompressing objects: 100% (16/16), done.\nWriting objects: 100% (18/18), 1.97 KiB | 1008.00 KiB/s, done.\nTotal 18 (delta 12), reused 0 (delta 0), pack-reused 0\nremote: Resolving deltas: 100% (12/12), completed with 9 local objects.\nremote: \nremote: GitHub found 22 vulnerabilities on jiminny/app's default branch (10 high, 12 moderate). To find out more, visit:\nremote: https://github.com/jiminny/app/security/dependabot\nremote: \nTo github.com:jiminny/app.git\n 24292b55b9..a72e71cc23 JY-18909-automated-reports-ask-jiminny -> JY-18909-automated-reports-ask-jiminny\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-18909-automated-reports-ask-jiminny) $ co master\nM\u0000\u0000\u0000\u0000\u0000\u0000\t.env.local\nM\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Console/Commands/JiminnyDebugCommand.php\nM\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Http/Controllers/API/ActivityController.php\nM\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Jobs/Team/SyncToIntercom.php\nM\u0000\u0000\u0000\u0000\u0000\u0000\tapp/Services/PlaybackService.php\nM\u0000\u0000\u0000\u0000\u0000\u0000\tconfig/logging.php\nM\u0000\u0000\u0000\u0000\u0000\u0000\troutes/web.php\nSwitched to branch 'master'\nYour branch is up to date with 'origin/master'.\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pull\nAlready up to date.\nlukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $","is_focused":true},{"role":"AXRadioButton","text":"DOCKER","depth":2,"bounds":{"left":0.0,"top":0.05888889,"width":0.16458334,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.004166667,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"DEV (docker)","depth":2,"bounds":{"left":0.16458334,"top":0.05888889,"width":0.16458334,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.16875,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"APP (-zsh)","depth":2,"bounds":{"left":0.32916668,"top":0.05888889,"width":0.16423611,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.33333334,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.49340278,"top":0.05888889,"width":0.16423611,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.49756944,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"screenpipe\"","depth":2,"bounds":{"left":0.6576389,"top":0.05888889,"width":0.16423611,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.66180557,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXRadioButton","text":"-zsh","depth":2,"bounds":{"left":0.821875,"top":0.05888889,"width":0.16423611,"height":0.026666667},"role_description":"radio button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close Tab","depth":3,"bounds":{"left":0.82604164,"top":0.06333333,"width":0.011111111,"height":0.017777778},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"⌥⌘1","depth":1,"bounds":{"left":0.95763886,"top":0.032222223,"width":0.03888889,"height":0.018888889},"automation_id":"_NS:8","role_description":"text"},{"role":"AXStaticText","text":"APP (-zsh)","depth":1,"bounds":{"left":0.47569445,"top":0.033333335,"width":0.05138889,"height":0.017777778},"role_description":"text"}]...
|
302347288687105374
|
-3130110898930441257
|
click
|
accessibility
|
NULL
|
Last login: Mon Apr 20 10:16:41 on ttys007
Poetry Last login: Mon Apr 20 10:16:41 on ttys007
Poetry could not find a pyproject.toml file in /Users/lukas/jiminny/app or its parents
Poetry could not find a pyproject.toml file in /Users/lukas/jiminny/app or its parents
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-18909-automated-reports-ask-jiminny) $ ;xd
docker exec -it docker_lamp_1 bash -c "mv /usr/local/etc/php/conf.d/xdebug.ini ~/xdebug.ini"
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-18909-automated-reports-ask-jiminny) $ co master
error: Your local changes to the following files would be overwritten by checkout:
app/Listeners/AutomatedReports/UserPilot/TrackAutomatedReportGeneratedEvent.php
tests/Unit/Listeners/AutomatedReports/UserPilot/TrackAutomatedReportGeneratedEventTest.php
Please commit your changes or stash them before you switch branches.
Aborting
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-18909-automated-reports-ask-jiminny) $ csfix
docker exec -it docker_lamp_1 ./vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php -v --using-cache=no --diff
PHP CS Fixer 3.87.1 Alexander by Fabien Potencier, Dariusz Ruminski and contributors.
PHP runtime: 8.3.30
Running analysis on 7 cores with 10 files per process.
Parallel runner is an experimental feature and may be unstable, use it at your own risk. Feedback highly appreciated!
Loaded config default from ".php-cs-fixer.dist.php".
5603/5603 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%
Fixed 0 of 5603 files in 30.988 seconds, 60.00 MB memory used
What's next:
Try Docker Debug for seamless, persistent debugging tools in any container or image → docker debug docker_lamp_1
Learn more at [URL_WITH_CREDENTIALS] ~/jiminny/app (master) $ co JY-18909-automated-reports-ask-jiminny
M .env.local
M app/Console/Commands/JiminnyDebugCommand.php
M app/Http/Controllers/API/ActivityController.php
M app/Jobs/Team/SyncToIntercom.php
M app/Services/PlaybackService.php
M config/logging.php
M routes/web.php
Switched to branch 'JY-18909-automated-reports-ask-jiminny'
Your branch and 'origin/JY-18909-automated-reports-ask-jiminny' have diverged,
and have 1 and 1 different commits each, respectively.
(use "git pull" to merge the remote branch into yours)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-18909-automated-reports-ask-jiminny) $ git status
On branch JY-18909-automated-reports-ask-jiminny
Your branch and 'origin/JY-18909-automated-reports-ask-jiminny' have diverged,
and have 1 and 1 different commits each, respectively.
(use "git pull" to merge the remote branch into yours)
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: .env.local
modified: app/Console/Commands/JiminnyDebugCommand.php
modified: app/Http/Controllers/API/ActivityController.php
modified: app/Jobs/Team/SyncToIntercom.php
modified: app/Services/PlaybackService.php
modified: config/logging.php
modified: routes/web.php
Untracked files:
(use "git add <file>..." to include in what will be committed)
.env.nikilocal
.env.other
WEBHOOK_FILTERING_IMPLEMENTATION.md
app/Console/Commands/Crm/Hubspot/SimulateWebhooksCommand.php
app/Console/Commands/Reports/CreateMockAskJiminnyReportResultCommand.php
ids.txt
raw_sql_query.sql
tests/Unit/Policies/CanAccessAiReportsTest.php
no changes added to commit (use "git add" and/or "git commit -a")
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-18909-automated-reports-ask-jiminny) $ git pull
Merge made by the 'ort' strategy.
app/Jobs/AutomatedReports/RequestGenerateAskJiminnyReportJob.php | 2 +-
app/Repositories/AutomatedReportsRepository.php | 9 +++++++++
app/Services/Kiosk/AutomatedReports/AutomatedReportsService.php | 13 +++++++++++++
tests/Unit/Jobs/AutomatedReports/RequestGenerateAskJiminnyReportJobTest.php | 26 +++++++++++++-------------
4 files changed, 36 insertions(+), 14 deletions(-)
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-18909-automated-reports-ask-jiminny) $ git status
On branch JY-18909-automated-reports-ask-jiminny
Your branch is ahead of 'origin/JY-18909-automated-reports-ask-jiminny' by 2 commits.
(use "git push" to publish your local commits)
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: .env.local
modified: app/Console/Commands/JiminnyDebugCommand.php
modified: app/Http/Controllers/API/ActivityController.php
modified: app/Jobs/Team/SyncToIntercom.php
modified: app/Services/PlaybackService.php
modified: config/logging.php
modified: routes/web.php
Untracked files:
(use "git add <file>..." to include in what will be committed)
.env.nikilocal
.env.other
WEBHOOK_FILTERING_IMPLEMENTATION.md
app/Console/Commands/Crm/Hubspot/SimulateWebhooksCommand.php
app/Console/Commands/Reports/CreateMockAskJiminnyReportResultCommand.php
ids.txt
raw_sql_query.sql
tests/Unit/Policies/CanAccessAiReportsTest.php
no changes added to commit (use "git add" and/or "git commit -a")
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-18909-automated-reports-ask-jiminny) $ git push
Enumerating objects: 38, done.
Counting objects: 100% (32/32), done.
Delta compression using up to 8 threads
Compressing objects: 100% (16/16), done.
Writing objects: 100% (18/18), 1.97 KiB | 1008.00 KiB/s, done.
Total 18 (delta 12), reused 0 (delta 0), pack-reused 0
remote: Resolving deltas: 100% (12/12), completed with 9 local objects.
remote:
remote: GitHub found 22 vulnerabilities on jiminny/app's default branch (10 high, 12 moderate). To find out more, visit:
remote: [URL_WITH_CREDENTIALS] ~/jiminny/app (JY-18909-automated-reports-ask-jiminny) $ co master
M .env.local
M app/Console/Commands/JiminnyDebugCommand.php
M app/Http/Controllers/API/ActivityController.php
M app/Jobs/Team/SyncToIntercom.php
M app/Services/PlaybackService.php
M config/logging.php
M routes/web.php
Switched to branch 'master'
Your branch is up to date with 'origin/master'.
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ git pull
Already up to date.
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $
DOCKER
Close Tab
DEV (docker)
Close Tab
APP (-zsh)
Close Tab
-zsh
Close Tab
screenpipe"
Close Tab
-zsh
Close Tab
⌥⌘1
APP (-zsh)...
|
NULL
|
|
55196
|
NULL
|
0
|
2026-04-20T09:37:57.840940+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-20/1776 /Users/lukas/.screenpipe/data/data/2026-04-20/1776677877840_m1.jpg...
|
PhpStorm
|
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Commit and Push…
⌥⌘K
|
[{"role":"AXStaticText","text& [{"role":"AXStaticText","text":"Commit and Push…","depth":5,"bounds":{"left":0.0,"top":0.0,"width":0.08263889,"height":0.024444444},"role_description":"text"},{"role":"AXStaticText","text":"⌥⌘K","depth":5,"bounds":{"left":0.0,"top":0.0,"width":0.04236111,"height":0.024444444},"role_description":"text"}]...
|
2535035496832215689
|
306252506011271184
|
click
|
hybrid
|
NULL
|
Commit and Push…
⌥⌘K
iTerm2ShellEditViewSessionScr Commit and Push…
⌥⌘K
iTerm2ShellEditViewSessionScriptsProfilesWindowHelp‹$0APP (-zsh)883DOCKERO 81DEV (docker)882raw_sql_query.sqltests/Unit/Policies/CanAccessAiReportsTest.phpAPP (-zsh)-zsh• 84no changes added to commit (use "gitadd"and/or "git commit -a")lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny~/jiminny/app (JY-18909-automated-reports-ask-jiminny) $ git pullremote: Enumerating objects: 49,done.remote: Counting objects:100% (49/49),done.remote: Compressing objects: 100% (16/16),done.remote: Total 49 (delta 33), reused 49 (delta 33), pack-reused 0 (from 0)reused o (from 0)Unpacking objects: 100% (49/49), 9.18 KiB | 284.00 KiB/s, done.From github.com:jiminny/app1d10796eec..fec25f3343JY-20701-reschedule-HubSpot-processing -› origin/JY-20701-reschedule-HubSpot-processingAlready up to date.lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny~/jiminny/app (JY-18909-automated-reports-ask-jiminny) $ csfixdocker exec-it docker_lamp_1./vendor/bin/php-cs-fixer fix--config=.php-cs-fixer.dist.php -v --using-cache=no --diffPHP CS Fixer 3.87.1 Alexander by Fabien Potencier, Dariusz Ruminski and contributors.PHPruntime:8.3.30Running analysis on 7 cores with 10 files perprocess.Parallelrunner is an experimental feature and may be unstable, use it at your own risk. Feedback highly appreciated!Loadedconfig default from-php-cs-fixer.dist.php".5603/5603100%+++@@1) app/Http/Controllers/API/V2/AskJiminnyReportsController.php (single_quote)begin diff/home.iminny/app/Http/Controllers/API/V2/AskJiminnyReportsController.php/home/jiminny/app/Http/Controllers/AP1/V2/AskJiminnyReportsController.php-89,7 +89,7 00*/public function update(Request Srequest, string Suuid): JsonResponse\Illuminate\Support\Facades\Log::channel('custom_channel')->info("UPDATE");(Illuminate|Support\Facades\Log::channel('custom_channel')->info('UPDATE');/** @var User Suser */Suser = Srequest->user();ffmpegО ₴85100% C47 8 Mon 20 Apr 12:37:57T₴1|-zsh₴6APPend diffFixed 1 of 5603 files in 42.363 seconds, 60.00 MB memory usedWhat's next:Try Docker Debug for seamless, persistent debugging tools in any container or image » docker debug docker_1amp_1Learn more at https://docs.docker.com/go/debug-cli/lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-18909-automated-reports-ask-jiminny) $D...
|
55194
|
|
55197
|
NULL
|
0
|
2026-04-20T09:37:57.755107+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-20/1776 /Users/lukas/.screenpipe/data/data/2026-04-20/1776677877755_m2.jpg...
|
PhpStorm
|
|
True
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
PhostormVIeWINavigarecodeLaravelKeractorTOOISmelpP PhostormVIeWINavigarecodeLaravelKeractorTOOISmelpProiect© Field.php© FieldRepository.phpD Audio© AskJiminnyReportActivityService.php(c) RequestGenerateAskJiminnyReportJoblest.onpD AutomatedReports• kecuestGenerateaskJiminnykkequestGeneratekeporJoo.orAskJiminnykeporiscontroller.phgVo) Astil© SendReportJob.phpc) senckeponmallJob.ong0 CalendarC) AutomatedReportsCommand.php(c) AutomatedReportsReposb ermC) CreateHeldActivityEvent.phpC) TrackProviderInstalledEventDealRiskSMailboxC) UserPilotActivitvListener.ohv© ActivityLogged.phpC) ReauestGenerateAsk.JiminnvReport.Job.ohv X (C) AutomatedRerclass RequestGenerateAskJiminnyReportJob impublic function handle(l TreamTelenhonvIstatus! => AutomatedRelm Use'media_type' => Automate© BaseProcessingJob.phpC) Dummv.lob.oho© ImportRecallAlRecordingsJob.php© ImportRemoteTrackJob.phpG Job.php(C).lohDisnatcher nhnSactivityIds = $activityServicesavedsearch. ssavedsearch,user. screacorJobDispatcherInterface.phpfrequency: SautomatedReport© PurgeSoftDeletedOpportunityJob 102SqsVisibilityControl.phpLocal chancesSheliConsoleLO0Tv Changes 12 filesE.env.local app© ActivityController.php app/Http/Controllers/API© AskJiminnyReportActivityService.php app/Services/Kiosk/AutomatedReports© AskJiminnyReportActivitvServiceTest.php tests/Unit/Services/Kiosk/AutomatediĐa72e71cc app/Jo© AutomatedReportsService.php app/Services/Kiosk/AutomatedReports© AutomatedReportsServiceTest.php tests/Unit/Services/Kiosk/AutomatedReports© JiminnyDebugCommand.php app/Console/Commandsphp loaaina.php confia€ PlavbackService.phv app/Services$logger->info(self::LOG_PREFIX . ' Fetched activity IDs', [C) Requestcenerateask.iminnvRevoroo,ono aoo/oos AutomatedReoortsi'automatedReportUuid' => $this->reportUuid,@ SvncTolntercom.ohp app/.Jobs/Teamphp web.oho routedUnversioned Files 8 files= env.nikilocal aooE.env.other appc CanAccossAiRenortstlest.nhn tests/Unit/Policies(C) CreateMockAsk.liminnvRenortRecultCommand.nhnann/Console/Commands/ReE ids tyt andTraw sal query sal annC) SimulateWehhooksCommand.nhnann/Console/Commands/Crm/HubsnotMLWERHOOK FIL TERING IMPI EMENTATION mdann= custom.log=laravel.log4 SF jiminny@localhost] XA HS_local (jiminny@localhost]& console [PKol)A console [EU]A console [STAGING]Tx: Autovdojiminny vB10 BI2 XLY4ACommit ChanaesChangelist: Changes437e-a9f9-7e75f8025c22'01V → AutomatedReports 1 fileV © RequestGenerateAskJiminnyReportJob.php^ ^ Team 1 fileAuthor:437e-a9f9-7e75f8025c22'91Amend commit437e-a9f9-7e75f8025c22').Sian-oft commitv = U Services 3 files5 modifiedCommit checksCommit MessageJY-18909 F1x max date check on uodate & include activity fiuteriUpdate copvriahiPoformat codeRearrange codeOptimize importsv Dift0 = 1Y04.Side-by-side viewer -8 a72e71cc app/.../RequestGenerateAskJimDo notignoreHighlight woras1olmerenceCurrent version$activityIds = $activityService->getActivsavedSearch: SsavedSearch,user: ScreatorSactivitvids = CactivitvSenvice->netActivsavedSearch: SsavedSearchusen• Cenpaton.101 Mfrequency: $automatedReport->getFrequ$logger->info(self::L06_PREFIX. ' Fetche'automatedReportUuid' => $this->repon$logger->info(self::L06_PREFIX . ' Fetcheeurrent version'auсomateaкeporcuuld = Schis->repolCancelcommit100% LMon Z0 AOr 12:3/:0/CascadeGroup Photo UrL RevRetactor UserPilot TraFixing Expiration Date+O •Fix alse the tests for this changeThe test uses 2099-01-01 which is clearly more than 1 year away — that still works fine after the fix. The fix only changes theboundary case (same anniversary day, different time). No existing tests break.However, there's a missing test: the boundary case where expires on is exactly 1 year from today with a time componentlater in the day (the scenario that was broken). Let me check if the testValidateAskJiminnyReportDataExpiresTooFar test isRead AutdThe existing tests are fine — 2099-01-01 still fails correctly. What's missing is a test proving that a date exactly 1 year fromnow (with a late time component is accepted, not rejected. Let me look at the end of the test tile to tind where to append:Read AUtoorisservicelest.pho #4100-4142Now let me check the imooris at the too to see what carbon alias is used.Read AutomatedReportsServiceTest.oho #L1-30AutomatedRenortsServiceTest.ohrView alltests/Unit/Services/Kiosk/AutomatedRenorts/MAutomatedRenortcServiceTest.nhv +55*Reject allAccent alliAsk anvthina (&4L)+ « CodeS Adaptive1 differenceSactivitvids= SactivitvService->aetActivitvIdsForSavedSearchdsavedSearch: $savedSearch,usen. Screaton.frequencv: SautomatedRenont->aetFrequencvOrs1oanen-sinfofcolf..I0G ppEFTy , Fetched activity Thetr'automatedReportUuid' => $this->reportUuid.08-64LITE.RIPo 4 spaces...
|
NULL
|
2475662293335397426
|
NULL
|
click
|
ocr
|
NULL
|
PhostormVIeWINavigarecodeLaravelKeractorTOOISmelpP PhostormVIeWINavigarecodeLaravelKeractorTOOISmelpProiect© Field.php© FieldRepository.phpD Audio© AskJiminnyReportActivityService.php(c) RequestGenerateAskJiminnyReportJoblest.onpD AutomatedReports• kecuestGenerateaskJiminnykkequestGeneratekeporJoo.orAskJiminnykeporiscontroller.phgVo) Astil© SendReportJob.phpc) senckeponmallJob.ong0 CalendarC) AutomatedReportsCommand.php(c) AutomatedReportsReposb ermC) CreateHeldActivityEvent.phpC) TrackProviderInstalledEventDealRiskSMailboxC) UserPilotActivitvListener.ohv© ActivityLogged.phpC) ReauestGenerateAsk.JiminnvReport.Job.ohv X (C) AutomatedRerclass RequestGenerateAskJiminnyReportJob impublic function handle(l TreamTelenhonvIstatus! => AutomatedRelm Use'media_type' => Automate© BaseProcessingJob.phpC) Dummv.lob.oho© ImportRecallAlRecordingsJob.php© ImportRemoteTrackJob.phpG Job.php(C).lohDisnatcher nhnSactivityIds = $activityServicesavedsearch. ssavedsearch,user. screacorJobDispatcherInterface.phpfrequency: SautomatedReport© PurgeSoftDeletedOpportunityJob 102SqsVisibilityControl.phpLocal chancesSheliConsoleLO0Tv Changes 12 filesE.env.local app© ActivityController.php app/Http/Controllers/API© AskJiminnyReportActivityService.php app/Services/Kiosk/AutomatedReports© AskJiminnyReportActivitvServiceTest.php tests/Unit/Services/Kiosk/AutomatediĐa72e71cc app/Jo© AutomatedReportsService.php app/Services/Kiosk/AutomatedReports© AutomatedReportsServiceTest.php tests/Unit/Services/Kiosk/AutomatedReports© JiminnyDebugCommand.php app/Console/Commandsphp loaaina.php confia€ PlavbackService.phv app/Services$logger->info(self::LOG_PREFIX . ' Fetched activity IDs', [C) Requestcenerateask.iminnvRevoroo,ono aoo/oos AutomatedReoortsi'automatedReportUuid' => $this->reportUuid,@ SvncTolntercom.ohp app/.Jobs/Teamphp web.oho routedUnversioned Files 8 files= env.nikilocal aooE.env.other appc CanAccossAiRenortstlest.nhn tests/Unit/Policies(C) CreateMockAsk.liminnvRenortRecultCommand.nhnann/Console/Commands/ReE ids tyt andTraw sal query sal annC) SimulateWehhooksCommand.nhnann/Console/Commands/Crm/HubsnotMLWERHOOK FIL TERING IMPI EMENTATION mdann= custom.log=laravel.log4 SF jiminny@localhost] XA HS_local (jiminny@localhost]& console [PKol)A console [EU]A console [STAGING]Tx: Autovdojiminny vB10 BI2 XLY4ACommit ChanaesChangelist: Changes437e-a9f9-7e75f8025c22'01V → AutomatedReports 1 fileV © RequestGenerateAskJiminnyReportJob.php^ ^ Team 1 fileAuthor:437e-a9f9-7e75f8025c22'91Amend commit437e-a9f9-7e75f8025c22').Sian-oft commitv = U Services 3 files5 modifiedCommit checksCommit MessageJY-18909 F1x max date check on uodate & include activity fiuteriUpdate copvriahiPoformat codeRearrange codeOptimize importsv Dift0 = 1Y04.Side-by-side viewer -8 a72e71cc app/.../RequestGenerateAskJimDo notignoreHighlight woras1olmerenceCurrent version$activityIds = $activityService->getActivsavedSearch: SsavedSearch,user: ScreatorSactivitvids = CactivitvSenvice->netActivsavedSearch: SsavedSearchusen• Cenpaton.101 Mfrequency: $automatedReport->getFrequ$logger->info(self::L06_PREFIX. ' Fetche'automatedReportUuid' => $this->repon$logger->info(self::L06_PREFIX . ' Fetcheeurrent version'auсomateaкeporcuuld = Schis->repolCancelcommit100% LMon Z0 AOr 12:3/:0/CascadeGroup Photo UrL RevRetactor UserPilot TraFixing Expiration Date+O •Fix alse the tests for this changeThe test uses 2099-01-01 which is clearly more than 1 year away — that still works fine after the fix. The fix only changes theboundary case (same anniversary day, different time). No existing tests break.However, there's a missing test: the boundary case where expires on is exactly 1 year from today with a time componentlater in the day (the scenario that was broken). Let me check if the testValidateAskJiminnyReportDataExpiresTooFar test isRead AutdThe existing tests are fine — 2099-01-01 still fails correctly. What's missing is a test proving that a date exactly 1 year fromnow (with a late time component is accepted, not rejected. Let me look at the end of the test tile to tind where to append:Read AUtoorisservicelest.pho #4100-4142Now let me check the imooris at the too to see what carbon alias is used.Read AutomatedReportsServiceTest.oho #L1-30AutomatedRenortsServiceTest.ohrView alltests/Unit/Services/Kiosk/AutomatedRenorts/MAutomatedRenortcServiceTest.nhv +55*Reject allAccent alliAsk anvthina (&4L)+ « CodeS Adaptive1 differenceSactivitvids= SactivitvService->aetActivitvIdsForSavedSearchdsavedSearch: $savedSearch,usen. Screaton.frequencv: SautomatedRenont->aetFrequencvOrs1oanen-sinfofcolf..I0G ppEFTy , Fetched activity Thetr'automatedReportUuid' => $this->reportUuid.08-64LITE.RIPo 4 spaces...
|
NULL
|
|
55296
|
NULL
|
0
|
2026-04-20T09:43:07.661048+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-20/1776 /Users/lukas/.screenpipe/data/data/2026-04-20/1776678187661_m1.jpg...
|
Firefox
|
JY-20553 | Improve crm-sync delays by yalokin-jimi JY-20553 | Improve crm-sync delays by yalokin-jiminny · Pull Request #11976 · jiminny/app — Work...
|
True
|
github.com/jiminny/app/pull/11976/changes
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Platform Sprint 2 Q2 - Platform Team - Scrum Board Platform Sprint 2 Q2 - Platform Team - Scrum Board - Jira
JY-20553 | Improve crm-sync delays by yalokin-jiminny · Pull Request #11976 · jiminny/app
JY-20553 | Improve crm-sync delays by yalokin-jiminny · Pull Request #11976 · jiminny/app
Close tab
[SRD-6793] Les Mills activity types not pulling in - Jira
[SRD-6793] Les Mills activity types not pulling in - Jira
JY-20698 handle failed field sync on playbook import activity types by LakyLak · Pull Request #11988 · jiminny/app
JY-20698 handle failed field sync on playbook import activity types by LakyLak · Pull Request #11988 · jiminny/app
JY-20692 change confirmation parameter by LakyLak · Pull Request #11986 · jiminny/app
JY-20692 change confirmation parameter by LakyLak · Pull Request #11986 · jiminny/app
[JY-20543] AJ Reports > Tracking - Jira
[JY-20543] AJ Reports > Tracking - Jira
[JY-18909] [Part2] Automated reports with Ask Jiminny - Jira...
|
[{"role":"AXRadioButton","text [{"role":"AXRadioButton","text":"Platform Sprint 2 Q2 - Platform Team - Scrum Board - Jira","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXRadioButton","text":"JY-20553 | Improve crm-sync delays by yalokin-jiminny · Pull Request #11976 · jiminny/app","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true},{"role":"AXStaticText","text":"JY-20553 | Improve crm-sync delays by yalokin-jiminny · Pull Request #11976 · jiminny/app","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Close tab","depth":5,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXRadioButton","text":"[SRD-6793] Les Mills activity types not pulling in - Jira","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"[SRD-6793] Les Mills activity types not pulling in - Jira","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"JY-20698 handle failed field sync on playbook import activity types by LakyLak · Pull Request #11988 · jiminny/app","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"JY-20698 handle failed field sync on playbook import activity types by LakyLak · Pull Request #11988 · jiminny/app","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"JY-20692 change confirmation parameter by LakyLak · Pull Request #11986 · jiminny/app","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"JY-20692 change confirmation parameter by LakyLak · Pull Request #11986 · jiminny/app","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"[JY-20543] AJ Reports > Tracking - Jira","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"[JY-20543] AJ Reports > Tracking - Jira","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"[JY-18909] [Part2] Automated reports with Ask Jiminny - Jira","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false}]...
|
-654329278458865655
|
6223266628974356375
|
click
|
accessibility
|
NULL
|
Platform Sprint 2 Q2 - Platform Team - Scrum Board Platform Sprint 2 Q2 - Platform Team - Scrum Board - Jira
JY-20553 | Improve crm-sync delays by yalokin-jiminny · Pull Request #11976 · jiminny/app
JY-20553 | Improve crm-sync delays by yalokin-jiminny · Pull Request #11976 · jiminny/app
Close tab
[SRD-6793] Les Mills activity types not pulling in - Jira
[SRD-6793] Les Mills activity types not pulling in - Jira
JY-20698 handle failed field sync on playbook import activity types by LakyLak · Pull Request #11988 · jiminny/app
JY-20698 handle failed field sync on playbook import activity types by LakyLak · Pull Request #11988 · jiminny/app
JY-20692 change confirmation parameter by LakyLak · Pull Request #11986 · jiminny/app
JY-20692 change confirmation parameter by LakyLak · Pull Request #11986 · jiminny/app
[JY-20543] AJ Reports > Tracking - Jira
[JY-20543] AJ Reports > Tracking - Jira
[JY-18909] [Part2] Automated reports with Ask Jiminny - Jira...
|
55295
|
|
55300
|
NULL
|
0
|
2026-04-20T09:43:16.616726+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-20/1776 /Users/lukas/.screenpipe/data/data/2026-04-20/1776678196616_m2.jpg...
|
Firefox
|
JY-20553 | Improve crm-sync delays by yalokin-jimi JY-20553 | Improve crm-sync delays by yalokin-jiminny · Pull Request #11976 · jiminny/app — Work...
|
True
|
github.com/jiminny/app/pull/11976/changes
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Platform Sprint 2 Q2 - Platform Team - Scrum Board Platform Sprint 2 Q2 - Platform Team - Scrum Board - Jira
JY-20553 | Improve crm-sync delays by yalokin-jiminny · Pull Request #11976 · jiminny/app
JY-20553 | Improve crm-sync delays by yalokin-jiminny · Pull Request #11976 · jiminny/app
Close tab
[SRD-6793] Les Mills activity types not pulling in - Jira
[SRD-6793] Les Mills activity types not pulling in - Jira
JY-20698 handle failed field sync on playbook import activity types by LakyLak · Pull Request #11988 · jiminny/app
JY-20698 handle failed field sync on playbook import activity types by LakyLak · Pull Request #11988 · jiminny/app
JY-20692 change confirmation parameter by LakyLak · Pull Request #11986 · jiminny/app
JY-20692 change confirmation parameter by LakyLak · Pull Request #11986 · jiminny/app
[JY-20543] AJ Reports > Tracking - Jira
[JY-20543] AJ Reports > Tracking - Jira
[JY-18909] [Part2] Automated reports with Ask Jiminny - Jira
[JY-18909] [Part2] Automated reports with Ask Jiminny - Jira
Ask Jiminny Reports by nikolay-yankov · Pull Request #11894 · jiminny/app
Ask Jiminny Reports by nikolay-yankov · Pull Request #11894 · jiminny/app
New Tab
New Tab
Product Growth Platform | Userpilot
Product Growth Platform | Userpilot
Userpilot | Logged-activity
Userpilot | Logged-activity
fix(security): composer dependency updates – 2026-04-15 by github-actions[bot] · Pull Request #11970 · jiminny/app
fix(security): composer dependency updates – 2026-04-15 by github-actions[bot] · Pull Request #11970 · jiminny/app
Pipelines - jiminny/app
Pipelines - jiminny/app
Feed — jiminny — Sentry
Feed — jiminny — Sentry
fix(security): composer dependency updates – 2026-04-15 by github-actions[bot] · Pull Request #11970 · jiminny/app
fix(security): composer dependency updates – 2026-04-15 by github-actions[bot] · Pull Request #11970 · jiminny/app
Jiminny
Jiminny
Jiminny
Jiminny
Jiminny
Jiminny
New Tab
Customize sidebar
Close Google Gemini (⌃X)
Tabs from other devices
Open history (⇧⌘H)
Open bookmarks (⌘B)
AI Chat settings
Close
WORK, Google Account: [EMAIL]
Main menu
New chat
Gemini
PRO
PRO
Conversation with Gemini
Conversation with Gemini
Copy prompt
Edit
You said checkout to remote branch
You said
checkout to remote branch
Show more options
Enter a prompt for Gemini
encrypted
Enter a prompt for Gemini
encrypted
Open upload file menu
Tools
Open mode picker
Pro
Stop response
Your Jiminny chats aren’t used to improve our models. Gemini is AI and can make mistakes, including about people.
Your privacy & Gemini Opens in a new window
Your privacy & Gemini
Opens in a new window
Gemini is typing
Summarize page
Summarize page
Skip to content
Skip to content
Open menu
Homepage (g then d)
jiminny
jiminny
app
app
Search or jump to…
Type
/
to search
Chat with Copilot
Open Copilot…
Create new...
Issues(g then i)
Pull requests
Repositories
You have unread notifications(g then n)
Open user navigation menu
Repository navigation
Repository navigation
Code
Code
Pull requests (31)
Pull requests
(
31
)
Agents
Agents
Actions
Actions
Wiki
Wiki
Security and quality (22)
Security and quality
(
22
)
Insights
Insights
Settings
Settings
Important update
Important update
On April 24 we'll start using GitHub Copilot interaction data for AI model training unless you opt out.
Review this update
Review this update
and manage your preferences in your
GitHub account settings
GitHub account settings
.
Dismiss banner
JY-20553 | Improve crm-sync delays #11976 Edit title
JY-20553 | Improve crm-sync delays
#
11976
Edit title
Preview
Preview
Checks pending
Checks pending
Code
Code
Open
yalokin-jiminny
yalokin-jiminny
wants to merge 21 commits into
master
master
from
JY-20553-debug-crm-sync-delays
JY-20553-debug-crm-sync-delays
Copy head branch name to clipboard
Lines changed: 907 additions & 132 deletions
Conversation (5)
Conversation
(
5
)
Commits (21)
Commits
(
21
)
Checks (2)
Checks
(
2
)
Files changed (14)
Files changed
(
14
)
Pull Request Toolbar
Pull Request Toolbar
Collapse file tree
Open
JY-20553 | Improve crm-sync delays
JY-20553 | Improve crm-sync delays
#
11976
All commits
All commits
yalokin-jiminny
yalokin-jiminny
wants to merge 21 commits into
master
master
from
JY-20553-debug-crm-sync-delays
JY-20553-debug-crm-sync-delays
Copy head branch name to clipboard
0
/
14
viewed
Checks pending
Checks pending
Submit review
Submit
review
Open diff view settings
Open overview panel
Open comments panel
(
0
)
Filter files…
Filter options
File tree
File tree
app
Console/Commands/Crm
SyncObjects.php
SyncObjects.php
Http/Controllers
Internal/WebhookReceiver
HubspotController.php
HubspotController.php
Webhook/Hubspot
EventsController.php
EventsController.php
ProcessesWebhooksTrait.php
ProcessesWebhooksTrait.php
Jobs/Crm
SyncObjects.php
SyncObjects.php
SyncOpportunitiesJob.php
SyncOpportunitiesJob.php
Services/Crm
Hubspot/ServiceTraits
OpportunitySyncTrait.php
OpportunitySyncTrait.php
BaseService.php
BaseService.php
tests
Feature/Services/Crm
BaseServiceTest.php
BaseServiceTest.php
Unit
Http/Controllers/Webhook/Hubspot
ProcessesWebhooksTraitTest.php
ProcessesWebhooksTraitTest.php
Jobs/Crm
SyncObjectsTest.php...
|
[{"role":"AXRadioButton","text [{"role":"AXRadioButton","text":"Platform Sprint 2 Q2 - Platform Team - Scrum Board - Jira","depth":4,"bounds":{"left":0.0018284575,"top":0.0518755,"width":0.07596409,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXRadioButton","text":"JY-20553 | Improve crm-sync delays by yalokin-jiminny · Pull Request #11976 · jiminny/app","depth":4,"bounds":{"left":0.0,"top":0.09497207,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true},{"role":"AXStaticText","text":"JY-20553 | Improve crm-sync delays by yalokin-jiminny · Pull Request #11976 · jiminny/app","depth":5,"bounds":{"left":0.013297873,"top":0.10614525,"width":0.15774602,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Close tab","depth":5,"bounds":{"left":0.06732048,"top":0.10215483,"width":0.007978723,"height":0.01915403},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXRadioButton","text":"[SRD-6793] Les Mills activity types not pulling in - Jira","depth":4,"bounds":{"left":0.0,"top":0.12769353,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"[SRD-6793] Les Mills activity types not pulling in - Jira","depth":5,"bounds":{"left":0.013297873,"top":0.13886672,"width":0.09524601,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"JY-20698 handle failed field sync on playbook import activity types by LakyLak · Pull Request #11988 · jiminny/app","depth":4,"bounds":{"left":0.0,"top":0.16041501,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"JY-20698 handle failed field sync on playbook import activity types by LakyLak · Pull Request #11988 · jiminny/app","depth":5,"bounds":{"left":0.013297873,"top":0.17158818,"width":0.19963431,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"JY-20692 change confirmation parameter by LakyLak · Pull Request #11986 · jiminny/app","depth":4,"bounds":{"left":0.0,"top":0.19313647,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"JY-20692 change confirmation parameter by LakyLak · Pull Request #11986 · jiminny/app","depth":5,"bounds":{"left":0.013297873,"top":0.20430966,"width":0.15525267,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"[JY-20543] AJ Reports > Tracking - Jira","depth":4,"bounds":{"left":0.0,"top":0.22585794,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"[JY-20543] AJ Reports > Tracking - Jira","depth":5,"bounds":{"left":0.013297873,"top":0.23703113,"width":0.06981383,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"[JY-18909] [Part2] Automated reports with Ask Jiminny - Jira","depth":4,"bounds":{"left":0.0,"top":0.2585794,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"[JY-18909] [Part2] Automated reports with Ask Jiminny - Jira","depth":5,"bounds":{"left":0.013297873,"top":0.2697526,"width":0.10688165,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Ask Jiminny Reports by nikolay-yankov · Pull Request #11894 · jiminny/app","depth":4,"bounds":{"left":0.0,"top":0.29130086,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Ask Jiminny Reports by nikolay-yankov · Pull Request #11894 · jiminny/app","depth":5,"bounds":{"left":0.013297873,"top":0.30247405,"width":0.12915559,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"New Tab","depth":4,"bounds":{"left":0.0,"top":0.32402235,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"New Tab","depth":5,"bounds":{"left":0.013297873,"top":0.33519554,"width":0.014960106,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Product Growth Platform | Userpilot","depth":4,"bounds":{"left":0.0,"top":0.3567438,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Product Growth Platform | Userpilot","depth":5,"bounds":{"left":0.013297873,"top":0.367917,"width":0.06200133,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Userpilot | Logged-activity","depth":4,"bounds":{"left":0.0,"top":0.38946527,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Userpilot | Logged-activity","depth":5,"bounds":{"left":0.013297873,"top":0.40063846,"width":0.04637633,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"fix(security): composer dependency updates – 2026-04-15 by github-actions[bot] · Pull Request #11970 · jiminny/app","depth":4,"bounds":{"left":0.0,"top":0.42218676,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"fix(security): composer dependency updates – 2026-04-15 by github-actions[bot] · Pull Request #11970 · jiminny/app","depth":5,"bounds":{"left":0.013297873,"top":0.43335995,"width":0.2052859,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Pipelines - jiminny/app","depth":4,"bounds":{"left":0.0,"top":0.45490822,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Pipelines - jiminny/app","depth":5,"bounds":{"left":0.013297873,"top":0.4660814,"width":0.039228722,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Feed — jiminny — Sentry","depth":4,"bounds":{"left":0.0,"top":0.48762968,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Feed — jiminny — Sentry","depth":5,"bounds":{"left":0.013297873,"top":0.49880287,"width":0.042719416,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"fix(security): composer dependency updates – 2026-04-15 by github-actions[bot] · Pull Request #11970 · jiminny/app","depth":4,"bounds":{"left":0.0,"top":0.5203512,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"fix(security): composer dependency updates – 2026-04-15 by github-actions[bot] · Pull Request #11970 · jiminny/app","depth":5,"bounds":{"left":0.013297873,"top":0.53152436,"width":0.2052859,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Jiminny","depth":4,"bounds":{"left":0.0,"top":0.55307263,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Jiminny","depth":5,"bounds":{"left":0.013297873,"top":0.5642458,"width":0.013131649,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Jiminny","depth":4,"bounds":{"left":0.0,"top":0.5857941,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Jiminny","depth":5,"bounds":{"left":0.013297873,"top":0.5969673,"width":0.013131649,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Jiminny","depth":4,"bounds":{"left":0.0,"top":0.61851555,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Jiminny","depth":5,"bounds":{"left":0.013297873,"top":0.62968874,"width":0.013131649,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"New Tab","depth":4,"bounds":{"left":0.0028257978,"top":0.6528332,"width":0.07413564,"height":0.025538707},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Customize sidebar","depth":6,"bounds":{"left":0.0028257978,"top":0.97007185,"width":0.010638298,"height":0.025538707},"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Close Google Gemini (⌃X)","depth":6,"bounds":{"left":0.013796543,"top":0.97007185,"width":0.010638298,"height":0.025538707},"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Tabs from other devices","depth":6,"bounds":{"left":0.024933511,"top":0.97007185,"width":0.010638298,"height":0.025538707},"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Open history (⇧⌘H)","depth":6,"bounds":{"left":0.036070477,"top":0.97007185,"width":0.010638298,"height":0.025538707},"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Open bookmarks (⌘B)","depth":6,"bounds":{"left":0.04720745,"top":0.97007185,"width":0.010638298,"height":0.025538707},"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"AI Chat settings","depth":7,"bounds":{"left":0.1846742,"top":0.055067837,"width":0.010638298,"height":0.025538707},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close","depth":7,"bounds":{"left":0.1966423,"top":0.055067837,"width":0.010638298,"height":0.025538707},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"WORK, Google Account: lukas.kovalik@jiminny.com","depth":12,"bounds":{"left":0.1939827,"top":0.103751,"width":0.013297873,"height":0.031923383},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Main menu","depth":12,"bounds":{"left":0.08361037,"top":0.103751,"width":0.013297873,"height":0.031923383},"role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"New chat","depth":12,"bounds":{"left":0.09690824,"top":0.10454908,"width":0.028590426,"height":0.030327214},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Gemini","depth":15,"bounds":{"left":0.099567816,"top":0.10973663,"width":0.021941489,"height":0.020351157},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"PRO","depth":11,"bounds":{"left":0.17719415,"top":0.110135674,"width":0.014793883,"height":0.01915403},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":false,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"PRO","depth":13,"bounds":{"left":0.17985372,"top":0.112529926,"width":0.009474734,"height":0.014764565},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Conversation with Gemini","depth":15,"bounds":{"left":0.079288565,"top":0.14764565,"width":0.0003324468,"height":0.0007980846},"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Conversation with Gemini","depth":16,"bounds":{"left":0.079288565,"top":0.15003991,"width":0.1200133,"height":0.025538707},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Copy prompt","depth":20,"bounds":{"left":0.1022274,"top":0.18355946,"width":0.013297873,"height":0.031923383},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Edit","depth":20,"bounds":{"left":0.116855055,"top":0.18355946,"width":0.013297873,"height":0.031923383},"role_description":"button","subrole":"AXUnknown","is_enabled":false,"is_focused":false,"is_selected":false},{"role":"AXHeading","text":"You said checkout to remote branch","depth":20,"bounds":{"left":0.13680187,"top":0.19313647,"width":0.065159574,"height":0.044692736},"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"You said","depth":22,"bounds":{"left":0.079288565,"top":0.19553073,"width":0.019946808,"height":0.016360734},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"checkout to remote branch","depth":22,"bounds":{"left":0.13680187,"top":0.1963288,"width":0.04737367,"height":0.038707104},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Show more options","depth":18,"bounds":{"left":0.1939827,"top":0.26656026,"width":0.013297873,"height":0.031923383},"role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXTextArea","text":"Enter a prompt for Gemini\nencrypted","depth":20,"bounds":{"left":0.09291888,"top":0.8104549,"width":0.10638298,"height":0.01915403},"value":"Enter a prompt for Gemini\nencrypted","help_text":"","role_description":"text entry area","subrole":"AXUnknown","is_enabled":true,"is_focused":true,"is_selected":false},{"role":"AXStaticText","text":"Enter a prompt for Gemini","depth":21,"bounds":{"left":0.099567816,"top":0.81085396,"width":0.069980055,"height":0.018355945},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"encrypted","depth":21,"bounds":{"left":0.091921546,"top":0.8104549,"width":0.0066489363,"height":0.01915403},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Open upload file menu","depth":20,"bounds":{"left":0.08892952,"top":0.8447725,"width":0.013297873,"height":0.031923383},"role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Tools","depth":18,"bounds":{"left":0.10488697,"top":0.8447725,"width":0.013297873,"height":0.031923383},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Open mode picker","depth":20,"bounds":{"left":0.1619016,"top":0.8439745,"width":0.026097074,"height":0.031923383},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Pro","depth":23,"bounds":{"left":0.16722074,"top":0.8527534,"width":0.007480053,"height":0.014764565},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Stop response","depth":19,"bounds":{"left":0.18932846,"top":0.84317636,"width":0.013962766,"height":0.033519555},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Your Jiminny chats aren’t used to improve our models. Gemini is AI and can make mistakes, including about people.","depth":17,"bounds":{"left":0.0852726,"top":0.896249,"width":0.12167553,"height":0.025139665},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Your privacy & Gemini Opens in a new window","depth":17,"bounds":{"left":0.12599733,"top":0.92178774,"width":0.040226065,"height":0.012370312},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Your privacy & Gemini","depth":18,"bounds":{"left":0.12599733,"top":0.92178774,"width":0.040226065,"height":0.012370312},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Opens in a new window","depth":19,"bounds":{"left":0.079288565,"top":0.92098963,"width":0.043218084,"height":0.012370312},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Gemini is typing","depth":9,"bounds":{"left":0.079288565,"top":0.091380686,"width":0.035738032,"height":0.012769354},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Summarize page","depth":7,"bounds":{"left":0.08494016,"top":0.95730245,"width":0.053523935,"height":0.025538707},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Summarize page","depth":9,"bounds":{"left":0.09059176,"top":0.96249,"width":0.042220745,"height":0.015163607},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Skip to content","depth":6,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Skip to content","depth":7,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Open menu","depth":10,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"Homepage (g then d)","depth":9,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"jiminny","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"jiminny","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"app","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"app","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Search or jump to…","depth":9,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Type","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"/","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"to search","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Chat with Copilot","depth":10,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXMenuButton","text":"Open Copilot…","depth":9,"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXMenuButton","text":"Create new...","depth":9,"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXLink","text":"Issues(g then i)","depth":9,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"Pull requests","depth":9,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"Repositories","depth":9,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"You have unread notifications(g then n)","depth":9,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Open user navigation menu","depth":9,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXHeading","text":"Repository navigation","depth":9,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Repository navigation","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Code","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Code","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Pull requests (31)","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Pull requests","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"(","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"31","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":")","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Agents","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Agents","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Actions","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Actions","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Wiki","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Wiki","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Security and quality (22)","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Security and quality","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"(","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"22","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":")","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Insights","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Insights","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Settings","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Settings","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Important update","depth":10,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Important update","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"On April 24 we'll start using GitHub Copilot interaction data for AI model training unless you opt out.","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Review this update","depth":10,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Review this update","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"and manage your preferences in your","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"GitHub account settings","depth":10,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"GitHub account settings","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":".","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Dismiss banner","depth":9,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXHeading","text":"JY-20553 | Improve crm-sync delays #11976 Edit title","depth":13,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"JY-20553 | Improve crm-sync delays","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"#","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"11976","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Edit title","depth":14,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXMenuButton","text":"Preview","depth":13,"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Preview","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Checks pending","depth":13,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Checks pending","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXMenuButton","text":"Code","depth":13,"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Code","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Open","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"yalokin-jiminny","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"yalokin-jiminny","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"wants to merge 21 commits into","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"master","depth":15,"role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"master","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"from","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"JY-20553-debug-crm-sync-delays","depth":16,"role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"JY-20553-debug-crm-sync-delays","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Copy head branch name to clipboard","depth":16,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Lines changed: 907 additions & 132 deletions","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Conversation (5)","depth":16,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Conversation","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"(","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"5","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":")","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Commits (21)","depth":16,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Commits","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"(","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"21","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":")","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Checks (2)","depth":16,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Checks","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"(","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"2","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":")","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Files changed (14)","depth":16,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true},{"role":"AXStaticText","text":"Files changed","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"(","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"14","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":")","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Pull Request Toolbar","depth":14,"bounds":{"left":0.22606383,"top":0.07581804,"width":0.0003324468,"height":0.0007980846},"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Pull Request Toolbar","depth":15,"bounds":{"left":0.22606383,"top":0.07861133,"width":0.030086435,"height":0.08060654},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Collapse file tree","depth":14,"bounds":{"left":0.22606383,"top":0.0650439,"width":0.00930851,"height":0.022346368},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":true},{"role":"AXStaticText","text":"Open","depth":14,"bounds":{"left":0.2486702,"top":0.06943336,"width":0.011968086,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"JY-20553 | Improve crm-sync delays","depth":14,"bounds":{"left":0.26728722,"top":0.058260176,"width":0.08294548,"height":0.016759777},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"JY-20553 | Improve crm-sync delays","depth":16,"bounds":{"left":0.26728722,"top":0.059856344,"width":0.08294548,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"#","depth":15,"bounds":{"left":0.35289228,"top":0.059856344,"width":0.0029920214,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"11976","depth":15,"bounds":{"left":0.3558843,"top":0.059856344,"width":0.012466756,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"All commits","depth":14,"bounds":{"left":0.26462767,"top":0.07182761,"width":0.03374335,"height":0.022346368},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"All commits","depth":16,"bounds":{"left":0.26761967,"top":0.07701516,"width":0.02244016,"height":0.011971269},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"yalokin-jiminny","depth":15,"bounds":{"left":0.30269283,"top":0.07581804,"width":0.029920213,"height":0.014365523},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"yalokin-jiminny","depth":16,"bounds":{"left":0.30269283,"top":0.07701516,"width":0.029920213,"height":0.011971269},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"wants to merge 21 commits into","depth":15,"bounds":{"left":0.33394283,"top":0.07701516,"width":0.059674203,"height":0.011971269},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"master","depth":15,"bounds":{"left":0.3949468,"top":0.074221864,"width":0.018450798,"height":0.017557861},"role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"master","depth":16,"bounds":{"left":0.39694148,"top":0.07741421,"width":0.014461436,"height":0.011572227},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"from","depth":16,"bounds":{"left":0.4147274,"top":0.07701516,"width":0.008643617,"height":0.011971269},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"JY-20553-debug-crm-sync-delays","depth":16,"bounds":{"left":0.4247008,"top":0.074221864,"width":0.07596409,"height":0.017557861},"role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"JY-20553-debug-crm-sync-delays","depth":17,"bounds":{"left":0.42669547,"top":0.07741421,"width":0.07197473,"height":0.011572227},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Copy head branch name to clipboard","depth":16,"bounds":{"left":0.50199467,"top":0.07182761,"width":0.00930851,"height":0.022346368},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"0","depth":15,"bounds":{"left":0.8231383,"top":0.070231445,"width":0.002493351,"height":0.011971269},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"/","depth":15,"bounds":{"left":0.8256317,"top":0.070231445,"width":0.0023271276,"height":0.011971269},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"14","depth":15,"bounds":{"left":0.82912236,"top":0.070231445,"width":0.004654255,"height":0.011971269},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"viewed","depth":15,"bounds":{"left":0.83477396,"top":0.070231445,"width":0.013297873,"height":0.011971269},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Checks pending","depth":14,"bounds":{"left":0.85638297,"top":0.0650439,"width":0.04338431,"height":0.022346368},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Checks pending","depth":16,"bounds":{"left":0.86602396,"top":0.070231445,"width":0.030751329,"height":0.011971269},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Submit review","depth":14,"bounds":{"left":0.90242684,"top":0.0650439,"width":0.03856383,"height":0.022346368},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Submit","depth":16,"bounds":{"left":0.9054189,"top":0.070231445,"width":0.014793883,"height":0.011971269},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"review","depth":16,"bounds":{"left":0.92021275,"top":0.070231445,"width":0.012466756,"height":0.011971269},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXMenuButton","text":"Open diff view settings","depth":14,"bounds":{"left":0.94365025,"top":0.0650439,"width":0.00930851,"height":0.022346368},"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Open overview panel","depth":14,"bounds":{"left":0.96127,"top":0.0650439,"width":0.00930851,"height":0.022346368},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Open comments panel","depth":14,"bounds":{"left":0.9719083,"top":0.0650439,"width":0.017287234,"height":0.022346368},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"(","depth":16,"bounds":{"left":0.9802194,"top":0.070231445,"width":0.0026595744,"height":0.011971269},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"0","depth":16,"bounds":{"left":0.982879,"top":0.070231445,"width":0.0026595744,"height":0.011971269},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":")","depth":16,"bounds":{"left":0.98553854,"top":0.070231445,"width":0.0014960107,"height":0.011971269},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXTextField","text":"Filter files…","depth":16,"bounds":{"left":0.23736702,"top":0.11332801,"width":0.06815159,"height":0.023942538},"help_text":"","role_description":"text field","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXMenuButton","text":"Filter options","depth":16,"bounds":{"left":0.30851063,"top":0.112529926,"width":0.010638298,"height":0.025538707},"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXHeading","text":"File tree","depth":15,"bounds":{"left":0.22639628,"top":0.15083799,"width":0.0003324468,"height":0.0007980846},"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"File tree","depth":16,"bounds":{"left":0.22639628,"top":0.15363128,"width":0.014295213,"height":0.0518755},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"app","depth":19,"bounds":{"left":0.24235372,"top":0.15722266,"width":0.008144947,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Console/Commands/Crm","depth":21,"bounds":{"left":0.2450133,"top":0.18276137,"width":0.053690158,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"SyncObjects.php","depth":23,"bounds":{"left":0.24767287,"top":0.20830008,"width":0.036901597,"height":0.013567438},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"SyncObjects.php","depth":24,"bounds":{"left":0.24767287,"top":0.20830008,"width":0.036901597,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Http/Controllers","depth":21,"bounds":{"left":0.2450133,"top":0.23383878,"width":0.034408245,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Internal/WebhookReceiver","depth":23,"bounds":{"left":0.24767287,"top":0.25977653,"width":0.05618351,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"HubspotController.php","depth":25,"bounds":{"left":0.25033244,"top":0.28531525,"width":0.04886968,"height":0.013567438},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"HubspotController.php","depth":26,"bounds":{"left":0.25033244,"top":0.28531525,"width":0.04886968,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Webhook/Hubspot","depth":23,"bounds":{"left":0.24767287,"top":0.31085396,"width":0.039893616,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"EventsController.php","depth":25,"bounds":{"left":0.25033244,"top":0.3367917,"width":0.04488032,"height":0.013567438},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"EventsController.php","depth":26,"bounds":{"left":0.25033244,"top":0.3367917,"width":0.04488032,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"ProcessesWebhooksTrait.php","depth":25,"bounds":{"left":0.25033244,"top":0.3623304,"width":0.06333112,"height":0.013567438},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"ProcessesWebhooksTrait.php","depth":26,"bounds":{"left":0.25033244,"top":0.3623304,"width":0.06333112,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Jobs/Crm","depth":21,"bounds":{"left":0.2450133,"top":0.38786912,"width":0.020777926,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"SyncObjects.php","depth":23,"bounds":{"left":0.24767287,"top":0.41340783,"width":0.036901597,"height":0.013567438},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"SyncObjects.php","depth":24,"bounds":{"left":0.24767287,"top":0.41340783,"width":0.036901597,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"SyncOpportunitiesJob.php","depth":23,"bounds":{"left":0.24767287,"top":0.43894652,"width":0.057513297,"height":0.013567438},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"SyncOpportunitiesJob.php","depth":24,"bounds":{"left":0.24767287,"top":0.43894652,"width":0.057513297,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Services/Crm","depth":21,"bounds":{"left":0.2450133,"top":0.46448523,"width":0.028756648,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Hubspot/ServiceTraits","depth":23,"bounds":{"left":0.24767287,"top":0.49002394,"width":0.04720745,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"OpportunitySyncTrait.php","depth":25,"bounds":{"left":0.25033244,"top":0.5159617,"width":0.05518617,"height":0.013567438},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"OpportunitySyncTrait.php","depth":26,"bounds":{"left":0.25033244,"top":0.5159617,"width":0.05518617,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"BaseService.php","depth":23,"bounds":{"left":0.24767287,"top":0.5415004,"width":0.036070477,"height":0.013567438},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"BaseService.php","depth":24,"bounds":{"left":0.24767287,"top":0.5415004,"width":0.036070477,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"tests","depth":19,"bounds":{"left":0.24235372,"top":0.56703913,"width":0.010638298,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Feature/Services/Crm","depth":21,"bounds":{"left":0.2450133,"top":0.5925778,"width":0.04654255,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"BaseServiceTest.php","depth":23,"bounds":{"left":0.24767287,"top":0.61851555,"width":0.044714097,"height":0.013567438},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"BaseServiceTest.php","depth":24,"bounds":{"left":0.24767287,"top":0.61851555,"width":0.044714097,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Unit","depth":21,"bounds":{"left":0.2450133,"top":0.6440543,"width":0.00880984,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Http/Controllers/Webhook/Hubspot","depth":23,"bounds":{"left":0.24767287,"top":0.669593,"width":0.07579787,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"ProcessesWebhooksTraitTest.php","depth":25,"bounds":{"left":0.25033244,"top":0.69513166,"width":0.072140954,"height":0.013567438},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"ProcessesWebhooksTraitTest.php","depth":26,"bounds":{"left":0.25033244,"top":0.69513166,"width":0.072140954,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Jobs/Crm","depth":23,"bounds":{"left":0.24767287,"top":0.7206704,"width":0.020777926,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"SyncObjectsTest.php","depth":25,"bounds":{"left":0.25033244,"top":0.74660814,"width":0.045545213,"height":0.013567438},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false}]...
|
-3350738637795311336
|
-2678105760012015840
|
visual_change
|
accessibility
|
NULL
|
Platform Sprint 2 Q2 - Platform Team - Scrum Board Platform Sprint 2 Q2 - Platform Team - Scrum Board - Jira
JY-20553 | Improve crm-sync delays by yalokin-jiminny · Pull Request #11976 · jiminny/app
JY-20553 | Improve crm-sync delays by yalokin-jiminny · Pull Request #11976 · jiminny/app
Close tab
[SRD-6793] Les Mills activity types not pulling in - Jira
[SRD-6793] Les Mills activity types not pulling in - Jira
JY-20698 handle failed field sync on playbook import activity types by LakyLak · Pull Request #11988 · jiminny/app
JY-20698 handle failed field sync on playbook import activity types by LakyLak · Pull Request #11988 · jiminny/app
JY-20692 change confirmation parameter by LakyLak · Pull Request #11986 · jiminny/app
JY-20692 change confirmation parameter by LakyLak · Pull Request #11986 · jiminny/app
[JY-20543] AJ Reports > Tracking - Jira
[JY-20543] AJ Reports > Tracking - Jira
[JY-18909] [Part2] Automated reports with Ask Jiminny - Jira
[JY-18909] [Part2] Automated reports with Ask Jiminny - Jira
Ask Jiminny Reports by nikolay-yankov · Pull Request #11894 · jiminny/app
Ask Jiminny Reports by nikolay-yankov · Pull Request #11894 · jiminny/app
New Tab
New Tab
Product Growth Platform | Userpilot
Product Growth Platform | Userpilot
Userpilot | Logged-activity
Userpilot | Logged-activity
fix(security): composer dependency updates – 2026-04-15 by github-actions[bot] · Pull Request #11970 · jiminny/app
fix(security): composer dependency updates – 2026-04-15 by github-actions[bot] · Pull Request #11970 · jiminny/app
Pipelines - jiminny/app
Pipelines - jiminny/app
Feed — jiminny — Sentry
Feed — jiminny — Sentry
fix(security): composer dependency updates – 2026-04-15 by github-actions[bot] · Pull Request #11970 · jiminny/app
fix(security): composer dependency updates – 2026-04-15 by github-actions[bot] · Pull Request #11970 · jiminny/app
Jiminny
Jiminny
Jiminny
Jiminny
Jiminny
Jiminny
New Tab
Customize sidebar
Close Google Gemini (⌃X)
Tabs from other devices
Open history (⇧⌘H)
Open bookmarks (⌘B)
AI Chat settings
Close
WORK, Google Account: [EMAIL]
Main menu
New chat
Gemini
PRO
PRO
Conversation with Gemini
Conversation with Gemini
Copy prompt
Edit
You said checkout to remote branch
You said
checkout to remote branch
Show more options
Enter a prompt for Gemini
encrypted
Enter a prompt for Gemini
encrypted
Open upload file menu
Tools
Open mode picker
Pro
Stop response
Your Jiminny chats aren’t used to improve our models. Gemini is AI and can make mistakes, including about people.
Your privacy & Gemini Opens in a new window
Your privacy & Gemini
Opens in a new window
Gemini is typing
Summarize page
Summarize page
Skip to content
Skip to content
Open menu
Homepage (g then d)
jiminny
jiminny
app
app
Search or jump to…
Type
/
to search
Chat with Copilot
Open Copilot…
Create new...
Issues(g then i)
Pull requests
Repositories
You have unread notifications(g then n)
Open user navigation menu
Repository navigation
Repository navigation
Code
Code
Pull requests (31)
Pull requests
(
31
)
Agents
Agents
Actions
Actions
Wiki
Wiki
Security and quality (22)
Security and quality
(
22
)
Insights
Insights
Settings
Settings
Important update
Important update
On April 24 we'll start using GitHub Copilot interaction data for AI model training unless you opt out.
Review this update
Review this update
and manage your preferences in your
GitHub account settings
GitHub account settings
.
Dismiss banner
JY-20553 | Improve crm-sync delays #11976 Edit title
JY-20553 | Improve crm-sync delays
#
11976
Edit title
Preview
Preview
Checks pending
Checks pending
Code
Code
Open
yalokin-jiminny
yalokin-jiminny
wants to merge 21 commits into
master
master
from
JY-20553-debug-crm-sync-delays
JY-20553-debug-crm-sync-delays
Copy head branch name to clipboard
Lines changed: 907 additions & 132 deletions
Conversation (5)
Conversation
(
5
)
Commits (21)
Commits
(
21
)
Checks (2)
Checks
(
2
)
Files changed (14)
Files changed
(
14
)
Pull Request Toolbar
Pull Request Toolbar
Collapse file tree
Open
JY-20553 | Improve crm-sync delays
JY-20553 | Improve crm-sync delays
#
11976
All commits
All commits
yalokin-jiminny
yalokin-jiminny
wants to merge 21 commits into
master
master
from
JY-20553-debug-crm-sync-delays
JY-20553-debug-crm-sync-delays
Copy head branch name to clipboard
0
/
14
viewed
Checks pending
Checks pending
Submit review
Submit
review
Open diff view settings
Open overview panel
Open comments panel
(
0
)
Filter files…
Filter options
File tree
File tree
app
Console/Commands/Crm
SyncObjects.php
SyncObjects.php
Http/Controllers
Internal/WebhookReceiver
HubspotController.php
HubspotController.php
Webhook/Hubspot
EventsController.php
EventsController.php
ProcessesWebhooksTrait.php
ProcessesWebhooksTrait.php
Jobs/Crm
SyncObjects.php
SyncObjects.php
SyncOpportunitiesJob.php
SyncOpportunitiesJob.php
Services/Crm
Hubspot/ServiceTraits
OpportunitySyncTrait.php
OpportunitySyncTrait.php
BaseService.php
BaseService.php
tests
Feature/Services/Crm
BaseServiceTest.php
BaseServiceTest.php
Unit
Http/Controllers/Webhook/Hubspot
ProcessesWebhooksTraitTest.php
ProcessesWebhooksTraitTest.php
Jobs/Crm
SyncObjectsTest.php...
|
55299
|
|
55384
|
NULL
|
0
|
2026-04-20T09:48:17.627600+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-20/1776 /Users/lukas/.screenpipe/data/data/2026-04-20/1776678497627_m1.jpg...
|
Firefox
|
JY-20553 | Improve crm-sync delays by yalokin-jimi JY-20553 | Improve crm-sync delays by yalokin-jiminny · Pull Request #11976 · jiminny/app — Work...
|
True
|
github.com/jiminny/app/pull/11976/changes#diff-f61 github.com/jiminny/app/pull/11976/changes#diff-f61f95a9f65b327dc254e0f402ef96bbeb6fcf71d4ea965e367f2e99ff4a6333...
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Platform Sprint 2 Q2 - Platform Team - Scrum Board Platform Sprint 2 Q2 - Platform Team - Scrum Board - Jira
JY-20553 | Improve crm-sync delays by yalokin-jiminny · Pull Request #11976 · jiminny/app
JY-20553 | Improve crm-sync delays by yalokin-jiminny · Pull Request #11976 · jiminny/app
Close tab
[SRD-6793] Les Mills activity types not pulling in - Jira
[SRD-6793] Les Mills activity types not pulling in - Jira
JY-20698 handle failed field sync on playbook import activity types by LakyLak · Pull Request #11988 · jiminny/app
JY-20698 handle failed field sync on playbook import activity types by LakyLak · Pull Request #11988 · jiminny/app
JY-20692 change confirmation parameter by LakyLak · Pull Request #11986 · jiminny/app
JY-20692 change confirmation parameter by LakyLak · Pull Request #11986 · jiminny/app
[JY-20543] AJ Reports > Tracking - Jira
[JY-20543] AJ Reports > Tracking - Jira
[JY-18909] [Part2] Automated reports with Ask Jiminny - Jira
[JY-18909] [Part2] Automated reports with Ask Jiminny - Jira
Ask Jiminny Reports by nikolay-yankov · Pull Request #11894 · jiminny/app
Ask Jiminny Reports by nikolay-yankov · Pull Request #11894 · jiminny/app
New Tab
New Tab
Product Growth Platform | Userpilot
Product Growth Platform | Userpilot
Userpilot | Logged-activity
Userpilot | Logged-activity
fix(security): composer dependency updates – 2026-04-15 by github-actions[bot] · Pull Request #11970 · jiminny/app
fix(security): composer dependency updates – 2026-04-15 by github-actions[bot] · Pull Request #11970 · jiminny/app
Pipelines - jiminny/app
Pipelines - jiminny/app
Feed — jiminny — Sentry
Feed — jiminny — Sentry
fix(security): composer dependency updates – 2026-04-15 by github-actions[bot] · Pull Request #11970 · jiminny/app
fix(security): composer dependency updates – 2026-04-15 by github-actions[bot] · Pull Request #11970 · jiminny/app
Jiminny
Jiminny
Jiminny
Jiminny
Jiminny
Jiminny
New Tab
Customize sidebar
Close Google Gemini (⌃X)
Tabs from other devices
Open history (⇧⌘H)
Open bookmarks (⌘B)
AI Chat settings
Close
WORK, Google Account: [EMAIL]
Main menu
New chat
Gemini
New Chat
Open menu for conversation actions.
Conversation with Gemini
Conversation with Gemini
Copy prompt
You said checkout to remote branch
You said
checkout to remote branch
Listen
Show more options
Show thinking
Gemini said
Gemini said
Here is the standard way to check out a remote branch in Git.
Step 1: Fetch the latest remote branches
Step 1: Fetch the latest remote branches
Before checking out, it is best practice to ensure your local repository knows about the latest branches on the remote. Run:
Bash
Copy code
git fetch
Step 2: Check out the branch
Step 2: Check out the branch
You have a few options depending on your version of Git and whether you want to use the exact same name as the remote branch.
Option A: The simplest way (Recommended)
Option A: The simplest way (Recommended)
If the remote branch exists and you don't have a local branch with the same name, Git will automatically create the local branch and set it up to track the remote one.
Using the newer
switch
command:
Bash
Copy code
git switch <branch-name>
Or using the traditional
checkout
command:
Bash
Copy code
git checkout <branch-name>
(Note: Do not include
origin/
in this command. Just use the branch name, e.g.,
git checkout feature-branch
)
Option B: The explicit way
Option B: The explicit way
If Option A doesn't work (for example, if you have multiple remotes), or if you want to give your local branch a
different name
than the remote branch, you can explicitly map them:
Bash
Copy code
git checkout -b <your-local-branch-name> origin/<remote-branch-name>
How to verify it worked
How to verify it worked
To confirm you are on the right branch and tracking the remote properly, run:
Bash
Copy code
git branch -vv
This will list your local branches, highlight your current branch, and show which remote branch it is tracking (e.g.,
[origin/<branch-name>]
).
Copy prompt
Edit
You said lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-18909-automated-reports-ask-jiminny) $ git fetch lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-18909-automated-reports-ask-jiminny) $ co -b JY-20553-debug-crm-sync-delays orign/JY-20553-debug-crm-sync-delays fatal: 'orign/JY-20553-debug-crm-sync-delays' is not a commit and a branch 'JY-20553-debug-crm-sync-delays' cannot be created from it lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-18909-automated-reports-ask-jiminny) $ git checkout -b JY-20553-debug-crm-sync-delays orign/JY-20553-debug-crm-sync-delays fatal: 'orign/JY-20553-debug-crm-sync-delays' is not a commit and a branch 'JY-20553-debug-crm-sync-delays' cannot be created from it lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-18909-automated-reports-ask-jiminny) $
You said
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-18909-automated-reports-ask-jiminny) $ git fetch
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-18909-automated-reports-ask-jiminny) $ co -b JY-20553-debug-crm-sync-delays orign/JY-20553-debug-crm-sync-delays
fatal: 'orign/JY-20553-debug-crm-sync-delays' is not a commit and a branch 'JY-20553-debug-crm-sync-delays' cannot be created from it
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-18909-automated-reports-ask-jiminny) $ git checkout -b JY-20553-debug-crm-sync-delays orign/JY-20553-debug-crm-sync-delays
fatal: 'orign/JY-20553-debug-crm-sync-delays' is not a commit and a branch 'JY-20553-debug-crm-sync-delays' cannot be created from it
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-18909-automated-reports-ask-jiminny) $
Expand
Listen
Show more options
Show thinking
Gemini said
Gemini said
Ah, it looks like just a tiny typo! You spelled
origin
as
orign
in your commands.
Git is throwing that error because it can't find a remote named "orign".
Here is the corrected command:
Bash
Copy code
git checkout -b JY-20553-debug-crm-sync-delays origin/JY-20553-debug-crm-sync-delays
An Easier Shortcut
An Easier Shortcut
Since your local branch name matches the remote branch exactly, you can actually skip the
-b
and
origin/
entirely. Git is smart enough to figure it out automatically:
Bash
Copy code
git checkout JY-20553-debug-crm-sync-delays
(Or if
co
is your alias for checkout, just
co JY-20553-debug-crm-sync-delays
will work!)
Enter a prompt for Gemini
encrypted
Enter a prompt for Gemini
encrypted
Open upload file menu
Tools
Open mode picker
Pro
Microphone
Your Jiminny chats aren’t used to improve our models. Gemini is AI and can make mistakes, including about people.
Your privacy & Gemini Opens in a new window
Your privacy & Gemini
Opens in a new window
Summarize page
Summarize page
Skip to content
Skip to content
Open menu
Homepage (g then d)
jiminny
jiminny
app
app
Search or jump to…
Type
/
to search
Chat with Copilot
Open Copilot…
Create new...
Issues(g then i)
Pull requests
Repositories
You have unread notifications(g then n)
Open user navigation menu
Repository navigation
Repository navigation
Code
Code
Pull requests (31)
Pull requests
(
31
)
Agents
Agents
Actions
Actions
Wiki
Wiki
Security and quality (22)
Security and quality
(
22
)
Insights
Insights
Settings
Settings
Important update
Important update
On April 24 we'll start using GitHub Copilot interaction data for AI model training unless you opt out.
Review this update
Review this update
and manage your preferences in your
GitHub account settings
GitHub account settings
.
Dismiss banner
JY-20553 | Improve crm-sync delays #11976 Edit title
JY-20553 | Improve crm-sync delays
#
11976
Edit title
Preview
Preview
Checks pending
Checks pending
Code
Code
Open
yalokin-jiminny
yalokin-jiminny
wants to merge 21 commits into
master
master
from
JY-20553-debug-crm-sync-delays
JY-20553-debug-crm-sync-delays
Copy head branch name to clipboard
Lines changed: 907 additions & 132 deletions
Conversation (5)
Conversation
(
5
)
Commits (21)...
|
[{"role":"AXRadioButton","text [{"role":"AXRadioButton","text":"Platform Sprint 2 Q2 - Platform Team - Scrum Board - Jira","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXRadioButton","text":"JY-20553 | Improve crm-sync delays by yalokin-jiminny · Pull Request #11976 · jiminny/app","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true},{"role":"AXStaticText","text":"JY-20553 | Improve crm-sync delays by yalokin-jiminny · Pull Request #11976 · jiminny/app","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Close tab","depth":5,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXRadioButton","text":"[SRD-6793] Les Mills activity types not pulling in - Jira","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"[SRD-6793] Les Mills activity types not pulling in - Jira","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"JY-20698 handle failed field sync on playbook import activity types by LakyLak · Pull Request #11988 · jiminny/app","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"JY-20698 handle failed field sync on playbook import activity types by LakyLak · Pull Request #11988 · jiminny/app","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"JY-20692 change confirmation parameter by LakyLak · Pull Request #11986 · jiminny/app","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"JY-20692 change confirmation parameter by LakyLak · Pull Request #11986 · jiminny/app","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"[JY-20543] AJ Reports > Tracking - Jira","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"[JY-20543] AJ Reports > Tracking - Jira","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"[JY-18909] [Part2] Automated reports with Ask Jiminny - Jira","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"[JY-18909] [Part2] Automated reports with Ask Jiminny - Jira","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Ask Jiminny Reports by nikolay-yankov · Pull Request #11894 · jiminny/app","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Ask Jiminny Reports by nikolay-yankov · Pull Request #11894 · jiminny/app","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"New Tab","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"New Tab","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Product Growth Platform | Userpilot","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Product Growth Platform | Userpilot","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Userpilot | Logged-activity","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Userpilot | Logged-activity","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"fix(security): composer dependency updates – 2026-04-15 by github-actions[bot] · Pull Request #11970 · jiminny/app","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"fix(security): composer dependency updates – 2026-04-15 by github-actions[bot] · Pull Request #11970 · jiminny/app","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Pipelines - jiminny/app","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Pipelines - jiminny/app","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Feed — jiminny — Sentry","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Feed — jiminny — Sentry","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"fix(security): composer dependency updates – 2026-04-15 by github-actions[bot] · Pull Request #11970 · jiminny/app","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"fix(security): composer dependency updates – 2026-04-15 by github-actions[bot] · Pull Request #11970 · jiminny/app","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Jiminny","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Jiminny","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Jiminny","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Jiminny","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Jiminny","depth":4,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Jiminny","depth":5,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"New Tab","depth":4,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Customize sidebar","depth":6,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Close Google Gemini (⌃X)","depth":6,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Tabs from other devices","depth":6,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Open history (⇧⌘H)","depth":6,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Open bookmarks (⌘B)","depth":6,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"AI Chat settings","depth":7,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close","depth":7,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"WORK, Google Account: lukas.kovalik@jiminny.com","depth":12,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Main menu","depth":12,"role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"New chat","depth":12,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Gemini","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"New Chat","depth":12,"role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Open menu for conversation actions.","depth":12,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXHeading","text":"Conversation with Gemini","depth":15,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Conversation with Gemini","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Copy prompt","depth":21,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXHeading","text":"You said checkout to remote branch","depth":21,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"You said","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"checkout to remote branch","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Listen","depth":22,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Show more options","depth":20,"role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Show thinking","depth":26,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Gemini said","depth":20,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Gemini said","depth":21,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Here is the standard way to check out a remote branch in Git.","depth":24,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Step 1: Fetch the latest remote branches","depth":23,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Step 1: Fetch the latest remote branches","depth":24,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Before checking out, it is best practice to ensure your local repository knows about the latest branches on the remote. Run:","depth":24,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Bash","depth":25,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Copy code","depth":25,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"git fetch","depth":25,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Step 2: Check out the branch","depth":23,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Step 2: Check out the branch","depth":24,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"You have a few options depending on your version of Git and whether you want to use the exact same name as the remote branch.","depth":24,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Option A: The simplest way (Recommended)","depth":23,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Option A: The simplest way (Recommended)","depth":24,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"If the remote branch exists and you don't have a local branch with the same name, Git will automatically create the local branch and set it up to track the remote one.","depth":24,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Using the newer","depth":24,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"switch","depth":25,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"command:","depth":24,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Bash","depth":25,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Copy code","depth":25,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"git switch <branch-name>","depth":25,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Or using the traditional","depth":24,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"checkout","depth":25,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"command:","depth":24,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Bash","depth":25,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Copy code","depth":25,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"git checkout <branch-name>","depth":25,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"(Note: Do not include","depth":24,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"origin/","depth":25,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"in this command. Just use the branch name, e.g.,","depth":24,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"git checkout feature-branch","depth":25,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":")","depth":24,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Option B: The explicit way","depth":23,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Option B: The explicit way","depth":24,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"If Option A doesn't work (for example, if you have multiple remotes), or if you want to give your local branch a","depth":24,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"different name","depth":24,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"than the remote branch, you can explicitly map them:","depth":24,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Bash","depth":25,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Copy code","depth":25,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"git checkout -b <your-local-branch-name> origin/<remote-branch-name>","depth":25,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"How to verify it worked","depth":23,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"How to verify it worked","depth":24,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"To confirm you are on the right branch and tracking the remote properly, run:","depth":24,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Bash","depth":25,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Copy code","depth":25,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"git branch -vv","depth":25,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"This will list your local branches, highlight your current branch, and show which remote branch it is tracking (e.g.,","depth":24,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"[origin/<branch-name>]","depth":25,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":").","depth":24,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Copy prompt","depth":21,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Edit","depth":21,"role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXHeading","text":"You said lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-18909-automated-reports-ask-jiminny) $ git fetch lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-18909-automated-reports-ask-jiminny) $ co -b JY-20553-debug-crm-sync-delays orign/JY-20553-debug-crm-sync-delays fatal: 'orign/JY-20553-debug-crm-sync-delays' is not a commit and a branch 'JY-20553-debug-crm-sync-delays' cannot be created from it lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-18909-automated-reports-ask-jiminny) $ git checkout -b JY-20553-debug-crm-sync-delays orign/JY-20553-debug-crm-sync-delays fatal: 'orign/JY-20553-debug-crm-sync-delays' is not a commit and a branch 'JY-20553-debug-crm-sync-delays' cannot be created from it lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-18909-automated-reports-ask-jiminny) $","depth":21,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"You said","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-18909-automated-reports-ask-jiminny) $ git fetch","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-18909-automated-reports-ask-jiminny) $ co -b JY-20553-debug-crm-sync-delays orign/JY-20553-debug-crm-sync-delays","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"fatal: 'orign/JY-20553-debug-crm-sync-delays' is not a commit and a branch 'JY-20553-debug-crm-sync-delays' cannot be created from it","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-18909-automated-reports-ask-jiminny) $ git checkout -b JY-20553-debug-crm-sync-delays orign/JY-20553-debug-crm-sync-delays","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"fatal: 'orign/JY-20553-debug-crm-sync-delays' is not a commit and a branch 'JY-20553-debug-crm-sync-delays' cannot be created from it","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-18909-automated-reports-ask-jiminny) $","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Expand","depth":21,"role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Listen","depth":22,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Show more options","depth":20,"role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Show thinking","depth":26,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Gemini said","depth":20,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Gemini said","depth":21,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Ah, it looks like just a tiny typo! You spelled","depth":24,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"origin","depth":25,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"as","depth":24,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"orign","depth":25,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"in your commands.","depth":24,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Git is throwing that error because it can't find a remote named \"orign\".","depth":24,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Here is the corrected command:","depth":24,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Bash","depth":25,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Copy code","depth":25,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"git checkout -b JY-20553-debug-crm-sync-delays origin/JY-20553-debug-crm-sync-delays","depth":25,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"An Easier Shortcut","depth":23,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"An Easier Shortcut","depth":24,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Since your local branch name matches the remote branch exactly, you can actually skip the","depth":24,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"-b","depth":25,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"and","depth":24,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"origin/","depth":25,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"entirely. Git is smart enough to figure it out automatically:","depth":24,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Bash","depth":25,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Copy code","depth":25,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"git checkout JY-20553-debug-crm-sync-delays","depth":25,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"(Or if","depth":24,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"co","depth":25,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"is your alias for checkout, just","depth":24,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"co JY-20553-debug-crm-sync-delays","depth":25,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"will work!)","depth":24,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXTextArea","text":"Enter a prompt for Gemini\nencrypted","depth":20,"value":"Enter a prompt for Gemini\nencrypted","help_text":"","role_description":"text entry area","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Enter a prompt for Gemini","depth":21,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"encrypted","depth":21,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Open upload file menu","depth":20,"role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Tools","depth":18,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Open mode picker","depth":20,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Pro","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXCheckBox","text":"Microphone","depth":19,"role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Your Jiminny chats aren’t used to improve our models. Gemini is AI and can make mistakes, including about people.","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Your privacy & Gemini Opens in a new window","depth":17,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Your privacy & Gemini","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Opens in a new window","depth":19,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Summarize page","depth":7,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Summarize page","depth":9,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Skip to content","depth":6,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Skip to content","depth":7,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Open menu","depth":10,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"Homepage (g then d)","depth":9,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"jiminny","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"jiminny","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"app","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"app","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Search or jump to…","depth":9,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Type","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"/","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"to search","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Chat with Copilot","depth":10,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXMenuButton","text":"Open Copilot…","depth":9,"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXMenuButton","text":"Create new...","depth":9,"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXLink","text":"Issues(g then i)","depth":9,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"Pull requests","depth":9,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"Repositories","depth":9,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"You have unread notifications(g then n)","depth":9,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Open user navigation menu","depth":9,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXHeading","text":"Repository navigation","depth":9,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Repository navigation","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Code","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Code","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Pull requests (31)","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Pull requests","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"(","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"31","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":")","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Agents","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Agents","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Actions","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Actions","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Wiki","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Wiki","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Security and quality (22)","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Security and quality","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"(","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"22","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":")","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Insights","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Insights","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Settings","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Settings","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Important update","depth":10,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Important update","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"On April 24 we'll start using GitHub Copilot interaction data for AI model training unless you opt out.","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Review this update","depth":10,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Review this update","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"and manage your preferences in your","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"GitHub account settings","depth":10,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"GitHub account settings","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":".","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Dismiss banner","depth":9,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXHeading","text":"JY-20553 | Improve crm-sync delays #11976 Edit title","depth":13,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"JY-20553 | Improve crm-sync delays","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"#","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"11976","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Edit title","depth":14,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXMenuButton","text":"Preview","depth":13,"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Preview","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Checks pending","depth":13,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Checks pending","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXMenuButton","text":"Code","depth":13,"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Code","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Open","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"yalokin-jiminny","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"yalokin-jiminny","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"wants to merge 21 commits into","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"master","depth":15,"role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"master","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"from","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"JY-20553-debug-crm-sync-delays","depth":16,"role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"JY-20553-debug-crm-sync-delays","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Copy head branch name to clipboard","depth":16,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Lines changed: 907 additions & 132 deletions","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Conversation (5)","depth":16,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Conversation","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"(","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"5","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":")","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Commits (21)","depth":16,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false}]...
|
-6074676719002118658
|
-2605766687885417541
|
click
|
accessibility
|
NULL
|
Platform Sprint 2 Q2 - Platform Team - Scrum Board Platform Sprint 2 Q2 - Platform Team - Scrum Board - Jira
JY-20553 | Improve crm-sync delays by yalokin-jiminny · Pull Request #11976 · jiminny/app
JY-20553 | Improve crm-sync delays by yalokin-jiminny · Pull Request #11976 · jiminny/app
Close tab
[SRD-6793] Les Mills activity types not pulling in - Jira
[SRD-6793] Les Mills activity types not pulling in - Jira
JY-20698 handle failed field sync on playbook import activity types by LakyLak · Pull Request #11988 · jiminny/app
JY-20698 handle failed field sync on playbook import activity types by LakyLak · Pull Request #11988 · jiminny/app
JY-20692 change confirmation parameter by LakyLak · Pull Request #11986 · jiminny/app
JY-20692 change confirmation parameter by LakyLak · Pull Request #11986 · jiminny/app
[JY-20543] AJ Reports > Tracking - Jira
[JY-20543] AJ Reports > Tracking - Jira
[JY-18909] [Part2] Automated reports with Ask Jiminny - Jira
[JY-18909] [Part2] Automated reports with Ask Jiminny - Jira
Ask Jiminny Reports by nikolay-yankov · Pull Request #11894 · jiminny/app
Ask Jiminny Reports by nikolay-yankov · Pull Request #11894 · jiminny/app
New Tab
New Tab
Product Growth Platform | Userpilot
Product Growth Platform | Userpilot
Userpilot | Logged-activity
Userpilot | Logged-activity
fix(security): composer dependency updates – 2026-04-15 by github-actions[bot] · Pull Request #11970 · jiminny/app
fix(security): composer dependency updates – 2026-04-15 by github-actions[bot] · Pull Request #11970 · jiminny/app
Pipelines - jiminny/app
Pipelines - jiminny/app
Feed — jiminny — Sentry
Feed — jiminny — Sentry
fix(security): composer dependency updates – 2026-04-15 by github-actions[bot] · Pull Request #11970 · jiminny/app
fix(security): composer dependency updates – 2026-04-15 by github-actions[bot] · Pull Request #11970 · jiminny/app
Jiminny
Jiminny
Jiminny
Jiminny
Jiminny
Jiminny
New Tab
Customize sidebar
Close Google Gemini (⌃X)
Tabs from other devices
Open history (⇧⌘H)
Open bookmarks (⌘B)
AI Chat settings
Close
WORK, Google Account: [EMAIL]
Main menu
New chat
Gemini
New Chat
Open menu for conversation actions.
Conversation with Gemini
Conversation with Gemini
Copy prompt
You said checkout to remote branch
You said
checkout to remote branch
Listen
Show more options
Show thinking
Gemini said
Gemini said
Here is the standard way to check out a remote branch in Git.
Step 1: Fetch the latest remote branches
Step 1: Fetch the latest remote branches
Before checking out, it is best practice to ensure your local repository knows about the latest branches on the remote. Run:
Bash
Copy code
git fetch
Step 2: Check out the branch
Step 2: Check out the branch
You have a few options depending on your version of Git and whether you want to use the exact same name as the remote branch.
Option A: The simplest way (Recommended)
Option A: The simplest way (Recommended)
If the remote branch exists and you don't have a local branch with the same name, Git will automatically create the local branch and set it up to track the remote one.
Using the newer
switch
command:
Bash
Copy code
git switch <branch-name>
Or using the traditional
checkout
command:
Bash
Copy code
git checkout <branch-name>
(Note: Do not include
origin/
in this command. Just use the branch name, e.g.,
git checkout feature-branch
)
Option B: The explicit way
Option B: The explicit way
If Option A doesn't work (for example, if you have multiple remotes), or if you want to give your local branch a
different name
than the remote branch, you can explicitly map them:
Bash
Copy code
git checkout -b <your-local-branch-name> origin/<remote-branch-name>
How to verify it worked
How to verify it worked
To confirm you are on the right branch and tracking the remote properly, run:
Bash
Copy code
git branch -vv
This will list your local branches, highlight your current branch, and show which remote branch it is tracking (e.g.,
[origin/<branch-name>]
).
Copy prompt
Edit
You said lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-18909-automated-reports-ask-jiminny) $ git fetch lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-18909-automated-reports-ask-jiminny) $ co -b JY-20553-debug-crm-sync-delays orign/JY-20553-debug-crm-sync-delays fatal: 'orign/JY-20553-debug-crm-sync-delays' is not a commit and a branch 'JY-20553-debug-crm-sync-delays' cannot be created from it lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-18909-automated-reports-ask-jiminny) $ git checkout -b JY-20553-debug-crm-sync-delays orign/JY-20553-debug-crm-sync-delays fatal: 'orign/JY-20553-debug-crm-sync-delays' is not a commit and a branch 'JY-20553-debug-crm-sync-delays' cannot be created from it lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-18909-automated-reports-ask-jiminny) $
You said
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-18909-automated-reports-ask-jiminny) $ git fetch
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-18909-automated-reports-ask-jiminny) $ co -b JY-20553-debug-crm-sync-delays orign/JY-20553-debug-crm-sync-delays
fatal: 'orign/JY-20553-debug-crm-sync-delays' is not a commit and a branch 'JY-20553-debug-crm-sync-delays' cannot be created from it
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-18909-automated-reports-ask-jiminny) $ git checkout -b JY-20553-debug-crm-sync-delays orign/JY-20553-debug-crm-sync-delays
fatal: 'orign/JY-20553-debug-crm-sync-delays' is not a commit and a branch 'JY-20553-debug-crm-sync-delays' cannot be created from it
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-18909-automated-reports-ask-jiminny) $
Expand
Listen
Show more options
Show thinking
Gemini said
Gemini said
Ah, it looks like just a tiny typo! You spelled
origin
as
orign
in your commands.
Git is throwing that error because it can't find a remote named "orign".
Here is the corrected command:
Bash
Copy code
git checkout -b JY-20553-debug-crm-sync-delays origin/JY-20553-debug-crm-sync-delays
An Easier Shortcut
An Easier Shortcut
Since your local branch name matches the remote branch exactly, you can actually skip the
-b
and
origin/
entirely. Git is smart enough to figure it out automatically:
Bash
Copy code
git checkout JY-20553-debug-crm-sync-delays
(Or if
co
is your alias for checkout, just
co JY-20553-debug-crm-sync-delays
will work!)
Enter a prompt for Gemini
encrypted
Enter a prompt for Gemini
encrypted
Open upload file menu
Tools
Open mode picker
Pro
Microphone
Your Jiminny chats aren’t used to improve our models. Gemini is AI and can make mistakes, including about people.
Your privacy & Gemini Opens in a new window
Your privacy & Gemini
Opens in a new window
Summarize page
Summarize page
Skip to content
Skip to content
Open menu
Homepage (g then d)
jiminny
jiminny
app
app
Search or jump to…
Type
/
to search
Chat with Copilot
Open Copilot…
Create new...
Issues(g then i)
Pull requests
Repositories
You have unread notifications(g then n)
Open user navigation menu
Repository navigation
Repository navigation
Code
Code
Pull requests (31)
Pull requests
(
31
)
Agents
Agents
Actions
Actions
Wiki
Wiki
Security and quality (22)
Security and quality
(
22
)
Insights
Insights
Settings
Settings
Important update
Important update
On April 24 we'll start using GitHub Copilot interaction data for AI model training unless you opt out.
Review this update
Review this update
and manage your preferences in your
GitHub account settings
GitHub account settings
.
Dismiss banner
JY-20553 | Improve crm-sync delays #11976 Edit title
JY-20553 | Improve crm-sync delays
#
11976
Edit title
Preview
Preview
Checks pending
Checks pending
Code
Code
Open
yalokin-jiminny
yalokin-jiminny
wants to merge 21 commits into
master
master
from
JY-20553-debug-crm-sync-delays
JY-20553-debug-crm-sync-delays
Copy head branch name to clipboard
Lines changed: 907 additions & 132 deletions
Conversation (5)
Conversation
(
5
)
Commits (21)...
|
55379
|
|
55387
|
NULL
|
0
|
2026-04-20T09:48:22.519528+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-20/1776 /Users/lukas/.screenpipe/data/data/2026-04-20/1776678502519_m2.jpg...
|
Firefox
|
JY-20553 | Improve crm-sync delays by yalokin-jimi JY-20553 | Improve crm-sync delays by yalokin-jiminny · Pull Request #11976 · jiminny/app — Work...
|
True
|
github.com/jiminny/app/pull/11976/changes#diff-f61 github.com/jiminny/app/pull/11976/changes#diff-f61f95a9f65b327dc254e0f402ef96bbeb6fcf71d4ea965e367f2e99ff4a6333...
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Platform Sprint 2 Q2 - Platform Team - Scrum Board Platform Sprint 2 Q2 - Platform Team - Scrum Board - Jira
JY-20553 | Improve crm-sync delays by yalokin-jiminny · Pull Request #11976 · jiminny/app
JY-20553 | Improve crm-sync delays by yalokin-jiminny · Pull Request #11976 · jiminny/app
Close tab
[SRD-6793] Les Mills activity types not pulling in - Jira
[SRD-6793] Les Mills activity types not pulling in - Jira
JY-20698 handle failed field sync on playbook import activity types by LakyLak · Pull Request #11988 · jiminny/app
JY-20698 handle failed field sync on playbook import activity types by LakyLak · Pull Request #11988 · jiminny/app
JY-20692 change confirmation parameter by LakyLak · Pull Request #11986 · jiminny/app
JY-20692 change confirmation parameter by LakyLak · Pull Request #11986 · jiminny/app
[JY-20543] AJ Reports > Tracking - Jira
[JY-20543] AJ Reports > Tracking - Jira
[JY-18909] [Part2] Automated reports with Ask Jiminny - Jira
[JY-18909] [Part2] Automated reports with Ask Jiminny - Jira
Ask Jiminny Reports by nikolay-yankov · Pull Request #11894 · jiminny/app
Ask Jiminny Reports by nikolay-yankov · Pull Request #11894 · jiminny/app
New Tab
New Tab
Product Growth Platform | Userpilot
Product Growth Platform | Userpilot
Userpilot | Logged-activity
Userpilot | Logged-activity
fix(security): composer dependency updates – 2026-04-15 by github-actions[bot] · Pull Request #11970 · jiminny/app
fix(security): composer dependency updates – 2026-04-15 by github-actions[bot] · Pull Request #11970 · jiminny/app
Pipelines - jiminny/app
Pipelines - jiminny/app
Feed — jiminny — Sentry
Feed — jiminny — Sentry
fix(security): composer dependency updates – 2026-04-15 by github-actions[bot] · Pull Request #11970 · jiminny/app
fix(security): composer dependency updates – 2026-04-15 by github-actions[bot] · Pull Request #11970 · jiminny/app
Jiminny
Jiminny
Jiminny
Jiminny
Jiminny
Jiminny
New Tab
Customize sidebar
Close Google Gemini (⌃X)
Tabs from other devices
Open history (⇧⌘H)
Open bookmarks (⌘B)
AI Chat settings
Close
WORK, Google Account: [EMAIL]
Main menu
New chat
Gemini
New Chat
Open menu for conversation actions.
Conversation with Gemini
Conversation with Gemini
Copy prompt
You said checkout to remote branch
You said
checkout to remote branch
Listen
Show more options
Show thinking
Gemini said
Gemini said
Here is the standard way to check out a remote branch in Git.
Step 1: Fetch the latest remote branches
Step 1: Fetch the latest remote branches
Before checking out, it is best practice to ensure your local repository knows about the latest branches on the remote. Run:
Bash
Copy code
git fetch
Step 2: Check out the branch
Step 2: Check out the branch
You have a few options depending on your version of Git and whether you want to use the exact same name as the remote branch.
Option A: The simplest way (Recommended)
Option A: The simplest way (Recommended)
If the remote branch exists and you don't have a local branch with the same name, Git will automatically create the local branch and set it up to track the remote one.
Using the newer
switch
command:
Bash
Copy code
git switch <branch-name>
Or using the traditional
checkout
command:
Bash
Copy code
git checkout <branch-name>
(Note: Do not include
origin/
in this command. Just use the branch name, e.g.,
git checkout feature-branch
)
Option B: The explicit way
Option B: The explicit way
If Option A doesn't work (for example, if you have multiple remotes), or if you want to give your local branch a
different name
than the remote branch, you can explicitly map them:
Bash
Copy code
git checkout -b <your-local-branch-name> origin/<remote-branch-name>
How to verify it worked
How to verify it worked
To confirm you are on the right branch and tracking the remote properly, run:
Bash
Copy code
git branch -vv
This will list your local branches, highlight your current branch, and show which remote branch it is tracking (e.g.,
[origin/<branch-name>]
).
Copy prompt
Edit
You said lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-18909-automated-reports-ask-jiminny) $ git fetch lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-18909-automated-reports-ask-jiminny) $ co -b JY-20553-debug-crm-sync-delays orign/JY-20553-debug-crm-sync-delays fatal: 'orign/JY-20553-debug-crm-sync-delays' is not a commit and a branch 'JY-20553-debug-crm-sync-delays' cannot be created from it lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-18909-automated-reports-ask-jiminny) $ git checkout -b JY-20553-debug-crm-sync-delays orign/JY-20553-debug-crm-sync-delays fatal: 'orign/JY-20553-debug-crm-sync-delays' is not a commit and a branch 'JY-20553-debug-crm-sync-delays' cannot be created from it lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-18909-automated-reports-ask-jiminny) $
You said
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-18909-automated-reports-ask-jiminny) $ git fetch
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-18909-automated-reports-ask-jiminny) $ co -b JY-20553-debug-crm-sync-delays orign/JY-20553-debug-crm-sync-delays
fatal: 'orign/JY-20553-debug-crm-sync-delays' is not a commit and a branch 'JY-20553-debug-crm-sync-delays' cannot be created from it
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-18909-automated-reports-ask-jiminny) $ git checkout -b JY-20553-debug-crm-sync-delays orign/JY-20553-debug-crm-sync-delays
fatal: 'orign/JY-20553-debug-crm-sync-delays' is not a commit and a branch 'JY-20553-debug-crm-sync-delays' cannot be created from it
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-18909-automated-reports-ask-jiminny) $
Expand
Listen
Show more options
Show thinking
Gemini said
Gemini said
Ah, it looks like just a tiny typo! You spelled
origin
as
orign
in your commands.
Git is throwing that error because it can't find a remote named "orign".
Here is the corrected command:
Bash
Copy code
git checkout -b JY-20553-debug-crm-sync-delays origin/JY-20553-debug-crm-sync-delays
An Easier Shortcut
An Easier Shortcut
Since your local branch name matches the remote branch exactly, you can actually skip the
-b
and
origin/
entirely. Git is smart enough to figure it out automatically:
Bash
Copy code
git checkout JY-20553-debug-crm-sync-delays
(Or if
co
is your alias for checkout, just
co JY-20553-debug-crm-sync-delays
will work!)
Enter a prompt for Gemini
encrypted
Enter a prompt for Gemini
encrypted
Open upload file menu
Tools
Open mode picker
Pro
Microphone
Your Jiminny chats aren’t used to improve our models. Gemini is AI and can make mistakes, including about people.
Your privacy & Gemini Opens in a new window
Your privacy & Gemini
Opens in a new window
Summarize page
Summarize page
Skip to content
Skip to content
Open menu
Homepage (g then d)
jiminny
jiminny
app
app
Search or jump to…
Type
/
to search
Chat with Copilot
Open Copilot…
Create new...
Issues(g then i)
Pull requests
Repositories
You have unread notifications(g then n)
Open user navigation menu
Repository navigation
Repository navigation
Code
Code
Pull requests (31)
Pull requests
(
31
)
Agents
Agents
Actions
Actions
Wiki
Wiki
Security and quality (22)
Security and quality
(
22
)
Insights
Insights
Settings
Settings
Important update
Important update
On April 24 we'll start using GitHub Copilot interaction data for AI model training unless you opt out.
Review this update
Review this update
and manage your preferences in your
GitHub account settings
GitHub account settings
.
Dismiss banner
JY-20553 | Improve crm-sync delays #11976 Edit title
JY-20553 | Improve crm-sync delays
#
11976
Edit title
Preview
Preview
Checks pending
Checks pending
Code
Code
Open
yalokin-jiminny
yalokin-jiminny
wants to merge 21 commits into
master
master
from
JY-20553-debug-crm-sync-delays
JY-20553-debug-crm-sync-delays
Copy head branch name to clipboard
Lines changed: 907 additions & 132 deletions
Conversation (5)
Conversation
(
5
)
Commits (21)
Commits
(
21
)
Checks (2)
Checks
(
2
)
Files changed (14)
Files changed
(
14
)
Pull Request Toolbar
Pull Request Toolbar
Collapse file tree
Open
JY-20553 | Improve crm-sync delays
JY-20553 | Improve crm-sync delays
#
11976
All commits
All commits
yalokin-jiminny
yalokin-jiminny
wants to merge 21 commits into
master
master
from
JY-20553-debug-crm-sync-delays
JY-20553-debug-crm-sync-delays
Copy head branch name to clipboard
6
/
14
viewed
Checks pending
Checks pending
Submit review
Submit
review
Open diff view settings
Open overview panel
Open comments panel
(
0
)
Filter files…
Filter options
File tree
File tree
app
Console/Commands/Crm
SyncObjects.php
SyncObjects.php
Http/Controllers
Internal/WebhookReceiver
HubspotController.php
HubspotController.php
Webhook/Hubspot
EventsController.php
EventsController.php
ProcessesWebhooksTrait.php
ProcessesWebhooksTrait.php
Jobs/Crm
SyncObjects.php
SyncObjects.php
SyncOpportunitiesJob.php
SyncOpportunitiesJob.php
Services/Crm
Hubspot/ServiceTraits
OpportunitySyncTrait.php
OpportunitySyncTrait.php
BaseService.php
BaseService.php
tests
Feature/Services/Crm
BaseServiceTest.php
BaseServiceTest.php
Unit
Http/Controllers/Webhook/Hubspot
ProcessesWebhooksTraitTest.php
ProcessesWebhooksTraitTest.php
Jobs/Crm
SyncObjectsTest.php
SyncObjectsTest.php
SyncOpportunitiesJobTest.php
SyncOpportunitiesJobTest.php
Services/Crm/Hubspot/ServiceTraits
OpportunitySyncTest.php
OpportunitySyncTest.php
OpportunitySyncTraitSyncOpportunitiesTest.php
OpportunitySyncTraitSyncOpportunitiesTest.php
Expand file
app/Console/Commands/Crm/SyncObjects.php
app/Console/Commands/Crm/SyncObjects.php
app/Console/Commands/Crm/SyncObjects.php
Copy file name to clipboard
Expand all lines: app/Console/Commands/Crm/SyncObjects.php
Lines changed: 22 additions & 12 deletions
Viewed
Viewed
Comment on this file
More options
Expand file
app/Http/Controllers/Internal/WebhookReceiver/HubspotController.php
app/Http/Controllers/Internal/WebhookReceiver/HubspotController.php
app/Http/Controllers/Internal/WebhookReceiver/HubspotController.php
Copy file name to clipboard
Expand all lines: app/Http/Controllers/Internal/WebhookReceiver/HubspotController.php
Lines changed: 3 additions & 2 deletions
Viewed
Viewed
Comment on this file
More options
Expand file
app/Http/Controllers/Webhook/Hubspot/EventsController.php
app/Http/Controllers/Webhook/Hubspot/EventsController.php
app/Http/Controllers/Webhook/Hubspot/EventsController.php
Copy file name to clipboard
Expand all lines: app/Http/Controllers/Webhook/Hubspot/EventsController.php
Lines changed: 1 addition & 5 deletions
Viewed
Viewed
Comment on this file
More options
Expand file
app/Http/Controllers/Webhook/Hubspot/ProcessesWebhooksTrait.php
app/Http/Controllers/Webhook/Hubspot/ProcessesWebhooksTrait.php
app/Http/Controllers/Webhook/Hubspot/ProcessesWebhooksTrait.php
Copy file name to clipboard
Expand all lines: app/Http/Controllers/Webhook/Hubspot/ProcessesWebhooksTrait.php
Lines changed: 63 additions & 12 deletions
Viewed
Viewed
Comment on this file
More options
Expand file
app/Jobs/Crm/SyncObjects.php
app/Jobs/Crm/SyncObjects.php
app/Jobs/Crm/SyncObjects.php
Copy file name to clipboard
Expand all lines: app/Jobs/Crm/SyncObjects.php
Lines changed: 23 additions & 15 deletions
Viewed
Viewed
Comment on this file
More options
Expand file
app/Jobs/Crm/SyncOpportunitiesJob.php
app/Jobs/Crm/SyncOpportunitiesJob.php
app/Jobs/Crm/SyncOpportunitiesJob.php
Copy file name to clipboard
Expand all lines: app/Jobs/Crm/SyncOpportunitiesJob.php
Lines changed: 11 additions & 1 deletion
Viewed
Viewed
Comment on this file
More options
Collapse file
app/Services/Crm/Hubspot/ServiceTraits/OpportunitySyncTrait.php
app/Services/Crm/Hubspot/ServiceTraits/OpportunitySyncTrait.php
app/Services/Crm/Hubspot/ServiceTraits/OpportunitySyncTrait.php
Copy file name to clipboard
Expand all lines: app/Services/Crm/Hubspot/ServiceTraits/OpportunitySyncTrait.php
Lines changed: 11 additions & 6 deletions
Not Viewed
Viewed
Comment on this file
More options
Original file line number
Original file line
Diff line number
Diff line change
@@ -43,17 +43,20 @@ trait OpportunitySyncTrait
43
43
44
public
function
syncOpportunities
(
array
$
parameters
, ?
string
$
strategy
=
null
):
int
44
public
function
syncOpportunities
(
array
$
parameters
, ?
string
$
strategy
=
null
):
int
45
{
45
{...
|
[{"role":"AXRadioButton","text [{"role":"AXRadioButton","text":"Platform Sprint 2 Q2 - Platform Team - Scrum Board - Jira","depth":4,"bounds":{"left":0.0018284575,"top":0.0518755,"width":0.07596409,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXRadioButton","text":"JY-20553 | Improve crm-sync delays by yalokin-jiminny · Pull Request #11976 · jiminny/app","depth":4,"bounds":{"left":0.0,"top":0.09497207,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true},{"role":"AXStaticText","text":"JY-20553 | Improve crm-sync delays by yalokin-jiminny · Pull Request #11976 · jiminny/app","depth":5,"bounds":{"left":0.013297873,"top":0.10614525,"width":0.15774602,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Close tab","depth":5,"bounds":{"left":0.06732048,"top":0.10215483,"width":0.007978723,"height":0.01915403},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXRadioButton","text":"[SRD-6793] Les Mills activity types not pulling in - Jira","depth":4,"bounds":{"left":0.0,"top":0.12769353,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"[SRD-6793] Les Mills activity types not pulling in - Jira","depth":5,"bounds":{"left":0.013297873,"top":0.13886672,"width":0.09524601,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"JY-20698 handle failed field sync on playbook import activity types by LakyLak · Pull Request #11988 · jiminny/app","depth":4,"bounds":{"left":0.0,"top":0.16041501,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"JY-20698 handle failed field sync on playbook import activity types by LakyLak · Pull Request #11988 · jiminny/app","depth":5,"bounds":{"left":0.013297873,"top":0.17158818,"width":0.19963431,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"JY-20692 change confirmation parameter by LakyLak · Pull Request #11986 · jiminny/app","depth":4,"bounds":{"left":0.0,"top":0.19313647,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"JY-20692 change confirmation parameter by LakyLak · Pull Request #11986 · jiminny/app","depth":5,"bounds":{"left":0.013297873,"top":0.20430966,"width":0.15525267,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"[JY-20543] AJ Reports > Tracking - Jira","depth":4,"bounds":{"left":0.0,"top":0.22585794,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"[JY-20543] AJ Reports > Tracking - Jira","depth":5,"bounds":{"left":0.013297873,"top":0.23703113,"width":0.06981383,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"[JY-18909] [Part2] Automated reports with Ask Jiminny - Jira","depth":4,"bounds":{"left":0.0,"top":0.2585794,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"[JY-18909] [Part2] Automated reports with Ask Jiminny - Jira","depth":5,"bounds":{"left":0.013297873,"top":0.2697526,"width":0.10688165,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Ask Jiminny Reports by nikolay-yankov · Pull Request #11894 · jiminny/app","depth":4,"bounds":{"left":0.0,"top":0.29130086,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Ask Jiminny Reports by nikolay-yankov · Pull Request #11894 · jiminny/app","depth":5,"bounds":{"left":0.013297873,"top":0.30247405,"width":0.12915559,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"New Tab","depth":4,"bounds":{"left":0.0,"top":0.32402235,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"New Tab","depth":5,"bounds":{"left":0.013297873,"top":0.33519554,"width":0.014960106,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Product Growth Platform | Userpilot","depth":4,"bounds":{"left":0.0,"top":0.3567438,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Product Growth Platform | Userpilot","depth":5,"bounds":{"left":0.013297873,"top":0.367917,"width":0.06200133,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Userpilot | Logged-activity","depth":4,"bounds":{"left":0.0,"top":0.38946527,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Userpilot | Logged-activity","depth":5,"bounds":{"left":0.013297873,"top":0.40063846,"width":0.04637633,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"fix(security): composer dependency updates – 2026-04-15 by github-actions[bot] · Pull Request #11970 · jiminny/app","depth":4,"bounds":{"left":0.0,"top":0.42218676,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"fix(security): composer dependency updates – 2026-04-15 by github-actions[bot] · Pull Request #11970 · jiminny/app","depth":5,"bounds":{"left":0.013297873,"top":0.43335995,"width":0.2052859,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Pipelines - jiminny/app","depth":4,"bounds":{"left":0.0,"top":0.45490822,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Pipelines - jiminny/app","depth":5,"bounds":{"left":0.013297873,"top":0.4660814,"width":0.039228722,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Feed — jiminny — Sentry","depth":4,"bounds":{"left":0.0,"top":0.48762968,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Feed — jiminny — Sentry","depth":5,"bounds":{"left":0.013297873,"top":0.49880287,"width":0.042719416,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"fix(security): composer dependency updates – 2026-04-15 by github-actions[bot] · Pull Request #11970 · jiminny/app","depth":4,"bounds":{"left":0.0,"top":0.5203512,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"fix(security): composer dependency updates – 2026-04-15 by github-actions[bot] · Pull Request #11970 · jiminny/app","depth":5,"bounds":{"left":0.013297873,"top":0.53152436,"width":0.2052859,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Jiminny","depth":4,"bounds":{"left":0.0,"top":0.55307263,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Jiminny","depth":5,"bounds":{"left":0.013297873,"top":0.5642458,"width":0.013131649,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Jiminny","depth":4,"bounds":{"left":0.0,"top":0.5857941,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Jiminny","depth":5,"bounds":{"left":0.013297873,"top":0.5969673,"width":0.013131649,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Jiminny","depth":4,"bounds":{"left":0.0,"top":0.61851555,"width":0.07962101,"height":0.032721467},"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Jiminny","depth":5,"bounds":{"left":0.013297873,"top":0.62968874,"width":0.013131649,"height":0.010774142},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"New Tab","depth":4,"bounds":{"left":0.0028257978,"top":0.6528332,"width":0.07413564,"height":0.025538707},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Customize sidebar","depth":6,"bounds":{"left":0.0028257978,"top":0.97007185,"width":0.010638298,"height":0.025538707},"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Close Google Gemini (⌃X)","depth":6,"bounds":{"left":0.013796543,"top":0.97007185,"width":0.010638298,"height":0.025538707},"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Tabs from other devices","depth":6,"bounds":{"left":0.024933511,"top":0.97007185,"width":0.010638298,"height":0.025538707},"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Open history (⇧⌘H)","depth":6,"bounds":{"left":0.036070477,"top":0.97007185,"width":0.010638298,"height":0.025538707},"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Open bookmarks (⌘B)","depth":6,"bounds":{"left":0.04720745,"top":0.97007185,"width":0.010638298,"height":0.025538707},"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"AI Chat settings","depth":7,"bounds":{"left":0.18733378,"top":0.055067837,"width":0.010638298,"height":0.025538707},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close","depth":7,"bounds":{"left":0.19930187,"top":0.055067837,"width":0.010638298,"height":0.025538707},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"WORK, Google Account: lukas.kovalik@jiminny.com","depth":12,"bounds":{"left":0.29039228,"top":0.103751,"width":0.013297873,"height":0.031923383},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Main menu","depth":12,"bounds":{"left":0.08361037,"top":0.103751,"width":0.013297873,"height":0.031923383},"role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"New chat","depth":12,"bounds":{"left":0.09690824,"top":0.10454908,"width":0.028590426,"height":0.030327214},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Gemini","depth":15,"bounds":{"left":0.099567816,"top":0.10973663,"width":0.021941489,"height":0.020351157},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"New Chat","depth":12,"bounds":{"left":0.26246676,"top":0.103751,"width":0.013297873,"height":0.031923383},"role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Open menu for conversation actions.","depth":12,"bounds":{"left":0.2757646,"top":0.103751,"width":0.013297873,"height":0.031923383},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXHeading","text":"Conversation with Gemini","depth":15,"bounds":{"left":0.079288565,"top":0.14764565,"width":0.0003324468,"height":0.0007980846},"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Conversation with Gemini","depth":16,"bounds":{"left":0.079288565,"top":0.15003991,"width":0.1200133,"height":0.025538707},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Copy prompt","depth":21,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXHeading","text":"You said checkout to remote branch","depth":21,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"You said","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"checkout to remote branch","depth":23,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Listen","depth":22,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Show more options","depth":20,"role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Show thinking","depth":26,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Gemini said","depth":20,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Gemini said","depth":21,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Here is the standard way to check out a remote branch in Git.","depth":24,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Step 1: Fetch the latest remote branches","depth":23,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Step 1: Fetch the latest remote branches","depth":24,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Before checking out, it is best practice to ensure your local repository knows about the latest branches on the remote. Run:","depth":24,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Bash","depth":25,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Copy code","depth":25,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"git fetch","depth":25,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Step 2: Check out the branch","depth":23,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Step 2: Check out the branch","depth":24,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"You have a few options depending on your version of Git and whether you want to use the exact same name as the remote branch.","depth":24,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Option A: The simplest way (Recommended)","depth":23,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Option A: The simplest way (Recommended)","depth":24,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"If the remote branch exists and you don't have a local branch with the same name, Git will automatically create the local branch and set it up to track the remote one.","depth":24,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Using the newer","depth":24,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"switch","depth":25,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"command:","depth":24,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Bash","depth":25,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Copy code","depth":25,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"git switch <branch-name>","depth":25,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Or using the traditional","depth":24,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"checkout","depth":25,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"command:","depth":24,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Bash","depth":25,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Copy code","depth":25,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"git checkout <branch-name>","depth":25,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"(Note: Do not include","depth":24,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"origin/","depth":25,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"in this command. Just use the branch name, e.g.,","depth":24,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"git checkout feature-branch","depth":25,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":")","depth":24,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Option B: The explicit way","depth":23,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Option B: The explicit way","depth":24,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"If Option A doesn't work (for example, if you have multiple remotes), or if you want to give your local branch a","depth":24,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"different name","depth":24,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"than the remote branch, you can explicitly map them:","depth":24,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Bash","depth":25,"bounds":{"left":0.09358378,"top":0.0,"width":0.010804521,"height":0.014764565},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Copy code","depth":25,"bounds":{"left":0.28507313,"top":0.0,"width":0.013297873,"height":0.031923383},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"git checkout -b <your-local-branch-name> origin/<remote-branch-name>","depth":25,"bounds":{"left":0.09358378,"top":0.0,"width":0.18982713,"height":0.014764565},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"How to verify it worked","depth":23,"bounds":{"left":0.08826463,"top":0.002793296,"width":0.21276596,"height":0.01915403},"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"How to verify it worked","depth":24,"bounds":{"left":0.08826463,"top":0.0043894653,"width":0.060339097,"height":0.016360734},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"To confirm you are on the right branch and tracking the remote properly, run:","depth":24,"bounds":{"left":0.08826463,"top":0.030726258,"width":0.18550532,"height":0.016360734},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Bash","depth":25,"bounds":{"left":0.09358378,"top":0.11612131,"width":0.010804521,"height":0.014764565},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Copy code","depth":25,"bounds":{"left":0.28507313,"top":0.10694334,"width":0.013297873,"height":0.031923383},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"git branch -vv","depth":25,"bounds":{"left":0.09358378,"top":0.11572227,"width":0.0390625,"height":0.014764565},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"This will list your local branches, highlight your current branch, and show which remote branch it is tracking (e.g.,","depth":24,"bounds":{"left":0.08826463,"top":0.15921788,"width":0.21027261,"height":0.037110932},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"[origin/<branch-name>]","depth":25,"bounds":{"left":0.15275931,"top":0.1811652,"width":0.061502658,"height":0.014764565},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":").","depth":24,"bounds":{"left":0.21625665,"top":0.17996807,"width":0.0031582448,"height":0.016360734},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Copy prompt","depth":21,"bounds":{"left":0.11353058,"top":0.2525938,"width":0.013297873,"height":0.031923383},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Edit","depth":21,"bounds":{"left":0.12815824,"top":0.2525938,"width":0.013297873,"height":0.031923383},"role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXHeading","text":"You said lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-18909-automated-reports-ask-jiminny) $ git fetch lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-18909-automated-reports-ask-jiminny) $ co -b JY-20553-debug-crm-sync-delays orign/JY-20553-debug-crm-sync-delays fatal: 'orign/JY-20553-debug-crm-sync-delays' is not a commit and a branch 'JY-20553-debug-crm-sync-delays' cannot be created from it lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-18909-automated-reports-ask-jiminny) $ git checkout -b JY-20553-debug-crm-sync-delays orign/JY-20553-debug-crm-sync-delays fatal: 'orign/JY-20553-debug-crm-sync-delays' is not a commit and a branch 'JY-20553-debug-crm-sync-delays' cannot be created from it lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-18909-automated-reports-ask-jiminny) $","depth":21,"bounds":{"left":0.14810506,"top":0.2621708,"width":0.13696809,"height":0.11173184},"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"You said","depth":23,"bounds":{"left":0.079288565,"top":0.26456505,"width":0.019946808,"height":0.016360734},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-18909-automated-reports-ask-jiminny) $ git fetch","depth":23,"bounds":{"left":0.14810506,"top":0.26536313,"width":0.13331117,"height":0.061053474},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-18909-automated-reports-ask-jiminny) $ co -b JY-20553-debug-crm-sync-delays orign/JY-20553-debug-crm-sync-delays","depth":23,"bounds":{"left":0.14810506,"top":0.33240223,"width":0.13447474,"height":0.08339984},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"fatal: 'orign/JY-20553-debug-crm-sync-delays' is not a commit and a branch 'JY-20553-debug-crm-sync-delays' cannot be created from it","depth":23,"bounds":{"left":0.14810506,"top":0.37709498,"width":0.13314494,"height":0.061053474},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-18909-automated-reports-ask-jiminny) $ git checkout -b JY-20553-debug-crm-sync-delays orign/JY-20553-debug-crm-sync-delays","depth":23,"bounds":{"left":0.14810506,"top":0.4441341,"width":0.13331117,"height":0.08339984},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"fatal: 'orign/JY-20553-debug-crm-sync-delays' is not a commit and a branch 'JY-20553-debug-crm-sync-delays' cannot be created from it","depth":23,"bounds":{"left":0.14810506,"top":0.53351957,"width":0.13314494,"height":0.061053474},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-18909-automated-reports-ask-jiminny) $","depth":23,"bounds":{"left":0.14810506,"top":0.60055864,"width":0.13331117,"height":0.038707104},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Expand","depth":21,"bounds":{"left":0.28507313,"top":0.2621708,"width":0.013297873,"height":0.031923383},"role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Listen","depth":22,"bounds":{"left":0.29039228,"top":0.40582603,"width":0.013297873,"height":0.031923383},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Show more options","depth":20,"bounds":{"left":0.29039228,"top":0.40023944,"width":0.013297873,"height":0.031923383},"role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Show thinking","depth":26,"bounds":{"left":0.1015625,"top":0.40822026,"width":0.030917553,"height":0.014764565},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Gemini said","depth":20,"bounds":{"left":0.09923537,"top":0.44972068,"width":0.0003324468,"height":0.0007980846},"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Gemini said","depth":21,"bounds":{"left":0.09923537,"top":0.4517159,"width":0.04105718,"height":0.01915403},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Ah, it looks like just a tiny typo! You spelled","depth":24,"bounds":{"left":0.08826463,"top":0.4592977,"width":0.10388963,"height":0.016360734},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"origin","depth":25,"bounds":{"left":0.19414894,"top":0.46049482,"width":0.016788565,"height":0.014764565},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"as","depth":24,"bounds":{"left":0.21293218,"top":0.4592977,"width":0.008144947,"height":0.016360734},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"orign","depth":25,"bounds":{"left":0.22307181,"top":0.46049482,"width":0.013962766,"height":0.014764565},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"in your commands.","depth":24,"bounds":{"left":0.23902926,"top":0.4592977,"width":0.047041222,"height":0.016360734},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Git is throwing that error because it can't find a remote named \"orign\".","depth":24,"bounds":{"left":0.08826463,"top":0.49281725,"width":0.17004654,"height":0.016360734},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Here is the corrected command:","depth":24,"bounds":{"left":0.08826463,"top":0.5263368,"width":0.077792555,"height":0.016360734},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Bash","depth":25,"bounds":{"left":0.09358378,"top":0.56943333,"width":0.010804521,"height":0.014764565},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Copy code","depth":25,"bounds":{"left":0.28507313,"top":0.5602554,"width":0.013297873,"height":0.031923383},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"git checkout -b JY-20553-debug-crm-sync-delays origin/JY-20553-debug-crm-sync-delays","depth":25,"bounds":{"left":0.09358378,"top":0.6113328,"width":0.23454122,"height":0.014764565},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"An Easier Shortcut","depth":23,"bounds":{"left":0.08826463,"top":0.66201115,"width":0.21276596,"height":0.01915403},"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"An Easier Shortcut","depth":24,"bounds":{"left":0.08826463,"top":0.66360736,"width":0.04837101,"height":0.016360734},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Since your local branch name matches the remote branch exactly, you can actually skip the","depth":24,"bounds":{"left":0.08826463,"top":0.68994415,"width":0.21210106,"height":0.037110932},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"-b","depth":25,"bounds":{"left":0.099567816,"top":0.7118915,"width":0.0056515955,"height":0.014764565},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"and","depth":24,"bounds":{"left":0.10721409,"top":0.7106943,"width":0.011801862,"height":0.016360734},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"origin/","depth":25,"bounds":{"left":0.12101064,"top":0.7118915,"width":0.019614361,"height":0.014764565},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"entirely. Git is smart enough to figure it out automatically:","depth":24,"bounds":{"left":0.14261968,"top":0.7106943,"width":0.13912898,"height":0.016360734},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Bash","depth":25,"bounds":{"left":0.09358378,"top":0.7537909,"width":0.010804521,"height":0.014764565},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Copy code","depth":25,"bounds":{"left":0.28507313,"top":0.74461293,"width":0.013297873,"height":0.031923383},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"git checkout JY-20553-debug-crm-sync-delays","depth":25,"bounds":{"left":0.09358378,"top":0.79569036,"width":0.1200133,"height":0.014764565},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"(Or if","depth":24,"bounds":{"left":0.08826463,"top":0.83918595,"width":0.013962766,"height":0.016360734},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"co","depth":25,"bounds":{"left":0.104222074,"top":0.84038305,"width":0.005485372,"height":0.014764565},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"is your alias for checkout, just","depth":24,"bounds":{"left":0.11170213,"top":0.83918595,"width":0.07446808,"height":0.016360734},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"co JY-20553-debug-crm-sync-delays","depth":25,"bounds":{"left":0.18816489,"top":0.84038305,"width":0.09208777,"height":0.014764565},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"will work!)","depth":24,"bounds":{"left":0.08826463,"top":0.83918595,"width":0.20428856,"height":0.037110932},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXTextArea","text":"Enter a prompt for Gemini\nencrypted","depth":20,"bounds":{"left":0.09291888,"top":0.82322425,"width":0.20279256,"height":0.01915403},"value":"Enter a prompt for Gemini\nencrypted","help_text":"","role_description":"text entry area","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Enter a prompt for Gemini","depth":21,"bounds":{"left":0.099567816,"top":0.46089387,"width":0.069980055,"height":0.018355945},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"encrypted","depth":21,"bounds":{"left":0.091921546,"top":0.46049482,"width":0.0066489363,"height":0.01915403},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Open upload file menu","depth":20,"bounds":{"left":0.08892952,"top":0.8575419,"width":0.013297873,"height":0.031923383},"role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Tools","depth":18,"bounds":{"left":0.10488697,"top":0.8575419,"width":0.013297873,"height":0.031923383},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Open mode picker","depth":20,"bounds":{"left":0.25831118,"top":0.8567438,"width":0.026097074,"height":0.031923383},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Pro","depth":23,"bounds":{"left":0.26363033,"top":0.86552274,"width":0.007480053,"height":0.014764565},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXCheckBox","text":"Microphone","depth":19,"bounds":{"left":0.2864029,"top":0.8567438,"width":0.013297873,"height":0.031923383},"role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Your Jiminny chats aren’t used to improve our models. Gemini is AI and can make mistakes, including about people.","depth":17,"bounds":{"left":0.0887633,"top":0.90901834,"width":0.21110372,"height":0.012370312},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Your privacy & Gemini Opens in a new window","depth":17,"bounds":{"left":0.17420213,"top":0.92178774,"width":0.040226065,"height":0.012370312},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Your privacy & Gemini","depth":18,"bounds":{"left":0.17420213,"top":0.92178774,"width":0.040226065,"height":0.012370312},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Opens in a new window","depth":19,"bounds":{"left":0.079288565,"top":0.92098963,"width":0.043218084,"height":0.012370312},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Summarize page","depth":7,"bounds":{"left":0.08494016,"top":0.95730245,"width":0.053523935,"height":0.025538707},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Summarize page","depth":9,"bounds":{"left":0.09059176,"top":0.96249,"width":0.042220745,"height":0.015163607},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Skip to content","depth":6,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Skip to content","depth":7,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Open menu","depth":10,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"Homepage (g then d)","depth":9,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"jiminny","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"jiminny","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"app","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"app","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Search or jump to…","depth":9,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Type","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"/","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"to search","depth":12,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Chat with Copilot","depth":10,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXMenuButton","text":"Open Copilot…","depth":9,"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXMenuButton","text":"Create new...","depth":9,"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXLink","text":"Issues(g then i)","depth":9,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"Pull requests","depth":9,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"Repositories","depth":9,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"You have unread notifications(g then n)","depth":9,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Open user navigation menu","depth":9,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXHeading","text":"Repository navigation","depth":9,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Repository navigation","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Code","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Code","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Pull requests (31)","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Pull requests","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"(","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"31","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":")","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Agents","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Agents","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Actions","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Actions","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Wiki","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Wiki","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Security and quality (22)","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Security and quality","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"(","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"22","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":")","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Insights","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Insights","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Settings","depth":12,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Settings","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Important update","depth":10,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Important update","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"On April 24 we'll start using GitHub Copilot interaction data for AI model training unless you opt out.","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Review this update","depth":10,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Review this update","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"and manage your preferences in your","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"GitHub account settings","depth":10,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"GitHub account settings","depth":11,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":".","depth":10,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Dismiss banner","depth":9,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXHeading","text":"JY-20553 | Improve crm-sync delays #11976 Edit title","depth":13,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"JY-20553 | Improve crm-sync delays","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"#","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"11976","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Edit title","depth":14,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXMenuButton","text":"Preview","depth":13,"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Preview","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Checks pending","depth":13,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Checks pending","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXMenuButton","text":"Code","depth":13,"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Code","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Open","depth":13,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"yalokin-jiminny","depth":15,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"yalokin-jiminny","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"wants to merge 21 commits into","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"master","depth":15,"role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"master","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"from","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"JY-20553-debug-crm-sync-delays","depth":16,"role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"JY-20553-debug-crm-sync-delays","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Copy head branch name to clipboard","depth":16,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Lines changed: 907 additions & 132 deletions","depth":14,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Conversation (5)","depth":16,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Conversation","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"(","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"5","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":")","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Commits (21)","depth":16,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Commits","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"(","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"21","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":")","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Checks (2)","depth":16,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Checks","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"(","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"2","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":")","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Files changed (14)","depth":16,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true},{"role":"AXStaticText","text":"Files changed","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"(","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"14","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":")","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Pull Request Toolbar","depth":14,"bounds":{"left":0.3224734,"top":0.07581804,"width":0.0003324468,"height":0.0007980846},"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Pull Request Toolbar","depth":15,"bounds":{"left":0.3224734,"top":0.07861133,"width":0.030086435,"height":0.08060654},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Collapse file tree","depth":14,"bounds":{"left":0.3224734,"top":0.0650439,"width":0.00930851,"height":0.022346368},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":true},{"role":"AXStaticText","text":"Open","depth":14,"bounds":{"left":0.34507978,"top":0.06943336,"width":0.011968086,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"JY-20553 | Improve crm-sync delays","depth":14,"bounds":{"left":0.3636968,"top":0.058260176,"width":0.08294548,"height":0.016759777},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"JY-20553 | Improve crm-sync delays","depth":16,"bounds":{"left":0.3636968,"top":0.059856344,"width":0.08294548,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"#","depth":15,"bounds":{"left":0.44930187,"top":0.059856344,"width":0.0029920214,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"11976","depth":15,"bounds":{"left":0.45229387,"top":0.059856344,"width":0.012466756,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"All commits","depth":14,"bounds":{"left":0.36103722,"top":0.07182761,"width":0.03374335,"height":0.022346368},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"All commits","depth":16,"bounds":{"left":0.36402926,"top":0.07701516,"width":0.02244016,"height":0.011971269},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"yalokin-jiminny","depth":15,"bounds":{"left":0.3991024,"top":0.07581804,"width":0.029920213,"height":0.014365523},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"yalokin-jiminny","depth":16,"bounds":{"left":0.3991024,"top":0.07701516,"width":0.029920213,"height":0.011971269},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"wants to merge 21 commits into","depth":15,"bounds":{"left":0.4303524,"top":0.07701516,"width":0.059674203,"height":0.011971269},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"master","depth":15,"bounds":{"left":0.49135637,"top":0.074221864,"width":0.018450798,"height":0.017557861},"role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"master","depth":16,"bounds":{"left":0.49335107,"top":0.07741421,"width":0.014461436,"height":0.011572227},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"from","depth":16,"bounds":{"left":0.51113695,"top":0.07701516,"width":0.008643617,"height":0.011971269},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"JY-20553-debug-crm-sync-delays","depth":16,"bounds":{"left":0.52111036,"top":0.074221864,"width":0.07596409,"height":0.017557861},"role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"JY-20553-debug-crm-sync-delays","depth":17,"bounds":{"left":0.523105,"top":0.07741421,"width":0.07197473,"height":0.011572227},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Copy head branch name to clipboard","depth":16,"bounds":{"left":0.5984042,"top":0.07182761,"width":0.00930851,"height":0.022346368},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"6","depth":15,"bounds":{"left":0.8231383,"top":0.070231445,"width":0.002493351,"height":0.011971269},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"/","depth":15,"bounds":{"left":0.8256317,"top":0.070231445,"width":0.0023271276,"height":0.011971269},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"14","depth":15,"bounds":{"left":0.82912236,"top":0.070231445,"width":0.004654255,"height":0.011971269},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"viewed","depth":15,"bounds":{"left":0.83477396,"top":0.070231445,"width":0.013297873,"height":0.011971269},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Checks pending","depth":14,"bounds":{"left":0.85638297,"top":0.0650439,"width":0.04338431,"height":0.022346368},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Checks pending","depth":16,"bounds":{"left":0.86602396,"top":0.070231445,"width":0.030751329,"height":0.011971269},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Submit review","depth":14,"bounds":{"left":0.90242684,"top":0.0650439,"width":0.03856383,"height":0.022346368},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Submit","depth":16,"bounds":{"left":0.9054189,"top":0.070231445,"width":0.014793883,"height":0.011971269},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"review","depth":16,"bounds":{"left":0.92021275,"top":0.070231445,"width":0.012466756,"height":0.011971269},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXMenuButton","text":"Open diff view settings","depth":14,"bounds":{"left":0.94365025,"top":0.0650439,"width":0.00930851,"height":0.022346368},"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Open overview panel","depth":14,"bounds":{"left":0.96127,"top":0.0650439,"width":0.00930851,"height":0.022346368},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Open comments panel","depth":14,"bounds":{"left":0.9719083,"top":0.0650439,"width":0.017287234,"height":0.022346368},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"(","depth":16,"bounds":{"left":0.9802194,"top":0.070231445,"width":0.0026595744,"height":0.011971269},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"0","depth":16,"bounds":{"left":0.982879,"top":0.070231445,"width":0.0026595744,"height":0.011971269},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":")","depth":16,"bounds":{"left":0.98553854,"top":0.070231445,"width":0.0014960107,"height":0.011971269},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXTextField","text":"Filter files…","depth":16,"bounds":{"left":0.3337766,"top":0.11332801,"width":0.06815159,"height":0.023942538},"help_text":"","role_description":"text field","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXMenuButton","text":"Filter options","depth":16,"bounds":{"left":0.40492022,"top":0.112529926,"width":0.010638298,"height":0.025538707},"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXHeading","text":"File tree","depth":15,"bounds":{"left":0.32280585,"top":0.15083799,"width":0.0003324468,"height":0.0007980846},"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"File tree","depth":16,"bounds":{"left":0.32280585,"top":0.15363128,"width":0.014295213,"height":0.0518755},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"app","depth":19,"bounds":{"left":0.3387633,"top":0.15682362,"width":0.008144947,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Console/Commands/Crm","depth":21,"bounds":{"left":0.3414229,"top":0.18276137,"width":0.053690158,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"SyncObjects.php","depth":23,"bounds":{"left":0.34408244,"top":0.20830008,"width":0.036901597,"height":0.013567438},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"SyncObjects.php","depth":24,"bounds":{"left":0.34408244,"top":0.20830008,"width":0.036901597,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Http/Controllers","depth":21,"bounds":{"left":0.3414229,"top":0.23383878,"width":0.034408245,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Internal/WebhookReceiver","depth":23,"bounds":{"left":0.34408244,"top":0.25937748,"width":0.05618351,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"HubspotController.php","depth":25,"bounds":{"left":0.34674203,"top":0.28531525,"width":0.04886968,"height":0.013567438},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"HubspotController.php","depth":26,"bounds":{"left":0.34674203,"top":0.28531525,"width":0.04886968,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Webhook/Hubspot","depth":23,"bounds":{"left":0.34408244,"top":0.31085396,"width":0.039893616,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"EventsController.php","depth":25,"bounds":{"left":0.34674203,"top":0.33639267,"width":0.04488032,"height":0.013567438},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"EventsController.php","depth":26,"bounds":{"left":0.34674203,"top":0.33639267,"width":0.04488032,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"ProcessesWebhooksTrait.php","depth":25,"bounds":{"left":0.34674203,"top":0.36193135,"width":0.06333112,"height":0.013567438},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"ProcessesWebhooksTrait.php","depth":26,"bounds":{"left":0.34674203,"top":0.36193135,"width":0.06333112,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Jobs/Crm","depth":21,"bounds":{"left":0.3414229,"top":0.38786912,"width":0.020777926,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"SyncObjects.php","depth":23,"bounds":{"left":0.34408244,"top":0.41340783,"width":0.036901597,"height":0.013567438},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"SyncObjects.php","depth":24,"bounds":{"left":0.34408244,"top":0.41340783,"width":0.036901597,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"SyncOpportunitiesJob.php","depth":23,"bounds":{"left":0.34408244,"top":0.43894652,"width":0.057513297,"height":0.013567438},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"SyncOpportunitiesJob.php","depth":24,"bounds":{"left":0.34408244,"top":0.43894652,"width":0.057513297,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Services/Crm","depth":21,"bounds":{"left":0.3414229,"top":0.46448523,"width":0.028756648,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Hubspot/ServiceTraits","depth":23,"bounds":{"left":0.34408244,"top":0.49002394,"width":0.04720745,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"OpportunitySyncTrait.php","depth":25,"bounds":{"left":0.34674203,"top":0.5159617,"width":0.05518617,"height":0.013567438},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"OpportunitySyncTrait.php","depth":26,"bounds":{"left":0.34674203,"top":0.5159617,"width":0.05518617,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"BaseService.php","depth":23,"bounds":{"left":0.34408244,"top":0.5415004,"width":0.036070477,"height":0.013567438},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"BaseService.php","depth":24,"bounds":{"left":0.34408244,"top":0.5415004,"width":0.036070477,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"tests","depth":19,"bounds":{"left":0.3387633,"top":0.56703913,"width":0.010638298,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Feature/Services/Crm","depth":21,"bounds":{"left":0.3414229,"top":0.5925778,"width":0.04654255,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"BaseServiceTest.php","depth":23,"bounds":{"left":0.34408244,"top":0.61851555,"width":0.044714097,"height":0.013567438},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"BaseServiceTest.php","depth":24,"bounds":{"left":0.34408244,"top":0.61851555,"width":0.044714097,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Unit","depth":21,"bounds":{"left":0.3414229,"top":0.6440543,"width":0.00880984,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Http/Controllers/Webhook/Hubspot","depth":23,"bounds":{"left":0.34408244,"top":0.669593,"width":0.07579787,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"ProcessesWebhooksTraitTest.php","depth":25,"bounds":{"left":0.34674203,"top":0.69513166,"width":0.072140954,"height":0.013567438},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"ProcessesWebhooksTraitTest.php","depth":26,"bounds":{"left":0.34674203,"top":0.69513166,"width":0.072140954,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Jobs/Crm","depth":23,"bounds":{"left":0.34408244,"top":0.7206704,"width":0.020777926,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"SyncObjectsTest.php","depth":25,"bounds":{"left":0.34674203,"top":0.74660814,"width":0.045545213,"height":0.013567438},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"SyncObjectsTest.php","depth":26,"bounds":{"left":0.34674203,"top":0.74660814,"width":0.045545213,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"SyncOpportunitiesJobTest.php","depth":25,"bounds":{"left":0.34674203,"top":0.7721468,"width":0.06615692,"height":0.013567438},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"SyncOpportunitiesJobTest.php","depth":26,"bounds":{"left":0.34674203,"top":0.7721468,"width":0.06615692,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Services/Crm/Hubspot/ServiceTraits","depth":23,"bounds":{"left":0.34408244,"top":0.79768556,"width":0.0774601,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"OpportunitySyncTest.php","depth":25,"bounds":{"left":0.34674203,"top":0.82322425,"width":0.0546875,"height":0.013567438},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"OpportunitySyncTest.php","depth":26,"bounds":{"left":0.34674203,"top":0.82322425,"width":0.0546875,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"OpportunitySyncTraitSyncOpportunitiesTest.php","depth":25,"bounds":{"left":0.34674203,"top":0.848763,"width":0.10405585,"height":0.013567438},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"OpportunitySyncTraitSyncOpportunitiesTest.php","depth":26,"bounds":{"left":0.34674203,"top":0.848763,"width":0.10405585,"height":0.013567438},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Expand file","depth":14,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXHeading","text":"app/Console/Commands/Crm/SyncObjects.php","depth":15,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXLink","text":"app/Console/Commands/Crm/SyncObjects.php","depth":16,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"app/Console/Commands/Crm/SyncObjects.php","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Copy file name to clipboard","depth":15,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Expand all lines: app/Console/Commands/Crm/SyncObjects.php","depth":15,"role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Lines changed: 22 additions & 12 deletions","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXCheckBox","text":"Viewed","depth":14,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Viewed","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Comment on this file","depth":14,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXMenuButton","text":"More options","depth":14,"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Expand file","depth":14,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXHeading","text":"app/Http/Controllers/Internal/WebhookReceiver/HubspotController.php","depth":15,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXLink","text":"app/Http/Controllers/Internal/WebhookReceiver/HubspotController.php","depth":16,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"app/Http/Controllers/Internal/WebhookReceiver/HubspotController.php","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Copy file name to clipboard","depth":15,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Expand all lines: app/Http/Controllers/Internal/WebhookReceiver/HubspotController.php","depth":15,"role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Lines changed: 3 additions & 2 deletions","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXCheckBox","text":"Viewed","depth":14,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Viewed","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Comment on this file","depth":14,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXMenuButton","text":"More options","depth":14,"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Expand file","depth":14,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXHeading","text":"app/Http/Controllers/Webhook/Hubspot/EventsController.php","depth":15,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXLink","text":"app/Http/Controllers/Webhook/Hubspot/EventsController.php","depth":16,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"app/Http/Controllers/Webhook/Hubspot/EventsController.php","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Copy file name to clipboard","depth":15,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Expand all lines: app/Http/Controllers/Webhook/Hubspot/EventsController.php","depth":15,"role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Lines changed: 1 addition & 5 deletions","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXCheckBox","text":"Viewed","depth":14,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Viewed","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Comment on this file","depth":14,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXMenuButton","text":"More options","depth":14,"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Expand file","depth":14,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXHeading","text":"app/Http/Controllers/Webhook/Hubspot/ProcessesWebhooksTrait.php","depth":15,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXLink","text":"app/Http/Controllers/Webhook/Hubspot/ProcessesWebhooksTrait.php","depth":16,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"app/Http/Controllers/Webhook/Hubspot/ProcessesWebhooksTrait.php","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Copy file name to clipboard","depth":15,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Expand all lines: app/Http/Controllers/Webhook/Hubspot/ProcessesWebhooksTrait.php","depth":15,"role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Lines changed: 63 additions & 12 deletions","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXCheckBox","text":"Viewed","depth":14,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Viewed","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Comment on this file","depth":14,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXMenuButton","text":"More options","depth":14,"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Expand file","depth":14,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXHeading","text":"app/Jobs/Crm/SyncObjects.php","depth":15,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXLink","text":"app/Jobs/Crm/SyncObjects.php","depth":16,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"app/Jobs/Crm/SyncObjects.php","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Copy file name to clipboard","depth":15,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Expand all lines: app/Jobs/Crm/SyncObjects.php","depth":15,"role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Lines changed: 23 additions & 15 deletions","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXCheckBox","text":"Viewed","depth":14,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Viewed","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Comment on this file","depth":14,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXMenuButton","text":"More options","depth":14,"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Expand file","depth":14,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXHeading","text":"app/Jobs/Crm/SyncOpportunitiesJob.php","depth":15,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXLink","text":"app/Jobs/Crm/SyncOpportunitiesJob.php","depth":16,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"app/Jobs/Crm/SyncOpportunitiesJob.php","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Copy file name to clipboard","depth":15,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Expand all lines: app/Jobs/Crm/SyncOpportunitiesJob.php","depth":15,"role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Lines changed: 11 additions & 1 deletion","depth":15,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXCheckBox","text":"Viewed","depth":14,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":true,"is_selected":false},{"role":"AXStaticText","text":"Viewed","depth":16,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Comment on this file","depth":14,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXMenuButton","text":"More options","depth":14,"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Collapse file","depth":14,"bounds":{"left":0.42952126,"top":0.103751,"width":0.00930851,"height":0.022346368},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXHeading","text":"app/Services/Crm/Hubspot/ServiceTraits/OpportunitySyncTrait.php","depth":15,"bounds":{"left":0.4401596,"top":0.10654429,"width":0.15109707,"height":0.016759777},"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXLink","text":"app/Services/Crm/Hubspot/ServiceTraits/OpportunitySyncTrait.php","depth":16,"bounds":{"left":0.4401596,"top":0.10814046,"width":0.15109707,"height":0.013567438},"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"app/Services/Crm/Hubspot/ServiceTraits/OpportunitySyncTrait.php","depth":18,"bounds":{"left":0.4401596,"top":0.110135674,"width":0.15109707,"height":0.011572227},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Copy file name to clipboard","depth":15,"bounds":{"left":0.59391624,"top":0.103751,"width":0.00930851,"height":0.022346368},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Expand all lines: app/Services/Crm/Hubspot/ServiceTraits/OpportunitySyncTrait.php","depth":15,"bounds":{"left":0.60322475,"top":0.103751,"width":0.00930851,"height":0.022346368},"role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Lines changed: 11 additions & 6 deletions","depth":15,"bounds":{"left":0.90425533,"top":0.11612131,"width":0.019946808,"height":0.11412609},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXCheckBox","text":"Not Viewed","depth":14,"bounds":{"left":0.93567157,"top":0.103751,"width":0.026595745,"height":0.022346368},"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Viewed","depth":16,"bounds":{"left":0.9453125,"top":0.108938545,"width":0.013962766,"height":0.011971269},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Comment on this file","depth":14,"bounds":{"left":0.96492684,"top":0.103751,"width":0.00930851,"height":0.022346368},"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXMenuButton","text":"More options","depth":14,"bounds":{"left":0.976895,"top":0.103751,"width":0.00930851,"height":0.022346368},"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Original file line number","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Original file line","depth":17,"bounds":{"left":0.44481382,"top":0.0,"width":0.018118352,"height":0.030327214},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Diff line number","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Diff line change","depth":17,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"@@ -43,17 +43,20 @@ trait OpportunitySyncTrait","depth":18,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"43","depth":16,"bounds":{"left":0.4331782,"top":0.0,"width":0.004654255,"height":0.011572227},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"43","depth":16,"bounds":{"left":0.7140958,"top":0.0,"width":0.0048204786,"height":0.011572227},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"44","depth":16,"bounds":{"left":0.4331782,"top":0.0,"width":0.004654255,"height":0.011572227},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"public","depth":18,"bounds":{"left":0.46176863,"top":0.0,"width":0.014295213,"height":0.011572227},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"function","depth":18,"bounds":{"left":0.47855717,"top":0.0,"width":0.019115692,"height":0.011572227},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"syncOpportunities","depth":18,"bounds":{"left":0.50016624,"top":0.0,"width":0.040724736,"height":0.011572227},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"(","depth":18,"bounds":{"left":0.54089093,"top":0.0,"width":0.0023271276,"height":0.011572227},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"array","depth":18,"bounds":{"left":0.5432181,"top":0.0,"width":0.012134309,"height":0.011572227},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"$","depth":18,"bounds":{"left":0.55767953,"top":0.0,"width":0.002493351,"height":0.011572227},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"parameters","depth":18,"bounds":{"left":0.56017286,"top":0.0,"width":0.023936171,"height":0.011572227},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":", ?","depth":18,"bounds":{"left":0.58410907,"top":0.0,"width":0.0071476065,"height":0.011572227},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"string","depth":18,"bounds":{"left":0.5912567,"top":0.0,"width":0.014461436,"height":0.011572227},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"$","depth":18,"bounds":{"left":0.6080452,"top":0.0,"width":0.002493351,"height":0.011572227},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"strategy","depth":18,"bounds":{"left":0.61053854,"top":0.0,"width":0.019115692,"height":0.011572227},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"=","depth":18,"bounds":{"left":0.6296542,"top":0.0,"width":0.0071476065,"height":0.011572227},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"null","depth":18,"bounds":{"left":0.63680184,"top":0.0,"width":0.009640957,"height":0.011572227},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"):","depth":18,"bounds":{"left":0.64644283,"top":0.0,"width":0.0071476065,"height":0.011572227},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"int","depth":18,"bounds":{"left":0.65359044,"top":0.0,"width":0.00731383,"height":0.011572227},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"44","depth":16,"bounds":{"left":0.7140958,"top":0.0,"width":0.0048204786,"height":0.011572227},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"public","depth":18,"bounds":{"left":0.74268615,"top":0.0,"width":0.014461436,"height":0.011572227},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"function","depth":18,"bounds":{"left":0.75947475,"top":0.0,"width":0.019281914,"height":0.011572227},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"syncOpportunities","depth":18,"bounds":{"left":0.78108376,"top":0.0,"width":0.04089096,"height":0.011572227},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"(","depth":18,"bounds":{"left":0.82197475,"top":0.0,"width":0.0023271276,"height":0.011572227},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"array","depth":18,"bounds":{"left":0.82430184,"top":0.0,"width":0.011968086,"height":0.011572227},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"$","depth":18,"bounds":{"left":0.8387633,"top":0.0,"width":0.0023271276,"height":0.011572227},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"parameters","depth":18,"bounds":{"left":0.84109044,"top":0.0,"width":0.023936171,"height":0.011572227},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":", ?","depth":18,"bounds":{"left":0.8650266,"top":0.0,"width":0.00731383,"height":0.011572227},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"string","depth":18,"bounds":{"left":0.87234044,"top":0.0,"width":0.014295213,"height":0.011572227},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"$","depth":18,"bounds":{"left":0.889129,"top":0.0,"width":0.0023271276,"height":0.011572227},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"strategy","depth":18,"bounds":{"left":0.8914561,"top":0.0,"width":0.019281914,"height":0.011572227},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"=","depth":18,"bounds":{"left":0.91073805,"top":0.0,"width":0.0071476065,"height":0.011572227},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"null","depth":18,"bounds":{"left":0.91788566,"top":0.0,"width":0.009640957,"height":0.011572227},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"):","depth":18,"bounds":{"left":0.9275266,"top":0.0,"width":0.0071476065,"height":0.011572227},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"int","depth":18,"bounds":{"left":0.9346742,"top":0.0,"width":0.0071476065,"height":0.011572227},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"45","depth":16,"bounds":{"left":0.4331782,"top":0.0,"width":0.004654255,"height":0.011572227},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"{","depth":18,"bounds":{"left":0.45212767,"top":0.0,"width":0.011968086,"height":0.011572227},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"45","depth":16,"bounds":{"left":0.7140958,"top":0.0,"width":0.0048204786,"height":0.011572227},"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"{","depth":18,"bounds":{"left":0.73321146,"top":0.0,"width":0.011968086,"height":0.011572227},"help_text":"","role_description":"text","subrole":"AXUnknown"}]...
|
-7681915147505659684
|
6900962689653743917
|
visual_change
|
accessibility
|
NULL
|
Platform Sprint 2 Q2 - Platform Team - Scrum Board Platform Sprint 2 Q2 - Platform Team - Scrum Board - Jira
JY-20553 | Improve crm-sync delays by yalokin-jiminny · Pull Request #11976 · jiminny/app
JY-20553 | Improve crm-sync delays by yalokin-jiminny · Pull Request #11976 · jiminny/app
Close tab
[SRD-6793] Les Mills activity types not pulling in - Jira
[SRD-6793] Les Mills activity types not pulling in - Jira
JY-20698 handle failed field sync on playbook import activity types by LakyLak · Pull Request #11988 · jiminny/app
JY-20698 handle failed field sync on playbook import activity types by LakyLak · Pull Request #11988 · jiminny/app
JY-20692 change confirmation parameter by LakyLak · Pull Request #11986 · jiminny/app
JY-20692 change confirmation parameter by LakyLak · Pull Request #11986 · jiminny/app
[JY-20543] AJ Reports > Tracking - Jira
[JY-20543] AJ Reports > Tracking - Jira
[JY-18909] [Part2] Automated reports with Ask Jiminny - Jira
[JY-18909] [Part2] Automated reports with Ask Jiminny - Jira
Ask Jiminny Reports by nikolay-yankov · Pull Request #11894 · jiminny/app
Ask Jiminny Reports by nikolay-yankov · Pull Request #11894 · jiminny/app
New Tab
New Tab
Product Growth Platform | Userpilot
Product Growth Platform | Userpilot
Userpilot | Logged-activity
Userpilot | Logged-activity
fix(security): composer dependency updates – 2026-04-15 by github-actions[bot] · Pull Request #11970 · jiminny/app
fix(security): composer dependency updates – 2026-04-15 by github-actions[bot] · Pull Request #11970 · jiminny/app
Pipelines - jiminny/app
Pipelines - jiminny/app
Feed — jiminny — Sentry
Feed — jiminny — Sentry
fix(security): composer dependency updates – 2026-04-15 by github-actions[bot] · Pull Request #11970 · jiminny/app
fix(security): composer dependency updates – 2026-04-15 by github-actions[bot] · Pull Request #11970 · jiminny/app
Jiminny
Jiminny
Jiminny
Jiminny
Jiminny
Jiminny
New Tab
Customize sidebar
Close Google Gemini (⌃X)
Tabs from other devices
Open history (⇧⌘H)
Open bookmarks (⌘B)
AI Chat settings
Close
WORK, Google Account: [EMAIL]
Main menu
New chat
Gemini
New Chat
Open menu for conversation actions.
Conversation with Gemini
Conversation with Gemini
Copy prompt
You said checkout to remote branch
You said
checkout to remote branch
Listen
Show more options
Show thinking
Gemini said
Gemini said
Here is the standard way to check out a remote branch in Git.
Step 1: Fetch the latest remote branches
Step 1: Fetch the latest remote branches
Before checking out, it is best practice to ensure your local repository knows about the latest branches on the remote. Run:
Bash
Copy code
git fetch
Step 2: Check out the branch
Step 2: Check out the branch
You have a few options depending on your version of Git and whether you want to use the exact same name as the remote branch.
Option A: The simplest way (Recommended)
Option A: The simplest way (Recommended)
If the remote branch exists and you don't have a local branch with the same name, Git will automatically create the local branch and set it up to track the remote one.
Using the newer
switch
command:
Bash
Copy code
git switch <branch-name>
Or using the traditional
checkout
command:
Bash
Copy code
git checkout <branch-name>
(Note: Do not include
origin/
in this command. Just use the branch name, e.g.,
git checkout feature-branch
)
Option B: The explicit way
Option B: The explicit way
If Option A doesn't work (for example, if you have multiple remotes), or if you want to give your local branch a
different name
than the remote branch, you can explicitly map them:
Bash
Copy code
git checkout -b <your-local-branch-name> origin/<remote-branch-name>
How to verify it worked
How to verify it worked
To confirm you are on the right branch and tracking the remote properly, run:
Bash
Copy code
git branch -vv
This will list your local branches, highlight your current branch, and show which remote branch it is tracking (e.g.,
[origin/<branch-name>]
).
Copy prompt
Edit
You said lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-18909-automated-reports-ask-jiminny) $ git fetch lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-18909-automated-reports-ask-jiminny) $ co -b JY-20553-debug-crm-sync-delays orign/JY-20553-debug-crm-sync-delays fatal: 'orign/JY-20553-debug-crm-sync-delays' is not a commit and a branch 'JY-20553-debug-crm-sync-delays' cannot be created from it lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-18909-automated-reports-ask-jiminny) $ git checkout -b JY-20553-debug-crm-sync-delays orign/JY-20553-debug-crm-sync-delays fatal: 'orign/JY-20553-debug-crm-sync-delays' is not a commit and a branch 'JY-20553-debug-crm-sync-delays' cannot be created from it lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-18909-automated-reports-ask-jiminny) $
You said
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-18909-automated-reports-ask-jiminny) $ git fetch
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-18909-automated-reports-ask-jiminny) $ co -b JY-20553-debug-crm-sync-delays orign/JY-20553-debug-crm-sync-delays
fatal: 'orign/JY-20553-debug-crm-sync-delays' is not a commit and a branch 'JY-20553-debug-crm-sync-delays' cannot be created from it
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-18909-automated-reports-ask-jiminny) $ git checkout -b JY-20553-debug-crm-sync-delays orign/JY-20553-debug-crm-sync-delays
fatal: 'orign/JY-20553-debug-crm-sync-delays' is not a commit and a branch 'JY-20553-debug-crm-sync-delays' cannot be created from it
lukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-18909-automated-reports-ask-jiminny) $
Expand
Listen
Show more options
Show thinking
Gemini said
Gemini said
Ah, it looks like just a tiny typo! You spelled
origin
as
orign
in your commands.
Git is throwing that error because it can't find a remote named "orign".
Here is the corrected command:
Bash
Copy code
git checkout -b JY-20553-debug-crm-sync-delays origin/JY-20553-debug-crm-sync-delays
An Easier Shortcut
An Easier Shortcut
Since your local branch name matches the remote branch exactly, you can actually skip the
-b
and
origin/
entirely. Git is smart enough to figure it out automatically:
Bash
Copy code
git checkout JY-20553-debug-crm-sync-delays
(Or if
co
is your alias for checkout, just
co JY-20553-debug-crm-sync-delays
will work!)
Enter a prompt for Gemini
encrypted
Enter a prompt for Gemini
encrypted
Open upload file menu
Tools
Open mode picker
Pro
Microphone
Your Jiminny chats aren’t used to improve our models. Gemini is AI and can make mistakes, including about people.
Your privacy & Gemini Opens in a new window
Your privacy & Gemini
Opens in a new window
Summarize page
Summarize page
Skip to content
Skip to content
Open menu
Homepage (g then d)
jiminny
jiminny
app
app
Search or jump to…
Type
/
to search
Chat with Copilot
Open Copilot…
Create new...
Issues(g then i)
Pull requests
Repositories
You have unread notifications(g then n)
Open user navigation menu
Repository navigation
Repository navigation
Code
Code
Pull requests (31)
Pull requests
(
31
)
Agents
Agents
Actions
Actions
Wiki
Wiki
Security and quality (22)
Security and quality
(
22
)
Insights
Insights
Settings
Settings
Important update
Important update
On April 24 we'll start using GitHub Copilot interaction data for AI model training unless you opt out.
Review this update
Review this update
and manage your preferences in your
GitHub account settings
GitHub account settings
.
Dismiss banner
JY-20553 | Improve crm-sync delays #11976 Edit title
JY-20553 | Improve crm-sync delays
#
11976
Edit title
Preview
Preview
Checks pending
Checks pending
Code
Code
Open
yalokin-jiminny
yalokin-jiminny
wants to merge 21 commits into
master
master
from
JY-20553-debug-crm-sync-delays
JY-20553-debug-crm-sync-delays
Copy head branch name to clipboard
Lines changed: 907 additions & 132 deletions
Conversation (5)
Conversation
(
5
)
Commits (21)
Commits
(
21
)
Checks (2)
Checks
(
2
)
Files changed (14)
Files changed
(
14
)
Pull Request Toolbar
Pull Request Toolbar
Collapse file tree
Open
JY-20553 | Improve crm-sync delays
JY-20553 | Improve crm-sync delays
#
11976
All commits
All commits
yalokin-jiminny
yalokin-jiminny
wants to merge 21 commits into
master
master
from
JY-20553-debug-crm-sync-delays
JY-20553-debug-crm-sync-delays
Copy head branch name to clipboard
6
/
14
viewed
Checks pending
Checks pending
Submit review
Submit
review
Open diff view settings
Open overview panel
Open comments panel
(
0
)
Filter files…
Filter options
File tree
File tree
app
Console/Commands/Crm
SyncObjects.php
SyncObjects.php
Http/Controllers
Internal/WebhookReceiver
HubspotController.php
HubspotController.php
Webhook/Hubspot
EventsController.php
EventsController.php
ProcessesWebhooksTrait.php
ProcessesWebhooksTrait.php
Jobs/Crm
SyncObjects.php
SyncObjects.php
SyncOpportunitiesJob.php
SyncOpportunitiesJob.php
Services/Crm
Hubspot/ServiceTraits
OpportunitySyncTrait.php
OpportunitySyncTrait.php
BaseService.php
BaseService.php
tests
Feature/Services/Crm
BaseServiceTest.php
BaseServiceTest.php
Unit
Http/Controllers/Webhook/Hubspot
ProcessesWebhooksTraitTest.php
ProcessesWebhooksTraitTest.php
Jobs/Crm
SyncObjectsTest.php
SyncObjectsTest.php
SyncOpportunitiesJobTest.php
SyncOpportunitiesJobTest.php
Services/Crm/Hubspot/ServiceTraits
OpportunitySyncTest.php
OpportunitySyncTest.php
OpportunitySyncTraitSyncOpportunitiesTest.php
OpportunitySyncTraitSyncOpportunitiesTest.php
Expand file
app/Console/Commands/Crm/SyncObjects.php
app/Console/Commands/Crm/SyncObjects.php
app/Console/Commands/Crm/SyncObjects.php
Copy file name to clipboard
Expand all lines: app/Console/Commands/Crm/SyncObjects.php
Lines changed: 22 additions & 12 deletions
Viewed
Viewed
Comment on this file
More options
Expand file
app/Http/Controllers/Internal/WebhookReceiver/HubspotController.php
app/Http/Controllers/Internal/WebhookReceiver/HubspotController.php
app/Http/Controllers/Internal/WebhookReceiver/HubspotController.php
Copy file name to clipboard
Expand all lines: app/Http/Controllers/Internal/WebhookReceiver/HubspotController.php
Lines changed: 3 additions & 2 deletions
Viewed
Viewed
Comment on this file
More options
Expand file
app/Http/Controllers/Webhook/Hubspot/EventsController.php
app/Http/Controllers/Webhook/Hubspot/EventsController.php
app/Http/Controllers/Webhook/Hubspot/EventsController.php
Copy file name to clipboard
Expand all lines: app/Http/Controllers/Webhook/Hubspot/EventsController.php
Lines changed: 1 addition & 5 deletions
Viewed
Viewed
Comment on this file
More options
Expand file
app/Http/Controllers/Webhook/Hubspot/ProcessesWebhooksTrait.php
app/Http/Controllers/Webhook/Hubspot/ProcessesWebhooksTrait.php
app/Http/Controllers/Webhook/Hubspot/ProcessesWebhooksTrait.php
Copy file name to clipboard
Expand all lines: app/Http/Controllers/Webhook/Hubspot/ProcessesWebhooksTrait.php
Lines changed: 63 additions & 12 deletions
Viewed
Viewed
Comment on this file
More options
Expand file
app/Jobs/Crm/SyncObjects.php
app/Jobs/Crm/SyncObjects.php
app/Jobs/Crm/SyncObjects.php
Copy file name to clipboard
Expand all lines: app/Jobs/Crm/SyncObjects.php
Lines changed: 23 additions & 15 deletions
Viewed
Viewed
Comment on this file
More options
Expand file
app/Jobs/Crm/SyncOpportunitiesJob.php
app/Jobs/Crm/SyncOpportunitiesJob.php
app/Jobs/Crm/SyncOpportunitiesJob.php
Copy file name to clipboard
Expand all lines: app/Jobs/Crm/SyncOpportunitiesJob.php
Lines changed: 11 additions & 1 deletion
Viewed
Viewed
Comment on this file
More options
Collapse file
app/Services/Crm/Hubspot/ServiceTraits/OpportunitySyncTrait.php
app/Services/Crm/Hubspot/ServiceTraits/OpportunitySyncTrait.php
app/Services/Crm/Hubspot/ServiceTraits/OpportunitySyncTrait.php
Copy file name to clipboard
Expand all lines: app/Services/Crm/Hubspot/ServiceTraits/OpportunitySyncTrait.php
Lines changed: 11 additions & 6 deletions
Not Viewed
Viewed
Comment on this file
More options
Original file line number
Original file line
Diff line number
Diff line change
@@ -43,17 +43,20 @@ trait OpportunitySyncTrait
43
43
44
public
function
syncOpportunities
(
array
$
parameters
, ?
string
$
strategy
=
null
):
int
44
public
function
syncOpportunities
(
array
$
parameters
, ?
string
$
strategy
=
null
):
int
45
{
45
{...
|
NULL
|
|
55532
|
NULL
|
0
|
2026-04-20T09:53:20.937516+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-20/1776 /Users/lukas/.screenpipe/data/data/2026-04-20/1776678800937_m1.jpg...
|
PhpStorm
|
faVsco.js – OpportunitySyncTrait.php
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
#11976 on JY-20553-debug- Project: faVsco.js, menu
#11976 on JY-20553-debug-crm-sync-delays, menu
Start Listening for PHP Debug Connections
RequestGenerateAskJiminnyReportJobTest
Run 'RequestGenerateAskJiminnyReportJobTest'
Debug 'RequestGenerateAskJiminnyReportJobTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Code changed:
Hide
Sync Changes
Hide This Notification
33
2
19
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Services\Crm\Hubspot\ServiceTraits;
use Carbon\Carbon;
use HubSpot\Client\Crm\Deals\Model\CollectionResponseAssociatedId;
use Jiminny\Exceptions\InvalidArgumentException;
use Jiminny\Models\Account;
use Exception;
use Jiminny\Component\DealInsights\Forecast\Forecast;
use Jiminny\Jobs\Crm\MatchActivitiesToNewOpportunity;
use Jiminny\Models\Contact;
use Jiminny\Models\Crm\BusinessProcess;
use Jiminny\Exceptions\CrmException;
use Jiminny\Models\Opportunity;
use Illuminate\Support\Collection;
use Jiminny\Models\Stage;
use Jiminny\Repositories\Crm\CrmEntityRepository;
use Jiminny\Services\Crm\Hubspot\DealFieldsService;
use Jiminny\Services\Crm\Hubspot\OpportunitySyncStrategy\HubspotSingleSyncStrategy;
use Jiminny\Services\Crm\Hubspot\WebhookSyncBatchProcessor;
use Jiminny\Services\Crm\OpportunitySyncStrategyResolver;
use Jiminny\Utils\CurrencyFormatter;
/**
* Optimized sync methods for better performance
* These methods can be integrated into SyncCrmEntitiesTrait for significant performance gains
*/
trait OpportunitySyncTrait
{
private const int BATCH_SIZE = 100;
private const int BATCH_PROCESS_SIZE = 800;
protected OpportunitySyncStrategyResolver $opportunitySyncStrategyResolver;
protected CrmEntityRepository $crmEntityRepository;
protected DealFieldsService $dealFieldsService;
private ?array $cachedClosedDealStages = null;
private array $cachedBusinessProcesses = [];
private array $cachedStages = [];
public function syncOpportunities(array $parameters, ?string $strategy = null): int
{
$startTime = microtime(true);
$strategies = $this->opportunitySyncStrategyResolver->getStrategies($this->config, $strategy);
$parameters['config'] = $this->config;
$syncCount = 0;
$reportedTotal = 0;
$lastSyncedId = [];
$strategyNames = [];
try {
foreach ($strategies as $strategyName => $syncStrategy) {
$strategyNames[] = $strategyName;
$this->logger->info(
'[' . $this->getDisplayName() . '] Syncing opportunities using strategy: ' . $strategyName,
['team' => $this->team->getId()]
);
$total = 0;
$lastId = null;
$buffer = [];
// HubspotWebhookBatchSyncStrategy returns empty generator, this is for other strategies
foreach ($syncStrategy->fetchOpportunities($parameters, $total, $lastId) as $hsOpportunity) {
$buffer[] = $hsOpportunity;
// process every 800 rows (fits < 1 000 association limit)
if (\count($buffer) >= self::BATCH_PROCESS_SIZE) {
$syncCount += $this->processOpportunityBatch($buffer);
$buffer = [];
}
}
// leftovers
if ($buffer) {
$syncCount += $this->processOpportunityBatch($buffer);
}
$reportedTotal += $total;
$lastSyncedId = $lastId;
}
} catch (\HubSpot\Client\Crm\Deals\ApiException | CrmException $e) {
$this->handleSyncException($e, $parameters);
}
$durationMs = round((microtime(true) - $startTime) * 1000, 2);
$this->logger->info(
'[HubSpot] Synced opportunities',
[
'team' => $this->team->getId(),
'strategies' => implode(',', $strategyNames),
'sync_count' => $syncCount,
'total' => $reportedTotal,
'last_synced_id' => $lastSyncedId,
'duration_ms' => $durationMs,
]
);
return $reportedTotal;
}
private function handleSyncException(\Throwable $e, array $parameters): void
{
if (($parameters['since'] ?? null) instanceof Carbon) {
$parameters['since'] = $parameters['since']->toDateTimeString();
}
$parameters['config'] = $this->config->getId();
$this->logger->warning('[' . $this->getDisplayName() . '] Sync opportunities failed', [
'teamId' => $this->team->getUuid(),
'parameters' => $parameters,
'reason' => $e->getMessage(),
]);
}
/**
* @inheritdoc
*/
public function syncOpportunity(string $crmId): ?Opportunity
{
$strategy = $this->opportunitySyncStrategyResolver->resolve(
$this->config,
OpportunitySyncStrategyResolver::SINGLE_SYNC_OPPORTUNITY_STRATEGY,
);
$parameters = [
'config' => $this->config,
'crm_id' => $crmId,
];
try {
if (! $strategy instanceof HubspotSingleSyncStrategy) {
throw new InvalidArgumentException('Strategy must by HubspotSingleSyncStrategy');
}
$hsOpportunity = $strategy->fetchOpportunity($parameters);
} catch (\HubSpot\Client\Crm\Deals\ApiException $e) {
$this->logger->info('[' . $this->getDisplayName() . '] Opportunity not found', [
'teamId' => $this->team->getUuid(),
'crmId' => $crmId,
'reason' => $e->getMessage(),
]);
return null;
}
$hsOpportunity['associations'] = $this->convertDealAssociations($hsOpportunity['associations'] ?? []);
return $this->importOrUpdateOpportunity($hsOpportunity);
}
/**
* Process webhook-collected opportunity batches.
*
* Drains Redis sets containing company CRM IDs collected from webhook events
* and dispatches ImportOpportunityBatch jobs for batch processing.
*
* @return int Number of opportunity IDs dispatched to jobs
*/
public function batchSyncOpportunities(): int
{
$configId = $this->team->getCrmConfiguration()->getId();
return $this->batchProcessor->processBatchesForObjectType(
WebhookSyncBatchProcessor::OBJECT_TYPE_DEAL,
$configId
);
}
/**
* Import a batch of opportunities by their CRM IDs.
* Fetches opportunity data from HubSpot API and delegates to importOpportunityBatch().
*
* @param array<string> $crmIds HubSpot deal CRM IDs
*
* @return array{success: array, failed_ids: array, errors?: array<string, string>}
*/
public function importOpportunityBatchByIds(array $crmIds): array
{
$fields = $this->dealFieldsService->getFieldsForConfiguration($this->config);
$allDeals = [];
foreach (array_chunk($crmIds, self::BATCH_SIZE) as $chunk) {
$deals = $this->client->getOpportunitiesByIds($chunk, $fields);
foreach ($deals as $deal) {
$allDeals[] = $deal;
}
}
// IDs not returned by HubSpot are likely deleted or inaccessible deals.
// These are not failures — retrying won't bring them back.
$fetchedIds = array_map('strval', array_column($allDeals, 'id'));
$notFoundIds = array_values(array_diff(array_map('strval', $crmIds), $fetchedIds));
if (! empty($notFoundIds)) {
$this->logger->info('[' . $this->getDisplayName() . '] CRM IDs not found in HubSpot (likely deleted)', [
'teamId' => $this->team->getId(),
'notFoundCount' => \count($notFoundIds),
'notFoundIds' => $notFoundIds,
'requestedCount' => \count($crmIds),
'fetchedCount' => \count($allDeals),
]);
}
if (empty($allDeals)) {
return ['success' => [], 'failed_ids' => []];
}
return $this->importOpportunityBatch($allDeals);
}
private function getClosedDealStages(): array
{
if ($this->cachedClosedDealStages !== null) {
return $this->cachedClosedDealStages;
}
$stages = $this->crmEntityRepository->getOpportunityClosedStages($this->config);
$data = [
'lost' => [],
'won' => [],
];
foreach ($stages as $stage) {
if ($stage->probability == 0.00) {
$data['lost'][] = $stage->crm_provider_id;
}
if ($stage->probability == 100.00) {
$data['won'][] = $stage->crm_provider_id;
}
}
$this->cachedClosedDealStages = $data;
return $data;
}
/**
* Import deals into the database with pre-fetched associations.
*
* API calls here (getAssociationsData, getExistingOpportunityCrmIds) are NOT
* caught — if they throw, the exception propagates to ImportOpportunityBatch::handle()
* where Laravel retries the whole job with backoff. After all retries exhausted,
* failed() requeues all IDs to Redis.
*
* The per-deal loop catches exceptions individually. A deal can end up in three states:
* - success: imported/updated successfully
* - failed_ids: exception thrown (DB constraint violation, corrupt data, etc.)
* These are permanent issues — retrying won't fix them.
* - skipped (null): missing dependencies (no account, unknown pipeline/stage).
* This is acceptable — the deal cannot be imported until those exist.
*/
private function importOpportunityBatch(array $deals): array
{
$syncedOpportunities = [
'success' => [],
'failed_ids' => [],
];
$dealIds = array_column($deals, 'id');
// Shared association/existing-ID preparation is batch-level state. If it fails, rethrow so the
// queue job retries the whole batch and eventually requeues all deal IDs back to Redis.
try {
$companyAssociations = $this->client->getAssociationsData($dealIds, 'deals', 'companies');
$contactAssociations = $this->client->getAssociationsData($dealIds, 'deals', 'contacts');
$associationsData = $this->prepareAssociatedEntities($companyAssociations, $contactAssociations);
$existingCrmIds = $this->crmEntityRepository->getExistingOpportunityCrmIds(
$this->config,
array_map('strval', $dealIds)
);
$existingCrmIdSet = array_flip($existingCrmIds);
} catch (\Throwable $e) {
$this->logger->error('[' . $this->getDisplayName() . '] Failed to fetch associations or existing IDs', [
'teamId' => $this->team->getId(),
'dealCount' => count($dealIds),
'error' => $e->getMessage(),
]);
throw $e;
}
foreach ($deals as $deal) {
try {
$deal['associations'] = $this->prepareAssociationsForOpportunity(
$deal['id'],
$companyAssociations,
$contactAssociations,
$associationsData
);
$syncedOpportunity = $this->importOrUpdateOpportunity(
$deal,
isset($existingCrmIdSet[(string) $deal['id']])
);
if ($syncedOpportunity) {
$syncedOpportunities['success'][] = $syncedOpportunity;
}
} catch (\Throwable $e) {
$this->logger->warning('[' . $this->getDisplayName() . '] Failed to import opportunity', [
'teamId' => $this->team->getId(),
'crmId' => $deal['id'],
'error' => $e->getMessage(),
]);
$syncedOpportunities['failed_ids'][] = $deal['id'];
$syncedOpportunities['errors'][$deal['id']] = $e->getMessage();
}
}
return $syncedOpportunities;
}
/**
* Prepare associated entities for opportunities with optimized batch processing
* Returns structured data with CRM ID to DB ID mappings for each opportunity
*/
private function prepareAssociatedEntities(array $companyAssociations, array $contactAssociations): array
{
// Step 1: Collect all unique company and contact IDs from associations
$allCompanyIds = $this->flattenAssociationIds($companyAssociations);
$allContactIds = $this->flattenAssociationIds($contactAssociations);
// Step 2: Batch sync missing entities and get CRM ID to DB ID mappings
$companyIdMappings = [];
$contactIdMappings = [];
if (! empty($allCompanyIds)) {
$companyIdMappings = $this->prepareAssociatedAccounts($allCompanyIds);
}
if (! empty($allContactIds)) {
$contactIdMappings = $this->prepareAssociatedContacts($allContactIds);
}
return [
'company_id_mappings' => $companyIdMappings,
'contact_id_mappings' => $contactIdMappings,
];
}
/**
* Flatten association data to get unique IDs
*/
private function flattenAssociationIds(array $associations): array
{
$ids = [];
foreach ($associations as $dealAssociations) {
if (is_array($dealAssociations)) {
foreach ($dealAssociations as $id) {
$ids[$id] = true;
}
}
}
return array_keys($ids);
}
/**
* Batch sync missing accounts
*/
private function prepareAssociatedAccounts(array $companyIds): array
{
// Find which accounts already exist
$existingAccounts = $this->crmEntityRepository
->findAccountsByExternalIds($this->config, $companyIds);
$existingCompanyIds = $existingAccounts->pluck('crm_provider_id')->toArray();
$existingAccountsData = $existingAccounts->mapWithKeys(function ($account) {
return [$account->getCrmProviderId() => $account->getId()];
})->toArray();
$missingCompanyIds = array_diff($companyIds, $existingCompanyIds);
if (empty($missingCompanyIds)) {
return $existingAccountsData;
}
$this->logger->info('[' . $this->getDisplayName() . '] Batch syncing missing accounts', [
'teamId' => $this->team->getUuid(),
'total_companies' => count($companyIds),
'existing_companies' => count($existingCompanyIds),
'missing_companies' => count($missingCompanyIds),
]);
// we already have limit on opportunity ids count
// Initialize variable before try block
$syncedAccountsData = [];
try {
$syncedAccountsData = $this->batchSyncCrmObjects('companies', $missingCompanyIds);
} catch (\Throwable $e) {
$this->logger->warning('[' . $this->getDisplayName() . '] Failed to sync missing accounts', [
'size' => count($missingCompanyIds),
'error' => $e->getMessage(),
]);
$syncedAccountsData = [];
}
return $existingAccountsData + $syncedAccountsData;
}
/**
* Prepare associated contacts - find existing and sync missing ones
* Returns mapping of CRM ID to DB ID
*/
private function prepareAssociatedContacts(array $contactIds): array
{
// Find which contacts already exist
$existingContacts = $this->crmEntityRepository
->findContactsByExternalIds($this->config, $contactIds);
$existingContactIds = $existingContacts->pluck('crm_provider_id')->toArray();
// Create mapping for existing contacts
$existingContactsData = $existingContacts->mapWithKeys(function ($contact) {
return [$contact->getCrmProviderId() => $contact->getId()];
})->toArray();
$missingContactIds = array_diff($contactIds, $existingContactIds);
if (empty($missingContactIds)) {
return $existingContactsData;
}
$this->logger->info('[' . $this->getDisplayName() . '] Batch syncing missing contacts', [
'teamId' => $this->team->getUuid(),
'total_contacts' => count($contactIds),
'existing_contacts' => count($existingContactIds),
'missing_contacts' => count($missingContactIds),
]);
// Sync missing contacts using batch API
try {
$syncedContactsData = $this->batchSyncCrmObjects('contacts', $missingContactIds);
} catch (\Throwable $e) {
$this->logger->warning('[' . $this->getDisplayName() . '] Failed to sync missing contacts', [
'size' => count($missingContactIds),
'error' => $e->getMessage(),
]);
$syncedContactsData = [];
}
return $existingContactsData + $syncedContactsData;
}
private function batchSyncCrmObjects(string $objectType, array $crmIds): array
{
$syncObjects = [];
$crmObjectIds = array_values($crmIds);
foreach (array_chunk($crmObjectIds, self::BATCH_SIZE) as $chunk) {
try {
$objects = $objectType === 'companies' ?
$this->client->getCompaniesByIds($chunk, $this->getCompanyFields()) :
$this->client->getContactsByIds($chunk, $this->getContactFields());
foreach ($objects as $objectId => $objectData) {
$this->importCrmObject($objectType, (string) $objectId, $objectData, $syncObjects);
}
$this->logger->info('[' . $this->getDisplayName() . '] Batch synced ' . $objectType, [
'requested_count' => count($chunk),
'synced_count' => count($objects),
]);
} catch (\Throwable $e) {
$this->logger->warning('[' . $this->getDisplayName() . '] Batch ' . $objectType . ' sync failed', [
'ids' => $chunk,
'error' => $e->getMessage(),
]);
}
}
return $syncObjects;
}
private function importCrmObject(string $objectType, string $objectId, mixed $objectData, array &$syncObjects): void
{
try {
$object = $objectType === 'companies' ?
$this->importAccount($objectData) :
$this->importContact($objectData);
if ($object) {
$syncObjects[$object->getCrmProviderId()] = $object->getId();
}
} catch (\Throwable $e) {
$this->logger->warning('[' . $this->getDisplayName() . '] Failed to import batch ' . $objectType, [
'id' => $objectId,
'error' => $e->getMessage(),
]);
}
}
/**
* Prepare associations for a single opportunity
*
* The return value is an array with the following structure:
* [
* 'companies' => [
* $companyCrmId => $companyId,
* ...
* ],
* 'contacts' => [
* $contactCrmId => $contactId,
* ...
* ],
* 'account_id' => $accountId,
* ]
*/
private function prepareAssociationsForOpportunity(
string $oppCrmId,
array $companyAssociations,
array $contactAssociations,
array $associationsData
): array {
$associations = [
'companies' => [],
'contacts' => [],
'account_id' => null, // Primary account for opportunity
];
$oppCompanyIds = $companyAssociations[$oppCrmId] ?? [];
foreach ($oppCompanyIds as $companyCrmId) {
if (isset($associationsData['company_id_mappings'][$companyCrmId])) {
$associations['companies'][$companyCrmId] = $associationsData['company_id_mappings'][$companyCrmId];
// Set primary account (first company becomes primary account)
if ($associations['account_id'] === null) {
$associations['account_id'] = $associationsData['company_id_mappings'][$companyCrmId];
}
}
}
$oppContactIds = $contactAssociations[$oppCrmId] ?? [];
foreach ($oppContactIds as $contactCrmId) {
if (isset($associationsData['contact_id_mappings'][$contactCrmId])) {
$associations['contacts'][$contactCrmId] = $associationsData['contact_id_mappings'][$contactCrmId];
}
}
return $associations;
}
/**
* Update only associations for an opportunity
*/
private function updateOpportunityAssociations(Opportunity $opportunity, array $associations): void
{
// Update contact associations
$this->importOpportunityContacts($opportunity, $associations['contacts']);
// Update company (account) associations
$this->updateOpportunityAccount($opportunity, $associations['account_id']);
}
/**
* Remove all contact associations from an opportunity
*/
private function removeAllOpportunityContacts(Opportunity $opportunity): void
{
$currentCount = (int) $opportunity->contacts()->count();
if ($currentCount > 0) {
$opportunity->contacts()->detach();
$this->logger->info('[' . $this->getDisplayName() . '] Removed all contact associations', [
'opportunity_id' => $opportunity->getId(),
'removed_count' => $currentCount,
]);
}
}
private function updateOpportunityAccount(Opportunity $opportunity, ?int $accountId): void
{
if ($accountId === null) {
// No account ID provided - keep current account
return;
}
$currentAccountId = $opportunity->getAccountId();
// Only update if account has changed
if ($currentAccountId !== $accountId) {
$opportunity->account_id = $accountId;
$opportunity->save();
$this->logger->info('[' . $this->getDisplayName() . '] Updated opportunity account association', [
'opportunity_id' => $opportunity->getId(),
'old_account_id' => $currentAccountId,
'new_account_id' => $accountId,
]);
}
}
/**
* Find existing opportunities by external IDs (OPTIMIZED VERSION)
* Uses batch query for better performance
*/
private function findExistingOpportunities(array $crmIds): Collection
{
return $this->crmEntityRepository
->findOpportunitiesByExternalIds($this->config, $crmIds);
}
private function processOpportunityBatch(array $opportunities): int
{
$syncedOpportunities = $this->importOpportunityBatch($opportunities);
return count($syncedOpportunities['success'] ?? []);
}
/**
* Convert single deal associations from HubSpot format to internal format
* Handles both HubSpot SDK objects and array formats
*
* @param array $opportunityAssociations Raw associations from HubSpot API or pre-processed
*
* @return array Processed associations with DB IDs
*/
private function convertDealAssociations(array $opportunityAssociations): array
{
$associations = $this->initializeAssociationsStructure();
if (empty($opportunityAssociations)) {
return $associations;
}
$associationIds = $this->extractAssociationIds($opportunityAssociations);
$this->processCompanyAssociations($associationIds, $associations);
$this->processContactAssociations($associationIds, $associations);
return $associations;
}
private function initializeAssociationsStructure(): array
{
return [
'companies' => [],
'contacts' => [],
'account_id' => null, // Primary account for opportunity
];
}
private function extractAssociationIds(array $opportunityAssociations): array
{
$associationIds = [];
foreach ($opportunityAssociations as $type => $associationData) {
if (! empty($associationData)) {
$associationIds[$type] = $this->convertSingleDealAssociations($associationData);
}
}
return $associationIds;
}
private function processCompanyAssociations(array $associationIds, array &$associations): void
{
if (empty($associationIds['companies'])) {
return;
}
$companyId = $associationIds['companies'][0];
$account = $this->findOrSyncAccount($companyId);
if ($account instanceof Account) {
$associations['companies'][$companyId] = $account->getId();
$associations['account_id'] = $account->getId();
}
}
private function processContactAssociations(array $associationIds, array &$associations): void
{
if (empty($associationIds['contacts'])) {
return;
}
foreach ($associationIds['contacts'] as $contactId) {
$contact = $this->findOrSyncContact($contactId);
if ($contact instanceof Contact) {
$associations['contacts'][$contactId] = $contact->getId();
}
}
}
private function findOrSyncAccount(string $companyId): ?Account
{
$account = $this->crmEntityRepository->findAccountByExternalId($this->config, $companyId);
if (! $account instanceof Account) {
$account = $this->syncAccount($companyId);
}
return $account;
}
private function findOrSyncContact(string $contactId): ?Contact
{
$contact = $this->crmEntityRepository->findContactByExternalId($this->config, $contactId);
if (! $contact instanceof Contact) {
$contact = $this->syncContact($contactId);
}
return $contact;
}
private function convertSingleDealAssociations($opportunityAssociations = null): array
{
$associationData = [];
if ($opportunityAssociations === null) {
return $associationData;
}
// Handle array input (from extractAssociationIds)
if (is_array($opportunityAssociations)) {
return $opportunityAssociations;
}
// Handle CollectionResponseAssociatedId object
if ($opportunityAssociations instanceof CollectionResponseAssociatedId) {
foreach ($opportunityAssociations->getResults() as $association) {
$associationData[] = $association->getId();
}
}
return $associationData;
}
private function importOrUpdateOpportunity($crmData, ?bool $exists = null): ?Opportunity
{
if (empty($crmData['properties'])) {
return null;
}
$crmId = (string) $crmData['id'];
$properties = $crmData['properties'];
$associations = $crmData['associations'] ?? [];
$opportunityExists = $exists ?? (bool) $this->crmEntityRepository->findOpportunityByExternalId(
$this->config,
$crmId
);
if ($opportunityExists) {
return $this->updateOpportunity($crmId, $properties, $associations);
}
return $this->createOpportunity($crmId, $properties, $associations);
}
/**
* Create new opportunity
*/
private function createOpportunity(string $crmId, array $properties, array $associations): ?Opportunity
{
$accountId = $this->resolveAccountId($associations);
if (! $accountId) {
return null;
}
$businessProcess = $this->resolveBusinessProcess($properties['pipeline'] ?? null);
if (! $businessProcess) {
return null;
}
$stage = $this->resolveStage($businessProcess, $properties['dealstage'] ?? null);
if (! $stage) {
return null;
}
$data = $this->buildOpportunityData($properties, $accountId, $businessProcess, $stage);
$attributes = [
'crm_configuration_id' => $this->config->getId(),
'crm_provider_id' => $crmId,
];
$values = array_merge($attributes, $data);
$opportunity = $this->crmEntityRepository->upsertOpportunity($attributes, $values);
$this->importExternalFieldData($properties, $opportunity->getId());
$this->importOpportunityContacts($opportunity, $associations['contacts']);
if ($opportunity->wasRecentlyCreated) {
MatchActivitiesToNewOpportunity::dispatch($opportunity->getId());
}
return $opportunity;
}
/**
* Update existing opportunity
*/
private function updateOpportunity(string $crmId, array $properties, array $associations): Opportunity
{
$accountId = $this->resolveAccountId($associations);
$businessProcess = $this->resolveBusinessProcess($properties['pipeline'] ?? null);
$stage = $businessProcess ? $this->resolveStage($businessProcess, $properties['dealstage'] ?? null) : null;
$data = $this->buildOpportunityData($properties, $accountId, $businessProcess, $stage);
$attributes = [
'crm_configuration_id' => $this->config->getId(),
'crm_provider_id' => $crmId,
];
$values = array_merge($attributes, $data);
$opportunity = $this->crmEntityRepository->upsertOpportunity($attributes, $values);
$this->importExternalFieldData($properties, $opportunity->getId());
$this->updateOpportunityAssociations($opportunity, $associations);
return $opportunity;
}
private function resolveAccountId(array $associations): ?int
{
if (! empty($associations['account_id'])) {
return $associations['account_id'];
}
if (empty($associations)) {
return null;
}
// Fallback: use first company as account (currently SDK returns one company)
foreach ($associations['companies'] as $accountId) {
return $accountId;
}
return null;
}
private function buildOpportunityData(
array $properties,
?int $accountId,
?BusinessProcess $businessProcess,
?Stage $stage
): array {
$ownerId = null;
$profile = null;
if (! empty($properties['hubspot_owner_id'])) {
$ownerId = $properties['hubspot_owner_id'];
$profile = $this->crmEntityRepository->findProfileByExternalId($this->config, (string) $ownerId);
}
$name = 'Unknown';
if (isset($properties['dealname'])) {
$name = mb_strimwidth($properties['dealname'], 0, 128);
}
$amount = $this->resolveAmount($properties);
$currency = $properties['deal_currency_code'] ?? null;
$closeDate = null;
if (! empty($properties['closedate'])) {
$closeDate = Carbon::parse($properties['closedate'])->format('Y-m-d');
}
$remotelyCreatedAt = null;
if (! empty($properties['createdate']) && strtotime($properties['createdate'])) {
$date = $this->parseCleanDatetime($properties['createdate']);
$remotelyCreatedAt = $date?->format('Y-m-d H:i:s');
}
$closedStages = $this->getClosedDealStages();
$isWon = in_array($properties['dealstage'], $closedStages['won']);
$isLost = in_array($properties['dealstage'], $closedStages['lost']);
$data = [
'team_id' => $this->team->getId(),
'user_id' => $profile ? $profile->user_id : null,
'owner_id' => $ownerId,
'name' => $name,
'value' => ! empty($amount) ? $amount : null,
'currency_code' => CurrencyFormatter::formatCode($currency),
'close_date' => $closeDate,
'is_closed' => $isWon || $isLost,
'is_won' => $isWon,
'remotely_created_at' => $remotelyCreatedAt,
'probability' => $this->resolveDealProbability($properties['hs_deal_stage_probability']),
'forecast_category' => $this->resolveForecastCategory($properties['hs_manual_forecast_category']),
];
if ($accountId) {
$data['account_id'] = $accountId;
}
if ($stage) {
$data['stage_id'] = $stage->id;
}
if ($businessProcess) {
$recordType = $this->crmEntityRepository->getBusinessProcessRecordType($businessProcess);
if ($recordType) {
$data['record_type_id'] = $recordType->id;
}
}
return $data;
}
private function resolveBusinessProcess(?string $pipelineId): ?BusinessProcess
{
if ($pipelineId === null) {
return null;
}
$cacheKey = $this->getBusinessProcessCacheKey($pipelineId);
if (isset($this->cachedBusinessProcesses[$cacheKey])) {
return $this->cachedBusinessProcesses[$cacheKey];
}
$businessProcess = $this->getBusinessProcess($pipelineId);
if (! $businessProcess instanceof BusinessProcess) {
$this->importStages();
$businessProcess = $this->getBusinessProcess($pipelineId);
}
if (! $businessProcess instanceof BusinessProcess) {
$this->logger->info(
'[HubSpot] Deal is not attached to a pipeline',
[
'pipeline' => $pipelineId]
);
}
$this->cachedBusinessProcesses[$cacheKey] = $businessProcess;
return $businessProcess;
}
private function getBusinessProcess(string $pipelineId): ?BusinessProcess
{
return $this->crmEntityRepository->findBusinessProcessesByExternalId($this->config, $pipelineId);
}
private function getBusinessProcessCacheKey(string $pipelineId): string
{
return $this->config->getId() . '_' . $pipelineId;
}
private function resolveStage(BusinessProcess $businessProcess, ?string $stageId): ?Stage
{
if (empty($stageId)) {
return null;
}
$cacheKey = $businessProcess->getId() . ':' . $stageId;
if (isset($this->cachedStages[$cacheKey])) {
return $this->cachedStages[$cacheKey];
}
$stage = $this->crmEntityRepository->getPipelineStageByConditions(
$businessProcess,
[
'crm_provider_id' => $stageId,
'type' => Stage::TYPE_OPPORTUNITY,
]
);
if ($stage === null) {
$this->importStages(null, $stageId);
}
if ($stage === null) {
$this->logger->info('[HubSpot] Stage does not exist => ' . $stageId);
}
$this->cachedStages[$cacheKey] = $stage;
return $stage;
}
private function resolveAmount(array $properties): ?string
{
$amount = null;
if (! empty($properties['amount'])) {
$amount = str_replace(',', '', $properties['amount']);
}
if ($this->config->hasDefaultCurrencyFieldSet()) {
$valueFieldName = $this->config->getDefaultCurrencyField()->getCrmProviderId();
$amount = $properties[$valueFieldName] ?? $amount;
}
return $amount;
}
private function parseCleanDatetime(string $datetime): ?Carbon
{
// Treat pre-1980 values as invalid
$minValidDate = Carbon::parse('1980-01-01 00:00:00');
try {
$date = Carbon::parse($datetime);
if ($minValidDate->gt($date)) {
return null;
}
return $date;
} catch (Exception) {
return null; // On parse error, treat as null
}
}
private function resolveDealProbability(?string $stageProbability): int
{
if ($stageProbability === null) {
return 0;
}
$probability = (float) $stageProbability;
return $probability > 1 ? 0 : (int) ($probability * 100);
}
private function resolveForecastCategory(?string $forecastCategory): string
{
if (! $forecastCategory) {
return Forecast::FORECAST_CATEGORY_UNCATEGORIZED;
}
$forecastCategory = str_replace('_', ' ', $forecastCategory);
return ucwords(strtolower($forecastCategory));
}
private function importExternalFieldData(array $properties, int $opportunityId): void
{
$crmFields = $this->getOpportunitySyncableFields();
$this->importOpportunityCrmFieldData($properties, $crmFields, $opportunityId);
}
private function importOpportunityContacts(Opportunity $opportunity, array $associations): void
{
// Handle empty or missing contact associations
if (empty($associations)) {
// Remove all existing contact associations if none provided
$this->removeAllOpportunityContacts($opportunity);
return;
}
// Use differential sync approach for better performance and accuracy
$this->syncOpportunityContactsDifferential($opportunity, $associations);
}
/**
* Sync opportunity contacts using differential approach
* This compares current vs new associations and only makes necessary changes
*/
private function syncOpportunityContactsDifferential(Opportunity $opportunity, array $contactAssociations): void
{
$currentContactCrmIds = $this->getCurrentContactCrmIds($opportunity);
$contactAssociationIds = array_keys($contactAssociations);
$contactsToAdd = array_diff($contactAssociationIds, $currentContactCrmIds);
$contactsToRemove = array_diff($currentContactCrmIds, $contactAssociationIds);
if (empty($contactsToAdd) && empty($contactsToRemove)) {
return;
}
$this->logContactAssociationChanges($opportunity, $currentContactCrmIds, $contactAssociations, $contactsToAdd, $contactsToRemove);
$this->removeContactAssociations($opportunity, $contactsToRemove);
$this->addContactAssociations($opportunity, $contactsToAdd, $contactAssociations);
}
private function getCurrentContactCrmIds(Opportunity $opportunity): array
{
return $opportunity->contacts()
->pluck('contacts.crm_provider_id')
->toArray();
}
private function logContactAssociationChanges(
Opportunity $opportunity,
array $currentContactCrmIds,
array $contactAssociations,
array $contactsToAdd,
array $contactsToRemove
): void {
$this->logger->info('[' . $this->getDisplayName() . '] Contact association changes', [
'opportunity_id' => $opportunity->getId(),
'current_contacts' => $currentContactCrmIds,
'new_contacts' => $contactAssociations,
'contacts_to_add' => $contactsToAdd,
'contacts_to_remove' => $contactsToRemove,
]);
}
private function removeContactAssociations(Opportunity $opportunity, array $contactsToRemove): void
{
if (empty($contactsToRemove)) {
return;
}
$contactsToDetach = $opportunity->contacts()
->whereIn('contacts.crm_provider_id', $contactsToRemove)
->pluck('contacts.id')
->toArray();
if (! empty($contactsToDetach)) {
$opportunity->contacts()->detach($contactsToDetach);
$this->logger->info('[' . $this->getDisplayName() . '] Removed contact associations', [
'opportunity_id' => $opportunity->getId(),
'removed_contact_crm_ids' => $contactsToRemove,
'removed_contact_count' => count($contactsToDetach),
]);
}
}
private function addContactAssociations(Opportunity $opportunity, array $contactsToAdd, array $contactAssociations): void
{
if (empty($contactsToAdd)) {
return;
}
$contactsAdded = [];
foreach ($contactsToAdd as $crmId) {
$id = $contactAssociations[$crmId];
if ($this->attachSingleContact($opportunity, (string) $crmId, $id)) {
$contactsAdded[] = $crmId;
}
}
$this->logAddedContacts($opportunity, $contactsAdded);
}
private function attachSingleContact(Opportunity $opportunity, string $crmId, int $id): bool
{
try {
$contact = $this->crmEntityRepository->findContactByConfigurationAndId($this->config, $id);
if (! $contact) {
return false;
}
return $this->performContactAttachment($opportunity, $contact, $crmId);
} catch (\Throwable $e) {
$this->logger->warning('[' . $this->getDisplayName() . '] Failed to add contact association', [
'opportunity_id' => $opportunity->getId(),
'contact_crm_id' => $crmId,
'error' => $e->getMessage(),
]);
return false;
}
}
private function performContactAttachment(Opportunity $opportunity, Contact $contact, string $crmId): bool
{
try {
$opportunity->contacts()->attach($contact->getId(), [
'crm_provider_id' => $crmId,
]);
return true;
} catch (\Illuminate\Database\QueryException $e) {
if (str_contains($e->getMessage(), 'Duplicate entry')) {
$this->logger->info('[' . $this->getDisplayName() . '] Contact association already exists', [
'contact_id' => $contact->getId(),
'contact_crm_id' => $crmId,
'opportunity_id' => $opportunity->getId(),
]);
return false;
}
throw $e;
}
}
private function logAddedContacts(Opportunity $opportunity, array $contactsAdded): void
{
if (! empty($contactsAdded)) {
$this->logger->info('[' . $this->getDisplayName() . '] Added contact associations', [
'opportunity_id' => $opportunity->getId(),
'added_contact_crm_ids' => $contactsAdded,
'added_contacts_count' => count($contactsAdded),
]);
}
}
}
Execute
Explain Plan
Browse Query History
View Parameters
Open Query Execution Settings…
In-Editor Results
Tx: Auto
Cancel Running Statements
Playground
jiminny
Code changed:
Hide
Sync Changes
Hide This Notification
6
1
6
Previous Highlighted Error
Next Highlighted Error
# [PASSWORD_DOTS] HS [PASSWORD_DOTS]
select * from teams where id = 2; # 2
select * from features; # 2
select * from team_features where team_id = 2; # 2
select * from crm_configurations where id = 2; # 2
select * from users where team_id = 2; #
select * from playbooks where team_id = 2; # event 38
select * from playbook_categories where playbook_id = 38; #
SELECT * FROM activities WHERE crm_configuration_id = 2 and crm_provider_id is not null order by id desc;
https://app.hubspot.com/contacts/4392066/deal/16964514951/?engagement=96069102624
https://app.staging.jiminny.com/playback/d5df34dc-bd66-4ff5-a7b3-8d3be30322a0
SELECT * FROM activities WHERE uuid_to_bin('04fdcd0d-818f-4c53-92dc-6f18bc753ffd') = uuid;
# 609126 softphone tr. 11241
SELECT * FROM activities WHERE uuid_to_bin('6521bfcd-5a30-46e5-9f74-5440fd48befd') = uuid;
# 608874 conference tr. 11226 crmId: 103422236596
select * from ai_prompts where transcription_id IN (11241, 11226);
select * from activity_summary_logs where activity_id = 608874;
select * from sidekick_settings;
select * from default_activity_types;
select * from crm_field_data where activity_id = 1223;
select * from crm_layouts where crm_configuration_id = 2;
SELECT * FROM crm_layout_entities WHERE crm_layout_id IN (554);
select * from crm_fields where crm_configuration_id = 11 and object_type = 'event';
SELECT * FROM crm_field_values WHERE crm_field_id IN (1455,1450);
SELECT * FROM crm_field_data WHERE crm_layout_entity_id = 971;
SELECT * FROM crm_field_data WHERE crm_layout_entity_id IN (6494,6495,6496,6497,6498,6499);
SELECT
CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,
u.email,
sa.*,
t.owner_id FROM social_accounts sa
JOIN users u
on u.id = sa.sociable_id
JOIN teams t on t.id = u.team_id
WHERE u.team_id = 2 and sa.provider = 'hubspot';
select * from opportunities where team_id = 2
and crm_provider_id IN ('51317301383');
select * from contacts where id = 85;
select * from opportunities where team_id = 2 order by id desc;
select * from opportunities where team_id = 2 and crm_provider_id = '51317301383'; # 5112
select * from opportunities where team_id = 2 and crm_provider_id = '55976759904'; # 5112
select * from opportunity_contacts where opportunity_id = 5117;
select * from crm_field_data where object_id = 1365;
SELECT * FROM crm_fields WHERE id IN (1405, 1407, 1972, 2128);
select * from features;
select * from team_features where team_id IN (1);
select * from team_features where feature_id IN (36);
SHOW CREATE TABLE opportunity_contacts;
SELECT * FROM opportunity_contacts WHERE crm_provider_id = '111751';
# $slug = 'HUBSPOT_WEBHOOK_SYNC';
# $team = Jiminny\Models\Team::find(2);
# $feature = Feature::query()->where('slug', $slug)->first();
# TeamFeature::query()->create(['feature_id' => $feature->getId(),'team_id' => $team->getId()]);
# hubspot_webhook_metrics
select * from opportunities where team_id = 2 and crm_provider_id IN ('374720564','14527423589','49908861993','50435771779'); # 1365
SELECT * FROM opportunity_contacts WHERE opportunity_id = '414';
SELECT * FROM opportunity_contacts WHERE crm_provider_id = '131501';
select * from contacts where id in (414, 464);
select * from activities where crm_configuration_id = 2;
select settings from crm_configurations where id = 11;
select * from teams; # 1, 2
select * from users;
select * from crm_configurations where id = 39;
select * from team_features where team_id = 2;
select * from features;
# SELECT * FROM opportunities WHERE crm_configuration_id = 2
# order by id desc;
# and crm_provider_id = '49908861993';
select * from activity_providers where id IN (443, 202, 203, 227);
select * from activity_imports where id = 795889;
select c.id, c.provider, c.settings, t.* from teams t join crm_configurations c on t.id = c.team_id
where c.provider = 'hubspot';
select * from crm_configurations crm JOIN teams t on crm.team_id = t.id
where provider = 'hubspot';
SELECT * FROM teams WHERE id = 31;
SELECT * FROM users WHERE id = 257;
SELECT * FROM opportunities WHERE team_id = 2;
select * from opportunity_contacts where opportunity_id = 5124;
select * from contacts where id IN (3850,3853,3851,4073,4140,4155,4480,4530,4623,5986,513,687,1806,1523,3613)
select * from activities where crm_configuration_id = 13;
SELECT * FROM activities WHERE uuid_to_bin('826619ce-ec8e-4e59-8467-a01f5f6ad71e') = uuid; # 418141
select id, team_id, crm_provider_id from crm_configurations where provider = 'hubspot' and crm_provider_id IS NOT NULL;
SELECT * FROM accounts WHERE team_id = 2 and crm_provider_id = '1212213464' order by id desc;
SELECT * FROM contacts WHERE team_id = 2 and account_id = 5189 order by id desc;
SELECT * FROM contacts WHERE team_id = 2 order by id desc;
select * from opportunity_contacts where contact_id = 6223;
SELECT * FROM opportunities WHERE team_id = 2 and account_id = 5189 order by id desc;
select * from crm_profiles where crm_configuration_id = 2;
select * from activities where account_id = 46;
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"#11976 on JY-20553-debug-crm-sync-delays, menu","depth":5,"help_text":"Pull request #11976 exists for current branch JY-20553-debug-crm-sync-delays","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"RequestGenerateAskJiminnyReportJobTest","depth":6,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run 'RequestGenerateAskJiminnyReportJobTest'","depth":6,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'RequestGenerateAskJiminnyReportJobTest'","depth":6,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"More Actions","depth":6,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JetBrains AI","depth":5,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Search Everywhere","depth":5,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"IDE and Project Settings","depth":5,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.088194445,"height":0.027777778},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"33","depth":4,"role_description":"text"},{"role":"AXStaticText","text":"2","depth":4,"role_description":"text"},{"role":"AXStaticText","text":"19","depth":4,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Services\\Crm\\Hubspot\\ServiceTraits;\n\nuse Carbon\\Carbon;\nuse HubSpot\\Client\\Crm\\Deals\\Model\\CollectionResponseAssociatedId;\nuse Jiminny\\Exceptions\\InvalidArgumentException;\nuse Jiminny\\Models\\Account;\nuse Exception;\nuse Jiminny\\Component\\DealInsights\\Forecast\\Forecast;\nuse Jiminny\\Jobs\\Crm\\MatchActivitiesToNewOpportunity;\nuse Jiminny\\Models\\Contact;\nuse Jiminny\\Models\\Crm\\BusinessProcess;\nuse Jiminny\\Exceptions\\CrmException;\nuse Jiminny\\Models\\Opportunity;\nuse Illuminate\\Support\\Collection;\nuse Jiminny\\Models\\Stage;\nuse Jiminny\\Repositories\\Crm\\CrmEntityRepository;\nuse Jiminny\\Services\\Crm\\Hubspot\\DealFieldsService;\nuse Jiminny\\Services\\Crm\\Hubspot\\OpportunitySyncStrategy\\HubspotSingleSyncStrategy;\nuse Jiminny\\Services\\Crm\\Hubspot\\WebhookSyncBatchProcessor;\nuse Jiminny\\Services\\Crm\\OpportunitySyncStrategyResolver;\nuse Jiminny\\Utils\\CurrencyFormatter;\n\n/**\n * Optimized sync methods for better performance\n * These methods can be integrated into SyncCrmEntitiesTrait for significant performance gains\n */\ntrait OpportunitySyncTrait\n{\n private const int BATCH_SIZE = 100;\n private const int BATCH_PROCESS_SIZE = 800;\n\n protected OpportunitySyncStrategyResolver $opportunitySyncStrategyResolver;\n protected CrmEntityRepository $crmEntityRepository;\n protected DealFieldsService $dealFieldsService;\n\n private ?array $cachedClosedDealStages = null;\n private array $cachedBusinessProcesses = [];\n private array $cachedStages = [];\n\n public function syncOpportunities(array $parameters, ?string $strategy = null): int\n {\n $startTime = microtime(true);\n $strategies = $this->opportunitySyncStrategyResolver->getStrategies($this->config, $strategy);\n $parameters['config'] = $this->config;\n $syncCount = 0;\n $reportedTotal = 0;\n $lastSyncedId = [];\n $strategyNames = [];\n\n try {\n foreach ($strategies as $strategyName => $syncStrategy) {\n $strategyNames[] = $strategyName;\n $this->logger->info(\n '[' . $this->getDisplayName() . '] Syncing opportunities using strategy: ' . $strategyName,\n ['team' => $this->team->getId()]\n );\n\n $total = 0;\n $lastId = null;\n $buffer = [];\n\n // HubspotWebhookBatchSyncStrategy returns empty generator, this is for other strategies\n foreach ($syncStrategy->fetchOpportunities($parameters, $total, $lastId) as $hsOpportunity) {\n $buffer[] = $hsOpportunity;\n\n // process every 800 rows (fits < 1 000 association limit)\n if (\\count($buffer) >= self::BATCH_PROCESS_SIZE) {\n $syncCount += $this->processOpportunityBatch($buffer);\n $buffer = [];\n }\n }\n\n // leftovers\n if ($buffer) {\n $syncCount += $this->processOpportunityBatch($buffer);\n }\n\n $reportedTotal += $total;\n $lastSyncedId = $lastId;\n }\n } catch (\\HubSpot\\Client\\Crm\\Deals\\ApiException | CrmException $e) {\n $this->handleSyncException($e, $parameters);\n }\n\n $durationMs = round((microtime(true) - $startTime) * 1000, 2);\n $this->logger->info(\n '[HubSpot] Synced opportunities',\n [\n 'team' => $this->team->getId(),\n 'strategies' => implode(',', $strategyNames),\n 'sync_count' => $syncCount,\n 'total' => $reportedTotal,\n 'last_synced_id' => $lastSyncedId,\n 'duration_ms' => $durationMs,\n ]\n );\n\n return $reportedTotal;\n }\n\n private function handleSyncException(\\Throwable $e, array $parameters): void\n {\n if (($parameters['since'] ?? null) instanceof Carbon) {\n $parameters['since'] = $parameters['since']->toDateTimeString();\n }\n $parameters['config'] = $this->config->getId();\n\n $this->logger->warning('[' . $this->getDisplayName() . '] Sync opportunities failed', [\n 'teamId' => $this->team->getUuid(),\n 'parameters' => $parameters,\n 'reason' => $e->getMessage(),\n ]);\n }\n\n /**\n * @inheritdoc\n */\n public function syncOpportunity(string $crmId): ?Opportunity\n {\n $strategy = $this->opportunitySyncStrategyResolver->resolve(\n $this->config,\n OpportunitySyncStrategyResolver::SINGLE_SYNC_OPPORTUNITY_STRATEGY,\n );\n\n $parameters = [\n 'config' => $this->config,\n 'crm_id' => $crmId,\n ];\n\n try {\n if (! $strategy instanceof HubspotSingleSyncStrategy) {\n throw new InvalidArgumentException('Strategy must by HubspotSingleSyncStrategy');\n }\n\n $hsOpportunity = $strategy->fetchOpportunity($parameters);\n } catch (\\HubSpot\\Client\\Crm\\Deals\\ApiException $e) {\n $this->logger->info('[' . $this->getDisplayName() . '] Opportunity not found', [\n 'teamId' => $this->team->getUuid(),\n 'crmId' => $crmId,\n 'reason' => $e->getMessage(),\n ]);\n\n return null;\n }\n\n $hsOpportunity['associations'] = $this->convertDealAssociations($hsOpportunity['associations'] ?? []);\n\n return $this->importOrUpdateOpportunity($hsOpportunity);\n }\n\n /**\n * Process webhook-collected opportunity batches.\n *\n * Drains Redis sets containing company CRM IDs collected from webhook events\n * and dispatches ImportOpportunityBatch jobs for batch processing.\n *\n * @return int Number of opportunity IDs dispatched to jobs\n */\n public function batchSyncOpportunities(): int\n {\n $configId = $this->team->getCrmConfiguration()->getId();\n\n return $this->batchProcessor->processBatchesForObjectType(\n WebhookSyncBatchProcessor::OBJECT_TYPE_DEAL,\n $configId\n );\n }\n\n /**\n * Import a batch of opportunities by their CRM IDs.\n * Fetches opportunity data from HubSpot API and delegates to importOpportunityBatch().\n *\n * @param array<string> $crmIds HubSpot deal CRM IDs\n *\n * @return array{success: array, failed_ids: array, errors?: array<string, string>}\n */\n public function importOpportunityBatchByIds(array $crmIds): array\n {\n $fields = $this->dealFieldsService->getFieldsForConfiguration($this->config);\n\n $allDeals = [];\n foreach (array_chunk($crmIds, self::BATCH_SIZE) as $chunk) {\n $deals = $this->client->getOpportunitiesByIds($chunk, $fields);\n foreach ($deals as $deal) {\n $allDeals[] = $deal;\n }\n }\n\n // IDs not returned by HubSpot are likely deleted or inaccessible deals.\n // These are not failures — retrying won't bring them back.\n $fetchedIds = array_map('strval', array_column($allDeals, 'id'));\n $notFoundIds = array_values(array_diff(array_map('strval', $crmIds), $fetchedIds));\n\n if (! empty($notFoundIds)) {\n $this->logger->info('[' . $this->getDisplayName() . '] CRM IDs not found in HubSpot (likely deleted)', [\n 'teamId' => $this->team->getId(),\n 'notFoundCount' => \\count($notFoundIds),\n 'notFoundIds' => $notFoundIds,\n 'requestedCount' => \\count($crmIds),\n 'fetchedCount' => \\count($allDeals),\n ]);\n }\n\n if (empty($allDeals)) {\n return ['success' => [], 'failed_ids' => []];\n }\n\n return $this->importOpportunityBatch($allDeals);\n }\n\n private function getClosedDealStages(): array\n {\n if ($this->cachedClosedDealStages !== null) {\n return $this->cachedClosedDealStages;\n }\n\n $stages = $this->crmEntityRepository->getOpportunityClosedStages($this->config);\n $data = [\n 'lost' => [],\n 'won' => [],\n ];\n\n foreach ($stages as $stage) {\n if ($stage->probability == 0.00) {\n $data['lost'][] = $stage->crm_provider_id;\n }\n if ($stage->probability == 100.00) {\n $data['won'][] = $stage->crm_provider_id;\n }\n }\n\n $this->cachedClosedDealStages = $data;\n\n return $data;\n }\n\n /**\n * Import deals into the database with pre-fetched associations.\n *\n * API calls here (getAssociationsData, getExistingOpportunityCrmIds) are NOT\n * caught — if they throw, the exception propagates to ImportOpportunityBatch::handle()\n * where Laravel retries the whole job with backoff. After all retries exhausted,\n * failed() requeues all IDs to Redis.\n *\n * The per-deal loop catches exceptions individually. A deal can end up in three states:\n * - success: imported/updated successfully\n * - failed_ids: exception thrown (DB constraint violation, corrupt data, etc.)\n * These are permanent issues — retrying won't fix them.\n * - skipped (null): missing dependencies (no account, unknown pipeline/stage).\n * This is acceptable — the deal cannot be imported until those exist.\n */\n private function importOpportunityBatch(array $deals): array\n {\n $syncedOpportunities = [\n 'success' => [],\n 'failed_ids' => [],\n ];\n $dealIds = array_column($deals, 'id');\n\n // Shared association/existing-ID preparation is batch-level state. If it fails, rethrow so the\n // queue job retries the whole batch and eventually requeues all deal IDs back to Redis.\n try {\n $companyAssociations = $this->client->getAssociationsData($dealIds, 'deals', 'companies');\n $contactAssociations = $this->client->getAssociationsData($dealIds, 'deals', 'contacts');\n\n $associationsData = $this->prepareAssociatedEntities($companyAssociations, $contactAssociations);\n\n $existingCrmIds = $this->crmEntityRepository->getExistingOpportunityCrmIds(\n $this->config,\n array_map('strval', $dealIds)\n );\n $existingCrmIdSet = array_flip($existingCrmIds);\n } catch (\\Throwable $e) {\n $this->logger->error('[' . $this->getDisplayName() . '] Failed to fetch associations or existing IDs', [\n 'teamId' => $this->team->getId(),\n 'dealCount' => count($dealIds),\n 'error' => $e->getMessage(),\n ]);\n\n throw $e;\n }\n\n foreach ($deals as $deal) {\n try {\n $deal['associations'] = $this->prepareAssociationsForOpportunity(\n $deal['id'],\n $companyAssociations,\n $contactAssociations,\n $associationsData\n );\n\n $syncedOpportunity = $this->importOrUpdateOpportunity(\n $deal,\n isset($existingCrmIdSet[(string) $deal['id']])\n );\n if ($syncedOpportunity) {\n $syncedOpportunities['success'][] = $syncedOpportunity;\n }\n } catch (\\Throwable $e) {\n $this->logger->warning('[' . $this->getDisplayName() . '] Failed to import opportunity', [\n 'teamId' => $this->team->getId(),\n 'crmId' => $deal['id'],\n 'error' => $e->getMessage(),\n ]);\n $syncedOpportunities['failed_ids'][] = $deal['id'];\n $syncedOpportunities['errors'][$deal['id']] = $e->getMessage();\n }\n }\n\n return $syncedOpportunities;\n }\n\n /**\n * Prepare associated entities for opportunities with optimized batch processing\n * Returns structured data with CRM ID to DB ID mappings for each opportunity\n */\n private function prepareAssociatedEntities(array $companyAssociations, array $contactAssociations): array\n {\n // Step 1: Collect all unique company and contact IDs from associations\n $allCompanyIds = $this->flattenAssociationIds($companyAssociations);\n $allContactIds = $this->flattenAssociationIds($contactAssociations);\n\n // Step 2: Batch sync missing entities and get CRM ID to DB ID mappings\n $companyIdMappings = [];\n $contactIdMappings = [];\n\n if (! empty($allCompanyIds)) {\n $companyIdMappings = $this->prepareAssociatedAccounts($allCompanyIds);\n }\n\n if (! empty($allContactIds)) {\n $contactIdMappings = $this->prepareAssociatedContacts($allContactIds);\n }\n\n return [\n 'company_id_mappings' => $companyIdMappings,\n 'contact_id_mappings' => $contactIdMappings,\n ];\n }\n\n /**\n * Flatten association data to get unique IDs\n */\n private function flattenAssociationIds(array $associations): array\n {\n $ids = [];\n foreach ($associations as $dealAssociations) {\n if (is_array($dealAssociations)) {\n foreach ($dealAssociations as $id) {\n $ids[$id] = true;\n }\n }\n }\n\n return array_keys($ids);\n }\n\n /**\n * Batch sync missing accounts\n */\n private function prepareAssociatedAccounts(array $companyIds): array\n {\n // Find which accounts already exist\n $existingAccounts = $this->crmEntityRepository\n ->findAccountsByExternalIds($this->config, $companyIds);\n\n $existingCompanyIds = $existingAccounts->pluck('crm_provider_id')->toArray();\n\n $existingAccountsData = $existingAccounts->mapWithKeys(function ($account) {\n return [$account->getCrmProviderId() => $account->getId()];\n })->toArray();\n\n $missingCompanyIds = array_diff($companyIds, $existingCompanyIds);\n\n if (empty($missingCompanyIds)) {\n return $existingAccountsData;\n }\n\n $this->logger->info('[' . $this->getDisplayName() . '] Batch syncing missing accounts', [\n 'teamId' => $this->team->getUuid(),\n 'total_companies' => count($companyIds),\n 'existing_companies' => count($existingCompanyIds),\n 'missing_companies' => count($missingCompanyIds),\n ]);\n\n // we already have limit on opportunity ids count\n // Initialize variable before try block\n $syncedAccountsData = [];\n\n try {\n $syncedAccountsData = $this->batchSyncCrmObjects('companies', $missingCompanyIds);\n } catch (\\Throwable $e) {\n $this->logger->warning('[' . $this->getDisplayName() . '] Failed to sync missing accounts', [\n 'size' => count($missingCompanyIds),\n 'error' => $e->getMessage(),\n ]);\n $syncedAccountsData = [];\n }\n\n return $existingAccountsData + $syncedAccountsData;\n }\n\n /**\n * Prepare associated contacts - find existing and sync missing ones\n * Returns mapping of CRM ID to DB ID\n */\n private function prepareAssociatedContacts(array $contactIds): array\n {\n // Find which contacts already exist\n $existingContacts = $this->crmEntityRepository\n ->findContactsByExternalIds($this->config, $contactIds);\n\n $existingContactIds = $existingContacts->pluck('crm_provider_id')->toArray();\n\n // Create mapping for existing contacts\n $existingContactsData = $existingContacts->mapWithKeys(function ($contact) {\n return [$contact->getCrmProviderId() => $contact->getId()];\n })->toArray();\n\n $missingContactIds = array_diff($contactIds, $existingContactIds);\n\n if (empty($missingContactIds)) {\n return $existingContactsData;\n }\n\n $this->logger->info('[' . $this->getDisplayName() . '] Batch syncing missing contacts', [\n 'teamId' => $this->team->getUuid(),\n 'total_contacts' => count($contactIds),\n 'existing_contacts' => count($existingContactIds),\n 'missing_contacts' => count($missingContactIds),\n ]);\n\n // Sync missing contacts using batch API\n try {\n $syncedContactsData = $this->batchSyncCrmObjects('contacts', $missingContactIds);\n } catch (\\Throwable $e) {\n $this->logger->warning('[' . $this->getDisplayName() . '] Failed to sync missing contacts', [\n 'size' => count($missingContactIds),\n 'error' => $e->getMessage(),\n ]);\n $syncedContactsData = [];\n }\n\n return $existingContactsData + $syncedContactsData;\n }\n\n private function batchSyncCrmObjects(string $objectType, array $crmIds): array\n {\n $syncObjects = [];\n $crmObjectIds = array_values($crmIds);\n\n foreach (array_chunk($crmObjectIds, self::BATCH_SIZE) as $chunk) {\n try {\n $objects = $objectType === 'companies' ?\n $this->client->getCompaniesByIds($chunk, $this->getCompanyFields()) :\n $this->client->getContactsByIds($chunk, $this->getContactFields());\n\n foreach ($objects as $objectId => $objectData) {\n $this->importCrmObject($objectType, (string) $objectId, $objectData, $syncObjects);\n }\n\n $this->logger->info('[' . $this->getDisplayName() . '] Batch synced ' . $objectType, [\n 'requested_count' => count($chunk),\n 'synced_count' => count($objects),\n ]);\n } catch (\\Throwable $e) {\n $this->logger->warning('[' . $this->getDisplayName() . '] Batch ' . $objectType . ' sync failed', [\n 'ids' => $chunk,\n 'error' => $e->getMessage(),\n ]);\n }\n }\n\n return $syncObjects;\n }\n\n private function importCrmObject(string $objectType, string $objectId, mixed $objectData, array &$syncObjects): void\n {\n try {\n $object = $objectType === 'companies' ?\n $this->importAccount($objectData) :\n $this->importContact($objectData);\n\n if ($object) {\n $syncObjects[$object->getCrmProviderId()] = $object->getId();\n }\n } catch (\\Throwable $e) {\n $this->logger->warning('[' . $this->getDisplayName() . '] Failed to import batch ' . $objectType, [\n 'id' => $objectId,\n 'error' => $e->getMessage(),\n ]);\n }\n }\n\n /**\n * Prepare associations for a single opportunity\n *\n * The return value is an array with the following structure:\n * [\n * 'companies' => [\n * $companyCrmId => $companyId,\n * ...\n * ],\n * 'contacts' => [\n * $contactCrmId => $contactId,\n * ...\n * ],\n * 'account_id' => $accountId,\n * ]\n */\n private function prepareAssociationsForOpportunity(\n string $oppCrmId,\n array $companyAssociations,\n array $contactAssociations,\n array $associationsData\n ): array {\n $associations = [\n 'companies' => [],\n 'contacts' => [],\n 'account_id' => null, // Primary account for opportunity\n ];\n\n $oppCompanyIds = $companyAssociations[$oppCrmId] ?? [];\n foreach ($oppCompanyIds as $companyCrmId) {\n if (isset($associationsData['company_id_mappings'][$companyCrmId])) {\n $associations['companies'][$companyCrmId] = $associationsData['company_id_mappings'][$companyCrmId];\n\n // Set primary account (first company becomes primary account)\n if ($associations['account_id'] === null) {\n $associations['account_id'] = $associationsData['company_id_mappings'][$companyCrmId];\n }\n }\n }\n\n $oppContactIds = $contactAssociations[$oppCrmId] ?? [];\n foreach ($oppContactIds as $contactCrmId) {\n if (isset($associationsData['contact_id_mappings'][$contactCrmId])) {\n $associations['contacts'][$contactCrmId] = $associationsData['contact_id_mappings'][$contactCrmId];\n }\n }\n\n return $associations;\n }\n\n /**\n * Update only associations for an opportunity\n */\n private function updateOpportunityAssociations(Opportunity $opportunity, array $associations): void\n {\n // Update contact associations\n $this->importOpportunityContacts($opportunity, $associations['contacts']);\n\n // Update company (account) associations\n $this->updateOpportunityAccount($opportunity, $associations['account_id']);\n }\n\n /**\n * Remove all contact associations from an opportunity\n */\n private function removeAllOpportunityContacts(Opportunity $opportunity): void\n {\n $currentCount = (int) $opportunity->contacts()->count();\n\n if ($currentCount > 0) {\n $opportunity->contacts()->detach();\n\n $this->logger->info('[' . $this->getDisplayName() . '] Removed all contact associations', [\n 'opportunity_id' => $opportunity->getId(),\n 'removed_count' => $currentCount,\n ]);\n }\n }\n\n private function updateOpportunityAccount(Opportunity $opportunity, ?int $accountId): void\n {\n if ($accountId === null) {\n // No account ID provided - keep current account\n return;\n }\n\n $currentAccountId = $opportunity->getAccountId();\n\n // Only update if account has changed\n if ($currentAccountId !== $accountId) {\n $opportunity->account_id = $accountId;\n $opportunity->save();\n\n $this->logger->info('[' . $this->getDisplayName() . '] Updated opportunity account association', [\n 'opportunity_id' => $opportunity->getId(),\n 'old_account_id' => $currentAccountId,\n 'new_account_id' => $accountId,\n ]);\n }\n }\n\n /**\n * Find existing opportunities by external IDs (OPTIMIZED VERSION)\n * Uses batch query for better performance\n */\n private function findExistingOpportunities(array $crmIds): Collection\n {\n return $this->crmEntityRepository\n ->findOpportunitiesByExternalIds($this->config, $crmIds);\n }\n\n private function processOpportunityBatch(array $opportunities): int\n {\n $syncedOpportunities = $this->importOpportunityBatch($opportunities);\n\n return count($syncedOpportunities['success'] ?? []);\n }\n\n /**\n * Convert single deal associations from HubSpot format to internal format\n * Handles both HubSpot SDK objects and array formats\n *\n * @param array $opportunityAssociations Raw associations from HubSpot API or pre-processed\n *\n * @return array Processed associations with DB IDs\n */\n private function convertDealAssociations(array $opportunityAssociations): array\n {\n $associations = $this->initializeAssociationsStructure();\n\n if (empty($opportunityAssociations)) {\n return $associations;\n }\n\n $associationIds = $this->extractAssociationIds($opportunityAssociations);\n\n $this->processCompanyAssociations($associationIds, $associations);\n $this->processContactAssociations($associationIds, $associations);\n\n return $associations;\n }\n\n private function initializeAssociationsStructure(): array\n {\n return [\n 'companies' => [],\n 'contacts' => [],\n 'account_id' => null, // Primary account for opportunity\n ];\n }\n\n private function extractAssociationIds(array $opportunityAssociations): array\n {\n $associationIds = [];\n\n foreach ($opportunityAssociations as $type => $associationData) {\n if (! empty($associationData)) {\n $associationIds[$type] = $this->convertSingleDealAssociations($associationData);\n }\n }\n\n return $associationIds;\n }\n\n private function processCompanyAssociations(array $associationIds, array &$associations): void\n {\n if (empty($associationIds['companies'])) {\n return;\n }\n\n $companyId = $associationIds['companies'][0];\n $account = $this->findOrSyncAccount($companyId);\n\n if ($account instanceof Account) {\n $associations['companies'][$companyId] = $account->getId();\n $associations['account_id'] = $account->getId();\n }\n }\n\n private function processContactAssociations(array $associationIds, array &$associations): void\n {\n if (empty($associationIds['contacts'])) {\n return;\n }\n\n foreach ($associationIds['contacts'] as $contactId) {\n $contact = $this->findOrSyncContact($contactId);\n\n if ($contact instanceof Contact) {\n $associations['contacts'][$contactId] = $contact->getId();\n }\n }\n }\n\n private function findOrSyncAccount(string $companyId): ?Account\n {\n $account = $this->crmEntityRepository->findAccountByExternalId($this->config, $companyId);\n\n if (! $account instanceof Account) {\n $account = $this->syncAccount($companyId);\n }\n\n return $account;\n }\n\n private function findOrSyncContact(string $contactId): ?Contact\n {\n $contact = $this->crmEntityRepository->findContactByExternalId($this->config, $contactId);\n\n if (! $contact instanceof Contact) {\n $contact = $this->syncContact($contactId);\n }\n\n return $contact;\n }\n\n private function convertSingleDealAssociations($opportunityAssociations = null): array\n {\n $associationData = [];\n\n if ($opportunityAssociations === null) {\n return $associationData;\n }\n\n // Handle array input (from extractAssociationIds)\n if (is_array($opportunityAssociations)) {\n return $opportunityAssociations;\n }\n\n // Handle CollectionResponseAssociatedId object\n if ($opportunityAssociations instanceof CollectionResponseAssociatedId) {\n foreach ($opportunityAssociations->getResults() as $association) {\n $associationData[] = $association->getId();\n }\n }\n\n return $associationData;\n }\n\n private function importOrUpdateOpportunity($crmData, ?bool $exists = null): ?Opportunity\n {\n if (empty($crmData['properties'])) {\n return null;\n }\n\n $crmId = (string) $crmData['id'];\n $properties = $crmData['properties'];\n $associations = $crmData['associations'] ?? [];\n\n $opportunityExists = $exists ?? (bool) $this->crmEntityRepository->findOpportunityByExternalId(\n $this->config,\n $crmId\n );\n\n if ($opportunityExists) {\n return $this->updateOpportunity($crmId, $properties, $associations);\n }\n\n return $this->createOpportunity($crmId, $properties, $associations);\n }\n\n /**\n * Create new opportunity\n */\n private function createOpportunity(string $crmId, array $properties, array $associations): ?Opportunity\n {\n $accountId = $this->resolveAccountId($associations);\n if (! $accountId) {\n return null;\n }\n\n $businessProcess = $this->resolveBusinessProcess($properties['pipeline'] ?? null);\n if (! $businessProcess) {\n return null;\n }\n\n $stage = $this->resolveStage($businessProcess, $properties['dealstage'] ?? null);\n if (! $stage) {\n return null;\n }\n\n $data = $this->buildOpportunityData($properties, $accountId, $businessProcess, $stage);\n\n $attributes = [\n 'crm_configuration_id' => $this->config->getId(),\n 'crm_provider_id' => $crmId,\n ];\n\n $values = array_merge($attributes, $data);\n\n $opportunity = $this->crmEntityRepository->upsertOpportunity($attributes, $values);\n\n $this->importExternalFieldData($properties, $opportunity->getId());\n $this->importOpportunityContacts($opportunity, $associations['contacts']);\n\n if ($opportunity->wasRecentlyCreated) {\n MatchActivitiesToNewOpportunity::dispatch($opportunity->getId());\n }\n\n return $opportunity;\n }\n\n /**\n * Update existing opportunity\n */\n private function updateOpportunity(string $crmId, array $properties, array $associations): Opportunity\n {\n $accountId = $this->resolveAccountId($associations);\n $businessProcess = $this->resolveBusinessProcess($properties['pipeline'] ?? null);\n $stage = $businessProcess ? $this->resolveStage($businessProcess, $properties['dealstage'] ?? null) : null;\n\n $data = $this->buildOpportunityData($properties, $accountId, $businessProcess, $stage);\n\n $attributes = [\n 'crm_configuration_id' => $this->config->getId(),\n 'crm_provider_id' => $crmId,\n ];\n\n $values = array_merge($attributes, $data);\n $opportunity = $this->crmEntityRepository->upsertOpportunity($attributes, $values);\n\n $this->importExternalFieldData($properties, $opportunity->getId());\n $this->updateOpportunityAssociations($opportunity, $associations);\n\n return $opportunity;\n }\n\n private function resolveAccountId(array $associations): ?int\n {\n if (! empty($associations['account_id'])) {\n return $associations['account_id'];\n }\n\n if (empty($associations)) {\n return null;\n }\n\n // Fallback: use first company as account (currently SDK returns one company)\n foreach ($associations['companies'] as $accountId) {\n return $accountId;\n }\n\n return null;\n }\n\n private function buildOpportunityData(\n array $properties,\n ?int $accountId,\n ?BusinessProcess $businessProcess,\n ?Stage $stage\n ): array {\n $ownerId = null;\n $profile = null;\n if (! empty($properties['hubspot_owner_id'])) {\n $ownerId = $properties['hubspot_owner_id'];\n $profile = $this->crmEntityRepository->findProfileByExternalId($this->config, (string) $ownerId);\n }\n\n $name = 'Unknown';\n if (isset($properties['dealname'])) {\n $name = mb_strimwidth($properties['dealname'], 0, 128);\n }\n\n $amount = $this->resolveAmount($properties);\n $currency = $properties['deal_currency_code'] ?? null;\n\n $closeDate = null;\n if (! empty($properties['closedate'])) {\n $closeDate = Carbon::parse($properties['closedate'])->format('Y-m-d');\n }\n\n $remotelyCreatedAt = null;\n if (! empty($properties['createdate']) && strtotime($properties['createdate'])) {\n $date = $this->parseCleanDatetime($properties['createdate']);\n $remotelyCreatedAt = $date?->format('Y-m-d H:i:s');\n }\n\n $closedStages = $this->getClosedDealStages();\n $isWon = in_array($properties['dealstage'], $closedStages['won']);\n $isLost = in_array($properties['dealstage'], $closedStages['lost']);\n\n $data = [\n 'team_id' => $this->team->getId(),\n 'user_id' => $profile ? $profile->user_id : null,\n 'owner_id' => $ownerId,\n 'name' => $name,\n 'value' => ! empty($amount) ? $amount : null,\n 'currency_code' => CurrencyFormatter::formatCode($currency),\n 'close_date' => $closeDate,\n 'is_closed' => $isWon || $isLost,\n 'is_won' => $isWon,\n 'remotely_created_at' => $remotelyCreatedAt,\n 'probability' => $this->resolveDealProbability($properties['hs_deal_stage_probability']),\n 'forecast_category' => $this->resolveForecastCategory($properties['hs_manual_forecast_category']),\n ];\n\n if ($accountId) {\n $data['account_id'] = $accountId;\n }\n\n if ($stage) {\n $data['stage_id'] = $stage->id;\n }\n\n if ($businessProcess) {\n $recordType = $this->crmEntityRepository->getBusinessProcessRecordType($businessProcess);\n if ($recordType) {\n $data['record_type_id'] = $recordType->id;\n }\n }\n\n return $data;\n }\n\n private function resolveBusinessProcess(?string $pipelineId): ?BusinessProcess\n {\n if ($pipelineId === null) {\n return null;\n }\n\n $cacheKey = $this->getBusinessProcessCacheKey($pipelineId);\n if (isset($this->cachedBusinessProcesses[$cacheKey])) {\n return $this->cachedBusinessProcesses[$cacheKey];\n }\n\n $businessProcess = $this->getBusinessProcess($pipelineId);\n\n if (! $businessProcess instanceof BusinessProcess) {\n $this->importStages();\n $businessProcess = $this->getBusinessProcess($pipelineId);\n }\n\n if (! $businessProcess instanceof BusinessProcess) {\n $this->logger->info(\n '[HubSpot] Deal is not attached to a pipeline',\n [\n 'pipeline' => $pipelineId]\n );\n }\n\n $this->cachedBusinessProcesses[$cacheKey] = $businessProcess;\n\n return $businessProcess;\n }\n\n private function getBusinessProcess(string $pipelineId): ?BusinessProcess\n {\n return $this->crmEntityRepository->findBusinessProcessesByExternalId($this->config, $pipelineId);\n }\n\n private function getBusinessProcessCacheKey(string $pipelineId): string\n {\n return $this->config->getId() . '_' . $pipelineId;\n }\n\n private function resolveStage(BusinessProcess $businessProcess, ?string $stageId): ?Stage\n {\n if (empty($stageId)) {\n return null;\n }\n\n $cacheKey = $businessProcess->getId() . ':' . $stageId;\n if (isset($this->cachedStages[$cacheKey])) {\n return $this->cachedStages[$cacheKey];\n }\n\n $stage = $this->crmEntityRepository->getPipelineStageByConditions(\n $businessProcess,\n [\n 'crm_provider_id' => $stageId,\n 'type' => Stage::TYPE_OPPORTUNITY,\n ]\n );\n\n if ($stage === null) {\n $this->importStages(null, $stageId);\n }\n\n if ($stage === null) {\n $this->logger->info('[HubSpot] Stage does not exist => ' . $stageId);\n }\n\n $this->cachedStages[$cacheKey] = $stage;\n\n return $stage;\n }\n\n private function resolveAmount(array $properties): ?string\n {\n $amount = null;\n if (! empty($properties['amount'])) {\n $amount = str_replace(',', '', $properties['amount']);\n }\n\n if ($this->config->hasDefaultCurrencyFieldSet()) {\n $valueFieldName = $this->config->getDefaultCurrencyField()->getCrmProviderId();\n $amount = $properties[$valueFieldName] ?? $amount;\n }\n\n return $amount;\n }\n\n private function parseCleanDatetime(string $datetime): ?Carbon\n {\n // Treat pre-1980 values as invalid\n $minValidDate = Carbon::parse('1980-01-01 00:00:00');\n\n try {\n $date = Carbon::parse($datetime);\n\n if ($minValidDate->gt($date)) {\n return null;\n }\n\n return $date;\n } catch (Exception) {\n return null; // On parse error, treat as null\n }\n }\n\n private function resolveDealProbability(?string $stageProbability): int\n {\n if ($stageProbability === null) {\n return 0;\n }\n\n $probability = (float) $stageProbability;\n\n return $probability > 1 ? 0 : (int) ($probability * 100);\n }\n\n private function resolveForecastCategory(?string $forecastCategory): string\n {\n if (! $forecastCategory) {\n return Forecast::FORECAST_CATEGORY_UNCATEGORIZED;\n }\n\n $forecastCategory = str_replace('_', ' ', $forecastCategory);\n\n return ucwords(strtolower($forecastCategory));\n }\n\n private function importExternalFieldData(array $properties, int $opportunityId): void\n {\n $crmFields = $this->getOpportunitySyncableFields();\n $this->importOpportunityCrmFieldData($properties, $crmFields, $opportunityId);\n }\n\n private function importOpportunityContacts(Opportunity $opportunity, array $associations): void\n {\n // Handle empty or missing contact associations\n if (empty($associations)) {\n // Remove all existing contact associations if none provided\n $this->removeAllOpportunityContacts($opportunity);\n\n return;\n }\n\n // Use differential sync approach for better performance and accuracy\n $this->syncOpportunityContactsDifferential($opportunity, $associations);\n }\n\n /**\n * Sync opportunity contacts using differential approach\n * This compares current vs new associations and only makes necessary changes\n */\n private function syncOpportunityContactsDifferential(Opportunity $opportunity, array $contactAssociations): void\n {\n $currentContactCrmIds = $this->getCurrentContactCrmIds($opportunity);\n $contactAssociationIds = array_keys($contactAssociations);\n\n $contactsToAdd = array_diff($contactAssociationIds, $currentContactCrmIds);\n $contactsToRemove = array_diff($currentContactCrmIds, $contactAssociationIds);\n\n if (empty($contactsToAdd) && empty($contactsToRemove)) {\n return;\n }\n\n $this->logContactAssociationChanges($opportunity, $currentContactCrmIds, $contactAssociations, $contactsToAdd, $contactsToRemove);\n\n $this->removeContactAssociations($opportunity, $contactsToRemove);\n $this->addContactAssociations($opportunity, $contactsToAdd, $contactAssociations);\n }\n\n private function getCurrentContactCrmIds(Opportunity $opportunity): array\n {\n return $opportunity->contacts()\n ->pluck('contacts.crm_provider_id')\n ->toArray();\n }\n\n private function logContactAssociationChanges(\n Opportunity $opportunity,\n array $currentContactCrmIds,\n array $contactAssociations,\n array $contactsToAdd,\n array $contactsToRemove\n ): void {\n $this->logger->info('[' . $this->getDisplayName() . '] Contact association changes', [\n 'opportunity_id' => $opportunity->getId(),\n 'current_contacts' => $currentContactCrmIds,\n 'new_contacts' => $contactAssociations,\n 'contacts_to_add' => $contactsToAdd,\n 'contacts_to_remove' => $contactsToRemove,\n ]);\n }\n\n private function removeContactAssociations(Opportunity $opportunity, array $contactsToRemove): void\n {\n if (empty($contactsToRemove)) {\n return;\n }\n\n $contactsToDetach = $opportunity->contacts()\n ->whereIn('contacts.crm_provider_id', $contactsToRemove)\n ->pluck('contacts.id')\n ->toArray();\n\n if (! empty($contactsToDetach)) {\n $opportunity->contacts()->detach($contactsToDetach);\n\n $this->logger->info('[' . $this->getDisplayName() . '] Removed contact associations', [\n 'opportunity_id' => $opportunity->getId(),\n 'removed_contact_crm_ids' => $contactsToRemove,\n 'removed_contact_count' => count($contactsToDetach),\n ]);\n }\n }\n\n private function addContactAssociations(Opportunity $opportunity, array $contactsToAdd, array $contactAssociations): void\n {\n if (empty($contactsToAdd)) {\n return;\n }\n\n $contactsAdded = [];\n foreach ($contactsToAdd as $crmId) {\n $id = $contactAssociations[$crmId];\n\n if ($this->attachSingleContact($opportunity, (string) $crmId, $id)) {\n $contactsAdded[] = $crmId;\n }\n }\n\n $this->logAddedContacts($opportunity, $contactsAdded);\n }\n\n private function attachSingleContact(Opportunity $opportunity, string $crmId, int $id): bool\n {\n try {\n $contact = $this->crmEntityRepository->findContactByConfigurationAndId($this->config, $id);\n\n if (! $contact) {\n return false;\n }\n\n return $this->performContactAttachment($opportunity, $contact, $crmId);\n } catch (\\Throwable $e) {\n $this->logger->warning('[' . $this->getDisplayName() . '] Failed to add contact association', [\n 'opportunity_id' => $opportunity->getId(),\n 'contact_crm_id' => $crmId,\n 'error' => $e->getMessage(),\n ]);\n\n return false;\n }\n }\n\n private function performContactAttachment(Opportunity $opportunity, Contact $contact, string $crmId): bool\n {\n try {\n $opportunity->contacts()->attach($contact->getId(), [\n 'crm_provider_id' => $crmId,\n ]);\n\n return true;\n } catch (\\Illuminate\\Database\\QueryException $e) {\n if (str_contains($e->getMessage(), 'Duplicate entry')) {\n $this->logger->info('[' . $this->getDisplayName() . '] Contact association already exists', [\n 'contact_id' => $contact->getId(),\n 'contact_crm_id' => $crmId,\n 'opportunity_id' => $opportunity->getId(),\n ]);\n\n return false;\n }\n\n throw $e;\n }\n }\n\n private function logAddedContacts(Opportunity $opportunity, array $contactsAdded): void\n {\n if (! empty($contactsAdded)) {\n $this->logger->info('[' . $this->getDisplayName() . '] Added contact associations', [\n 'opportunity_id' => $opportunity->getId(),\n 'added_contact_crm_ids' => $contactsAdded,\n 'added_contacts_count' => count($contactsAdded),\n ]);\n }\n }\n}","depth":4,"value":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Services\\Crm\\Hubspot\\ServiceTraits;\n\nuse Carbon\\Carbon;\nuse HubSpot\\Client\\Crm\\Deals\\Model\\CollectionResponseAssociatedId;\nuse Jiminny\\Exceptions\\InvalidArgumentException;\nuse Jiminny\\Models\\Account;\nuse Exception;\nuse Jiminny\\Component\\DealInsights\\Forecast\\Forecast;\nuse Jiminny\\Jobs\\Crm\\MatchActivitiesToNewOpportunity;\nuse Jiminny\\Models\\Contact;\nuse Jiminny\\Models\\Crm\\BusinessProcess;\nuse Jiminny\\Exceptions\\CrmException;\nuse Jiminny\\Models\\Opportunity;\nuse Illuminate\\Support\\Collection;\nuse Jiminny\\Models\\Stage;\nuse Jiminny\\Repositories\\Crm\\CrmEntityRepository;\nuse Jiminny\\Services\\Crm\\Hubspot\\DealFieldsService;\nuse Jiminny\\Services\\Crm\\Hubspot\\OpportunitySyncStrategy\\HubspotSingleSyncStrategy;\nuse Jiminny\\Services\\Crm\\Hubspot\\WebhookSyncBatchProcessor;\nuse Jiminny\\Services\\Crm\\OpportunitySyncStrategyResolver;\nuse Jiminny\\Utils\\CurrencyFormatter;\n\n/**\n * Optimized sync methods for better performance\n * These methods can be integrated into SyncCrmEntitiesTrait for significant performance gains\n */\ntrait OpportunitySyncTrait\n{\n private const int BATCH_SIZE = 100;\n private const int BATCH_PROCESS_SIZE = 800;\n\n protected OpportunitySyncStrategyResolver $opportunitySyncStrategyResolver;\n protected CrmEntityRepository $crmEntityRepository;\n protected DealFieldsService $dealFieldsService;\n\n private ?array $cachedClosedDealStages = null;\n private array $cachedBusinessProcesses = [];\n private array $cachedStages = [];\n\n public function syncOpportunities(array $parameters, ?string $strategy = null): int\n {\n $startTime = microtime(true);\n $strategies = $this->opportunitySyncStrategyResolver->getStrategies($this->config, $strategy);\n $parameters['config'] = $this->config;\n $syncCount = 0;\n $reportedTotal = 0;\n $lastSyncedId = [];\n $strategyNames = [];\n\n try {\n foreach ($strategies as $strategyName => $syncStrategy) {\n $strategyNames[] = $strategyName;\n $this->logger->info(\n '[' . $this->getDisplayName() . '] Syncing opportunities using strategy: ' . $strategyName,\n ['team' => $this->team->getId()]\n );\n\n $total = 0;\n $lastId = null;\n $buffer = [];\n\n // HubspotWebhookBatchSyncStrategy returns empty generator, this is for other strategies\n foreach ($syncStrategy->fetchOpportunities($parameters, $total, $lastId) as $hsOpportunity) {\n $buffer[] = $hsOpportunity;\n\n // process every 800 rows (fits < 1 000 association limit)\n if (\\count($buffer) >= self::BATCH_PROCESS_SIZE) {\n $syncCount += $this->processOpportunityBatch($buffer);\n $buffer = [];\n }\n }\n\n // leftovers\n if ($buffer) {\n $syncCount += $this->processOpportunityBatch($buffer);\n }\n\n $reportedTotal += $total;\n $lastSyncedId = $lastId;\n }\n } catch (\\HubSpot\\Client\\Crm\\Deals\\ApiException | CrmException $e) {\n $this->handleSyncException($e, $parameters);\n }\n\n $durationMs = round((microtime(true) - $startTime) * 1000, 2);\n $this->logger->info(\n '[HubSpot] Synced opportunities',\n [\n 'team' => $this->team->getId(),\n 'strategies' => implode(',', $strategyNames),\n 'sync_count' => $syncCount,\n 'total' => $reportedTotal,\n 'last_synced_id' => $lastSyncedId,\n 'duration_ms' => $durationMs,\n ]\n );\n\n return $reportedTotal;\n }\n\n private function handleSyncException(\\Throwable $e, array $parameters): void\n {\n if (($parameters['since'] ?? null) instanceof Carbon) {\n $parameters['since'] = $parameters['since']->toDateTimeString();\n }\n $parameters['config'] = $this->config->getId();\n\n $this->logger->warning('[' . $this->getDisplayName() . '] Sync opportunities failed', [\n 'teamId' => $this->team->getUuid(),\n 'parameters' => $parameters,\n 'reason' => $e->getMessage(),\n ]);\n }\n\n /**\n * @inheritdoc\n */\n public function syncOpportunity(string $crmId): ?Opportunity\n {\n $strategy = $this->opportunitySyncStrategyResolver->resolve(\n $this->config,\n OpportunitySyncStrategyResolver::SINGLE_SYNC_OPPORTUNITY_STRATEGY,\n );\n\n $parameters = [\n 'config' => $this->config,\n 'crm_id' => $crmId,\n ];\n\n try {\n if (! $strategy instanceof HubspotSingleSyncStrategy) {\n throw new InvalidArgumentException('Strategy must by HubspotSingleSyncStrategy');\n }\n\n $hsOpportunity = $strategy->fetchOpportunity($parameters);\n } catch (\\HubSpot\\Client\\Crm\\Deals\\ApiException $e) {\n $this->logger->info('[' . $this->getDisplayName() . '] Opportunity not found', [\n 'teamId' => $this->team->getUuid(),\n 'crmId' => $crmId,\n 'reason' => $e->getMessage(),\n ]);\n\n return null;\n }\n\n $hsOpportunity['associations'] = $this->convertDealAssociations($hsOpportunity['associations'] ?? []);\n\n return $this->importOrUpdateOpportunity($hsOpportunity);\n }\n\n /**\n * Process webhook-collected opportunity batches.\n *\n * Drains Redis sets containing company CRM IDs collected from webhook events\n * and dispatches ImportOpportunityBatch jobs for batch processing.\n *\n * @return int Number of opportunity IDs dispatched to jobs\n */\n public function batchSyncOpportunities(): int\n {\n $configId = $this->team->getCrmConfiguration()->getId();\n\n return $this->batchProcessor->processBatchesForObjectType(\n WebhookSyncBatchProcessor::OBJECT_TYPE_DEAL,\n $configId\n );\n }\n\n /**\n * Import a batch of opportunities by their CRM IDs.\n * Fetches opportunity data from HubSpot API and delegates to importOpportunityBatch().\n *\n * @param array<string> $crmIds HubSpot deal CRM IDs\n *\n * @return array{success: array, failed_ids: array, errors?: array<string, string>}\n */\n public function importOpportunityBatchByIds(array $crmIds): array\n {\n $fields = $this->dealFieldsService->getFieldsForConfiguration($this->config);\n\n $allDeals = [];\n foreach (array_chunk($crmIds, self::BATCH_SIZE) as $chunk) {\n $deals = $this->client->getOpportunitiesByIds($chunk, $fields);\n foreach ($deals as $deal) {\n $allDeals[] = $deal;\n }\n }\n\n // IDs not returned by HubSpot are likely deleted or inaccessible deals.\n // These are not failures — retrying won't bring them back.\n $fetchedIds = array_map('strval', array_column($allDeals, 'id'));\n $notFoundIds = array_values(array_diff(array_map('strval', $crmIds), $fetchedIds));\n\n if (! empty($notFoundIds)) {\n $this->logger->info('[' . $this->getDisplayName() . '] CRM IDs not found in HubSpot (likely deleted)', [\n 'teamId' => $this->team->getId(),\n 'notFoundCount' => \\count($notFoundIds),\n 'notFoundIds' => $notFoundIds,\n 'requestedCount' => \\count($crmIds),\n 'fetchedCount' => \\count($allDeals),\n ]);\n }\n\n if (empty($allDeals)) {\n return ['success' => [], 'failed_ids' => []];\n }\n\n return $this->importOpportunityBatch($allDeals);\n }\n\n private function getClosedDealStages(): array\n {\n if ($this->cachedClosedDealStages !== null) {\n return $this->cachedClosedDealStages;\n }\n\n $stages = $this->crmEntityRepository->getOpportunityClosedStages($this->config);\n $data = [\n 'lost' => [],\n 'won' => [],\n ];\n\n foreach ($stages as $stage) {\n if ($stage->probability == 0.00) {\n $data['lost'][] = $stage->crm_provider_id;\n }\n if ($stage->probability == 100.00) {\n $data['won'][] = $stage->crm_provider_id;\n }\n }\n\n $this->cachedClosedDealStages = $data;\n\n return $data;\n }\n\n /**\n * Import deals into the database with pre-fetched associations.\n *\n * API calls here (getAssociationsData, getExistingOpportunityCrmIds) are NOT\n * caught — if they throw, the exception propagates to ImportOpportunityBatch::handle()\n * where Laravel retries the whole job with backoff. After all retries exhausted,\n * failed() requeues all IDs to Redis.\n *\n * The per-deal loop catches exceptions individually. A deal can end up in three states:\n * - success: imported/updated successfully\n * - failed_ids: exception thrown (DB constraint violation, corrupt data, etc.)\n * These are permanent issues — retrying won't fix them.\n * - skipped (null): missing dependencies (no account, unknown pipeline/stage).\n * This is acceptable — the deal cannot be imported until those exist.\n */\n private function importOpportunityBatch(array $deals): array\n {\n $syncedOpportunities = [\n 'success' => [],\n 'failed_ids' => [],\n ];\n $dealIds = array_column($deals, 'id');\n\n // Shared association/existing-ID preparation is batch-level state. If it fails, rethrow so the\n // queue job retries the whole batch and eventually requeues all deal IDs back to Redis.\n try {\n $companyAssociations = $this->client->getAssociationsData($dealIds, 'deals', 'companies');\n $contactAssociations = $this->client->getAssociationsData($dealIds, 'deals', 'contacts');\n\n $associationsData = $this->prepareAssociatedEntities($companyAssociations, $contactAssociations);\n\n $existingCrmIds = $this->crmEntityRepository->getExistingOpportunityCrmIds(\n $this->config,\n array_map('strval', $dealIds)\n );\n $existingCrmIdSet = array_flip($existingCrmIds);\n } catch (\\Throwable $e) {\n $this->logger->error('[' . $this->getDisplayName() . '] Failed to fetch associations or existing IDs', [\n 'teamId' => $this->team->getId(),\n 'dealCount' => count($dealIds),\n 'error' => $e->getMessage(),\n ]);\n\n throw $e;\n }\n\n foreach ($deals as $deal) {\n try {\n $deal['associations'] = $this->prepareAssociationsForOpportunity(\n $deal['id'],\n $companyAssociations,\n $contactAssociations,\n $associationsData\n );\n\n $syncedOpportunity = $this->importOrUpdateOpportunity(\n $deal,\n isset($existingCrmIdSet[(string) $deal['id']])\n );\n if ($syncedOpportunity) {\n $syncedOpportunities['success'][] = $syncedOpportunity;\n }\n } catch (\\Throwable $e) {\n $this->logger->warning('[' . $this->getDisplayName() . '] Failed to import opportunity', [\n 'teamId' => $this->team->getId(),\n 'crmId' => $deal['id'],\n 'error' => $e->getMessage(),\n ]);\n $syncedOpportunities['failed_ids'][] = $deal['id'];\n $syncedOpportunities['errors'][$deal['id']] = $e->getMessage();\n }\n }\n\n return $syncedOpportunities;\n }\n\n /**\n * Prepare associated entities for opportunities with optimized batch processing\n * Returns structured data with CRM ID to DB ID mappings for each opportunity\n */\n private function prepareAssociatedEntities(array $companyAssociations, array $contactAssociations): array\n {\n // Step 1: Collect all unique company and contact IDs from associations\n $allCompanyIds = $this->flattenAssociationIds($companyAssociations);\n $allContactIds = $this->flattenAssociationIds($contactAssociations);\n\n // Step 2: Batch sync missing entities and get CRM ID to DB ID mappings\n $companyIdMappings = [];\n $contactIdMappings = [];\n\n if (! empty($allCompanyIds)) {\n $companyIdMappings = $this->prepareAssociatedAccounts($allCompanyIds);\n }\n\n if (! empty($allContactIds)) {\n $contactIdMappings = $this->prepareAssociatedContacts($allContactIds);\n }\n\n return [\n 'company_id_mappings' => $companyIdMappings,\n 'contact_id_mappings' => $contactIdMappings,\n ];\n }\n\n /**\n * Flatten association data to get unique IDs\n */\n private function flattenAssociationIds(array $associations): array\n {\n $ids = [];\n foreach ($associations as $dealAssociations) {\n if (is_array($dealAssociations)) {\n foreach ($dealAssociations as $id) {\n $ids[$id] = true;\n }\n }\n }\n\n return array_keys($ids);\n }\n\n /**\n * Batch sync missing accounts\n */\n private function prepareAssociatedAccounts(array $companyIds): array\n {\n // Find which accounts already exist\n $existingAccounts = $this->crmEntityRepository\n ->findAccountsByExternalIds($this->config, $companyIds);\n\n $existingCompanyIds = $existingAccounts->pluck('crm_provider_id')->toArray();\n\n $existingAccountsData = $existingAccounts->mapWithKeys(function ($account) {\n return [$account->getCrmProviderId() => $account->getId()];\n })->toArray();\n\n $missingCompanyIds = array_diff($companyIds, $existingCompanyIds);\n\n if (empty($missingCompanyIds)) {\n return $existingAccountsData;\n }\n\n $this->logger->info('[' . $this->getDisplayName() . '] Batch syncing missing accounts', [\n 'teamId' => $this->team->getUuid(),\n 'total_companies' => count($companyIds),\n 'existing_companies' => count($existingCompanyIds),\n 'missing_companies' => count($missingCompanyIds),\n ]);\n\n // we already have limit on opportunity ids count\n // Initialize variable before try block\n $syncedAccountsData = [];\n\n try {\n $syncedAccountsData = $this->batchSyncCrmObjects('companies', $missingCompanyIds);\n } catch (\\Throwable $e) {\n $this->logger->warning('[' . $this->getDisplayName() . '] Failed to sync missing accounts', [\n 'size' => count($missingCompanyIds),\n 'error' => $e->getMessage(),\n ]);\n $syncedAccountsData = [];\n }\n\n return $existingAccountsData + $syncedAccountsData;\n }\n\n /**\n * Prepare associated contacts - find existing and sync missing ones\n * Returns mapping of CRM ID to DB ID\n */\n private function prepareAssociatedContacts(array $contactIds): array\n {\n // Find which contacts already exist\n $existingContacts = $this->crmEntityRepository\n ->findContactsByExternalIds($this->config, $contactIds);\n\n $existingContactIds = $existingContacts->pluck('crm_provider_id')->toArray();\n\n // Create mapping for existing contacts\n $existingContactsData = $existingContacts->mapWithKeys(function ($contact) {\n return [$contact->getCrmProviderId() => $contact->getId()];\n })->toArray();\n\n $missingContactIds = array_diff($contactIds, $existingContactIds);\n\n if (empty($missingContactIds)) {\n return $existingContactsData;\n }\n\n $this->logger->info('[' . $this->getDisplayName() . '] Batch syncing missing contacts', [\n 'teamId' => $this->team->getUuid(),\n 'total_contacts' => count($contactIds),\n 'existing_contacts' => count($existingContactIds),\n 'missing_contacts' => count($missingContactIds),\n ]);\n\n // Sync missing contacts using batch API\n try {\n $syncedContactsData = $this->batchSyncCrmObjects('contacts', $missingContactIds);\n } catch (\\Throwable $e) {\n $this->logger->warning('[' . $this->getDisplayName() . '] Failed to sync missing contacts', [\n 'size' => count($missingContactIds),\n 'error' => $e->getMessage(),\n ]);\n $syncedContactsData = [];\n }\n\n return $existingContactsData + $syncedContactsData;\n }\n\n private function batchSyncCrmObjects(string $objectType, array $crmIds): array\n {\n $syncObjects = [];\n $crmObjectIds = array_values($crmIds);\n\n foreach (array_chunk($crmObjectIds, self::BATCH_SIZE) as $chunk) {\n try {\n $objects = $objectType === 'companies' ?\n $this->client->getCompaniesByIds($chunk, $this->getCompanyFields()) :\n $this->client->getContactsByIds($chunk, $this->getContactFields());\n\n foreach ($objects as $objectId => $objectData) {\n $this->importCrmObject($objectType, (string) $objectId, $objectData, $syncObjects);\n }\n\n $this->logger->info('[' . $this->getDisplayName() . '] Batch synced ' . $objectType, [\n 'requested_count' => count($chunk),\n 'synced_count' => count($objects),\n ]);\n } catch (\\Throwable $e) {\n $this->logger->warning('[' . $this->getDisplayName() . '] Batch ' . $objectType . ' sync failed', [\n 'ids' => $chunk,\n 'error' => $e->getMessage(),\n ]);\n }\n }\n\n return $syncObjects;\n }\n\n private function importCrmObject(string $objectType, string $objectId, mixed $objectData, array &$syncObjects): void\n {\n try {\n $object = $objectType === 'companies' ?\n $this->importAccount($objectData) :\n $this->importContact($objectData);\n\n if ($object) {\n $syncObjects[$object->getCrmProviderId()] = $object->getId();\n }\n } catch (\\Throwable $e) {\n $this->logger->warning('[' . $this->getDisplayName() . '] Failed to import batch ' . $objectType, [\n 'id' => $objectId,\n 'error' => $e->getMessage(),\n ]);\n }\n }\n\n /**\n * Prepare associations for a single opportunity\n *\n * The return value is an array with the following structure:\n * [\n * 'companies' => [\n * $companyCrmId => $companyId,\n * ...\n * ],\n * 'contacts' => [\n * $contactCrmId => $contactId,\n * ...\n * ],\n * 'account_id' => $accountId,\n * ]\n */\n private function prepareAssociationsForOpportunity(\n string $oppCrmId,\n array $companyAssociations,\n array $contactAssociations,\n array $associationsData\n ): array {\n $associations = [\n 'companies' => [],\n 'contacts' => [],\n 'account_id' => null, // Primary account for opportunity\n ];\n\n $oppCompanyIds = $companyAssociations[$oppCrmId] ?? [];\n foreach ($oppCompanyIds as $companyCrmId) {\n if (isset($associationsData['company_id_mappings'][$companyCrmId])) {\n $associations['companies'][$companyCrmId] = $associationsData['company_id_mappings'][$companyCrmId];\n\n // Set primary account (first company becomes primary account)\n if ($associations['account_id'] === null) {\n $associations['account_id'] = $associationsData['company_id_mappings'][$companyCrmId];\n }\n }\n }\n\n $oppContactIds = $contactAssociations[$oppCrmId] ?? [];\n foreach ($oppContactIds as $contactCrmId) {\n if (isset($associationsData['contact_id_mappings'][$contactCrmId])) {\n $associations['contacts'][$contactCrmId] = $associationsData['contact_id_mappings'][$contactCrmId];\n }\n }\n\n return $associations;\n }\n\n /**\n * Update only associations for an opportunity\n */\n private function updateOpportunityAssociations(Opportunity $opportunity, array $associations): void\n {\n // Update contact associations\n $this->importOpportunityContacts($opportunity, $associations['contacts']);\n\n // Update company (account) associations\n $this->updateOpportunityAccount($opportunity, $associations['account_id']);\n }\n\n /**\n * Remove all contact associations from an opportunity\n */\n private function removeAllOpportunityContacts(Opportunity $opportunity): void\n {\n $currentCount = (int) $opportunity->contacts()->count();\n\n if ($currentCount > 0) {\n $opportunity->contacts()->detach();\n\n $this->logger->info('[' . $this->getDisplayName() . '] Removed all contact associations', [\n 'opportunity_id' => $opportunity->getId(),\n 'removed_count' => $currentCount,\n ]);\n }\n }\n\n private function updateOpportunityAccount(Opportunity $opportunity, ?int $accountId): void\n {\n if ($accountId === null) {\n // No account ID provided - keep current account\n return;\n }\n\n $currentAccountId = $opportunity->getAccountId();\n\n // Only update if account has changed\n if ($currentAccountId !== $accountId) {\n $opportunity->account_id = $accountId;\n $opportunity->save();\n\n $this->logger->info('[' . $this->getDisplayName() . '] Updated opportunity account association', [\n 'opportunity_id' => $opportunity->getId(),\n 'old_account_id' => $currentAccountId,\n 'new_account_id' => $accountId,\n ]);\n }\n }\n\n /**\n * Find existing opportunities by external IDs (OPTIMIZED VERSION)\n * Uses batch query for better performance\n */\n private function findExistingOpportunities(array $crmIds): Collection\n {\n return $this->crmEntityRepository\n ->findOpportunitiesByExternalIds($this->config, $crmIds);\n }\n\n private function processOpportunityBatch(array $opportunities): int\n {\n $syncedOpportunities = $this->importOpportunityBatch($opportunities);\n\n return count($syncedOpportunities['success'] ?? []);\n }\n\n /**\n * Convert single deal associations from HubSpot format to internal format\n * Handles both HubSpot SDK objects and array formats\n *\n * @param array $opportunityAssociations Raw associations from HubSpot API or pre-processed\n *\n * @return array Processed associations with DB IDs\n */\n private function convertDealAssociations(array $opportunityAssociations): array\n {\n $associations = $this->initializeAssociationsStructure();\n\n if (empty($opportunityAssociations)) {\n return $associations;\n }\n\n $associationIds = $this->extractAssociationIds($opportunityAssociations);\n\n $this->processCompanyAssociations($associationIds, $associations);\n $this->processContactAssociations($associationIds, $associations);\n\n return $associations;\n }\n\n private function initializeAssociationsStructure(): array\n {\n return [\n 'companies' => [],\n 'contacts' => [],\n 'account_id' => null, // Primary account for opportunity\n ];\n }\n\n private function extractAssociationIds(array $opportunityAssociations): array\n {\n $associationIds = [];\n\n foreach ($opportunityAssociations as $type => $associationData) {\n if (! empty($associationData)) {\n $associationIds[$type] = $this->convertSingleDealAssociations($associationData);\n }\n }\n\n return $associationIds;\n }\n\n private function processCompanyAssociations(array $associationIds, array &$associations): void\n {\n if (empty($associationIds['companies'])) {\n return;\n }\n\n $companyId = $associationIds['companies'][0];\n $account = $this->findOrSyncAccount($companyId);\n\n if ($account instanceof Account) {\n $associations['companies'][$companyId] = $account->getId();\n $associations['account_id'] = $account->getId();\n }\n }\n\n private function processContactAssociations(array $associationIds, array &$associations): void\n {\n if (empty($associationIds['contacts'])) {\n return;\n }\n\n foreach ($associationIds['contacts'] as $contactId) {\n $contact = $this->findOrSyncContact($contactId);\n\n if ($contact instanceof Contact) {\n $associations['contacts'][$contactId] = $contact->getId();\n }\n }\n }\n\n private function findOrSyncAccount(string $companyId): ?Account\n {\n $account = $this->crmEntityRepository->findAccountByExternalId($this->config, $companyId);\n\n if (! $account instanceof Account) {\n $account = $this->syncAccount($companyId);\n }\n\n return $account;\n }\n\n private function findOrSyncContact(string $contactId): ?Contact\n {\n $contact = $this->crmEntityRepository->findContactByExternalId($this->config, $contactId);\n\n if (! $contact instanceof Contact) {\n $contact = $this->syncContact($contactId);\n }\n\n return $contact;\n }\n\n private function convertSingleDealAssociations($opportunityAssociations = null): array\n {\n $associationData = [];\n\n if ($opportunityAssociations === null) {\n return $associationData;\n }\n\n // Handle array input (from extractAssociationIds)\n if (is_array($opportunityAssociations)) {\n return $opportunityAssociations;\n }\n\n // Handle CollectionResponseAssociatedId object\n if ($opportunityAssociations instanceof CollectionResponseAssociatedId) {\n foreach ($opportunityAssociations->getResults() as $association) {\n $associationData[] = $association->getId();\n }\n }\n\n return $associationData;\n }\n\n private function importOrUpdateOpportunity($crmData, ?bool $exists = null): ?Opportunity\n {\n if (empty($crmData['properties'])) {\n return null;\n }\n\n $crmId = (string) $crmData['id'];\n $properties = $crmData['properties'];\n $associations = $crmData['associations'] ?? [];\n\n $opportunityExists = $exists ?? (bool) $this->crmEntityRepository->findOpportunityByExternalId(\n $this->config,\n $crmId\n );\n\n if ($opportunityExists) {\n return $this->updateOpportunity($crmId, $properties, $associations);\n }\n\n return $this->createOpportunity($crmId, $properties, $associations);\n }\n\n /**\n * Create new opportunity\n */\n private function createOpportunity(string $crmId, array $properties, array $associations): ?Opportunity\n {\n $accountId = $this->resolveAccountId($associations);\n if (! $accountId) {\n return null;\n }\n\n $businessProcess = $this->resolveBusinessProcess($properties['pipeline'] ?? null);\n if (! $businessProcess) {\n return null;\n }\n\n $stage = $this->resolveStage($businessProcess, $properties['dealstage'] ?? null);\n if (! $stage) {\n return null;\n }\n\n $data = $this->buildOpportunityData($properties, $accountId, $businessProcess, $stage);\n\n $attributes = [\n 'crm_configuration_id' => $this->config->getId(),\n 'crm_provider_id' => $crmId,\n ];\n\n $values = array_merge($attributes, $data);\n\n $opportunity = $this->crmEntityRepository->upsertOpportunity($attributes, $values);\n\n $this->importExternalFieldData($properties, $opportunity->getId());\n $this->importOpportunityContacts($opportunity, $associations['contacts']);\n\n if ($opportunity->wasRecentlyCreated) {\n MatchActivitiesToNewOpportunity::dispatch($opportunity->getId());\n }\n\n return $opportunity;\n }\n\n /**\n * Update existing opportunity\n */\n private function updateOpportunity(string $crmId, array $properties, array $associations): Opportunity\n {\n $accountId = $this->resolveAccountId($associations);\n $businessProcess = $this->resolveBusinessProcess($properties['pipeline'] ?? null);\n $stage = $businessProcess ? $this->resolveStage($businessProcess, $properties['dealstage'] ?? null) : null;\n\n $data = $this->buildOpportunityData($properties, $accountId, $businessProcess, $stage);\n\n $attributes = [\n 'crm_configuration_id' => $this->config->getId(),\n 'crm_provider_id' => $crmId,\n ];\n\n $values = array_merge($attributes, $data);\n $opportunity = $this->crmEntityRepository->upsertOpportunity($attributes, $values);\n\n $this->importExternalFieldData($properties, $opportunity->getId());\n $this->updateOpportunityAssociations($opportunity, $associations);\n\n return $opportunity;\n }\n\n private function resolveAccountId(array $associations): ?int\n {\n if (! empty($associations['account_id'])) {\n return $associations['account_id'];\n }\n\n if (empty($associations)) {\n return null;\n }\n\n // Fallback: use first company as account (currently SDK returns one company)\n foreach ($associations['companies'] as $accountId) {\n return $accountId;\n }\n\n return null;\n }\n\n private function buildOpportunityData(\n array $properties,\n ?int $accountId,\n ?BusinessProcess $businessProcess,\n ?Stage $stage\n ): array {\n $ownerId = null;\n $profile = null;\n if (! empty($properties['hubspot_owner_id'])) {\n $ownerId = $properties['hubspot_owner_id'];\n $profile = $this->crmEntityRepository->findProfileByExternalId($this->config, (string) $ownerId);\n }\n\n $name = 'Unknown';\n if (isset($properties['dealname'])) {\n $name = mb_strimwidth($properties['dealname'], 0, 128);\n }\n\n $amount = $this->resolveAmount($properties);\n $currency = $properties['deal_currency_code'] ?? null;\n\n $closeDate = null;\n if (! empty($properties['closedate'])) {\n $closeDate = Carbon::parse($properties['closedate'])->format('Y-m-d');\n }\n\n $remotelyCreatedAt = null;\n if (! empty($properties['createdate']) && strtotime($properties['createdate'])) {\n $date = $this->parseCleanDatetime($properties['createdate']);\n $remotelyCreatedAt = $date?->format('Y-m-d H:i:s');\n }\n\n $closedStages = $this->getClosedDealStages();\n $isWon = in_array($properties['dealstage'], $closedStages['won']);\n $isLost = in_array($properties['dealstage'], $closedStages['lost']);\n\n $data = [\n 'team_id' => $this->team->getId(),\n 'user_id' => $profile ? $profile->user_id : null,\n 'owner_id' => $ownerId,\n 'name' => $name,\n 'value' => ! empty($amount) ? $amount : null,\n 'currency_code' => CurrencyFormatter::formatCode($currency),\n 'close_date' => $closeDate,\n 'is_closed' => $isWon || $isLost,\n 'is_won' => $isWon,\n 'remotely_created_at' => $remotelyCreatedAt,\n 'probability' => $this->resolveDealProbability($properties['hs_deal_stage_probability']),\n 'forecast_category' => $this->resolveForecastCategory($properties['hs_manual_forecast_category']),\n ];\n\n if ($accountId) {\n $data['account_id'] = $accountId;\n }\n\n if ($stage) {\n $data['stage_id'] = $stage->id;\n }\n\n if ($businessProcess) {\n $recordType = $this->crmEntityRepository->getBusinessProcessRecordType($businessProcess);\n if ($recordType) {\n $data['record_type_id'] = $recordType->id;\n }\n }\n\n return $data;\n }\n\n private function resolveBusinessProcess(?string $pipelineId): ?BusinessProcess\n {\n if ($pipelineId === null) {\n return null;\n }\n\n $cacheKey = $this->getBusinessProcessCacheKey($pipelineId);\n if (isset($this->cachedBusinessProcesses[$cacheKey])) {\n return $this->cachedBusinessProcesses[$cacheKey];\n }\n\n $businessProcess = $this->getBusinessProcess($pipelineId);\n\n if (! $businessProcess instanceof BusinessProcess) {\n $this->importStages();\n $businessProcess = $this->getBusinessProcess($pipelineId);\n }\n\n if (! $businessProcess instanceof BusinessProcess) {\n $this->logger->info(\n '[HubSpot] Deal is not attached to a pipeline',\n [\n 'pipeline' => $pipelineId]\n );\n }\n\n $this->cachedBusinessProcesses[$cacheKey] = $businessProcess;\n\n return $businessProcess;\n }\n\n private function getBusinessProcess(string $pipelineId): ?BusinessProcess\n {\n return $this->crmEntityRepository->findBusinessProcessesByExternalId($this->config, $pipelineId);\n }\n\n private function getBusinessProcessCacheKey(string $pipelineId): string\n {\n return $this->config->getId() . '_' . $pipelineId;\n }\n\n private function resolveStage(BusinessProcess $businessProcess, ?string $stageId): ?Stage\n {\n if (empty($stageId)) {\n return null;\n }\n\n $cacheKey = $businessProcess->getId() . ':' . $stageId;\n if (isset($this->cachedStages[$cacheKey])) {\n return $this->cachedStages[$cacheKey];\n }\n\n $stage = $this->crmEntityRepository->getPipelineStageByConditions(\n $businessProcess,\n [\n 'crm_provider_id' => $stageId,\n 'type' => Stage::TYPE_OPPORTUNITY,\n ]\n );\n\n if ($stage === null) {\n $this->importStages(null, $stageId);\n }\n\n if ($stage === null) {\n $this->logger->info('[HubSpot] Stage does not exist => ' . $stageId);\n }\n\n $this->cachedStages[$cacheKey] = $stage;\n\n return $stage;\n }\n\n private function resolveAmount(array $properties): ?string\n {\n $amount = null;\n if (! empty($properties['amount'])) {\n $amount = str_replace(',', '', $properties['amount']);\n }\n\n if ($this->config->hasDefaultCurrencyFieldSet()) {\n $valueFieldName = $this->config->getDefaultCurrencyField()->getCrmProviderId();\n $amount = $properties[$valueFieldName] ?? $amount;\n }\n\n return $amount;\n }\n\n private function parseCleanDatetime(string $datetime): ?Carbon\n {\n // Treat pre-1980 values as invalid\n $minValidDate = Carbon::parse('1980-01-01 00:00:00');\n\n try {\n $date = Carbon::parse($datetime);\n\n if ($minValidDate->gt($date)) {\n return null;\n }\n\n return $date;\n } catch (Exception) {\n return null; // On parse error, treat as null\n }\n }\n\n private function resolveDealProbability(?string $stageProbability): int\n {\n if ($stageProbability === null) {\n return 0;\n }\n\n $probability = (float) $stageProbability;\n\n return $probability > 1 ? 0 : (int) ($probability * 100);\n }\n\n private function resolveForecastCategory(?string $forecastCategory): string\n {\n if (! $forecastCategory) {\n return Forecast::FORECAST_CATEGORY_UNCATEGORIZED;\n }\n\n $forecastCategory = str_replace('_', ' ', $forecastCategory);\n\n return ucwords(strtolower($forecastCategory));\n }\n\n private function importExternalFieldData(array $properties, int $opportunityId): void\n {\n $crmFields = $this->getOpportunitySyncableFields();\n $this->importOpportunityCrmFieldData($properties, $crmFields, $opportunityId);\n }\n\n private function importOpportunityContacts(Opportunity $opportunity, array $associations): void\n {\n // Handle empty or missing contact associations\n if (empty($associations)) {\n // Remove all existing contact associations if none provided\n $this->removeAllOpportunityContacts($opportunity);\n\n return;\n }\n\n // Use differential sync approach for better performance and accuracy\n $this->syncOpportunityContactsDifferential($opportunity, $associations);\n }\n\n /**\n * Sync opportunity contacts using differential approach\n * This compares current vs new associations and only makes necessary changes\n */\n private function syncOpportunityContactsDifferential(Opportunity $opportunity, array $contactAssociations): void\n {\n $currentContactCrmIds = $this->getCurrentContactCrmIds($opportunity);\n $contactAssociationIds = array_keys($contactAssociations);\n\n $contactsToAdd = array_diff($contactAssociationIds, $currentContactCrmIds);\n $contactsToRemove = array_diff($currentContactCrmIds, $contactAssociationIds);\n\n if (empty($contactsToAdd) && empty($contactsToRemove)) {\n return;\n }\n\n $this->logContactAssociationChanges($opportunity, $currentContactCrmIds, $contactAssociations, $contactsToAdd, $contactsToRemove);\n\n $this->removeContactAssociations($opportunity, $contactsToRemove);\n $this->addContactAssociations($opportunity, $contactsToAdd, $contactAssociations);\n }\n\n private function getCurrentContactCrmIds(Opportunity $opportunity): array\n {\n return $opportunity->contacts()\n ->pluck('contacts.crm_provider_id')\n ->toArray();\n }\n\n private function logContactAssociationChanges(\n Opportunity $opportunity,\n array $currentContactCrmIds,\n array $contactAssociations,\n array $contactsToAdd,\n array $contactsToRemove\n ): void {\n $this->logger->info('[' . $this->getDisplayName() . '] Contact association changes', [\n 'opportunity_id' => $opportunity->getId(),\n 'current_contacts' => $currentContactCrmIds,\n 'new_contacts' => $contactAssociations,\n 'contacts_to_add' => $contactsToAdd,\n 'contacts_to_remove' => $contactsToRemove,\n ]);\n }\n\n private function removeContactAssociations(Opportunity $opportunity, array $contactsToRemove): void\n {\n if (empty($contactsToRemove)) {\n return;\n }\n\n $contactsToDetach = $opportunity->contacts()\n ->whereIn('contacts.crm_provider_id', $contactsToRemove)\n ->pluck('contacts.id')\n ->toArray();\n\n if (! empty($contactsToDetach)) {\n $opportunity->contacts()->detach($contactsToDetach);\n\n $this->logger->info('[' . $this->getDisplayName() . '] Removed contact associations', [\n 'opportunity_id' => $opportunity->getId(),\n 'removed_contact_crm_ids' => $contactsToRemove,\n 'removed_contact_count' => count($contactsToDetach),\n ]);\n }\n }\n\n private function addContactAssociations(Opportunity $opportunity, array $contactsToAdd, array $contactAssociations): void\n {\n if (empty($contactsToAdd)) {\n return;\n }\n\n $contactsAdded = [];\n foreach ($contactsToAdd as $crmId) {\n $id = $contactAssociations[$crmId];\n\n if ($this->attachSingleContact($opportunity, (string) $crmId, $id)) {\n $contactsAdded[] = $crmId;\n }\n }\n\n $this->logAddedContacts($opportunity, $contactsAdded);\n }\n\n private function attachSingleContact(Opportunity $opportunity, string $crmId, int $id): bool\n {\n try {\n $contact = $this->crmEntityRepository->findContactByConfigurationAndId($this->config, $id);\n\n if (! $contact) {\n return false;\n }\n\n return $this->performContactAttachment($opportunity, $contact, $crmId);\n } catch (\\Throwable $e) {\n $this->logger->warning('[' . $this->getDisplayName() . '] Failed to add contact association', [\n 'opportunity_id' => $opportunity->getId(),\n 'contact_crm_id' => $crmId,\n 'error' => $e->getMessage(),\n ]);\n\n return false;\n }\n }\n\n private function performContactAttachment(Opportunity $opportunity, Contact $contact, string $crmId): bool\n {\n try {\n $opportunity->contacts()->attach($contact->getId(), [\n 'crm_provider_id' => $crmId,\n ]);\n\n return true;\n } catch (\\Illuminate\\Database\\QueryException $e) {\n if (str_contains($e->getMessage(), 'Duplicate entry')) {\n $this->logger->info('[' . $this->getDisplayName() . '] Contact association already exists', [\n 'contact_id' => $contact->getId(),\n 'contact_crm_id' => $crmId,\n 'opportunity_id' => $opportunity->getId(),\n ]);\n\n return false;\n }\n\n throw $e;\n }\n }\n\n private function logAddedContacts(Opportunity $opportunity, array $contactsAdded): void\n {\n if (! empty($contactsAdded)) {\n $this->logger->info('[' . $this->getDisplayName() . '] Added contact associations', [\n 'opportunity_id' => $opportunity->getId(),\n 'added_contact_crm_ids' => $contactsAdded,\n 'added_contacts_count' => count($contactsAdded),\n ]);\n }\n }\n}","role_description":"text entry area","is_enabled":true,"is_focused":true,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Execute","depth":4,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Explain Plan","depth":4,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Browse Query History","depth":4,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"View Parameters","depth":4,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Open Query Execution Settings…","depth":4,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"In-Editor Results","depth":4,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Tx: Auto","depth":4,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Cancel Running Statements","depth":4,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Playground","depth":4,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"jiminny","depth":4,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.088194445,"height":0.027777778},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"6","depth":4,"role_description":"text"},{"role":"AXStaticText","text":"1","depth":4,"role_description":"text"},{"role":"AXStaticText","text":"6","depth":4,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"# **************************** HS **************************************\n\nselect * from teams where id = 2; # 2\nselect * from features; # 2\nselect * from team_features where team_id = 2; # 2\nselect * from crm_configurations where id = 2; # 2\nselect * from users where team_id = 2; #\nselect * from playbooks where team_id = 2; # event 38\nselect * from playbook_categories where playbook_id = 38; #\n\nSELECT * FROM activities WHERE crm_configuration_id = 2 and crm_provider_id is not null order by id desc;\nhttps://app.hubspot.com/contacts/4392066/deal/16964514951/?engagement=96069102624\n https://app.staging.jiminny.com/playback/d5df34dc-bd66-4ff5-a7b3-8d3be30322a0\n\nSELECT * FROM activities WHERE uuid_to_bin('04fdcd0d-818f-4c53-92dc-6f18bc753ffd') = uuid;\n# 609126 softphone tr. 11241\n\nSELECT * FROM activities WHERE uuid_to_bin('6521bfcd-5a30-46e5-9f74-5440fd48befd') = uuid;\n# 608874 conference tr. 11226 crmId: 103422236596\n\nselect * from ai_prompts where transcription_id IN (11241, 11226);\nselect * from activity_summary_logs where activity_id = 608874;\n\nselect * from sidekick_settings;\nselect * from default_activity_types;\n\nselect * from crm_field_data where activity_id = 1223;\n\nselect * from crm_layouts where crm_configuration_id = 2;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id IN (554);\nselect * from crm_fields where crm_configuration_id = 11 and object_type = 'event';\nSELECT * FROM crm_field_values WHERE crm_field_id IN (1455,1450);\n\nSELECT * FROM crm_field_data WHERE crm_layout_entity_id = 971;\nSELECT * FROM crm_field_data WHERE crm_layout_entity_id IN (6494,6495,6496,6497,6498,6499);\n\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u\n on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 2 and sa.provider = 'hubspot';\n\nselect * from opportunities where team_id = 2\nand crm_provider_id IN ('51317301383');\n\nselect * from contacts where id = 85;\n\nselect * from opportunities where team_id = 2 order by id desc;\nselect * from opportunities where team_id = 2 and crm_provider_id = '51317301383'; # 5112\nselect * from opportunities where team_id = 2 and crm_provider_id = '55976759904'; # 5112\nselect * from opportunity_contacts where opportunity_id = 5117;\nselect * from crm_field_data where object_id = 1365;\nSELECT * FROM crm_fields WHERE id IN (1405, 1407, 1972, 2128);\n\nselect * from features;\nselect * from team_features where team_id IN (1);\nselect * from team_features where feature_id IN (36);\n\nSHOW CREATE TABLE opportunity_contacts;\nSELECT * FROM opportunity_contacts WHERE crm_provider_id = '111751';\n\n# $slug = 'HUBSPOT_WEBHOOK_SYNC';\n# $team = Jiminny\\Models\\Team::find(2);\n# $feature = Feature::query()->where('slug', $slug)->first();\n# TeamFeature::query()->create(['feature_id' => $feature->getId(),'team_id' => $team->getId()]);\n\n# hubspot_webhook_metrics\n\nselect * from opportunities where team_id = 2 and crm_provider_id IN ('374720564','14527423589','49908861993','50435771779'); # 1365\nSELECT * FROM opportunity_contacts WHERE opportunity_id = '414';\nSELECT * FROM opportunity_contacts WHERE crm_provider_id = '131501';\nselect * from contacts where id in (414, 464);\n\nselect * from activities where crm_configuration_id = 2;\n\nselect settings from crm_configurations where id = 11;\n\nselect * from teams; # 1, 2\nselect * from users;\nselect * from crm_configurations where id = 39;\nselect * from team_features where team_id = 2;\nselect * from features;\n# SELECT * FROM opportunities WHERE crm_configuration_id = 2\n# order by id desc;\n# and crm_provider_id = '49908861993';\n\n\nselect * from activity_providers where id IN (443, 202, 203, 227);\n\nselect * from activity_imports where id = 795889;\n\nselect c.id, c.provider, c.settings, t.* from teams t join crm_configurations c on t.id = c.team_id\nwhere c.provider = 'hubspot';\n\nselect * from crm_configurations crm JOIN teams t on crm.team_id = t.id\nwhere provider = 'hubspot';\nSELECT * FROM teams WHERE id = 31;\nSELECT * FROM users WHERE id = 257;\nSELECT * FROM opportunities WHERE team_id = 2;\n\nselect * from opportunity_contacts where opportunity_id = 5124;\nselect * from contacts where id IN (3850,3853,3851,4073,4140,4155,4480,4530,4623,5986,513,687,1806,1523,3613)\n\nselect * from activities where crm_configuration_id = 13;\n\nSELECT * FROM activities WHERE uuid_to_bin('826619ce-ec8e-4e59-8467-a01f5f6ad71e') = uuid; # 418141\n\n\nselect id, team_id, crm_provider_id from crm_configurations where provider = 'hubspot' and crm_provider_id IS NOT NULL;\nSELECT * FROM accounts WHERE team_id = 2 and crm_provider_id = '1212213464' order by id desc;\nSELECT * FROM contacts WHERE team_id = 2 and account_id = 5189 order by id desc;\nSELECT * FROM contacts WHERE team_id = 2 order by id desc;\nselect * from opportunity_contacts where contact_id = 6223;\nSELECT * FROM opportunities WHERE team_id = 2 and account_id = 5189 order by id desc;\n\nselect * from crm_profiles where crm_configuration_id = 2;\n\nselect * from activities where account_id = 46;","depth":4,"value":"# **************************** HS **************************************\n\nselect * from teams where id = 2; # 2\nselect * from features; # 2\nselect * from team_features where team_id = 2; # 2\nselect * from crm_configurations where id = 2; # 2\nselect * from users where team_id = 2; #\nselect * from playbooks where team_id = 2; # event 38\nselect * from playbook_categories where playbook_id = 38; #\n\nSELECT * FROM activities WHERE crm_configuration_id = 2 and crm_provider_id is not null order by id desc;\nhttps://app.hubspot.com/contacts/4392066/deal/16964514951/?engagement=96069102624\n https://app.staging.jiminny.com/playback/d5df34dc-bd66-4ff5-a7b3-8d3be30322a0\n\nSELECT * FROM activities WHERE uuid_to_bin('04fdcd0d-818f-4c53-92dc-6f18bc753ffd') = uuid;\n# 609126 softphone tr. 11241\n\nSELECT * FROM activities WHERE uuid_to_bin('6521bfcd-5a30-46e5-9f74-5440fd48befd') = uuid;\n# 608874 conference tr. 11226 crmId: 103422236596\n\nselect * from ai_prompts where transcription_id IN (11241, 11226);\nselect * from activity_summary_logs where activity_id = 608874;\n\nselect * from sidekick_settings;\nselect * from default_activity_types;\n\nselect * from crm_field_data where activity_id = 1223;\n\nselect * from crm_layouts where crm_configuration_id = 2;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id IN (554);\nselect * from crm_fields where crm_configuration_id = 11 and object_type = 'event';\nSELECT * FROM crm_field_values WHERE crm_field_id IN (1455,1450);\n\nSELECT * FROM crm_field_data WHERE crm_layout_entity_id = 971;\nSELECT * FROM crm_field_data WHERE crm_layout_entity_id IN (6494,6495,6496,6497,6498,6499);\n\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u\n on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 2 and sa.provider = 'hubspot';\n\nselect * from opportunities where team_id = 2\nand crm_provider_id IN ('51317301383');\n\nselect * from contacts where id = 85;\n\nselect * from opportunities where team_id = 2 order by id desc;\nselect * from opportunities where team_id = 2 and crm_provider_id = '51317301383'; # 5112\nselect * from opportunities where team_id = 2 and crm_provider_id = '55976759904'; # 5112\nselect * from opportunity_contacts where opportunity_id = 5117;\nselect * from crm_field_data where object_id = 1365;\nSELECT * FROM crm_fields WHERE id IN (1405, 1407, 1972, 2128);\n\nselect * from features;\nselect * from team_features where team_id IN (1);\nselect * from team_features where feature_id IN (36);\n\nSHOW CREATE TABLE opportunity_contacts;\nSELECT * FROM opportunity_contacts WHERE crm_provider_id = '111751';\n\n# $slug = 'HUBSPOT_WEBHOOK_SYNC';\n# $team = Jiminny\\Models\\Team::find(2);\n# $feature = Feature::query()->where('slug', $slug)->first();\n# TeamFeature::query()->create(['feature_id' => $feature->getId(),'team_id' => $team->getId()]);\n\n# hubspot_webhook_metrics\n\nselect * from opportunities where team_id = 2 and crm_provider_id IN ('374720564','14527423589','49908861993','50435771779'); # 1365\nSELECT * FROM opportunity_contacts WHERE opportunity_id = '414';\nSELECT * FROM opportunity_contacts WHERE crm_provider_id = '131501';\nselect * from contacts where id in (414, 464);\n\nselect * from activities where crm_configuration_id = 2;\n\nselect settings from crm_configurations where id = 11;\n\nselect * from teams; # 1, 2\nselect * from users;\nselect * from crm_configurations where id = 39;\nselect * from team_features where team_id = 2;\nselect * from features;\n# SELECT * FROM opportunities WHERE crm_configuration_id = 2\n# order by id desc;\n# and crm_provider_id = '49908861993';\n\n\nselect * from activity_providers where id IN (443, 202, 203, 227);\n\nselect * from activity_imports where id = 795889;\n\nselect c.id, c.provider, c.settings, t.* from teams t join crm_configurations c on t.id = c.team_id\nwhere c.provider = 'hubspot';\n\nselect * from crm_configurations crm JOIN teams t on crm.team_id = t.id\nwhere provider = 'hubspot';\nSELECT * FROM teams WHERE id = 31;\nSELECT * FROM users WHERE id = 257;\nSELECT * FROM opportunities WHERE team_id = 2;\n\nselect * from opportunity_contacts where opportunity_id = 5124;\nselect * from contacts where id IN (3850,3853,3851,4073,4140,4155,4480,4530,4623,5986,513,687,1806,1523,3613)\n\nselect * from activities where crm_configuration_id = 13;\n\nSELECT * FROM activities WHERE uuid_to_bin('826619ce-ec8e-4e59-8467-a01f5f6ad71e') = uuid; # 418141\n\n\nselect id, team_id, crm_provider_id from crm_configurations where provider = 'hubspot' and crm_provider_id IS NOT NULL;\nSELECT * FROM accounts WHERE team_id = 2 and crm_provider_id = '1212213464' order by id desc;\nSELECT * FROM contacts WHERE team_id = 2 and account_id = 5189 order by id desc;\nSELECT * FROM contacts WHERE team_id = 2 order by id desc;\nselect * from opportunity_contacts where contact_id = 6223;\nSELECT * FROM opportunities WHERE team_id = 2 and account_id = 5189 order by id desc;\n\nselect * from crm_profiles where crm_configuration_id = 2;\n\nselect * from activities where account_id = 46;","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Project","depth":3,"role_description":"text"},{"role":"AXButton","text":"Project","depth":3,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"New File or Directory…","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Expand Selected","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Collapse All","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Options","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
-7827763017813047052
|
1048134296968532324
|
click
|
accessibility
|
NULL
|
Project: faVsco.js, menu
#11976 on JY-20553-debug- Project: faVsco.js, menu
#11976 on JY-20553-debug-crm-sync-delays, menu
Start Listening for PHP Debug Connections
RequestGenerateAskJiminnyReportJobTest
Run 'RequestGenerateAskJiminnyReportJobTest'
Debug 'RequestGenerateAskJiminnyReportJobTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Code changed:
Hide
Sync Changes
Hide This Notification
33
2
19
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Services\Crm\Hubspot\ServiceTraits;
use Carbon\Carbon;
use HubSpot\Client\Crm\Deals\Model\CollectionResponseAssociatedId;
use Jiminny\Exceptions\InvalidArgumentException;
use Jiminny\Models\Account;
use Exception;
use Jiminny\Component\DealInsights\Forecast\Forecast;
use Jiminny\Jobs\Crm\MatchActivitiesToNewOpportunity;
use Jiminny\Models\Contact;
use Jiminny\Models\Crm\BusinessProcess;
use Jiminny\Exceptions\CrmException;
use Jiminny\Models\Opportunity;
use Illuminate\Support\Collection;
use Jiminny\Models\Stage;
use Jiminny\Repositories\Crm\CrmEntityRepository;
use Jiminny\Services\Crm\Hubspot\DealFieldsService;
use Jiminny\Services\Crm\Hubspot\OpportunitySyncStrategy\HubspotSingleSyncStrategy;
use Jiminny\Services\Crm\Hubspot\WebhookSyncBatchProcessor;
use Jiminny\Services\Crm\OpportunitySyncStrategyResolver;
use Jiminny\Utils\CurrencyFormatter;
/**
* Optimized sync methods for better performance
* These methods can be integrated into SyncCrmEntitiesTrait for significant performance gains
*/
trait OpportunitySyncTrait
{
private const int BATCH_SIZE = 100;
private const int BATCH_PROCESS_SIZE = 800;
protected OpportunitySyncStrategyResolver $opportunitySyncStrategyResolver;
protected CrmEntityRepository $crmEntityRepository;
protected DealFieldsService $dealFieldsService;
private ?array $cachedClosedDealStages = null;
private array $cachedBusinessProcesses = [];
private array $cachedStages = [];
public function syncOpportunities(array $parameters, ?string $strategy = null): int
{
$startTime = microtime(true);
$strategies = $this->opportunitySyncStrategyResolver->getStrategies($this->config, $strategy);
$parameters['config'] = $this->config;
$syncCount = 0;
$reportedTotal = 0;
$lastSyncedId = [];
$strategyNames = [];
try {
foreach ($strategies as $strategyName => $syncStrategy) {
$strategyNames[] = $strategyName;
$this->logger->info(
'[' . $this->getDisplayName() . '] Syncing opportunities using strategy: ' . $strategyName,
['team' => $this->team->getId()]
);
$total = 0;
$lastId = null;
$buffer = [];
// HubspotWebhookBatchSyncStrategy returns empty generator, this is for other strategies
foreach ($syncStrategy->fetchOpportunities($parameters, $total, $lastId) as $hsOpportunity) {
$buffer[] = $hsOpportunity;
// process every 800 rows (fits < 1 000 association limit)
if (\count($buffer) >= self::BATCH_PROCESS_SIZE) {
$syncCount += $this->processOpportunityBatch($buffer);
$buffer = [];
}
}
// leftovers
if ($buffer) {
$syncCount += $this->processOpportunityBatch($buffer);
}
$reportedTotal += $total;
$lastSyncedId = $lastId;
}
} catch (\HubSpot\Client\Crm\Deals\ApiException | CrmException $e) {
$this->handleSyncException($e, $parameters);
}
$durationMs = round((microtime(true) - $startTime) * 1000, 2);
$this->logger->info(
'[HubSpot] Synced opportunities',
[
'team' => $this->team->getId(),
'strategies' => implode(',', $strategyNames),
'sync_count' => $syncCount,
'total' => $reportedTotal,
'last_synced_id' => $lastSyncedId,
'duration_ms' => $durationMs,
]
);
return $reportedTotal;
}
private function handleSyncException(\Throwable $e, array $parameters): void
{
if (($parameters['since'] ?? null) instanceof Carbon) {
$parameters['since'] = $parameters['since']->toDateTimeString();
}
$parameters['config'] = $this->config->getId();
$this->logger->warning('[' . $this->getDisplayName() . '] Sync opportunities failed', [
'teamId' => $this->team->getUuid(),
'parameters' => $parameters,
'reason' => $e->getMessage(),
]);
}
/**
* @inheritdoc
*/
public function syncOpportunity(string $crmId): ?Opportunity
{
$strategy = $this->opportunitySyncStrategyResolver->resolve(
$this->config,
OpportunitySyncStrategyResolver::SINGLE_SYNC_OPPORTUNITY_STRATEGY,
);
$parameters = [
'config' => $this->config,
'crm_id' => $crmId,
];
try {
if (! $strategy instanceof HubspotSingleSyncStrategy) {
throw new InvalidArgumentException('Strategy must by HubspotSingleSyncStrategy');
}
$hsOpportunity = $strategy->fetchOpportunity($parameters);
} catch (\HubSpot\Client\Crm\Deals\ApiException $e) {
$this->logger->info('[' . $this->getDisplayName() . '] Opportunity not found', [
'teamId' => $this->team->getUuid(),
'crmId' => $crmId,
'reason' => $e->getMessage(),
]);
return null;
}
$hsOpportunity['associations'] = $this->convertDealAssociations($hsOpportunity['associations'] ?? []);
return $this->importOrUpdateOpportunity($hsOpportunity);
}
/**
* Process webhook-collected opportunity batches.
*
* Drains Redis sets containing company CRM IDs collected from webhook events
* and dispatches ImportOpportunityBatch jobs for batch processing.
*
* @return int Number of opportunity IDs dispatched to jobs
*/
public function batchSyncOpportunities(): int
{
$configId = $this->team->getCrmConfiguration()->getId();
return $this->batchProcessor->processBatchesForObjectType(
WebhookSyncBatchProcessor::OBJECT_TYPE_DEAL,
$configId
);
}
/**
* Import a batch of opportunities by their CRM IDs.
* Fetches opportunity data from HubSpot API and delegates to importOpportunityBatch().
*
* @param array<string> $crmIds HubSpot deal CRM IDs
*
* @return array{success: array, failed_ids: array, errors?: array<string, string>}
*/
public function importOpportunityBatchByIds(array $crmIds): array
{
$fields = $this->dealFieldsService->getFieldsForConfiguration($this->config);
$allDeals = [];
foreach (array_chunk($crmIds, self::BATCH_SIZE) as $chunk) {
$deals = $this->client->getOpportunitiesByIds($chunk, $fields);
foreach ($deals as $deal) {
$allDeals[] = $deal;
}
}
// IDs not returned by HubSpot are likely deleted or inaccessible deals.
// These are not failures — retrying won't bring them back.
$fetchedIds = array_map('strval', array_column($allDeals, 'id'));
$notFoundIds = array_values(array_diff(array_map('strval', $crmIds), $fetchedIds));
if (! empty($notFoundIds)) {
$this->logger->info('[' . $this->getDisplayName() . '] CRM IDs not found in HubSpot (likely deleted)', [
'teamId' => $this->team->getId(),
'notFoundCount' => \count($notFoundIds),
'notFoundIds' => $notFoundIds,
'requestedCount' => \count($crmIds),
'fetchedCount' => \count($allDeals),
]);
}
if (empty($allDeals)) {
return ['success' => [], 'failed_ids' => []];
}
return $this->importOpportunityBatch($allDeals);
}
private function getClosedDealStages(): array
{
if ($this->cachedClosedDealStages !== null) {
return $this->cachedClosedDealStages;
}
$stages = $this->crmEntityRepository->getOpportunityClosedStages($this->config);
$data = [
'lost' => [],
'won' => [],
];
foreach ($stages as $stage) {
if ($stage->probability == 0.00) {
$data['lost'][] = $stage->crm_provider_id;
}
if ($stage->probability == 100.00) {
$data['won'][] = $stage->crm_provider_id;
}
}
$this->cachedClosedDealStages = $data;
return $data;
}
/**
* Import deals into the database with pre-fetched associations.
*
* API calls here (getAssociationsData, getExistingOpportunityCrmIds) are NOT
* caught — if they throw, the exception propagates to ImportOpportunityBatch::handle()
* where Laravel retries the whole job with backoff. After all retries exhausted,
* failed() requeues all IDs to Redis.
*
* The per-deal loop catches exceptions individually. A deal can end up in three states:
* - success: imported/updated successfully
* - failed_ids: exception thrown (DB constraint violation, corrupt data, etc.)
* These are permanent issues — retrying won't fix them.
* - skipped (null): missing dependencies (no account, unknown pipeline/stage).
* This is acceptable — the deal cannot be imported until those exist.
*/
private function importOpportunityBatch(array $deals): array
{
$syncedOpportunities = [
'success' => [],
'failed_ids' => [],
];
$dealIds = array_column($deals, 'id');
// Shared association/existing-ID preparation is batch-level state. If it fails, rethrow so the
// queue job retries the whole batch and eventually requeues all deal IDs back to Redis.
try {
$companyAssociations = $this->client->getAssociationsData($dealIds, 'deals', 'companies');
$contactAssociations = $this->client->getAssociationsData($dealIds, 'deals', 'contacts');
$associationsData = $this->prepareAssociatedEntities($companyAssociations, $contactAssociations);
$existingCrmIds = $this->crmEntityRepository->getExistingOpportunityCrmIds(
$this->config,
array_map('strval', $dealIds)
);
$existingCrmIdSet = array_flip($existingCrmIds);
} catch (\Throwable $e) {
$this->logger->error('[' . $this->getDisplayName() . '] Failed to fetch associations or existing IDs', [
'teamId' => $this->team->getId(),
'dealCount' => count($dealIds),
'error' => $e->getMessage(),
]);
throw $e;
}
foreach ($deals as $deal) {
try {
$deal['associations'] = $this->prepareAssociationsForOpportunity(
$deal['id'],
$companyAssociations,
$contactAssociations,
$associationsData
);
$syncedOpportunity = $this->importOrUpdateOpportunity(
$deal,
isset($existingCrmIdSet[(string) $deal['id']])
);
if ($syncedOpportunity) {
$syncedOpportunities['success'][] = $syncedOpportunity;
}
} catch (\Throwable $e) {
$this->logger->warning('[' . $this->getDisplayName() . '] Failed to import opportunity', [
'teamId' => $this->team->getId(),
'crmId' => $deal['id'],
'error' => $e->getMessage(),
]);
$syncedOpportunities['failed_ids'][] = $deal['id'];
$syncedOpportunities['errors'][$deal['id']] = $e->getMessage();
}
}
return $syncedOpportunities;
}
/**
* Prepare associated entities for opportunities with optimized batch processing
* Returns structured data with CRM ID to DB ID mappings for each opportunity
*/
private function prepareAssociatedEntities(array $companyAssociations, array $contactAssociations): array
{
// Step 1: Collect all unique company and contact IDs from associations
$allCompanyIds = $this->flattenAssociationIds($companyAssociations);
$allContactIds = $this->flattenAssociationIds($contactAssociations);
// Step 2: Batch sync missing entities and get CRM ID to DB ID mappings
$companyIdMappings = [];
$contactIdMappings = [];
if (! empty($allCompanyIds)) {
$companyIdMappings = $this->prepareAssociatedAccounts($allCompanyIds);
}
if (! empty($allContactIds)) {
$contactIdMappings = $this->prepareAssociatedContacts($allContactIds);
}
return [
'company_id_mappings' => $companyIdMappings,
'contact_id_mappings' => $contactIdMappings,
];
}
/**
* Flatten association data to get unique IDs
*/
private function flattenAssociationIds(array $associations): array
{
$ids = [];
foreach ($associations as $dealAssociations) {
if (is_array($dealAssociations)) {
foreach ($dealAssociations as $id) {
$ids[$id] = true;
}
}
}
return array_keys($ids);
}
/**
* Batch sync missing accounts
*/
private function prepareAssociatedAccounts(array $companyIds): array
{
// Find which accounts already exist
$existingAccounts = $this->crmEntityRepository
->findAccountsByExternalIds($this->config, $companyIds);
$existingCompanyIds = $existingAccounts->pluck('crm_provider_id')->toArray();
$existingAccountsData = $existingAccounts->mapWithKeys(function ($account) {
return [$account->getCrmProviderId() => $account->getId()];
})->toArray();
$missingCompanyIds = array_diff($companyIds, $existingCompanyIds);
if (empty($missingCompanyIds)) {
return $existingAccountsData;
}
$this->logger->info('[' . $this->getDisplayName() . '] Batch syncing missing accounts', [
'teamId' => $this->team->getUuid(),
'total_companies' => count($companyIds),
'existing_companies' => count($existingCompanyIds),
'missing_companies' => count($missingCompanyIds),
]);
// we already have limit on opportunity ids count
// Initialize variable before try block
$syncedAccountsData = [];
try {
$syncedAccountsData = $this->batchSyncCrmObjects('companies', $missingCompanyIds);
} catch (\Throwable $e) {
$this->logger->warning('[' . $this->getDisplayName() . '] Failed to sync missing accounts', [
'size' => count($missingCompanyIds),
'error' => $e->getMessage(),
]);
$syncedAccountsData = [];
}
return $existingAccountsData + $syncedAccountsData;
}
/**
* Prepare associated contacts - find existing and sync missing ones
* Returns mapping of CRM ID to DB ID
*/
private function prepareAssociatedContacts(array $contactIds): array
{
// Find which contacts already exist
$existingContacts = $this->crmEntityRepository
->findContactsByExternalIds($this->config, $contactIds);
$existingContactIds = $existingContacts->pluck('crm_provider_id')->toArray();
// Create mapping for existing contacts
$existingContactsData = $existingContacts->mapWithKeys(function ($contact) {
return [$contact->getCrmProviderId() => $contact->getId()];
})->toArray();
$missingContactIds = array_diff($contactIds, $existingContactIds);
if (empty($missingContactIds)) {
return $existingContactsData;
}
$this->logger->info('[' . $this->getDisplayName() . '] Batch syncing missing contacts', [
'teamId' => $this->team->getUuid(),
'total_contacts' => count($contactIds),
'existing_contacts' => count($existingContactIds),
'missing_contacts' => count($missingContactIds),
]);
// Sync missing contacts using batch API
try {
$syncedContactsData = $this->batchSyncCrmObjects('contacts', $missingContactIds);
} catch (\Throwable $e) {
$this->logger->warning('[' . $this->getDisplayName() . '] Failed to sync missing contacts', [
'size' => count($missingContactIds),
'error' => $e->getMessage(),
]);
$syncedContactsData = [];
}
return $existingContactsData + $syncedContactsData;
}
private function batchSyncCrmObjects(string $objectType, array $crmIds): array
{
$syncObjects = [];
$crmObjectIds = array_values($crmIds);
foreach (array_chunk($crmObjectIds, self::BATCH_SIZE) as $chunk) {
try {
$objects = $objectType === 'companies' ?
$this->client->getCompaniesByIds($chunk, $this->getCompanyFields()) :
$this->client->getContactsByIds($chunk, $this->getContactFields());
foreach ($objects as $objectId => $objectData) {
$this->importCrmObject($objectType, (string) $objectId, $objectData, $syncObjects);
}
$this->logger->info('[' . $this->getDisplayName() . '] Batch synced ' . $objectType, [
'requested_count' => count($chunk),
'synced_count' => count($objects),
]);
} catch (\Throwable $e) {
$this->logger->warning('[' . $this->getDisplayName() . '] Batch ' . $objectType . ' sync failed', [
'ids' => $chunk,
'error' => $e->getMessage(),
]);
}
}
return $syncObjects;
}
private function importCrmObject(string $objectType, string $objectId, mixed $objectData, array &$syncObjects): void
{
try {
$object = $objectType === 'companies' ?
$this->importAccount($objectData) :
$this->importContact($objectData);
if ($object) {
$syncObjects[$object->getCrmProviderId()] = $object->getId();
}
} catch (\Throwable $e) {
$this->logger->warning('[' . $this->getDisplayName() . '] Failed to import batch ' . $objectType, [
'id' => $objectId,
'error' => $e->getMessage(),
]);
}
}
/**
* Prepare associations for a single opportunity
*
* The return value is an array with the following structure:
* [
* 'companies' => [
* $companyCrmId => $companyId,
* ...
* ],
* 'contacts' => [
* $contactCrmId => $contactId,
* ...
* ],
* 'account_id' => $accountId,
* ]
*/
private function prepareAssociationsForOpportunity(
string $oppCrmId,
array $companyAssociations,
array $contactAssociations,
array $associationsData
): array {
$associations = [
'companies' => [],
'contacts' => [],
'account_id' => null, // Primary account for opportunity
];
$oppCompanyIds = $companyAssociations[$oppCrmId] ?? [];
foreach ($oppCompanyIds as $companyCrmId) {
if (isset($associationsData['company_id_mappings'][$companyCrmId])) {
$associations['companies'][$companyCrmId] = $associationsData['company_id_mappings'][$companyCrmId];
// Set primary account (first company becomes primary account)
if ($associations['account_id'] === null) {
$associations['account_id'] = $associationsData['company_id_mappings'][$companyCrmId];
}
}
}
$oppContactIds = $contactAssociations[$oppCrmId] ?? [];
foreach ($oppContactIds as $contactCrmId) {
if (isset($associationsData['contact_id_mappings'][$contactCrmId])) {
$associations['contacts'][$contactCrmId] = $associationsData['contact_id_mappings'][$contactCrmId];
}
}
return $associations;
}
/**
* Update only associations for an opportunity
*/
private function updateOpportunityAssociations(Opportunity $opportunity, array $associations): void
{
// Update contact associations
$this->importOpportunityContacts($opportunity, $associations['contacts']);
// Update company (account) associations
$this->updateOpportunityAccount($opportunity, $associations['account_id']);
}
/**
* Remove all contact associations from an opportunity
*/
private function removeAllOpportunityContacts(Opportunity $opportunity): void
{
$currentCount = (int) $opportunity->contacts()->count();
if ($currentCount > 0) {
$opportunity->contacts()->detach();
$this->logger->info('[' . $this->getDisplayName() . '] Removed all contact associations', [
'opportunity_id' => $opportunity->getId(),
'removed_count' => $currentCount,
]);
}
}
private function updateOpportunityAccount(Opportunity $opportunity, ?int $accountId): void
{
if ($accountId === null) {
// No account ID provided - keep current account
return;
}
$currentAccountId = $opportunity->getAccountId();
// Only update if account has changed
if ($currentAccountId !== $accountId) {
$opportunity->account_id = $accountId;
$opportunity->save();
$this->logger->info('[' . $this->getDisplayName() . '] Updated opportunity account association', [
'opportunity_id' => $opportunity->getId(),
'old_account_id' => $currentAccountId,
'new_account_id' => $accountId,
]);
}
}
/**
* Find existing opportunities by external IDs (OPTIMIZED VERSION)
* Uses batch query for better performance
*/
private function findExistingOpportunities(array $crmIds): Collection
{
return $this->crmEntityRepository
->findOpportunitiesByExternalIds($this->config, $crmIds);
}
private function processOpportunityBatch(array $opportunities): int
{
$syncedOpportunities = $this->importOpportunityBatch($opportunities);
return count($syncedOpportunities['success'] ?? []);
}
/**
* Convert single deal associations from HubSpot format to internal format
* Handles both HubSpot SDK objects and array formats
*
* @param array $opportunityAssociations Raw associations from HubSpot API or pre-processed
*
* @return array Processed associations with DB IDs
*/
private function convertDealAssociations(array $opportunityAssociations): array
{
$associations = $this->initializeAssociationsStructure();
if (empty($opportunityAssociations)) {
return $associations;
}
$associationIds = $this->extractAssociationIds($opportunityAssociations);
$this->processCompanyAssociations($associationIds, $associations);
$this->processContactAssociations($associationIds, $associations);
return $associations;
}
private function initializeAssociationsStructure(): array
{
return [
'companies' => [],
'contacts' => [],
'account_id' => null, // Primary account for opportunity
];
}
private function extractAssociationIds(array $opportunityAssociations): array
{
$associationIds = [];
foreach ($opportunityAssociations as $type => $associationData) {
if (! empty($associationData)) {
$associationIds[$type] = $this->convertSingleDealAssociations($associationData);
}
}
return $associationIds;
}
private function processCompanyAssociations(array $associationIds, array &$associations): void
{
if (empty($associationIds['companies'])) {
return;
}
$companyId = $associationIds['companies'][0];
$account = $this->findOrSyncAccount($companyId);
if ($account instanceof Account) {
$associations['companies'][$companyId] = $account->getId();
$associations['account_id'] = $account->getId();
}
}
private function processContactAssociations(array $associationIds, array &$associations): void
{
if (empty($associationIds['contacts'])) {
return;
}
foreach ($associationIds['contacts'] as $contactId) {
$contact = $this->findOrSyncContact($contactId);
if ($contact instanceof Contact) {
$associations['contacts'][$contactId] = $contact->getId();
}
}
}
private function findOrSyncAccount(string $companyId): ?Account
{
$account = $this->crmEntityRepository->findAccountByExternalId($this->config, $companyId);
if (! $account instanceof Account) {
$account = $this->syncAccount($companyId);
}
return $account;
}
private function findOrSyncContact(string $contactId): ?Contact
{
$contact = $this->crmEntityRepository->findContactByExternalId($this->config, $contactId);
if (! $contact instanceof Contact) {
$contact = $this->syncContact($contactId);
}
return $contact;
}
private function convertSingleDealAssociations($opportunityAssociations = null): array
{
$associationData = [];
if ($opportunityAssociations === null) {
return $associationData;
}
// Handle array input (from extractAssociationIds)
if (is_array($opportunityAssociations)) {
return $opportunityAssociations;
}
// Handle CollectionResponseAssociatedId object
if ($opportunityAssociations instanceof CollectionResponseAssociatedId) {
foreach ($opportunityAssociations->getResults() as $association) {
$associationData[] = $association->getId();
}
}
return $associationData;
}
private function importOrUpdateOpportunity($crmData, ?bool $exists = null): ?Opportunity
{
if (empty($crmData['properties'])) {
return null;
}
$crmId = (string) $crmData['id'];
$properties = $crmData['properties'];
$associations = $crmData['associations'] ?? [];
$opportunityExists = $exists ?? (bool) $this->crmEntityRepository->findOpportunityByExternalId(
$this->config,
$crmId
);
if ($opportunityExists) {
return $this->updateOpportunity($crmId, $properties, $associations);
}
return $this->createOpportunity($crmId, $properties, $associations);
}
/**
* Create new opportunity
*/
private function createOpportunity(string $crmId, array $properties, array $associations): ?Opportunity
{
$accountId = $this->resolveAccountId($associations);
if (! $accountId) {
return null;
}
$businessProcess = $this->resolveBusinessProcess($properties['pipeline'] ?? null);
if (! $businessProcess) {
return null;
}
$stage = $this->resolveStage($businessProcess, $properties['dealstage'] ?? null);
if (! $stage) {
return null;
}
$data = $this->buildOpportunityData($properties, $accountId, $businessProcess, $stage);
$attributes = [
'crm_configuration_id' => $this->config->getId(),
'crm_provider_id' => $crmId,
];
$values = array_merge($attributes, $data);
$opportunity = $this->crmEntityRepository->upsertOpportunity($attributes, $values);
$this->importExternalFieldData($properties, $opportunity->getId());
$this->importOpportunityContacts($opportunity, $associations['contacts']);
if ($opportunity->wasRecentlyCreated) {
MatchActivitiesToNewOpportunity::dispatch($opportunity->getId());
}
return $opportunity;
}
/**
* Update existing opportunity
*/
private function updateOpportunity(string $crmId, array $properties, array $associations): Opportunity
{
$accountId = $this->resolveAccountId($associations);
$businessProcess = $this->resolveBusinessProcess($properties['pipeline'] ?? null);
$stage = $businessProcess ? $this->resolveStage($businessProcess, $properties['dealstage'] ?? null) : null;
$data = $this->buildOpportunityData($properties, $accountId, $businessProcess, $stage);
$attributes = [
'crm_configuration_id' => $this->config->getId(),
'crm_provider_id' => $crmId,
];
$values = array_merge($attributes, $data);
$opportunity = $this->crmEntityRepository->upsertOpportunity($attributes, $values);
$this->importExternalFieldData($properties, $opportunity->getId());
$this->updateOpportunityAssociations($opportunity, $associations);
return $opportunity;
}
private function resolveAccountId(array $associations): ?int
{
if (! empty($associations['account_id'])) {
return $associations['account_id'];
}
if (empty($associations)) {
return null;
}
// Fallback: use first company as account (currently SDK returns one company)
foreach ($associations['companies'] as $accountId) {
return $accountId;
}
return null;
}
private function buildOpportunityData(
array $properties,
?int $accountId,
?BusinessProcess $businessProcess,
?Stage $stage
): array {
$ownerId = null;
$profile = null;
if (! empty($properties['hubspot_owner_id'])) {
$ownerId = $properties['hubspot_owner_id'];
$profile = $this->crmEntityRepository->findProfileByExternalId($this->config, (string) $ownerId);
}
$name = 'Unknown';
if (isset($properties['dealname'])) {
$name = mb_strimwidth($properties['dealname'], 0, 128);
}
$amount = $this->resolveAmount($properties);
$currency = $properties['deal_currency_code'] ?? null;
$closeDate = null;
if (! empty($properties['closedate'])) {
$closeDate = Carbon::parse($properties['closedate'])->format('Y-m-d');
}
$remotelyCreatedAt = null;
if (! empty($properties['createdate']) && strtotime($properties['createdate'])) {
$date = $this->parseCleanDatetime($properties['createdate']);
$remotelyCreatedAt = $date?->format('Y-m-d H:i:s');
}
$closedStages = $this->getClosedDealStages();
$isWon = in_array($properties['dealstage'], $closedStages['won']);
$isLost = in_array($properties['dealstage'], $closedStages['lost']);
$data = [
'team_id' => $this->team->getId(),
'user_id' => $profile ? $profile->user_id : null,
'owner_id' => $ownerId,
'name' => $name,
'value' => ! empty($amount) ? $amount : null,
'currency_code' => CurrencyFormatter::formatCode($currency),
'close_date' => $closeDate,
'is_closed' => $isWon || $isLost,
'is_won' => $isWon,
'remotely_created_at' => $remotelyCreatedAt,
'probability' => $this->resolveDealProbability($properties['hs_deal_stage_probability']),
'forecast_category' => $this->resolveForecastCategory($properties['hs_manual_forecast_category']),
];
if ($accountId) {
$data['account_id'] = $accountId;
}
if ($stage) {
$data['stage_id'] = $stage->id;
}
if ($businessProcess) {
$recordType = $this->crmEntityRepository->getBusinessProcessRecordType($businessProcess);
if ($recordType) {
$data['record_type_id'] = $recordType->id;
}
}
return $data;
}
private function resolveBusinessProcess(?string $pipelineId): ?BusinessProcess
{
if ($pipelineId === null) {
return null;
}
$cacheKey = $this->getBusinessProcessCacheKey($pipelineId);
if (isset($this->cachedBusinessProcesses[$cacheKey])) {
return $this->cachedBusinessProcesses[$cacheKey];
}
$businessProcess = $this->getBusinessProcess($pipelineId);
if (! $businessProcess instanceof BusinessProcess) {
$this->importStages();
$businessProcess = $this->getBusinessProcess($pipelineId);
}
if (! $businessProcess instanceof BusinessProcess) {
$this->logger->info(
'[HubSpot] Deal is not attached to a pipeline',
[
'pipeline' => $pipelineId]
);
}
$this->cachedBusinessProcesses[$cacheKey] = $businessProcess;
return $businessProcess;
}
private function getBusinessProcess(string $pipelineId): ?BusinessProcess
{
return $this->crmEntityRepository->findBusinessProcessesByExternalId($this->config, $pipelineId);
}
private function getBusinessProcessCacheKey(string $pipelineId): string
{
return $this->config->getId() . '_' . $pipelineId;
}
private function resolveStage(BusinessProcess $businessProcess, ?string $stageId): ?Stage
{
if (empty($stageId)) {
return null;
}
$cacheKey = $businessProcess->getId() . ':' . $stageId;
if (isset($this->cachedStages[$cacheKey])) {
return $this->cachedStages[$cacheKey];
}
$stage = $this->crmEntityRepository->getPipelineStageByConditions(
$businessProcess,
[
'crm_provider_id' => $stageId,
'type' => Stage::TYPE_OPPORTUNITY,
]
);
if ($stage === null) {
$this->importStages(null, $stageId);
}
if ($stage === null) {
$this->logger->info('[HubSpot] Stage does not exist => ' . $stageId);
}
$this->cachedStages[$cacheKey] = $stage;
return $stage;
}
private function resolveAmount(array $properties): ?string
{
$amount = null;
if (! empty($properties['amount'])) {
$amount = str_replace(',', '', $properties['amount']);
}
if ($this->config->hasDefaultCurrencyFieldSet()) {
$valueFieldName = $this->config->getDefaultCurrencyField()->getCrmProviderId();
$amount = $properties[$valueFieldName] ?? $amount;
}
return $amount;
}
private function parseCleanDatetime(string $datetime): ?Carbon
{
// Treat pre-1980 values as invalid
$minValidDate = Carbon::parse('1980-01-01 00:00:00');
try {
$date = Carbon::parse($datetime);
if ($minValidDate->gt($date)) {
return null;
}
return $date;
} catch (Exception) {
return null; // On parse error, treat as null
}
}
private function resolveDealProbability(?string $stageProbability): int
{
if ($stageProbability === null) {
return 0;
}
$probability = (float) $stageProbability;
return $probability > 1 ? 0 : (int) ($probability * 100);
}
private function resolveForecastCategory(?string $forecastCategory): string
{
if (! $forecastCategory) {
return Forecast::FORECAST_CATEGORY_UNCATEGORIZED;
}
$forecastCategory = str_replace('_', ' ', $forecastCategory);
return ucwords(strtolower($forecastCategory));
}
private function importExternalFieldData(array $properties, int $opportunityId): void
{
$crmFields = $this->getOpportunitySyncableFields();
$this->importOpportunityCrmFieldData($properties, $crmFields, $opportunityId);
}
private function importOpportunityContacts(Opportunity $opportunity, array $associations): void
{
// Handle empty or missing contact associations
if (empty($associations)) {
// Remove all existing contact associations if none provided
$this->removeAllOpportunityContacts($opportunity);
return;
}
// Use differential sync approach for better performance and accuracy
$this->syncOpportunityContactsDifferential($opportunity, $associations);
}
/**
* Sync opportunity contacts using differential approach
* This compares current vs new associations and only makes necessary changes
*/
private function syncOpportunityContactsDifferential(Opportunity $opportunity, array $contactAssociations): void
{
$currentContactCrmIds = $this->getCurrentContactCrmIds($opportunity);
$contactAssociationIds = array_keys($contactAssociations);
$contactsToAdd = array_diff($contactAssociationIds, $currentContactCrmIds);
$contactsToRemove = array_diff($currentContactCrmIds, $contactAssociationIds);
if (empty($contactsToAdd) && empty($contactsToRemove)) {
return;
}
$this->logContactAssociationChanges($opportunity, $currentContactCrmIds, $contactAssociations, $contactsToAdd, $contactsToRemove);
$this->removeContactAssociations($opportunity, $contactsToRemove);
$this->addContactAssociations($opportunity, $contactsToAdd, $contactAssociations);
}
private function getCurrentContactCrmIds(Opportunity $opportunity): array
{
return $opportunity->contacts()
->pluck('contacts.crm_provider_id')
->toArray();
}
private function logContactAssociationChanges(
Opportunity $opportunity,
array $currentContactCrmIds,
array $contactAssociations,
array $contactsToAdd,
array $contactsToRemove
): void {
$this->logger->info('[' . $this->getDisplayName() . '] Contact association changes', [
'opportunity_id' => $opportunity->getId(),
'current_contacts' => $currentContactCrmIds,
'new_contacts' => $contactAssociations,
'contacts_to_add' => $contactsToAdd,
'contacts_to_remove' => $contactsToRemove,
]);
}
private function removeContactAssociations(Opportunity $opportunity, array $contactsToRemove): void
{
if (empty($contactsToRemove)) {
return;
}
$contactsToDetach = $opportunity->contacts()
->whereIn('contacts.crm_provider_id', $contactsToRemove)
->pluck('contacts.id')
->toArray();
if (! empty($contactsToDetach)) {
$opportunity->contacts()->detach($contactsToDetach);
$this->logger->info('[' . $this->getDisplayName() . '] Removed contact associations', [
'opportunity_id' => $opportunity->getId(),
'removed_contact_crm_ids' => $contactsToRemove,
'removed_contact_count' => count($contactsToDetach),
]);
}
}
private function addContactAssociations(Opportunity $opportunity, array $contactsToAdd, array $contactAssociations): void
{
if (empty($contactsToAdd)) {
return;
}
$contactsAdded = [];
foreach ($contactsToAdd as $crmId) {
$id = $contactAssociations[$crmId];
if ($this->attachSingleContact($opportunity, (string) $crmId, $id)) {
$contactsAdded[] = $crmId;
}
}
$this->logAddedContacts($opportunity, $contactsAdded);
}
private function attachSingleContact(Opportunity $opportunity, string $crmId, int $id): bool
{
try {
$contact = $this->crmEntityRepository->findContactByConfigurationAndId($this->config, $id);
if (! $contact) {
return false;
}
return $this->performContactAttachment($opportunity, $contact, $crmId);
} catch (\Throwable $e) {
$this->logger->warning('[' . $this->getDisplayName() . '] Failed to add contact association', [
'opportunity_id' => $opportunity->getId(),
'contact_crm_id' => $crmId,
'error' => $e->getMessage(),
]);
return false;
}
}
private function performContactAttachment(Opportunity $opportunity, Contact $contact, string $crmId): bool
{
try {
$opportunity->contacts()->attach($contact->getId(), [
'crm_provider_id' => $crmId,
]);
return true;
} catch (\Illuminate\Database\QueryException $e) {
if (str_contains($e->getMessage(), 'Duplicate entry')) {
$this->logger->info('[' . $this->getDisplayName() . '] Contact association already exists', [
'contact_id' => $contact->getId(),
'contact_crm_id' => $crmId,
'opportunity_id' => $opportunity->getId(),
]);
return false;
}
throw $e;
}
}
private function logAddedContacts(Opportunity $opportunity, array $contactsAdded): void
{
if (! empty($contactsAdded)) {
$this->logger->info('[' . $this->getDisplayName() . '] Added contact associations', [
'opportunity_id' => $opportunity->getId(),
'added_contact_crm_ids' => $contactsAdded,
'added_contacts_count' => count($contactsAdded),
]);
}
}
}
Execute
Explain Plan
Browse Query History
View Parameters
Open Query Execution Settings…
In-Editor Results
Tx: Auto
Cancel Running Statements
Playground
jiminny
Code changed:
Hide
Sync Changes
Hide This Notification
6
1
6
Previous Highlighted Error
Next Highlighted Error
# [PASSWORD_DOTS] HS [PASSWORD_DOTS]
select * from teams where id = 2; # 2
select * from features; # 2
select * from team_features where team_id = 2; # 2
select * from crm_configurations where id = 2; # 2
select * from users where team_id = 2; #
select * from playbooks where team_id = 2; # event 38
select * from playbook_categories where playbook_id = 38; #
SELECT * FROM activities WHERE crm_configuration_id = 2 and crm_provider_id is not null order by id desc;
https://app.hubspot.com/contacts/4392066/deal/16964514951/?engagement=96069102624
https://app.staging.jiminny.com/playback/d5df34dc-bd66-4ff5-a7b3-8d3be30322a0
SELECT * FROM activities WHERE uuid_to_bin('04fdcd0d-818f-4c53-92dc-6f18bc753ffd') = uuid;
# 609126 softphone tr. 11241
SELECT * FROM activities WHERE uuid_to_bin('6521bfcd-5a30-46e5-9f74-5440fd48befd') = uuid;
# 608874 conference tr. 11226 crmId: 103422236596
select * from ai_prompts where transcription_id IN (11241, 11226);
select * from activity_summary_logs where activity_id = 608874;
select * from sidekick_settings;
select * from default_activity_types;
select * from crm_field_data where activity_id = 1223;
select * from crm_layouts where crm_configuration_id = 2;
SELECT * FROM crm_layout_entities WHERE crm_layout_id IN (554);
select * from crm_fields where crm_configuration_id = 11 and object_type = 'event';
SELECT * FROM crm_field_values WHERE crm_field_id IN (1455,1450);
SELECT * FROM crm_field_data WHERE crm_layout_entity_id = 971;
SELECT * FROM crm_field_data WHERE crm_layout_entity_id IN (6494,6495,6496,6497,6498,6499);
SELECT
CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,
u.email,
sa.*,
t.owner_id FROM social_accounts sa
JOIN users u
on u.id = sa.sociable_id
JOIN teams t on t.id = u.team_id
WHERE u.team_id = 2 and sa.provider = 'hubspot';
select * from opportunities where team_id = 2
and crm_provider_id IN ('51317301383');
select * from contacts where id = 85;
select * from opportunities where team_id = 2 order by id desc;
select * from opportunities where team_id = 2 and crm_provider_id = '51317301383'; # 5112
select * from opportunities where team_id = 2 and crm_provider_id = '55976759904'; # 5112
select * from opportunity_contacts where opportunity_id = 5117;
select * from crm_field_data where object_id = 1365;
SELECT * FROM crm_fields WHERE id IN (1405, 1407, 1972, 2128);
select * from features;
select * from team_features where team_id IN (1);
select * from team_features where feature_id IN (36);
SHOW CREATE TABLE opportunity_contacts;
SELECT * FROM opportunity_contacts WHERE crm_provider_id = '111751';
# $slug = 'HUBSPOT_WEBHOOK_SYNC';
# $team = Jiminny\Models\Team::find(2);
# $feature = Feature::query()->where('slug', $slug)->first();
# TeamFeature::query()->create(['feature_id' => $feature->getId(),'team_id' => $team->getId()]);
# hubspot_webhook_metrics
select * from opportunities where team_id = 2 and crm_provider_id IN ('374720564','14527423589','49908861993','50435771779'); # 1365
SELECT * FROM opportunity_contacts WHERE opportunity_id = '414';
SELECT * FROM opportunity_contacts WHERE crm_provider_id = '131501';
select * from contacts where id in (414, 464);
select * from activities where crm_configuration_id = 2;
select settings from crm_configurations where id = 11;
select * from teams; # 1, 2
select * from users;
select * from crm_configurations where id = 39;
select * from team_features where team_id = 2;
select * from features;
# SELECT * FROM opportunities WHERE crm_configuration_id = 2
# order by id desc;
# and crm_provider_id = '49908861993';
select * from activity_providers where id IN (443, 202, 203, 227);
select * from activity_imports where id = 795889;
select c.id, c.provider, c.settings, t.* from teams t join crm_configurations c on t.id = c.team_id
where c.provider = 'hubspot';
select * from crm_configurations crm JOIN teams t on crm.team_id = t.id
where provider = 'hubspot';
SELECT * FROM teams WHERE id = 31;
SELECT * FROM users WHERE id = 257;
SELECT * FROM opportunities WHERE team_id = 2;
select * from opportunity_contacts where opportunity_id = 5124;
select * from contacts where id IN (3850,3853,3851,4073,4140,4155,4480,4530,4623,5986,513,687,1806,1523,3613)
select * from activities where crm_configuration_id = 13;
SELECT * FROM activities WHERE uuid_to_bin('826619ce-ec8e-4e59-8467-a01f5f6ad71e') = uuid; # 418141
select id, team_id, crm_provider_id from crm_configurations where provider = 'hubspot' and crm_provider_id IS NOT NULL;
SELECT * FROM accounts WHERE team_id = 2 and crm_provider_id = '1212213464' order by id desc;
SELECT * FROM contacts WHERE team_id = 2 and account_id = 5189 order by id desc;
SELECT * FROM contacts WHERE team_id = 2 order by id desc;
select * from opportunity_contacts where contact_id = 6223;
SELECT * FROM opportunities WHERE team_id = 2 and account_id = 5189 order by id desc;
select * from crm_profiles where crm_configuration_id = 2;
select * from activities where account_id = 46;
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide...
|
NULL
|
|
55533
|
NULL
|
0
|
2026-04-20T09:53:20.980246+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-20/1776 /Users/lukas/.screenpipe/data/data/2026-04-20/1776678800980_m2.jpg...
|
PhpStorm
|
faVsco.js – OpportunitySyncTrait.php
|
True
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
#11976 on JY-20553-debug- Project: faVsco.js, menu
#11976 on JY-20553-debug-crm-sync-delays, menu
Start Listening for PHP Debug Connections
RequestGenerateAskJiminnyReportJobTest
Run 'RequestGenerateAskJiminnyReportJobTest'
Debug 'RequestGenerateAskJiminnyReportJobTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Code changed:
Hide
Sync Changes
Hide This Notification
33
2
19
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Services\Crm\Hubspot\ServiceTraits;
use Carbon\Carbon;
use HubSpot\Client\Crm\Deals\Model\CollectionResponseAssociatedId;
use Jiminny\Exceptions\InvalidArgumentException;
use Jiminny\Models\Account;
use Exception;
use Jiminny\Component\DealInsights\Forecast\Forecast;
use Jiminny\Jobs\Crm\MatchActivitiesToNewOpportunity;
use Jiminny\Models\Contact;
use Jiminny\Models\Crm\BusinessProcess;
use Jiminny\Exceptions\CrmException;
use Jiminny\Models\Opportunity;
use Illuminate\Support\Collection;
use Jiminny\Models\Stage;
use Jiminny\Repositories\Crm\CrmEntityRepository;
use Jiminny\Services\Crm\Hubspot\DealFieldsService;
use Jiminny\Services\Crm\Hubspot\OpportunitySyncStrategy\HubspotSingleSyncStrategy;
use Jiminny\Services\Crm\Hubspot\WebhookSyncBatchProcessor;
use Jiminny\Services\Crm\OpportunitySyncStrategyResolver;
use Jiminny\Utils\CurrencyFormatter;
/**
* Optimized sync methods for better performance
* These methods can be integrated into SyncCrmEntitiesTrait for significant performance gains
*/
trait OpportunitySyncTrait
{
private const int BATCH_SIZE = 100;
private const int BATCH_PROCESS_SIZE = 800;
protected OpportunitySyncStrategyResolver $opportunitySyncStrategyResolver;
protected CrmEntityRepository $crmEntityRepository;
protected DealFieldsService $dealFieldsService;
private ?array $cachedClosedDealStages = null;
private array $cachedBusinessProcesses = [];
private array $cachedStages = [];
public function syncOpportunities(array $parameters, ?string $strategy = null): int
{
$startTime = microtime(true);
$strategies = $this->opportunitySyncStrategyResolver->getStrategies($this->config, $strategy);
$parameters['config'] = $this->config;
$syncCount = 0;
$reportedTotal = 0;
$lastSyncedId = [];
$strategyNames = [];
try {
foreach ($strategies as $strategyName => $syncStrategy) {
$strategyNames[] = $strategyName;
$this->logger->info(
'[' . $this->getDisplayName() . '] Syncing opportunities using strategy: ' . $strategyName,
['team' => $this->team->getId()]
);
$total = 0;
$lastId = null;
$buffer = [];
// HubspotWebhookBatchSyncStrategy returns empty generator, this is for other strategies
foreach ($syncStrategy->fetchOpportunities($parameters, $total, $lastId) as $hsOpportunity) {
$buffer[] = $hsOpportunity;
// process every 800 rows (fits < 1 000 association limit)
if (\count($buffer) >= self::BATCH_PROCESS_SIZE) {
$syncCount += $this->processOpportunityBatch($buffer);
$buffer = [];
}
}
// leftovers
if ($buffer) {
$syncCount += $this->processOpportunityBatch($buffer);
}
$reportedTotal += $total;
$lastSyncedId = $lastId;
}
} catch (\HubSpot\Client\Crm\Deals\ApiException | CrmException $e) {
$this->handleSyncException($e, $parameters);
}
$durationMs = round((microtime(true) - $startTime) * 1000, 2);
$this->logger->info(
'[HubSpot] Synced opportunities',
[
'team' => $this->team->getId(),
'strategies' => implode(',', $strategyNames),
'sync_count' => $syncCount,
'total' => $reportedTotal,
'last_synced_id' => $lastSyncedId,
'duration_ms' => $durationMs,
]
);
return $reportedTotal;
}
private function handleSyncException(\Throwable $e, array $parameters): void
{
if (($parameters['since'] ?? null) instanceof Carbon) {
$parameters['since'] = $parameters['since']->toDateTimeString();
}
$parameters['config'] = $this->config->getId();
$this->logger->warning('[' . $this->getDisplayName() . '] Sync opportunities failed', [
'teamId' => $this->team->getUuid(),
'parameters' => $parameters,
'reason' => $e->getMessage(),
]);
}
/**
* @inheritdoc
*/
public function syncOpportunity(string $crmId): ?Opportunity
{
$strategy = $this->opportunitySyncStrategyResolver->resolve(
$this->config,
OpportunitySyncStrategyResolver::SINGLE_SYNC_OPPORTUNITY_STRATEGY,
);
$parameters = [
'config' => $this->config,
'crm_id' => $crmId,
];
try {
if (! $strategy instanceof HubspotSingleSyncStrategy) {
throw new InvalidArgumentException('Strategy must by HubspotSingleSyncStrategy');
}
$hsOpportunity = $strategy->fetchOpportunity($parameters);
} catch (\HubSpot\Client\Crm\Deals\ApiException $e) {
$this->logger->info('[' . $this->getDisplayName() . '] Opportunity not found', [
'teamId' => $this->team->getUuid(),
'crmId' => $crmId,
'reason' => $e->getMessage(),
]);
return null;
}
$hsOpportunity['associations'] = $this->convertDealAssociations($hsOpportunity['associations'] ?? []);
return $this->importOrUpdateOpportunity($hsOpportunity);
}
/**
* Process webhook-collected opportunity batches.
*
* Drains Redis sets containing company CRM IDs collected from webhook events
* and dispatches ImportOpportunityBatch jobs for batch processing.
*
* @return int Number of opportunity IDs dispatched to jobs
*/
public function batchSyncOpportunities(): int
{
$configId = $this->team->getCrmConfiguration()->getId();
return $this->batchProcessor->processBatchesForObjectType(
WebhookSyncBatchProcessor::OBJECT_TYPE_DEAL,
$configId
);
}
/**
* Import a batch of opportunities by their CRM IDs.
* Fetches opportunity data from HubSpot API and delegates to importOpportunityBatch().
*
* @param array<string> $crmIds HubSpot deal CRM IDs
*
* @return array{success: array, failed_ids: array, errors?: array<string, string>}
*/
public function importOpportunityBatchByIds(array $crmIds): array
{
$fields = $this->dealFieldsService->getFieldsForConfiguration($this->config);
$allDeals = [];
foreach (array_chunk($crmIds, self::BATCH_SIZE) as $chunk) {
$deals = $this->client->getOpportunitiesByIds($chunk, $fields);
foreach ($deals as $deal) {
$allDeals[] = $deal;
}
}
// IDs not returned by HubSpot are likely deleted or inaccessible deals.
// These are not failures — retrying won't bring them back.
$fetchedIds = array_map('strval', array_column($allDeals, 'id'));
$notFoundIds = array_values(array_diff(array_map('strval', $crmIds), $fetchedIds));
if (! empty($notFoundIds)) {
$this->logger->info('[' . $this->getDisplayName() . '] CRM IDs not found in HubSpot (likely deleted)', [
'teamId' => $this->team->getId(),
'notFoundCount' => \count($notFoundIds),
'notFoundIds' => $notFoundIds,
'requestedCount' => \count($crmIds),
'fetchedCount' => \count($allDeals),
]);
}
if (empty($allDeals)) {
return ['success' => [], 'failed_ids' => []];
}
return $this->importOpportunityBatch($allDeals);
}
private function getClosedDealStages(): array
{
if ($this->cachedClosedDealStages !== null) {
return $this->cachedClosedDealStages;
}
$stages = $this->crmEntityRepository->getOpportunityClosedStages($this->config);
$data = [
'lost' => [],
'won' => [],
];
foreach ($stages as $stage) {
if ($stage->probability == 0.00) {
$data['lost'][] = $stage->crm_provider_id;
}
if ($stage->probability == 100.00) {
$data['won'][] = $stage->crm_provider_id;
}
}
$this->cachedClosedDealStages = $data;
return $data;
}
/**
* Import deals into the database with pre-fetched associations.
*
* API calls here (getAssociationsData, getExistingOpportunityCrmIds) are NOT
* caught — if they throw, the exception propagates to ImportOpportunityBatch::handle()
* where Laravel retries the whole job with backoff. After all retries exhausted,
* failed() requeues all IDs to Redis.
*
* The per-deal loop catches exceptions individually. A deal can end up in three states:
* - success: imported/updated successfully
* - failed_ids: exception thrown (DB constraint violation, corrupt data, etc.)
* These are permanent issues — retrying won't fix them.
* - skipped (null): missing dependencies (no account, unknown pipeline/stage).
* This is acceptable — the deal cannot be imported until those exist.
*/
private function importOpportunityBatch(array $deals): array
{
$syncedOpportunities = [
'success' => [],
'failed_ids' => [],
];
$dealIds = array_column($deals, 'id');
// Shared association/existing-ID preparation is batch-level state. If it fails, rethrow so the
// queue job retries the whole batch and eventually requeues all deal IDs back to Redis.
try {
$companyAssociations = $this->client->getAssociationsData($dealIds, 'deals', 'companies');
$contactAssociations = $this->client->getAssociationsData($dealIds, 'deals', 'contacts');
$associationsData = $this->prepareAssociatedEntities($companyAssociations, $contactAssociations);
$existingCrmIds = $this->crmEntityRepository->getExistingOpportunityCrmIds(
$this->config,
array_map('strval', $dealIds)
);
$existingCrmIdSet = array_flip($existingCrmIds);
} catch (\Throwable $e) {
$this->logger->error('[' . $this->getDisplayName() . '] Failed to fetch associations or existing IDs', [
'teamId' => $this->team->getId(),
'dealCount' => count($dealIds),
'error' => $e->getMessage(),
]);
throw $e;
}
foreach ($deals as $deal) {
try {
$deal['associations'] = $this->prepareAssociationsForOpportunity(
$deal['id'],
$companyAssociations,
$contactAssociations,
$associationsData
);
$syncedOpportunity = $this->importOrUpdateOpportunity(
$deal,
isset($existingCrmIdSet[(string) $deal['id']])
);
if ($syncedOpportunity) {
$syncedOpportunities['success'][] = $syncedOpportunity;
}
} catch (\Throwable $e) {
$this->logger->warning('[' . $this->getDisplayName() . '] Failed to import opportunity', [
'teamId' => $this->team->getId(),
'crmId' => $deal['id'],
'error' => $e->getMessage(),
]);
$syncedOpportunities['failed_ids'][] = $deal['id'];
$syncedOpportunities['errors'][$deal['id']] = $e->getMessage();
}
}
return $syncedOpportunities;
}
/**
* Prepare associated entities for opportunities with optimized batch processing
* Returns structured data with CRM ID to DB ID mappings for each opportunity
*/
private function prepareAssociatedEntities(array $companyAssociations, array $contactAssociations): array
{
// Step 1: Collect all unique company and contact IDs from associations
$allCompanyIds = $this->flattenAssociationIds($companyAssociations);
$allContactIds = $this->flattenAssociationIds($contactAssociations);
// Step 2: Batch sync missing entities and get CRM ID to DB ID mappings
$companyIdMappings = [];
$contactIdMappings = [];
if (! empty($allCompanyIds)) {
$companyIdMappings = $this->prepareAssociatedAccounts($allCompanyIds);
}
if (! empty($allContactIds)) {
$contactIdMappings = $this->prepareAssociatedContacts($allContactIds);
}
return [
'company_id_mappings' => $companyIdMappings,
'contact_id_mappings' => $contactIdMappings,
];
}
/**
* Flatten association data to get unique IDs
*/
private function flattenAssociationIds(array $associations): array
{
$ids = [];
foreach ($associations as $dealAssociations) {
if (is_array($dealAssociations)) {
foreach ($dealAssociations as $id) {
$ids[$id] = true;
}
}
}
return array_keys($ids);
}
/**
* Batch sync missing accounts
*/
private function prepareAssociatedAccounts(array $companyIds): array
{
// Find which accounts already exist
$existingAccounts = $this->crmEntityRepository
->findAccountsByExternalIds($this->config, $companyIds);
$existingCompanyIds = $existingAccounts->pluck('crm_provider_id')->toArray();
$existingAccountsData = $existingAccounts->mapWithKeys(function ($account) {
return [$account->getCrmProviderId() => $account->getId()];
})->toArray();
$missingCompanyIds = array_diff($companyIds, $existingCompanyIds);
if (empty($missingCompanyIds)) {
return $existingAccountsData;
}
$this->logger->info('[' . $this->getDisplayName() . '] Batch syncing missing accounts', [
'teamId' => $this->team->getUuid(),
'total_companies' => count($companyIds),
'existing_companies' => count($existingCompanyIds),
'missing_companies' => count($missingCompanyIds),
]);
// we already have limit on opportunity ids count
// Initialize variable before try block
$syncedAccountsData = [];
try {
$syncedAccountsData = $this->batchSyncCrmObjects('companies', $missingCompanyIds);
} catch (\Throwable $e) {
$this->logger->warning('[' . $this->getDisplayName() . '] Failed to sync missing accounts', [
'size' => count($missingCompanyIds),
'error' => $e->getMessage(),
]);
$syncedAccountsData = [];
}
return $existingAccountsData + $syncedAccountsData;
}
/**
* Prepare associated contacts - find existing and sync missing ones
* Returns mapping of CRM ID to DB ID
*/
private function prepareAssociatedContacts(array $contactIds): array
{
// Find which contacts already exist
$existingContacts = $this->crmEntityRepository
->findContactsByExternalIds($this->config, $contactIds);
$existingContactIds = $existingContacts->pluck('crm_provider_id')->toArray();
// Create mapping for existing contacts
$existingContactsData = $existingContacts->mapWithKeys(function ($contact) {
return [$contact->getCrmProviderId() => $contact->getId()];
})->toArray();
$missingContactIds = array_diff($contactIds, $existingContactIds);
if (empty($missingContactIds)) {
return $existingContactsData;
}
$this->logger->info('[' . $this->getDisplayName() . '] Batch syncing missing contacts', [
'teamId' => $this->team->getUuid(),
'total_contacts' => count($contactIds),
'existing_contacts' => count($existingContactIds),
'missing_contacts' => count($missingContactIds),
]);
// Sync missing contacts using batch API
try {
$syncedContactsData = $this->batchSyncCrmObjects('contacts', $missingContactIds);
} catch (\Throwable $e) {
$this->logger->warning('[' . $this->getDisplayName() . '] Failed to sync missing contacts', [
'size' => count($missingContactIds),
'error' => $e->getMessage(),
]);
$syncedContactsData = [];
}
return $existingContactsData + $syncedContactsData;
}
private function batchSyncCrmObjects(string $objectType, array $crmIds): array
{
$syncObjects = [];
$crmObjectIds = array_values($crmIds);
foreach (array_chunk($crmObjectIds, self::BATCH_SIZE) as $chunk) {
try {
$objects = $objectType === 'companies' ?
$this->client->getCompaniesByIds($chunk, $this->getCompanyFields()) :
$this->client->getContactsByIds($chunk, $this->getContactFields());
foreach ($objects as $objectId => $objectData) {
$this->importCrmObject($objectType, (string) $objectId, $objectData, $syncObjects);
}
$this->logger->info('[' . $this->getDisplayName() . '] Batch synced ' . $objectType, [
'requested_count' => count($chunk),
'synced_count' => count($objects),
]);
} catch (\Throwable $e) {
$this->logger->warning('[' . $this->getDisplayName() . '] Batch ' . $objectType . ' sync failed', [
'ids' => $chunk,
'error' => $e->getMessage(),
]);
}
}
return $syncObjects;
}
private function importCrmObject(string $objectType, string $objectId, mixed $objectData, array &$syncObjects): void
{
try {
$object = $objectType === 'companies' ?
$this->importAccount($objectData) :
$this->importContact($objectData);
if ($object) {
$syncObjects[$object->getCrmProviderId()] = $object->getId();
}
} catch (\Throwable $e) {
$this->logger->warning('[' . $this->getDisplayName() . '] Failed to import batch ' . $objectType, [
'id' => $objectId,
'error' => $e->getMessage(),
]);
}
}
/**
* Prepare associations for a single opportunity
*
* The return value is an array with the following structure:
* [
* 'companies' => [
* $companyCrmId => $companyId,
* ...
* ],
* 'contacts' => [
* $contactCrmId => $contactId,
* ...
* ],
* 'account_id' => $accountId,
* ]
*/
private function prepareAssociationsForOpportunity(
string $oppCrmId,
array $companyAssociations,
array $contactAssociations,
array $associationsData
): array {
$associations = [
'companies' => [],
'contacts' => [],
'account_id' => null, // Primary account for opportunity
];
$oppCompanyIds = $companyAssociations[$oppCrmId] ?? [];
foreach ($oppCompanyIds as $companyCrmId) {
if (isset($associationsData['company_id_mappings'][$companyCrmId])) {
$associations['companies'][$companyCrmId] = $associationsData['company_id_mappings'][$companyCrmId];
// Set primary account (first company becomes primary account)
if ($associations['account_id'] === null) {
$associations['account_id'] = $associationsData['company_id_mappings'][$companyCrmId];
}
}
}
$oppContactIds = $contactAssociations[$oppCrmId] ?? [];
foreach ($oppContactIds as $contactCrmId) {
if (isset($associationsData['contact_id_mappings'][$contactCrmId])) {
$associations['contacts'][$contactCrmId] = $associationsData['contact_id_mappings'][$contactCrmId];
}
}
return $associations;
}
/**
* Update only associations for an opportunity
*/
private function updateOpportunityAssociations(Opportunity $opportunity, array $associations): void
{
// Update contact associations
$this->importOpportunityContacts($opportunity, $associations['contacts']);
// Update company (account) associations
$this->updateOpportunityAccount($opportunity, $associations['account_id']);
}
/**
* Remove all contact associations from an opportunity
*/
private function removeAllOpportunityContacts(Opportunity $opportunity): void
{
$currentCount = (int) $opportunity->contacts()->count();
if ($currentCount > 0) {
$opportunity->contacts()->detach();
$this->logger->info('[' . $this->getDisplayName() . '] Removed all contact associations', [
'opportunity_id' => $opportunity->getId(),
'removed_count' => $currentCount,
]);
}
}
private function updateOpportunityAccount(Opportunity $opportunity, ?int $accountId): void
{
if ($accountId === null) {
// No account ID provided - keep current account
return;
}
$currentAccountId = $opportunity->getAccountId();
// Only update if account has changed
if ($currentAccountId !== $accountId) {
$opportunity->account_id = $accountId;
$opportunity->save();
$this->logger->info('[' . $this->getDisplayName() . '] Updated opportunity account association', [
'opportunity_id' => $opportunity->getId(),
'old_account_id' => $currentAccountId,
'new_account_id' => $accountId,
]);
}
}
/**
* Find existing opportunities by external IDs (OPTIMIZED VERSION)
* Uses batch query for better performance
*/
private function findExistingOpportunities(array $crmIds): Collection
{
return $this->crmEntityRepository
->findOpportunitiesByExternalIds($this->config, $crmIds);
}
private function processOpportunityBatch(array $opportunities): int
{
$syncedOpportunities = $this->importOpportunityBatch($opportunities);
return count($syncedOpportunities['success'] ?? []);
}
/**
* Convert single deal associations from HubSpot format to internal format
* Handles both HubSpot SDK objects and array formats
*
* @param array $opportunityAssociations Raw associations from HubSpot API or pre-processed
*
* @return array Processed associations with DB IDs
*/
private function convertDealAssociations(array $opportunityAssociations): array
{
$associations = $this->initializeAssociationsStructure();
if (empty($opportunityAssociations)) {
return $associations;
}
$associationIds = $this->extractAssociationIds($opportunityAssociations);
$this->processCompanyAssociations($associationIds, $associations);
$this->processContactAssociations($associationIds, $associations);
return $associations;
}
private function initializeAssociationsStructure(): array
{
return [
'companies' => [],
'contacts' => [],
'account_id' => null, // Primary account for opportunity
];
}
private function extractAssociationIds(array $opportunityAssociations): array
{
$associationIds = [];
foreach ($opportunityAssociations as $type => $associationData) {
if (! empty($associationData)) {
$associationIds[$type] = $this->convertSingleDealAssociations($associationData);
}
}
return $associationIds;
}
private function processCompanyAssociations(array $associationIds, array &$associations): void
{
if (empty($associationIds['companies'])) {
return;
}
$companyId = $associationIds['companies'][0];
$account = $this->findOrSyncAccount($companyId);
if ($account instanceof Account) {
$associations['companies'][$companyId] = $account->getId();
$associations['account_id'] = $account->getId();
}
}
private function processContactAssociations(array $associationIds, array &$associations): void
{
if (empty($associationIds['contacts'])) {
return;
}
foreach ($associationIds['contacts'] as $contactId) {
$contact = $this->findOrSyncContact($contactId);
if ($contact instanceof Contact) {
$associations['contacts'][$contactId] = $contact->getId();
}
}
}
private function findOrSyncAccount(string $companyId): ?Account
{
$account = $this->crmEntityRepository->findAccountByExternalId($this->config, $companyId);
if (! $account instanceof Account) {
$account = $this->syncAccount($companyId);
}
return $account;
}
private function findOrSyncContact(string $contactId): ?Contact
{
$contact = $this->crmEntityRepository->findContactByExternalId($this->config, $contactId);
if (! $contact instanceof Contact) {
$contact = $this->syncContact($contactId);
}
return $contact;
}
private function convertSingleDealAssociations($opportunityAssociations = null): array
{
$associationData = [];
if ($opportunityAssociations === null) {
return $associationData;
}
// Handle array input (from extractAssociationIds)
if (is_array($opportunityAssociations)) {
return $opportunityAssociations;
}
// Handle CollectionResponseAssociatedId object
if ($opportunityAssociations instanceof CollectionResponseAssociatedId) {
foreach ($opportunityAssociations->getResults() as $association) {
$associationData[] = $association->getId();
}
}
return $associationData;
}
private function importOrUpdateOpportunity($crmData, ?bool $exists = null): ?Opportunity
{
if (empty($crmData['properties'])) {
return null;
}
$crmId = (string) $crmData['id'];
$properties = $crmData['properties'];
$associations = $crmData['associations'] ?? [];
$opportunityExists = $exists ?? (bool) $this->crmEntityRepository->findOpportunityByExternalId(
$this->config,
$crmId
);
if ($opportunityExists) {
return $this->updateOpportunity($crmId, $properties, $associations);
}
return $this->createOpportunity($crmId, $properties, $associations);
}
/**
* Create new opportunity
*/
private function createOpportunity(string $crmId, array $properties, array $associations): ?Opportunity
{
$accountId = $this->resolveAccountId($associations);
if (! $accountId) {
return null;
}
$businessProcess = $this->resolveBusinessProcess($properties['pipeline'] ?? null);
if (! $businessProcess) {
return null;
}
$stage = $this->resolveStage($businessProcess, $properties['dealstage'] ?? null);
if (! $stage) {
return null;
}
$data = $this->buildOpportunityData($properties, $accountId, $businessProcess, $stage);
$attributes = [
'crm_configuration_id' => $this->config->getId(),
'crm_provider_id' => $crmId,
];
$values = array_merge($attributes, $data);
$opportunity = $this->crmEntityRepository->upsertOpportunity($attributes, $values);
$this->importExternalFieldData($properties, $opportunity->getId());
$this->importOpportunityContacts($opportunity, $associations['contacts']);
if ($opportunity->wasRecentlyCreated) {
MatchActivitiesToNewOpportunity::dispatch($opportunity->getId());
}
return $opportunity;
}
/**
* Update existing opportunity
*/
private function updateOpportunity(string $crmId, array $properties, array $associations): Opportunity
{
$accountId = $this->resolveAccountId($associations);
$businessProcess = $this->resolveBusinessProcess($properties['pipeline'] ?? null);
$stage = $businessProcess ? $this->resolveStage($businessProcess, $properties['dealstage'] ?? null) : null;
$data = $this->buildOpportunityData($properties, $accountId, $businessProcess, $stage);
$attributes = [
'crm_configuration_id' => $this->config->getId(),
'crm_provider_id' => $crmId,
];
$values = array_merge($attributes, $data);
$opportunity = $this->crmEntityRepository->upsertOpportunity($attributes, $values);
$this->importExternalFieldData($properties, $opportunity->getId());
$this->updateOpportunityAssociations($opportunity, $associations);
return $opportunity;
}
private function resolveAccountId(array $associations): ?int
{
if (! empty($associations['account_id'])) {
return $associations['account_id'];
}
if (empty($associations)) {
return null;
}
// Fallback: use first company as account (currently SDK returns one company)
foreach ($associations['companies'] as $accountId) {
return $accountId;
}
return null;
}
private function buildOpportunityData(
array $properties,
?int $accountId,
?BusinessProcess $businessProcess,
?Stage $stage
): array {
$ownerId = null;
$profile = null;
if (! empty($properties['hubspot_owner_id'])) {
$ownerId = $properties['hubspot_owner_id'];
$profile = $this->crmEntityRepository->findProfileByExternalId($this->config, (string) $ownerId);
}
$name = 'Unknown';
if (isset($properties['dealname'])) {
$name = mb_strimwidth($properties['dealname'], 0, 128);
}
$amount = $this->resolveAmount($properties);
$currency = $properties['deal_currency_code'] ?? null;
$closeDate = null;
if (! empty($properties['closedate'])) {
$closeDate = Carbon::parse($properties['closedate'])->format('Y-m-d');
}
$remotelyCreatedAt = null;
if (! empty($properties['createdate']) && strtotime($properties['createdate'])) {
$date = $this->parseCleanDatetime($properties['createdate']);
$remotelyCreatedAt = $date?->format('Y-m-d H:i:s');
}
$closedStages = $this->getClosedDealStages();
$isWon = in_array($properties['dealstage'], $closedStages['won']);
$isLost = in_array($properties['dealstage'], $closedStages['lost']);
$data = [
'team_id' => $this->team->getId(),
'user_id' => $profile ? $profile->user_id : null,
'owner_id' => $ownerId,
'name' => $name,
'value' => ! empty($amount) ? $amount : null,
'currency_code' => CurrencyFormatter::formatCode($currency),
'close_date' => $closeDate,
'is_closed' => $isWon || $isLost,
'is_won' => $isWon,
'remotely_created_at' => $remotelyCreatedAt,
'probability' => $this->resolveDealProbability($properties['hs_deal_stage_probability']),
'forecast_category' => $this->resolveForecastCategory($properties['hs_manual_forecast_category']),
];
if ($accountId) {
$data['account_id'] = $accountId;
}
if ($stage) {
$data['stage_id'] = $stage->id;
}
if ($businessProcess) {
$recordType = $this->crmEntityRepository->getBusinessProcessRecordType($businessProcess);
if ($recordType) {
$data['record_type_id'] = $recordType->id;
}
}
return $data;
}
private function resolveBusinessProcess(?string $pipelineId): ?BusinessProcess
{
if ($pipelineId === null) {
return null;
}
$cacheKey = $this->getBusinessProcessCacheKey($pipelineId);
if (isset($this->cachedBusinessProcesses[$cacheKey])) {
return $this->cachedBusinessProcesses[$cacheKey];
}
$businessProcess = $this->getBusinessProcess($pipelineId);
if (! $businessProcess instanceof BusinessProcess) {
$this->importStages();
$businessProcess = $this->getBusinessProcess($pipelineId);
}
if (! $businessProcess instanceof BusinessProcess) {
$this->logger->info(
'[HubSpot] Deal is not attached to a pipeline',
[
'pipeline' => $pipelineId]
);
}
$this->cachedBusinessProcesses[$cacheKey] = $businessProcess;
return $businessProcess;
}
private function getBusinessProcess(string $pipelineId): ?BusinessProcess
{
return $this->crmEntityRepository->findBusinessProcessesByExternalId($this->config, $pipelineId);
}
private function getBusinessProcessCacheKey(string $pipelineId): string
{
return $this->config->getId() . '_' . $pipelineId;
}
private function resolveStage(BusinessProcess $businessProcess, ?string $stageId): ?Stage
{
if (empty($stageId)) {
return null;
}
$cacheKey = $businessProcess->getId() . ':' . $stageId;
if (isset($this->cachedStages[$cacheKey])) {
return $this->cachedStages[$cacheKey];
}
$stage = $this->crmEntityRepository->getPipelineStageByConditions(
$businessProcess,
[
'crm_provider_id' => $stageId,
'type' => Stage::TYPE_OPPORTUNITY,
]
);
if ($stage === null) {
$this->importStages(null, $stageId);
}
if ($stage === null) {
$this->logger->info('[HubSpot] Stage does not exist => ' . $stageId);
}
$this->cachedStages[$cacheKey] = $stage;
return $stage;
}
private function resolveAmount(array $properties): ?string
{
$amount = null;
if (! empty($properties['amount'])) {
$amount = str_replace(',', '', $properties['amount']);
}
if ($this->config->hasDefaultCurrencyFieldSet()) {
$valueFieldName = $this->config->getDefaultCurrencyField()->getCrmProviderId();
$amount = $properties[$valueFieldName] ?? $amount;
}
return $amount;
}
private function parseCleanDatetime(string $datetime): ?Carbon
{
// Treat pre-1980 values as invalid
$minValidDate = Carbon::parse('1980-01-01 00:00:00');
try {
$date = Carbon::parse($datetime);
if ($minValidDate->gt($date)) {
return null;
}
return $date;
} catch (Exception) {
return null; // On parse error, treat as null
}
}
private function resolveDealProbability(?string $stageProbability): int
{
if ($stageProbability === null) {
return 0;
}
$probability = (float) $stageProbability;
return $probability > 1 ? 0 : (int) ($probability * 100);
}
private function resolveForecastCategory(?string $forecastCategory): string
{
if (! $forecastCategory) {
return Forecast::FORECAST_CATEGORY_UNCATEGORIZED;
}
$forecastCategory = str_replace('_', ' ', $forecastCategory);
return ucwords(strtolower($forecastCategory));
}
private function importExternalFieldData(array $properties, int $opportunityId): void
{
$crmFields = $this->getOpportunitySyncableFields();
$this->importOpportunityCrmFieldData($properties, $crmFields, $opportunityId);
}
private function importOpportunityContacts(Opportunity $opportunity, array $associations): void
{
// Handle empty or missing contact associations
if (empty($associations)) {
// Remove all existing contact associations if none provided
$this->removeAllOpportunityContacts($opportunity);
return;
}
// Use differential sync approach for better performance and accuracy
$this->syncOpportunityContactsDifferential($opportunity, $associations);
}
/**
* Sync opportunity contacts using differential approach
* This compares current vs new associations and only makes necessary changes
*/
private function syncOpportunityContactsDifferential(Opportunity $opportunity, array $contactAssociations): void
{
$currentContactCrmIds = $this->getCurrentContactCrmIds($opportunity);
$contactAssociationIds = array_keys($contactAssociations);
$contactsToAdd = array_diff($contactAssociationIds, $currentContactCrmIds);
$contactsToRemove = array_diff($currentContactCrmIds, $contactAssociationIds);
if (empty($contactsToAdd) && empty($contactsToRemove)) {
return;
}
$this->logContactAssociationChanges($opportunity, $currentContactCrmIds, $contactAssociations, $contactsToAdd, $contactsToRemove);
$this->removeContactAssociations($opportunity, $contactsToRemove);
$this->addContactAssociations($opportunity, $contactsToAdd, $contactAssociations);
}
private function getCurrentContactCrmIds(Opportunity $opportunity): array
{
return $opportunity->contacts()
->pluck('contacts.crm_provider_id')
->toArray();
}
private function logContactAssociationChanges(
Opportunity $opportunity,
array $currentContactCrmIds,
array $contactAssociations,
array $contactsToAdd,
array $contactsToRemove
): void {
$this->logger->info('[' . $this->getDisplayName() . '] Contact association changes', [
'opportunity_id' => $opportunity->getId(),
'current_contacts' => $currentContactCrmIds,
'new_contacts' => $contactAssociations,
'contacts_to_add' => $contactsToAdd,
'contacts_to_remove' => $contactsToRemove,
]);
}
private function removeContactAssociations(Opportunity $opportunity, array $contactsToRemove): void
{
if (empty($contactsToRemove)) {
return;
}
$contactsToDetach = $opportunity->contacts()
->whereIn('contacts.crm_provider_id', $contactsToRemove)
->pluck('contacts.id')
->toArray();
if (! empty($contactsToDetach)) {
$opportunity->contacts()->detach($contactsToDetach);
$this->logger->info('[' . $this->getDisplayName() . '] Removed contact associations', [
'opportunity_id' => $opportunity->getId(),
'removed_contact_crm_ids' => $contactsToRemove,
'removed_contact_count' => count($contactsToDetach),
]);
}
}
private function addContactAssociations(Opportunity $opportunity, array $contactsToAdd, array $contactAssociations): void
{
if (empty($contactsToAdd)) {
return;
}
$contactsAdded = [];
foreach ($contactsToAdd as $crmId) {
$id = $contactAssociations[$crmId];
if ($this->attachSingleContact($opportunity, (string) $crmId, $id)) {
$contactsAdded[] = $crmId;
}
}
$this->logAddedContacts($opportunity, $contactsAdded);
}
private function attachSingleContact(Opportunity $opportunity, string $crmId, int $id): bool
{
try {
$contact = $this->crmEntityRepository->findContactByConfigurationAndId($this->config, $id);
if (! $contact) {
return false;
}
return $this->performContactAttachment($opportunity, $contact, $crmId);
} catch (\Throwable $e) {
$this->logger->warning('[' . $this->getDisplayName() . '] Failed to add contact association', [
'opportunity_id' => $opportunity->getId(),
'contact_crm_id' => $crmId,
'error' => $e->getMessage(),
]);
return false;
}
}
private function performContactAttachment(Opportunity $opportunity, Contact $contact, string $crmId): bool
{
try {
$opportunity->contacts()->attach($contact->getId(), [
'crm_provider_id' => $crmId,
]);
return true;
} catch (\Illuminate\Database\QueryException $e) {
if (str_contains($e->getMessage(), 'Duplicate entry')) {
$this->logger->info('[' . $this->getDisplayName() . '] Contact association already exists', [
'contact_id' => $contact->getId(),
'contact_crm_id' => $crmId,
'opportunity_id' => $opportunity->getId(),
]);
return false;
}
throw $e;
}
}
private function logAddedContacts(Opportunity $opportunity, array $contactsAdded): void
{
if (! empty($contactsAdded)) {
$this->logger->info('[' . $this->getDisplayName() . '] Added contact associations', [
'opportunity_id' => $opportunity->getId(),
'added_contact_crm_ids' => $contactsAdded,
'added_contacts_count' => count($contactsAdded),
]);
}
}
}
Execute
Explain Plan
Browse Query History
View Parameters
Open Query Execution Settings…
In-Editor Results
Tx: Auto
Cancel Running Statements
Playground
jiminny
Code changed:
Hide
Sync Changes
Hide This Notification
6
1
6
Previous Highlighted Error
Next Highlighted Error
# [PASSWORD_DOTS] HS [PASSWORD_DOTS]
select * from teams where id = 2; # 2
select * from features; # 2
select * from team_features where team_id = 2; # 2
select * from crm_configurations where id = 2; # 2
select * from users where team_id = 2; #
select * from playbooks where team_id = 2; # event 38
select * from playbook_categories where playbook_id = 38; #
SELECT * FROM activities WHERE crm_configuration_id = 2 and crm_provider_id is not null order by id desc;
https://app.hubspot.com/contacts/4392066/deal/16964514951/?engagement=96069102624
https://app.staging.jiminny.com/playback/d5df34dc-bd66-4ff5-a7b3-8d3be30322a0
SELECT * FROM activities WHERE uuid_to_bin('04fdcd0d-818f-4c53-92dc-6f18bc753ffd') = uuid;
# 609126 softphone tr. 11241
SELECT * FROM activities WHERE uuid_to_bin('6521bfcd-5a30-46e5-9f74-5440fd48befd') = uuid;
# 608874 conference tr. 11226 crmId: 103422236596
select * from ai_prompts where transcription_id IN (11241, 11226);
select * from activity_summary_logs where activity_id = 608874;
select * from sidekick_settings;
select * from default_activity_types;
select * from crm_field_data where activity_id = 1223;
select * from crm_layouts where crm_configuration_id = 2;
SELECT * FROM crm_layout_entities WHERE crm_layout_id IN (554);
select * from crm_fields where crm_configuration_id = 11 and object_type = 'event';
SELECT * FROM crm_field_values WHERE crm_field_id IN (1455,1450);
SELECT * FROM crm_field_data WHERE crm_layout_entity_id = 971;
SELECT * FROM crm_field_data WHERE crm_layout_entity_id IN (6494,6495,6496,6497,6498,6499);
SELECT
CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,
u.email,
sa.*,
t.owner_id FROM social_accounts sa
JOIN users u
on u.id = sa.sociable_id
JOIN teams t on t.id = u.team_id
WHERE u.team_id = 2 and sa.provider = 'hubspot';
select * from opportunities where team_id = 2
and crm_provider_id IN ('51317301383');
select * from contacts where id = 85;
select * from opportunities where team_id = 2 order by id desc;
select * from opportunities where team_id = 2 and crm_provider_id = '51317301383'; # 5112
select * from opportunities where team_id = 2 and crm_provider_id = '55976759904'; # 5112
select * from opportunity_contacts where opportunity_id = 5117;
select * from crm_field_data where object_id = 1365;
SELECT * FROM crm_fields WHERE id IN (1405, 1407, 1972, 2128);
select * from features;
select * from team_features where team_id IN (1);
select * from team_features where feature_id IN (36);
SHOW CREATE TABLE opportunity_contacts;
SELECT * FROM opportunity_contacts WHERE crm_provider_id = '111751';
# $slug = 'HUBSPOT_WEBHOOK_SYNC';
# $team = Jiminny\Models\Team::find(2);
# $feature = Feature::query()->where('slug', $slug)->first();
# TeamFeature::query()->create(['feature_id' => $feature->getId(),'team_id' => $team->getId()]);
# hubspot_webhook_metrics
select * from opportunities where team_id = 2 and crm_provider_id IN ('374720564','14527423589','49908861993','50435771779'); # 1365
SELECT * FROM opportunity_contacts WHERE opportunity_id = '414';
SELECT * FROM opportunity_contacts WHERE crm_provider_id = '131501';
select * from contacts where id in (414, 464);
select * from activities where crm_configuration_id = 2;
select settings from crm_configurations where id = 11;
select * from teams; # 1, 2
select * from users;
select * from crm_configurations where id = 39;
select * from team_features where team_id = 2;
select * from features;
# SELECT * FROM opportunities WHERE crm_configuration_id = 2
# order by id desc;
# and crm_provider_id = '49908861993';
select * from activity_providers where id IN (443, 202, 203, 227);
select * from activity_imports where id = 795889;
select c.id, c.provider, c.settings, t.* from teams t join crm_configurations c on t.id = c.team_id
where c.provider = 'hubspot';
select * from crm_configurations crm JOIN teams t on crm.team_id = t.id
where provider = 'hubspot';
SELECT * FROM teams WHERE id = 31;
SELECT * FROM users WHERE id = 257;
SELECT * FROM opportunities WHERE team_id = 2;
select * from opportunity_contacts where opportunity_id = 5124;
select * from contacts where id IN (3850,3853,3851,4073,4140,4155,4480,4530,4623,5986,513,687,1806,1523,3613)
select * from activities where crm_configuration_id = 13;
SELECT * FROM activities WHERE uuid_to_bin('826619ce-ec8e-4e59-8467-a01f5f6ad71e') = uuid; # 418141
select id, team_id, crm_provider_id from crm_configurations where provider = 'hubspot' and crm_provider_id IS NOT NULL;
SELECT * FROM accounts WHERE team_id = 2 and crm_provider_id = '1212213464' order by id desc;
SELECT * FROM contacts WHERE team_id = 2 and account_id = 5189 order by id desc;
SELECT * FROM contacts WHERE team_id = 2 order by id desc;
select * from opportunity_contacts where contact_id = 6223;
SELECT * FROM opportunities WHERE team_id = 2 and account_id = 5189 order by id desc;
select * from crm_profiles where crm_configuration_id = 2;
select * from activities where account_id = 46;
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"bounds":{"left":0.025930852,"top":0.019952115,"width":0.03856383,"height":0.025538707},"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"#11976 on JY-20553-debug-crm-sync-delays, menu","depth":5,"bounds":{"left":0.064494684,"top":0.019952115,"width":0.10837766,"height":0.025538707},"help_text":"Pull request #11976 exists for current branch JY-20553-debug-crm-sync-delays","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"bounds":{"left":0.7972075,"top":0.019952115,"width":0.011303191,"height":0.025538707},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"RequestGenerateAskJiminnyReportJobTest","depth":6,"bounds":{"left":0.8125,"top":0.019952115,"width":0.10305851,"height":0.025538707},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run 'RequestGenerateAskJiminnyReportJobTest'","depth":6,"bounds":{"left":0.9155585,"top":0.019952115,"width":0.011303191,"height":0.025538707},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'RequestGenerateAskJiminnyReportJobTest'","depth":6,"bounds":{"left":0.9268617,"top":0.019952115,"width":0.011303191,"height":0.025538707},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"More Actions","depth":6,"bounds":{"left":0.9381649,"top":0.019952115,"width":0.011303191,"height":0.025538707},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JetBrains AI","depth":5,"bounds":{"left":0.96609044,"top":0.019952115,"width":0.011303191,"height":0.025538707},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Search Everywhere","depth":5,"bounds":{"left":0.9773936,"top":0.019952115,"width":0.011303191,"height":0.025538707},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"IDE and Project Settings","depth":5,"bounds":{"left":0.9886968,"top":0.019952115,"width":0.011303186,"height":0.025538707},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.042220745,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"33","depth":4,"bounds":{"left":0.47739363,"top":0.19952115,"width":0.010305851,"height":0.015163607},"role_description":"text"},{"role":"AXStaticText","text":"2","depth":4,"bounds":{"left":0.48969415,"top":0.19952115,"width":0.007978723,"height":0.015163607},"role_description":"text"},{"role":"AXStaticText","text":"19","depth":4,"bounds":{"left":0.49966756,"top":0.19952115,"width":0.009640957,"height":0.015163607},"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.5109708,"top":0.19792499,"width":0.00731383,"height":0.018355945},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"bounds":{"left":0.51828456,"top":0.19792499,"width":0.006981383,"height":0.018355945},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Services\\Crm\\Hubspot\\ServiceTraits;\n\nuse Carbon\\Carbon;\nuse HubSpot\\Client\\Crm\\Deals\\Model\\CollectionResponseAssociatedId;\nuse Jiminny\\Exceptions\\InvalidArgumentException;\nuse Jiminny\\Models\\Account;\nuse Exception;\nuse Jiminny\\Component\\DealInsights\\Forecast\\Forecast;\nuse Jiminny\\Jobs\\Crm\\MatchActivitiesToNewOpportunity;\nuse Jiminny\\Models\\Contact;\nuse Jiminny\\Models\\Crm\\BusinessProcess;\nuse Jiminny\\Exceptions\\CrmException;\nuse Jiminny\\Models\\Opportunity;\nuse Illuminate\\Support\\Collection;\nuse Jiminny\\Models\\Stage;\nuse Jiminny\\Repositories\\Crm\\CrmEntityRepository;\nuse Jiminny\\Services\\Crm\\Hubspot\\DealFieldsService;\nuse Jiminny\\Services\\Crm\\Hubspot\\OpportunitySyncStrategy\\HubspotSingleSyncStrategy;\nuse Jiminny\\Services\\Crm\\Hubspot\\WebhookSyncBatchProcessor;\nuse Jiminny\\Services\\Crm\\OpportunitySyncStrategyResolver;\nuse Jiminny\\Utils\\CurrencyFormatter;\n\n/**\n * Optimized sync methods for better performance\n * These methods can be integrated into SyncCrmEntitiesTrait for significant performance gains\n */\ntrait OpportunitySyncTrait\n{\n private const int BATCH_SIZE = 100;\n private const int BATCH_PROCESS_SIZE = 800;\n\n protected OpportunitySyncStrategyResolver $opportunitySyncStrategyResolver;\n protected CrmEntityRepository $crmEntityRepository;\n protected DealFieldsService $dealFieldsService;\n\n private ?array $cachedClosedDealStages = null;\n private array $cachedBusinessProcesses = [];\n private array $cachedStages = [];\n\n public function syncOpportunities(array $parameters, ?string $strategy = null): int\n {\n $startTime = microtime(true);\n $strategies = $this->opportunitySyncStrategyResolver->getStrategies($this->config, $strategy);\n $parameters['config'] = $this->config;\n $syncCount = 0;\n $reportedTotal = 0;\n $lastSyncedId = [];\n $strategyNames = [];\n\n try {\n foreach ($strategies as $strategyName => $syncStrategy) {\n $strategyNames[] = $strategyName;\n $this->logger->info(\n '[' . $this->getDisplayName() . '] Syncing opportunities using strategy: ' . $strategyName,\n ['team' => $this->team->getId()]\n );\n\n $total = 0;\n $lastId = null;\n $buffer = [];\n\n // HubspotWebhookBatchSyncStrategy returns empty generator, this is for other strategies\n foreach ($syncStrategy->fetchOpportunities($parameters, $total, $lastId) as $hsOpportunity) {\n $buffer[] = $hsOpportunity;\n\n // process every 800 rows (fits < 1 000 association limit)\n if (\\count($buffer) >= self::BATCH_PROCESS_SIZE) {\n $syncCount += $this->processOpportunityBatch($buffer);\n $buffer = [];\n }\n }\n\n // leftovers\n if ($buffer) {\n $syncCount += $this->processOpportunityBatch($buffer);\n }\n\n $reportedTotal += $total;\n $lastSyncedId = $lastId;\n }\n } catch (\\HubSpot\\Client\\Crm\\Deals\\ApiException | CrmException $e) {\n $this->handleSyncException($e, $parameters);\n }\n\n $durationMs = round((microtime(true) - $startTime) * 1000, 2);\n $this->logger->info(\n '[HubSpot] Synced opportunities',\n [\n 'team' => $this->team->getId(),\n 'strategies' => implode(',', $strategyNames),\n 'sync_count' => $syncCount,\n 'total' => $reportedTotal,\n 'last_synced_id' => $lastSyncedId,\n 'duration_ms' => $durationMs,\n ]\n );\n\n return $reportedTotal;\n }\n\n private function handleSyncException(\\Throwable $e, array $parameters): void\n {\n if (($parameters['since'] ?? null) instanceof Carbon) {\n $parameters['since'] = $parameters['since']->toDateTimeString();\n }\n $parameters['config'] = $this->config->getId();\n\n $this->logger->warning('[' . $this->getDisplayName() . '] Sync opportunities failed', [\n 'teamId' => $this->team->getUuid(),\n 'parameters' => $parameters,\n 'reason' => $e->getMessage(),\n ]);\n }\n\n /**\n * @inheritdoc\n */\n public function syncOpportunity(string $crmId): ?Opportunity\n {\n $strategy = $this->opportunitySyncStrategyResolver->resolve(\n $this->config,\n OpportunitySyncStrategyResolver::SINGLE_SYNC_OPPORTUNITY_STRATEGY,\n );\n\n $parameters = [\n 'config' => $this->config,\n 'crm_id' => $crmId,\n ];\n\n try {\n if (! $strategy instanceof HubspotSingleSyncStrategy) {\n throw new InvalidArgumentException('Strategy must by HubspotSingleSyncStrategy');\n }\n\n $hsOpportunity = $strategy->fetchOpportunity($parameters);\n } catch (\\HubSpot\\Client\\Crm\\Deals\\ApiException $e) {\n $this->logger->info('[' . $this->getDisplayName() . '] Opportunity not found', [\n 'teamId' => $this->team->getUuid(),\n 'crmId' => $crmId,\n 'reason' => $e->getMessage(),\n ]);\n\n return null;\n }\n\n $hsOpportunity['associations'] = $this->convertDealAssociations($hsOpportunity['associations'] ?? []);\n\n return $this->importOrUpdateOpportunity($hsOpportunity);\n }\n\n /**\n * Process webhook-collected opportunity batches.\n *\n * Drains Redis sets containing company CRM IDs collected from webhook events\n * and dispatches ImportOpportunityBatch jobs for batch processing.\n *\n * @return int Number of opportunity IDs dispatched to jobs\n */\n public function batchSyncOpportunities(): int\n {\n $configId = $this->team->getCrmConfiguration()->getId();\n\n return $this->batchProcessor->processBatchesForObjectType(\n WebhookSyncBatchProcessor::OBJECT_TYPE_DEAL,\n $configId\n );\n }\n\n /**\n * Import a batch of opportunities by their CRM IDs.\n * Fetches opportunity data from HubSpot API and delegates to importOpportunityBatch().\n *\n * @param array<string> $crmIds HubSpot deal CRM IDs\n *\n * @return array{success: array, failed_ids: array, errors?: array<string, string>}\n */\n public function importOpportunityBatchByIds(array $crmIds): array\n {\n $fields = $this->dealFieldsService->getFieldsForConfiguration($this->config);\n\n $allDeals = [];\n foreach (array_chunk($crmIds, self::BATCH_SIZE) as $chunk) {\n $deals = $this->client->getOpportunitiesByIds($chunk, $fields);\n foreach ($deals as $deal) {\n $allDeals[] = $deal;\n }\n }\n\n // IDs not returned by HubSpot are likely deleted or inaccessible deals.\n // These are not failures — retrying won't bring them back.\n $fetchedIds = array_map('strval', array_column($allDeals, 'id'));\n $notFoundIds = array_values(array_diff(array_map('strval', $crmIds), $fetchedIds));\n\n if (! empty($notFoundIds)) {\n $this->logger->info('[' . $this->getDisplayName() . '] CRM IDs not found in HubSpot (likely deleted)', [\n 'teamId' => $this->team->getId(),\n 'notFoundCount' => \\count($notFoundIds),\n 'notFoundIds' => $notFoundIds,\n 'requestedCount' => \\count($crmIds),\n 'fetchedCount' => \\count($allDeals),\n ]);\n }\n\n if (empty($allDeals)) {\n return ['success' => [], 'failed_ids' => []];\n }\n\n return $this->importOpportunityBatch($allDeals);\n }\n\n private function getClosedDealStages(): array\n {\n if ($this->cachedClosedDealStages !== null) {\n return $this->cachedClosedDealStages;\n }\n\n $stages = $this->crmEntityRepository->getOpportunityClosedStages($this->config);\n $data = [\n 'lost' => [],\n 'won' => [],\n ];\n\n foreach ($stages as $stage) {\n if ($stage->probability == 0.00) {\n $data['lost'][] = $stage->crm_provider_id;\n }\n if ($stage->probability == 100.00) {\n $data['won'][] = $stage->crm_provider_id;\n }\n }\n\n $this->cachedClosedDealStages = $data;\n\n return $data;\n }\n\n /**\n * Import deals into the database with pre-fetched associations.\n *\n * API calls here (getAssociationsData, getExistingOpportunityCrmIds) are NOT\n * caught — if they throw, the exception propagates to ImportOpportunityBatch::handle()\n * where Laravel retries the whole job with backoff. After all retries exhausted,\n * failed() requeues all IDs to Redis.\n *\n * The per-deal loop catches exceptions individually. A deal can end up in three states:\n * - success: imported/updated successfully\n * - failed_ids: exception thrown (DB constraint violation, corrupt data, etc.)\n * These are permanent issues — retrying won't fix them.\n * - skipped (null): missing dependencies (no account, unknown pipeline/stage).\n * This is acceptable — the deal cannot be imported until those exist.\n */\n private function importOpportunityBatch(array $deals): array\n {\n $syncedOpportunities = [\n 'success' => [],\n 'failed_ids' => [],\n ];\n $dealIds = array_column($deals, 'id');\n\n // Shared association/existing-ID preparation is batch-level state. If it fails, rethrow so the\n // queue job retries the whole batch and eventually requeues all deal IDs back to Redis.\n try {\n $companyAssociations = $this->client->getAssociationsData($dealIds, 'deals', 'companies');\n $contactAssociations = $this->client->getAssociationsData($dealIds, 'deals', 'contacts');\n\n $associationsData = $this->prepareAssociatedEntities($companyAssociations, $contactAssociations);\n\n $existingCrmIds = $this->crmEntityRepository->getExistingOpportunityCrmIds(\n $this->config,\n array_map('strval', $dealIds)\n );\n $existingCrmIdSet = array_flip($existingCrmIds);\n } catch (\\Throwable $e) {\n $this->logger->error('[' . $this->getDisplayName() . '] Failed to fetch associations or existing IDs', [\n 'teamId' => $this->team->getId(),\n 'dealCount' => count($dealIds),\n 'error' => $e->getMessage(),\n ]);\n\n throw $e;\n }\n\n foreach ($deals as $deal) {\n try {\n $deal['associations'] = $this->prepareAssociationsForOpportunity(\n $deal['id'],\n $companyAssociations,\n $contactAssociations,\n $associationsData\n );\n\n $syncedOpportunity = $this->importOrUpdateOpportunity(\n $deal,\n isset($existingCrmIdSet[(string) $deal['id']])\n );\n if ($syncedOpportunity) {\n $syncedOpportunities['success'][] = $syncedOpportunity;\n }\n } catch (\\Throwable $e) {\n $this->logger->warning('[' . $this->getDisplayName() . '] Failed to import opportunity', [\n 'teamId' => $this->team->getId(),\n 'crmId' => $deal['id'],\n 'error' => $e->getMessage(),\n ]);\n $syncedOpportunities['failed_ids'][] = $deal['id'];\n $syncedOpportunities['errors'][$deal['id']] = $e->getMessage();\n }\n }\n\n return $syncedOpportunities;\n }\n\n /**\n * Prepare associated entities for opportunities with optimized batch processing\n * Returns structured data with CRM ID to DB ID mappings for each opportunity\n */\n private function prepareAssociatedEntities(array $companyAssociations, array $contactAssociations): array\n {\n // Step 1: Collect all unique company and contact IDs from associations\n $allCompanyIds = $this->flattenAssociationIds($companyAssociations);\n $allContactIds = $this->flattenAssociationIds($contactAssociations);\n\n // Step 2: Batch sync missing entities and get CRM ID to DB ID mappings\n $companyIdMappings = [];\n $contactIdMappings = [];\n\n if (! empty($allCompanyIds)) {\n $companyIdMappings = $this->prepareAssociatedAccounts($allCompanyIds);\n }\n\n if (! empty($allContactIds)) {\n $contactIdMappings = $this->prepareAssociatedContacts($allContactIds);\n }\n\n return [\n 'company_id_mappings' => $companyIdMappings,\n 'contact_id_mappings' => $contactIdMappings,\n ];\n }\n\n /**\n * Flatten association data to get unique IDs\n */\n private function flattenAssociationIds(array $associations): array\n {\n $ids = [];\n foreach ($associations as $dealAssociations) {\n if (is_array($dealAssociations)) {\n foreach ($dealAssociations as $id) {\n $ids[$id] = true;\n }\n }\n }\n\n return array_keys($ids);\n }\n\n /**\n * Batch sync missing accounts\n */\n private function prepareAssociatedAccounts(array $companyIds): array\n {\n // Find which accounts already exist\n $existingAccounts = $this->crmEntityRepository\n ->findAccountsByExternalIds($this->config, $companyIds);\n\n $existingCompanyIds = $existingAccounts->pluck('crm_provider_id')->toArray();\n\n $existingAccountsData = $existingAccounts->mapWithKeys(function ($account) {\n return [$account->getCrmProviderId() => $account->getId()];\n })->toArray();\n\n $missingCompanyIds = array_diff($companyIds, $existingCompanyIds);\n\n if (empty($missingCompanyIds)) {\n return $existingAccountsData;\n }\n\n $this->logger->info('[' . $this->getDisplayName() . '] Batch syncing missing accounts', [\n 'teamId' => $this->team->getUuid(),\n 'total_companies' => count($companyIds),\n 'existing_companies' => count($existingCompanyIds),\n 'missing_companies' => count($missingCompanyIds),\n ]);\n\n // we already have limit on opportunity ids count\n // Initialize variable before try block\n $syncedAccountsData = [];\n\n try {\n $syncedAccountsData = $this->batchSyncCrmObjects('companies', $missingCompanyIds);\n } catch (\\Throwable $e) {\n $this->logger->warning('[' . $this->getDisplayName() . '] Failed to sync missing accounts', [\n 'size' => count($missingCompanyIds),\n 'error' => $e->getMessage(),\n ]);\n $syncedAccountsData = [];\n }\n\n return $existingAccountsData + $syncedAccountsData;\n }\n\n /**\n * Prepare associated contacts - find existing and sync missing ones\n * Returns mapping of CRM ID to DB ID\n */\n private function prepareAssociatedContacts(array $contactIds): array\n {\n // Find which contacts already exist\n $existingContacts = $this->crmEntityRepository\n ->findContactsByExternalIds($this->config, $contactIds);\n\n $existingContactIds = $existingContacts->pluck('crm_provider_id')->toArray();\n\n // Create mapping for existing contacts\n $existingContactsData = $existingContacts->mapWithKeys(function ($contact) {\n return [$contact->getCrmProviderId() => $contact->getId()];\n })->toArray();\n\n $missingContactIds = array_diff($contactIds, $existingContactIds);\n\n if (empty($missingContactIds)) {\n return $existingContactsData;\n }\n\n $this->logger->info('[' . $this->getDisplayName() . '] Batch syncing missing contacts', [\n 'teamId' => $this->team->getUuid(),\n 'total_contacts' => count($contactIds),\n 'existing_contacts' => count($existingContactIds),\n 'missing_contacts' => count($missingContactIds),\n ]);\n\n // Sync missing contacts using batch API\n try {\n $syncedContactsData = $this->batchSyncCrmObjects('contacts', $missingContactIds);\n } catch (\\Throwable $e) {\n $this->logger->warning('[' . $this->getDisplayName() . '] Failed to sync missing contacts', [\n 'size' => count($missingContactIds),\n 'error' => $e->getMessage(),\n ]);\n $syncedContactsData = [];\n }\n\n return $existingContactsData + $syncedContactsData;\n }\n\n private function batchSyncCrmObjects(string $objectType, array $crmIds): array\n {\n $syncObjects = [];\n $crmObjectIds = array_values($crmIds);\n\n foreach (array_chunk($crmObjectIds, self::BATCH_SIZE) as $chunk) {\n try {\n $objects = $objectType === 'companies' ?\n $this->client->getCompaniesByIds($chunk, $this->getCompanyFields()) :\n $this->client->getContactsByIds($chunk, $this->getContactFields());\n\n foreach ($objects as $objectId => $objectData) {\n $this->importCrmObject($objectType, (string) $objectId, $objectData, $syncObjects);\n }\n\n $this->logger->info('[' . $this->getDisplayName() . '] Batch synced ' . $objectType, [\n 'requested_count' => count($chunk),\n 'synced_count' => count($objects),\n ]);\n } catch (\\Throwable $e) {\n $this->logger->warning('[' . $this->getDisplayName() . '] Batch ' . $objectType . ' sync failed', [\n 'ids' => $chunk,\n 'error' => $e->getMessage(),\n ]);\n }\n }\n\n return $syncObjects;\n }\n\n private function importCrmObject(string $objectType, string $objectId, mixed $objectData, array &$syncObjects): void\n {\n try {\n $object = $objectType === 'companies' ?\n $this->importAccount($objectData) :\n $this->importContact($objectData);\n\n if ($object) {\n $syncObjects[$object->getCrmProviderId()] = $object->getId();\n }\n } catch (\\Throwable $e) {\n $this->logger->warning('[' . $this->getDisplayName() . '] Failed to import batch ' . $objectType, [\n 'id' => $objectId,\n 'error' => $e->getMessage(),\n ]);\n }\n }\n\n /**\n * Prepare associations for a single opportunity\n *\n * The return value is an array with the following structure:\n * [\n * 'companies' => [\n * $companyCrmId => $companyId,\n * ...\n * ],\n * 'contacts' => [\n * $contactCrmId => $contactId,\n * ...\n * ],\n * 'account_id' => $accountId,\n * ]\n */\n private function prepareAssociationsForOpportunity(\n string $oppCrmId,\n array $companyAssociations,\n array $contactAssociations,\n array $associationsData\n ): array {\n $associations = [\n 'companies' => [],\n 'contacts' => [],\n 'account_id' => null, // Primary account for opportunity\n ];\n\n $oppCompanyIds = $companyAssociations[$oppCrmId] ?? [];\n foreach ($oppCompanyIds as $companyCrmId) {\n if (isset($associationsData['company_id_mappings'][$companyCrmId])) {\n $associations['companies'][$companyCrmId] = $associationsData['company_id_mappings'][$companyCrmId];\n\n // Set primary account (first company becomes primary account)\n if ($associations['account_id'] === null) {\n $associations['account_id'] = $associationsData['company_id_mappings'][$companyCrmId];\n }\n }\n }\n\n $oppContactIds = $contactAssociations[$oppCrmId] ?? [];\n foreach ($oppContactIds as $contactCrmId) {\n if (isset($associationsData['contact_id_mappings'][$contactCrmId])) {\n $associations['contacts'][$contactCrmId] = $associationsData['contact_id_mappings'][$contactCrmId];\n }\n }\n\n return $associations;\n }\n\n /**\n * Update only associations for an opportunity\n */\n private function updateOpportunityAssociations(Opportunity $opportunity, array $associations): void\n {\n // Update contact associations\n $this->importOpportunityContacts($opportunity, $associations['contacts']);\n\n // Update company (account) associations\n $this->updateOpportunityAccount($opportunity, $associations['account_id']);\n }\n\n /**\n * Remove all contact associations from an opportunity\n */\n private function removeAllOpportunityContacts(Opportunity $opportunity): void\n {\n $currentCount = (int) $opportunity->contacts()->count();\n\n if ($currentCount > 0) {\n $opportunity->contacts()->detach();\n\n $this->logger->info('[' . $this->getDisplayName() . '] Removed all contact associations', [\n 'opportunity_id' => $opportunity->getId(),\n 'removed_count' => $currentCount,\n ]);\n }\n }\n\n private function updateOpportunityAccount(Opportunity $opportunity, ?int $accountId): void\n {\n if ($accountId === null) {\n // No account ID provided - keep current account\n return;\n }\n\n $currentAccountId = $opportunity->getAccountId();\n\n // Only update if account has changed\n if ($currentAccountId !== $accountId) {\n $opportunity->account_id = $accountId;\n $opportunity->save();\n\n $this->logger->info('[' . $this->getDisplayName() . '] Updated opportunity account association', [\n 'opportunity_id' => $opportunity->getId(),\n 'old_account_id' => $currentAccountId,\n 'new_account_id' => $accountId,\n ]);\n }\n }\n\n /**\n * Find existing opportunities by external IDs (OPTIMIZED VERSION)\n * Uses batch query for better performance\n */\n private function findExistingOpportunities(array $crmIds): Collection\n {\n return $this->crmEntityRepository\n ->findOpportunitiesByExternalIds($this->config, $crmIds);\n }\n\n private function processOpportunityBatch(array $opportunities): int\n {\n $syncedOpportunities = $this->importOpportunityBatch($opportunities);\n\n return count($syncedOpportunities['success'] ?? []);\n }\n\n /**\n * Convert single deal associations from HubSpot format to internal format\n * Handles both HubSpot SDK objects and array formats\n *\n * @param array $opportunityAssociations Raw associations from HubSpot API or pre-processed\n *\n * @return array Processed associations with DB IDs\n */\n private function convertDealAssociations(array $opportunityAssociations): array\n {\n $associations = $this->initializeAssociationsStructure();\n\n if (empty($opportunityAssociations)) {\n return $associations;\n }\n\n $associationIds = $this->extractAssociationIds($opportunityAssociations);\n\n $this->processCompanyAssociations($associationIds, $associations);\n $this->processContactAssociations($associationIds, $associations);\n\n return $associations;\n }\n\n private function initializeAssociationsStructure(): array\n {\n return [\n 'companies' => [],\n 'contacts' => [],\n 'account_id' => null, // Primary account for opportunity\n ];\n }\n\n private function extractAssociationIds(array $opportunityAssociations): array\n {\n $associationIds = [];\n\n foreach ($opportunityAssociations as $type => $associationData) {\n if (! empty($associationData)) {\n $associationIds[$type] = $this->convertSingleDealAssociations($associationData);\n }\n }\n\n return $associationIds;\n }\n\n private function processCompanyAssociations(array $associationIds, array &$associations): void\n {\n if (empty($associationIds['companies'])) {\n return;\n }\n\n $companyId = $associationIds['companies'][0];\n $account = $this->findOrSyncAccount($companyId);\n\n if ($account instanceof Account) {\n $associations['companies'][$companyId] = $account->getId();\n $associations['account_id'] = $account->getId();\n }\n }\n\n private function processContactAssociations(array $associationIds, array &$associations): void\n {\n if (empty($associationIds['contacts'])) {\n return;\n }\n\n foreach ($associationIds['contacts'] as $contactId) {\n $contact = $this->findOrSyncContact($contactId);\n\n if ($contact instanceof Contact) {\n $associations['contacts'][$contactId] = $contact->getId();\n }\n }\n }\n\n private function findOrSyncAccount(string $companyId): ?Account\n {\n $account = $this->crmEntityRepository->findAccountByExternalId($this->config, $companyId);\n\n if (! $account instanceof Account) {\n $account = $this->syncAccount($companyId);\n }\n\n return $account;\n }\n\n private function findOrSyncContact(string $contactId): ?Contact\n {\n $contact = $this->crmEntityRepository->findContactByExternalId($this->config, $contactId);\n\n if (! $contact instanceof Contact) {\n $contact = $this->syncContact($contactId);\n }\n\n return $contact;\n }\n\n private function convertSingleDealAssociations($opportunityAssociations = null): array\n {\n $associationData = [];\n\n if ($opportunityAssociations === null) {\n return $associationData;\n }\n\n // Handle array input (from extractAssociationIds)\n if (is_array($opportunityAssociations)) {\n return $opportunityAssociations;\n }\n\n // Handle CollectionResponseAssociatedId object\n if ($opportunityAssociations instanceof CollectionResponseAssociatedId) {\n foreach ($opportunityAssociations->getResults() as $association) {\n $associationData[] = $association->getId();\n }\n }\n\n return $associationData;\n }\n\n private function importOrUpdateOpportunity($crmData, ?bool $exists = null): ?Opportunity\n {\n if (empty($crmData['properties'])) {\n return null;\n }\n\n $crmId = (string) $crmData['id'];\n $properties = $crmData['properties'];\n $associations = $crmData['associations'] ?? [];\n\n $opportunityExists = $exists ?? (bool) $this->crmEntityRepository->findOpportunityByExternalId(\n $this->config,\n $crmId\n );\n\n if ($opportunityExists) {\n return $this->updateOpportunity($crmId, $properties, $associations);\n }\n\n return $this->createOpportunity($crmId, $properties, $associations);\n }\n\n /**\n * Create new opportunity\n */\n private function createOpportunity(string $crmId, array $properties, array $associations): ?Opportunity\n {\n $accountId = $this->resolveAccountId($associations);\n if (! $accountId) {\n return null;\n }\n\n $businessProcess = $this->resolveBusinessProcess($properties['pipeline'] ?? null);\n if (! $businessProcess) {\n return null;\n }\n\n $stage = $this->resolveStage($businessProcess, $properties['dealstage'] ?? null);\n if (! $stage) {\n return null;\n }\n\n $data = $this->buildOpportunityData($properties, $accountId, $businessProcess, $stage);\n\n $attributes = [\n 'crm_configuration_id' => $this->config->getId(),\n 'crm_provider_id' => $crmId,\n ];\n\n $values = array_merge($attributes, $data);\n\n $opportunity = $this->crmEntityRepository->upsertOpportunity($attributes, $values);\n\n $this->importExternalFieldData($properties, $opportunity->getId());\n $this->importOpportunityContacts($opportunity, $associations['contacts']);\n\n if ($opportunity->wasRecentlyCreated) {\n MatchActivitiesToNewOpportunity::dispatch($opportunity->getId());\n }\n\n return $opportunity;\n }\n\n /**\n * Update existing opportunity\n */\n private function updateOpportunity(string $crmId, array $properties, array $associations): Opportunity\n {\n $accountId = $this->resolveAccountId($associations);\n $businessProcess = $this->resolveBusinessProcess($properties['pipeline'] ?? null);\n $stage = $businessProcess ? $this->resolveStage($businessProcess, $properties['dealstage'] ?? null) : null;\n\n $data = $this->buildOpportunityData($properties, $accountId, $businessProcess, $stage);\n\n $attributes = [\n 'crm_configuration_id' => $this->config->getId(),\n 'crm_provider_id' => $crmId,\n ];\n\n $values = array_merge($attributes, $data);\n $opportunity = $this->crmEntityRepository->upsertOpportunity($attributes, $values);\n\n $this->importExternalFieldData($properties, $opportunity->getId());\n $this->updateOpportunityAssociations($opportunity, $associations);\n\n return $opportunity;\n }\n\n private function resolveAccountId(array $associations): ?int\n {\n if (! empty($associations['account_id'])) {\n return $associations['account_id'];\n }\n\n if (empty($associations)) {\n return null;\n }\n\n // Fallback: use first company as account (currently SDK returns one company)\n foreach ($associations['companies'] as $accountId) {\n return $accountId;\n }\n\n return null;\n }\n\n private function buildOpportunityData(\n array $properties,\n ?int $accountId,\n ?BusinessProcess $businessProcess,\n ?Stage $stage\n ): array {\n $ownerId = null;\n $profile = null;\n if (! empty($properties['hubspot_owner_id'])) {\n $ownerId = $properties['hubspot_owner_id'];\n $profile = $this->crmEntityRepository->findProfileByExternalId($this->config, (string) $ownerId);\n }\n\n $name = 'Unknown';\n if (isset($properties['dealname'])) {\n $name = mb_strimwidth($properties['dealname'], 0, 128);\n }\n\n $amount = $this->resolveAmount($properties);\n $currency = $properties['deal_currency_code'] ?? null;\n\n $closeDate = null;\n if (! empty($properties['closedate'])) {\n $closeDate = Carbon::parse($properties['closedate'])->format('Y-m-d');\n }\n\n $remotelyCreatedAt = null;\n if (! empty($properties['createdate']) && strtotime($properties['createdate'])) {\n $date = $this->parseCleanDatetime($properties['createdate']);\n $remotelyCreatedAt = $date?->format('Y-m-d H:i:s');\n }\n\n $closedStages = $this->getClosedDealStages();\n $isWon = in_array($properties['dealstage'], $closedStages['won']);\n $isLost = in_array($properties['dealstage'], $closedStages['lost']);\n\n $data = [\n 'team_id' => $this->team->getId(),\n 'user_id' => $profile ? $profile->user_id : null,\n 'owner_id' => $ownerId,\n 'name' => $name,\n 'value' => ! empty($amount) ? $amount : null,\n 'currency_code' => CurrencyFormatter::formatCode($currency),\n 'close_date' => $closeDate,\n 'is_closed' => $isWon || $isLost,\n 'is_won' => $isWon,\n 'remotely_created_at' => $remotelyCreatedAt,\n 'probability' => $this->resolveDealProbability($properties['hs_deal_stage_probability']),\n 'forecast_category' => $this->resolveForecastCategory($properties['hs_manual_forecast_category']),\n ];\n\n if ($accountId) {\n $data['account_id'] = $accountId;\n }\n\n if ($stage) {\n $data['stage_id'] = $stage->id;\n }\n\n if ($businessProcess) {\n $recordType = $this->crmEntityRepository->getBusinessProcessRecordType($businessProcess);\n if ($recordType) {\n $data['record_type_id'] = $recordType->id;\n }\n }\n\n return $data;\n }\n\n private function resolveBusinessProcess(?string $pipelineId): ?BusinessProcess\n {\n if ($pipelineId === null) {\n return null;\n }\n\n $cacheKey = $this->getBusinessProcessCacheKey($pipelineId);\n if (isset($this->cachedBusinessProcesses[$cacheKey])) {\n return $this->cachedBusinessProcesses[$cacheKey];\n }\n\n $businessProcess = $this->getBusinessProcess($pipelineId);\n\n if (! $businessProcess instanceof BusinessProcess) {\n $this->importStages();\n $businessProcess = $this->getBusinessProcess($pipelineId);\n }\n\n if (! $businessProcess instanceof BusinessProcess) {\n $this->logger->info(\n '[HubSpot] Deal is not attached to a pipeline',\n [\n 'pipeline' => $pipelineId]\n );\n }\n\n $this->cachedBusinessProcesses[$cacheKey] = $businessProcess;\n\n return $businessProcess;\n }\n\n private function getBusinessProcess(string $pipelineId): ?BusinessProcess\n {\n return $this->crmEntityRepository->findBusinessProcessesByExternalId($this->config, $pipelineId);\n }\n\n private function getBusinessProcessCacheKey(string $pipelineId): string\n {\n return $this->config->getId() . '_' . $pipelineId;\n }\n\n private function resolveStage(BusinessProcess $businessProcess, ?string $stageId): ?Stage\n {\n if (empty($stageId)) {\n return null;\n }\n\n $cacheKey = $businessProcess->getId() . ':' . $stageId;\n if (isset($this->cachedStages[$cacheKey])) {\n return $this->cachedStages[$cacheKey];\n }\n\n $stage = $this->crmEntityRepository->getPipelineStageByConditions(\n $businessProcess,\n [\n 'crm_provider_id' => $stageId,\n 'type' => Stage::TYPE_OPPORTUNITY,\n ]\n );\n\n if ($stage === null) {\n $this->importStages(null, $stageId);\n }\n\n if ($stage === null) {\n $this->logger->info('[HubSpot] Stage does not exist => ' . $stageId);\n }\n\n $this->cachedStages[$cacheKey] = $stage;\n\n return $stage;\n }\n\n private function resolveAmount(array $properties): ?string\n {\n $amount = null;\n if (! empty($properties['amount'])) {\n $amount = str_replace(',', '', $properties['amount']);\n }\n\n if ($this->config->hasDefaultCurrencyFieldSet()) {\n $valueFieldName = $this->config->getDefaultCurrencyField()->getCrmProviderId();\n $amount = $properties[$valueFieldName] ?? $amount;\n }\n\n return $amount;\n }\n\n private function parseCleanDatetime(string $datetime): ?Carbon\n {\n // Treat pre-1980 values as invalid\n $minValidDate = Carbon::parse('1980-01-01 00:00:00');\n\n try {\n $date = Carbon::parse($datetime);\n\n if ($minValidDate->gt($date)) {\n return null;\n }\n\n return $date;\n } catch (Exception) {\n return null; // On parse error, treat as null\n }\n }\n\n private function resolveDealProbability(?string $stageProbability): int\n {\n if ($stageProbability === null) {\n return 0;\n }\n\n $probability = (float) $stageProbability;\n\n return $probability > 1 ? 0 : (int) ($probability * 100);\n }\n\n private function resolveForecastCategory(?string $forecastCategory): string\n {\n if (! $forecastCategory) {\n return Forecast::FORECAST_CATEGORY_UNCATEGORIZED;\n }\n\n $forecastCategory = str_replace('_', ' ', $forecastCategory);\n\n return ucwords(strtolower($forecastCategory));\n }\n\n private function importExternalFieldData(array $properties, int $opportunityId): void\n {\n $crmFields = $this->getOpportunitySyncableFields();\n $this->importOpportunityCrmFieldData($properties, $crmFields, $opportunityId);\n }\n\n private function importOpportunityContacts(Opportunity $opportunity, array $associations): void\n {\n // Handle empty or missing contact associations\n if (empty($associations)) {\n // Remove all existing contact associations if none provided\n $this->removeAllOpportunityContacts($opportunity);\n\n return;\n }\n\n // Use differential sync approach for better performance and accuracy\n $this->syncOpportunityContactsDifferential($opportunity, $associations);\n }\n\n /**\n * Sync opportunity contacts using differential approach\n * This compares current vs new associations and only makes necessary changes\n */\n private function syncOpportunityContactsDifferential(Opportunity $opportunity, array $contactAssociations): void\n {\n $currentContactCrmIds = $this->getCurrentContactCrmIds($opportunity);\n $contactAssociationIds = array_keys($contactAssociations);\n\n $contactsToAdd = array_diff($contactAssociationIds, $currentContactCrmIds);\n $contactsToRemove = array_diff($currentContactCrmIds, $contactAssociationIds);\n\n if (empty($contactsToAdd) && empty($contactsToRemove)) {\n return;\n }\n\n $this->logContactAssociationChanges($opportunity, $currentContactCrmIds, $contactAssociations, $contactsToAdd, $contactsToRemove);\n\n $this->removeContactAssociations($opportunity, $contactsToRemove);\n $this->addContactAssociations($opportunity, $contactsToAdd, $contactAssociations);\n }\n\n private function getCurrentContactCrmIds(Opportunity $opportunity): array\n {\n return $opportunity->contacts()\n ->pluck('contacts.crm_provider_id')\n ->toArray();\n }\n\n private function logContactAssociationChanges(\n Opportunity $opportunity,\n array $currentContactCrmIds,\n array $contactAssociations,\n array $contactsToAdd,\n array $contactsToRemove\n ): void {\n $this->logger->info('[' . $this->getDisplayName() . '] Contact association changes', [\n 'opportunity_id' => $opportunity->getId(),\n 'current_contacts' => $currentContactCrmIds,\n 'new_contacts' => $contactAssociations,\n 'contacts_to_add' => $contactsToAdd,\n 'contacts_to_remove' => $contactsToRemove,\n ]);\n }\n\n private function removeContactAssociations(Opportunity $opportunity, array $contactsToRemove): void\n {\n if (empty($contactsToRemove)) {\n return;\n }\n\n $contactsToDetach = $opportunity->contacts()\n ->whereIn('contacts.crm_provider_id', $contactsToRemove)\n ->pluck('contacts.id')\n ->toArray();\n\n if (! empty($contactsToDetach)) {\n $opportunity->contacts()->detach($contactsToDetach);\n\n $this->logger->info('[' . $this->getDisplayName() . '] Removed contact associations', [\n 'opportunity_id' => $opportunity->getId(),\n 'removed_contact_crm_ids' => $contactsToRemove,\n 'removed_contact_count' => count($contactsToDetach),\n ]);\n }\n }\n\n private function addContactAssociations(Opportunity $opportunity, array $contactsToAdd, array $contactAssociations): void\n {\n if (empty($contactsToAdd)) {\n return;\n }\n\n $contactsAdded = [];\n foreach ($contactsToAdd as $crmId) {\n $id = $contactAssociations[$crmId];\n\n if ($this->attachSingleContact($opportunity, (string) $crmId, $id)) {\n $contactsAdded[] = $crmId;\n }\n }\n\n $this->logAddedContacts($opportunity, $contactsAdded);\n }\n\n private function attachSingleContact(Opportunity $opportunity, string $crmId, int $id): bool\n {\n try {\n $contact = $this->crmEntityRepository->findContactByConfigurationAndId($this->config, $id);\n\n if (! $contact) {\n return false;\n }\n\n return $this->performContactAttachment($opportunity, $contact, $crmId);\n } catch (\\Throwable $e) {\n $this->logger->warning('[' . $this->getDisplayName() . '] Failed to add contact association', [\n 'opportunity_id' => $opportunity->getId(),\n 'contact_crm_id' => $crmId,\n 'error' => $e->getMessage(),\n ]);\n\n return false;\n }\n }\n\n private function performContactAttachment(Opportunity $opportunity, Contact $contact, string $crmId): bool\n {\n try {\n $opportunity->contacts()->attach($contact->getId(), [\n 'crm_provider_id' => $crmId,\n ]);\n\n return true;\n } catch (\\Illuminate\\Database\\QueryException $e) {\n if (str_contains($e->getMessage(), 'Duplicate entry')) {\n $this->logger->info('[' . $this->getDisplayName() . '] Contact association already exists', [\n 'contact_id' => $contact->getId(),\n 'contact_crm_id' => $crmId,\n 'opportunity_id' => $opportunity->getId(),\n ]);\n\n return false;\n }\n\n throw $e;\n }\n }\n\n private function logAddedContacts(Opportunity $opportunity, array $contactsAdded): void\n {\n if (! empty($contactsAdded)) {\n $this->logger->info('[' . $this->getDisplayName() . '] Added contact associations', [\n 'opportunity_id' => $opportunity->getId(),\n 'added_contact_crm_ids' => $contactsAdded,\n 'added_contacts_count' => count($contactsAdded),\n ]);\n }\n }\n}","depth":4,"value":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Services\\Crm\\Hubspot\\ServiceTraits;\n\nuse Carbon\\Carbon;\nuse HubSpot\\Client\\Crm\\Deals\\Model\\CollectionResponseAssociatedId;\nuse Jiminny\\Exceptions\\InvalidArgumentException;\nuse Jiminny\\Models\\Account;\nuse Exception;\nuse Jiminny\\Component\\DealInsights\\Forecast\\Forecast;\nuse Jiminny\\Jobs\\Crm\\MatchActivitiesToNewOpportunity;\nuse Jiminny\\Models\\Contact;\nuse Jiminny\\Models\\Crm\\BusinessProcess;\nuse Jiminny\\Exceptions\\CrmException;\nuse Jiminny\\Models\\Opportunity;\nuse Illuminate\\Support\\Collection;\nuse Jiminny\\Models\\Stage;\nuse Jiminny\\Repositories\\Crm\\CrmEntityRepository;\nuse Jiminny\\Services\\Crm\\Hubspot\\DealFieldsService;\nuse Jiminny\\Services\\Crm\\Hubspot\\OpportunitySyncStrategy\\HubspotSingleSyncStrategy;\nuse Jiminny\\Services\\Crm\\Hubspot\\WebhookSyncBatchProcessor;\nuse Jiminny\\Services\\Crm\\OpportunitySyncStrategyResolver;\nuse Jiminny\\Utils\\CurrencyFormatter;\n\n/**\n * Optimized sync methods for better performance\n * These methods can be integrated into SyncCrmEntitiesTrait for significant performance gains\n */\ntrait OpportunitySyncTrait\n{\n private const int BATCH_SIZE = 100;\n private const int BATCH_PROCESS_SIZE = 800;\n\n protected OpportunitySyncStrategyResolver $opportunitySyncStrategyResolver;\n protected CrmEntityRepository $crmEntityRepository;\n protected DealFieldsService $dealFieldsService;\n\n private ?array $cachedClosedDealStages = null;\n private array $cachedBusinessProcesses = [];\n private array $cachedStages = [];\n\n public function syncOpportunities(array $parameters, ?string $strategy = null): int\n {\n $startTime = microtime(true);\n $strategies = $this->opportunitySyncStrategyResolver->getStrategies($this->config, $strategy);\n $parameters['config'] = $this->config;\n $syncCount = 0;\n $reportedTotal = 0;\n $lastSyncedId = [];\n $strategyNames = [];\n\n try {\n foreach ($strategies as $strategyName => $syncStrategy) {\n $strategyNames[] = $strategyName;\n $this->logger->info(\n '[' . $this->getDisplayName() . '] Syncing opportunities using strategy: ' . $strategyName,\n ['team' => $this->team->getId()]\n );\n\n $total = 0;\n $lastId = null;\n $buffer = [];\n\n // HubspotWebhookBatchSyncStrategy returns empty generator, this is for other strategies\n foreach ($syncStrategy->fetchOpportunities($parameters, $total, $lastId) as $hsOpportunity) {\n $buffer[] = $hsOpportunity;\n\n // process every 800 rows (fits < 1 000 association limit)\n if (\\count($buffer) >= self::BATCH_PROCESS_SIZE) {\n $syncCount += $this->processOpportunityBatch($buffer);\n $buffer = [];\n }\n }\n\n // leftovers\n if ($buffer) {\n $syncCount += $this->processOpportunityBatch($buffer);\n }\n\n $reportedTotal += $total;\n $lastSyncedId = $lastId;\n }\n } catch (\\HubSpot\\Client\\Crm\\Deals\\ApiException | CrmException $e) {\n $this->handleSyncException($e, $parameters);\n }\n\n $durationMs = round((microtime(true) - $startTime) * 1000, 2);\n $this->logger->info(\n '[HubSpot] Synced opportunities',\n [\n 'team' => $this->team->getId(),\n 'strategies' => implode(',', $strategyNames),\n 'sync_count' => $syncCount,\n 'total' => $reportedTotal,\n 'last_synced_id' => $lastSyncedId,\n 'duration_ms' => $durationMs,\n ]\n );\n\n return $reportedTotal;\n }\n\n private function handleSyncException(\\Throwable $e, array $parameters): void\n {\n if (($parameters['since'] ?? null) instanceof Carbon) {\n $parameters['since'] = $parameters['since']->toDateTimeString();\n }\n $parameters['config'] = $this->config->getId();\n\n $this->logger->warning('[' . $this->getDisplayName() . '] Sync opportunities failed', [\n 'teamId' => $this->team->getUuid(),\n 'parameters' => $parameters,\n 'reason' => $e->getMessage(),\n ]);\n }\n\n /**\n * @inheritdoc\n */\n public function syncOpportunity(string $crmId): ?Opportunity\n {\n $strategy = $this->opportunitySyncStrategyResolver->resolve(\n $this->config,\n OpportunitySyncStrategyResolver::SINGLE_SYNC_OPPORTUNITY_STRATEGY,\n );\n\n $parameters = [\n 'config' => $this->config,\n 'crm_id' => $crmId,\n ];\n\n try {\n if (! $strategy instanceof HubspotSingleSyncStrategy) {\n throw new InvalidArgumentException('Strategy must by HubspotSingleSyncStrategy');\n }\n\n $hsOpportunity = $strategy->fetchOpportunity($parameters);\n } catch (\\HubSpot\\Client\\Crm\\Deals\\ApiException $e) {\n $this->logger->info('[' . $this->getDisplayName() . '] Opportunity not found', [\n 'teamId' => $this->team->getUuid(),\n 'crmId' => $crmId,\n 'reason' => $e->getMessage(),\n ]);\n\n return null;\n }\n\n $hsOpportunity['associations'] = $this->convertDealAssociations($hsOpportunity['associations'] ?? []);\n\n return $this->importOrUpdateOpportunity($hsOpportunity);\n }\n\n /**\n * Process webhook-collected opportunity batches.\n *\n * Drains Redis sets containing company CRM IDs collected from webhook events\n * and dispatches ImportOpportunityBatch jobs for batch processing.\n *\n * @return int Number of opportunity IDs dispatched to jobs\n */\n public function batchSyncOpportunities(): int\n {\n $configId = $this->team->getCrmConfiguration()->getId();\n\n return $this->batchProcessor->processBatchesForObjectType(\n WebhookSyncBatchProcessor::OBJECT_TYPE_DEAL,\n $configId\n );\n }\n\n /**\n * Import a batch of opportunities by their CRM IDs.\n * Fetches opportunity data from HubSpot API and delegates to importOpportunityBatch().\n *\n * @param array<string> $crmIds HubSpot deal CRM IDs\n *\n * @return array{success: array, failed_ids: array, errors?: array<string, string>}\n */\n public function importOpportunityBatchByIds(array $crmIds): array\n {\n $fields = $this->dealFieldsService->getFieldsForConfiguration($this->config);\n\n $allDeals = [];\n foreach (array_chunk($crmIds, self::BATCH_SIZE) as $chunk) {\n $deals = $this->client->getOpportunitiesByIds($chunk, $fields);\n foreach ($deals as $deal) {\n $allDeals[] = $deal;\n }\n }\n\n // IDs not returned by HubSpot are likely deleted or inaccessible deals.\n // These are not failures — retrying won't bring them back.\n $fetchedIds = array_map('strval', array_column($allDeals, 'id'));\n $notFoundIds = array_values(array_diff(array_map('strval', $crmIds), $fetchedIds));\n\n if (! empty($notFoundIds)) {\n $this->logger->info('[' . $this->getDisplayName() . '] CRM IDs not found in HubSpot (likely deleted)', [\n 'teamId' => $this->team->getId(),\n 'notFoundCount' => \\count($notFoundIds),\n 'notFoundIds' => $notFoundIds,\n 'requestedCount' => \\count($crmIds),\n 'fetchedCount' => \\count($allDeals),\n ]);\n }\n\n if (empty($allDeals)) {\n return ['success' => [], 'failed_ids' => []];\n }\n\n return $this->importOpportunityBatch($allDeals);\n }\n\n private function getClosedDealStages(): array\n {\n if ($this->cachedClosedDealStages !== null) {\n return $this->cachedClosedDealStages;\n }\n\n $stages = $this->crmEntityRepository->getOpportunityClosedStages($this->config);\n $data = [\n 'lost' => [],\n 'won' => [],\n ];\n\n foreach ($stages as $stage) {\n if ($stage->probability == 0.00) {\n $data['lost'][] = $stage->crm_provider_id;\n }\n if ($stage->probability == 100.00) {\n $data['won'][] = $stage->crm_provider_id;\n }\n }\n\n $this->cachedClosedDealStages = $data;\n\n return $data;\n }\n\n /**\n * Import deals into the database with pre-fetched associations.\n *\n * API calls here (getAssociationsData, getExistingOpportunityCrmIds) are NOT\n * caught — if they throw, the exception propagates to ImportOpportunityBatch::handle()\n * where Laravel retries the whole job with backoff. After all retries exhausted,\n * failed() requeues all IDs to Redis.\n *\n * The per-deal loop catches exceptions individually. A deal can end up in three states:\n * - success: imported/updated successfully\n * - failed_ids: exception thrown (DB constraint violation, corrupt data, etc.)\n * These are permanent issues — retrying won't fix them.\n * - skipped (null): missing dependencies (no account, unknown pipeline/stage).\n * This is acceptable — the deal cannot be imported until those exist.\n */\n private function importOpportunityBatch(array $deals): array\n {\n $syncedOpportunities = [\n 'success' => [],\n 'failed_ids' => [],\n ];\n $dealIds = array_column($deals, 'id');\n\n // Shared association/existing-ID preparation is batch-level state. If it fails, rethrow so the\n // queue job retries the whole batch and eventually requeues all deal IDs back to Redis.\n try {\n $companyAssociations = $this->client->getAssociationsData($dealIds, 'deals', 'companies');\n $contactAssociations = $this->client->getAssociationsData($dealIds, 'deals', 'contacts');\n\n $associationsData = $this->prepareAssociatedEntities($companyAssociations, $contactAssociations);\n\n $existingCrmIds = $this->crmEntityRepository->getExistingOpportunityCrmIds(\n $this->config,\n array_map('strval', $dealIds)\n );\n $existingCrmIdSet = array_flip($existingCrmIds);\n } catch (\\Throwable $e) {\n $this->logger->error('[' . $this->getDisplayName() . '] Failed to fetch associations or existing IDs', [\n 'teamId' => $this->team->getId(),\n 'dealCount' => count($dealIds),\n 'error' => $e->getMessage(),\n ]);\n\n throw $e;\n }\n\n foreach ($deals as $deal) {\n try {\n $deal['associations'] = $this->prepareAssociationsForOpportunity(\n $deal['id'],\n $companyAssociations,\n $contactAssociations,\n $associationsData\n );\n\n $syncedOpportunity = $this->importOrUpdateOpportunity(\n $deal,\n isset($existingCrmIdSet[(string) $deal['id']])\n );\n if ($syncedOpportunity) {\n $syncedOpportunities['success'][] = $syncedOpportunity;\n }\n } catch (\\Throwable $e) {\n $this->logger->warning('[' . $this->getDisplayName() . '] Failed to import opportunity', [\n 'teamId' => $this->team->getId(),\n 'crmId' => $deal['id'],\n 'error' => $e->getMessage(),\n ]);\n $syncedOpportunities['failed_ids'][] = $deal['id'];\n $syncedOpportunities['errors'][$deal['id']] = $e->getMessage();\n }\n }\n\n return $syncedOpportunities;\n }\n\n /**\n * Prepare associated entities for opportunities with optimized batch processing\n * Returns structured data with CRM ID to DB ID mappings for each opportunity\n */\n private function prepareAssociatedEntities(array $companyAssociations, array $contactAssociations): array\n {\n // Step 1: Collect all unique company and contact IDs from associations\n $allCompanyIds = $this->flattenAssociationIds($companyAssociations);\n $allContactIds = $this->flattenAssociationIds($contactAssociations);\n\n // Step 2: Batch sync missing entities and get CRM ID to DB ID mappings\n $companyIdMappings = [];\n $contactIdMappings = [];\n\n if (! empty($allCompanyIds)) {\n $companyIdMappings = $this->prepareAssociatedAccounts($allCompanyIds);\n }\n\n if (! empty($allContactIds)) {\n $contactIdMappings = $this->prepareAssociatedContacts($allContactIds);\n }\n\n return [\n 'company_id_mappings' => $companyIdMappings,\n 'contact_id_mappings' => $contactIdMappings,\n ];\n }\n\n /**\n * Flatten association data to get unique IDs\n */\n private function flattenAssociationIds(array $associations): array\n {\n $ids = [];\n foreach ($associations as $dealAssociations) {\n if (is_array($dealAssociations)) {\n foreach ($dealAssociations as $id) {\n $ids[$id] = true;\n }\n }\n }\n\n return array_keys($ids);\n }\n\n /**\n * Batch sync missing accounts\n */\n private function prepareAssociatedAccounts(array $companyIds): array\n {\n // Find which accounts already exist\n $existingAccounts = $this->crmEntityRepository\n ->findAccountsByExternalIds($this->config, $companyIds);\n\n $existingCompanyIds = $existingAccounts->pluck('crm_provider_id')->toArray();\n\n $existingAccountsData = $existingAccounts->mapWithKeys(function ($account) {\n return [$account->getCrmProviderId() => $account->getId()];\n })->toArray();\n\n $missingCompanyIds = array_diff($companyIds, $existingCompanyIds);\n\n if (empty($missingCompanyIds)) {\n return $existingAccountsData;\n }\n\n $this->logger->info('[' . $this->getDisplayName() . '] Batch syncing missing accounts', [\n 'teamId' => $this->team->getUuid(),\n 'total_companies' => count($companyIds),\n 'existing_companies' => count($existingCompanyIds),\n 'missing_companies' => count($missingCompanyIds),\n ]);\n\n // we already have limit on opportunity ids count\n // Initialize variable before try block\n $syncedAccountsData = [];\n\n try {\n $syncedAccountsData = $this->batchSyncCrmObjects('companies', $missingCompanyIds);\n } catch (\\Throwable $e) {\n $this->logger->warning('[' . $this->getDisplayName() . '] Failed to sync missing accounts', [\n 'size' => count($missingCompanyIds),\n 'error' => $e->getMessage(),\n ]);\n $syncedAccountsData = [];\n }\n\n return $existingAccountsData + $syncedAccountsData;\n }\n\n /**\n * Prepare associated contacts - find existing and sync missing ones\n * Returns mapping of CRM ID to DB ID\n */\n private function prepareAssociatedContacts(array $contactIds): array\n {\n // Find which contacts already exist\n $existingContacts = $this->crmEntityRepository\n ->findContactsByExternalIds($this->config, $contactIds);\n\n $existingContactIds = $existingContacts->pluck('crm_provider_id')->toArray();\n\n // Create mapping for existing contacts\n $existingContactsData = $existingContacts->mapWithKeys(function ($contact) {\n return [$contact->getCrmProviderId() => $contact->getId()];\n })->toArray();\n\n $missingContactIds = array_diff($contactIds, $existingContactIds);\n\n if (empty($missingContactIds)) {\n return $existingContactsData;\n }\n\n $this->logger->info('[' . $this->getDisplayName() . '] Batch syncing missing contacts', [\n 'teamId' => $this->team->getUuid(),\n 'total_contacts' => count($contactIds),\n 'existing_contacts' => count($existingContactIds),\n 'missing_contacts' => count($missingContactIds),\n ]);\n\n // Sync missing contacts using batch API\n try {\n $syncedContactsData = $this->batchSyncCrmObjects('contacts', $missingContactIds);\n } catch (\\Throwable $e) {\n $this->logger->warning('[' . $this->getDisplayName() . '] Failed to sync missing contacts', [\n 'size' => count($missingContactIds),\n 'error' => $e->getMessage(),\n ]);\n $syncedContactsData = [];\n }\n\n return $existingContactsData + $syncedContactsData;\n }\n\n private function batchSyncCrmObjects(string $objectType, array $crmIds): array\n {\n $syncObjects = [];\n $crmObjectIds = array_values($crmIds);\n\n foreach (array_chunk($crmObjectIds, self::BATCH_SIZE) as $chunk) {\n try {\n $objects = $objectType === 'companies' ?\n $this->client->getCompaniesByIds($chunk, $this->getCompanyFields()) :\n $this->client->getContactsByIds($chunk, $this->getContactFields());\n\n foreach ($objects as $objectId => $objectData) {\n $this->importCrmObject($objectType, (string) $objectId, $objectData, $syncObjects);\n }\n\n $this->logger->info('[' . $this->getDisplayName() . '] Batch synced ' . $objectType, [\n 'requested_count' => count($chunk),\n 'synced_count' => count($objects),\n ]);\n } catch (\\Throwable $e) {\n $this->logger->warning('[' . $this->getDisplayName() . '] Batch ' . $objectType . ' sync failed', [\n 'ids' => $chunk,\n 'error' => $e->getMessage(),\n ]);\n }\n }\n\n return $syncObjects;\n }\n\n private function importCrmObject(string $objectType, string $objectId, mixed $objectData, array &$syncObjects): void\n {\n try {\n $object = $objectType === 'companies' ?\n $this->importAccount($objectData) :\n $this->importContact($objectData);\n\n if ($object) {\n $syncObjects[$object->getCrmProviderId()] = $object->getId();\n }\n } catch (\\Throwable $e) {\n $this->logger->warning('[' . $this->getDisplayName() . '] Failed to import batch ' . $objectType, [\n 'id' => $objectId,\n 'error' => $e->getMessage(),\n ]);\n }\n }\n\n /**\n * Prepare associations for a single opportunity\n *\n * The return value is an array with the following structure:\n * [\n * 'companies' => [\n * $companyCrmId => $companyId,\n * ...\n * ],\n * 'contacts' => [\n * $contactCrmId => $contactId,\n * ...\n * ],\n * 'account_id' => $accountId,\n * ]\n */\n private function prepareAssociationsForOpportunity(\n string $oppCrmId,\n array $companyAssociations,\n array $contactAssociations,\n array $associationsData\n ): array {\n $associations = [\n 'companies' => [],\n 'contacts' => [],\n 'account_id' => null, // Primary account for opportunity\n ];\n\n $oppCompanyIds = $companyAssociations[$oppCrmId] ?? [];\n foreach ($oppCompanyIds as $companyCrmId) {\n if (isset($associationsData['company_id_mappings'][$companyCrmId])) {\n $associations['companies'][$companyCrmId] = $associationsData['company_id_mappings'][$companyCrmId];\n\n // Set primary account (first company becomes primary account)\n if ($associations['account_id'] === null) {\n $associations['account_id'] = $associationsData['company_id_mappings'][$companyCrmId];\n }\n }\n }\n\n $oppContactIds = $contactAssociations[$oppCrmId] ?? [];\n foreach ($oppContactIds as $contactCrmId) {\n if (isset($associationsData['contact_id_mappings'][$contactCrmId])) {\n $associations['contacts'][$contactCrmId] = $associationsData['contact_id_mappings'][$contactCrmId];\n }\n }\n\n return $associations;\n }\n\n /**\n * Update only associations for an opportunity\n */\n private function updateOpportunityAssociations(Opportunity $opportunity, array $associations): void\n {\n // Update contact associations\n $this->importOpportunityContacts($opportunity, $associations['contacts']);\n\n // Update company (account) associations\n $this->updateOpportunityAccount($opportunity, $associations['account_id']);\n }\n\n /**\n * Remove all contact associations from an opportunity\n */\n private function removeAllOpportunityContacts(Opportunity $opportunity): void\n {\n $currentCount = (int) $opportunity->contacts()->count();\n\n if ($currentCount > 0) {\n $opportunity->contacts()->detach();\n\n $this->logger->info('[' . $this->getDisplayName() . '] Removed all contact associations', [\n 'opportunity_id' => $opportunity->getId(),\n 'removed_count' => $currentCount,\n ]);\n }\n }\n\n private function updateOpportunityAccount(Opportunity $opportunity, ?int $accountId): void\n {\n if ($accountId === null) {\n // No account ID provided - keep current account\n return;\n }\n\n $currentAccountId = $opportunity->getAccountId();\n\n // Only update if account has changed\n if ($currentAccountId !== $accountId) {\n $opportunity->account_id = $accountId;\n $opportunity->save();\n\n $this->logger->info('[' . $this->getDisplayName() . '] Updated opportunity account association', [\n 'opportunity_id' => $opportunity->getId(),\n 'old_account_id' => $currentAccountId,\n 'new_account_id' => $accountId,\n ]);\n }\n }\n\n /**\n * Find existing opportunities by external IDs (OPTIMIZED VERSION)\n * Uses batch query for better performance\n */\n private function findExistingOpportunities(array $crmIds): Collection\n {\n return $this->crmEntityRepository\n ->findOpportunitiesByExternalIds($this->config, $crmIds);\n }\n\n private function processOpportunityBatch(array $opportunities): int\n {\n $syncedOpportunities = $this->importOpportunityBatch($opportunities);\n\n return count($syncedOpportunities['success'] ?? []);\n }\n\n /**\n * Convert single deal associations from HubSpot format to internal format\n * Handles both HubSpot SDK objects and array formats\n *\n * @param array $opportunityAssociations Raw associations from HubSpot API or pre-processed\n *\n * @return array Processed associations with DB IDs\n */\n private function convertDealAssociations(array $opportunityAssociations): array\n {\n $associations = $this->initializeAssociationsStructure();\n\n if (empty($opportunityAssociations)) {\n return $associations;\n }\n\n $associationIds = $this->extractAssociationIds($opportunityAssociations);\n\n $this->processCompanyAssociations($associationIds, $associations);\n $this->processContactAssociations($associationIds, $associations);\n\n return $associations;\n }\n\n private function initializeAssociationsStructure(): array\n {\n return [\n 'companies' => [],\n 'contacts' => [],\n 'account_id' => null, // Primary account for opportunity\n ];\n }\n\n private function extractAssociationIds(array $opportunityAssociations): array\n {\n $associationIds = [];\n\n foreach ($opportunityAssociations as $type => $associationData) {\n if (! empty($associationData)) {\n $associationIds[$type] = $this->convertSingleDealAssociations($associationData);\n }\n }\n\n return $associationIds;\n }\n\n private function processCompanyAssociations(array $associationIds, array &$associations): void\n {\n if (empty($associationIds['companies'])) {\n return;\n }\n\n $companyId = $associationIds['companies'][0];\n $account = $this->findOrSyncAccount($companyId);\n\n if ($account instanceof Account) {\n $associations['companies'][$companyId] = $account->getId();\n $associations['account_id'] = $account->getId();\n }\n }\n\n private function processContactAssociations(array $associationIds, array &$associations): void\n {\n if (empty($associationIds['contacts'])) {\n return;\n }\n\n foreach ($associationIds['contacts'] as $contactId) {\n $contact = $this->findOrSyncContact($contactId);\n\n if ($contact instanceof Contact) {\n $associations['contacts'][$contactId] = $contact->getId();\n }\n }\n }\n\n private function findOrSyncAccount(string $companyId): ?Account\n {\n $account = $this->crmEntityRepository->findAccountByExternalId($this->config, $companyId);\n\n if (! $account instanceof Account) {\n $account = $this->syncAccount($companyId);\n }\n\n return $account;\n }\n\n private function findOrSyncContact(string $contactId): ?Contact\n {\n $contact = $this->crmEntityRepository->findContactByExternalId($this->config, $contactId);\n\n if (! $contact instanceof Contact) {\n $contact = $this->syncContact($contactId);\n }\n\n return $contact;\n }\n\n private function convertSingleDealAssociations($opportunityAssociations = null): array\n {\n $associationData = [];\n\n if ($opportunityAssociations === null) {\n return $associationData;\n }\n\n // Handle array input (from extractAssociationIds)\n if (is_array($opportunityAssociations)) {\n return $opportunityAssociations;\n }\n\n // Handle CollectionResponseAssociatedId object\n if ($opportunityAssociations instanceof CollectionResponseAssociatedId) {\n foreach ($opportunityAssociations->getResults() as $association) {\n $associationData[] = $association->getId();\n }\n }\n\n return $associationData;\n }\n\n private function importOrUpdateOpportunity($crmData, ?bool $exists = null): ?Opportunity\n {\n if (empty($crmData['properties'])) {\n return null;\n }\n\n $crmId = (string) $crmData['id'];\n $properties = $crmData['properties'];\n $associations = $crmData['associations'] ?? [];\n\n $opportunityExists = $exists ?? (bool) $this->crmEntityRepository->findOpportunityByExternalId(\n $this->config,\n $crmId\n );\n\n if ($opportunityExists) {\n return $this->updateOpportunity($crmId, $properties, $associations);\n }\n\n return $this->createOpportunity($crmId, $properties, $associations);\n }\n\n /**\n * Create new opportunity\n */\n private function createOpportunity(string $crmId, array $properties, array $associations): ?Opportunity\n {\n $accountId = $this->resolveAccountId($associations);\n if (! $accountId) {\n return null;\n }\n\n $businessProcess = $this->resolveBusinessProcess($properties['pipeline'] ?? null);\n if (! $businessProcess) {\n return null;\n }\n\n $stage = $this->resolveStage($businessProcess, $properties['dealstage'] ?? null);\n if (! $stage) {\n return null;\n }\n\n $data = $this->buildOpportunityData($properties, $accountId, $businessProcess, $stage);\n\n $attributes = [\n 'crm_configuration_id' => $this->config->getId(),\n 'crm_provider_id' => $crmId,\n ];\n\n $values = array_merge($attributes, $data);\n\n $opportunity = $this->crmEntityRepository->upsertOpportunity($attributes, $values);\n\n $this->importExternalFieldData($properties, $opportunity->getId());\n $this->importOpportunityContacts($opportunity, $associations['contacts']);\n\n if ($opportunity->wasRecentlyCreated) {\n MatchActivitiesToNewOpportunity::dispatch($opportunity->getId());\n }\n\n return $opportunity;\n }\n\n /**\n * Update existing opportunity\n */\n private function updateOpportunity(string $crmId, array $properties, array $associations): Opportunity\n {\n $accountId = $this->resolveAccountId($associations);\n $businessProcess = $this->resolveBusinessProcess($properties['pipeline'] ?? null);\n $stage = $businessProcess ? $this->resolveStage($businessProcess, $properties['dealstage'] ?? null) : null;\n\n $data = $this->buildOpportunityData($properties, $accountId, $businessProcess, $stage);\n\n $attributes = [\n 'crm_configuration_id' => $this->config->getId(),\n 'crm_provider_id' => $crmId,\n ];\n\n $values = array_merge($attributes, $data);\n $opportunity = $this->crmEntityRepository->upsertOpportunity($attributes, $values);\n\n $this->importExternalFieldData($properties, $opportunity->getId());\n $this->updateOpportunityAssociations($opportunity, $associations);\n\n return $opportunity;\n }\n\n private function resolveAccountId(array $associations): ?int\n {\n if (! empty($associations['account_id'])) {\n return $associations['account_id'];\n }\n\n if (empty($associations)) {\n return null;\n }\n\n // Fallback: use first company as account (currently SDK returns one company)\n foreach ($associations['companies'] as $accountId) {\n return $accountId;\n }\n\n return null;\n }\n\n private function buildOpportunityData(\n array $properties,\n ?int $accountId,\n ?BusinessProcess $businessProcess,\n ?Stage $stage\n ): array {\n $ownerId = null;\n $profile = null;\n if (! empty($properties['hubspot_owner_id'])) {\n $ownerId = $properties['hubspot_owner_id'];\n $profile = $this->crmEntityRepository->findProfileByExternalId($this->config, (string) $ownerId);\n }\n\n $name = 'Unknown';\n if (isset($properties['dealname'])) {\n $name = mb_strimwidth($properties['dealname'], 0, 128);\n }\n\n $amount = $this->resolveAmount($properties);\n $currency = $properties['deal_currency_code'] ?? null;\n\n $closeDate = null;\n if (! empty($properties['closedate'])) {\n $closeDate = Carbon::parse($properties['closedate'])->format('Y-m-d');\n }\n\n $remotelyCreatedAt = null;\n if (! empty($properties['createdate']) && strtotime($properties['createdate'])) {\n $date = $this->parseCleanDatetime($properties['createdate']);\n $remotelyCreatedAt = $date?->format('Y-m-d H:i:s');\n }\n\n $closedStages = $this->getClosedDealStages();\n $isWon = in_array($properties['dealstage'], $closedStages['won']);\n $isLost = in_array($properties['dealstage'], $closedStages['lost']);\n\n $data = [\n 'team_id' => $this->team->getId(),\n 'user_id' => $profile ? $profile->user_id : null,\n 'owner_id' => $ownerId,\n 'name' => $name,\n 'value' => ! empty($amount) ? $amount : null,\n 'currency_code' => CurrencyFormatter::formatCode($currency),\n 'close_date' => $closeDate,\n 'is_closed' => $isWon || $isLost,\n 'is_won' => $isWon,\n 'remotely_created_at' => $remotelyCreatedAt,\n 'probability' => $this->resolveDealProbability($properties['hs_deal_stage_probability']),\n 'forecast_category' => $this->resolveForecastCategory($properties['hs_manual_forecast_category']),\n ];\n\n if ($accountId) {\n $data['account_id'] = $accountId;\n }\n\n if ($stage) {\n $data['stage_id'] = $stage->id;\n }\n\n if ($businessProcess) {\n $recordType = $this->crmEntityRepository->getBusinessProcessRecordType($businessProcess);\n if ($recordType) {\n $data['record_type_id'] = $recordType->id;\n }\n }\n\n return $data;\n }\n\n private function resolveBusinessProcess(?string $pipelineId): ?BusinessProcess\n {\n if ($pipelineId === null) {\n return null;\n }\n\n $cacheKey = $this->getBusinessProcessCacheKey($pipelineId);\n if (isset($this->cachedBusinessProcesses[$cacheKey])) {\n return $this->cachedBusinessProcesses[$cacheKey];\n }\n\n $businessProcess = $this->getBusinessProcess($pipelineId);\n\n if (! $businessProcess instanceof BusinessProcess) {\n $this->importStages();\n $businessProcess = $this->getBusinessProcess($pipelineId);\n }\n\n if (! $businessProcess instanceof BusinessProcess) {\n $this->logger->info(\n '[HubSpot] Deal is not attached to a pipeline',\n [\n 'pipeline' => $pipelineId]\n );\n }\n\n $this->cachedBusinessProcesses[$cacheKey] = $businessProcess;\n\n return $businessProcess;\n }\n\n private function getBusinessProcess(string $pipelineId): ?BusinessProcess\n {\n return $this->crmEntityRepository->findBusinessProcessesByExternalId($this->config, $pipelineId);\n }\n\n private function getBusinessProcessCacheKey(string $pipelineId): string\n {\n return $this->config->getId() . '_' . $pipelineId;\n }\n\n private function resolveStage(BusinessProcess $businessProcess, ?string $stageId): ?Stage\n {\n if (empty($stageId)) {\n return null;\n }\n\n $cacheKey = $businessProcess->getId() . ':' . $stageId;\n if (isset($this->cachedStages[$cacheKey])) {\n return $this->cachedStages[$cacheKey];\n }\n\n $stage = $this->crmEntityRepository->getPipelineStageByConditions(\n $businessProcess,\n [\n 'crm_provider_id' => $stageId,\n 'type' => Stage::TYPE_OPPORTUNITY,\n ]\n );\n\n if ($stage === null) {\n $this->importStages(null, $stageId);\n }\n\n if ($stage === null) {\n $this->logger->info('[HubSpot] Stage does not exist => ' . $stageId);\n }\n\n $this->cachedStages[$cacheKey] = $stage;\n\n return $stage;\n }\n\n private function resolveAmount(array $properties): ?string\n {\n $amount = null;\n if (! empty($properties['amount'])) {\n $amount = str_replace(',', '', $properties['amount']);\n }\n\n if ($this->config->hasDefaultCurrencyFieldSet()) {\n $valueFieldName = $this->config->getDefaultCurrencyField()->getCrmProviderId();\n $amount = $properties[$valueFieldName] ?? $amount;\n }\n\n return $amount;\n }\n\n private function parseCleanDatetime(string $datetime): ?Carbon\n {\n // Treat pre-1980 values as invalid\n $minValidDate = Carbon::parse('1980-01-01 00:00:00');\n\n try {\n $date = Carbon::parse($datetime);\n\n if ($minValidDate->gt($date)) {\n return null;\n }\n\n return $date;\n } catch (Exception) {\n return null; // On parse error, treat as null\n }\n }\n\n private function resolveDealProbability(?string $stageProbability): int\n {\n if ($stageProbability === null) {\n return 0;\n }\n\n $probability = (float) $stageProbability;\n\n return $probability > 1 ? 0 : (int) ($probability * 100);\n }\n\n private function resolveForecastCategory(?string $forecastCategory): string\n {\n if (! $forecastCategory) {\n return Forecast::FORECAST_CATEGORY_UNCATEGORIZED;\n }\n\n $forecastCategory = str_replace('_', ' ', $forecastCategory);\n\n return ucwords(strtolower($forecastCategory));\n }\n\n private function importExternalFieldData(array $properties, int $opportunityId): void\n {\n $crmFields = $this->getOpportunitySyncableFields();\n $this->importOpportunityCrmFieldData($properties, $crmFields, $opportunityId);\n }\n\n private function importOpportunityContacts(Opportunity $opportunity, array $associations): void\n {\n // Handle empty or missing contact associations\n if (empty($associations)) {\n // Remove all existing contact associations if none provided\n $this->removeAllOpportunityContacts($opportunity);\n\n return;\n }\n\n // Use differential sync approach for better performance and accuracy\n $this->syncOpportunityContactsDifferential($opportunity, $associations);\n }\n\n /**\n * Sync opportunity contacts using differential approach\n * This compares current vs new associations and only makes necessary changes\n */\n private function syncOpportunityContactsDifferential(Opportunity $opportunity, array $contactAssociations): void\n {\n $currentContactCrmIds = $this->getCurrentContactCrmIds($opportunity);\n $contactAssociationIds = array_keys($contactAssociations);\n\n $contactsToAdd = array_diff($contactAssociationIds, $currentContactCrmIds);\n $contactsToRemove = array_diff($currentContactCrmIds, $contactAssociationIds);\n\n if (empty($contactsToAdd) && empty($contactsToRemove)) {\n return;\n }\n\n $this->logContactAssociationChanges($opportunity, $currentContactCrmIds, $contactAssociations, $contactsToAdd, $contactsToRemove);\n\n $this->removeContactAssociations($opportunity, $contactsToRemove);\n $this->addContactAssociations($opportunity, $contactsToAdd, $contactAssociations);\n }\n\n private function getCurrentContactCrmIds(Opportunity $opportunity): array\n {\n return $opportunity->contacts()\n ->pluck('contacts.crm_provider_id')\n ->toArray();\n }\n\n private function logContactAssociationChanges(\n Opportunity $opportunity,\n array $currentContactCrmIds,\n array $contactAssociations,\n array $contactsToAdd,\n array $contactsToRemove\n ): void {\n $this->logger->info('[' . $this->getDisplayName() . '] Contact association changes', [\n 'opportunity_id' => $opportunity->getId(),\n 'current_contacts' => $currentContactCrmIds,\n 'new_contacts' => $contactAssociations,\n 'contacts_to_add' => $contactsToAdd,\n 'contacts_to_remove' => $contactsToRemove,\n ]);\n }\n\n private function removeContactAssociations(Opportunity $opportunity, array $contactsToRemove): void\n {\n if (empty($contactsToRemove)) {\n return;\n }\n\n $contactsToDetach = $opportunity->contacts()\n ->whereIn('contacts.crm_provider_id', $contactsToRemove)\n ->pluck('contacts.id')\n ->toArray();\n\n if (! empty($contactsToDetach)) {\n $opportunity->contacts()->detach($contactsToDetach);\n\n $this->logger->info('[' . $this->getDisplayName() . '] Removed contact associations', [\n 'opportunity_id' => $opportunity->getId(),\n 'removed_contact_crm_ids' => $contactsToRemove,\n 'removed_contact_count' => count($contactsToDetach),\n ]);\n }\n }\n\n private function addContactAssociations(Opportunity $opportunity, array $contactsToAdd, array $contactAssociations): void\n {\n if (empty($contactsToAdd)) {\n return;\n }\n\n $contactsAdded = [];\n foreach ($contactsToAdd as $crmId) {\n $id = $contactAssociations[$crmId];\n\n if ($this->attachSingleContact($opportunity, (string) $crmId, $id)) {\n $contactsAdded[] = $crmId;\n }\n }\n\n $this->logAddedContacts($opportunity, $contactsAdded);\n }\n\n private function attachSingleContact(Opportunity $opportunity, string $crmId, int $id): bool\n {\n try {\n $contact = $this->crmEntityRepository->findContactByConfigurationAndId($this->config, $id);\n\n if (! $contact) {\n return false;\n }\n\n return $this->performContactAttachment($opportunity, $contact, $crmId);\n } catch (\\Throwable $e) {\n $this->logger->warning('[' . $this->getDisplayName() . '] Failed to add contact association', [\n 'opportunity_id' => $opportunity->getId(),\n 'contact_crm_id' => $crmId,\n 'error' => $e->getMessage(),\n ]);\n\n return false;\n }\n }\n\n private function performContactAttachment(Opportunity $opportunity, Contact $contact, string $crmId): bool\n {\n try {\n $opportunity->contacts()->attach($contact->getId(), [\n 'crm_provider_id' => $crmId,\n ]);\n\n return true;\n } catch (\\Illuminate\\Database\\QueryException $e) {\n if (str_contains($e->getMessage(), 'Duplicate entry')) {\n $this->logger->info('[' . $this->getDisplayName() . '] Contact association already exists', [\n 'contact_id' => $contact->getId(),\n 'contact_crm_id' => $crmId,\n 'opportunity_id' => $opportunity->getId(),\n ]);\n\n return false;\n }\n\n throw $e;\n }\n }\n\n private function logAddedContacts(Opportunity $opportunity, array $contactsAdded): void\n {\n if (! empty($contactsAdded)) {\n $this->logger->info('[' . $this->getDisplayName() . '] Added contact associations', [\n 'opportunity_id' => $opportunity->getId(),\n 'added_contact_crm_ids' => $contactsAdded,\n 'added_contacts_count' => count($contactsAdded),\n ]);\n }\n }\n}","role_description":"text entry area","is_enabled":true,"is_focused":true,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Execute","depth":4,"bounds":{"left":0.5265958,"top":0.074221864,"width":0.008643617,"height":0.01915403},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Explain Plan","depth":4,"bounds":{"left":0.53523934,"top":0.074221864,"width":0.008643617,"height":0.01915403},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Browse Query History","depth":4,"bounds":{"left":0.5462101,"top":0.074221864,"width":0.008643617,"height":0.01915403},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"View Parameters","depth":4,"bounds":{"left":0.55485374,"top":0.074221864,"width":0.008643617,"height":0.01915403},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Open Query Execution Settings…","depth":4,"bounds":{"left":0.56349736,"top":0.074221864,"width":0.008643617,"height":0.01915403},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"In-Editor Results","depth":4,"bounds":{"left":0.5744681,"top":0.074221864,"width":0.008643617,"height":0.01915403},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Tx: Auto","depth":4,"bounds":{"left":0.58543885,"top":0.074221864,"width":0.024268618,"height":0.01915403},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Cancel Running Statements","depth":4,"bounds":{"left":0.61203456,"top":0.074221864,"width":0.008643617,"height":0.01915403},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Playground","depth":4,"bounds":{"left":0.62300533,"top":0.074221864,"width":0.029587766,"height":0.01915403},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"jiminny","depth":4,"bounds":{"left":0.9587766,"top":0.074221864,"width":0.02825798,"height":0.01915403},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.042220745,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"6","depth":4,"bounds":{"left":0.94514626,"top":0.09896249,"width":0.007978723,"height":0.015163607},"role_description":"text"},{"role":"AXStaticText","text":"1","depth":4,"bounds":{"left":0.95511967,"top":0.09896249,"width":0.00731383,"height":0.015163607},"role_description":"text"},{"role":"AXStaticText","text":"6","depth":4,"bounds":{"left":0.9644282,"top":0.09896249,"width":0.007978723,"height":0.015163607},"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.9740692,"top":0.09736632,"width":0.00731383,"height":0.018355945},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"bounds":{"left":0.98138297,"top":0.09736632,"width":0.006981383,"height":0.018355945},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"# **************************** HS **************************************\n\nselect * from teams where id = 2; # 2\nselect * from features; # 2\nselect * from team_features where team_id = 2; # 2\nselect * from crm_configurations where id = 2; # 2\nselect * from users where team_id = 2; #\nselect * from playbooks where team_id = 2; # event 38\nselect * from playbook_categories where playbook_id = 38; #\n\nSELECT * FROM activities WHERE crm_configuration_id = 2 and crm_provider_id is not null order by id desc;\nhttps://app.hubspot.com/contacts/4392066/deal/16964514951/?engagement=96069102624\n https://app.staging.jiminny.com/playback/d5df34dc-bd66-4ff5-a7b3-8d3be30322a0\n\nSELECT * FROM activities WHERE uuid_to_bin('04fdcd0d-818f-4c53-92dc-6f18bc753ffd') = uuid;\n# 609126 softphone tr. 11241\n\nSELECT * FROM activities WHERE uuid_to_bin('6521bfcd-5a30-46e5-9f74-5440fd48befd') = uuid;\n# 608874 conference tr. 11226 crmId: 103422236596\n\nselect * from ai_prompts where transcription_id IN (11241, 11226);\nselect * from activity_summary_logs where activity_id = 608874;\n\nselect * from sidekick_settings;\nselect * from default_activity_types;\n\nselect * from crm_field_data where activity_id = 1223;\n\nselect * from crm_layouts where crm_configuration_id = 2;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id IN (554);\nselect * from crm_fields where crm_configuration_id = 11 and object_type = 'event';\nSELECT * FROM crm_field_values WHERE crm_field_id IN (1455,1450);\n\nSELECT * FROM crm_field_data WHERE crm_layout_entity_id = 971;\nSELECT * FROM crm_field_data WHERE crm_layout_entity_id IN (6494,6495,6496,6497,6498,6499);\n\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u\n on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 2 and sa.provider = 'hubspot';\n\nselect * from opportunities where team_id = 2\nand crm_provider_id IN ('51317301383');\n\nselect * from contacts where id = 85;\n\nselect * from opportunities where team_id = 2 order by id desc;\nselect * from opportunities where team_id = 2 and crm_provider_id = '51317301383'; # 5112\nselect * from opportunities where team_id = 2 and crm_provider_id = '55976759904'; # 5112\nselect * from opportunity_contacts where opportunity_id = 5117;\nselect * from crm_field_data where object_id = 1365;\nSELECT * FROM crm_fields WHERE id IN (1405, 1407, 1972, 2128);\n\nselect * from features;\nselect * from team_features where team_id IN (1);\nselect * from team_features where feature_id IN (36);\n\nSHOW CREATE TABLE opportunity_contacts;\nSELECT * FROM opportunity_contacts WHERE crm_provider_id = '111751';\n\n# $slug = 'HUBSPOT_WEBHOOK_SYNC';\n# $team = Jiminny\\Models\\Team::find(2);\n# $feature = Feature::query()->where('slug', $slug)->first();\n# TeamFeature::query()->create(['feature_id' => $feature->getId(),'team_id' => $team->getId()]);\n\n# hubspot_webhook_metrics\n\nselect * from opportunities where team_id = 2 and crm_provider_id IN ('374720564','14527423589','49908861993','50435771779'); # 1365\nSELECT * FROM opportunity_contacts WHERE opportunity_id = '414';\nSELECT * FROM opportunity_contacts WHERE crm_provider_id = '131501';\nselect * from contacts where id in (414, 464);\n\nselect * from activities where crm_configuration_id = 2;\n\nselect settings from crm_configurations where id = 11;\n\nselect * from teams; # 1, 2\nselect * from users;\nselect * from crm_configurations where id = 39;\nselect * from team_features where team_id = 2;\nselect * from features;\n# SELECT * FROM opportunities WHERE crm_configuration_id = 2\n# order by id desc;\n# and crm_provider_id = '49908861993';\n\n\nselect * from activity_providers where id IN (443, 202, 203, 227);\n\nselect * from activity_imports where id = 795889;\n\nselect c.id, c.provider, c.settings, t.* from teams t join crm_configurations c on t.id = c.team_id\nwhere c.provider = 'hubspot';\n\nselect * from crm_configurations crm JOIN teams t on crm.team_id = t.id\nwhere provider = 'hubspot';\nSELECT * FROM teams WHERE id = 31;\nSELECT * FROM users WHERE id = 257;\nSELECT * FROM opportunities WHERE team_id = 2;\n\nselect * from opportunity_contacts where opportunity_id = 5124;\nselect * from contacts where id IN (3850,3853,3851,4073,4140,4155,4480,4530,4623,5986,513,687,1806,1523,3613)\n\nselect * from activities where crm_configuration_id = 13;\n\nSELECT * FROM activities WHERE uuid_to_bin('826619ce-ec8e-4e59-8467-a01f5f6ad71e') = uuid; # 418141\n\n\nselect id, team_id, crm_provider_id from crm_configurations where provider = 'hubspot' and crm_provider_id IS NOT NULL;\nSELECT * FROM accounts WHERE team_id = 2 and crm_provider_id = '1212213464' order by id desc;\nSELECT * FROM contacts WHERE team_id = 2 and account_id = 5189 order by id desc;\nSELECT * FROM contacts WHERE team_id = 2 order by id desc;\nselect * from opportunity_contacts where contact_id = 6223;\nSELECT * FROM opportunities WHERE team_id = 2 and account_id = 5189 order by id desc;\n\nselect * from crm_profiles where crm_configuration_id = 2;\n\nselect * from activities where account_id = 46;","depth":4,"value":"# **************************** HS **************************************\n\nselect * from teams where id = 2; # 2\nselect * from features; # 2\nselect * from team_features where team_id = 2; # 2\nselect * from crm_configurations where id = 2; # 2\nselect * from users where team_id = 2; #\nselect * from playbooks where team_id = 2; # event 38\nselect * from playbook_categories where playbook_id = 38; #\n\nSELECT * FROM activities WHERE crm_configuration_id = 2 and crm_provider_id is not null order by id desc;\nhttps://app.hubspot.com/contacts/4392066/deal/16964514951/?engagement=96069102624\n https://app.staging.jiminny.com/playback/d5df34dc-bd66-4ff5-a7b3-8d3be30322a0\n\nSELECT * FROM activities WHERE uuid_to_bin('04fdcd0d-818f-4c53-92dc-6f18bc753ffd') = uuid;\n# 609126 softphone tr. 11241\n\nSELECT * FROM activities WHERE uuid_to_bin('6521bfcd-5a30-46e5-9f74-5440fd48befd') = uuid;\n# 608874 conference tr. 11226 crmId: 103422236596\n\nselect * from ai_prompts where transcription_id IN (11241, 11226);\nselect * from activity_summary_logs where activity_id = 608874;\n\nselect * from sidekick_settings;\nselect * from default_activity_types;\n\nselect * from crm_field_data where activity_id = 1223;\n\nselect * from crm_layouts where crm_configuration_id = 2;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id IN (554);\nselect * from crm_fields where crm_configuration_id = 11 and object_type = 'event';\nSELECT * FROM crm_field_values WHERE crm_field_id IN (1455,1450);\n\nSELECT * FROM crm_field_data WHERE crm_layout_entity_id = 971;\nSELECT * FROM crm_field_data WHERE crm_layout_entity_id IN (6494,6495,6496,6497,6498,6499);\n\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u\n on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 2 and sa.provider = 'hubspot';\n\nselect * from opportunities where team_id = 2\nand crm_provider_id IN ('51317301383');\n\nselect * from contacts where id = 85;\n\nselect * from opportunities where team_id = 2 order by id desc;\nselect * from opportunities where team_id = 2 and crm_provider_id = '51317301383'; # 5112\nselect * from opportunities where team_id = 2 and crm_provider_id = '55976759904'; # 5112\nselect * from opportunity_contacts where opportunity_id = 5117;\nselect * from crm_field_data where object_id = 1365;\nSELECT * FROM crm_fields WHERE id IN (1405, 1407, 1972, 2128);\n\nselect * from features;\nselect * from team_features where team_id IN (1);\nselect * from team_features where feature_id IN (36);\n\nSHOW CREATE TABLE opportunity_contacts;\nSELECT * FROM opportunity_contacts WHERE crm_provider_id = '111751';\n\n# $slug = 'HUBSPOT_WEBHOOK_SYNC';\n# $team = Jiminny\\Models\\Team::find(2);\n# $feature = Feature::query()->where('slug', $slug)->first();\n# TeamFeature::query()->create(['feature_id' => $feature->getId(),'team_id' => $team->getId()]);\n\n# hubspot_webhook_metrics\n\nselect * from opportunities where team_id = 2 and crm_provider_id IN ('374720564','14527423589','49908861993','50435771779'); # 1365\nSELECT * FROM opportunity_contacts WHERE opportunity_id = '414';\nSELECT * FROM opportunity_contacts WHERE crm_provider_id = '131501';\nselect * from contacts where id in (414, 464);\n\nselect * from activities where crm_configuration_id = 2;\n\nselect settings from crm_configurations where id = 11;\n\nselect * from teams; # 1, 2\nselect * from users;\nselect * from crm_configurations where id = 39;\nselect * from team_features where team_id = 2;\nselect * from features;\n# SELECT * FROM opportunities WHERE crm_configuration_id = 2\n# order by id desc;\n# and crm_provider_id = '49908861993';\n\n\nselect * from activity_providers where id IN (443, 202, 203, 227);\n\nselect * from activity_imports where id = 795889;\n\nselect c.id, c.provider, c.settings, t.* from teams t join crm_configurations c on t.id = c.team_id\nwhere c.provider = 'hubspot';\n\nselect * from crm_configurations crm JOIN teams t on crm.team_id = t.id\nwhere provider = 'hubspot';\nSELECT * FROM teams WHERE id = 31;\nSELECT * FROM users WHERE id = 257;\nSELECT * FROM opportunities WHERE team_id = 2;\n\nselect * from opportunity_contacts where opportunity_id = 5124;\nselect * from contacts where id IN (3850,3853,3851,4073,4140,4155,4480,4530,4623,5986,513,687,1806,1523,3613)\n\nselect * from activities where crm_configuration_id = 13;\n\nSELECT * FROM activities WHERE uuid_to_bin('826619ce-ec8e-4e59-8467-a01f5f6ad71e') = uuid; # 418141\n\n\nselect id, team_id, crm_provider_id from crm_configurations where provider = 'hubspot' and crm_provider_id IS NOT NULL;\nSELECT * FROM accounts WHERE team_id = 2 and crm_provider_id = '1212213464' order by id desc;\nSELECT * FROM contacts WHERE team_id = 2 and account_id = 5189 order by id desc;\nSELECT * FROM contacts WHERE team_id = 2 order by id desc;\nselect * from opportunity_contacts where contact_id = 6223;\nSELECT * FROM opportunities WHERE team_id = 2 and account_id = 5189 order by id desc;\n\nselect * from crm_profiles where crm_configuration_id = 2;\n\nselect * from activities where account_id = 46;","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Project","depth":3,"role_description":"text"},{"role":"AXButton","text":"Project","depth":3,"bounds":{"left":0.011968086,"top":0.047885075,"width":0.024268618,"height":0.024740623},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"New File or Directory…","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Expand Selected","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Collapse All","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Options","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
-7827763017813047052
|
1048134296968532324
|
click
|
accessibility
|
NULL
|
Project: faVsco.js, menu
#11976 on JY-20553-debug- Project: faVsco.js, menu
#11976 on JY-20553-debug-crm-sync-delays, menu
Start Listening for PHP Debug Connections
RequestGenerateAskJiminnyReportJobTest
Run 'RequestGenerateAskJiminnyReportJobTest'
Debug 'RequestGenerateAskJiminnyReportJobTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Code changed:
Hide
Sync Changes
Hide This Notification
33
2
19
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Services\Crm\Hubspot\ServiceTraits;
use Carbon\Carbon;
use HubSpot\Client\Crm\Deals\Model\CollectionResponseAssociatedId;
use Jiminny\Exceptions\InvalidArgumentException;
use Jiminny\Models\Account;
use Exception;
use Jiminny\Component\DealInsights\Forecast\Forecast;
use Jiminny\Jobs\Crm\MatchActivitiesToNewOpportunity;
use Jiminny\Models\Contact;
use Jiminny\Models\Crm\BusinessProcess;
use Jiminny\Exceptions\CrmException;
use Jiminny\Models\Opportunity;
use Illuminate\Support\Collection;
use Jiminny\Models\Stage;
use Jiminny\Repositories\Crm\CrmEntityRepository;
use Jiminny\Services\Crm\Hubspot\DealFieldsService;
use Jiminny\Services\Crm\Hubspot\OpportunitySyncStrategy\HubspotSingleSyncStrategy;
use Jiminny\Services\Crm\Hubspot\WebhookSyncBatchProcessor;
use Jiminny\Services\Crm\OpportunitySyncStrategyResolver;
use Jiminny\Utils\CurrencyFormatter;
/**
* Optimized sync methods for better performance
* These methods can be integrated into SyncCrmEntitiesTrait for significant performance gains
*/
trait OpportunitySyncTrait
{
private const int BATCH_SIZE = 100;
private const int BATCH_PROCESS_SIZE = 800;
protected OpportunitySyncStrategyResolver $opportunitySyncStrategyResolver;
protected CrmEntityRepository $crmEntityRepository;
protected DealFieldsService $dealFieldsService;
private ?array $cachedClosedDealStages = null;
private array $cachedBusinessProcesses = [];
private array $cachedStages = [];
public function syncOpportunities(array $parameters, ?string $strategy = null): int
{
$startTime = microtime(true);
$strategies = $this->opportunitySyncStrategyResolver->getStrategies($this->config, $strategy);
$parameters['config'] = $this->config;
$syncCount = 0;
$reportedTotal = 0;
$lastSyncedId = [];
$strategyNames = [];
try {
foreach ($strategies as $strategyName => $syncStrategy) {
$strategyNames[] = $strategyName;
$this->logger->info(
'[' . $this->getDisplayName() . '] Syncing opportunities using strategy: ' . $strategyName,
['team' => $this->team->getId()]
);
$total = 0;
$lastId = null;
$buffer = [];
// HubspotWebhookBatchSyncStrategy returns empty generator, this is for other strategies
foreach ($syncStrategy->fetchOpportunities($parameters, $total, $lastId) as $hsOpportunity) {
$buffer[] = $hsOpportunity;
// process every 800 rows (fits < 1 000 association limit)
if (\count($buffer) >= self::BATCH_PROCESS_SIZE) {
$syncCount += $this->processOpportunityBatch($buffer);
$buffer = [];
}
}
// leftovers
if ($buffer) {
$syncCount += $this->processOpportunityBatch($buffer);
}
$reportedTotal += $total;
$lastSyncedId = $lastId;
}
} catch (\HubSpot\Client\Crm\Deals\ApiException | CrmException $e) {
$this->handleSyncException($e, $parameters);
}
$durationMs = round((microtime(true) - $startTime) * 1000, 2);
$this->logger->info(
'[HubSpot] Synced opportunities',
[
'team' => $this->team->getId(),
'strategies' => implode(',', $strategyNames),
'sync_count' => $syncCount,
'total' => $reportedTotal,
'last_synced_id' => $lastSyncedId,
'duration_ms' => $durationMs,
]
);
return $reportedTotal;
}
private function handleSyncException(\Throwable $e, array $parameters): void
{
if (($parameters['since'] ?? null) instanceof Carbon) {
$parameters['since'] = $parameters['since']->toDateTimeString();
}
$parameters['config'] = $this->config->getId();
$this->logger->warning('[' . $this->getDisplayName() . '] Sync opportunities failed', [
'teamId' => $this->team->getUuid(),
'parameters' => $parameters,
'reason' => $e->getMessage(),
]);
}
/**
* @inheritdoc
*/
public function syncOpportunity(string $crmId): ?Opportunity
{
$strategy = $this->opportunitySyncStrategyResolver->resolve(
$this->config,
OpportunitySyncStrategyResolver::SINGLE_SYNC_OPPORTUNITY_STRATEGY,
);
$parameters = [
'config' => $this->config,
'crm_id' => $crmId,
];
try {
if (! $strategy instanceof HubspotSingleSyncStrategy) {
throw new InvalidArgumentException('Strategy must by HubspotSingleSyncStrategy');
}
$hsOpportunity = $strategy->fetchOpportunity($parameters);
} catch (\HubSpot\Client\Crm\Deals\ApiException $e) {
$this->logger->info('[' . $this->getDisplayName() . '] Opportunity not found', [
'teamId' => $this->team->getUuid(),
'crmId' => $crmId,
'reason' => $e->getMessage(),
]);
return null;
}
$hsOpportunity['associations'] = $this->convertDealAssociations($hsOpportunity['associations'] ?? []);
return $this->importOrUpdateOpportunity($hsOpportunity);
}
/**
* Process webhook-collected opportunity batches.
*
* Drains Redis sets containing company CRM IDs collected from webhook events
* and dispatches ImportOpportunityBatch jobs for batch processing.
*
* @return int Number of opportunity IDs dispatched to jobs
*/
public function batchSyncOpportunities(): int
{
$configId = $this->team->getCrmConfiguration()->getId();
return $this->batchProcessor->processBatchesForObjectType(
WebhookSyncBatchProcessor::OBJECT_TYPE_DEAL,
$configId
);
}
/**
* Import a batch of opportunities by their CRM IDs.
* Fetches opportunity data from HubSpot API and delegates to importOpportunityBatch().
*
* @param array<string> $crmIds HubSpot deal CRM IDs
*
* @return array{success: array, failed_ids: array, errors?: array<string, string>}
*/
public function importOpportunityBatchByIds(array $crmIds): array
{
$fields = $this->dealFieldsService->getFieldsForConfiguration($this->config);
$allDeals = [];
foreach (array_chunk($crmIds, self::BATCH_SIZE) as $chunk) {
$deals = $this->client->getOpportunitiesByIds($chunk, $fields);
foreach ($deals as $deal) {
$allDeals[] = $deal;
}
}
// IDs not returned by HubSpot are likely deleted or inaccessible deals.
// These are not failures — retrying won't bring them back.
$fetchedIds = array_map('strval', array_column($allDeals, 'id'));
$notFoundIds = array_values(array_diff(array_map('strval', $crmIds), $fetchedIds));
if (! empty($notFoundIds)) {
$this->logger->info('[' . $this->getDisplayName() . '] CRM IDs not found in HubSpot (likely deleted)', [
'teamId' => $this->team->getId(),
'notFoundCount' => \count($notFoundIds),
'notFoundIds' => $notFoundIds,
'requestedCount' => \count($crmIds),
'fetchedCount' => \count($allDeals),
]);
}
if (empty($allDeals)) {
return ['success' => [], 'failed_ids' => []];
}
return $this->importOpportunityBatch($allDeals);
}
private function getClosedDealStages(): array
{
if ($this->cachedClosedDealStages !== null) {
return $this->cachedClosedDealStages;
}
$stages = $this->crmEntityRepository->getOpportunityClosedStages($this->config);
$data = [
'lost' => [],
'won' => [],
];
foreach ($stages as $stage) {
if ($stage->probability == 0.00) {
$data['lost'][] = $stage->crm_provider_id;
}
if ($stage->probability == 100.00) {
$data['won'][] = $stage->crm_provider_id;
}
}
$this->cachedClosedDealStages = $data;
return $data;
}
/**
* Import deals into the database with pre-fetched associations.
*
* API calls here (getAssociationsData, getExistingOpportunityCrmIds) are NOT
* caught — if they throw, the exception propagates to ImportOpportunityBatch::handle()
* where Laravel retries the whole job with backoff. After all retries exhausted,
* failed() requeues all IDs to Redis.
*
* The per-deal loop catches exceptions individually. A deal can end up in three states:
* - success: imported/updated successfully
* - failed_ids: exception thrown (DB constraint violation, corrupt data, etc.)
* These are permanent issues — retrying won't fix them.
* - skipped (null): missing dependencies (no account, unknown pipeline/stage).
* This is acceptable — the deal cannot be imported until those exist.
*/
private function importOpportunityBatch(array $deals): array
{
$syncedOpportunities = [
'success' => [],
'failed_ids' => [],
];
$dealIds = array_column($deals, 'id');
// Shared association/existing-ID preparation is batch-level state. If it fails, rethrow so the
// queue job retries the whole batch and eventually requeues all deal IDs back to Redis.
try {
$companyAssociations = $this->client->getAssociationsData($dealIds, 'deals', 'companies');
$contactAssociations = $this->client->getAssociationsData($dealIds, 'deals', 'contacts');
$associationsData = $this->prepareAssociatedEntities($companyAssociations, $contactAssociations);
$existingCrmIds = $this->crmEntityRepository->getExistingOpportunityCrmIds(
$this->config,
array_map('strval', $dealIds)
);
$existingCrmIdSet = array_flip($existingCrmIds);
} catch (\Throwable $e) {
$this->logger->error('[' . $this->getDisplayName() . '] Failed to fetch associations or existing IDs', [
'teamId' => $this->team->getId(),
'dealCount' => count($dealIds),
'error' => $e->getMessage(),
]);
throw $e;
}
foreach ($deals as $deal) {
try {
$deal['associations'] = $this->prepareAssociationsForOpportunity(
$deal['id'],
$companyAssociations,
$contactAssociations,
$associationsData
);
$syncedOpportunity = $this->importOrUpdateOpportunity(
$deal,
isset($existingCrmIdSet[(string) $deal['id']])
);
if ($syncedOpportunity) {
$syncedOpportunities['success'][] = $syncedOpportunity;
}
} catch (\Throwable $e) {
$this->logger->warning('[' . $this->getDisplayName() . '] Failed to import opportunity', [
'teamId' => $this->team->getId(),
'crmId' => $deal['id'],
'error' => $e->getMessage(),
]);
$syncedOpportunities['failed_ids'][] = $deal['id'];
$syncedOpportunities['errors'][$deal['id']] = $e->getMessage();
}
}
return $syncedOpportunities;
}
/**
* Prepare associated entities for opportunities with optimized batch processing
* Returns structured data with CRM ID to DB ID mappings for each opportunity
*/
private function prepareAssociatedEntities(array $companyAssociations, array $contactAssociations): array
{
// Step 1: Collect all unique company and contact IDs from associations
$allCompanyIds = $this->flattenAssociationIds($companyAssociations);
$allContactIds = $this->flattenAssociationIds($contactAssociations);
// Step 2: Batch sync missing entities and get CRM ID to DB ID mappings
$companyIdMappings = [];
$contactIdMappings = [];
if (! empty($allCompanyIds)) {
$companyIdMappings = $this->prepareAssociatedAccounts($allCompanyIds);
}
if (! empty($allContactIds)) {
$contactIdMappings = $this->prepareAssociatedContacts($allContactIds);
}
return [
'company_id_mappings' => $companyIdMappings,
'contact_id_mappings' => $contactIdMappings,
];
}
/**
* Flatten association data to get unique IDs
*/
private function flattenAssociationIds(array $associations): array
{
$ids = [];
foreach ($associations as $dealAssociations) {
if (is_array($dealAssociations)) {
foreach ($dealAssociations as $id) {
$ids[$id] = true;
}
}
}
return array_keys($ids);
}
/**
* Batch sync missing accounts
*/
private function prepareAssociatedAccounts(array $companyIds): array
{
// Find which accounts already exist
$existingAccounts = $this->crmEntityRepository
->findAccountsByExternalIds($this->config, $companyIds);
$existingCompanyIds = $existingAccounts->pluck('crm_provider_id')->toArray();
$existingAccountsData = $existingAccounts->mapWithKeys(function ($account) {
return [$account->getCrmProviderId() => $account->getId()];
})->toArray();
$missingCompanyIds = array_diff($companyIds, $existingCompanyIds);
if (empty($missingCompanyIds)) {
return $existingAccountsData;
}
$this->logger->info('[' . $this->getDisplayName() . '] Batch syncing missing accounts', [
'teamId' => $this->team->getUuid(),
'total_companies' => count($companyIds),
'existing_companies' => count($existingCompanyIds),
'missing_companies' => count($missingCompanyIds),
]);
// we already have limit on opportunity ids count
// Initialize variable before try block
$syncedAccountsData = [];
try {
$syncedAccountsData = $this->batchSyncCrmObjects('companies', $missingCompanyIds);
} catch (\Throwable $e) {
$this->logger->warning('[' . $this->getDisplayName() . '] Failed to sync missing accounts', [
'size' => count($missingCompanyIds),
'error' => $e->getMessage(),
]);
$syncedAccountsData = [];
}
return $existingAccountsData + $syncedAccountsData;
}
/**
* Prepare associated contacts - find existing and sync missing ones
* Returns mapping of CRM ID to DB ID
*/
private function prepareAssociatedContacts(array $contactIds): array
{
// Find which contacts already exist
$existingContacts = $this->crmEntityRepository
->findContactsByExternalIds($this->config, $contactIds);
$existingContactIds = $existingContacts->pluck('crm_provider_id')->toArray();
// Create mapping for existing contacts
$existingContactsData = $existingContacts->mapWithKeys(function ($contact) {
return [$contact->getCrmProviderId() => $contact->getId()];
})->toArray();
$missingContactIds = array_diff($contactIds, $existingContactIds);
if (empty($missingContactIds)) {
return $existingContactsData;
}
$this->logger->info('[' . $this->getDisplayName() . '] Batch syncing missing contacts', [
'teamId' => $this->team->getUuid(),
'total_contacts' => count($contactIds),
'existing_contacts' => count($existingContactIds),
'missing_contacts' => count($missingContactIds),
]);
// Sync missing contacts using batch API
try {
$syncedContactsData = $this->batchSyncCrmObjects('contacts', $missingContactIds);
} catch (\Throwable $e) {
$this->logger->warning('[' . $this->getDisplayName() . '] Failed to sync missing contacts', [
'size' => count($missingContactIds),
'error' => $e->getMessage(),
]);
$syncedContactsData = [];
}
return $existingContactsData + $syncedContactsData;
}
private function batchSyncCrmObjects(string $objectType, array $crmIds): array
{
$syncObjects = [];
$crmObjectIds = array_values($crmIds);
foreach (array_chunk($crmObjectIds, self::BATCH_SIZE) as $chunk) {
try {
$objects = $objectType === 'companies' ?
$this->client->getCompaniesByIds($chunk, $this->getCompanyFields()) :
$this->client->getContactsByIds($chunk, $this->getContactFields());
foreach ($objects as $objectId => $objectData) {
$this->importCrmObject($objectType, (string) $objectId, $objectData, $syncObjects);
}
$this->logger->info('[' . $this->getDisplayName() . '] Batch synced ' . $objectType, [
'requested_count' => count($chunk),
'synced_count' => count($objects),
]);
} catch (\Throwable $e) {
$this->logger->warning('[' . $this->getDisplayName() . '] Batch ' . $objectType . ' sync failed', [
'ids' => $chunk,
'error' => $e->getMessage(),
]);
}
}
return $syncObjects;
}
private function importCrmObject(string $objectType, string $objectId, mixed $objectData, array &$syncObjects): void
{
try {
$object = $objectType === 'companies' ?
$this->importAccount($objectData) :
$this->importContact($objectData);
if ($object) {
$syncObjects[$object->getCrmProviderId()] = $object->getId();
}
} catch (\Throwable $e) {
$this->logger->warning('[' . $this->getDisplayName() . '] Failed to import batch ' . $objectType, [
'id' => $objectId,
'error' => $e->getMessage(),
]);
}
}
/**
* Prepare associations for a single opportunity
*
* The return value is an array with the following structure:
* [
* 'companies' => [
* $companyCrmId => $companyId,
* ...
* ],
* 'contacts' => [
* $contactCrmId => $contactId,
* ...
* ],
* 'account_id' => $accountId,
* ]
*/
private function prepareAssociationsForOpportunity(
string $oppCrmId,
array $companyAssociations,
array $contactAssociations,
array $associationsData
): array {
$associations = [
'companies' => [],
'contacts' => [],
'account_id' => null, // Primary account for opportunity
];
$oppCompanyIds = $companyAssociations[$oppCrmId] ?? [];
foreach ($oppCompanyIds as $companyCrmId) {
if (isset($associationsData['company_id_mappings'][$companyCrmId])) {
$associations['companies'][$companyCrmId] = $associationsData['company_id_mappings'][$companyCrmId];
// Set primary account (first company becomes primary account)
if ($associations['account_id'] === null) {
$associations['account_id'] = $associationsData['company_id_mappings'][$companyCrmId];
}
}
}
$oppContactIds = $contactAssociations[$oppCrmId] ?? [];
foreach ($oppContactIds as $contactCrmId) {
if (isset($associationsData['contact_id_mappings'][$contactCrmId])) {
$associations['contacts'][$contactCrmId] = $associationsData['contact_id_mappings'][$contactCrmId];
}
}
return $associations;
}
/**
* Update only associations for an opportunity
*/
private function updateOpportunityAssociations(Opportunity $opportunity, array $associations): void
{
// Update contact associations
$this->importOpportunityContacts($opportunity, $associations['contacts']);
// Update company (account) associations
$this->updateOpportunityAccount($opportunity, $associations['account_id']);
}
/**
* Remove all contact associations from an opportunity
*/
private function removeAllOpportunityContacts(Opportunity $opportunity): void
{
$currentCount = (int) $opportunity->contacts()->count();
if ($currentCount > 0) {
$opportunity->contacts()->detach();
$this->logger->info('[' . $this->getDisplayName() . '] Removed all contact associations', [
'opportunity_id' => $opportunity->getId(),
'removed_count' => $currentCount,
]);
}
}
private function updateOpportunityAccount(Opportunity $opportunity, ?int $accountId): void
{
if ($accountId === null) {
// No account ID provided - keep current account
return;
}
$currentAccountId = $opportunity->getAccountId();
// Only update if account has changed
if ($currentAccountId !== $accountId) {
$opportunity->account_id = $accountId;
$opportunity->save();
$this->logger->info('[' . $this->getDisplayName() . '] Updated opportunity account association', [
'opportunity_id' => $opportunity->getId(),
'old_account_id' => $currentAccountId,
'new_account_id' => $accountId,
]);
}
}
/**
* Find existing opportunities by external IDs (OPTIMIZED VERSION)
* Uses batch query for better performance
*/
private function findExistingOpportunities(array $crmIds): Collection
{
return $this->crmEntityRepository
->findOpportunitiesByExternalIds($this->config, $crmIds);
}
private function processOpportunityBatch(array $opportunities): int
{
$syncedOpportunities = $this->importOpportunityBatch($opportunities);
return count($syncedOpportunities['success'] ?? []);
}
/**
* Convert single deal associations from HubSpot format to internal format
* Handles both HubSpot SDK objects and array formats
*
* @param array $opportunityAssociations Raw associations from HubSpot API or pre-processed
*
* @return array Processed associations with DB IDs
*/
private function convertDealAssociations(array $opportunityAssociations): array
{
$associations = $this->initializeAssociationsStructure();
if (empty($opportunityAssociations)) {
return $associations;
}
$associationIds = $this->extractAssociationIds($opportunityAssociations);
$this->processCompanyAssociations($associationIds, $associations);
$this->processContactAssociations($associationIds, $associations);
return $associations;
}
private function initializeAssociationsStructure(): array
{
return [
'companies' => [],
'contacts' => [],
'account_id' => null, // Primary account for opportunity
];
}
private function extractAssociationIds(array $opportunityAssociations): array
{
$associationIds = [];
foreach ($opportunityAssociations as $type => $associationData) {
if (! empty($associationData)) {
$associationIds[$type] = $this->convertSingleDealAssociations($associationData);
}
}
return $associationIds;
}
private function processCompanyAssociations(array $associationIds, array &$associations): void
{
if (empty($associationIds['companies'])) {
return;
}
$companyId = $associationIds['companies'][0];
$account = $this->findOrSyncAccount($companyId);
if ($account instanceof Account) {
$associations['companies'][$companyId] = $account->getId();
$associations['account_id'] = $account->getId();
}
}
private function processContactAssociations(array $associationIds, array &$associations): void
{
if (empty($associationIds['contacts'])) {
return;
}
foreach ($associationIds['contacts'] as $contactId) {
$contact = $this->findOrSyncContact($contactId);
if ($contact instanceof Contact) {
$associations['contacts'][$contactId] = $contact->getId();
}
}
}
private function findOrSyncAccount(string $companyId): ?Account
{
$account = $this->crmEntityRepository->findAccountByExternalId($this->config, $companyId);
if (! $account instanceof Account) {
$account = $this->syncAccount($companyId);
}
return $account;
}
private function findOrSyncContact(string $contactId): ?Contact
{
$contact = $this->crmEntityRepository->findContactByExternalId($this->config, $contactId);
if (! $contact instanceof Contact) {
$contact = $this->syncContact($contactId);
}
return $contact;
}
private function convertSingleDealAssociations($opportunityAssociations = null): array
{
$associationData = [];
if ($opportunityAssociations === null) {
return $associationData;
}
// Handle array input (from extractAssociationIds)
if (is_array($opportunityAssociations)) {
return $opportunityAssociations;
}
// Handle CollectionResponseAssociatedId object
if ($opportunityAssociations instanceof CollectionResponseAssociatedId) {
foreach ($opportunityAssociations->getResults() as $association) {
$associationData[] = $association->getId();
}
}
return $associationData;
}
private function importOrUpdateOpportunity($crmData, ?bool $exists = null): ?Opportunity
{
if (empty($crmData['properties'])) {
return null;
}
$crmId = (string) $crmData['id'];
$properties = $crmData['properties'];
$associations = $crmData['associations'] ?? [];
$opportunityExists = $exists ?? (bool) $this->crmEntityRepository->findOpportunityByExternalId(
$this->config,
$crmId
);
if ($opportunityExists) {
return $this->updateOpportunity($crmId, $properties, $associations);
}
return $this->createOpportunity($crmId, $properties, $associations);
}
/**
* Create new opportunity
*/
private function createOpportunity(string $crmId, array $properties, array $associations): ?Opportunity
{
$accountId = $this->resolveAccountId($associations);
if (! $accountId) {
return null;
}
$businessProcess = $this->resolveBusinessProcess($properties['pipeline'] ?? null);
if (! $businessProcess) {
return null;
}
$stage = $this->resolveStage($businessProcess, $properties['dealstage'] ?? null);
if (! $stage) {
return null;
}
$data = $this->buildOpportunityData($properties, $accountId, $businessProcess, $stage);
$attributes = [
'crm_configuration_id' => $this->config->getId(),
'crm_provider_id' => $crmId,
];
$values = array_merge($attributes, $data);
$opportunity = $this->crmEntityRepository->upsertOpportunity($attributes, $values);
$this->importExternalFieldData($properties, $opportunity->getId());
$this->importOpportunityContacts($opportunity, $associations['contacts']);
if ($opportunity->wasRecentlyCreated) {
MatchActivitiesToNewOpportunity::dispatch($opportunity->getId());
}
return $opportunity;
}
/**
* Update existing opportunity
*/
private function updateOpportunity(string $crmId, array $properties, array $associations): Opportunity
{
$accountId = $this->resolveAccountId($associations);
$businessProcess = $this->resolveBusinessProcess($properties['pipeline'] ?? null);
$stage = $businessProcess ? $this->resolveStage($businessProcess, $properties['dealstage'] ?? null) : null;
$data = $this->buildOpportunityData($properties, $accountId, $businessProcess, $stage);
$attributes = [
'crm_configuration_id' => $this->config->getId(),
'crm_provider_id' => $crmId,
];
$values = array_merge($attributes, $data);
$opportunity = $this->crmEntityRepository->upsertOpportunity($attributes, $values);
$this->importExternalFieldData($properties, $opportunity->getId());
$this->updateOpportunityAssociations($opportunity, $associations);
return $opportunity;
}
private function resolveAccountId(array $associations): ?int
{
if (! empty($associations['account_id'])) {
return $associations['account_id'];
}
if (empty($associations)) {
return null;
}
// Fallback: use first company as account (currently SDK returns one company)
foreach ($associations['companies'] as $accountId) {
return $accountId;
}
return null;
}
private function buildOpportunityData(
array $properties,
?int $accountId,
?BusinessProcess $businessProcess,
?Stage $stage
): array {
$ownerId = null;
$profile = null;
if (! empty($properties['hubspot_owner_id'])) {
$ownerId = $properties['hubspot_owner_id'];
$profile = $this->crmEntityRepository->findProfileByExternalId($this->config, (string) $ownerId);
}
$name = 'Unknown';
if (isset($properties['dealname'])) {
$name = mb_strimwidth($properties['dealname'], 0, 128);
}
$amount = $this->resolveAmount($properties);
$currency = $properties['deal_currency_code'] ?? null;
$closeDate = null;
if (! empty($properties['closedate'])) {
$closeDate = Carbon::parse($properties['closedate'])->format('Y-m-d');
}
$remotelyCreatedAt = null;
if (! empty($properties['createdate']) && strtotime($properties['createdate'])) {
$date = $this->parseCleanDatetime($properties['createdate']);
$remotelyCreatedAt = $date?->format('Y-m-d H:i:s');
}
$closedStages = $this->getClosedDealStages();
$isWon = in_array($properties['dealstage'], $closedStages['won']);
$isLost = in_array($properties['dealstage'], $closedStages['lost']);
$data = [
'team_id' => $this->team->getId(),
'user_id' => $profile ? $profile->user_id : null,
'owner_id' => $ownerId,
'name' => $name,
'value' => ! empty($amount) ? $amount : null,
'currency_code' => CurrencyFormatter::formatCode($currency),
'close_date' => $closeDate,
'is_closed' => $isWon || $isLost,
'is_won' => $isWon,
'remotely_created_at' => $remotelyCreatedAt,
'probability' => $this->resolveDealProbability($properties['hs_deal_stage_probability']),
'forecast_category' => $this->resolveForecastCategory($properties['hs_manual_forecast_category']),
];
if ($accountId) {
$data['account_id'] = $accountId;
}
if ($stage) {
$data['stage_id'] = $stage->id;
}
if ($businessProcess) {
$recordType = $this->crmEntityRepository->getBusinessProcessRecordType($businessProcess);
if ($recordType) {
$data['record_type_id'] = $recordType->id;
}
}
return $data;
}
private function resolveBusinessProcess(?string $pipelineId): ?BusinessProcess
{
if ($pipelineId === null) {
return null;
}
$cacheKey = $this->getBusinessProcessCacheKey($pipelineId);
if (isset($this->cachedBusinessProcesses[$cacheKey])) {
return $this->cachedBusinessProcesses[$cacheKey];
}
$businessProcess = $this->getBusinessProcess($pipelineId);
if (! $businessProcess instanceof BusinessProcess) {
$this->importStages();
$businessProcess = $this->getBusinessProcess($pipelineId);
}
if (! $businessProcess instanceof BusinessProcess) {
$this->logger->info(
'[HubSpot] Deal is not attached to a pipeline',
[
'pipeline' => $pipelineId]
);
}
$this->cachedBusinessProcesses[$cacheKey] = $businessProcess;
return $businessProcess;
}
private function getBusinessProcess(string $pipelineId): ?BusinessProcess
{
return $this->crmEntityRepository->findBusinessProcessesByExternalId($this->config, $pipelineId);
}
private function getBusinessProcessCacheKey(string $pipelineId): string
{
return $this->config->getId() . '_' . $pipelineId;
}
private function resolveStage(BusinessProcess $businessProcess, ?string $stageId): ?Stage
{
if (empty($stageId)) {
return null;
}
$cacheKey = $businessProcess->getId() . ':' . $stageId;
if (isset($this->cachedStages[$cacheKey])) {
return $this->cachedStages[$cacheKey];
}
$stage = $this->crmEntityRepository->getPipelineStageByConditions(
$businessProcess,
[
'crm_provider_id' => $stageId,
'type' => Stage::TYPE_OPPORTUNITY,
]
);
if ($stage === null) {
$this->importStages(null, $stageId);
}
if ($stage === null) {
$this->logger->info('[HubSpot] Stage does not exist => ' . $stageId);
}
$this->cachedStages[$cacheKey] = $stage;
return $stage;
}
private function resolveAmount(array $properties): ?string
{
$amount = null;
if (! empty($properties['amount'])) {
$amount = str_replace(',', '', $properties['amount']);
}
if ($this->config->hasDefaultCurrencyFieldSet()) {
$valueFieldName = $this->config->getDefaultCurrencyField()->getCrmProviderId();
$amount = $properties[$valueFieldName] ?? $amount;
}
return $amount;
}
private function parseCleanDatetime(string $datetime): ?Carbon
{
// Treat pre-1980 values as invalid
$minValidDate = Carbon::parse('1980-01-01 00:00:00');
try {
$date = Carbon::parse($datetime);
if ($minValidDate->gt($date)) {
return null;
}
return $date;
} catch (Exception) {
return null; // On parse error, treat as null
}
}
private function resolveDealProbability(?string $stageProbability): int
{
if ($stageProbability === null) {
return 0;
}
$probability = (float) $stageProbability;
return $probability > 1 ? 0 : (int) ($probability * 100);
}
private function resolveForecastCategory(?string $forecastCategory): string
{
if (! $forecastCategory) {
return Forecast::FORECAST_CATEGORY_UNCATEGORIZED;
}
$forecastCategory = str_replace('_', ' ', $forecastCategory);
return ucwords(strtolower($forecastCategory));
}
private function importExternalFieldData(array $properties, int $opportunityId): void
{
$crmFields = $this->getOpportunitySyncableFields();
$this->importOpportunityCrmFieldData($properties, $crmFields, $opportunityId);
}
private function importOpportunityContacts(Opportunity $opportunity, array $associations): void
{
// Handle empty or missing contact associations
if (empty($associations)) {
// Remove all existing contact associations if none provided
$this->removeAllOpportunityContacts($opportunity);
return;
}
// Use differential sync approach for better performance and accuracy
$this->syncOpportunityContactsDifferential($opportunity, $associations);
}
/**
* Sync opportunity contacts using differential approach
* This compares current vs new associations and only makes necessary changes
*/
private function syncOpportunityContactsDifferential(Opportunity $opportunity, array $contactAssociations): void
{
$currentContactCrmIds = $this->getCurrentContactCrmIds($opportunity);
$contactAssociationIds = array_keys($contactAssociations);
$contactsToAdd = array_diff($contactAssociationIds, $currentContactCrmIds);
$contactsToRemove = array_diff($currentContactCrmIds, $contactAssociationIds);
if (empty($contactsToAdd) && empty($contactsToRemove)) {
return;
}
$this->logContactAssociationChanges($opportunity, $currentContactCrmIds, $contactAssociations, $contactsToAdd, $contactsToRemove);
$this->removeContactAssociations($opportunity, $contactsToRemove);
$this->addContactAssociations($opportunity, $contactsToAdd, $contactAssociations);
}
private function getCurrentContactCrmIds(Opportunity $opportunity): array
{
return $opportunity->contacts()
->pluck('contacts.crm_provider_id')
->toArray();
}
private function logContactAssociationChanges(
Opportunity $opportunity,
array $currentContactCrmIds,
array $contactAssociations,
array $contactsToAdd,
array $contactsToRemove
): void {
$this->logger->info('[' . $this->getDisplayName() . '] Contact association changes', [
'opportunity_id' => $opportunity->getId(),
'current_contacts' => $currentContactCrmIds,
'new_contacts' => $contactAssociations,
'contacts_to_add' => $contactsToAdd,
'contacts_to_remove' => $contactsToRemove,
]);
}
private function removeContactAssociations(Opportunity $opportunity, array $contactsToRemove): void
{
if (empty($contactsToRemove)) {
return;
}
$contactsToDetach = $opportunity->contacts()
->whereIn('contacts.crm_provider_id', $contactsToRemove)
->pluck('contacts.id')
->toArray();
if (! empty($contactsToDetach)) {
$opportunity->contacts()->detach($contactsToDetach);
$this->logger->info('[' . $this->getDisplayName() . '] Removed contact associations', [
'opportunity_id' => $opportunity->getId(),
'removed_contact_crm_ids' => $contactsToRemove,
'removed_contact_count' => count($contactsToDetach),
]);
}
}
private function addContactAssociations(Opportunity $opportunity, array $contactsToAdd, array $contactAssociations): void
{
if (empty($contactsToAdd)) {
return;
}
$contactsAdded = [];
foreach ($contactsToAdd as $crmId) {
$id = $contactAssociations[$crmId];
if ($this->attachSingleContact($opportunity, (string) $crmId, $id)) {
$contactsAdded[] = $crmId;
}
}
$this->logAddedContacts($opportunity, $contactsAdded);
}
private function attachSingleContact(Opportunity $opportunity, string $crmId, int $id): bool
{
try {
$contact = $this->crmEntityRepository->findContactByConfigurationAndId($this->config, $id);
if (! $contact) {
return false;
}
return $this->performContactAttachment($opportunity, $contact, $crmId);
} catch (\Throwable $e) {
$this->logger->warning('[' . $this->getDisplayName() . '] Failed to add contact association', [
'opportunity_id' => $opportunity->getId(),
'contact_crm_id' => $crmId,
'error' => $e->getMessage(),
]);
return false;
}
}
private function performContactAttachment(Opportunity $opportunity, Contact $contact, string $crmId): bool
{
try {
$opportunity->contacts()->attach($contact->getId(), [
'crm_provider_id' => $crmId,
]);
return true;
} catch (\Illuminate\Database\QueryException $e) {
if (str_contains($e->getMessage(), 'Duplicate entry')) {
$this->logger->info('[' . $this->getDisplayName() . '] Contact association already exists', [
'contact_id' => $contact->getId(),
'contact_crm_id' => $crmId,
'opportunity_id' => $opportunity->getId(),
]);
return false;
}
throw $e;
}
}
private function logAddedContacts(Opportunity $opportunity, array $contactsAdded): void
{
if (! empty($contactsAdded)) {
$this->logger->info('[' . $this->getDisplayName() . '] Added contact associations', [
'opportunity_id' => $opportunity->getId(),
'added_contact_crm_ids' => $contactsAdded,
'added_contacts_count' => count($contactsAdded),
]);
}
}
}
Execute
Explain Plan
Browse Query History
View Parameters
Open Query Execution Settings…
In-Editor Results
Tx: Auto
Cancel Running Statements
Playground
jiminny
Code changed:
Hide
Sync Changes
Hide This Notification
6
1
6
Previous Highlighted Error
Next Highlighted Error
# [PASSWORD_DOTS] HS [PASSWORD_DOTS]
select * from teams where id = 2; # 2
select * from features; # 2
select * from team_features where team_id = 2; # 2
select * from crm_configurations where id = 2; # 2
select * from users where team_id = 2; #
select * from playbooks where team_id = 2; # event 38
select * from playbook_categories where playbook_id = 38; #
SELECT * FROM activities WHERE crm_configuration_id = 2 and crm_provider_id is not null order by id desc;
https://app.hubspot.com/contacts/4392066/deal/16964514951/?engagement=96069102624
https://app.staging.jiminny.com/playback/d5df34dc-bd66-4ff5-a7b3-8d3be30322a0
SELECT * FROM activities WHERE uuid_to_bin('04fdcd0d-818f-4c53-92dc-6f18bc753ffd') = uuid;
# 609126 softphone tr. 11241
SELECT * FROM activities WHERE uuid_to_bin('6521bfcd-5a30-46e5-9f74-5440fd48befd') = uuid;
# 608874 conference tr. 11226 crmId: 103422236596
select * from ai_prompts where transcription_id IN (11241, 11226);
select * from activity_summary_logs where activity_id = 608874;
select * from sidekick_settings;
select * from default_activity_types;
select * from crm_field_data where activity_id = 1223;
select * from crm_layouts where crm_configuration_id = 2;
SELECT * FROM crm_layout_entities WHERE crm_layout_id IN (554);
select * from crm_fields where crm_configuration_id = 11 and object_type = 'event';
SELECT * FROM crm_field_values WHERE crm_field_id IN (1455,1450);
SELECT * FROM crm_field_data WHERE crm_layout_entity_id = 971;
SELECT * FROM crm_field_data WHERE crm_layout_entity_id IN (6494,6495,6496,6497,6498,6499);
SELECT
CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,
u.email,
sa.*,
t.owner_id FROM social_accounts sa
JOIN users u
on u.id = sa.sociable_id
JOIN teams t on t.id = u.team_id
WHERE u.team_id = 2 and sa.provider = 'hubspot';
select * from opportunities where team_id = 2
and crm_provider_id IN ('51317301383');
select * from contacts where id = 85;
select * from opportunities where team_id = 2 order by id desc;
select * from opportunities where team_id = 2 and crm_provider_id = '51317301383'; # 5112
select * from opportunities where team_id = 2 and crm_provider_id = '55976759904'; # 5112
select * from opportunity_contacts where opportunity_id = 5117;
select * from crm_field_data where object_id = 1365;
SELECT * FROM crm_fields WHERE id IN (1405, 1407, 1972, 2128);
select * from features;
select * from team_features where team_id IN (1);
select * from team_features where feature_id IN (36);
SHOW CREATE TABLE opportunity_contacts;
SELECT * FROM opportunity_contacts WHERE crm_provider_id = '111751';
# $slug = 'HUBSPOT_WEBHOOK_SYNC';
# $team = Jiminny\Models\Team::find(2);
# $feature = Feature::query()->where('slug', $slug)->first();
# TeamFeature::query()->create(['feature_id' => $feature->getId(),'team_id' => $team->getId()]);
# hubspot_webhook_metrics
select * from opportunities where team_id = 2 and crm_provider_id IN ('374720564','14527423589','49908861993','50435771779'); # 1365
SELECT * FROM opportunity_contacts WHERE opportunity_id = '414';
SELECT * FROM opportunity_contacts WHERE crm_provider_id = '131501';
select * from contacts where id in (414, 464);
select * from activities where crm_configuration_id = 2;
select settings from crm_configurations where id = 11;
select * from teams; # 1, 2
select * from users;
select * from crm_configurations where id = 39;
select * from team_features where team_id = 2;
select * from features;
# SELECT * FROM opportunities WHERE crm_configuration_id = 2
# order by id desc;
# and crm_provider_id = '49908861993';
select * from activity_providers where id IN (443, 202, 203, 227);
select * from activity_imports where id = 795889;
select c.id, c.provider, c.settings, t.* from teams t join crm_configurations c on t.id = c.team_id
where c.provider = 'hubspot';
select * from crm_configurations crm JOIN teams t on crm.team_id = t.id
where provider = 'hubspot';
SELECT * FROM teams WHERE id = 31;
SELECT * FROM users WHERE id = 257;
SELECT * FROM opportunities WHERE team_id = 2;
select * from opportunity_contacts where opportunity_id = 5124;
select * from contacts where id IN (3850,3853,3851,4073,4140,4155,4480,4530,4623,5986,513,687,1806,1523,3613)
select * from activities where crm_configuration_id = 13;
SELECT * FROM activities WHERE uuid_to_bin('826619ce-ec8e-4e59-8467-a01f5f6ad71e') = uuid; # 418141
select id, team_id, crm_provider_id from crm_configurations where provider = 'hubspot' and crm_provider_id IS NOT NULL;
SELECT * FROM accounts WHERE team_id = 2 and crm_provider_id = '1212213464' order by id desc;
SELECT * FROM contacts WHERE team_id = 2 and account_id = 5189 order by id desc;
SELECT * FROM contacts WHERE team_id = 2 order by id desc;
select * from opportunity_contacts where contact_id = 6223;
SELECT * FROM opportunities WHERE team_id = 2 and account_id = 5189 order by id desc;
select * from crm_profiles where crm_configuration_id = 2;
select * from activities where account_id = 46;
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide...
|
55530
|
|
55617
|
NULL
|
0
|
2026-04-20T09:58:37.178798+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-20/1776 /Users/lukas/.screenpipe/data/data/2026-04-20/1776679117178_m2.jpg...
|
PhpStorm
|
faVsco.js – BaseService.php
|
True
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
#11976 on JY-20553-debug- Project: faVsco.js, menu
#11976 on JY-20553-debug-crm-sync-delays, menu
Start Listening for PHP Debug Connections
RequestGenerateAskJiminnyReportJobTest
Run 'RequestGenerateAskJiminnyReportJobTest'
Debug 'RequestGenerateAskJiminnyReportJobTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
1
19
2
Previous Highlighted Error
Next Highlighted Error
<?php
namespace Jiminny\Services\Crm;
use Illuminate\Support\Collection;
use Jiminny\Component\Transcription\Service\TranscriptionService;
use Jiminny\Contracts\Services\Crm\ClientInterface;
use Jiminny\Contracts\Services\Crm\ConnectionStateInterface;
use Jiminny\Contracts\Services\Crm\Provider\HubspotInterface;
use Jiminny\Contracts\Services\Crm\ServiceInterface;
use Jiminny\Contracts\Services\Crm\SettingsInterface;
use Jiminny\Contracts\Services\Crm\SupportsObjectTypeParseInterface;
use Jiminny\Contracts\Services\Crm\SyncCrmEntitiesInterface;
use Jiminny\Exceptions\HttpBadRequestException;
use Jiminny\Exceptions\HttpNotFoundException;
use Jiminny\Exceptions\LogicException;
use Jiminny\Exceptions\SocialAccountTokenInvalidException;
use Jiminny\Integrations\PlaybookResolver;
use Jiminny\Jobs\Crm\SyncFieldMetadata;
use Jiminny\Models;
use Jiminny\Models\Activity;
use Jiminny\Models\Crm\Configuration;
use Jiminny\Models\Crm\Field;
use Jiminny\Models\Crm\FieldData;
use Jiminny\Models\Crm\FieldValue;
use Jiminny\Models\Crm\Layout;
use Jiminny\Models\Crm\Profile;
use Jiminny\Models\Lead;
use Jiminny\Models\Playbook;
use Jiminny\Models\PlaybookCategory;
use Jiminny\Models\SocialAccount;
use Jiminny\Models\Team;
use Jiminny\Models\User;
use Jiminny\Services\Crm\Helpers\ConnectionStateTrait;
use Jiminny\Services\Crm\Helpers\OpportunitySyncableFieldsTrait;
use Jiminny\Services\TeamService;
use Psr\Log\LoggerInterface;
use Sentry\State\Scope;
abstract class BaseService implements
ServiceInterface,
SettingsInterface,
SyncCrmEntitiesInterface,
ConnectionStateInterface
{
use ConnectionStateTrait;
use OpportunitySyncableFieldsTrait;
public const string OBJECT_LEAD = 'lead';
public const string OBJECT_ACCOUNT = 'account';
public const string OBJECT_CONTACT = 'contact';
public const string OBJECT_OPPORTUNITY = 'opportunity';
public const string OBJECT_TASK = 'task';
public const string OBJECT_EVENT = 'event';
public const int SOFT_DELETE_CHUNK = 100;
public const int HARD_DELETE_CHUNK = 1000;
public ?Configuration $config;
public ?Profile $profile;
public ?Team $team = null;
/**
* @var ClientInterface
*/
protected $client;
/**
* @var TeamService
*/
protected TeamService $teamService;
/**
* @var int
*/
protected int $limit;
/**
* @var int
*/
protected int $offset;
/**
* Transcription Service instance.
*
* @var TranscriptionService
*/
protected TranscriptionService $transcriptionService;
protected LoggerInterface $logger;
/**
* Cache for opportunity fields to avoid N+1 queries during batch imports.
* Key: crm_provider_id, Value: Field model with entities relation.
* Cleared when configuration changes.
*
* @var Collection<string, Field>|null
*/
private ?Collection $cachedOpportunityFields = null;
public function __construct()
{
$this->teamService = app(TeamService::class);
$this->transcriptionService = app(TranscriptionService::class);
$this->logger = app(LoggerInterface::class);
}
/**
* @param User $user
*
* @throws SocialAccountTokenInvalidException
*/
public function setUser(User $user): void
{
$this->configureSentryScope($user);
$this->team = $user->team;
$this->teamService->setTeam($user->team);
$this->setConfiguration($user->team->crm);
// Reset state.
$this->profile = $user->crmProfile;
/**
* DO NOT DELETE THIS `clearTokens` CALL
* The purpose of purging tokens is to fix a problem in importing calendar events.
* Calendar Import doesn't always respect "SocialAccountInvalidTokenException" exception
* and may try to recycle old SF instance, with wrong credentials (by ignoring the exception).
*
* This code guarantees the CRM Service is unusable, unless always provided with a valid social account.
*/
if (method_exists($this->client, 'clearTokens')) {
$this->client->clearTokens();
}
$account = $this->getOAuthAccount($user);
$this->validateUserAccountExists($user, $account);
if (method_exists($this->client, 'setOAuthAccount')) {
$this->client->setOAuthAccount($account);
}
if (method_exists($this->client, 'setLogger')) {
$this->client->setLogger($this->logger);
}
if ($this->profile === null) {
// Try to fetch their profile, maybe it was not yet imported?
$cacheKey = sprintf('crm_profile_sync-%s', $user->getId());
$lock = \Cache::lock($cacheKey, 300);
if ($lock->get()) {
$this->profile = $this->getProfile($user);
}
}
// The CRM Service is properly bootstrapped, and supports remote operations
$this->connect();
}
protected function configureSentryScope(User $user): void
{
\Sentry\configureScope(function (Scope $scope) use ($user): void {
$scope->setTag('team_id', (string) $user->getTeamId());
$scope->setUser([
'id' => $user->getId(),
'email' => $user->getEmailAddress(),
]);
});
}
/**
* @param User $user
*
* @return Profile|null
*/
protected function getProfile(User $user): ?Profile
{
return $this->syncProfiles($user);
}
public function getConfiguration(): Configuration
{
return $this->config;
}
public function setConfiguration(Configuration $config): void
{
$this->config = $config;
$this->client->setConfiguration($config);
// Clear field cache when configuration changes to ensure fresh data for new team/config
$this->cachedOpportunityFields = null;
if ($this->team === null) {
$this->team = $config->team;
}
}
public function setPage(int $limit, int $offset): void
{
$this->limit = $limit;
$this->offset = $offset;
}
abstract protected function getOAuthAccount(User $user): ?SocialAccount;
abstract protected function getDefaultFollowupLayoutFields(string $activityType): array;
abstract protected function getFieldTypes(): array;
abstract protected function getFields(string $fieldType): array;
public function syncFields(): void
{
foreach ($this->getFieldTypes() as $fieldType) {
$currentFields = $this->getFields($fieldType);
// TODO: only sync the field once a day if we don't use it in any layout. If we do, sync hourly?
foreach ($currentFields as $field) {
/** @var Models\Crm\Field $field */
$field = $this->config->fields()->updateOrCreate([
'crm_provider_id' => mb_strimwidth($field['name'], 0, 128),
'object_type' => $fieldType,
], [
'label' => mb_strimwidth($field['label'], 0, Field::LABEL_MAX_LENGTH),
]);
try {
$this->syncField($field);
if ($field->type === Models\Crm\Field::TYPE_PICKLIST) {
$this->importPicklistValues($field);
}
} catch (HttpNotFoundException $e) {
$this->logger->error('[sync-fields] Field not found', [
'provider' => $this->getDisplayName(),
'crm_field' => $field->crm_provider_id,
'object_type' => $field->object_type,
'team_id' => $this->team->id,
]);
} catch (HttpBadRequestException $e) {
$this->logger->error('[sync-fields] Field not supported', [
'provider' => $this->getDisplayName(),
'crm_field' => $field->crm_provider_id,
'object_type' => $field->object_type,
'team_id' => $this->team->id,
]);
}
}
}
}
/**
* @param string $objectId
* @param ?string $objectType
*
* @return array
*/
public function parseRecords(string $objectId, ?string $objectType = null): array
{
if ($objectType === null && $this instanceof SupportsObjectTypeParseInterface) {
$objectType = $this->parseObjectType($objectId);
}
$lead = null;
$contact = null;
$opportunity = null;
$account = null;
$stage = null;
$countryCode = null;
// Gather the prospect data to store on activity/participant.
switch ($objectType) {
case self::OBJECT_LEAD:
/** @var ?Lead $lead */
$lead = $this->config->leads()->where('crm_provider_id', $objectId)->first();
if ($lead === null) {
$lead = $this->syncLead($objectId);
}
if ($lead?->country_code) {
$countryCode = $lead->country_code;
}
$stage = $lead?->stage;
break;
case self::OBJECT_ACCOUNT:
$account = $this->config->accounts()->where('crm_provider_id', $objectId)->first();
if ($account === null) {
$account = $this->syncAccount($objectId);
}
if ($account->country_code) {
$countryCode = $account->country_code;
}
break;
case self::OBJECT_CONTACT:
$contact = $this->config->contacts()->where('crm_provider_id', $objectId)->first();
if ($contact === null) {
$contact = $this->syncContact($objectId);
}
if ($contact?->country_code) {
$countryCode = $contact->country_code;
}
$account = $contact?->account;
break;
case self::OBJECT_OPPORTUNITY:
$opportunity = $this->config->opportunities()->where('crm_provider_id', $objectId)->first();
if ($opportunity === null) {
$opportunity = $this->syncOpportunity($objectId);
}
if ($opportunity !== null) {
$stage = $opportunity->stage;
$account = $opportunity->account;
if ($account->country_code) {
$countryCode = $account->country_code;
}
}
break;
}
return [
$lead,
$account,
$opportunity,
$contact,
$stage,
$countryCode,
];
}
/**
* @param null|string $name
*
* @return null|string
*/
public function convertCountryNameToCode(?string $name): ?string
{
return app(CountryCodeResolver::class)->resolveCountryCode($name);
}
/**
* @param PlaybookCategory $category
*
* @return bool
*/
public function matchesCrmType(PlaybookCategory $category): bool
{
if ($category->playbook === null) {
return false;
}
if ($category->getPlaybook()->getActivityField() === null) {
return false;
}
$fieldValue = $category
->playbook
->activityField
->values()
->where('label', $category->name);
// Check the field values for a matching option.
return $fieldValue->exists();
}
/**
* @param PlaybookCategory $category
*
* @return FieldValue|null
*/
public function getCrmType(PlaybookCategory $category): ?FieldValue
{
$fieldValue = $category
->playbook
->activityField
->values()
->where('label', $category->name);
return $fieldValue->first();
}
/**
* @return int|float|string
*/
public function getMinimumApiVersion(): int|float|string
{
return $this->client->getMinimumApiVersion();
}
/**
* @param string $accountId
*
* @return bool
*/
protected function hasAccount(string $accountId): bool
{
return $this->config->accounts()->where('crm_provider_id', $accountId)->exists();
}
/**
* @param string $opportunityId
*
* @return bool
*/
protected function hasOpportunity(string $opportunityId): bool
{
return $this->config->opportunities()->where('crm_provider_id', $opportunityId)->exists();
}
/**
* @param string $contactId
*
* @return bool
*/
protected function hasContact(string $contactId): bool
{
return $this->config->contacts()->where('crm_provider_id', $contactId)->exists();
}
/**
* @param string $leadId
*
* @return bool
*/
protected function hasLead(string $leadId): bool
{
return $this->config->leads()->where('crm_provider_id', $leadId)->exists();
}
public function fetchAndAssociateRelatedActivity(Activity $activity): ?Activity
{
return null;
}
public function getJobDelay(): int
{
return 0;
}
public function getPlaybookFromActivity(Activity $activity): ?Playbook
{
if ($activity->hasActivityType() && $activity->getActivityType()->hasPlaybook()) {
return $activity->getActivityType()->getPlaybook();
}
return $this->getPlaybook($activity->getUser());
}
/**
* Gets the playbook for the user
*/
protected function getPlaybook(User $user): ?Playbook
{
$playbookResolver = app(PlaybookResolver::class);
return $playbookResolver->resolvePlaybookByUser($user);
}
/**
* @param Models\Playbook $playbook
* @param string $categoryName
*
* @return Models\PlaybookCategory|null
*/
protected function getPlaybookCategory(Models\Playbook $playbook, string $categoryName): ?Models\PlaybookCategory
{
return $playbook->categories()
->where('name', trim($categoryName))
->latest()
->first();
}
public function buildLayout(Layout $layout, ?string $activityType): void
{
if ($activityType) {
// Base section. Currently, the fields within are hard coded so this is empty for now.
/** @var Models\Crm\LayoutEntity $activitySection */
$activitySection = $layout->entities()->create([
'label' => 'activity-summary',
'description' => 'Activity Summary',
'sequence' => 0,
]);
if ($this instanceof HubspotInterface) {
$activityFields = $this->getDefaultActivityLayoutFields($activityType, $layout->type);
foreach ($activityFields as $i => $field) {
$layout->entities()->create([
'parent_entity_id' => $activitySection->getId(),
'crm_field_id' => $field->getId(),
'sequence' => $i,
]);
}
}
// Follow-up section. These are all dynamic fields.
$sectionTitle = ($layout->type === Layout::TYPE_CONFERENCE_SUMMARY ? 'Next Steps...' : 'Follow up?');
/** @var Models\Crm\LayoutEntity $followupSection */
$followupSection = $layout->entities()->create([
'label' => 'follow-up',
'description' => $sectionTitle,
'sequence' => 1,
]);
$followupFields = $this->getDefaultFollowupLayoutFields($activityType);
foreach ($followupFields as $i => $field) {
$layout->entities()->create([
'parent_entity_id' => $followupSection->getId(),
'crm_field_id' => $field->getId(),
'sequence' => $i,
]);
}
} elseif ($layout->type == Layout::TYPE_DEAL_INSIGHTS) {
$this->populateLayoutEntities($layout);
}
}
protected function populateLayoutEntities(Layout $layout): void
{
$dealFields = $this->getDefaultDealLayoutFields();
foreach ($dealFields as $i => $field) {
$readOnly = $field->getType() === Field::TYPE_CURRENCY
|| $this->isBusinessTypeField($field);
$layout->entities()->updateOrCreate([
'crm_field_id' => $field->id,
], [
'sequence' => $i,
'read_only' => $readOnly,
]);
}
}
public function prepareValueForUpdate(array $params): array
{
$fieldName = $params['fieldName'];
$fieldValue = $params['fieldValue'];
return [$fieldName => $fieldValue];
}
protected function getDefaultDealLayoutFields(): array
{
$fieldData = $this->getDealInsightsFields();
$fields = [];
foreach ($fieldData as $data) {
/** @var Field $field */
$field = $this->config->fields()->updateOrCreate([
'crm_provider_id' => $data['crm_provider_id'],
'object_type' => $data['object_type'],
], ['label' => $data['crm_provider_id']]);
try {
dispatch_sync(new SyncFieldMetadata($this->config->team, $field));
$field->refresh();
} catch (\Throwable $throwable) {
\Sentry::captureException($throwable);
}
$fields[] = $field;
}
return $fields;
}
public function importOpportunityCrmFieldData(array $crmData, array $crmFields, int $opportunityId): void
{
// Pre-fetch all opportunity fields once per batch to avoid N+1 queries.
// During webhook floods, this reduces DB queries from O(fields × deals) to O(1) for field lookups.
$fieldsMap = $this->getOpportunityFieldsMap();
foreach ($crmFields as $fieldName) {
$field = $fieldsMap->get($fieldName);
if (! $field instanceof Field) {
$this->logger->warning('Field not found', [
'field' => $fieldName,
'opportunity_id' => $opportunityId,
]);
continue;
}
// A CRM field data will be synced only if the field exists as part of at least one layout,
// i.e. an entity related to the field exists.
$entity = $field->entities->first();
if (! $entity instanceof Models\Crm\LayoutEntity) {
continue;
}
$fieldValue = $crmData[$fieldName] ?? '';
if (is_object($fieldValue)) {
$this->logger->warning('Field value is an object', [
'field' => $fieldName,
]);
continue;
}
$value = $this->normalizeValue($field->type, $fieldValue, true);
FieldData::updateOrCreate([
'crm_layout_entity_id' => $entity->id,
'crm_field_id' => $field->id,
'object_type' => 'opportunity',
'object_id' => $opportunityId,
], ['value' => $value]);
}
}
/**
* Get cached opportunity fields map for efficient lookups during batch imports.
*
* This method fetches all opportunity fields with their entities relation ONCE
* and caches them for the lifetime of this service instance. This eliminates
* the N+1 query problem where each field was fetched individually per deal.
*
* Performance impact:
* - Before: 10 fields × 100 deals = 1,000 field queries per batch
* - After: 1 query per batch (regardless of deal count)
*
* @return Collection<string, Field> Fields keyed by crm_provider_id
*/
private function getOpportunityFieldsMap(): Collection
{
if ($this->cachedOpportunityFields === null) {
$this->cachedOpportunityFields = $this->config->fields()
->with('entities')
->where('object_type', '=', self::OBJECT_OPPORTUNITY)
->get()
->keyBy('crm_provider_id');
}
return $this->cachedOpportunityFields;
}
/**
* @param array<mixed> $crmData
* @param Collection $crmFields
* @param int $objectId
*
* @return void
*/
public function importCrmFieldData(array $crmData, Collection $crmFields, int $objectId): void
{
/** @var Field $crmField */
foreach ($crmFields as $crmField) {
// If the field name does not match one we are interested in, skip.
if (array_key_exists($crmField->crm_provider_id, $crmData) === false) {
continue;
}
/** @var string $fieldValue */
$fieldValue = $crmData[$crmField->crm_provider_id];
$value = $this->normalizeValue($crmField->type, $fieldValue, true);
FieldData::updateOrCreate([
'crm_field_id' => $crmField->id,
'object_type' => $crmField->object_type,
'object_id' => $objectId,
], ['value' => $value]);
}
}
protected function getTeam(): Team
{
if (! $this->team instanceof Team) {
throw new LogicException('Expecting team model instance');
}
return $this->team;
}
public function isBusinessTypeField(Field $field): bool
{
return in_array($field->crm_provider_id, Field::BUSINESS_TYPE_FIELDS)
&& $field->object_type === Field::OBJECT_OPPORTUNITY;
}
/**
* @return mixed[]
*/
public function fetchRelatedActivity(Activity $activity): array
{
return [];
}
/**
* @throws SocialAccountTokenInvalidException
*/
private function validateUserAccountExists(User $user, ?SocialAccount $account = null): void
{
if ($account instanceof SocialAccount && $account->state === SocialAccount::STATE_CONNECTED) {
return;
}
$this->logger->warning(
sprintf('[%s] Account not connected for user', $this->getDisplayName()),
[
'userId' => $user->getIdString(),
'account' => $account,
]
);
// If their profile was never setup in the first place
if ($this->profile === null) {
// Create a dummy in-memory profile just to be able to run
$this->profile = new Profile();
}
if (! $account instanceof SocialAccount) {
throw new SocialAccountTokenInvalidException(
sprintf(
'Social account for %s cannot be found. Please login to Jiminny to connect.',
$this->getDisplayName()
)
);
}
throw new SocialAccountTokenInvalidException(
sprintf(
'Your %s account has become disconnected. Please login to Jiminny to reconnect.',
$this->getDisplayName()
)
);
}
public function listSupportedObjectTypes(): array
{
return $this->getFieldTypes();
}
}
Execute
Explain Plan
Browse Query History
View Parameters
Open Query Execution Settings…
In-Editor Results
Tx: Auto
Cancel Running Statements
Playground
jiminny
Code changed:
Hide
Sync Changes
Hide This Notification
6
1
6
Previous Highlighted Error
Next Highlighted Error
# [PASSWORD_DOTS] HS [PASSWORD_DOTS]
select * from teams where id = 2; # 2
select * from features; # 2
select * from team_features where team_id = 2; # 2
select * from crm_configurations where id = 2; # 2
select * from users where team_id = 2; #
select * from playbooks where team_id = 2; # event 38
select * from playbook_categories where playbook_id = 38; #
SELECT * FROM activities WHERE crm_configuration_id = 2 and crm_provider_id is not null order by id desc;
https://app.hubspot.com/contacts/4392066/deal/16964514951/?engagement=96069102624
https://app.staging.jiminny.com/playback/d5df34dc-bd66-4ff5-a7b3-8d3be30322a0
SELECT * FROM activities WHERE uuid_to_bin('04fdcd0d-818f-4c53-92dc-6f18bc753ffd') = uuid;
# 609126 softphone tr. 11241
SELECT * FROM activities WHERE uuid_to_bin('6521bfcd-5a30-46e5-9f74-5440fd48befd') = uuid;
# 608874 conference tr. 11226 crmId: 103422236596
select * from ai_prompts where transcription_id IN (11241, 11226);
select * from activity_summary_logs where activity_id = 608874;
select * from sidekick_settings;
select * from default_activity_types;
select * from crm_field_data where activity_id = 1223;
select * from crm_layouts where crm_configuration_id = 2;
SELECT * FROM crm_layout_entities WHERE crm_layout_id IN (554);
select * from crm_fields where crm_configuration_id = 11 and object_type = 'event';
SELECT * FROM crm_field_values WHERE crm_field_id IN (1455,1450);
SELECT * FROM crm_field_data WHERE crm_layout_entity_id = 971;
SELECT * FROM crm_field_data WHERE crm_layout_entity_id IN (6494,6495,6496,6497,6498,6499);
SELECT
CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,
u.email,
sa.*,
t.owner_id FROM social_accounts sa
JOIN users u
on u.id = sa.sociable_id
JOIN teams t on t.id = u.team_id
WHERE u.team_id = 2 and sa.provider = 'hubspot';
select * from opportunities where team_id = 2
and crm_provider_id IN ('51317301383');
select * from contacts where id = 85;
select * from opportunities where team_id = 2 order by id desc;
select * from opportunities where team_id = 2 and crm_provider_id = '51317301383'; # 5112
select * from opportunities where team_id = 2 and crm_provider_id = '55976759904'; # 5112
select * from opportunity_contacts where opportunity_id = 5117;
select * from crm_field_data where object_id = 1365;
SELECT * FROM crm_fields WHERE id IN (1405, 1407, 1972, 2128);
select * from features;
select * from team_features where team_id IN (1);
select * from team_features where feature_id IN (36);
SHOW CREATE TABLE opportunity_contacts;
SELECT * FROM opportunity_contacts WHERE crm_provider_id = '111751';
# $slug = 'HUBSPOT_WEBHOOK_SYNC';
# $team = Jiminny\Models\Team::find(2);
# $feature = Feature::query()->where('slug', $slug)->first();
# TeamFeature::query()->create(['feature_id' => $feature->getId(),'team_id' => $team->getId()]);
# hubspot_webhook_metrics
select * from opportunities where team_id = 2 and crm_provider_id IN ('374720564','14527423589','49908861993','50435771779'); # 1365
SELECT * FROM opportunity_contacts WHERE opportunity_id = '414';
SELECT * FROM opportunity_contacts WHERE crm_provider_id = '131501';
select * from contacts where id in (414, 464);
select * from activities where crm_configuration_id = 2;
select settings from crm_configurations where id = 11;
select * from teams; # 1, 2
select * from users;
select * from crm_configurations where id = 39;
select * from team_features where team_id = 2;
select * from features;
# SELECT * FROM opportunities WHERE crm_configuration_id = 2
# order by id desc;
# and crm_provider_id = '49908861993';
select * from activity_providers where id IN (443, 202, 203, 227);
select * from activity_imports where id = 795889;
select c.id, c.provider, c.settings, t.* from teams t join crm_configurations c on t.id = c.team_id
where c.provider = 'hubspot';
select * from crm_configurations crm JOIN teams t on crm.team_id = t.id
where provider = 'hubspot';
SELECT * FROM teams WHERE id = 31;
SELECT * FROM users WHERE id = 257;
SELECT * FROM opportunities WHERE team_id = 2;
select * from opportunity_contacts where opportunity_id = 5124;
select * from contacts where id IN (3850,3853,3851,4073,4140,4155,4480,4530,4623,5986,513,687,1806,1523,3613)
select * from activities where crm_configuration_id = 13;
SELECT * FROM activities WHERE uuid_to_bin('826619ce-ec8e-4e59-8467-a01f5f6ad71e') = uuid; # 418141
select id, team_id, crm_provider_id from crm_configurations where provider = 'hubspot' and crm_provider_id IS NOT NULL;
SELECT * FROM accounts WHERE team_id = 2 and crm_provider_id = '1212213464' order by id desc;
SELECT * FROM contacts WHERE team_id = 2 and account_id = 5189 order by id desc;
SELECT * FROM contacts WHERE team_id = 2 order by id desc;
select * from opportunity_contacts where contact_id = 6223;
SELECT * FROM opportunities WHERE team_id = 2 and account_id = 5189 order by id desc;
select * from crm_profiles where crm_configuration_id = 2;
select * from activities where account_id = 46;
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"bounds":{"left":0.025930852,"top":0.019952115,"width":0.03856383,"height":0.025538707},"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"#11976 on JY-20553-debug-crm-sync-delays, menu","depth":5,"bounds":{"left":0.064494684,"top":0.019952115,"width":0.10837766,"height":0.025538707},"help_text":"Pull request #11976 exists for current branch JY-20553-debug-crm-sync-delays","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"bounds":{"left":0.7972075,"top":0.019952115,"width":0.011303191,"height":0.025538707},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"RequestGenerateAskJiminnyReportJobTest","depth":6,"bounds":{"left":0.8125,"top":0.019952115,"width":0.10305851,"height":0.025538707},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run 'RequestGenerateAskJiminnyReportJobTest'","depth":6,"bounds":{"left":0.9155585,"top":0.019952115,"width":0.011303191,"height":0.025538707},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'RequestGenerateAskJiminnyReportJobTest'","depth":6,"bounds":{"left":0.9268617,"top":0.019952115,"width":0.011303191,"height":0.025538707},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"More Actions","depth":6,"bounds":{"left":0.9381649,"top":0.019952115,"width":0.011303191,"height":0.025538707},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JetBrains AI","depth":5,"bounds":{"left":0.96609044,"top":0.019952115,"width":0.011303191,"height":0.025538707},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Search Everywhere","depth":5,"bounds":{"left":0.9773936,"top":0.019952115,"width":0.011303191,"height":0.025538707},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"IDE and Project Settings","depth":5,"bounds":{"left":0.9886968,"top":0.019952115,"width":0.011303186,"height":0.025538707},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.042220745,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"1","depth":4,"bounds":{"left":0.48038563,"top":0.19952115,"width":0.00731383,"height":0.015163607},"role_description":"text"},{"role":"AXStaticText","text":"19","depth":4,"bounds":{"left":0.48969415,"top":0.19952115,"width":0.009640957,"height":0.015163607},"role_description":"text"},{"role":"AXStaticText","text":"2","depth":4,"bounds":{"left":0.5013298,"top":0.19952115,"width":0.007978723,"height":0.015163607},"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.5109708,"top":0.19792499,"width":0.00731383,"height":0.018355945},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"bounds":{"left":0.51828456,"top":0.19792499,"width":0.006981383,"height":0.018355945},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"<?php\n\nnamespace Jiminny\\Services\\Crm;\n\nuse Illuminate\\Support\\Collection;\nuse Jiminny\\Component\\Transcription\\Service\\TranscriptionService;\nuse Jiminny\\Contracts\\Services\\Crm\\ClientInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\ConnectionStateInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\Provider\\HubspotInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\ServiceInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\SettingsInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\SupportsObjectTypeParseInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\SyncCrmEntitiesInterface;\nuse Jiminny\\Exceptions\\HttpBadRequestException;\nuse Jiminny\\Exceptions\\HttpNotFoundException;\nuse Jiminny\\Exceptions\\LogicException;\nuse Jiminny\\Exceptions\\SocialAccountTokenInvalidException;\nuse Jiminny\\Integrations\\PlaybookResolver;\nuse Jiminny\\Jobs\\Crm\\SyncFieldMetadata;\nuse Jiminny\\Models;\nuse Jiminny\\Models\\Activity;\nuse Jiminny\\Models\\Crm\\Configuration;\nuse Jiminny\\Models\\Crm\\Field;\nuse Jiminny\\Models\\Crm\\FieldData;\nuse Jiminny\\Models\\Crm\\FieldValue;\nuse Jiminny\\Models\\Crm\\Layout;\nuse Jiminny\\Models\\Crm\\Profile;\nuse Jiminny\\Models\\Lead;\nuse Jiminny\\Models\\Playbook;\nuse Jiminny\\Models\\PlaybookCategory;\nuse Jiminny\\Models\\SocialAccount;\nuse Jiminny\\Models\\Team;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Services\\Crm\\Helpers\\ConnectionStateTrait;\nuse Jiminny\\Services\\Crm\\Helpers\\OpportunitySyncableFieldsTrait;\nuse Jiminny\\Services\\TeamService;\nuse Psr\\Log\\LoggerInterface;\nuse Sentry\\State\\Scope;\n\nabstract class BaseService implements\n ServiceInterface,\n SettingsInterface,\n SyncCrmEntitiesInterface,\n ConnectionStateInterface\n{\n use ConnectionStateTrait;\n use OpportunitySyncableFieldsTrait;\n\n public const string OBJECT_LEAD = 'lead';\n public const string OBJECT_ACCOUNT = 'account';\n public const string OBJECT_CONTACT = 'contact';\n public const string OBJECT_OPPORTUNITY = 'opportunity';\n public const string OBJECT_TASK = 'task';\n public const string OBJECT_EVENT = 'event';\n\n public const int SOFT_DELETE_CHUNK = 100;\n public const int HARD_DELETE_CHUNK = 1000;\n\n public ?Configuration $config;\n\n public ?Profile $profile;\n\n public ?Team $team = null;\n\n /**\n * @var ClientInterface\n */\n protected $client;\n\n /**\n * @var TeamService\n */\n protected TeamService $teamService;\n\n /**\n * @var int\n */\n protected int $limit;\n\n /**\n * @var int\n */\n protected int $offset;\n\n /**\n * Transcription Service instance.\n *\n * @var TranscriptionService\n */\n protected TranscriptionService $transcriptionService;\n\n protected LoggerInterface $logger;\n\n /**\n * Cache for opportunity fields to avoid N+1 queries during batch imports.\n * Key: crm_provider_id, Value: Field model with entities relation.\n * Cleared when configuration changes.\n *\n * @var Collection<string, Field>|null\n */\n private ?Collection $cachedOpportunityFields = null;\n\n public function __construct()\n {\n $this->teamService = app(TeamService::class);\n $this->transcriptionService = app(TranscriptionService::class);\n $this->logger = app(LoggerInterface::class);\n }\n\n /**\n * @param User $user\n *\n * @throws SocialAccountTokenInvalidException\n */\n public function setUser(User $user): void\n {\n $this->configureSentryScope($user);\n\n $this->team = $user->team;\n $this->teamService->setTeam($user->team);\n $this->setConfiguration($user->team->crm);\n\n // Reset state.\n $this->profile = $user->crmProfile;\n\n /**\n * DO NOT DELETE THIS `clearTokens` CALL\n * The purpose of purging tokens is to fix a problem in importing calendar events.\n * Calendar Import doesn't always respect \"SocialAccountInvalidTokenException\" exception\n * and may try to recycle old SF instance, with wrong credentials (by ignoring the exception).\n *\n * This code guarantees the CRM Service is unusable, unless always provided with a valid social account.\n */\n if (method_exists($this->client, 'clearTokens')) {\n $this->client->clearTokens();\n }\n\n $account = $this->getOAuthAccount($user);\n\n $this->validateUserAccountExists($user, $account);\n\n if (method_exists($this->client, 'setOAuthAccount')) {\n $this->client->setOAuthAccount($account);\n }\n if (method_exists($this->client, 'setLogger')) {\n $this->client->setLogger($this->logger);\n }\n\n if ($this->profile === null) {\n // Try to fetch their profile, maybe it was not yet imported?\n $cacheKey = sprintf('crm_profile_sync-%s', $user->getId());\n $lock = \\Cache::lock($cacheKey, 300);\n if ($lock->get()) {\n $this->profile = $this->getProfile($user);\n }\n }\n\n // The CRM Service is properly bootstrapped, and supports remote operations\n $this->connect();\n }\n\n protected function configureSentryScope(User $user): void\n {\n \\Sentry\\configureScope(function (Scope $scope) use ($user): void {\n $scope->setTag('team_id', (string) $user->getTeamId());\n $scope->setUser([\n 'id' => $user->getId(),\n 'email' => $user->getEmailAddress(),\n ]);\n });\n }\n\n /**\n * @param User $user\n *\n * @return Profile|null\n */\n protected function getProfile(User $user): ?Profile\n {\n return $this->syncProfiles($user);\n }\n\n public function getConfiguration(): Configuration\n {\n return $this->config;\n }\n\n public function setConfiguration(Configuration $config): void\n {\n $this->config = $config;\n $this->client->setConfiguration($config);\n\n // Clear field cache when configuration changes to ensure fresh data for new team/config\n $this->cachedOpportunityFields = null;\n\n if ($this->team === null) {\n $this->team = $config->team;\n }\n }\n\n public function setPage(int $limit, int $offset): void\n {\n $this->limit = $limit;\n $this->offset = $offset;\n }\n\n abstract protected function getOAuthAccount(User $user): ?SocialAccount;\n abstract protected function getDefaultFollowupLayoutFields(string $activityType): array;\n abstract protected function getFieldTypes(): array;\n abstract protected function getFields(string $fieldType): array;\n\n public function syncFields(): void\n {\n foreach ($this->getFieldTypes() as $fieldType) {\n $currentFields = $this->getFields($fieldType);\n\n // TODO: only sync the field once a day if we don't use it in any layout. If we do, sync hourly?\n foreach ($currentFields as $field) {\n /** @var Models\\Crm\\Field $field */\n $field = $this->config->fields()->updateOrCreate([\n 'crm_provider_id' => mb_strimwidth($field['name'], 0, 128),\n 'object_type' => $fieldType,\n ], [\n 'label' => mb_strimwidth($field['label'], 0, Field::LABEL_MAX_LENGTH),\n ]);\n\n try {\n $this->syncField($field);\n\n if ($field->type === Models\\Crm\\Field::TYPE_PICKLIST) {\n $this->importPicklistValues($field);\n }\n } catch (HttpNotFoundException $e) {\n $this->logger->error('[sync-fields] Field not found', [\n 'provider' => $this->getDisplayName(),\n 'crm_field' => $field->crm_provider_id,\n 'object_type' => $field->object_type,\n 'team_id' => $this->team->id,\n ]);\n } catch (HttpBadRequestException $e) {\n $this->logger->error('[sync-fields] Field not supported', [\n 'provider' => $this->getDisplayName(),\n 'crm_field' => $field->crm_provider_id,\n 'object_type' => $field->object_type,\n 'team_id' => $this->team->id,\n ]);\n }\n }\n }\n }\n\n /**\n * @param string $objectId\n * @param ?string $objectType\n *\n * @return array\n */\n public function parseRecords(string $objectId, ?string $objectType = null): array\n {\n if ($objectType === null && $this instanceof SupportsObjectTypeParseInterface) {\n $objectType = $this->parseObjectType($objectId);\n }\n\n $lead = null;\n $contact = null;\n $opportunity = null;\n $account = null;\n $stage = null;\n $countryCode = null;\n\n // Gather the prospect data to store on activity/participant.\n switch ($objectType) {\n case self::OBJECT_LEAD:\n /** @var ?Lead $lead */\n $lead = $this->config->leads()->where('crm_provider_id', $objectId)->first();\n\n if ($lead === null) {\n $lead = $this->syncLead($objectId);\n }\n\n if ($lead?->country_code) {\n $countryCode = $lead->country_code;\n }\n\n $stage = $lead?->stage;\n\n break;\n\n case self::OBJECT_ACCOUNT:\n $account = $this->config->accounts()->where('crm_provider_id', $objectId)->first();\n\n if ($account === null) {\n $account = $this->syncAccount($objectId);\n }\n\n if ($account->country_code) {\n $countryCode = $account->country_code;\n }\n\n break;\n\n case self::OBJECT_CONTACT:\n $contact = $this->config->contacts()->where('crm_provider_id', $objectId)->first();\n\n if ($contact === null) {\n $contact = $this->syncContact($objectId);\n }\n\n if ($contact?->country_code) {\n $countryCode = $contact->country_code;\n }\n\n $account = $contact?->account;\n\n break;\n\n case self::OBJECT_OPPORTUNITY:\n $opportunity = $this->config->opportunities()->where('crm_provider_id', $objectId)->first();\n\n if ($opportunity === null) {\n $opportunity = $this->syncOpportunity($objectId);\n }\n\n if ($opportunity !== null) {\n $stage = $opportunity->stage;\n\n $account = $opportunity->account;\n\n if ($account->country_code) {\n $countryCode = $account->country_code;\n }\n }\n\n break;\n }\n\n return [\n $lead,\n $account,\n $opportunity,\n $contact,\n $stage,\n $countryCode,\n ];\n }\n\n /**\n * @param null|string $name\n *\n * @return null|string\n */\n public function convertCountryNameToCode(?string $name): ?string\n {\n return app(CountryCodeResolver::class)->resolveCountryCode($name);\n }\n\n /**\n * @param PlaybookCategory $category\n *\n * @return bool\n */\n public function matchesCrmType(PlaybookCategory $category): bool\n {\n if ($category->playbook === null) {\n return false;\n }\n\n if ($category->getPlaybook()->getActivityField() === null) {\n return false;\n }\n\n $fieldValue = $category\n ->playbook\n ->activityField\n ->values()\n ->where('label', $category->name);\n\n // Check the field values for a matching option.\n return $fieldValue->exists();\n }\n\n /**\n * @param PlaybookCategory $category\n *\n * @return FieldValue|null\n */\n public function getCrmType(PlaybookCategory $category): ?FieldValue\n {\n $fieldValue = $category\n ->playbook\n ->activityField\n ->values()\n ->where('label', $category->name);\n\n return $fieldValue->first();\n }\n\n\n /**\n * @return int|float|string\n */\n public function getMinimumApiVersion(): int|float|string\n {\n return $this->client->getMinimumApiVersion();\n }\n\n /**\n * @param string $accountId\n *\n * @return bool\n */\n protected function hasAccount(string $accountId): bool\n {\n return $this->config->accounts()->where('crm_provider_id', $accountId)->exists();\n }\n\n /**\n * @param string $opportunityId\n *\n * @return bool\n */\n protected function hasOpportunity(string $opportunityId): bool\n {\n return $this->config->opportunities()->where('crm_provider_id', $opportunityId)->exists();\n }\n\n /**\n * @param string $contactId\n *\n * @return bool\n */\n protected function hasContact(string $contactId): bool\n {\n return $this->config->contacts()->where('crm_provider_id', $contactId)->exists();\n }\n\n /**\n * @param string $leadId\n *\n * @return bool\n */\n protected function hasLead(string $leadId): bool\n {\n return $this->config->leads()->where('crm_provider_id', $leadId)->exists();\n }\n\n public function fetchAndAssociateRelatedActivity(Activity $activity): ?Activity\n {\n return null;\n }\n\n public function getJobDelay(): int\n {\n return 0;\n }\n\n public function getPlaybookFromActivity(Activity $activity): ?Playbook\n {\n if ($activity->hasActivityType() && $activity->getActivityType()->hasPlaybook()) {\n return $activity->getActivityType()->getPlaybook();\n }\n\n return $this->getPlaybook($activity->getUser());\n }\n\n /**\n * Gets the playbook for the user\n */\n protected function getPlaybook(User $user): ?Playbook\n {\n $playbookResolver = app(PlaybookResolver::class);\n\n return $playbookResolver->resolvePlaybookByUser($user);\n }\n\n /**\n * @param Models\\Playbook $playbook\n * @param string $categoryName\n *\n * @return Models\\PlaybookCategory|null\n */\n protected function getPlaybookCategory(Models\\Playbook $playbook, string $categoryName): ?Models\\PlaybookCategory\n {\n return $playbook->categories()\n ->where('name', trim($categoryName))\n ->latest()\n ->first();\n }\n\n public function buildLayout(Layout $layout, ?string $activityType): void\n {\n if ($activityType) {\n // Base section. Currently, the fields within are hard coded so this is empty for now.\n /** @var Models\\Crm\\LayoutEntity $activitySection */\n $activitySection = $layout->entities()->create([\n 'label' => 'activity-summary',\n 'description' => 'Activity Summary',\n 'sequence' => 0,\n ]);\n\n if ($this instanceof HubspotInterface) {\n $activityFields = $this->getDefaultActivityLayoutFields($activityType, $layout->type);\n\n foreach ($activityFields as $i => $field) {\n $layout->entities()->create([\n 'parent_entity_id' => $activitySection->getId(),\n 'crm_field_id' => $field->getId(),\n 'sequence' => $i,\n ]);\n }\n }\n\n // Follow-up section. These are all dynamic fields.\n $sectionTitle = ($layout->type === Layout::TYPE_CONFERENCE_SUMMARY ? 'Next Steps...' : 'Follow up?');\n /** @var Models\\Crm\\LayoutEntity $followupSection */\n $followupSection = $layout->entities()->create([\n 'label' => 'follow-up',\n 'description' => $sectionTitle,\n 'sequence' => 1,\n ]);\n\n $followupFields = $this->getDefaultFollowupLayoutFields($activityType);\n\n foreach ($followupFields as $i => $field) {\n $layout->entities()->create([\n 'parent_entity_id' => $followupSection->getId(),\n 'crm_field_id' => $field->getId(),\n 'sequence' => $i,\n ]);\n }\n } elseif ($layout->type == Layout::TYPE_DEAL_INSIGHTS) {\n $this->populateLayoutEntities($layout);\n }\n }\n\n protected function populateLayoutEntities(Layout $layout): void\n {\n $dealFields = $this->getDefaultDealLayoutFields();\n\n foreach ($dealFields as $i => $field) {\n $readOnly = $field->getType() === Field::TYPE_CURRENCY\n || $this->isBusinessTypeField($field);\n\n $layout->entities()->updateOrCreate([\n 'crm_field_id' => $field->id,\n ], [\n 'sequence' => $i,\n 'read_only' => $readOnly,\n ]);\n }\n }\n\n public function prepareValueForUpdate(array $params): array\n {\n $fieldName = $params['fieldName'];\n $fieldValue = $params['fieldValue'];\n\n return [$fieldName => $fieldValue];\n }\n\n protected function getDefaultDealLayoutFields(): array\n {\n $fieldData = $this->getDealInsightsFields();\n\n $fields = [];\n foreach ($fieldData as $data) {\n /** @var Field $field */\n $field = $this->config->fields()->updateOrCreate([\n 'crm_provider_id' => $data['crm_provider_id'],\n 'object_type' => $data['object_type'],\n ], ['label' => $data['crm_provider_id']]);\n\n try {\n dispatch_sync(new SyncFieldMetadata($this->config->team, $field));\n $field->refresh();\n } catch (\\Throwable $throwable) {\n \\Sentry::captureException($throwable);\n }\n\n $fields[] = $field;\n }\n\n return $fields;\n }\n\n public function importOpportunityCrmFieldData(array $crmData, array $crmFields, int $opportunityId): void\n {\n // Pre-fetch all opportunity fields once per batch to avoid N+1 queries.\n // During webhook floods, this reduces DB queries from O(fields × deals) to O(1) for field lookups.\n $fieldsMap = $this->getOpportunityFieldsMap();\n\n foreach ($crmFields as $fieldName) {\n $field = $fieldsMap->get($fieldName);\n\n if (! $field instanceof Field) {\n $this->logger->warning('Field not found', [\n 'field' => $fieldName,\n 'opportunity_id' => $opportunityId,\n ]);\n\n continue;\n }\n\n // A CRM field data will be synced only if the field exists as part of at least one layout,\n // i.e. an entity related to the field exists.\n $entity = $field->entities->first();\n if (! $entity instanceof Models\\Crm\\LayoutEntity) {\n continue;\n }\n\n $fieldValue = $crmData[$fieldName] ?? '';\n\n if (is_object($fieldValue)) {\n $this->logger->warning('Field value is an object', [\n 'field' => $fieldName,\n ]);\n\n continue;\n }\n\n $value = $this->normalizeValue($field->type, $fieldValue, true);\n\n FieldData::updateOrCreate([\n 'crm_layout_entity_id' => $entity->id,\n 'crm_field_id' => $field->id,\n 'object_type' => 'opportunity',\n 'object_id' => $opportunityId,\n ], ['value' => $value]);\n }\n }\n\n /**\n * Get cached opportunity fields map for efficient lookups during batch imports.\n *\n * This method fetches all opportunity fields with their entities relation ONCE\n * and caches them for the lifetime of this service instance. This eliminates\n * the N+1 query problem where each field was fetched individually per deal.\n *\n * Performance impact:\n * - Before: 10 fields × 100 deals = 1,000 field queries per batch\n * - After: 1 query per batch (regardless of deal count)\n *\n * @return Collection<string, Field> Fields keyed by crm_provider_id\n */\n private function getOpportunityFieldsMap(): Collection\n {\n if ($this->cachedOpportunityFields === null) {\n $this->cachedOpportunityFields = $this->config->fields()\n ->with('entities')\n ->where('object_type', '=', self::OBJECT_OPPORTUNITY)\n ->get()\n ->keyBy('crm_provider_id');\n }\n\n return $this->cachedOpportunityFields;\n }\n\n /**\n * @param array<mixed> $crmData\n * @param Collection $crmFields\n * @param int $objectId\n *\n * @return void\n */\n public function importCrmFieldData(array $crmData, Collection $crmFields, int $objectId): void\n {\n /** @var Field $crmField */\n foreach ($crmFields as $crmField) {\n // If the field name does not match one we are interested in, skip.\n if (array_key_exists($crmField->crm_provider_id, $crmData) === false) {\n continue;\n }\n\n /** @var string $fieldValue */\n $fieldValue = $crmData[$crmField->crm_provider_id];\n\n $value = $this->normalizeValue($crmField->type, $fieldValue, true);\n\n FieldData::updateOrCreate([\n 'crm_field_id' => $crmField->id,\n 'object_type' => $crmField->object_type,\n 'object_id' => $objectId,\n ], ['value' => $value]);\n }\n }\n\n protected function getTeam(): Team\n {\n if (! $this->team instanceof Team) {\n throw new LogicException('Expecting team model instance');\n }\n\n return $this->team;\n }\n\n public function isBusinessTypeField(Field $field): bool\n {\n return in_array($field->crm_provider_id, Field::BUSINESS_TYPE_FIELDS)\n && $field->object_type === Field::OBJECT_OPPORTUNITY;\n }\n\n /**\n * @return mixed[]\n */\n public function fetchRelatedActivity(Activity $activity): array\n {\n return [];\n }\n\n /**\n * @throws SocialAccountTokenInvalidException\n */\n private function validateUserAccountExists(User $user, ?SocialAccount $account = null): void\n {\n if ($account instanceof SocialAccount && $account->state === SocialAccount::STATE_CONNECTED) {\n return;\n }\n\n $this->logger->warning(\n sprintf('[%s] Account not connected for user', $this->getDisplayName()),\n [\n 'userId' => $user->getIdString(),\n 'account' => $account,\n ]\n );\n\n // If their profile was never setup in the first place\n if ($this->profile === null) {\n // Create a dummy in-memory profile just to be able to run\n $this->profile = new Profile();\n }\n\n if (! $account instanceof SocialAccount) {\n throw new SocialAccountTokenInvalidException(\n sprintf(\n 'Social account for %s cannot be found. Please login to Jiminny to connect.',\n $this->getDisplayName()\n )\n );\n }\n\n throw new SocialAccountTokenInvalidException(\n sprintf(\n 'Your %s account has become disconnected. Please login to Jiminny to reconnect.',\n $this->getDisplayName()\n )\n );\n }\n\n public function listSupportedObjectTypes(): array\n {\n return $this->getFieldTypes();\n }\n}","depth":4,"value":"<?php\n\nnamespace Jiminny\\Services\\Crm;\n\nuse Illuminate\\Support\\Collection;\nuse Jiminny\\Component\\Transcription\\Service\\TranscriptionService;\nuse Jiminny\\Contracts\\Services\\Crm\\ClientInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\ConnectionStateInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\Provider\\HubspotInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\ServiceInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\SettingsInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\SupportsObjectTypeParseInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\SyncCrmEntitiesInterface;\nuse Jiminny\\Exceptions\\HttpBadRequestException;\nuse Jiminny\\Exceptions\\HttpNotFoundException;\nuse Jiminny\\Exceptions\\LogicException;\nuse Jiminny\\Exceptions\\SocialAccountTokenInvalidException;\nuse Jiminny\\Integrations\\PlaybookResolver;\nuse Jiminny\\Jobs\\Crm\\SyncFieldMetadata;\nuse Jiminny\\Models;\nuse Jiminny\\Models\\Activity;\nuse Jiminny\\Models\\Crm\\Configuration;\nuse Jiminny\\Models\\Crm\\Field;\nuse Jiminny\\Models\\Crm\\FieldData;\nuse Jiminny\\Models\\Crm\\FieldValue;\nuse Jiminny\\Models\\Crm\\Layout;\nuse Jiminny\\Models\\Crm\\Profile;\nuse Jiminny\\Models\\Lead;\nuse Jiminny\\Models\\Playbook;\nuse Jiminny\\Models\\PlaybookCategory;\nuse Jiminny\\Models\\SocialAccount;\nuse Jiminny\\Models\\Team;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Services\\Crm\\Helpers\\ConnectionStateTrait;\nuse Jiminny\\Services\\Crm\\Helpers\\OpportunitySyncableFieldsTrait;\nuse Jiminny\\Services\\TeamService;\nuse Psr\\Log\\LoggerInterface;\nuse Sentry\\State\\Scope;\n\nabstract class BaseService implements\n ServiceInterface,\n SettingsInterface,\n SyncCrmEntitiesInterface,\n ConnectionStateInterface\n{\n use ConnectionStateTrait;\n use OpportunitySyncableFieldsTrait;\n\n public const string OBJECT_LEAD = 'lead';\n public const string OBJECT_ACCOUNT = 'account';\n public const string OBJECT_CONTACT = 'contact';\n public const string OBJECT_OPPORTUNITY = 'opportunity';\n public const string OBJECT_TASK = 'task';\n public const string OBJECT_EVENT = 'event';\n\n public const int SOFT_DELETE_CHUNK = 100;\n public const int HARD_DELETE_CHUNK = 1000;\n\n public ?Configuration $config;\n\n public ?Profile $profile;\n\n public ?Team $team = null;\n\n /**\n * @var ClientInterface\n */\n protected $client;\n\n /**\n * @var TeamService\n */\n protected TeamService $teamService;\n\n /**\n * @var int\n */\n protected int $limit;\n\n /**\n * @var int\n */\n protected int $offset;\n\n /**\n * Transcription Service instance.\n *\n * @var TranscriptionService\n */\n protected TranscriptionService $transcriptionService;\n\n protected LoggerInterface $logger;\n\n /**\n * Cache for opportunity fields to avoid N+1 queries during batch imports.\n * Key: crm_provider_id, Value: Field model with entities relation.\n * Cleared when configuration changes.\n *\n * @var Collection<string, Field>|null\n */\n private ?Collection $cachedOpportunityFields = null;\n\n public function __construct()\n {\n $this->teamService = app(TeamService::class);\n $this->transcriptionService = app(TranscriptionService::class);\n $this->logger = app(LoggerInterface::class);\n }\n\n /**\n * @param User $user\n *\n * @throws SocialAccountTokenInvalidException\n */\n public function setUser(User $user): void\n {\n $this->configureSentryScope($user);\n\n $this->team = $user->team;\n $this->teamService->setTeam($user->team);\n $this->setConfiguration($user->team->crm);\n\n // Reset state.\n $this->profile = $user->crmProfile;\n\n /**\n * DO NOT DELETE THIS `clearTokens` CALL\n * The purpose of purging tokens is to fix a problem in importing calendar events.\n * Calendar Import doesn't always respect \"SocialAccountInvalidTokenException\" exception\n * and may try to recycle old SF instance, with wrong credentials (by ignoring the exception).\n *\n * This code guarantees the CRM Service is unusable, unless always provided with a valid social account.\n */\n if (method_exists($this->client, 'clearTokens')) {\n $this->client->clearTokens();\n }\n\n $account = $this->getOAuthAccount($user);\n\n $this->validateUserAccountExists($user, $account);\n\n if (method_exists($this->client, 'setOAuthAccount')) {\n $this->client->setOAuthAccount($account);\n }\n if (method_exists($this->client, 'setLogger')) {\n $this->client->setLogger($this->logger);\n }\n\n if ($this->profile === null) {\n // Try to fetch their profile, maybe it was not yet imported?\n $cacheKey = sprintf('crm_profile_sync-%s', $user->getId());\n $lock = \\Cache::lock($cacheKey, 300);\n if ($lock->get()) {\n $this->profile = $this->getProfile($user);\n }\n }\n\n // The CRM Service is properly bootstrapped, and supports remote operations\n $this->connect();\n }\n\n protected function configureSentryScope(User $user): void\n {\n \\Sentry\\configureScope(function (Scope $scope) use ($user): void {\n $scope->setTag('team_id', (string) $user->getTeamId());\n $scope->setUser([\n 'id' => $user->getId(),\n 'email' => $user->getEmailAddress(),\n ]);\n });\n }\n\n /**\n * @param User $user\n *\n * @return Profile|null\n */\n protected function getProfile(User $user): ?Profile\n {\n return $this->syncProfiles($user);\n }\n\n public function getConfiguration(): Configuration\n {\n return $this->config;\n }\n\n public function setConfiguration(Configuration $config): void\n {\n $this->config = $config;\n $this->client->setConfiguration($config);\n\n // Clear field cache when configuration changes to ensure fresh data for new team/config\n $this->cachedOpportunityFields = null;\n\n if ($this->team === null) {\n $this->team = $config->team;\n }\n }\n\n public function setPage(int $limit, int $offset): void\n {\n $this->limit = $limit;\n $this->offset = $offset;\n }\n\n abstract protected function getOAuthAccount(User $user): ?SocialAccount;\n abstract protected function getDefaultFollowupLayoutFields(string $activityType): array;\n abstract protected function getFieldTypes(): array;\n abstract protected function getFields(string $fieldType): array;\n\n public function syncFields(): void\n {\n foreach ($this->getFieldTypes() as $fieldType) {\n $currentFields = $this->getFields($fieldType);\n\n // TODO: only sync the field once a day if we don't use it in any layout. If we do, sync hourly?\n foreach ($currentFields as $field) {\n /** @var Models\\Crm\\Field $field */\n $field = $this->config->fields()->updateOrCreate([\n 'crm_provider_id' => mb_strimwidth($field['name'], 0, 128),\n 'object_type' => $fieldType,\n ], [\n 'label' => mb_strimwidth($field['label'], 0, Field::LABEL_MAX_LENGTH),\n ]);\n\n try {\n $this->syncField($field);\n\n if ($field->type === Models\\Crm\\Field::TYPE_PICKLIST) {\n $this->importPicklistValues($field);\n }\n } catch (HttpNotFoundException $e) {\n $this->logger->error('[sync-fields] Field not found', [\n 'provider' => $this->getDisplayName(),\n 'crm_field' => $field->crm_provider_id,\n 'object_type' => $field->object_type,\n 'team_id' => $this->team->id,\n ]);\n } catch (HttpBadRequestException $e) {\n $this->logger->error('[sync-fields] Field not supported', [\n 'provider' => $this->getDisplayName(),\n 'crm_field' => $field->crm_provider_id,\n 'object_type' => $field->object_type,\n 'team_id' => $this->team->id,\n ]);\n }\n }\n }\n }\n\n /**\n * @param string $objectId\n * @param ?string $objectType\n *\n * @return array\n */\n public function parseRecords(string $objectId, ?string $objectType = null): array\n {\n if ($objectType === null && $this instanceof SupportsObjectTypeParseInterface) {\n $objectType = $this->parseObjectType($objectId);\n }\n\n $lead = null;\n $contact = null;\n $opportunity = null;\n $account = null;\n $stage = null;\n $countryCode = null;\n\n // Gather the prospect data to store on activity/participant.\n switch ($objectType) {\n case self::OBJECT_LEAD:\n /** @var ?Lead $lead */\n $lead = $this->config->leads()->where('crm_provider_id', $objectId)->first();\n\n if ($lead === null) {\n $lead = $this->syncLead($objectId);\n }\n\n if ($lead?->country_code) {\n $countryCode = $lead->country_code;\n }\n\n $stage = $lead?->stage;\n\n break;\n\n case self::OBJECT_ACCOUNT:\n $account = $this->config->accounts()->where('crm_provider_id', $objectId)->first();\n\n if ($account === null) {\n $account = $this->syncAccount($objectId);\n }\n\n if ($account->country_code) {\n $countryCode = $account->country_code;\n }\n\n break;\n\n case self::OBJECT_CONTACT:\n $contact = $this->config->contacts()->where('crm_provider_id', $objectId)->first();\n\n if ($contact === null) {\n $contact = $this->syncContact($objectId);\n }\n\n if ($contact?->country_code) {\n $countryCode = $contact->country_code;\n }\n\n $account = $contact?->account;\n\n break;\n\n case self::OBJECT_OPPORTUNITY:\n $opportunity = $this->config->opportunities()->where('crm_provider_id', $objectId)->first();\n\n if ($opportunity === null) {\n $opportunity = $this->syncOpportunity($objectId);\n }\n\n if ($opportunity !== null) {\n $stage = $opportunity->stage;\n\n $account = $opportunity->account;\n\n if ($account->country_code) {\n $countryCode = $account->country_code;\n }\n }\n\n break;\n }\n\n return [\n $lead,\n $account,\n $opportunity,\n $contact,\n $stage,\n $countryCode,\n ];\n }\n\n /**\n * @param null|string $name\n *\n * @return null|string\n */\n public function convertCountryNameToCode(?string $name): ?string\n {\n return app(CountryCodeResolver::class)->resolveCountryCode($name);\n }\n\n /**\n * @param PlaybookCategory $category\n *\n * @return bool\n */\n public function matchesCrmType(PlaybookCategory $category): bool\n {\n if ($category->playbook === null) {\n return false;\n }\n\n if ($category->getPlaybook()->getActivityField() === null) {\n return false;\n }\n\n $fieldValue = $category\n ->playbook\n ->activityField\n ->values()\n ->where('label', $category->name);\n\n // Check the field values for a matching option.\n return $fieldValue->exists();\n }\n\n /**\n * @param PlaybookCategory $category\n *\n * @return FieldValue|null\n */\n public function getCrmType(PlaybookCategory $category): ?FieldValue\n {\n $fieldValue = $category\n ->playbook\n ->activityField\n ->values()\n ->where('label', $category->name);\n\n return $fieldValue->first();\n }\n\n\n /**\n * @return int|float|string\n */\n public function getMinimumApiVersion(): int|float|string\n {\n return $this->client->getMinimumApiVersion();\n }\n\n /**\n * @param string $accountId\n *\n * @return bool\n */\n protected function hasAccount(string $accountId): bool\n {\n return $this->config->accounts()->where('crm_provider_id', $accountId)->exists();\n }\n\n /**\n * @param string $opportunityId\n *\n * @return bool\n */\n protected function hasOpportunity(string $opportunityId): bool\n {\n return $this->config->opportunities()->where('crm_provider_id', $opportunityId)->exists();\n }\n\n /**\n * @param string $contactId\n *\n * @return bool\n */\n protected function hasContact(string $contactId): bool\n {\n return $this->config->contacts()->where('crm_provider_id', $contactId)->exists();\n }\n\n /**\n * @param string $leadId\n *\n * @return bool\n */\n protected function hasLead(string $leadId): bool\n {\n return $this->config->leads()->where('crm_provider_id', $leadId)->exists();\n }\n\n public function fetchAndAssociateRelatedActivity(Activity $activity): ?Activity\n {\n return null;\n }\n\n public function getJobDelay(): int\n {\n return 0;\n }\n\n public function getPlaybookFromActivity(Activity $activity): ?Playbook\n {\n if ($activity->hasActivityType() && $activity->getActivityType()->hasPlaybook()) {\n return $activity->getActivityType()->getPlaybook();\n }\n\n return $this->getPlaybook($activity->getUser());\n }\n\n /**\n * Gets the playbook for the user\n */\n protected function getPlaybook(User $user): ?Playbook\n {\n $playbookResolver = app(PlaybookResolver::class);\n\n return $playbookResolver->resolvePlaybookByUser($user);\n }\n\n /**\n * @param Models\\Playbook $playbook\n * @param string $categoryName\n *\n * @return Models\\PlaybookCategory|null\n */\n protected function getPlaybookCategory(Models\\Playbook $playbook, string $categoryName): ?Models\\PlaybookCategory\n {\n return $playbook->categories()\n ->where('name', trim($categoryName))\n ->latest()\n ->first();\n }\n\n public function buildLayout(Layout $layout, ?string $activityType): void\n {\n if ($activityType) {\n // Base section. Currently, the fields within are hard coded so this is empty for now.\n /** @var Models\\Crm\\LayoutEntity $activitySection */\n $activitySection = $layout->entities()->create([\n 'label' => 'activity-summary',\n 'description' => 'Activity Summary',\n 'sequence' => 0,\n ]);\n\n if ($this instanceof HubspotInterface) {\n $activityFields = $this->getDefaultActivityLayoutFields($activityType, $layout->type);\n\n foreach ($activityFields as $i => $field) {\n $layout->entities()->create([\n 'parent_entity_id' => $activitySection->getId(),\n 'crm_field_id' => $field->getId(),\n 'sequence' => $i,\n ]);\n }\n }\n\n // Follow-up section. These are all dynamic fields.\n $sectionTitle = ($layout->type === Layout::TYPE_CONFERENCE_SUMMARY ? 'Next Steps...' : 'Follow up?');\n /** @var Models\\Crm\\LayoutEntity $followupSection */\n $followupSection = $layout->entities()->create([\n 'label' => 'follow-up',\n 'description' => $sectionTitle,\n 'sequence' => 1,\n ]);\n\n $followupFields = $this->getDefaultFollowupLayoutFields($activityType);\n\n foreach ($followupFields as $i => $field) {\n $layout->entities()->create([\n 'parent_entity_id' => $followupSection->getId(),\n 'crm_field_id' => $field->getId(),\n 'sequence' => $i,\n ]);\n }\n } elseif ($layout->type == Layout::TYPE_DEAL_INSIGHTS) {\n $this->populateLayoutEntities($layout);\n }\n }\n\n protected function populateLayoutEntities(Layout $layout): void\n {\n $dealFields = $this->getDefaultDealLayoutFields();\n\n foreach ($dealFields as $i => $field) {\n $readOnly = $field->getType() === Field::TYPE_CURRENCY\n || $this->isBusinessTypeField($field);\n\n $layout->entities()->updateOrCreate([\n 'crm_field_id' => $field->id,\n ], [\n 'sequence' => $i,\n 'read_only' => $readOnly,\n ]);\n }\n }\n\n public function prepareValueForUpdate(array $params): array\n {\n $fieldName = $params['fieldName'];\n $fieldValue = $params['fieldValue'];\n\n return [$fieldName => $fieldValue];\n }\n\n protected function getDefaultDealLayoutFields(): array\n {\n $fieldData = $this->getDealInsightsFields();\n\n $fields = [];\n foreach ($fieldData as $data) {\n /** @var Field $field */\n $field = $this->config->fields()->updateOrCreate([\n 'crm_provider_id' => $data['crm_provider_id'],\n 'object_type' => $data['object_type'],\n ], ['label' => $data['crm_provider_id']]);\n\n try {\n dispatch_sync(new SyncFieldMetadata($this->config->team, $field));\n $field->refresh();\n } catch (\\Throwable $throwable) {\n \\Sentry::captureException($throwable);\n }\n\n $fields[] = $field;\n }\n\n return $fields;\n }\n\n public function importOpportunityCrmFieldData(array $crmData, array $crmFields, int $opportunityId): void\n {\n // Pre-fetch all opportunity fields once per batch to avoid N+1 queries.\n // During webhook floods, this reduces DB queries from O(fields × deals) to O(1) for field lookups.\n $fieldsMap = $this->getOpportunityFieldsMap();\n\n foreach ($crmFields as $fieldName) {\n $field = $fieldsMap->get($fieldName);\n\n if (! $field instanceof Field) {\n $this->logger->warning('Field not found', [\n 'field' => $fieldName,\n 'opportunity_id' => $opportunityId,\n ]);\n\n continue;\n }\n\n // A CRM field data will be synced only if the field exists as part of at least one layout,\n // i.e. an entity related to the field exists.\n $entity = $field->entities->first();\n if (! $entity instanceof Models\\Crm\\LayoutEntity) {\n continue;\n }\n\n $fieldValue = $crmData[$fieldName] ?? '';\n\n if (is_object($fieldValue)) {\n $this->logger->warning('Field value is an object', [\n 'field' => $fieldName,\n ]);\n\n continue;\n }\n\n $value = $this->normalizeValue($field->type, $fieldValue, true);\n\n FieldData::updateOrCreate([\n 'crm_layout_entity_id' => $entity->id,\n 'crm_field_id' => $field->id,\n 'object_type' => 'opportunity',\n 'object_id' => $opportunityId,\n ], ['value' => $value]);\n }\n }\n\n /**\n * Get cached opportunity fields map for efficient lookups during batch imports.\n *\n * This method fetches all opportunity fields with their entities relation ONCE\n * and caches them for the lifetime of this service instance. This eliminates\n * the N+1 query problem where each field was fetched individually per deal.\n *\n * Performance impact:\n * - Before: 10 fields × 100 deals = 1,000 field queries per batch\n * - After: 1 query per batch (regardless of deal count)\n *\n * @return Collection<string, Field> Fields keyed by crm_provider_id\n */\n private function getOpportunityFieldsMap(): Collection\n {\n if ($this->cachedOpportunityFields === null) {\n $this->cachedOpportunityFields = $this->config->fields()\n ->with('entities')\n ->where('object_type', '=', self::OBJECT_OPPORTUNITY)\n ->get()\n ->keyBy('crm_provider_id');\n }\n\n return $this->cachedOpportunityFields;\n }\n\n /**\n * @param array<mixed> $crmData\n * @param Collection $crmFields\n * @param int $objectId\n *\n * @return void\n */\n public function importCrmFieldData(array $crmData, Collection $crmFields, int $objectId): void\n {\n /** @var Field $crmField */\n foreach ($crmFields as $crmField) {\n // If the field name does not match one we are interested in, skip.\n if (array_key_exists($crmField->crm_provider_id, $crmData) === false) {\n continue;\n }\n\n /** @var string $fieldValue */\n $fieldValue = $crmData[$crmField->crm_provider_id];\n\n $value = $this->normalizeValue($crmField->type, $fieldValue, true);\n\n FieldData::updateOrCreate([\n 'crm_field_id' => $crmField->id,\n 'object_type' => $crmField->object_type,\n 'object_id' => $objectId,\n ], ['value' => $value]);\n }\n }\n\n protected function getTeam(): Team\n {\n if (! $this->team instanceof Team) {\n throw new LogicException('Expecting team model instance');\n }\n\n return $this->team;\n }\n\n public function isBusinessTypeField(Field $field): bool\n {\n return in_array($field->crm_provider_id, Field::BUSINESS_TYPE_FIELDS)\n && $field->object_type === Field::OBJECT_OPPORTUNITY;\n }\n\n /**\n * @return mixed[]\n */\n public function fetchRelatedActivity(Activity $activity): array\n {\n return [];\n }\n\n /**\n * @throws SocialAccountTokenInvalidException\n */\n private function validateUserAccountExists(User $user, ?SocialAccount $account = null): void\n {\n if ($account instanceof SocialAccount && $account->state === SocialAccount::STATE_CONNECTED) {\n return;\n }\n\n $this->logger->warning(\n sprintf('[%s] Account not connected for user', $this->getDisplayName()),\n [\n 'userId' => $user->getIdString(),\n 'account' => $account,\n ]\n );\n\n // If their profile was never setup in the first place\n if ($this->profile === null) {\n // Create a dummy in-memory profile just to be able to run\n $this->profile = new Profile();\n }\n\n if (! $account instanceof SocialAccount) {\n throw new SocialAccountTokenInvalidException(\n sprintf(\n 'Social account for %s cannot be found. Please login to Jiminny to connect.',\n $this->getDisplayName()\n )\n );\n }\n\n throw new SocialAccountTokenInvalidException(\n sprintf(\n 'Your %s account has become disconnected. Please login to Jiminny to reconnect.',\n $this->getDisplayName()\n )\n );\n }\n\n public function listSupportedObjectTypes(): array\n {\n return $this->getFieldTypes();\n }\n}","role_description":"text entry area","is_enabled":true,"is_focused":true,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Execute","depth":4,"bounds":{"left":0.5265958,"top":0.074221864,"width":0.008643617,"height":0.01915403},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Explain Plan","depth":4,"bounds":{"left":0.53523934,"top":0.074221864,"width":0.008643617,"height":0.01915403},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Browse Query History","depth":4,"bounds":{"left":0.5462101,"top":0.074221864,"width":0.008643617,"height":0.01915403},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"View Parameters","depth":4,"bounds":{"left":0.55485374,"top":0.074221864,"width":0.008643617,"height":0.01915403},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Open Query Execution Settings…","depth":4,"bounds":{"left":0.56349736,"top":0.074221864,"width":0.008643617,"height":0.01915403},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"In-Editor Results","depth":4,"bounds":{"left":0.5744681,"top":0.074221864,"width":0.008643617,"height":0.01915403},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Tx: Auto","depth":4,"bounds":{"left":0.58543885,"top":0.074221864,"width":0.024268618,"height":0.01915403},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Cancel Running Statements","depth":4,"bounds":{"left":0.61203456,"top":0.074221864,"width":0.008643617,"height":0.01915403},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Playground","depth":4,"bounds":{"left":0.62300533,"top":0.074221864,"width":0.029587766,"height":0.01915403},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"jiminny","depth":4,"bounds":{"left":0.9587766,"top":0.074221864,"width":0.02825798,"height":0.01915403},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.042220745,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"6","depth":4,"bounds":{"left":0.94514626,"top":0.09896249,"width":0.007978723,"height":0.015163607},"role_description":"text"},{"role":"AXStaticText","text":"1","depth":4,"bounds":{"left":0.95511967,"top":0.09896249,"width":0.00731383,"height":0.015163607},"role_description":"text"},{"role":"AXStaticText","text":"6","depth":4,"bounds":{"left":0.9644282,"top":0.09896249,"width":0.007978723,"height":0.015163607},"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.9740692,"top":0.09736632,"width":0.00731383,"height":0.018355945},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"bounds":{"left":0.98138297,"top":0.09736632,"width":0.006981383,"height":0.018355945},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"# **************************** HS **************************************\n\nselect * from teams where id = 2; # 2\nselect * from features; # 2\nselect * from team_features where team_id = 2; # 2\nselect * from crm_configurations where id = 2; # 2\nselect * from users where team_id = 2; #\nselect * from playbooks where team_id = 2; # event 38\nselect * from playbook_categories where playbook_id = 38; #\n\nSELECT * FROM activities WHERE crm_configuration_id = 2 and crm_provider_id is not null order by id desc;\nhttps://app.hubspot.com/contacts/4392066/deal/16964514951/?engagement=96069102624\n https://app.staging.jiminny.com/playback/d5df34dc-bd66-4ff5-a7b3-8d3be30322a0\n\nSELECT * FROM activities WHERE uuid_to_bin('04fdcd0d-818f-4c53-92dc-6f18bc753ffd') = uuid;\n# 609126 softphone tr. 11241\n\nSELECT * FROM activities WHERE uuid_to_bin('6521bfcd-5a30-46e5-9f74-5440fd48befd') = uuid;\n# 608874 conference tr. 11226 crmId: 103422236596\n\nselect * from ai_prompts where transcription_id IN (11241, 11226);\nselect * from activity_summary_logs where activity_id = 608874;\n\nselect * from sidekick_settings;\nselect * from default_activity_types;\n\nselect * from crm_field_data where activity_id = 1223;\n\nselect * from crm_layouts where crm_configuration_id = 2;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id IN (554);\nselect * from crm_fields where crm_configuration_id = 11 and object_type = 'event';\nSELECT * FROM crm_field_values WHERE crm_field_id IN (1455,1450);\n\nSELECT * FROM crm_field_data WHERE crm_layout_entity_id = 971;\nSELECT * FROM crm_field_data WHERE crm_layout_entity_id IN (6494,6495,6496,6497,6498,6499);\n\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u\n on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 2 and sa.provider = 'hubspot';\n\nselect * from opportunities where team_id = 2\nand crm_provider_id IN ('51317301383');\n\nselect * from contacts where id = 85;\n\nselect * from opportunities where team_id = 2 order by id desc;\nselect * from opportunities where team_id = 2 and crm_provider_id = '51317301383'; # 5112\nselect * from opportunities where team_id = 2 and crm_provider_id = '55976759904'; # 5112\nselect * from opportunity_contacts where opportunity_id = 5117;\nselect * from crm_field_data where object_id = 1365;\nSELECT * FROM crm_fields WHERE id IN (1405, 1407, 1972, 2128);\n\nselect * from features;\nselect * from team_features where team_id IN (1);\nselect * from team_features where feature_id IN (36);\n\nSHOW CREATE TABLE opportunity_contacts;\nSELECT * FROM opportunity_contacts WHERE crm_provider_id = '111751';\n\n# $slug = 'HUBSPOT_WEBHOOK_SYNC';\n# $team = Jiminny\\Models\\Team::find(2);\n# $feature = Feature::query()->where('slug', $slug)->first();\n# TeamFeature::query()->create(['feature_id' => $feature->getId(),'team_id' => $team->getId()]);\n\n# hubspot_webhook_metrics\n\nselect * from opportunities where team_id = 2 and crm_provider_id IN ('374720564','14527423589','49908861993','50435771779'); # 1365\nSELECT * FROM opportunity_contacts WHERE opportunity_id = '414';\nSELECT * FROM opportunity_contacts WHERE crm_provider_id = '131501';\nselect * from contacts where id in (414, 464);\n\nselect * from activities where crm_configuration_id = 2;\n\nselect settings from crm_configurations where id = 11;\n\nselect * from teams; # 1, 2\nselect * from users;\nselect * from crm_configurations where id = 39;\nselect * from team_features where team_id = 2;\nselect * from features;\n# SELECT * FROM opportunities WHERE crm_configuration_id = 2\n# order by id desc;\n# and crm_provider_id = '49908861993';\n\n\nselect * from activity_providers where id IN (443, 202, 203, 227);\n\nselect * from activity_imports where id = 795889;\n\nselect c.id, c.provider, c.settings, t.* from teams t join crm_configurations c on t.id = c.team_id\nwhere c.provider = 'hubspot';\n\nselect * from crm_configurations crm JOIN teams t on crm.team_id = t.id\nwhere provider = 'hubspot';\nSELECT * FROM teams WHERE id = 31;\nSELECT * FROM users WHERE id = 257;\nSELECT * FROM opportunities WHERE team_id = 2;\n\nselect * from opportunity_contacts where opportunity_id = 5124;\nselect * from contacts where id IN (3850,3853,3851,4073,4140,4155,4480,4530,4623,5986,513,687,1806,1523,3613)\n\nselect * from activities where crm_configuration_id = 13;\n\nSELECT * FROM activities WHERE uuid_to_bin('826619ce-ec8e-4e59-8467-a01f5f6ad71e') = uuid; # 418141\n\n\nselect id, team_id, crm_provider_id from crm_configurations where provider = 'hubspot' and crm_provider_id IS NOT NULL;\nSELECT * FROM accounts WHERE team_id = 2 and crm_provider_id = '1212213464' order by id desc;\nSELECT * FROM contacts WHERE team_id = 2 and account_id = 5189 order by id desc;\nSELECT * FROM contacts WHERE team_id = 2 order by id desc;\nselect * from opportunity_contacts where contact_id = 6223;\nSELECT * FROM opportunities WHERE team_id = 2 and account_id = 5189 order by id desc;\n\nselect * from crm_profiles where crm_configuration_id = 2;\n\nselect * from activities where account_id = 46;","depth":4,"value":"# **************************** HS **************************************\n\nselect * from teams where id = 2; # 2\nselect * from features; # 2\nselect * from team_features where team_id = 2; # 2\nselect * from crm_configurations where id = 2; # 2\nselect * from users where team_id = 2; #\nselect * from playbooks where team_id = 2; # event 38\nselect * from playbook_categories where playbook_id = 38; #\n\nSELECT * FROM activities WHERE crm_configuration_id = 2 and crm_provider_id is not null order by id desc;\nhttps://app.hubspot.com/contacts/4392066/deal/16964514951/?engagement=96069102624\n https://app.staging.jiminny.com/playback/d5df34dc-bd66-4ff5-a7b3-8d3be30322a0\n\nSELECT * FROM activities WHERE uuid_to_bin('04fdcd0d-818f-4c53-92dc-6f18bc753ffd') = uuid;\n# 609126 softphone tr. 11241\n\nSELECT * FROM activities WHERE uuid_to_bin('6521bfcd-5a30-46e5-9f74-5440fd48befd') = uuid;\n# 608874 conference tr. 11226 crmId: 103422236596\n\nselect * from ai_prompts where transcription_id IN (11241, 11226);\nselect * from activity_summary_logs where activity_id = 608874;\n\nselect * from sidekick_settings;\nselect * from default_activity_types;\n\nselect * from crm_field_data where activity_id = 1223;\n\nselect * from crm_layouts where crm_configuration_id = 2;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id IN (554);\nselect * from crm_fields where crm_configuration_id = 11 and object_type = 'event';\nSELECT * FROM crm_field_values WHERE crm_field_id IN (1455,1450);\n\nSELECT * FROM crm_field_data WHERE crm_layout_entity_id = 971;\nSELECT * FROM crm_field_data WHERE crm_layout_entity_id IN (6494,6495,6496,6497,6498,6499);\n\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u\n on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 2 and sa.provider = 'hubspot';\n\nselect * from opportunities where team_id = 2\nand crm_provider_id IN ('51317301383');\n\nselect * from contacts where id = 85;\n\nselect * from opportunities where team_id = 2 order by id desc;\nselect * from opportunities where team_id = 2 and crm_provider_id = '51317301383'; # 5112\nselect * from opportunities where team_id = 2 and crm_provider_id = '55976759904'; # 5112\nselect * from opportunity_contacts where opportunity_id = 5117;\nselect * from crm_field_data where object_id = 1365;\nSELECT * FROM crm_fields WHERE id IN (1405, 1407, 1972, 2128);\n\nselect * from features;\nselect * from team_features where team_id IN (1);\nselect * from team_features where feature_id IN (36);\n\nSHOW CREATE TABLE opportunity_contacts;\nSELECT * FROM opportunity_contacts WHERE crm_provider_id = '111751';\n\n# $slug = 'HUBSPOT_WEBHOOK_SYNC';\n# $team = Jiminny\\Models\\Team::find(2);\n# $feature = Feature::query()->where('slug', $slug)->first();\n# TeamFeature::query()->create(['feature_id' => $feature->getId(),'team_id' => $team->getId()]);\n\n# hubspot_webhook_metrics\n\nselect * from opportunities where team_id = 2 and crm_provider_id IN ('374720564','14527423589','49908861993','50435771779'); # 1365\nSELECT * FROM opportunity_contacts WHERE opportunity_id = '414';\nSELECT * FROM opportunity_contacts WHERE crm_provider_id = '131501';\nselect * from contacts where id in (414, 464);\n\nselect * from activities where crm_configuration_id = 2;\n\nselect settings from crm_configurations where id = 11;\n\nselect * from teams; # 1, 2\nselect * from users;\nselect * from crm_configurations where id = 39;\nselect * from team_features where team_id = 2;\nselect * from features;\n# SELECT * FROM opportunities WHERE crm_configuration_id = 2\n# order by id desc;\n# and crm_provider_id = '49908861993';\n\n\nselect * from activity_providers where id IN (443, 202, 203, 227);\n\nselect * from activity_imports where id = 795889;\n\nselect c.id, c.provider, c.settings, t.* from teams t join crm_configurations c on t.id = c.team_id\nwhere c.provider = 'hubspot';\n\nselect * from crm_configurations crm JOIN teams t on crm.team_id = t.id\nwhere provider = 'hubspot';\nSELECT * FROM teams WHERE id = 31;\nSELECT * FROM users WHERE id = 257;\nSELECT * FROM opportunities WHERE team_id = 2;\n\nselect * from opportunity_contacts where opportunity_id = 5124;\nselect * from contacts where id IN (3850,3853,3851,4073,4140,4155,4480,4530,4623,5986,513,687,1806,1523,3613)\n\nselect * from activities where crm_configuration_id = 13;\n\nSELECT * FROM activities WHERE uuid_to_bin('826619ce-ec8e-4e59-8467-a01f5f6ad71e') = uuid; # 418141\n\n\nselect id, team_id, crm_provider_id from crm_configurations where provider = 'hubspot' and crm_provider_id IS NOT NULL;\nSELECT * FROM accounts WHERE team_id = 2 and crm_provider_id = '1212213464' order by id desc;\nSELECT * FROM contacts WHERE team_id = 2 and account_id = 5189 order by id desc;\nSELECT * FROM contacts WHERE team_id = 2 order by id desc;\nselect * from opportunity_contacts where contact_id = 6223;\nSELECT * FROM opportunities WHERE team_id = 2 and account_id = 5189 order by id desc;\n\nselect * from crm_profiles where crm_configuration_id = 2;\n\nselect * from activities where account_id = 46;","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Project","depth":3,"role_description":"text"},{"role":"AXButton","text":"Project","depth":3,"bounds":{"left":0.011968086,"top":0.047885075,"width":0.024268618,"height":0.024740623},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"New File or Directory…","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Expand Selected","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Collapse All","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Options","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
-3901041415012267504
|
633758359911316605
|
click
|
accessibility
|
NULL
|
Project: faVsco.js, menu
#11976 on JY-20553-debug- Project: faVsco.js, menu
#11976 on JY-20553-debug-crm-sync-delays, menu
Start Listening for PHP Debug Connections
RequestGenerateAskJiminnyReportJobTest
Run 'RequestGenerateAskJiminnyReportJobTest'
Debug 'RequestGenerateAskJiminnyReportJobTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
1
19
2
Previous Highlighted Error
Next Highlighted Error
<?php
namespace Jiminny\Services\Crm;
use Illuminate\Support\Collection;
use Jiminny\Component\Transcription\Service\TranscriptionService;
use Jiminny\Contracts\Services\Crm\ClientInterface;
use Jiminny\Contracts\Services\Crm\ConnectionStateInterface;
use Jiminny\Contracts\Services\Crm\Provider\HubspotInterface;
use Jiminny\Contracts\Services\Crm\ServiceInterface;
use Jiminny\Contracts\Services\Crm\SettingsInterface;
use Jiminny\Contracts\Services\Crm\SupportsObjectTypeParseInterface;
use Jiminny\Contracts\Services\Crm\SyncCrmEntitiesInterface;
use Jiminny\Exceptions\HttpBadRequestException;
use Jiminny\Exceptions\HttpNotFoundException;
use Jiminny\Exceptions\LogicException;
use Jiminny\Exceptions\SocialAccountTokenInvalidException;
use Jiminny\Integrations\PlaybookResolver;
use Jiminny\Jobs\Crm\SyncFieldMetadata;
use Jiminny\Models;
use Jiminny\Models\Activity;
use Jiminny\Models\Crm\Configuration;
use Jiminny\Models\Crm\Field;
use Jiminny\Models\Crm\FieldData;
use Jiminny\Models\Crm\FieldValue;
use Jiminny\Models\Crm\Layout;
use Jiminny\Models\Crm\Profile;
use Jiminny\Models\Lead;
use Jiminny\Models\Playbook;
use Jiminny\Models\PlaybookCategory;
use Jiminny\Models\SocialAccount;
use Jiminny\Models\Team;
use Jiminny\Models\User;
use Jiminny\Services\Crm\Helpers\ConnectionStateTrait;
use Jiminny\Services\Crm\Helpers\OpportunitySyncableFieldsTrait;
use Jiminny\Services\TeamService;
use Psr\Log\LoggerInterface;
use Sentry\State\Scope;
abstract class BaseService implements
ServiceInterface,
SettingsInterface,
SyncCrmEntitiesInterface,
ConnectionStateInterface
{
use ConnectionStateTrait;
use OpportunitySyncableFieldsTrait;
public const string OBJECT_LEAD = 'lead';
public const string OBJECT_ACCOUNT = 'account';
public const string OBJECT_CONTACT = 'contact';
public const string OBJECT_OPPORTUNITY = 'opportunity';
public const string OBJECT_TASK = 'task';
public const string OBJECT_EVENT = 'event';
public const int SOFT_DELETE_CHUNK = 100;
public const int HARD_DELETE_CHUNK = 1000;
public ?Configuration $config;
public ?Profile $profile;
public ?Team $team = null;
/**
* @var ClientInterface
*/
protected $client;
/**
* @var TeamService
*/
protected TeamService $teamService;
/**
* @var int
*/
protected int $limit;
/**
* @var int
*/
protected int $offset;
/**
* Transcription Service instance.
*
* @var TranscriptionService
*/
protected TranscriptionService $transcriptionService;
protected LoggerInterface $logger;
/**
* Cache for opportunity fields to avoid N+1 queries during batch imports.
* Key: crm_provider_id, Value: Field model with entities relation.
* Cleared when configuration changes.
*
* @var Collection<string, Field>|null
*/
private ?Collection $cachedOpportunityFields = null;
public function __construct()
{
$this->teamService = app(TeamService::class);
$this->transcriptionService = app(TranscriptionService::class);
$this->logger = app(LoggerInterface::class);
}
/**
* @param User $user
*
* @throws SocialAccountTokenInvalidException
*/
public function setUser(User $user): void
{
$this->configureSentryScope($user);
$this->team = $user->team;
$this->teamService->setTeam($user->team);
$this->setConfiguration($user->team->crm);
// Reset state.
$this->profile = $user->crmProfile;
/**
* DO NOT DELETE THIS `clearTokens` CALL
* The purpose of purging tokens is to fix a problem in importing calendar events.
* Calendar Import doesn't always respect "SocialAccountInvalidTokenException" exception
* and may try to recycle old SF instance, with wrong credentials (by ignoring the exception).
*
* This code guarantees the CRM Service is unusable, unless always provided with a valid social account.
*/
if (method_exists($this->client, 'clearTokens')) {
$this->client->clearTokens();
}
$account = $this->getOAuthAccount($user);
$this->validateUserAccountExists($user, $account);
if (method_exists($this->client, 'setOAuthAccount')) {
$this->client->setOAuthAccount($account);
}
if (method_exists($this->client, 'setLogger')) {
$this->client->setLogger($this->logger);
}
if ($this->profile === null) {
// Try to fetch their profile, maybe it was not yet imported?
$cacheKey = sprintf('crm_profile_sync-%s', $user->getId());
$lock = \Cache::lock($cacheKey, 300);
if ($lock->get()) {
$this->profile = $this->getProfile($user);
}
}
// The CRM Service is properly bootstrapped, and supports remote operations
$this->connect();
}
protected function configureSentryScope(User $user): void
{
\Sentry\configureScope(function (Scope $scope) use ($user): void {
$scope->setTag('team_id', (string) $user->getTeamId());
$scope->setUser([
'id' => $user->getId(),
'email' => $user->getEmailAddress(),
]);
});
}
/**
* @param User $user
*
* @return Profile|null
*/
protected function getProfile(User $user): ?Profile
{
return $this->syncProfiles($user);
}
public function getConfiguration(): Configuration
{
return $this->config;
}
public function setConfiguration(Configuration $config): void
{
$this->config = $config;
$this->client->setConfiguration($config);
// Clear field cache when configuration changes to ensure fresh data for new team/config
$this->cachedOpportunityFields = null;
if ($this->team === null) {
$this->team = $config->team;
}
}
public function setPage(int $limit, int $offset): void
{
$this->limit = $limit;
$this->offset = $offset;
}
abstract protected function getOAuthAccount(User $user): ?SocialAccount;
abstract protected function getDefaultFollowupLayoutFields(string $activityType): array;
abstract protected function getFieldTypes(): array;
abstract protected function getFields(string $fieldType): array;
public function syncFields(): void
{
foreach ($this->getFieldTypes() as $fieldType) {
$currentFields = $this->getFields($fieldType);
// TODO: only sync the field once a day if we don't use it in any layout. If we do, sync hourly?
foreach ($currentFields as $field) {
/** @var Models\Crm\Field $field */
$field = $this->config->fields()->updateOrCreate([
'crm_provider_id' => mb_strimwidth($field['name'], 0, 128),
'object_type' => $fieldType,
], [
'label' => mb_strimwidth($field['label'], 0, Field::LABEL_MAX_LENGTH),
]);
try {
$this->syncField($field);
if ($field->type === Models\Crm\Field::TYPE_PICKLIST) {
$this->importPicklistValues($field);
}
} catch (HttpNotFoundException $e) {
$this->logger->error('[sync-fields] Field not found', [
'provider' => $this->getDisplayName(),
'crm_field' => $field->crm_provider_id,
'object_type' => $field->object_type,
'team_id' => $this->team->id,
]);
} catch (HttpBadRequestException $e) {
$this->logger->error('[sync-fields] Field not supported', [
'provider' => $this->getDisplayName(),
'crm_field' => $field->crm_provider_id,
'object_type' => $field->object_type,
'team_id' => $this->team->id,
]);
}
}
}
}
/**
* @param string $objectId
* @param ?string $objectType
*
* @return array
*/
public function parseRecords(string $objectId, ?string $objectType = null): array
{
if ($objectType === null && $this instanceof SupportsObjectTypeParseInterface) {
$objectType = $this->parseObjectType($objectId);
}
$lead = null;
$contact = null;
$opportunity = null;
$account = null;
$stage = null;
$countryCode = null;
// Gather the prospect data to store on activity/participant.
switch ($objectType) {
case self::OBJECT_LEAD:
/** @var ?Lead $lead */
$lead = $this->config->leads()->where('crm_provider_id', $objectId)->first();
if ($lead === null) {
$lead = $this->syncLead($objectId);
}
if ($lead?->country_code) {
$countryCode = $lead->country_code;
}
$stage = $lead?->stage;
break;
case self::OBJECT_ACCOUNT:
$account = $this->config->accounts()->where('crm_provider_id', $objectId)->first();
if ($account === null) {
$account = $this->syncAccount($objectId);
}
if ($account->country_code) {
$countryCode = $account->country_code;
}
break;
case self::OBJECT_CONTACT:
$contact = $this->config->contacts()->where('crm_provider_id', $objectId)->first();
if ($contact === null) {
$contact = $this->syncContact($objectId);
}
if ($contact?->country_code) {
$countryCode = $contact->country_code;
}
$account = $contact?->account;
break;
case self::OBJECT_OPPORTUNITY:
$opportunity = $this->config->opportunities()->where('crm_provider_id', $objectId)->first();
if ($opportunity === null) {
$opportunity = $this->syncOpportunity($objectId);
}
if ($opportunity !== null) {
$stage = $opportunity->stage;
$account = $opportunity->account;
if ($account->country_code) {
$countryCode = $account->country_code;
}
}
break;
}
return [
$lead,
$account,
$opportunity,
$contact,
$stage,
$countryCode,
];
}
/**
* @param null|string $name
*
* @return null|string
*/
public function convertCountryNameToCode(?string $name): ?string
{
return app(CountryCodeResolver::class)->resolveCountryCode($name);
}
/**
* @param PlaybookCategory $category
*
* @return bool
*/
public function matchesCrmType(PlaybookCategory $category): bool
{
if ($category->playbook === null) {
return false;
}
if ($category->getPlaybook()->getActivityField() === null) {
return false;
}
$fieldValue = $category
->playbook
->activityField
->values()
->where('label', $category->name);
// Check the field values for a matching option.
return $fieldValue->exists();
}
/**
* @param PlaybookCategory $category
*
* @return FieldValue|null
*/
public function getCrmType(PlaybookCategory $category): ?FieldValue
{
$fieldValue = $category
->playbook
->activityField
->values()
->where('label', $category->name);
return $fieldValue->first();
}
/**
* @return int|float|string
*/
public function getMinimumApiVersion(): int|float|string
{
return $this->client->getMinimumApiVersion();
}
/**
* @param string $accountId
*
* @return bool
*/
protected function hasAccount(string $accountId): bool
{
return $this->config->accounts()->where('crm_provider_id', $accountId)->exists();
}
/**
* @param string $opportunityId
*
* @return bool
*/
protected function hasOpportunity(string $opportunityId): bool
{
return $this->config->opportunities()->where('crm_provider_id', $opportunityId)->exists();
}
/**
* @param string $contactId
*
* @return bool
*/
protected function hasContact(string $contactId): bool
{
return $this->config->contacts()->where('crm_provider_id', $contactId)->exists();
}
/**
* @param string $leadId
*
* @return bool
*/
protected function hasLead(string $leadId): bool
{
return $this->config->leads()->where('crm_provider_id', $leadId)->exists();
}
public function fetchAndAssociateRelatedActivity(Activity $activity): ?Activity
{
return null;
}
public function getJobDelay(): int
{
return 0;
}
public function getPlaybookFromActivity(Activity $activity): ?Playbook
{
if ($activity->hasActivityType() && $activity->getActivityType()->hasPlaybook()) {
return $activity->getActivityType()->getPlaybook();
}
return $this->getPlaybook($activity->getUser());
}
/**
* Gets the playbook for the user
*/
protected function getPlaybook(User $user): ?Playbook
{
$playbookResolver = app(PlaybookResolver::class);
return $playbookResolver->resolvePlaybookByUser($user);
}
/**
* @param Models\Playbook $playbook
* @param string $categoryName
*
* @return Models\PlaybookCategory|null
*/
protected function getPlaybookCategory(Models\Playbook $playbook, string $categoryName): ?Models\PlaybookCategory
{
return $playbook->categories()
->where('name', trim($categoryName))
->latest()
->first();
}
public function buildLayout(Layout $layout, ?string $activityType): void
{
if ($activityType) {
// Base section. Currently, the fields within are hard coded so this is empty for now.
/** @var Models\Crm\LayoutEntity $activitySection */
$activitySection = $layout->entities()->create([
'label' => 'activity-summary',
'description' => 'Activity Summary',
'sequence' => 0,
]);
if ($this instanceof HubspotInterface) {
$activityFields = $this->getDefaultActivityLayoutFields($activityType, $layout->type);
foreach ($activityFields as $i => $field) {
$layout->entities()->create([
'parent_entity_id' => $activitySection->getId(),
'crm_field_id' => $field->getId(),
'sequence' => $i,
]);
}
}
// Follow-up section. These are all dynamic fields.
$sectionTitle = ($layout->type === Layout::TYPE_CONFERENCE_SUMMARY ? 'Next Steps...' : 'Follow up?');
/** @var Models\Crm\LayoutEntity $followupSection */
$followupSection = $layout->entities()->create([
'label' => 'follow-up',
'description' => $sectionTitle,
'sequence' => 1,
]);
$followupFields = $this->getDefaultFollowupLayoutFields($activityType);
foreach ($followupFields as $i => $field) {
$layout->entities()->create([
'parent_entity_id' => $followupSection->getId(),
'crm_field_id' => $field->getId(),
'sequence' => $i,
]);
}
} elseif ($layout->type == Layout::TYPE_DEAL_INSIGHTS) {
$this->populateLayoutEntities($layout);
}
}
protected function populateLayoutEntities(Layout $layout): void
{
$dealFields = $this->getDefaultDealLayoutFields();
foreach ($dealFields as $i => $field) {
$readOnly = $field->getType() === Field::TYPE_CURRENCY
|| $this->isBusinessTypeField($field);
$layout->entities()->updateOrCreate([
'crm_field_id' => $field->id,
], [
'sequence' => $i,
'read_only' => $readOnly,
]);
}
}
public function prepareValueForUpdate(array $params): array
{
$fieldName = $params['fieldName'];
$fieldValue = $params['fieldValue'];
return [$fieldName => $fieldValue];
}
protected function getDefaultDealLayoutFields(): array
{
$fieldData = $this->getDealInsightsFields();
$fields = [];
foreach ($fieldData as $data) {
/** @var Field $field */
$field = $this->config->fields()->updateOrCreate([
'crm_provider_id' => $data['crm_provider_id'],
'object_type' => $data['object_type'],
], ['label' => $data['crm_provider_id']]);
try {
dispatch_sync(new SyncFieldMetadata($this->config->team, $field));
$field->refresh();
} catch (\Throwable $throwable) {
\Sentry::captureException($throwable);
}
$fields[] = $field;
}
return $fields;
}
public function importOpportunityCrmFieldData(array $crmData, array $crmFields, int $opportunityId): void
{
// Pre-fetch all opportunity fields once per batch to avoid N+1 queries.
// During webhook floods, this reduces DB queries from O(fields × deals) to O(1) for field lookups.
$fieldsMap = $this->getOpportunityFieldsMap();
foreach ($crmFields as $fieldName) {
$field = $fieldsMap->get($fieldName);
if (! $field instanceof Field) {
$this->logger->warning('Field not found', [
'field' => $fieldName,
'opportunity_id' => $opportunityId,
]);
continue;
}
// A CRM field data will be synced only if the field exists as part of at least one layout,
// i.e. an entity related to the field exists.
$entity = $field->entities->first();
if (! $entity instanceof Models\Crm\LayoutEntity) {
continue;
}
$fieldValue = $crmData[$fieldName] ?? '';
if (is_object($fieldValue)) {
$this->logger->warning('Field value is an object', [
'field' => $fieldName,
]);
continue;
}
$value = $this->normalizeValue($field->type, $fieldValue, true);
FieldData::updateOrCreate([
'crm_layout_entity_id' => $entity->id,
'crm_field_id' => $field->id,
'object_type' => 'opportunity',
'object_id' => $opportunityId,
], ['value' => $value]);
}
}
/**
* Get cached opportunity fields map for efficient lookups during batch imports.
*
* This method fetches all opportunity fields with their entities relation ONCE
* and caches them for the lifetime of this service instance. This eliminates
* the N+1 query problem where each field was fetched individually per deal.
*
* Performance impact:
* - Before: 10 fields × 100 deals = 1,000 field queries per batch
* - After: 1 query per batch (regardless of deal count)
*
* @return Collection<string, Field> Fields keyed by crm_provider_id
*/
private function getOpportunityFieldsMap(): Collection
{
if ($this->cachedOpportunityFields === null) {
$this->cachedOpportunityFields = $this->config->fields()
->with('entities')
->where('object_type', '=', self::OBJECT_OPPORTUNITY)
->get()
->keyBy('crm_provider_id');
}
return $this->cachedOpportunityFields;
}
/**
* @param array<mixed> $crmData
* @param Collection $crmFields
* @param int $objectId
*
* @return void
*/
public function importCrmFieldData(array $crmData, Collection $crmFields, int $objectId): void
{
/** @var Field $crmField */
foreach ($crmFields as $crmField) {
// If the field name does not match one we are interested in, skip.
if (array_key_exists($crmField->crm_provider_id, $crmData) === false) {
continue;
}
/** @var string $fieldValue */
$fieldValue = $crmData[$crmField->crm_provider_id];
$value = $this->normalizeValue($crmField->type, $fieldValue, true);
FieldData::updateOrCreate([
'crm_field_id' => $crmField->id,
'object_type' => $crmField->object_type,
'object_id' => $objectId,
], ['value' => $value]);
}
}
protected function getTeam(): Team
{
if (! $this->team instanceof Team) {
throw new LogicException('Expecting team model instance');
}
return $this->team;
}
public function isBusinessTypeField(Field $field): bool
{
return in_array($field->crm_provider_id, Field::BUSINESS_TYPE_FIELDS)
&& $field->object_type === Field::OBJECT_OPPORTUNITY;
}
/**
* @return mixed[]
*/
public function fetchRelatedActivity(Activity $activity): array
{
return [];
}
/**
* @throws SocialAccountTokenInvalidException
*/
private function validateUserAccountExists(User $user, ?SocialAccount $account = null): void
{
if ($account instanceof SocialAccount && $account->state === SocialAccount::STATE_CONNECTED) {
return;
}
$this->logger->warning(
sprintf('[%s] Account not connected for user', $this->getDisplayName()),
[
'userId' => $user->getIdString(),
'account' => $account,
]
);
// If their profile was never setup in the first place
if ($this->profile === null) {
// Create a dummy in-memory profile just to be able to run
$this->profile = new Profile();
}
if (! $account instanceof SocialAccount) {
throw new SocialAccountTokenInvalidException(
sprintf(
'Social account for %s cannot be found. Please login to Jiminny to connect.',
$this->getDisplayName()
)
);
}
throw new SocialAccountTokenInvalidException(
sprintf(
'Your %s account has become disconnected. Please login to Jiminny to reconnect.',
$this->getDisplayName()
)
);
}
public function listSupportedObjectTypes(): array
{
return $this->getFieldTypes();
}
}
Execute
Explain Plan
Browse Query History
View Parameters
Open Query Execution Settings…
In-Editor Results
Tx: Auto
Cancel Running Statements
Playground
jiminny
Code changed:
Hide
Sync Changes
Hide This Notification
6
1
6
Previous Highlighted Error
Next Highlighted Error
# [PASSWORD_DOTS] HS [PASSWORD_DOTS]
select * from teams where id = 2; # 2
select * from features; # 2
select * from team_features where team_id = 2; # 2
select * from crm_configurations where id = 2; # 2
select * from users where team_id = 2; #
select * from playbooks where team_id = 2; # event 38
select * from playbook_categories where playbook_id = 38; #
SELECT * FROM activities WHERE crm_configuration_id = 2 and crm_provider_id is not null order by id desc;
https://app.hubspot.com/contacts/4392066/deal/16964514951/?engagement=96069102624
https://app.staging.jiminny.com/playback/d5df34dc-bd66-4ff5-a7b3-8d3be30322a0
SELECT * FROM activities WHERE uuid_to_bin('04fdcd0d-818f-4c53-92dc-6f18bc753ffd') = uuid;
# 609126 softphone tr. 11241
SELECT * FROM activities WHERE uuid_to_bin('6521bfcd-5a30-46e5-9f74-5440fd48befd') = uuid;
# 608874 conference tr. 11226 crmId: 103422236596
select * from ai_prompts where transcription_id IN (11241, 11226);
select * from activity_summary_logs where activity_id = 608874;
select * from sidekick_settings;
select * from default_activity_types;
select * from crm_field_data where activity_id = 1223;
select * from crm_layouts where crm_configuration_id = 2;
SELECT * FROM crm_layout_entities WHERE crm_layout_id IN (554);
select * from crm_fields where crm_configuration_id = 11 and object_type = 'event';
SELECT * FROM crm_field_values WHERE crm_field_id IN (1455,1450);
SELECT * FROM crm_field_data WHERE crm_layout_entity_id = 971;
SELECT * FROM crm_field_data WHERE crm_layout_entity_id IN (6494,6495,6496,6497,6498,6499);
SELECT
CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,
u.email,
sa.*,
t.owner_id FROM social_accounts sa
JOIN users u
on u.id = sa.sociable_id
JOIN teams t on t.id = u.team_id
WHERE u.team_id = 2 and sa.provider = 'hubspot';
select * from opportunities where team_id = 2
and crm_provider_id IN ('51317301383');
select * from contacts where id = 85;
select * from opportunities where team_id = 2 order by id desc;
select * from opportunities where team_id = 2 and crm_provider_id = '51317301383'; # 5112
select * from opportunities where team_id = 2 and crm_provider_id = '55976759904'; # 5112
select * from opportunity_contacts where opportunity_id = 5117;
select * from crm_field_data where object_id = 1365;
SELECT * FROM crm_fields WHERE id IN (1405, 1407, 1972, 2128);
select * from features;
select * from team_features where team_id IN (1);
select * from team_features where feature_id IN (36);
SHOW CREATE TABLE opportunity_contacts;
SELECT * FROM opportunity_contacts WHERE crm_provider_id = '111751';
# $slug = 'HUBSPOT_WEBHOOK_SYNC';
# $team = Jiminny\Models\Team::find(2);
# $feature = Feature::query()->where('slug', $slug)->first();
# TeamFeature::query()->create(['feature_id' => $feature->getId(),'team_id' => $team->getId()]);
# hubspot_webhook_metrics
select * from opportunities where team_id = 2 and crm_provider_id IN ('374720564','14527423589','49908861993','50435771779'); # 1365
SELECT * FROM opportunity_contacts WHERE opportunity_id = '414';
SELECT * FROM opportunity_contacts WHERE crm_provider_id = '131501';
select * from contacts where id in (414, 464);
select * from activities where crm_configuration_id = 2;
select settings from crm_configurations where id = 11;
select * from teams; # 1, 2
select * from users;
select * from crm_configurations where id = 39;
select * from team_features where team_id = 2;
select * from features;
# SELECT * FROM opportunities WHERE crm_configuration_id = 2
# order by id desc;
# and crm_provider_id = '49908861993';
select * from activity_providers where id IN (443, 202, 203, 227);
select * from activity_imports where id = 795889;
select c.id, c.provider, c.settings, t.* from teams t join crm_configurations c on t.id = c.team_id
where c.provider = 'hubspot';
select * from crm_configurations crm JOIN teams t on crm.team_id = t.id
where provider = 'hubspot';
SELECT * FROM teams WHERE id = 31;
SELECT * FROM users WHERE id = 257;
SELECT * FROM opportunities WHERE team_id = 2;
select * from opportunity_contacts where opportunity_id = 5124;
select * from contacts where id IN (3850,3853,3851,4073,4140,4155,4480,4530,4623,5986,513,687,1806,1523,3613)
select * from activities where crm_configuration_id = 13;
SELECT * FROM activities WHERE uuid_to_bin('826619ce-ec8e-4e59-8467-a01f5f6ad71e') = uuid; # 418141
select id, team_id, crm_provider_id from crm_configurations where provider = 'hubspot' and crm_provider_id IS NOT NULL;
SELECT * FROM accounts WHERE team_id = 2 and crm_provider_id = '1212213464' order by id desc;
SELECT * FROM contacts WHERE team_id = 2 and account_id = 5189 order by id desc;
SELECT * FROM contacts WHERE team_id = 2 order by id desc;
select * from opportunity_contacts where contact_id = 6223;
SELECT * FROM opportunities WHERE team_id = 2 and account_id = 5189 order by id desc;
select * from crm_profiles where crm_configuration_id = 2;
select * from activities where account_id = 46;
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide...
|
55616
|
|
55618
|
NULL
|
0
|
2026-04-20T09:58:37.268287+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-20/1776 /Users/lukas/.screenpipe/data/data/2026-04-20/1776679117268_m1.jpg...
|
PhpStorm
|
faVsco.js – BaseService.php
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
#11976 on JY-20553-debug- Project: faVsco.js, menu
#11976 on JY-20553-debug-crm-sync-delays, menu
Start Listening for PHP Debug Connections
RequestGenerateAskJiminnyReportJobTest
Run 'RequestGenerateAskJiminnyReportJobTest'
Debug 'RequestGenerateAskJiminnyReportJobTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
1
19
2
Previous Highlighted Error
Next Highlighted Error
<?php
namespace Jiminny\Services\Crm;
use Illuminate\Support\Collection;
use Jiminny\Component\Transcription\Service\TranscriptionService;
use Jiminny\Contracts\Services\Crm\ClientInterface;
use Jiminny\Contracts\Services\Crm\ConnectionStateInterface;
use Jiminny\Contracts\Services\Crm\Provider\HubspotInterface;
use Jiminny\Contracts\Services\Crm\ServiceInterface;
use Jiminny\Contracts\Services\Crm\SettingsInterface;
use Jiminny\Contracts\Services\Crm\SupportsObjectTypeParseInterface;
use Jiminny\Contracts\Services\Crm\SyncCrmEntitiesInterface;
use Jiminny\Exceptions\HttpBadRequestException;
use Jiminny\Exceptions\HttpNotFoundException;
use Jiminny\Exceptions\LogicException;
use Jiminny\Exceptions\SocialAccountTokenInvalidException;
use Jiminny\Integrations\PlaybookResolver;
use Jiminny\Jobs\Crm\SyncFieldMetadata;
use Jiminny\Models;
use Jiminny\Models\Activity;
use Jiminny\Models\Crm\Configuration;
use Jiminny\Models\Crm\Field;
use Jiminny\Models\Crm\FieldData;
use Jiminny\Models\Crm\FieldValue;
use Jiminny\Models\Crm\Layout;
use Jiminny\Models\Crm\Profile;
use Jiminny\Models\Lead;
use Jiminny\Models\Playbook;
use Jiminny\Models\PlaybookCategory;
use Jiminny\Models\SocialAccount;
use Jiminny\Models\Team;
use Jiminny\Models\User;
use Jiminny\Services\Crm\Helpers\ConnectionStateTrait;
use Jiminny\Services\Crm\Helpers\OpportunitySyncableFieldsTrait;
use Jiminny\Services\TeamService;
use Psr\Log\LoggerInterface;
use Sentry\State\Scope;
abstract class BaseService implements
ServiceInterface,
SettingsInterface,
SyncCrmEntitiesInterface,
ConnectionStateInterface
{
use ConnectionStateTrait;
use OpportunitySyncableFieldsTrait;
public const string OBJECT_LEAD = 'lead';
public const string OBJECT_ACCOUNT = 'account';
public const string OBJECT_CONTACT = 'contact';
public const string OBJECT_OPPORTUNITY = 'opportunity';
public const string OBJECT_TASK = 'task';
public const string OBJECT_EVENT = 'event';
public const int SOFT_DELETE_CHUNK = 100;
public const int HARD_DELETE_CHUNK = 1000;
public ?Configuration $config;
public ?Profile $profile;
public ?Team $team = null;
/**
* @var ClientInterface
*/
protected $client;
/**
* @var TeamService
*/
protected TeamService $teamService;
/**
* @var int
*/
protected int $limit;
/**
* @var int
*/
protected int $offset;
/**
* Transcription Service instance.
*
* @var TranscriptionService
*/
protected TranscriptionService $transcriptionService;
protected LoggerInterface $logger;
/**
* Cache for opportunity fields to avoid N+1 queries during batch imports.
* Key: crm_provider_id, Value: Field model with entities relation.
* Cleared when configuration changes.
*
* @var Collection<string, Field>|null
*/
private ?Collection $cachedOpportunityFields = null;
public function __construct()
{
$this->teamService = app(TeamService::class);
$this->transcriptionService = app(TranscriptionService::class);
$this->logger = app(LoggerInterface::class);
}
/**
* @param User $user
*
* @throws SocialAccountTokenInvalidException
*/
public function setUser(User $user): void
{
$this->configureSentryScope($user);
$this->team = $user->team;
$this->teamService->setTeam($user->team);
$this->setConfiguration($user->team->crm);
// Reset state.
$this->profile = $user->crmProfile;
/**
* DO NOT DELETE THIS `clearTokens` CALL
* The purpose of purging tokens is to fix a problem in importing calendar events.
* Calendar Import doesn't always respect "SocialAccountInvalidTokenException" exception
* and may try to recycle old SF instance, with wrong credentials (by ignoring the exception).
*
* This code guarantees the CRM Service is unusable, unless always provided with a valid social account.
*/
if (method_exists($this->client, 'clearTokens')) {
$this->client->clearTokens();
}
$account = $this->getOAuthAccount($user);
$this->validateUserAccountExists($user, $account);
if (method_exists($this->client, 'setOAuthAccount')) {
$this->client->setOAuthAccount($account);
}
if (method_exists($this->client, 'setLogger')) {
$this->client->setLogger($this->logger);
}
if ($this->profile === null) {
// Try to fetch their profile, maybe it was not yet imported?
$cacheKey = sprintf('crm_profile_sync-%s', $user->getId());
$lock = \Cache::lock($cacheKey, 300);
if ($lock->get()) {
$this->profile = $this->getProfile($user);
}
}
// The CRM Service is properly bootstrapped, and supports remote operations
$this->connect();
}
protected function configureSentryScope(User $user): void
{
\Sentry\configureScope(function (Scope $scope) use ($user): void {
$scope->setTag('team_id', (string) $user->getTeamId());
$scope->setUser([
'id' => $user->getId(),
'email' => $user->getEmailAddress(),
]);
});
}
/**
* @param User $user
*
* @return Profile|null
*/
protected function getProfile(User $user): ?Profile
{
return $this->syncProfiles($user);
}
public function getConfiguration(): Configuration
{
return $this->config;
}
public function setConfiguration(Configuration $config): void
{
$this->config = $config;
$this->client->setConfiguration($config);
// Clear field cache when configuration changes to ensure fresh data for new team/config
$this->cachedOpportunityFields = null;
if ($this->team === null) {
$this->team = $config->team;
}
}
public function setPage(int $limit, int $offset): void
{
$this->limit = $limit;
$this->offset = $offset;
}
abstract protected function getOAuthAccount(User $user): ?SocialAccount;
abstract protected function getDefaultFollowupLayoutFields(string $activityType): array;
abstract protected function getFieldTypes(): array;
abstract protected function getFields(string $fieldType): array;
public function syncFields(): void
{
foreach ($this->getFieldTypes() as $fieldType) {
$currentFields = $this->getFields($fieldType);
// TODO: only sync the field once a day if we don't use it in any layout. If we do, sync hourly?
foreach ($currentFields as $field) {
/** @var Models\Crm\Field $field */
$field = $this->config->fields()->updateOrCreate([
'crm_provider_id' => mb_strimwidth($field['name'], 0, 128),
'object_type' => $fieldType,
], [
'label' => mb_strimwidth($field['label'], 0, Field::LABEL_MAX_LENGTH),
]);
try {
$this->syncField($field);
if ($field->type === Models\Crm\Field::TYPE_PICKLIST) {
$this->importPicklistValues($field);
}
} catch (HttpNotFoundException $e) {
$this->logger->error('[sync-fields] Field not found', [
'provider' => $this->getDisplayName(),
'crm_field' => $field->crm_provider_id,
'object_type' => $field->object_type,
'team_id' => $this->team->id,
]);
} catch (HttpBadRequestException $e) {
$this->logger->error('[sync-fields] Field not supported', [
'provider' => $this->getDisplayName(),
'crm_field' => $field->crm_provider_id,
'object_type' => $field->object_type,
'team_id' => $this->team->id,
]);
}
}
}
}
/**
* @param string $objectId
* @param ?string $objectType
*
* @return array
*/
public function parseRecords(string $objectId, ?string $objectType = null): array
{
if ($objectType === null && $this instanceof SupportsObjectTypeParseInterface) {
$objectType = $this->parseObjectType($objectId);
}
$lead = null;
$contact = null;
$opportunity = null;
$account = null;
$stage = null;
$countryCode = null;
// Gather the prospect data to store on activity/participant.
switch ($objectType) {
case self::OBJECT_LEAD:
/** @var ?Lead $lead */
$lead = $this->config->leads()->where('crm_provider_id', $objectId)->first();
if ($lead === null) {
$lead = $this->syncLead($objectId);
}
if ($lead?->country_code) {
$countryCode = $lead->country_code;
}
$stage = $lead?->stage;
break;
case self::OBJECT_ACCOUNT:
$account = $this->config->accounts()->where('crm_provider_id', $objectId)->first();
if ($account === null) {
$account = $this->syncAccount($objectId);
}
if ($account->country_code) {
$countryCode = $account->country_code;
}
break;
case self::OBJECT_CONTACT:
$contact = $this->config->contacts()->where('crm_provider_id', $objectId)->first();
if ($contact === null) {
$contact = $this->syncContact($objectId);
}
if ($contact?->country_code) {
$countryCode = $contact->country_code;
}
$account = $contact?->account;
break;
case self::OBJECT_OPPORTUNITY:
$opportunity = $this->config->opportunities()->where('crm_provider_id', $objectId)->first();
if ($opportunity === null) {
$opportunity = $this->syncOpportunity($objectId);
}
if ($opportunity !== null) {
$stage = $opportunity->stage;
$account = $opportunity->account;
if ($account->country_code) {
$countryCode = $account->country_code;
}
}
break;
}
return [
$lead,
$account,
$opportunity,
$contact,
$stage,
$countryCode,
];
}
/**
* @param null|string $name
*
* @return null|string
*/
public function convertCountryNameToCode(?string $name): ?string
{
return app(CountryCodeResolver::class)->resolveCountryCode($name);
}
/**
* @param PlaybookCategory $category
*
* @return bool
*/
public function matchesCrmType(PlaybookCategory $category): bool
{
if ($category->playbook === null) {
return false;
}
if ($category->getPlaybook()->getActivityField() === null) {
return false;
}
$fieldValue = $category
->playbook
->activityField
->values()
->where('label', $category->name);
// Check the field values for a matching option.
return $fieldValue->exists();
}
/**
* @param PlaybookCategory $category
*
* @return FieldValue|null
*/
public function getCrmType(PlaybookCategory $category): ?FieldValue
{
$fieldValue = $category
->playbook
->activityField
->values()
->where('label', $category->name);
return $fieldValue->first();
}
/**
* @return int|float|string
*/
public function getMinimumApiVersion(): int|float|string
{
return $this->client->getMinimumApiVersion();
}
/**
* @param string $accountId
*
* @return bool
*/
protected function hasAccount(string $accountId): bool
{
return $this->config->accounts()->where('crm_provider_id', $accountId)->exists();
}
/**
* @param string $opportunityId
*
* @return bool
*/
protected function hasOpportunity(string $opportunityId): bool
{
return $this->config->opportunities()->where('crm_provider_id', $opportunityId)->exists();
}
/**
* @param string $contactId
*
* @return bool
*/
protected function hasContact(string $contactId): bool
{
return $this->config->contacts()->where('crm_provider_id', $contactId)->exists();
}
/**
* @param string $leadId
*
* @return bool
*/
protected function hasLead(string $leadId): bool
{
return $this->config->leads()->where('crm_provider_id', $leadId)->exists();
}
public function fetchAndAssociateRelatedActivity(Activity $activity): ?Activity
{
return null;
}
public function getJobDelay(): int
{
return 0;
}
public function getPlaybookFromActivity(Activity $activity): ?Playbook
{
if ($activity->hasActivityType() && $activity->getActivityType()->hasPlaybook()) {
return $activity->getActivityType()->getPlaybook();
}
return $this->getPlaybook($activity->getUser());
}
/**
* Gets the playbook for the user
*/
protected function getPlaybook(User $user): ?Playbook
{
$playbookResolver = app(PlaybookResolver::class);
return $playbookResolver->resolvePlaybookByUser($user);
}
/**
* @param Models\Playbook $playbook
* @param string $categoryName
*
* @return Models\PlaybookCategory|null
*/
protected function getPlaybookCategory(Models\Playbook $playbook, string $categoryName): ?Models\PlaybookCategory
{
return $playbook->categories()
->where('name', trim($categoryName))
->latest()
->first();
}
public function buildLayout(Layout $layout, ?string $activityType): void
{
if ($activityType) {
// Base section. Currently, the fields within are hard coded so this is empty for now.
/** @var Models\Crm\LayoutEntity $activitySection */
$activitySection = $layout->entities()->create([
'label' => 'activity-summary',
'description' => 'Activity Summary',
'sequence' => 0,
]);
if ($this instanceof HubspotInterface) {
$activityFields = $this->getDefaultActivityLayoutFields($activityType, $layout->type);
foreach ($activityFields as $i => $field) {
$layout->entities()->create([
'parent_entity_id' => $activitySection->getId(),
'crm_field_id' => $field->getId(),
'sequence' => $i,
]);
}
}
// Follow-up section. These are all dynamic fields.
$sectionTitle = ($layout->type === Layout::TYPE_CONFERENCE_SUMMARY ? 'Next Steps...' : 'Follow up?');
/** @var Models\Crm\LayoutEntity $followupSection */
$followupSection = $layout->entities()->create([
'label' => 'follow-up',
'description' => $sectionTitle,
'sequence' => 1,
]);
$followupFields = $this->getDefaultFollowupLayoutFields($activityType);
foreach ($followupFields as $i => $field) {
$layout->entities()->create([
'parent_entity_id' => $followupSection->getId(),
'crm_field_id' => $field->getId(),
'sequence' => $i,
]);
}
} elseif ($layout->type == Layout::TYPE_DEAL_INSIGHTS) {
$this->populateLayoutEntities($layout);
}
}
protected function populateLayoutEntities(Layout $layout): void
{
$dealFields = $this->getDefaultDealLayoutFields();
foreach ($dealFields as $i => $field) {
$readOnly = $field->getType() === Field::TYPE_CURRENCY
|| $this->isBusinessTypeField($field);
$layout->entities()->updateOrCreate([
'crm_field_id' => $field->id,
], [
'sequence' => $i,
'read_only' => $readOnly,
]);
}
}
public function prepareValueForUpdate(array $params): array
{
$fieldName = $params['fieldName'];
$fieldValue = $params['fieldValue'];
return [$fieldName => $fieldValue];
}
protected function getDefaultDealLayoutFields(): array
{
$fieldData = $this->getDealInsightsFields();
$fields = [];
foreach ($fieldData as $data) {
/** @var Field $field */
$field = $this->config->fields()->updateOrCreate([
'crm_provider_id' => $data['crm_provider_id'],
'object_type' => $data['object_type'],
], ['label' => $data['crm_provider_id']]);
try {
dispatch_sync(new SyncFieldMetadata($this->config->team, $field));
$field->refresh();
} catch (\Throwable $throwable) {
\Sentry::captureException($throwable);
}
$fields[] = $field;
}
return $fields;
}
public function importOpportunityCrmFieldData(array $crmData, array $crmFields, int $opportunityId): void
{
// Pre-fetch all opportunity fields once per batch to avoid N+1 queries.
// During webhook floods, this reduces DB queries from O(fields × deals) to O(1) for field lookups.
$fieldsMap = $this->getOpportunityFieldsMap();
foreach ($crmFields as $fieldName) {
$field = $fieldsMap->get($fieldName);
if (! $field instanceof Field) {
$this->logger->warning('Field not found', [
'field' => $fieldName,
'opportunity_id' => $opportunityId,
]);
continue;
}
// A CRM field data will be synced only if the field exists as part of at least one layout,
// i.e. an entity related to the field exists.
$entity = $field->entities->first();
if (! $entity instanceof Models\Crm\LayoutEntity) {
continue;
}
$fieldValue = $crmData[$fieldName] ?? '';
if (is_object($fieldValue)) {
$this->logger->warning('Field value is an object', [
'field' => $fieldName,
]);
continue;
}
$value = $this->normalizeValue($field->type, $fieldValue, true);
FieldData::updateOrCreate([
'crm_layout_entity_id' => $entity->id,
'crm_field_id' => $field->id,
'object_type' => 'opportunity',
'object_id' => $opportunityId,
], ['value' => $value]);
}
}
/**
* Get cached opportunity fields map for efficient lookups during batch imports.
*
* This method fetches all opportunity fields with their entities relation ONCE
* and caches them for the lifetime of this service instance. This eliminates
* the N+1 query problem where each field was fetched individually per deal.
*
* Performance impact:
* - Before: 10 fields × 100 deals = 1,000 field queries per batch
* - After: 1 query per batch (regardless of deal count)
*
* @return Collection<string, Field> Fields keyed by crm_provider_id
*/
private function getOpportunityFieldsMap(): Collection
{
if ($this->cachedOpportunityFields === null) {
$this->cachedOpportunityFields = $this->config->fields()
->with('entities')
->where('object_type', '=', self::OBJECT_OPPORTUNITY)
->get()
->keyBy('crm_provider_id');
}
return $this->cachedOpportunityFields;
}
/**
* @param array<mixed> $crmData
* @param Collection $crmFields
* @param int $objectId
*
* @return void
*/
public function importCrmFieldData(array $crmData, Collection $crmFields, int $objectId): void
{
/** @var Field $crmField */
foreach ($crmFields as $crmField) {
// If the field name does not match one we are interested in, skip.
if (array_key_exists($crmField->crm_provider_id, $crmData) === false) {
continue;
}
/** @var string $fieldValue */
$fieldValue = $crmData[$crmField->crm_provider_id];
$value = $this->normalizeValue($crmField->type, $fieldValue, true);
FieldData::updateOrCreate([
'crm_field_id' => $crmField->id,
'object_type' => $crmField->object_type,
'object_id' => $objectId,
], ['value' => $value]);
}
}
protected function getTeam(): Team
{
if (! $this->team instanceof Team) {
throw new LogicException('Expecting team model instance');
}
return $this->team;
}
public function isBusinessTypeField(Field $field): bool
{
return in_array($field->crm_provider_id, Field::BUSINESS_TYPE_FIELDS)
&& $field->object_type === Field::OBJECT_OPPORTUNITY;
}
/**
* @return mixed[]
*/
public function fetchRelatedActivity(Activity $activity): array
{
return [];
}
/**
* @throws SocialAccountTokenInvalidException
*/
private function validateUserAccountExists(User $user, ?SocialAccount $account = null): void
{
if ($account instanceof SocialAccount && $account->state === SocialAccount::STATE_CONNECTED) {
return;
}
$this->logger->warning(
sprintf('[%s] Account not connected for user', $this->getDisplayName()),
[
'userId' => $user->getIdString(),
'account' => $account,
]
);
// If their profile was never setup in the first place
if ($this->profile === null) {
// Create a dummy in-memory profile just to be able to run
$this->profile = new Profile();
}
if (! $account instanceof SocialAccount) {
throw new SocialAccountTokenInvalidException(
sprintf(
'Social account for %s cannot be found. Please login to Jiminny to connect.',
$this->getDisplayName()
)
);
}
throw new SocialAccountTokenInvalidException(
sprintf(
'Your %s account has become disconnected. Please login to Jiminny to reconnect.',
$this->getDisplayName()
)
);
}
public function listSupportedObjectTypes(): array
{
return $this->getFieldTypes();
}
}
Execute
Explain Plan
Browse Query History
View Parameters
Open Query Execution Settings…
In-Editor Results
Tx: Auto
Cancel Running Statements
Playground
jiminny
Code changed:
Hide
Sync Changes
Hide This Notification
6
1
6
Previous Highlighted Error
Next Highlighted Error
# [PASSWORD_DOTS] HS [PASSWORD_DOTS]
select * from teams where id = 2; # 2
select * from features; # 2
select * from team_features where team_id = 2; # 2
select * from crm_configurations where id = 2; # 2
select * from users where team_id = 2; #
select * from playbooks where team_id = 2; # event 38
select * from playbook_categories where playbook_id = 38; #
SELECT * FROM activities WHERE crm_configuration_id = 2 and crm_provider_id is not null order by id desc;
https://app.hubspot.com/contacts/4392066/deal/16964514951/?engagement=96069102624
https://app.staging.jiminny.com/playback/d5df34dc-bd66-4ff5-a7b3-8d3be30322a0
SELECT * FROM activities WHERE uuid_to_bin('04fdcd0d-818f-4c53-92dc-6f18bc753ffd') = uuid;
# 609126 softphone tr. 11241
SELECT * FROM activities WHERE uuid_to_bin('6521bfcd-5a30-46e5-9f74-5440fd48befd') = uuid;
# 608874 conference tr. 11226 crmId: 103422236596
select * from ai_prompts where transcription_id IN (11241, 11226);
select * from activity_summary_logs where activity_id = 608874;
select * from sidekick_settings;
select * from default_activity_types;
select * from crm_field_data where activity_id = 1223;
select * from crm_layouts where crm_configuration_id = 2;
SELECT * FROM crm_layout_entities WHERE crm_layout_id IN (554);
select * from crm_fields where crm_configuration_id = 11 and object_type = 'event';
SELECT * FROM crm_field_values WHERE crm_field_id IN (1455,1450);
SELECT * FROM crm_field_data WHERE crm_layout_entity_id = 971;
SELECT * FROM crm_field_data WHERE crm_layout_entity_id IN (6494,6495,6496,6497,6498,6499);
SELECT
CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,
u.email,
sa.*,
t.owner_id FROM social_accounts sa
JOIN users u
on u.id = sa.sociable_id
JOIN teams t on t.id = u.team_id
WHERE u.team_id = 2 and sa.provider = 'hubspot';
select * from opportunities where team_id = 2
and crm_provider_id IN ('51317301383');
select * from contacts where id = 85;
select * from opportunities where team_id = 2 order by id desc;
select * from opportunities where team_id = 2 and crm_provider_id = '51317301383'; # 5112
select * from opportunities where team_id = 2 and crm_provider_id = '55976759904'; # 5112
select * from opportunity_contacts where opportunity_id = 5117;
select * from crm_field_data where object_id = 1365;
SELECT * FROM crm_fields WHERE id IN (1405, 1407, 1972, 2128);
select * from features;
select * from team_features where team_id IN (1);
select * from team_features where feature_id IN (36);
SHOW CREATE TABLE opportunity_contacts;
SELECT * FROM opportunity_contacts WHERE crm_provider_id = '111751';
# $slug = 'HUBSPOT_WEBHOOK_SYNC';
# $team = Jiminny\Models\Team::find(2);
# $feature = Feature::query()->where('slug', $slug)->first();
# TeamFeature::query()->create(['feature_id' => $feature->getId(),'team_id' => $team->getId()]);
# hubspot_webhook_metrics
select * from opportunities where team_id = 2 and crm_provider_id IN ('374720564','14527423589','49908861993','50435771779'); # 1365
SELECT * FROM opportunity_contacts WHERE opportunity_id = '414';
SELECT * FROM opportunity_contacts WHERE crm_provider_id = '131501';
select * from contacts where id in (414, 464);
select * from activities where crm_configuration_id = 2;
select settings from crm_configurations where id = 11;
select * from teams; # 1, 2
select * from users;
select * from crm_configurations where id = 39;
select * from team_features where team_id = 2;
select * from features;
# SELECT * FROM opportunities WHERE crm_configuration_id = 2
# order by id desc;
# and crm_provider_id = '49908861993';
select * from activity_providers where id IN (443, 202, 203, 227);
select * from activity_imports where id = 795889;
select c.id, c.provider, c.settings, t.* from teams t join crm_configurations c on t.id = c.team_id
where c.provider = 'hubspot';
select * from crm_configurations crm JOIN teams t on crm.team_id = t.id
where provider = 'hubspot';
SELECT * FROM teams WHERE id = 31;
SELECT * FROM users WHERE id = 257;
SELECT * FROM opportunities WHERE team_id = 2;
select * from opportunity_contacts where opportunity_id = 5124;
select * from contacts where id IN (3850,3853,3851,4073,4140,4155,4480,4530,4623,5986,513,687,1806,1523,3613)
select * from activities where crm_configuration_id = 13;
SELECT * FROM activities WHERE uuid_to_bin('826619ce-ec8e-4e59-8467-a01f5f6ad71e') = uuid; # 418141
select id, team_id, crm_provider_id from crm_configurations where provider = 'hubspot' and crm_provider_id IS NOT NULL;
SELECT * FROM accounts WHERE team_id = 2 and crm_provider_id = '1212213464' order by id desc;
SELECT * FROM contacts WHERE team_id = 2 and account_id = 5189 order by id desc;
SELECT * FROM contacts WHERE team_id = 2 order by id desc;
select * from opportunity_contacts where contact_id = 6223;
SELECT * FROM opportunities WHERE team_id = 2 and account_id = 5189 order by id desc;
select * from crm_profiles where crm_configuration_id = 2;
select * from activities where account_id = 46;
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"#11976 on JY-20553-debug-crm-sync-delays, menu","depth":5,"help_text":"Pull request #11976 exists for current branch JY-20553-debug-crm-sync-delays","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"RequestGenerateAskJiminnyReportJobTest","depth":6,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run 'RequestGenerateAskJiminnyReportJobTest'","depth":6,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'RequestGenerateAskJiminnyReportJobTest'","depth":6,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"More Actions","depth":6,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JetBrains AI","depth":5,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Search Everywhere","depth":5,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"IDE and Project Settings","depth":5,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.088194445,"height":0.027777778},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"1","depth":4,"role_description":"text"},{"role":"AXStaticText","text":"19","depth":4,"role_description":"text"},{"role":"AXStaticText","text":"2","depth":4,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"<?php\n\nnamespace Jiminny\\Services\\Crm;\n\nuse Illuminate\\Support\\Collection;\nuse Jiminny\\Component\\Transcription\\Service\\TranscriptionService;\nuse Jiminny\\Contracts\\Services\\Crm\\ClientInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\ConnectionStateInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\Provider\\HubspotInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\ServiceInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\SettingsInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\SupportsObjectTypeParseInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\SyncCrmEntitiesInterface;\nuse Jiminny\\Exceptions\\HttpBadRequestException;\nuse Jiminny\\Exceptions\\HttpNotFoundException;\nuse Jiminny\\Exceptions\\LogicException;\nuse Jiminny\\Exceptions\\SocialAccountTokenInvalidException;\nuse Jiminny\\Integrations\\PlaybookResolver;\nuse Jiminny\\Jobs\\Crm\\SyncFieldMetadata;\nuse Jiminny\\Models;\nuse Jiminny\\Models\\Activity;\nuse Jiminny\\Models\\Crm\\Configuration;\nuse Jiminny\\Models\\Crm\\Field;\nuse Jiminny\\Models\\Crm\\FieldData;\nuse Jiminny\\Models\\Crm\\FieldValue;\nuse Jiminny\\Models\\Crm\\Layout;\nuse Jiminny\\Models\\Crm\\Profile;\nuse Jiminny\\Models\\Lead;\nuse Jiminny\\Models\\Playbook;\nuse Jiminny\\Models\\PlaybookCategory;\nuse Jiminny\\Models\\SocialAccount;\nuse Jiminny\\Models\\Team;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Services\\Crm\\Helpers\\ConnectionStateTrait;\nuse Jiminny\\Services\\Crm\\Helpers\\OpportunitySyncableFieldsTrait;\nuse Jiminny\\Services\\TeamService;\nuse Psr\\Log\\LoggerInterface;\nuse Sentry\\State\\Scope;\n\nabstract class BaseService implements\n ServiceInterface,\n SettingsInterface,\n SyncCrmEntitiesInterface,\n ConnectionStateInterface\n{\n use ConnectionStateTrait;\n use OpportunitySyncableFieldsTrait;\n\n public const string OBJECT_LEAD = 'lead';\n public const string OBJECT_ACCOUNT = 'account';\n public const string OBJECT_CONTACT = 'contact';\n public const string OBJECT_OPPORTUNITY = 'opportunity';\n public const string OBJECT_TASK = 'task';\n public const string OBJECT_EVENT = 'event';\n\n public const int SOFT_DELETE_CHUNK = 100;\n public const int HARD_DELETE_CHUNK = 1000;\n\n public ?Configuration $config;\n\n public ?Profile $profile;\n\n public ?Team $team = null;\n\n /**\n * @var ClientInterface\n */\n protected $client;\n\n /**\n * @var TeamService\n */\n protected TeamService $teamService;\n\n /**\n * @var int\n */\n protected int $limit;\n\n /**\n * @var int\n */\n protected int $offset;\n\n /**\n * Transcription Service instance.\n *\n * @var TranscriptionService\n */\n protected TranscriptionService $transcriptionService;\n\n protected LoggerInterface $logger;\n\n /**\n * Cache for opportunity fields to avoid N+1 queries during batch imports.\n * Key: crm_provider_id, Value: Field model with entities relation.\n * Cleared when configuration changes.\n *\n * @var Collection<string, Field>|null\n */\n private ?Collection $cachedOpportunityFields = null;\n\n public function __construct()\n {\n $this->teamService = app(TeamService::class);\n $this->transcriptionService = app(TranscriptionService::class);\n $this->logger = app(LoggerInterface::class);\n }\n\n /**\n * @param User $user\n *\n * @throws SocialAccountTokenInvalidException\n */\n public function setUser(User $user): void\n {\n $this->configureSentryScope($user);\n\n $this->team = $user->team;\n $this->teamService->setTeam($user->team);\n $this->setConfiguration($user->team->crm);\n\n // Reset state.\n $this->profile = $user->crmProfile;\n\n /**\n * DO NOT DELETE THIS `clearTokens` CALL\n * The purpose of purging tokens is to fix a problem in importing calendar events.\n * Calendar Import doesn't always respect \"SocialAccountInvalidTokenException\" exception\n * and may try to recycle old SF instance, with wrong credentials (by ignoring the exception).\n *\n * This code guarantees the CRM Service is unusable, unless always provided with a valid social account.\n */\n if (method_exists($this->client, 'clearTokens')) {\n $this->client->clearTokens();\n }\n\n $account = $this->getOAuthAccount($user);\n\n $this->validateUserAccountExists($user, $account);\n\n if (method_exists($this->client, 'setOAuthAccount')) {\n $this->client->setOAuthAccount($account);\n }\n if (method_exists($this->client, 'setLogger')) {\n $this->client->setLogger($this->logger);\n }\n\n if ($this->profile === null) {\n // Try to fetch their profile, maybe it was not yet imported?\n $cacheKey = sprintf('crm_profile_sync-%s', $user->getId());\n $lock = \\Cache::lock($cacheKey, 300);\n if ($lock->get()) {\n $this->profile = $this->getProfile($user);\n }\n }\n\n // The CRM Service is properly bootstrapped, and supports remote operations\n $this->connect();\n }\n\n protected function configureSentryScope(User $user): void\n {\n \\Sentry\\configureScope(function (Scope $scope) use ($user): void {\n $scope->setTag('team_id', (string) $user->getTeamId());\n $scope->setUser([\n 'id' => $user->getId(),\n 'email' => $user->getEmailAddress(),\n ]);\n });\n }\n\n /**\n * @param User $user\n *\n * @return Profile|null\n */\n protected function getProfile(User $user): ?Profile\n {\n return $this->syncProfiles($user);\n }\n\n public function getConfiguration(): Configuration\n {\n return $this->config;\n }\n\n public function setConfiguration(Configuration $config): void\n {\n $this->config = $config;\n $this->client->setConfiguration($config);\n\n // Clear field cache when configuration changes to ensure fresh data for new team/config\n $this->cachedOpportunityFields = null;\n\n if ($this->team === null) {\n $this->team = $config->team;\n }\n }\n\n public function setPage(int $limit, int $offset): void\n {\n $this->limit = $limit;\n $this->offset = $offset;\n }\n\n abstract protected function getOAuthAccount(User $user): ?SocialAccount;\n abstract protected function getDefaultFollowupLayoutFields(string $activityType): array;\n abstract protected function getFieldTypes(): array;\n abstract protected function getFields(string $fieldType): array;\n\n public function syncFields(): void\n {\n foreach ($this->getFieldTypes() as $fieldType) {\n $currentFields = $this->getFields($fieldType);\n\n // TODO: only sync the field once a day if we don't use it in any layout. If we do, sync hourly?\n foreach ($currentFields as $field) {\n /** @var Models\\Crm\\Field $field */\n $field = $this->config->fields()->updateOrCreate([\n 'crm_provider_id' => mb_strimwidth($field['name'], 0, 128),\n 'object_type' => $fieldType,\n ], [\n 'label' => mb_strimwidth($field['label'], 0, Field::LABEL_MAX_LENGTH),\n ]);\n\n try {\n $this->syncField($field);\n\n if ($field->type === Models\\Crm\\Field::TYPE_PICKLIST) {\n $this->importPicklistValues($field);\n }\n } catch (HttpNotFoundException $e) {\n $this->logger->error('[sync-fields] Field not found', [\n 'provider' => $this->getDisplayName(),\n 'crm_field' => $field->crm_provider_id,\n 'object_type' => $field->object_type,\n 'team_id' => $this->team->id,\n ]);\n } catch (HttpBadRequestException $e) {\n $this->logger->error('[sync-fields] Field not supported', [\n 'provider' => $this->getDisplayName(),\n 'crm_field' => $field->crm_provider_id,\n 'object_type' => $field->object_type,\n 'team_id' => $this->team->id,\n ]);\n }\n }\n }\n }\n\n /**\n * @param string $objectId\n * @param ?string $objectType\n *\n * @return array\n */\n public function parseRecords(string $objectId, ?string $objectType = null): array\n {\n if ($objectType === null && $this instanceof SupportsObjectTypeParseInterface) {\n $objectType = $this->parseObjectType($objectId);\n }\n\n $lead = null;\n $contact = null;\n $opportunity = null;\n $account = null;\n $stage = null;\n $countryCode = null;\n\n // Gather the prospect data to store on activity/participant.\n switch ($objectType) {\n case self::OBJECT_LEAD:\n /** @var ?Lead $lead */\n $lead = $this->config->leads()->where('crm_provider_id', $objectId)->first();\n\n if ($lead === null) {\n $lead = $this->syncLead($objectId);\n }\n\n if ($lead?->country_code) {\n $countryCode = $lead->country_code;\n }\n\n $stage = $lead?->stage;\n\n break;\n\n case self::OBJECT_ACCOUNT:\n $account = $this->config->accounts()->where('crm_provider_id', $objectId)->first();\n\n if ($account === null) {\n $account = $this->syncAccount($objectId);\n }\n\n if ($account->country_code) {\n $countryCode = $account->country_code;\n }\n\n break;\n\n case self::OBJECT_CONTACT:\n $contact = $this->config->contacts()->where('crm_provider_id', $objectId)->first();\n\n if ($contact === null) {\n $contact = $this->syncContact($objectId);\n }\n\n if ($contact?->country_code) {\n $countryCode = $contact->country_code;\n }\n\n $account = $contact?->account;\n\n break;\n\n case self::OBJECT_OPPORTUNITY:\n $opportunity = $this->config->opportunities()->where('crm_provider_id', $objectId)->first();\n\n if ($opportunity === null) {\n $opportunity = $this->syncOpportunity($objectId);\n }\n\n if ($opportunity !== null) {\n $stage = $opportunity->stage;\n\n $account = $opportunity->account;\n\n if ($account->country_code) {\n $countryCode = $account->country_code;\n }\n }\n\n break;\n }\n\n return [\n $lead,\n $account,\n $opportunity,\n $contact,\n $stage,\n $countryCode,\n ];\n }\n\n /**\n * @param null|string $name\n *\n * @return null|string\n */\n public function convertCountryNameToCode(?string $name): ?string\n {\n return app(CountryCodeResolver::class)->resolveCountryCode($name);\n }\n\n /**\n * @param PlaybookCategory $category\n *\n * @return bool\n */\n public function matchesCrmType(PlaybookCategory $category): bool\n {\n if ($category->playbook === null) {\n return false;\n }\n\n if ($category->getPlaybook()->getActivityField() === null) {\n return false;\n }\n\n $fieldValue = $category\n ->playbook\n ->activityField\n ->values()\n ->where('label', $category->name);\n\n // Check the field values for a matching option.\n return $fieldValue->exists();\n }\n\n /**\n * @param PlaybookCategory $category\n *\n * @return FieldValue|null\n */\n public function getCrmType(PlaybookCategory $category): ?FieldValue\n {\n $fieldValue = $category\n ->playbook\n ->activityField\n ->values()\n ->where('label', $category->name);\n\n return $fieldValue->first();\n }\n\n\n /**\n * @return int|float|string\n */\n public function getMinimumApiVersion(): int|float|string\n {\n return $this->client->getMinimumApiVersion();\n }\n\n /**\n * @param string $accountId\n *\n * @return bool\n */\n protected function hasAccount(string $accountId): bool\n {\n return $this->config->accounts()->where('crm_provider_id', $accountId)->exists();\n }\n\n /**\n * @param string $opportunityId\n *\n * @return bool\n */\n protected function hasOpportunity(string $opportunityId): bool\n {\n return $this->config->opportunities()->where('crm_provider_id', $opportunityId)->exists();\n }\n\n /**\n * @param string $contactId\n *\n * @return bool\n */\n protected function hasContact(string $contactId): bool\n {\n return $this->config->contacts()->where('crm_provider_id', $contactId)->exists();\n }\n\n /**\n * @param string $leadId\n *\n * @return bool\n */\n protected function hasLead(string $leadId): bool\n {\n return $this->config->leads()->where('crm_provider_id', $leadId)->exists();\n }\n\n public function fetchAndAssociateRelatedActivity(Activity $activity): ?Activity\n {\n return null;\n }\n\n public function getJobDelay(): int\n {\n return 0;\n }\n\n public function getPlaybookFromActivity(Activity $activity): ?Playbook\n {\n if ($activity->hasActivityType() && $activity->getActivityType()->hasPlaybook()) {\n return $activity->getActivityType()->getPlaybook();\n }\n\n return $this->getPlaybook($activity->getUser());\n }\n\n /**\n * Gets the playbook for the user\n */\n protected function getPlaybook(User $user): ?Playbook\n {\n $playbookResolver = app(PlaybookResolver::class);\n\n return $playbookResolver->resolvePlaybookByUser($user);\n }\n\n /**\n * @param Models\\Playbook $playbook\n * @param string $categoryName\n *\n * @return Models\\PlaybookCategory|null\n */\n protected function getPlaybookCategory(Models\\Playbook $playbook, string $categoryName): ?Models\\PlaybookCategory\n {\n return $playbook->categories()\n ->where('name', trim($categoryName))\n ->latest()\n ->first();\n }\n\n public function buildLayout(Layout $layout, ?string $activityType): void\n {\n if ($activityType) {\n // Base section. Currently, the fields within are hard coded so this is empty for now.\n /** @var Models\\Crm\\LayoutEntity $activitySection */\n $activitySection = $layout->entities()->create([\n 'label' => 'activity-summary',\n 'description' => 'Activity Summary',\n 'sequence' => 0,\n ]);\n\n if ($this instanceof HubspotInterface) {\n $activityFields = $this->getDefaultActivityLayoutFields($activityType, $layout->type);\n\n foreach ($activityFields as $i => $field) {\n $layout->entities()->create([\n 'parent_entity_id' => $activitySection->getId(),\n 'crm_field_id' => $field->getId(),\n 'sequence' => $i,\n ]);\n }\n }\n\n // Follow-up section. These are all dynamic fields.\n $sectionTitle = ($layout->type === Layout::TYPE_CONFERENCE_SUMMARY ? 'Next Steps...' : 'Follow up?');\n /** @var Models\\Crm\\LayoutEntity $followupSection */\n $followupSection = $layout->entities()->create([\n 'label' => 'follow-up',\n 'description' => $sectionTitle,\n 'sequence' => 1,\n ]);\n\n $followupFields = $this->getDefaultFollowupLayoutFields($activityType);\n\n foreach ($followupFields as $i => $field) {\n $layout->entities()->create([\n 'parent_entity_id' => $followupSection->getId(),\n 'crm_field_id' => $field->getId(),\n 'sequence' => $i,\n ]);\n }\n } elseif ($layout->type == Layout::TYPE_DEAL_INSIGHTS) {\n $this->populateLayoutEntities($layout);\n }\n }\n\n protected function populateLayoutEntities(Layout $layout): void\n {\n $dealFields = $this->getDefaultDealLayoutFields();\n\n foreach ($dealFields as $i => $field) {\n $readOnly = $field->getType() === Field::TYPE_CURRENCY\n || $this->isBusinessTypeField($field);\n\n $layout->entities()->updateOrCreate([\n 'crm_field_id' => $field->id,\n ], [\n 'sequence' => $i,\n 'read_only' => $readOnly,\n ]);\n }\n }\n\n public function prepareValueForUpdate(array $params): array\n {\n $fieldName = $params['fieldName'];\n $fieldValue = $params['fieldValue'];\n\n return [$fieldName => $fieldValue];\n }\n\n protected function getDefaultDealLayoutFields(): array\n {\n $fieldData = $this->getDealInsightsFields();\n\n $fields = [];\n foreach ($fieldData as $data) {\n /** @var Field $field */\n $field = $this->config->fields()->updateOrCreate([\n 'crm_provider_id' => $data['crm_provider_id'],\n 'object_type' => $data['object_type'],\n ], ['label' => $data['crm_provider_id']]);\n\n try {\n dispatch_sync(new SyncFieldMetadata($this->config->team, $field));\n $field->refresh();\n } catch (\\Throwable $throwable) {\n \\Sentry::captureException($throwable);\n }\n\n $fields[] = $field;\n }\n\n return $fields;\n }\n\n public function importOpportunityCrmFieldData(array $crmData, array $crmFields, int $opportunityId): void\n {\n // Pre-fetch all opportunity fields once per batch to avoid N+1 queries.\n // During webhook floods, this reduces DB queries from O(fields × deals) to O(1) for field lookups.\n $fieldsMap = $this->getOpportunityFieldsMap();\n\n foreach ($crmFields as $fieldName) {\n $field = $fieldsMap->get($fieldName);\n\n if (! $field instanceof Field) {\n $this->logger->warning('Field not found', [\n 'field' => $fieldName,\n 'opportunity_id' => $opportunityId,\n ]);\n\n continue;\n }\n\n // A CRM field data will be synced only if the field exists as part of at least one layout,\n // i.e. an entity related to the field exists.\n $entity = $field->entities->first();\n if (! $entity instanceof Models\\Crm\\LayoutEntity) {\n continue;\n }\n\n $fieldValue = $crmData[$fieldName] ?? '';\n\n if (is_object($fieldValue)) {\n $this->logger->warning('Field value is an object', [\n 'field' => $fieldName,\n ]);\n\n continue;\n }\n\n $value = $this->normalizeValue($field->type, $fieldValue, true);\n\n FieldData::updateOrCreate([\n 'crm_layout_entity_id' => $entity->id,\n 'crm_field_id' => $field->id,\n 'object_type' => 'opportunity',\n 'object_id' => $opportunityId,\n ], ['value' => $value]);\n }\n }\n\n /**\n * Get cached opportunity fields map for efficient lookups during batch imports.\n *\n * This method fetches all opportunity fields with their entities relation ONCE\n * and caches them for the lifetime of this service instance. This eliminates\n * the N+1 query problem where each field was fetched individually per deal.\n *\n * Performance impact:\n * - Before: 10 fields × 100 deals = 1,000 field queries per batch\n * - After: 1 query per batch (regardless of deal count)\n *\n * @return Collection<string, Field> Fields keyed by crm_provider_id\n */\n private function getOpportunityFieldsMap(): Collection\n {\n if ($this->cachedOpportunityFields === null) {\n $this->cachedOpportunityFields = $this->config->fields()\n ->with('entities')\n ->where('object_type', '=', self::OBJECT_OPPORTUNITY)\n ->get()\n ->keyBy('crm_provider_id');\n }\n\n return $this->cachedOpportunityFields;\n }\n\n /**\n * @param array<mixed> $crmData\n * @param Collection $crmFields\n * @param int $objectId\n *\n * @return void\n */\n public function importCrmFieldData(array $crmData, Collection $crmFields, int $objectId): void\n {\n /** @var Field $crmField */\n foreach ($crmFields as $crmField) {\n // If the field name does not match one we are interested in, skip.\n if (array_key_exists($crmField->crm_provider_id, $crmData) === false) {\n continue;\n }\n\n /** @var string $fieldValue */\n $fieldValue = $crmData[$crmField->crm_provider_id];\n\n $value = $this->normalizeValue($crmField->type, $fieldValue, true);\n\n FieldData::updateOrCreate([\n 'crm_field_id' => $crmField->id,\n 'object_type' => $crmField->object_type,\n 'object_id' => $objectId,\n ], ['value' => $value]);\n }\n }\n\n protected function getTeam(): Team\n {\n if (! $this->team instanceof Team) {\n throw new LogicException('Expecting team model instance');\n }\n\n return $this->team;\n }\n\n public function isBusinessTypeField(Field $field): bool\n {\n return in_array($field->crm_provider_id, Field::BUSINESS_TYPE_FIELDS)\n && $field->object_type === Field::OBJECT_OPPORTUNITY;\n }\n\n /**\n * @return mixed[]\n */\n public function fetchRelatedActivity(Activity $activity): array\n {\n return [];\n }\n\n /**\n * @throws SocialAccountTokenInvalidException\n */\n private function validateUserAccountExists(User $user, ?SocialAccount $account = null): void\n {\n if ($account instanceof SocialAccount && $account->state === SocialAccount::STATE_CONNECTED) {\n return;\n }\n\n $this->logger->warning(\n sprintf('[%s] Account not connected for user', $this->getDisplayName()),\n [\n 'userId' => $user->getIdString(),\n 'account' => $account,\n ]\n );\n\n // If their profile was never setup in the first place\n if ($this->profile === null) {\n // Create a dummy in-memory profile just to be able to run\n $this->profile = new Profile();\n }\n\n if (! $account instanceof SocialAccount) {\n throw new SocialAccountTokenInvalidException(\n sprintf(\n 'Social account for %s cannot be found. Please login to Jiminny to connect.',\n $this->getDisplayName()\n )\n );\n }\n\n throw new SocialAccountTokenInvalidException(\n sprintf(\n 'Your %s account has become disconnected. Please login to Jiminny to reconnect.',\n $this->getDisplayName()\n )\n );\n }\n\n public function listSupportedObjectTypes(): array\n {\n return $this->getFieldTypes();\n }\n}","depth":4,"value":"<?php\n\nnamespace Jiminny\\Services\\Crm;\n\nuse Illuminate\\Support\\Collection;\nuse Jiminny\\Component\\Transcription\\Service\\TranscriptionService;\nuse Jiminny\\Contracts\\Services\\Crm\\ClientInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\ConnectionStateInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\Provider\\HubspotInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\ServiceInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\SettingsInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\SupportsObjectTypeParseInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\SyncCrmEntitiesInterface;\nuse Jiminny\\Exceptions\\HttpBadRequestException;\nuse Jiminny\\Exceptions\\HttpNotFoundException;\nuse Jiminny\\Exceptions\\LogicException;\nuse Jiminny\\Exceptions\\SocialAccountTokenInvalidException;\nuse Jiminny\\Integrations\\PlaybookResolver;\nuse Jiminny\\Jobs\\Crm\\SyncFieldMetadata;\nuse Jiminny\\Models;\nuse Jiminny\\Models\\Activity;\nuse Jiminny\\Models\\Crm\\Configuration;\nuse Jiminny\\Models\\Crm\\Field;\nuse Jiminny\\Models\\Crm\\FieldData;\nuse Jiminny\\Models\\Crm\\FieldValue;\nuse Jiminny\\Models\\Crm\\Layout;\nuse Jiminny\\Models\\Crm\\Profile;\nuse Jiminny\\Models\\Lead;\nuse Jiminny\\Models\\Playbook;\nuse Jiminny\\Models\\PlaybookCategory;\nuse Jiminny\\Models\\SocialAccount;\nuse Jiminny\\Models\\Team;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Services\\Crm\\Helpers\\ConnectionStateTrait;\nuse Jiminny\\Services\\Crm\\Helpers\\OpportunitySyncableFieldsTrait;\nuse Jiminny\\Services\\TeamService;\nuse Psr\\Log\\LoggerInterface;\nuse Sentry\\State\\Scope;\n\nabstract class BaseService implements\n ServiceInterface,\n SettingsInterface,\n SyncCrmEntitiesInterface,\n ConnectionStateInterface\n{\n use ConnectionStateTrait;\n use OpportunitySyncableFieldsTrait;\n\n public const string OBJECT_LEAD = 'lead';\n public const string OBJECT_ACCOUNT = 'account';\n public const string OBJECT_CONTACT = 'contact';\n public const string OBJECT_OPPORTUNITY = 'opportunity';\n public const string OBJECT_TASK = 'task';\n public const string OBJECT_EVENT = 'event';\n\n public const int SOFT_DELETE_CHUNK = 100;\n public const int HARD_DELETE_CHUNK = 1000;\n\n public ?Configuration $config;\n\n public ?Profile $profile;\n\n public ?Team $team = null;\n\n /**\n * @var ClientInterface\n */\n protected $client;\n\n /**\n * @var TeamService\n */\n protected TeamService $teamService;\n\n /**\n * @var int\n */\n protected int $limit;\n\n /**\n * @var int\n */\n protected int $offset;\n\n /**\n * Transcription Service instance.\n *\n * @var TranscriptionService\n */\n protected TranscriptionService $transcriptionService;\n\n protected LoggerInterface $logger;\n\n /**\n * Cache for opportunity fields to avoid N+1 queries during batch imports.\n * Key: crm_provider_id, Value: Field model with entities relation.\n * Cleared when configuration changes.\n *\n * @var Collection<string, Field>|null\n */\n private ?Collection $cachedOpportunityFields = null;\n\n public function __construct()\n {\n $this->teamService = app(TeamService::class);\n $this->transcriptionService = app(TranscriptionService::class);\n $this->logger = app(LoggerInterface::class);\n }\n\n /**\n * @param User $user\n *\n * @throws SocialAccountTokenInvalidException\n */\n public function setUser(User $user): void\n {\n $this->configureSentryScope($user);\n\n $this->team = $user->team;\n $this->teamService->setTeam($user->team);\n $this->setConfiguration($user->team->crm);\n\n // Reset state.\n $this->profile = $user->crmProfile;\n\n /**\n * DO NOT DELETE THIS `clearTokens` CALL\n * The purpose of purging tokens is to fix a problem in importing calendar events.\n * Calendar Import doesn't always respect \"SocialAccountInvalidTokenException\" exception\n * and may try to recycle old SF instance, with wrong credentials (by ignoring the exception).\n *\n * This code guarantees the CRM Service is unusable, unless always provided with a valid social account.\n */\n if (method_exists($this->client, 'clearTokens')) {\n $this->client->clearTokens();\n }\n\n $account = $this->getOAuthAccount($user);\n\n $this->validateUserAccountExists($user, $account);\n\n if (method_exists($this->client, 'setOAuthAccount')) {\n $this->client->setOAuthAccount($account);\n }\n if (method_exists($this->client, 'setLogger')) {\n $this->client->setLogger($this->logger);\n }\n\n if ($this->profile === null) {\n // Try to fetch their profile, maybe it was not yet imported?\n $cacheKey = sprintf('crm_profile_sync-%s', $user->getId());\n $lock = \\Cache::lock($cacheKey, 300);\n if ($lock->get()) {\n $this->profile = $this->getProfile($user);\n }\n }\n\n // The CRM Service is properly bootstrapped, and supports remote operations\n $this->connect();\n }\n\n protected function configureSentryScope(User $user): void\n {\n \\Sentry\\configureScope(function (Scope $scope) use ($user): void {\n $scope->setTag('team_id', (string) $user->getTeamId());\n $scope->setUser([\n 'id' => $user->getId(),\n 'email' => $user->getEmailAddress(),\n ]);\n });\n }\n\n /**\n * @param User $user\n *\n * @return Profile|null\n */\n protected function getProfile(User $user): ?Profile\n {\n return $this->syncProfiles($user);\n }\n\n public function getConfiguration(): Configuration\n {\n return $this->config;\n }\n\n public function setConfiguration(Configuration $config): void\n {\n $this->config = $config;\n $this->client->setConfiguration($config);\n\n // Clear field cache when configuration changes to ensure fresh data for new team/config\n $this->cachedOpportunityFields = null;\n\n if ($this->team === null) {\n $this->team = $config->team;\n }\n }\n\n public function setPage(int $limit, int $offset): void\n {\n $this->limit = $limit;\n $this->offset = $offset;\n }\n\n abstract protected function getOAuthAccount(User $user): ?SocialAccount;\n abstract protected function getDefaultFollowupLayoutFields(string $activityType): array;\n abstract protected function getFieldTypes(): array;\n abstract protected function getFields(string $fieldType): array;\n\n public function syncFields(): void\n {\n foreach ($this->getFieldTypes() as $fieldType) {\n $currentFields = $this->getFields($fieldType);\n\n // TODO: only sync the field once a day if we don't use it in any layout. If we do, sync hourly?\n foreach ($currentFields as $field) {\n /** @var Models\\Crm\\Field $field */\n $field = $this->config->fields()->updateOrCreate([\n 'crm_provider_id' => mb_strimwidth($field['name'], 0, 128),\n 'object_type' => $fieldType,\n ], [\n 'label' => mb_strimwidth($field['label'], 0, Field::LABEL_MAX_LENGTH),\n ]);\n\n try {\n $this->syncField($field);\n\n if ($field->type === Models\\Crm\\Field::TYPE_PICKLIST) {\n $this->importPicklistValues($field);\n }\n } catch (HttpNotFoundException $e) {\n $this->logger->error('[sync-fields] Field not found', [\n 'provider' => $this->getDisplayName(),\n 'crm_field' => $field->crm_provider_id,\n 'object_type' => $field->object_type,\n 'team_id' => $this->team->id,\n ]);\n } catch (HttpBadRequestException $e) {\n $this->logger->error('[sync-fields] Field not supported', [\n 'provider' => $this->getDisplayName(),\n 'crm_field' => $field->crm_provider_id,\n 'object_type' => $field->object_type,\n 'team_id' => $this->team->id,\n ]);\n }\n }\n }\n }\n\n /**\n * @param string $objectId\n * @param ?string $objectType\n *\n * @return array\n */\n public function parseRecords(string $objectId, ?string $objectType = null): array\n {\n if ($objectType === null && $this instanceof SupportsObjectTypeParseInterface) {\n $objectType = $this->parseObjectType($objectId);\n }\n\n $lead = null;\n $contact = null;\n $opportunity = null;\n $account = null;\n $stage = null;\n $countryCode = null;\n\n // Gather the prospect data to store on activity/participant.\n switch ($objectType) {\n case self::OBJECT_LEAD:\n /** @var ?Lead $lead */\n $lead = $this->config->leads()->where('crm_provider_id', $objectId)->first();\n\n if ($lead === null) {\n $lead = $this->syncLead($objectId);\n }\n\n if ($lead?->country_code) {\n $countryCode = $lead->country_code;\n }\n\n $stage = $lead?->stage;\n\n break;\n\n case self::OBJECT_ACCOUNT:\n $account = $this->config->accounts()->where('crm_provider_id', $objectId)->first();\n\n if ($account === null) {\n $account = $this->syncAccount($objectId);\n }\n\n if ($account->country_code) {\n $countryCode = $account->country_code;\n }\n\n break;\n\n case self::OBJECT_CONTACT:\n $contact = $this->config->contacts()->where('crm_provider_id', $objectId)->first();\n\n if ($contact === null) {\n $contact = $this->syncContact($objectId);\n }\n\n if ($contact?->country_code) {\n $countryCode = $contact->country_code;\n }\n\n $account = $contact?->account;\n\n break;\n\n case self::OBJECT_OPPORTUNITY:\n $opportunity = $this->config->opportunities()->where('crm_provider_id', $objectId)->first();\n\n if ($opportunity === null) {\n $opportunity = $this->syncOpportunity($objectId);\n }\n\n if ($opportunity !== null) {\n $stage = $opportunity->stage;\n\n $account = $opportunity->account;\n\n if ($account->country_code) {\n $countryCode = $account->country_code;\n }\n }\n\n break;\n }\n\n return [\n $lead,\n $account,\n $opportunity,\n $contact,\n $stage,\n $countryCode,\n ];\n }\n\n /**\n * @param null|string $name\n *\n * @return null|string\n */\n public function convertCountryNameToCode(?string $name): ?string\n {\n return app(CountryCodeResolver::class)->resolveCountryCode($name);\n }\n\n /**\n * @param PlaybookCategory $category\n *\n * @return bool\n */\n public function matchesCrmType(PlaybookCategory $category): bool\n {\n if ($category->playbook === null) {\n return false;\n }\n\n if ($category->getPlaybook()->getActivityField() === null) {\n return false;\n }\n\n $fieldValue = $category\n ->playbook\n ->activityField\n ->values()\n ->where('label', $category->name);\n\n // Check the field values for a matching option.\n return $fieldValue->exists();\n }\n\n /**\n * @param PlaybookCategory $category\n *\n * @return FieldValue|null\n */\n public function getCrmType(PlaybookCategory $category): ?FieldValue\n {\n $fieldValue = $category\n ->playbook\n ->activityField\n ->values()\n ->where('label', $category->name);\n\n return $fieldValue->first();\n }\n\n\n /**\n * @return int|float|string\n */\n public function getMinimumApiVersion(): int|float|string\n {\n return $this->client->getMinimumApiVersion();\n }\n\n /**\n * @param string $accountId\n *\n * @return bool\n */\n protected function hasAccount(string $accountId): bool\n {\n return $this->config->accounts()->where('crm_provider_id', $accountId)->exists();\n }\n\n /**\n * @param string $opportunityId\n *\n * @return bool\n */\n protected function hasOpportunity(string $opportunityId): bool\n {\n return $this->config->opportunities()->where('crm_provider_id', $opportunityId)->exists();\n }\n\n /**\n * @param string $contactId\n *\n * @return bool\n */\n protected function hasContact(string $contactId): bool\n {\n return $this->config->contacts()->where('crm_provider_id', $contactId)->exists();\n }\n\n /**\n * @param string $leadId\n *\n * @return bool\n */\n protected function hasLead(string $leadId): bool\n {\n return $this->config->leads()->where('crm_provider_id', $leadId)->exists();\n }\n\n public function fetchAndAssociateRelatedActivity(Activity $activity): ?Activity\n {\n return null;\n }\n\n public function getJobDelay(): int\n {\n return 0;\n }\n\n public function getPlaybookFromActivity(Activity $activity): ?Playbook\n {\n if ($activity->hasActivityType() && $activity->getActivityType()->hasPlaybook()) {\n return $activity->getActivityType()->getPlaybook();\n }\n\n return $this->getPlaybook($activity->getUser());\n }\n\n /**\n * Gets the playbook for the user\n */\n protected function getPlaybook(User $user): ?Playbook\n {\n $playbookResolver = app(PlaybookResolver::class);\n\n return $playbookResolver->resolvePlaybookByUser($user);\n }\n\n /**\n * @param Models\\Playbook $playbook\n * @param string $categoryName\n *\n * @return Models\\PlaybookCategory|null\n */\n protected function getPlaybookCategory(Models\\Playbook $playbook, string $categoryName): ?Models\\PlaybookCategory\n {\n return $playbook->categories()\n ->where('name', trim($categoryName))\n ->latest()\n ->first();\n }\n\n public function buildLayout(Layout $layout, ?string $activityType): void\n {\n if ($activityType) {\n // Base section. Currently, the fields within are hard coded so this is empty for now.\n /** @var Models\\Crm\\LayoutEntity $activitySection */\n $activitySection = $layout->entities()->create([\n 'label' => 'activity-summary',\n 'description' => 'Activity Summary',\n 'sequence' => 0,\n ]);\n\n if ($this instanceof HubspotInterface) {\n $activityFields = $this->getDefaultActivityLayoutFields($activityType, $layout->type);\n\n foreach ($activityFields as $i => $field) {\n $layout->entities()->create([\n 'parent_entity_id' => $activitySection->getId(),\n 'crm_field_id' => $field->getId(),\n 'sequence' => $i,\n ]);\n }\n }\n\n // Follow-up section. These are all dynamic fields.\n $sectionTitle = ($layout->type === Layout::TYPE_CONFERENCE_SUMMARY ? 'Next Steps...' : 'Follow up?');\n /** @var Models\\Crm\\LayoutEntity $followupSection */\n $followupSection = $layout->entities()->create([\n 'label' => 'follow-up',\n 'description' => $sectionTitle,\n 'sequence' => 1,\n ]);\n\n $followupFields = $this->getDefaultFollowupLayoutFields($activityType);\n\n foreach ($followupFields as $i => $field) {\n $layout->entities()->create([\n 'parent_entity_id' => $followupSection->getId(),\n 'crm_field_id' => $field->getId(),\n 'sequence' => $i,\n ]);\n }\n } elseif ($layout->type == Layout::TYPE_DEAL_INSIGHTS) {\n $this->populateLayoutEntities($layout);\n }\n }\n\n protected function populateLayoutEntities(Layout $layout): void\n {\n $dealFields = $this->getDefaultDealLayoutFields();\n\n foreach ($dealFields as $i => $field) {\n $readOnly = $field->getType() === Field::TYPE_CURRENCY\n || $this->isBusinessTypeField($field);\n\n $layout->entities()->updateOrCreate([\n 'crm_field_id' => $field->id,\n ], [\n 'sequence' => $i,\n 'read_only' => $readOnly,\n ]);\n }\n }\n\n public function prepareValueForUpdate(array $params): array\n {\n $fieldName = $params['fieldName'];\n $fieldValue = $params['fieldValue'];\n\n return [$fieldName => $fieldValue];\n }\n\n protected function getDefaultDealLayoutFields(): array\n {\n $fieldData = $this->getDealInsightsFields();\n\n $fields = [];\n foreach ($fieldData as $data) {\n /** @var Field $field */\n $field = $this->config->fields()->updateOrCreate([\n 'crm_provider_id' => $data['crm_provider_id'],\n 'object_type' => $data['object_type'],\n ], ['label' => $data['crm_provider_id']]);\n\n try {\n dispatch_sync(new SyncFieldMetadata($this->config->team, $field));\n $field->refresh();\n } catch (\\Throwable $throwable) {\n \\Sentry::captureException($throwable);\n }\n\n $fields[] = $field;\n }\n\n return $fields;\n }\n\n public function importOpportunityCrmFieldData(array $crmData, array $crmFields, int $opportunityId): void\n {\n // Pre-fetch all opportunity fields once per batch to avoid N+1 queries.\n // During webhook floods, this reduces DB queries from O(fields × deals) to O(1) for field lookups.\n $fieldsMap = $this->getOpportunityFieldsMap();\n\n foreach ($crmFields as $fieldName) {\n $field = $fieldsMap->get($fieldName);\n\n if (! $field instanceof Field) {\n $this->logger->warning('Field not found', [\n 'field' => $fieldName,\n 'opportunity_id' => $opportunityId,\n ]);\n\n continue;\n }\n\n // A CRM field data will be synced only if the field exists as part of at least one layout,\n // i.e. an entity related to the field exists.\n $entity = $field->entities->first();\n if (! $entity instanceof Models\\Crm\\LayoutEntity) {\n continue;\n }\n\n $fieldValue = $crmData[$fieldName] ?? '';\n\n if (is_object($fieldValue)) {\n $this->logger->warning('Field value is an object', [\n 'field' => $fieldName,\n ]);\n\n continue;\n }\n\n $value = $this->normalizeValue($field->type, $fieldValue, true);\n\n FieldData::updateOrCreate([\n 'crm_layout_entity_id' => $entity->id,\n 'crm_field_id' => $field->id,\n 'object_type' => 'opportunity',\n 'object_id' => $opportunityId,\n ], ['value' => $value]);\n }\n }\n\n /**\n * Get cached opportunity fields map for efficient lookups during batch imports.\n *\n * This method fetches all opportunity fields with their entities relation ONCE\n * and caches them for the lifetime of this service instance. This eliminates\n * the N+1 query problem where each field was fetched individually per deal.\n *\n * Performance impact:\n * - Before: 10 fields × 100 deals = 1,000 field queries per batch\n * - After: 1 query per batch (regardless of deal count)\n *\n * @return Collection<string, Field> Fields keyed by crm_provider_id\n */\n private function getOpportunityFieldsMap(): Collection\n {\n if ($this->cachedOpportunityFields === null) {\n $this->cachedOpportunityFields = $this->config->fields()\n ->with('entities')\n ->where('object_type', '=', self::OBJECT_OPPORTUNITY)\n ->get()\n ->keyBy('crm_provider_id');\n }\n\n return $this->cachedOpportunityFields;\n }\n\n /**\n * @param array<mixed> $crmData\n * @param Collection $crmFields\n * @param int $objectId\n *\n * @return void\n */\n public function importCrmFieldData(array $crmData, Collection $crmFields, int $objectId): void\n {\n /** @var Field $crmField */\n foreach ($crmFields as $crmField) {\n // If the field name does not match one we are interested in, skip.\n if (array_key_exists($crmField->crm_provider_id, $crmData) === false) {\n continue;\n }\n\n /** @var string $fieldValue */\n $fieldValue = $crmData[$crmField->crm_provider_id];\n\n $value = $this->normalizeValue($crmField->type, $fieldValue, true);\n\n FieldData::updateOrCreate([\n 'crm_field_id' => $crmField->id,\n 'object_type' => $crmField->object_type,\n 'object_id' => $objectId,\n ], ['value' => $value]);\n }\n }\n\n protected function getTeam(): Team\n {\n if (! $this->team instanceof Team) {\n throw new LogicException('Expecting team model instance');\n }\n\n return $this->team;\n }\n\n public function isBusinessTypeField(Field $field): bool\n {\n return in_array($field->crm_provider_id, Field::BUSINESS_TYPE_FIELDS)\n && $field->object_type === Field::OBJECT_OPPORTUNITY;\n }\n\n /**\n * @return mixed[]\n */\n public function fetchRelatedActivity(Activity $activity): array\n {\n return [];\n }\n\n /**\n * @throws SocialAccountTokenInvalidException\n */\n private function validateUserAccountExists(User $user, ?SocialAccount $account = null): void\n {\n if ($account instanceof SocialAccount && $account->state === SocialAccount::STATE_CONNECTED) {\n return;\n }\n\n $this->logger->warning(\n sprintf('[%s] Account not connected for user', $this->getDisplayName()),\n [\n 'userId' => $user->getIdString(),\n 'account' => $account,\n ]\n );\n\n // If their profile was never setup in the first place\n if ($this->profile === null) {\n // Create a dummy in-memory profile just to be able to run\n $this->profile = new Profile();\n }\n\n if (! $account instanceof SocialAccount) {\n throw new SocialAccountTokenInvalidException(\n sprintf(\n 'Social account for %s cannot be found. Please login to Jiminny to connect.',\n $this->getDisplayName()\n )\n );\n }\n\n throw new SocialAccountTokenInvalidException(\n sprintf(\n 'Your %s account has become disconnected. Please login to Jiminny to reconnect.',\n $this->getDisplayName()\n )\n );\n }\n\n public function listSupportedObjectTypes(): array\n {\n return $this->getFieldTypes();\n }\n}","role_description":"text entry area","is_enabled":true,"is_focused":true,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Execute","depth":4,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Explain Plan","depth":4,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Browse Query History","depth":4,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"View Parameters","depth":4,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Open Query Execution Settings…","depth":4,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"In-Editor Results","depth":4,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Tx: Auto","depth":4,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Cancel Running Statements","depth":4,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Playground","depth":4,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"jiminny","depth":4,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.088194445,"height":0.027777778},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"6","depth":4,"role_description":"text"},{"role":"AXStaticText","text":"1","depth":4,"role_description":"text"},{"role":"AXStaticText","text":"6","depth":4,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"# **************************** HS **************************************\n\nselect * from teams where id = 2; # 2\nselect * from features; # 2\nselect * from team_features where team_id = 2; # 2\nselect * from crm_configurations where id = 2; # 2\nselect * from users where team_id = 2; #\nselect * from playbooks where team_id = 2; # event 38\nselect * from playbook_categories where playbook_id = 38; #\n\nSELECT * FROM activities WHERE crm_configuration_id = 2 and crm_provider_id is not null order by id desc;\nhttps://app.hubspot.com/contacts/4392066/deal/16964514951/?engagement=96069102624\n https://app.staging.jiminny.com/playback/d5df34dc-bd66-4ff5-a7b3-8d3be30322a0\n\nSELECT * FROM activities WHERE uuid_to_bin('04fdcd0d-818f-4c53-92dc-6f18bc753ffd') = uuid;\n# 609126 softphone tr. 11241\n\nSELECT * FROM activities WHERE uuid_to_bin('6521bfcd-5a30-46e5-9f74-5440fd48befd') = uuid;\n# 608874 conference tr. 11226 crmId: 103422236596\n\nselect * from ai_prompts where transcription_id IN (11241, 11226);\nselect * from activity_summary_logs where activity_id = 608874;\n\nselect * from sidekick_settings;\nselect * from default_activity_types;\n\nselect * from crm_field_data where activity_id = 1223;\n\nselect * from crm_layouts where crm_configuration_id = 2;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id IN (554);\nselect * from crm_fields where crm_configuration_id = 11 and object_type = 'event';\nSELECT * FROM crm_field_values WHERE crm_field_id IN (1455,1450);\n\nSELECT * FROM crm_field_data WHERE crm_layout_entity_id = 971;\nSELECT * FROM crm_field_data WHERE crm_layout_entity_id IN (6494,6495,6496,6497,6498,6499);\n\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u\n on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 2 and sa.provider = 'hubspot';\n\nselect * from opportunities where team_id = 2\nand crm_provider_id IN ('51317301383');\n\nselect * from contacts where id = 85;\n\nselect * from opportunities where team_id = 2 order by id desc;\nselect * from opportunities where team_id = 2 and crm_provider_id = '51317301383'; # 5112\nselect * from opportunities where team_id = 2 and crm_provider_id = '55976759904'; # 5112\nselect * from opportunity_contacts where opportunity_id = 5117;\nselect * from crm_field_data where object_id = 1365;\nSELECT * FROM crm_fields WHERE id IN (1405, 1407, 1972, 2128);\n\nselect * from features;\nselect * from team_features where team_id IN (1);\nselect * from team_features where feature_id IN (36);\n\nSHOW CREATE TABLE opportunity_contacts;\nSELECT * FROM opportunity_contacts WHERE crm_provider_id = '111751';\n\n# $slug = 'HUBSPOT_WEBHOOK_SYNC';\n# $team = Jiminny\\Models\\Team::find(2);\n# $feature = Feature::query()->where('slug', $slug)->first();\n# TeamFeature::query()->create(['feature_id' => $feature->getId(),'team_id' => $team->getId()]);\n\n# hubspot_webhook_metrics\n\nselect * from opportunities where team_id = 2 and crm_provider_id IN ('374720564','14527423589','49908861993','50435771779'); # 1365\nSELECT * FROM opportunity_contacts WHERE opportunity_id = '414';\nSELECT * FROM opportunity_contacts WHERE crm_provider_id = '131501';\nselect * from contacts where id in (414, 464);\n\nselect * from activities where crm_configuration_id = 2;\n\nselect settings from crm_configurations where id = 11;\n\nselect * from teams; # 1, 2\nselect * from users;\nselect * from crm_configurations where id = 39;\nselect * from team_features where team_id = 2;\nselect * from features;\n# SELECT * FROM opportunities WHERE crm_configuration_id = 2\n# order by id desc;\n# and crm_provider_id = '49908861993';\n\n\nselect * from activity_providers where id IN (443, 202, 203, 227);\n\nselect * from activity_imports where id = 795889;\n\nselect c.id, c.provider, c.settings, t.* from teams t join crm_configurations c on t.id = c.team_id\nwhere c.provider = 'hubspot';\n\nselect * from crm_configurations crm JOIN teams t on crm.team_id = t.id\nwhere provider = 'hubspot';\nSELECT * FROM teams WHERE id = 31;\nSELECT * FROM users WHERE id = 257;\nSELECT * FROM opportunities WHERE team_id = 2;\n\nselect * from opportunity_contacts where opportunity_id = 5124;\nselect * from contacts where id IN (3850,3853,3851,4073,4140,4155,4480,4530,4623,5986,513,687,1806,1523,3613)\n\nselect * from activities where crm_configuration_id = 13;\n\nSELECT * FROM activities WHERE uuid_to_bin('826619ce-ec8e-4e59-8467-a01f5f6ad71e') = uuid; # 418141\n\n\nselect id, team_id, crm_provider_id from crm_configurations where provider = 'hubspot' and crm_provider_id IS NOT NULL;\nSELECT * FROM accounts WHERE team_id = 2 and crm_provider_id = '1212213464' order by id desc;\nSELECT * FROM contacts WHERE team_id = 2 and account_id = 5189 order by id desc;\nSELECT * FROM contacts WHERE team_id = 2 order by id desc;\nselect * from opportunity_contacts where contact_id = 6223;\nSELECT * FROM opportunities WHERE team_id = 2 and account_id = 5189 order by id desc;\n\nselect * from crm_profiles where crm_configuration_id = 2;\n\nselect * from activities where account_id = 46;","depth":4,"value":"# **************************** HS **************************************\n\nselect * from teams where id = 2; # 2\nselect * from features; # 2\nselect * from team_features where team_id = 2; # 2\nselect * from crm_configurations where id = 2; # 2\nselect * from users where team_id = 2; #\nselect * from playbooks where team_id = 2; # event 38\nselect * from playbook_categories where playbook_id = 38; #\n\nSELECT * FROM activities WHERE crm_configuration_id = 2 and crm_provider_id is not null order by id desc;\nhttps://app.hubspot.com/contacts/4392066/deal/16964514951/?engagement=96069102624\n https://app.staging.jiminny.com/playback/d5df34dc-bd66-4ff5-a7b3-8d3be30322a0\n\nSELECT * FROM activities WHERE uuid_to_bin('04fdcd0d-818f-4c53-92dc-6f18bc753ffd') = uuid;\n# 609126 softphone tr. 11241\n\nSELECT * FROM activities WHERE uuid_to_bin('6521bfcd-5a30-46e5-9f74-5440fd48befd') = uuid;\n# 608874 conference tr. 11226 crmId: 103422236596\n\nselect * from ai_prompts where transcription_id IN (11241, 11226);\nselect * from activity_summary_logs where activity_id = 608874;\n\nselect * from sidekick_settings;\nselect * from default_activity_types;\n\nselect * from crm_field_data where activity_id = 1223;\n\nselect * from crm_layouts where crm_configuration_id = 2;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id IN (554);\nselect * from crm_fields where crm_configuration_id = 11 and object_type = 'event';\nSELECT * FROM crm_field_values WHERE crm_field_id IN (1455,1450);\n\nSELECT * FROM crm_field_data WHERE crm_layout_entity_id = 971;\nSELECT * FROM crm_field_data WHERE crm_layout_entity_id IN (6494,6495,6496,6497,6498,6499);\n\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u\n on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 2 and sa.provider = 'hubspot';\n\nselect * from opportunities where team_id = 2\nand crm_provider_id IN ('51317301383');\n\nselect * from contacts where id = 85;\n\nselect * from opportunities where team_id = 2 order by id desc;\nselect * from opportunities where team_id = 2 and crm_provider_id = '51317301383'; # 5112\nselect * from opportunities where team_id = 2 and crm_provider_id = '55976759904'; # 5112\nselect * from opportunity_contacts where opportunity_id = 5117;\nselect * from crm_field_data where object_id = 1365;\nSELECT * FROM crm_fields WHERE id IN (1405, 1407, 1972, 2128);\n\nselect * from features;\nselect * from team_features where team_id IN (1);\nselect * from team_features where feature_id IN (36);\n\nSHOW CREATE TABLE opportunity_contacts;\nSELECT * FROM opportunity_contacts WHERE crm_provider_id = '111751';\n\n# $slug = 'HUBSPOT_WEBHOOK_SYNC';\n# $team = Jiminny\\Models\\Team::find(2);\n# $feature = Feature::query()->where('slug', $slug)->first();\n# TeamFeature::query()->create(['feature_id' => $feature->getId(),'team_id' => $team->getId()]);\n\n# hubspot_webhook_metrics\n\nselect * from opportunities where team_id = 2 and crm_provider_id IN ('374720564','14527423589','49908861993','50435771779'); # 1365\nSELECT * FROM opportunity_contacts WHERE opportunity_id = '414';\nSELECT * FROM opportunity_contacts WHERE crm_provider_id = '131501';\nselect * from contacts where id in (414, 464);\n\nselect * from activities where crm_configuration_id = 2;\n\nselect settings from crm_configurations where id = 11;\n\nselect * from teams; # 1, 2\nselect * from users;\nselect * from crm_configurations where id = 39;\nselect * from team_features where team_id = 2;\nselect * from features;\n# SELECT * FROM opportunities WHERE crm_configuration_id = 2\n# order by id desc;\n# and crm_provider_id = '49908861993';\n\n\nselect * from activity_providers where id IN (443, 202, 203, 227);\n\nselect * from activity_imports where id = 795889;\n\nselect c.id, c.provider, c.settings, t.* from teams t join crm_configurations c on t.id = c.team_id\nwhere c.provider = 'hubspot';\n\nselect * from crm_configurations crm JOIN teams t on crm.team_id = t.id\nwhere provider = 'hubspot';\nSELECT * FROM teams WHERE id = 31;\nSELECT * FROM users WHERE id = 257;\nSELECT * FROM opportunities WHERE team_id = 2;\n\nselect * from opportunity_contacts where opportunity_id = 5124;\nselect * from contacts where id IN (3850,3853,3851,4073,4140,4155,4480,4530,4623,5986,513,687,1806,1523,3613)\n\nselect * from activities where crm_configuration_id = 13;\n\nSELECT * FROM activities WHERE uuid_to_bin('826619ce-ec8e-4e59-8467-a01f5f6ad71e') = uuid; # 418141\n\n\nselect id, team_id, crm_provider_id from crm_configurations where provider = 'hubspot' and crm_provider_id IS NOT NULL;\nSELECT * FROM accounts WHERE team_id = 2 and crm_provider_id = '1212213464' order by id desc;\nSELECT * FROM contacts WHERE team_id = 2 and account_id = 5189 order by id desc;\nSELECT * FROM contacts WHERE team_id = 2 order by id desc;\nselect * from opportunity_contacts where contact_id = 6223;\nSELECT * FROM opportunities WHERE team_id = 2 and account_id = 5189 order by id desc;\n\nselect * from crm_profiles where crm_configuration_id = 2;\n\nselect * from activities where account_id = 46;","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Project","depth":3,"role_description":"text"},{"role":"AXButton","text":"Project","depth":3,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"New File or Directory…","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Expand Selected","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Collapse All","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Options","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
-3901041415012267504
|
633758359911316605
|
click
|
accessibility
|
NULL
|
Project: faVsco.js, menu
#11976 on JY-20553-debug- Project: faVsco.js, menu
#11976 on JY-20553-debug-crm-sync-delays, menu
Start Listening for PHP Debug Connections
RequestGenerateAskJiminnyReportJobTest
Run 'RequestGenerateAskJiminnyReportJobTest'
Debug 'RequestGenerateAskJiminnyReportJobTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
1
19
2
Previous Highlighted Error
Next Highlighted Error
<?php
namespace Jiminny\Services\Crm;
use Illuminate\Support\Collection;
use Jiminny\Component\Transcription\Service\TranscriptionService;
use Jiminny\Contracts\Services\Crm\ClientInterface;
use Jiminny\Contracts\Services\Crm\ConnectionStateInterface;
use Jiminny\Contracts\Services\Crm\Provider\HubspotInterface;
use Jiminny\Contracts\Services\Crm\ServiceInterface;
use Jiminny\Contracts\Services\Crm\SettingsInterface;
use Jiminny\Contracts\Services\Crm\SupportsObjectTypeParseInterface;
use Jiminny\Contracts\Services\Crm\SyncCrmEntitiesInterface;
use Jiminny\Exceptions\HttpBadRequestException;
use Jiminny\Exceptions\HttpNotFoundException;
use Jiminny\Exceptions\LogicException;
use Jiminny\Exceptions\SocialAccountTokenInvalidException;
use Jiminny\Integrations\PlaybookResolver;
use Jiminny\Jobs\Crm\SyncFieldMetadata;
use Jiminny\Models;
use Jiminny\Models\Activity;
use Jiminny\Models\Crm\Configuration;
use Jiminny\Models\Crm\Field;
use Jiminny\Models\Crm\FieldData;
use Jiminny\Models\Crm\FieldValue;
use Jiminny\Models\Crm\Layout;
use Jiminny\Models\Crm\Profile;
use Jiminny\Models\Lead;
use Jiminny\Models\Playbook;
use Jiminny\Models\PlaybookCategory;
use Jiminny\Models\SocialAccount;
use Jiminny\Models\Team;
use Jiminny\Models\User;
use Jiminny\Services\Crm\Helpers\ConnectionStateTrait;
use Jiminny\Services\Crm\Helpers\OpportunitySyncableFieldsTrait;
use Jiminny\Services\TeamService;
use Psr\Log\LoggerInterface;
use Sentry\State\Scope;
abstract class BaseService implements
ServiceInterface,
SettingsInterface,
SyncCrmEntitiesInterface,
ConnectionStateInterface
{
use ConnectionStateTrait;
use OpportunitySyncableFieldsTrait;
public const string OBJECT_LEAD = 'lead';
public const string OBJECT_ACCOUNT = 'account';
public const string OBJECT_CONTACT = 'contact';
public const string OBJECT_OPPORTUNITY = 'opportunity';
public const string OBJECT_TASK = 'task';
public const string OBJECT_EVENT = 'event';
public const int SOFT_DELETE_CHUNK = 100;
public const int HARD_DELETE_CHUNK = 1000;
public ?Configuration $config;
public ?Profile $profile;
public ?Team $team = null;
/**
* @var ClientInterface
*/
protected $client;
/**
* @var TeamService
*/
protected TeamService $teamService;
/**
* @var int
*/
protected int $limit;
/**
* @var int
*/
protected int $offset;
/**
* Transcription Service instance.
*
* @var TranscriptionService
*/
protected TranscriptionService $transcriptionService;
protected LoggerInterface $logger;
/**
* Cache for opportunity fields to avoid N+1 queries during batch imports.
* Key: crm_provider_id, Value: Field model with entities relation.
* Cleared when configuration changes.
*
* @var Collection<string, Field>|null
*/
private ?Collection $cachedOpportunityFields = null;
public function __construct()
{
$this->teamService = app(TeamService::class);
$this->transcriptionService = app(TranscriptionService::class);
$this->logger = app(LoggerInterface::class);
}
/**
* @param User $user
*
* @throws SocialAccountTokenInvalidException
*/
public function setUser(User $user): void
{
$this->configureSentryScope($user);
$this->team = $user->team;
$this->teamService->setTeam($user->team);
$this->setConfiguration($user->team->crm);
// Reset state.
$this->profile = $user->crmProfile;
/**
* DO NOT DELETE THIS `clearTokens` CALL
* The purpose of purging tokens is to fix a problem in importing calendar events.
* Calendar Import doesn't always respect "SocialAccountInvalidTokenException" exception
* and may try to recycle old SF instance, with wrong credentials (by ignoring the exception).
*
* This code guarantees the CRM Service is unusable, unless always provided with a valid social account.
*/
if (method_exists($this->client, 'clearTokens')) {
$this->client->clearTokens();
}
$account = $this->getOAuthAccount($user);
$this->validateUserAccountExists($user, $account);
if (method_exists($this->client, 'setOAuthAccount')) {
$this->client->setOAuthAccount($account);
}
if (method_exists($this->client, 'setLogger')) {
$this->client->setLogger($this->logger);
}
if ($this->profile === null) {
// Try to fetch their profile, maybe it was not yet imported?
$cacheKey = sprintf('crm_profile_sync-%s', $user->getId());
$lock = \Cache::lock($cacheKey, 300);
if ($lock->get()) {
$this->profile = $this->getProfile($user);
}
}
// The CRM Service is properly bootstrapped, and supports remote operations
$this->connect();
}
protected function configureSentryScope(User $user): void
{
\Sentry\configureScope(function (Scope $scope) use ($user): void {
$scope->setTag('team_id', (string) $user->getTeamId());
$scope->setUser([
'id' => $user->getId(),
'email' => $user->getEmailAddress(),
]);
});
}
/**
* @param User $user
*
* @return Profile|null
*/
protected function getProfile(User $user): ?Profile
{
return $this->syncProfiles($user);
}
public function getConfiguration(): Configuration
{
return $this->config;
}
public function setConfiguration(Configuration $config): void
{
$this->config = $config;
$this->client->setConfiguration($config);
// Clear field cache when configuration changes to ensure fresh data for new team/config
$this->cachedOpportunityFields = null;
if ($this->team === null) {
$this->team = $config->team;
}
}
public function setPage(int $limit, int $offset): void
{
$this->limit = $limit;
$this->offset = $offset;
}
abstract protected function getOAuthAccount(User $user): ?SocialAccount;
abstract protected function getDefaultFollowupLayoutFields(string $activityType): array;
abstract protected function getFieldTypes(): array;
abstract protected function getFields(string $fieldType): array;
public function syncFields(): void
{
foreach ($this->getFieldTypes() as $fieldType) {
$currentFields = $this->getFields($fieldType);
// TODO: only sync the field once a day if we don't use it in any layout. If we do, sync hourly?
foreach ($currentFields as $field) {
/** @var Models\Crm\Field $field */
$field = $this->config->fields()->updateOrCreate([
'crm_provider_id' => mb_strimwidth($field['name'], 0, 128),
'object_type' => $fieldType,
], [
'label' => mb_strimwidth($field['label'], 0, Field::LABEL_MAX_LENGTH),
]);
try {
$this->syncField($field);
if ($field->type === Models\Crm\Field::TYPE_PICKLIST) {
$this->importPicklistValues($field);
}
} catch (HttpNotFoundException $e) {
$this->logger->error('[sync-fields] Field not found', [
'provider' => $this->getDisplayName(),
'crm_field' => $field->crm_provider_id,
'object_type' => $field->object_type,
'team_id' => $this->team->id,
]);
} catch (HttpBadRequestException $e) {
$this->logger->error('[sync-fields] Field not supported', [
'provider' => $this->getDisplayName(),
'crm_field' => $field->crm_provider_id,
'object_type' => $field->object_type,
'team_id' => $this->team->id,
]);
}
}
}
}
/**
* @param string $objectId
* @param ?string $objectType
*
* @return array
*/
public function parseRecords(string $objectId, ?string $objectType = null): array
{
if ($objectType === null && $this instanceof SupportsObjectTypeParseInterface) {
$objectType = $this->parseObjectType($objectId);
}
$lead = null;
$contact = null;
$opportunity = null;
$account = null;
$stage = null;
$countryCode = null;
// Gather the prospect data to store on activity/participant.
switch ($objectType) {
case self::OBJECT_LEAD:
/** @var ?Lead $lead */
$lead = $this->config->leads()->where('crm_provider_id', $objectId)->first();
if ($lead === null) {
$lead = $this->syncLead($objectId);
}
if ($lead?->country_code) {
$countryCode = $lead->country_code;
}
$stage = $lead?->stage;
break;
case self::OBJECT_ACCOUNT:
$account = $this->config->accounts()->where('crm_provider_id', $objectId)->first();
if ($account === null) {
$account = $this->syncAccount($objectId);
}
if ($account->country_code) {
$countryCode = $account->country_code;
}
break;
case self::OBJECT_CONTACT:
$contact = $this->config->contacts()->where('crm_provider_id', $objectId)->first();
if ($contact === null) {
$contact = $this->syncContact($objectId);
}
if ($contact?->country_code) {
$countryCode = $contact->country_code;
}
$account = $contact?->account;
break;
case self::OBJECT_OPPORTUNITY:
$opportunity = $this->config->opportunities()->where('crm_provider_id', $objectId)->first();
if ($opportunity === null) {
$opportunity = $this->syncOpportunity($objectId);
}
if ($opportunity !== null) {
$stage = $opportunity->stage;
$account = $opportunity->account;
if ($account->country_code) {
$countryCode = $account->country_code;
}
}
break;
}
return [
$lead,
$account,
$opportunity,
$contact,
$stage,
$countryCode,
];
}
/**
* @param null|string $name
*
* @return null|string
*/
public function convertCountryNameToCode(?string $name): ?string
{
return app(CountryCodeResolver::class)->resolveCountryCode($name);
}
/**
* @param PlaybookCategory $category
*
* @return bool
*/
public function matchesCrmType(PlaybookCategory $category): bool
{
if ($category->playbook === null) {
return false;
}
if ($category->getPlaybook()->getActivityField() === null) {
return false;
}
$fieldValue = $category
->playbook
->activityField
->values()
->where('label', $category->name);
// Check the field values for a matching option.
return $fieldValue->exists();
}
/**
* @param PlaybookCategory $category
*
* @return FieldValue|null
*/
public function getCrmType(PlaybookCategory $category): ?FieldValue
{
$fieldValue = $category
->playbook
->activityField
->values()
->where('label', $category->name);
return $fieldValue->first();
}
/**
* @return int|float|string
*/
public function getMinimumApiVersion(): int|float|string
{
return $this->client->getMinimumApiVersion();
}
/**
* @param string $accountId
*
* @return bool
*/
protected function hasAccount(string $accountId): bool
{
return $this->config->accounts()->where('crm_provider_id', $accountId)->exists();
}
/**
* @param string $opportunityId
*
* @return bool
*/
protected function hasOpportunity(string $opportunityId): bool
{
return $this->config->opportunities()->where('crm_provider_id', $opportunityId)->exists();
}
/**
* @param string $contactId
*
* @return bool
*/
protected function hasContact(string $contactId): bool
{
return $this->config->contacts()->where('crm_provider_id', $contactId)->exists();
}
/**
* @param string $leadId
*
* @return bool
*/
protected function hasLead(string $leadId): bool
{
return $this->config->leads()->where('crm_provider_id', $leadId)->exists();
}
public function fetchAndAssociateRelatedActivity(Activity $activity): ?Activity
{
return null;
}
public function getJobDelay(): int
{
return 0;
}
public function getPlaybookFromActivity(Activity $activity): ?Playbook
{
if ($activity->hasActivityType() && $activity->getActivityType()->hasPlaybook()) {
return $activity->getActivityType()->getPlaybook();
}
return $this->getPlaybook($activity->getUser());
}
/**
* Gets the playbook for the user
*/
protected function getPlaybook(User $user): ?Playbook
{
$playbookResolver = app(PlaybookResolver::class);
return $playbookResolver->resolvePlaybookByUser($user);
}
/**
* @param Models\Playbook $playbook
* @param string $categoryName
*
* @return Models\PlaybookCategory|null
*/
protected function getPlaybookCategory(Models\Playbook $playbook, string $categoryName): ?Models\PlaybookCategory
{
return $playbook->categories()
->where('name', trim($categoryName))
->latest()
->first();
}
public function buildLayout(Layout $layout, ?string $activityType): void
{
if ($activityType) {
// Base section. Currently, the fields within are hard coded so this is empty for now.
/** @var Models\Crm\LayoutEntity $activitySection */
$activitySection = $layout->entities()->create([
'label' => 'activity-summary',
'description' => 'Activity Summary',
'sequence' => 0,
]);
if ($this instanceof HubspotInterface) {
$activityFields = $this->getDefaultActivityLayoutFields($activityType, $layout->type);
foreach ($activityFields as $i => $field) {
$layout->entities()->create([
'parent_entity_id' => $activitySection->getId(),
'crm_field_id' => $field->getId(),
'sequence' => $i,
]);
}
}
// Follow-up section. These are all dynamic fields.
$sectionTitle = ($layout->type === Layout::TYPE_CONFERENCE_SUMMARY ? 'Next Steps...' : 'Follow up?');
/** @var Models\Crm\LayoutEntity $followupSection */
$followupSection = $layout->entities()->create([
'label' => 'follow-up',
'description' => $sectionTitle,
'sequence' => 1,
]);
$followupFields = $this->getDefaultFollowupLayoutFields($activityType);
foreach ($followupFields as $i => $field) {
$layout->entities()->create([
'parent_entity_id' => $followupSection->getId(),
'crm_field_id' => $field->getId(),
'sequence' => $i,
]);
}
} elseif ($layout->type == Layout::TYPE_DEAL_INSIGHTS) {
$this->populateLayoutEntities($layout);
}
}
protected function populateLayoutEntities(Layout $layout): void
{
$dealFields = $this->getDefaultDealLayoutFields();
foreach ($dealFields as $i => $field) {
$readOnly = $field->getType() === Field::TYPE_CURRENCY
|| $this->isBusinessTypeField($field);
$layout->entities()->updateOrCreate([
'crm_field_id' => $field->id,
], [
'sequence' => $i,
'read_only' => $readOnly,
]);
}
}
public function prepareValueForUpdate(array $params): array
{
$fieldName = $params['fieldName'];
$fieldValue = $params['fieldValue'];
return [$fieldName => $fieldValue];
}
protected function getDefaultDealLayoutFields(): array
{
$fieldData = $this->getDealInsightsFields();
$fields = [];
foreach ($fieldData as $data) {
/** @var Field $field */
$field = $this->config->fields()->updateOrCreate([
'crm_provider_id' => $data['crm_provider_id'],
'object_type' => $data['object_type'],
], ['label' => $data['crm_provider_id']]);
try {
dispatch_sync(new SyncFieldMetadata($this->config->team, $field));
$field->refresh();
} catch (\Throwable $throwable) {
\Sentry::captureException($throwable);
}
$fields[] = $field;
}
return $fields;
}
public function importOpportunityCrmFieldData(array $crmData, array $crmFields, int $opportunityId): void
{
// Pre-fetch all opportunity fields once per batch to avoid N+1 queries.
// During webhook floods, this reduces DB queries from O(fields × deals) to O(1) for field lookups.
$fieldsMap = $this->getOpportunityFieldsMap();
foreach ($crmFields as $fieldName) {
$field = $fieldsMap->get($fieldName);
if (! $field instanceof Field) {
$this->logger->warning('Field not found', [
'field' => $fieldName,
'opportunity_id' => $opportunityId,
]);
continue;
}
// A CRM field data will be synced only if the field exists as part of at least one layout,
// i.e. an entity related to the field exists.
$entity = $field->entities->first();
if (! $entity instanceof Models\Crm\LayoutEntity) {
continue;
}
$fieldValue = $crmData[$fieldName] ?? '';
if (is_object($fieldValue)) {
$this->logger->warning('Field value is an object', [
'field' => $fieldName,
]);
continue;
}
$value = $this->normalizeValue($field->type, $fieldValue, true);
FieldData::updateOrCreate([
'crm_layout_entity_id' => $entity->id,
'crm_field_id' => $field->id,
'object_type' => 'opportunity',
'object_id' => $opportunityId,
], ['value' => $value]);
}
}
/**
* Get cached opportunity fields map for efficient lookups during batch imports.
*
* This method fetches all opportunity fields with their entities relation ONCE
* and caches them for the lifetime of this service instance. This eliminates
* the N+1 query problem where each field was fetched individually per deal.
*
* Performance impact:
* - Before: 10 fields × 100 deals = 1,000 field queries per batch
* - After: 1 query per batch (regardless of deal count)
*
* @return Collection<string, Field> Fields keyed by crm_provider_id
*/
private function getOpportunityFieldsMap(): Collection
{
if ($this->cachedOpportunityFields === null) {
$this->cachedOpportunityFields = $this->config->fields()
->with('entities')
->where('object_type', '=', self::OBJECT_OPPORTUNITY)
->get()
->keyBy('crm_provider_id');
}
return $this->cachedOpportunityFields;
}
/**
* @param array<mixed> $crmData
* @param Collection $crmFields
* @param int $objectId
*
* @return void
*/
public function importCrmFieldData(array $crmData, Collection $crmFields, int $objectId): void
{
/** @var Field $crmField */
foreach ($crmFields as $crmField) {
// If the field name does not match one we are interested in, skip.
if (array_key_exists($crmField->crm_provider_id, $crmData) === false) {
continue;
}
/** @var string $fieldValue */
$fieldValue = $crmData[$crmField->crm_provider_id];
$value = $this->normalizeValue($crmField->type, $fieldValue, true);
FieldData::updateOrCreate([
'crm_field_id' => $crmField->id,
'object_type' => $crmField->object_type,
'object_id' => $objectId,
], ['value' => $value]);
}
}
protected function getTeam(): Team
{
if (! $this->team instanceof Team) {
throw new LogicException('Expecting team model instance');
}
return $this->team;
}
public function isBusinessTypeField(Field $field): bool
{
return in_array($field->crm_provider_id, Field::BUSINESS_TYPE_FIELDS)
&& $field->object_type === Field::OBJECT_OPPORTUNITY;
}
/**
* @return mixed[]
*/
public function fetchRelatedActivity(Activity $activity): array
{
return [];
}
/**
* @throws SocialAccountTokenInvalidException
*/
private function validateUserAccountExists(User $user, ?SocialAccount $account = null): void
{
if ($account instanceof SocialAccount && $account->state === SocialAccount::STATE_CONNECTED) {
return;
}
$this->logger->warning(
sprintf('[%s] Account not connected for user', $this->getDisplayName()),
[
'userId' => $user->getIdString(),
'account' => $account,
]
);
// If their profile was never setup in the first place
if ($this->profile === null) {
// Create a dummy in-memory profile just to be able to run
$this->profile = new Profile();
}
if (! $account instanceof SocialAccount) {
throw new SocialAccountTokenInvalidException(
sprintf(
'Social account for %s cannot be found. Please login to Jiminny to connect.',
$this->getDisplayName()
)
);
}
throw new SocialAccountTokenInvalidException(
sprintf(
'Your %s account has become disconnected. Please login to Jiminny to reconnect.',
$this->getDisplayName()
)
);
}
public function listSupportedObjectTypes(): array
{
return $this->getFieldTypes();
}
}
Execute
Explain Plan
Browse Query History
View Parameters
Open Query Execution Settings…
In-Editor Results
Tx: Auto
Cancel Running Statements
Playground
jiminny
Code changed:
Hide
Sync Changes
Hide This Notification
6
1
6
Previous Highlighted Error
Next Highlighted Error
# [PASSWORD_DOTS] HS [PASSWORD_DOTS]
select * from teams where id = 2; # 2
select * from features; # 2
select * from team_features where team_id = 2; # 2
select * from crm_configurations where id = 2; # 2
select * from users where team_id = 2; #
select * from playbooks where team_id = 2; # event 38
select * from playbook_categories where playbook_id = 38; #
SELECT * FROM activities WHERE crm_configuration_id = 2 and crm_provider_id is not null order by id desc;
https://app.hubspot.com/contacts/4392066/deal/16964514951/?engagement=96069102624
https://app.staging.jiminny.com/playback/d5df34dc-bd66-4ff5-a7b3-8d3be30322a0
SELECT * FROM activities WHERE uuid_to_bin('04fdcd0d-818f-4c53-92dc-6f18bc753ffd') = uuid;
# 609126 softphone tr. 11241
SELECT * FROM activities WHERE uuid_to_bin('6521bfcd-5a30-46e5-9f74-5440fd48befd') = uuid;
# 608874 conference tr. 11226 crmId: 103422236596
select * from ai_prompts where transcription_id IN (11241, 11226);
select * from activity_summary_logs where activity_id = 608874;
select * from sidekick_settings;
select * from default_activity_types;
select * from crm_field_data where activity_id = 1223;
select * from crm_layouts where crm_configuration_id = 2;
SELECT * FROM crm_layout_entities WHERE crm_layout_id IN (554);
select * from crm_fields where crm_configuration_id = 11 and object_type = 'event';
SELECT * FROM crm_field_values WHERE crm_field_id IN (1455,1450);
SELECT * FROM crm_field_data WHERE crm_layout_entity_id = 971;
SELECT * FROM crm_field_data WHERE crm_layout_entity_id IN (6494,6495,6496,6497,6498,6499);
SELECT
CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,
u.email,
sa.*,
t.owner_id FROM social_accounts sa
JOIN users u
on u.id = sa.sociable_id
JOIN teams t on t.id = u.team_id
WHERE u.team_id = 2 and sa.provider = 'hubspot';
select * from opportunities where team_id = 2
and crm_provider_id IN ('51317301383');
select * from contacts where id = 85;
select * from opportunities where team_id = 2 order by id desc;
select * from opportunities where team_id = 2 and crm_provider_id = '51317301383'; # 5112
select * from opportunities where team_id = 2 and crm_provider_id = '55976759904'; # 5112
select * from opportunity_contacts where opportunity_id = 5117;
select * from crm_field_data where object_id = 1365;
SELECT * FROM crm_fields WHERE id IN (1405, 1407, 1972, 2128);
select * from features;
select * from team_features where team_id IN (1);
select * from team_features where feature_id IN (36);
SHOW CREATE TABLE opportunity_contacts;
SELECT * FROM opportunity_contacts WHERE crm_provider_id = '111751';
# $slug = 'HUBSPOT_WEBHOOK_SYNC';
# $team = Jiminny\Models\Team::find(2);
# $feature = Feature::query()->where('slug', $slug)->first();
# TeamFeature::query()->create(['feature_id' => $feature->getId(),'team_id' => $team->getId()]);
# hubspot_webhook_metrics
select * from opportunities where team_id = 2 and crm_provider_id IN ('374720564','14527423589','49908861993','50435771779'); # 1365
SELECT * FROM opportunity_contacts WHERE opportunity_id = '414';
SELECT * FROM opportunity_contacts WHERE crm_provider_id = '131501';
select * from contacts where id in (414, 464);
select * from activities where crm_configuration_id = 2;
select settings from crm_configurations where id = 11;
select * from teams; # 1, 2
select * from users;
select * from crm_configurations where id = 39;
select * from team_features where team_id = 2;
select * from features;
# SELECT * FROM opportunities WHERE crm_configuration_id = 2
# order by id desc;
# and crm_provider_id = '49908861993';
select * from activity_providers where id IN (443, 202, 203, 227);
select * from activity_imports where id = 795889;
select c.id, c.provider, c.settings, t.* from teams t join crm_configurations c on t.id = c.team_id
where c.provider = 'hubspot';
select * from crm_configurations crm JOIN teams t on crm.team_id = t.id
where provider = 'hubspot';
SELECT * FROM teams WHERE id = 31;
SELECT * FROM users WHERE id = 257;
SELECT * FROM opportunities WHERE team_id = 2;
select * from opportunity_contacts where opportunity_id = 5124;
select * from contacts where id IN (3850,3853,3851,4073,4140,4155,4480,4530,4623,5986,513,687,1806,1523,3613)
select * from activities where crm_configuration_id = 13;
SELECT * FROM activities WHERE uuid_to_bin('826619ce-ec8e-4e59-8467-a01f5f6ad71e') = uuid; # 418141
select id, team_id, crm_provider_id from crm_configurations where provider = 'hubspot' and crm_provider_id IS NOT NULL;
SELECT * FROM accounts WHERE team_id = 2 and crm_provider_id = '1212213464' order by id desc;
SELECT * FROM contacts WHERE team_id = 2 and account_id = 5189 order by id desc;
SELECT * FROM contacts WHERE team_id = 2 order by id desc;
select * from opportunity_contacts where contact_id = 6223;
SELECT * FROM opportunities WHERE team_id = 2 and account_id = 5189 order by id desc;
select * from crm_profiles where crm_configuration_id = 2;
select * from activities where account_id = 46;
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide...
|
NULL
|
|
55723
|
NULL
|
0
|
2026-04-20T10:03:28.486742+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-20/1776 /Users/lukas/.screenpipe/data/data/2026-04-20/1776679408486_m2.jpg...
|
PhpStorm
|
faVsco.js – AskJiminnyReportActivityServiceTest.ph faVsco.js – AskJiminnyReportActivityServiceTest.php...
|
True
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
#11894 on JY-18909-automa Project: faVsco.js, menu
#11894 on JY-18909-automated-reports-ask-jiminny, menu
Start Listening for PHP Debug Connections
AskJiminnyReportActivityServiceTest
Run 'AskJiminnyReportActivityServiceTest'
Debug 'AskJiminnyReportActivityServiceTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
3
3
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Tests\Unit\Services\Kiosk\AutomatedReports;
use Carbon\CarbonImmutable;
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\Services\Kiosk\AutomatedReports\AutomatedReportsService;
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);
}
public static function frequencyDateRangeProvider(): array
{
$now = CarbonImmutable::parse('2025-06-16 12:00:00');
return [
'daily' => [
AutomatedReportsService::FREQUENCY_DAILY,
$now->subDay()->startOfDay()->format('Y-m-d H:i:s'),
$now->subDay()->endOfDay()->format('Y-m-d H:i:s'),
],
'weekly' => [
AutomatedReportsService::FREQUENCY_WEEKLY,
$now->subWeek()->startOfWeek()->format('Y-m-d H:i:s'),
$now->subWeek()->endOfWeek()->format('Y-m-d H:i:s'),
],
'monthly' => [
AutomatedReportsService::FREQUENCY_MONTHLY,
$now->subMonthNoOverflow()->startOfMonth()->format('Y-m-d H:i:s'),
$now->subMonthNoOverflow()->endOfMonth()->format('Y-m-d H:i:s'),
],
'quarterly' => [
AutomatedReportsService::FREQUENCY_QUARTERLY,
$now->subQuarterNoOverflow()->startOfQuarter()->format('Y-m-d H:i:s'),
$now->subQuarterNoOverflow()->endOfQuarter()->format('Y-m-d H:i:s'),
],
];
}
/**
* @dataProvider frequencyDateRangeProvider
*/
public function testGetActivityIdsInjectsDateRangeForFrequency(
string $frequency,
string $expectedStartDate,
string $expectedEndDate,
): void {
CarbonImmutable::setTestNow('2025-06-16 12:00:00');
try {
$user = $this->makeUser();
$savedSearch = $this->makeSavedSearch([]);
$filterSet = $this->createMock(FilterDefinitionCollection::class);
$this->activitySearch->method('getArrayFilterKeys')->willReturn([]);
$this->logger->method('info');
$this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);
$capturedCriteria = null;
$this->activitySearch->expects($this->once())
->method('getOnDemandPageFilterSet')
->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {
$capturedCriteria = $criteria;
return $filterSet;
});
$this->service->getActivityIdsForSavedSearch($savedSearch, $user, $frequency);
$this->assertNotNull($capturedCriteria);
$this->assertSame($expectedStartDate, $capturedCriteria->getStartDate()->format('Y-m-d H:i:s'));
$this->assertSame($expectedEndDate, $capturedCriteria->getEndDate()->format('Y-m-d H:i:s'));
} finally {
CarbonImmutable::setTestNow();
}
}
public function testGetActivityIdsWithNullFrequencyDoesNotInjectDates(): void
{
$user = $this->makeUser();
$savedSearch = $this->makeSavedSearch([]);
$filterSet = $this->createMock(FilterDefinitionCollection::class);
$this->activitySearch->method('getArrayFilterKeys')->willReturn([]);
$this->logger->method('info');
$this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);
$capturedCriteria = null;
$this->activitySearch->expects($this->once())
->method('getOnDemandPageFilterSet')
->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {
$capturedCriteria = $criteria;
return $filterSet;
});
$this->service->getActivityIdsForSavedSearch($savedSearch, $user, null);
$this->assertNotNull($capturedCriteria);
$this->assertNull($capturedCriteria->getStartDate());
$this->assertNull($capturedCriteria->getEndDate());
}
public function testGetActivityIdsWithUnknownFrequencyDoesNotInjectDates(): void
{
$user = $this->makeUser();
$savedSearch = $this->makeSavedSearch([]);
$filterSet = $this->createMock(FilterDefinitionCollection::class);
$this->activitySearch->method('getArrayFilterKeys')->willReturn([]);
$this->logger->method('info');
$this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);
$capturedCriteria = null;
$this->activitySearch->expects($this->once())
->method('getOnDemandPageFilterSet')
->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {
$capturedCriteria = $criteria;
return $filterSet;
});
$this->service->getActivityIdsForSavedSearch($savedSearch, $user, AutomatedReportsService::FREQUENCY_ONE_OFF);
$this->assertNotNull($capturedCriteria);
$this->assertNull($capturedCriteria->getStartDate());
$this->assertNull($capturedCriteria->getEndDate());
}
public function testGetActivityIdsFrequencyDateRangeOverridesSavedSearchDateFilters(): void
{
CarbonImmutable::setTestNow('2025-06-16 12:00:00');
try {
$user = $this->makeUser();
$startDateFilter = $this->makeFilter(ActivityActualDate::PARAM_START_DATE, '2024-01-01 00:00:00');
$endDateFilter = $this->makeFilter(ActivityActualDate::PARAM_END_DATE, '2024-12-31 23:59:59');
$savedSearch = $this->makeSavedSearch([$startDateFilter, $endDateFilter]);
$filterSet = $this->createMock(FilterDefinitionCollection::class);
$this->activitySearch->method('getArrayFilterKeys')->willReturn([]);
$this->logger->method('info');
$this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);
$capturedCriteria = null;
$this->activitySearch->expects($this->once())
->method('getOnDemandPageFilterSet')
->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {
$capturedCriteria = $criteria;
return $filterSet;
});
$this->service->getActivityIdsForSavedSearch($savedSearch, $user, AutomatedReportsService::FREQUENCY_DAILY);
$this->assertNotNull($capturedCriteria);
$this->assertSame('2025-06-15 00:00:00', $capturedCriteria->getStartDate()->format('Y-m-d H:i:s'));
$this->assertSame('2025-06-15 23:59:59', $capturedCriteria->getEndDate()->format('Y-m-d H:i:s'));
} finally {
CarbonImmutable::setTestNow();
}
}
}
Execute
Explain Plan
Browse Query History
View Parameters
Open Query Execution Settings…
In-Editor Results
Tx: Auto
Cancel Running Statements
Playground
jiminny
Sync Changes
Hide This Notification
Code changed:
Hide
27
9
23
3
105
Previous Highlighted Error
Next Highlighted Error
SELECT * FROM team_features where team_id = 1;
SELECT * FROM teams WHERE name LIKE '%Vixio%'; # 340,270,11922
SELECT * FROM users WHERE team_id = 340; # 12015
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 340
and sa.provider = 'salesforce';
# and sa.provider = 'salesloft';
select * from crm_fields where crm_configuration_id = 270 and object_type = 'event';
# 125558 - Event Type - Event_Type__c
# 125552 - Event Status - Event_Status__c
SELECT * FROM sidekick_settings WHERE team_id = 340;
SELECT * FROM crm_field_values WHERE crm_field_id in (125552);
select * from activities where crm_configuration_id = 270
and type = 'conference' and crm_provider_id IS NOT NULL
and actual_start_time > '2024-09-16 09:00:00' order by scheduled_start_time;
SELECT * FROM activities WHERE id = 20871677;
SELECT * FROM crm_field_data WHERE activity_id = 20871677;
select * from crm_layouts where crm_configuration_id = 270;
select * from crm_layout_entities where crm_layout_id in (886,887);
SELECT * FROM crm_configurations WHERE id = 270;
select * from playbooks where team_id = 340; # 1514
select * from groups where team_id = 340;
SELECT * FROM crm_fields WHERE id IN (125393, 125401);
select g.name as 'team name', p.name as 'playbook name', f.label as 'activity type field' from groups g
join playbooks p on g.playbook_id = p.id
join crm_fields f on p.activity_field_id = f.id
where g.team_id = 340;
SELECT * FROM activities WHERE uuid_to_bin('0c180357-67d2-419e-a8c3-b832a3490770') = uuid; # 20448716
select * from crm_field_data where object_id = 20448716;
select * from activities where crm_configuration_id = 270 and provider = 'salesloft' order by id desc;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%CybSafe%'; # 343,273,12008
select * from opportunities where team_id = 343;
select * from opportunities where team_id = 343 and crm_provider_id = '18099102526';
select * from opportunities where team_id = 343 and account_id = 945217482;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 343
and sa.provider = 'hubspot';
select * from accounts where team_id = 343 order by name asc;
select * from stages where crm_configuration_id = 273 and type = 'opportunity';
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Voyado%'; # 353,283,12143
SELECT * FROM activities WHERE crm_configuration_id = 283 and account_id = 3777844 order by id desc;
SELECT * FROM accounts WHERE team_id = 353 AND name LIKE '%Salesloft%';
SELECT * FROM activities WHERE id = 20717903;
select * from participants where activity_id IN (20929172,20928605,20928468,20926272,20926271,20926270,20926269,20916499,20916454,20916436,20916435,20900015,20900014,20900013,20897312,20897243,20897241,20897237,20897232,20897229,20893648,20893231,20893230,20893229,20893228,20889784,20885039,20885038,20885037,20885036,20885035,20882728,20882708,20882703,20882702,20869828,20869811,20869806,20869801,20869799,20869798,20869796,20869795,20869794,20869761,20869760,20869759,20868688,20868687,20850340,20847195,20841710,20833967,20827021,20825307,20825305,20825297,20824615,20824400,20823927,20821760,20795588,20794233,20794057,20793710,20785811,20781789,20781394,20781307,20762651,20758453,20758282,20757323,20756643,20756636,20756629,20756627,20756606,20756605,20756604,20756603,20756602,20756600,20756599,20756598,20756595,20756594,20756589,20756587,20756577,20756573,20748918,20748386,20748385,20748384,20748383,20748382,20748381,20748380,20748379,20748377,20748375,20748373,20743301,20717905,20717904,20717903,20717901,20717899);
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 353
and sa.provider = 'salesforce';
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%modern world business solutions%'; # 345,275,12016, [EMAIL]
SELECT * FROM activities WHERE uuid_to_bin('3921d399-3fef-4609-a291-b0097a166d43') = uuid;
# id: 20940638, user: 12022, contact: 5305871
SELECT * FROM activity_summary_logs WHERE activity_id = 20940638;
select * from contacts where team_id = 345 and crm_provider_id = '30891432415' order by name asc; # 5305871
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 345
and sa.provider = 'hubspot';
select * from users where team_id = 345 and id = 12022;
SELECT * FROM crm_profiles WHERE user_id = 12022;
SELECT * FROM participants WHERE activity_id = 20940638;
SELECT * FROM users u
JOIN crm_profiles cp ON u.id = cp.user_id
WHERE u.team_id = 345;
select * from contacts where team_id = 345 and crm_provider_id = '30880813535' order by name desc; # 5305871
select * from team_features where team_id = 345;
SELECT * FROM activities WHERE uuid_to_bin('11701e2d-2f82-4dab-a616-1db4fad238df') = uuid; # 21115197
SELECT * FROM participants WHERE activity_id = 20897406;
SELECT * FROM activities WHERE uuid_to_bin('63ba55cd-1abc-447d-83da-0137000005b7') = uuid; # 20953912
SELECT * FROM activities WHERE crm_configuration_id = 275 and provider = 'ringcentral' and title like '%1252629100%';
SELECT * FROM activities WHERE id = 20946641;
SELECT * FROM crm_profiles WHERE user_id = 10211;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Lunio%'; # 120,97,10984, [EMAIL]
SELECT * FROM opportunities WHERE crm_configuration_id = 97 and crm_provider_id = '006N1000006c5PpIAI';
select * from stages where crm_configuration_id = 97 and type = 'opportunity';
select * from opportunities where team_id = 120;
select * from crm_configurations crm join teams t on crm.id = t.crm_id
where 1=1
AND t.current_billing_plan IS NOT NULL
AND crm.auto_sync_activity = 0
and crm.provider = 'hubspot';
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Exclaimer%'; # 270,205,10053,[EMAIL]
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 270
and sa.provider = 'salesforce';
SELECT * FROM activities WHERE uuid_to_bin('b54df794-2a9a-4957-8d80-09a600ead5f8') = uuid; # 21637956
SELECT * FROM crm_profiles WHERE user_id = 11446;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Cygnetise%'; # 372,300,12554, [EMAIL]
select * from playbooks where team_id = 372;
select * from crm_fields where crm_configuration_id = 300 and object_type = 'event'; # 141340
SELECT * FROM crm_field_values WHERE crm_field_id = 141340;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 372
and sa.provider = 'salesforce';
select * from crm_profiles where crm_configuration_id = 300;
SELECT * FROM crm_configurations WHERE team_id = 372;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Planday%'; # 291,242,11501,[EMAIL]
SELECT * FROM opportunities WHERE team_id = 291 and crm_provider_id = '006bG000005DO86QAG'; # 3207756
select * from crm_field_data where object_id = 3207756;
SELECT * FROM crm_fields WHERE id = 111834;
select f.id, f.crm_provider_id AS field_name, f.label, fd.object_id AS dealId, fd.value
FROM crm_fields f
JOIN crm_field_data fd ON f.id = fd.crm_field_id
WHERE f.crm_configuration_id = 242
AND f.object_type = 'opportunity'
AND fd.object_id IN (3207756)
ORDER BY fd.object_id, fd.updated_at;
SELECT * FROM crm_configurations WHERE auto_connect = 1;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Tour%'; # 187,209,8150,[EMAIL]
select * from group_deal_risk_types drgt join groups g on drgt.group_id = g.id
where g.team_id = 187;
select * from `groups` where team_id = 187;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 187
and sa.provider = 'salesforce';
# Destination - 98870 - Destination__c
# Stage - 79014 - StageName
# Land Arrangement - 98856 - Land_Arrangement__c
# Flight - 98848 - Flight__c
# Last activity date - 98812 - LastActivityDate
# Last modified date - 98809 - LastModifiedDate
# Last inbound mail timestamp - 99151 - Last_Inbound_Mail_Timestamp__c
# next call - 98864 - Next_Call__c
select * from crm_fields where crm_configuration_id = 209 and object_type = 'opportunity';
SELECT * FROM crm_layouts WHERE crm_configuration_id = 209;
SELECT * FROM crm_layout_entities WHERE crm_layout_id = 682;
select * from opportunities where team_id = 187 and name LIKE'%Muriel Sal%';
select * from opportunities where team_id = 187 and user_id = 9951 and is_closed = 0;
select * from activities where opportunity_id = 3538248;
SELECT * FROM crm_profiles WHERE user_id = 8150;
select * from deal_risks where opportunity_id = 3538248;
select * from teams where crm_id IS NULL;
SELECT opp.id AS opportunity_id,
u.group_id AS group_id,
MAX(
CASE
WHEN a.type IN ("sms-inbound", "sms-outbound") THEN a.created_at
ELSE a.actual_end_time
END) as last_date
FROM opportunities opp
left join activities a on a.opportunity_id = opp.id
inner join users u on opp.user_id = u.id
where opp.user_id IN (9951)
AND opp.is_closed = 0
and a.status IN ('completed', 'received', 'delivered') OR a.status IS NULL
group by opp.id;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Cybsafe%'; # 343,301,12008,[EMAIL]
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 343
and sa.provider = 'hubspot';
SELECT * FROM crm_profiles WHERE crm_configuration_id = 301;
SELECT * FROM contacts WHERE id = 6612363;
SELECT * FROM accounts WHERE id = 4235676;
SELECT * FROM opportunities WHERE crm_configuration_id = 301 and crm_provider_id = 32983784868;
select * from opportunity_stages where opportunity_id = 4503759;
# SELECT * FROM opportunities WHERE id = 4569937;
select * from activities where crm_configuration_id = 301;
SELECT * FROM activities WHERE uuid_to_bin('d3b2b28b-c3d0-4c2d-8ed0-eef42855278a') = uuid; # 26330370
SELECT * FROM participants WHERE activity_id = 26330370;
SELECT * FROM teams WHERE id = 375;
select * from playbooks where team_id = 375;
select * from stages where crm_configuration_id = 301 and type = 'opportunity';
select * from teams;
select * from contact_roles;
SELECT * FROM opportunities WHERE team_id = 343 and user_id = 12871 and close_date >= '2024-11-01';
select * from users u join crm_profiles cp on cp.user_id = u.id where u.team_id = 343;
SELECT * FROM crm_field_data WHERE object_id = 3771706;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 343
and sa.provider = 'hubspot';
SELECT * FROM crm_fields WHERE crm_configuration_id = 301 and object_type = 'opportunity'
and crm_provider_id LIKE "%traffic_light%";
SELECT * FROM crm_field_values WHERE crm_field_id IN (144020,144048,144111,144113,144126,144481,144508,144531);
SELECT fd.* FROM opportunities o
JOIN crm_field_data fd ON o.id = fd.object_id
WHERE o.team_id = 343
# and o.user_id IS NOT NULL
and fd.crm_field_id IN (144020,144048,144111,144113,144126,144481,144508,144531)
and fd.value != ''
order by value desc
# group by o.id
;
SELECT * FROM opportunities WHERE id = 3769843;
SELECT * FROM teams WHERE name LIKE '%Tour%'; # 187,209,8150, [EMAIL]
SELECT * FROM crm_layouts WHERE crm_configuration_id = 209;
SELECT * FROM crm_layout_entities WHERE crm_layout_id = 682;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Funding Circle%'; # 220,177,8603,[EMAIL]
SELECT * FROM activities WHERE uuid_to_bin('7a40e99b-3b37-4bb1-b983-325b81801c01') = uuid; # 23139839
SELECT * FROM opportunities WHERE id = 3855992;
SELECT * FROM users WHERE name LIKE '%Angus Pollard%'; # 8988
SELECT * FROM teams WHERE name LIKE '%Story Terrace%'; # 379, 307, 12894
SELECT * FROM crm_fields WHERE crm_configuration_id = 307 and object_type != 'opportunity';
select * from contacts where team_id = 379 and name like '%bebro%'; # 5874411, crm: 77229348507
SELECT * FROM crm_field_data WHERE object_id = 5874411;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 379
and sa.provider = 'hubspot';
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%mentio%'; # 117, 94, 6371, [EMAIL]
SELECT * FROM activities WHERE uuid_to_bin('82939311-1af0-4506-8546-21e8d1fdf2c1') = uuid;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Tourlane%'; # 187, 209, 8150, [EMAIL]
SELECT * FROM opportunities WHERE team_id = 187 and crm_provider_id = '006Se000008xfvNIAQ'; # 3537793
select * from generic_ai_prompts where subject_id = 3537793;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Lunio%'; # 120, 97, 10984, [EMAIL]
SELECT * FROM crm_configurations WHERE id = 97;
SELECT * FROM crm_layouts WHERE crm_configuration_id = 97;
SELECT * FROM crm_layout_entities WHERE crm_layout_id = 355;
SELECT * FROM crm_fields WHERE id = 32682;
select cfd.value, o.* from opportunities o
join crm_field_data cfd on o.id = cfd.object_id and cfd.crm_field_id = 32682
where team_id = 120
and cfd.value != ''
;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 120
and sa.provider = 'salesforce';
select * from opportunities where team_id = 120 and crm_provider_id = '006N1000007X8MAIA0';
SELECT * FROM crm_field_data WHERE object_id = 2313439;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE id = 410;
SELECT * FROM teams WHERE name LIKE '%Local Business Oxford%';
select * from scorecards where team_id = 410;
select * from scorecard_rules;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Funding%'; # 220, 177, 8603, [EMAIL]
select * from activities a
join opportunities o on a.opportunity_id = o.id
join users u on o.user_id = u.id
where a.crm_configuration_id = 177 and a.type LIKE '%email-out%'
# and a.actual_end_time > '2024-12-16 00:00:00'
# and o.remotely_created_at > '2024-12-01 00:00:00'
# and u.group_id = 1014
and u.id = 9021
order by a.id desc;
SELECT * FROM opportunities WHERE id in (3981384,4017346);
SELECT * FROM users WHERE team_id = 220 and id IN (8775, 11435);
select * from users where id = 9021;
select * from inboxes where user_id = 9021;
select * from inbox_emails where inbox_id = 1349 and email_date > '2024-12-18 00:00:00';
select * from email_messages where team_id = 220
and orig_date > '2024-12-16 00:00:00' and orig_date < '2024-12-19 00:00:00'
and subject LIKE '%Personal%'
# and 'from' = '[EMAIL]'
;
select * from activities a
join opportunities o on a.opportunity_id = o.id
where a.user_id = 9021 and a.type LIKE '%email-out%'
and a.actual_end_time > '2024-12-18 00:00:00'
and o.user_id IS NOT NULL
and o.remotely_created_at > '2024-12-01 00:00:00'
order by a.id desc;
SELECT * FROM opportunities WHERE team_id = 220 and name LIKE '%Right Car move Limited%' and id = 3966852;
select * from activities where crm_configuration_id = 177 and type LIKE '%email%' and opportunity_id = 3966852 order by id desc;
select * from team_settings where name IN ('useCloseDate');
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Hurree%'; # 104, 81, 6175, [EMAIL]
SELECT * FROM opportunities WHERE team_id = 104 and name = 'PropOp';
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 104
and sa.provider = 'hubspot';
select * from crm_configurations where last_synced_at > '2025-01-19 01:00:00'
select * from teams where crm_id IS NULL;
select t.name as 'team', u.name as 'owner', u.email, u.phone
from teams t
join activity_providers ap on t.id = ap.team_id
join users u on t.owner_id = u.id
where 1=1
and t.status = 'active'
and ap.is_enabled = 1
# and u.status = 1
and ap.provider = 'ms-teams';
select * from crm_configurations where provider = 'bullhorn'; # 344
SELECT * FROM teams WHERE id = 442; # 14293
select * from users where team_id = 442;
select * from social_accounts sa where sa.sociable_id = 14293;
select * from invitations where team_id = 442;
# [PASSWORD_DOTS]
SELECT * FROM users WHERE email LIKE '%[EMAIL]%'; # 14022
SELECT * FROM teams WHERE id = 429;
select * from opportunities where team_id = 429 and crm_provider_id IN (16157415775, 22246219645);
select * from activities where opportunity_id in (4340436,4353519);
select * from transcription where activity_id IN (25630961,25381771);
select * from generic_ai_prompts where subject_id IN (4353519);
SELECT
a.id as activity_id,
a.opportunity_id,
a.type as activity_type,
a.language,
CONCAT(a.title, a.description) AS mail_content,
e.from AS mail_from,
e.to AS mail_to,
e.subject AS mail_subject,
e.body AS mail_body,
p.type as prompt_type,
p.status as prompt_status,
p.content AS prompt_content,
a.actual_start_time as created_at
FROM activities a
LEFT JOIN ai_prompts p ON a.transcription_id = p.transcription_id AND p.deleted_at IS NULL
LEFT JOIN email_messages e ON a.id = e.activity_id
WHERE a.actual_start_time > '2024-01-01 00:00:00'
AND a.opportunity_id IN (4353519)
AND a.status IN ('completed', 'received', 'delivered')
AND a.deleted_at IS NULL
AND a.type NOT IN ('sms-inbound', 'sms-outbound')
ORDER BY a.opportunity_id ASC, a.id ASC;
SELECT * FROM users WHERE name LIKE '%George Fierstone%'; # 14293
SELECT * FROM teams WHERE id = 442;
SELECT * FROM crm_configurations WHERE id = 344;
select * from team_features where team_id = 442;
select * from groups where team_id = 442;
select * from playbooks where team_id = 442;
select * from playbook_categories where playbook_id = 1729;
select * from crm_fields where crm_configuration_id = 344 and id = 172024;
SELECT * FROM crm_field_values WHERE crm_field_id = 172024;
select * from crm_layouts where crm_configuration_id = 344;
select * from playbook_layouts where playbook_id = 1729;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Learning%'; # 260, 221, 9444
select s.*
# , s.sent_at, u.name, a.*
from activity_summary_logs s
inner join activities a on a.id = s.activity_id
inner join users u on u.id = a.user_id
where a.crm_configuration_id = 356
and s.sent_at > date_sub(now(), interval 60 day)
order by a.actual_end_time desc;
select * from activities a
# inner join activity_summary_logs s on s.activity_id = a.id
where a.crm_configuration_id = 356 and a.actual_end_time > date_sub(now(), interval 60 day)
# and a.crm_provider_id is not null
# and provider <> 'ringcentral'
and status = 'completed'
order by a.actual_end_time desc;
select * from teams order by id desc; # 17328, 32, 17830, [EMAIL]
SELECT * FROM users;
SELECT * FROM users where team_id = 260 and status = 1; # 201 - 150 active
SELECT * FROM teams WHERE id = 260;
select * from team_settings where team_id = 260;
select * from crm_configurations where team_id = 260;
SELECT * FROM crm_layouts WHERE crm_configuration_id = 356;
SELECT * FROM crm_layout_entities WHERE crm_layout_id = 1184;
select * from accounts where crm_configuration_id = 221 order by id desc; # 7000
select * from leads where crm_configuration_id = 221 order by id desc; # 0
select * from contacts where crm_configuration_id = 221 order by id desc; # 200 000
select * from opportunities where crm_configuration_id = 221 order by id desc; # 0
select * from crm_profiles where crm_configuration_id = 221 order by id desc; # 23
select * from crm_fields where crm_configuration_id = 221;
select * from crm_field_values where crm_field_id = 5302 order by id desc;
select * from crm_layouts where crm_configuration_id = 221 order by id desc;
select * from stages where crm_configuration_id = 221 order by id desc;
select * from accounts where crm_configuration_id = 356 order by id desc; # 7000
select * from leads where crm_configuration_id = 356 order by id desc; # 0
select * from contacts where crm_configuration_id = 356 order by id desc; # 200 000
select * from opportunities where crm_configuration_id = 356 order by id desc; # 0
select * from crm_profiles where crm_configuration_id = 356 order by id desc; # 23
select * from crm_fields where crm_configuration_id = 356;
select * from crm_field_values where crm_field_id = 5302 order by id desc;
select * from crm_layouts where crm_configuration_id = 356 order by id desc;
select * from stages where crm_configuration_id = 356 order by id desc;
select * from playbooks where team_id = 260 order by id desc; # 4 (2 deleted)
select * from groups where team_id = 260 order by id desc; # 27 groups, (2 deleted)
select * from playbook_layouts where playbook_id IN (1410,1409,1276,1254); # 4
select ce.* from calendars c
join users u on c.user_id = u.id
join calendar_events ce on c.id = ce.calendar_id
where u.team_id = 260
and (ce.start_time > '2025-02-21 00:00:00')
;
# calendar events 1207
#
select * from opportunities where team_id = 260;
SELECT * FROM crm_field_data WHERE object_id = 4696496;
select * from activities where crm_configuration_id = 356 and crm_provider_id IS NOT NULL;
select * from activities where crm_configuration_id IN (221) and provider NOT IN ('ms-teams', 'uploader', 'zoom-bot')
# and type = 'conference' and status = 'scheduled' and activities.is_internal = 0
and created_at > '2024-03-01 00:00:00'
order by id desc; # 880 000, ringcentral, avaya
SELECT * FROM participants WHERE activity_id = 26371744;
# all activities 942 000 +
# conference 7385 - scheduled 984 - external 343
select * from activities where id = 26321812;
select * from participants where activity_id = 26321812;
select * from participants where activity_id in (26414510,26414514,26414516,26414604,26414653,26414655);
select * from leads where id in (720428,689175,731546,645866,621037);
select * from users where id = 13841;
select * from opportunities where user_id = 9541;
select * from stages where id = 15900;
select * from accounts where
# id IN (4160055,5053725,4965303,4896434)
id in (4584518,3249934,3218025,3891133,3399450,4172999,4485161,3101785,4587203,3070816,2870343,2870341,3563940,4550846,3424464,3249963,2870342)
;
select * from activities where id = 26654935;
SELECT * FROM opportunities WHERE id = 4803458;
SELECT * FROM opportunities where team_id = 260 and user_id = 13841 AND stage_id = 15900;
SELECT id, uuid, provider, type, lead_id, account_id, contact_id, opportunity_id, stage_id, status, recording_state, title, actual_start_time, actual_end_time
FROM activities WHERE user_id = 13841 AND opportunity_id IN (4729783, 4731717, 4731726, 4732064, 4732849, 4803458, 4813213);
SELECT DISTINCT
o.id, o.stage_id, s.name, a.title,
a.*
FROM activities a
# INNER JOIN tracks t ON a.id = t.activity_id
INNER JOIN users u ON a.user_id = u.id
INNER JOIN teams team ON u.team_id = team.id
INNER JOIN groups g ON u.group_id = g.id
INNER JOIN opportunities o ON a.opportunity_id = o.id
INNER JOIN stages s ON o.stage_id = s.id
WHERE
a.crm_configuration_id = 356
AND a.status IN ('completed', 'failed')
AND a.recording_state != 'stopped'
# and a.user_id = 13841
AND u.uuid = uuid_to_bin('6f40e4b8-c340-4059-b4ac-1728e87ea99e')
AND team.uuid = uuid_to_bin('a607fba7-452e-4683-b2af-00d6cb52c93c')
AND g.uuid = uuid_to_bin('b5d69e40-24a0-4c16-810b-5fa462299f94')
AND a.type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')
# AND t.type IN ('audio', 'video')
AND (
(a.actual_start_time BETWEEN '2025-03-13 00:00:00' AND '2025-03-18 07:59:59')
OR
(
a.actual_start_time IS NULL
AND a.type IN ('sms-outbound', 'sms-inbound')
AND a.created_at BETWEEN '2025-03-13 00:00:00' AND '2025-03-18 07:59:59'
)
)
AND (
a.is_private = 0
OR (
a.is_private = 1
AND u.uuid = uuid_to_bin('6f40e4b8-c340-4059-b4ac-1728e87ea99e')
)
)
AND (
# s.id = 15900
s.uuid = uuid_to_bin('04ca1c26-c666-4268-a129-419c0acffd73')
OR s.uuid IS NULL -- Include records without opportunity stage
)
ORDER BY a.actual_end_time DESC;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Lead Forensics%'; # 190, 162, 8474, [EMAIL]
SELECT * FROM users WHERE team_id = 190;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 190
and sa.provider = 'hubspot';
select * from role_user where user_id = 8474;
select * from crm_configurations where provider = 'bullhorn';
SELECT * FROM opportunities WHERE uuid_to_bin('94578249-65ec-4205-90f2-7d1a7d5ab64a') = uuid;
SELECT * FROM users WHERE uuid_to_bin('26dbadeb-926f-4150-b11b-771b9d4c2f9a') = uuid;
SELECT * FROM opportunities WHERE id = 4732493;
select * from activities where opportunity_id = 4732493;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE id = 443; # 358, 14315, [EMAIL]
SELECT * FROM opportunities WHERE team_id = 443;
SELECT a.id, a.type, a.user_id, a.status, a.deleted_at, u.name, u.email, u.team_id as activity_team_id, u.status, u.deleted_at, t.name, t.status, s.team_id as stage_team_id
FROM activities AS a
JOIN stages AS s ON a.stage_id = s.id
JOIN users AS u ON u.id = a.user_id
JOIN teams AS t ON t.id = s.team_id
WHERE u.team_id <> s.team_id and t.id > 135;
SELECT
crm_configuration_id,
crm_provider_id,
COUNT(*) as duplicate_count,
GROUP_CONCAT(id) as stage_ids,
GROUP_CONCAT(name) as stage_names
FROM stages
GROUP BY crm_configuration_id, crm_provider_id
HAVING COUNT(*) > 1
ORDER BY duplicate_count DESC;
select * from stages where id IN (14898,14907);
select * from business_processes;
SELECT *
FROM crm_configurations
WHERE team_id IN (
SELECT team_id
FROM crm_configurations
GROUP BY team_id
HAVING COUNT(*) > 1
)
ORDER BY team_id;
SELECT *
FROM teams
WHERE crm_id IN (
SELECT crm_id
FROM teams
GROUP BY crm_id
HAVING COUNT(*) > 1
)
ORDER BY crm_id;
# [PASSWORD_DOTS]
select * from crm_configurations where provider = 'integration-app';
SELECT * FROM teams WHERE id = 443; # Correre Naturale 358 14315 [EMAIL]
select * from activities where crm_configuration_id = 358 order by actual_end_time desc;
select id, uuid, actual_end_time, crm_provider_id, is_internal, playbook_category_id, type, user_id, lead_id, contact_id, account_id, opportunity_id, status, title from activities where crm_configuration_id = 358 order by actual_end_time desc;
select * from team_features where team_id = 358;
select * from activity_summary_logs;
select * from teams where id = 406;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Sportfive%'; # 267, 202, 14637, [EMAIL]
select * from activities where crm_configuration_id = 202 order by actual_end_time desc;
SELECT * FROM users where id = 14637;
SELECT * FROM teams where id = 267;
SELECT * FROM groups where id = 1118;
select g.name, a.title, uuid_from_bin(a.uuid), a.external_id, a.status, a.recording_state, a.recording_reason_code, a.scheduled_start_time, a.scheduled_end_time, a.actual_start_time, a.actual_end_time from activities a
inner join users u on u.id = a.user_id
inner join groups g on g.id = u.group_id
where a.crm_configuration_id = 202
and a.is_internal = 0
and (a.scheduled_start_time between '2025-03-19 00:00:00' and '2025-03-21 00:00:00')
and a.type = 'conference'
and a.status != 'completed'
and a.external_id is not null
order by a.scheduled_start_time desc;
SELECT * FROM activities
WHERE crm_configuration_id = 202
AND status IN ('completed', 'failed')
AND recording_state != 'stopped'
AND type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')
AND (is_private = 0 OR user_id = 14637)
AND (
(
actual_start_time BETWEEN '2025-03-12 12:00:00' AND '2025-03-24 11:59:59'
) OR (
actual_start_time IS NULL
AND type IN ('sms-outbound', 'sms-inbound')
AND created_at BETWEEN '2025-03-12 12:00:00' AND '2025-03-24 11:59:59'
)
)
AND NOT EXISTS (
SELECT 1
FROM tracks
WHERE
tracks.activity_id = activities.id
AND tracks.type IN ('audio', 'video')
)
ORDER BY actual_end_time DESC;
SELECT DISTINCT
a.*
FROM activities a
INNER JOIN tracks t ON a.id = t.activity_id
INNER JOIN users u ON a.user_id = u.id
INNER JOIN teams team ON u.team_id = team.id
WHERE
a.crm_configuration_id = 202
AND a.status IN ('completed', 'failed')
AND a.recording_state != 'stopped'
# and a.user_id = 14637
AND a.type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')
# AND t.type IN ('audio', 'video')
AND (
(a.actual_start_time BETWEEN '2025-03-12 12:00:00' AND '2025-03-24 11:59:59')
OR
(
a.actual_start_time IS NULL
AND a.type IN ('sms-outbound', 'sms-inbound')
AND a.created_at BETWEEN '2025-03-12 12:00:00' AND '2025-03-24 11:59:59'
)
)
AND (
a.is_private = 0
OR (
a.is_private = 1
AND a.user_id = 14637
)
)
ORDER BY a.actual_end_time DESC
;
SELECT DISTINCT a.*
FROM activities a
INNER JOIN users u ON a.user_id = u.id
INNER JOIN teams t ON u.team_id = t.id
# INNER JOIN tracks tr ON a.id = tr.activity_id
# INNER JOIN groups g ON u.group_id = g.id
WHERE 1=1
AND t.id = 267
# AND t.uuid = uuid_to_bin('aed4927b-f1ea-499e-94c3-83762fd233e8')
AND a.status IN ('completed', 'failed')
AND a.recording_state != 'stopped'
AND a.type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')
# AND tr.type NOT IN ('audio', 'video')
AND (
a.is_private = 0
OR a.user_id = 14637
)
AND (
(a.actual_start_time BETWEEN '2025-03-19 00:00:00' AND '2025-03-21 23:59:59')
OR (
a.actual_start_time IS NULL
AND a.type IN ('sms-outbound', 'sms-inbound')
AND a.created_at BETWEEN '2025-03-19 00:00:00' AND '2025-03-21 23:59:59'
)
)
# and NOT EXISTS (
# SELECT 1
# FROM tracks t
# WHERE t.activity_id = a.id
# AND t.type IN ('audio', 'video')
# )
ORDER BY a.actual_end_time DESC;
SELECT * FROM tracks WHERE activity_id = 26485995;
select a.is_private, a.title, uuid_from_bin(a.uuid), a.external_id, a.status, a.recording_state, a.recording_reason_code, a.scheduled...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"bounds":{"left":0.025930852,"top":0.019952115,"width":0.03856383,"height":0.025538707},"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"#11894 on JY-18909-automated-reports-ask-jiminny, menu","depth":5,"bounds":{"left":0.064494684,"top":0.019952115,"width":0.12134308,"height":0.025538707},"help_text":"Pull request #11894 exists for current branch JY-18909-automated-reports-ask-jiminny","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"bounds":{"left":0.8081782,"top":0.019952115,"width":0.011303191,"height":0.025538707},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"AskJiminnyReportActivityServiceTest","depth":6,"bounds":{"left":0.8234708,"top":0.019952115,"width":0.09208777,"height":0.025538707},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run 'AskJiminnyReportActivityServiceTest'","depth":6,"bounds":{"left":0.9155585,"top":0.019952115,"width":0.011303191,"height":0.025538707},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'AskJiminnyReportActivityServiceTest'","depth":6,"bounds":{"left":0.9268617,"top":0.019952115,"width":0.011303191,"height":0.025538707},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"More Actions","depth":6,"bounds":{"left":0.9381649,"top":0.019952115,"width":0.011303191,"height":0.025538707},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JetBrains AI","depth":5,"bounds":{"left":0.96609044,"top":0.019952115,"width":0.011303191,"height":0.025538707},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Search Everywhere","depth":5,"bounds":{"left":0.9773936,"top":0.019952115,"width":0.011303191,"height":0.025538707},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"IDE and Project Settings","depth":5,"bounds":{"left":0.9886968,"top":0.019952115,"width":0.011303186,"height":0.025538707},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.042220745,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"3","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.007978723,"height":0.0},"role_description":"text"},{"role":"AXStaticText","text":"3","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.007978723,"height":0.0},"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.00731383,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.006981383,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Tests\\Unit\\Services\\Kiosk\\AutomatedReports;\n\nuse Carbon\\CarbonImmutable;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinition\\ActivityActualDate;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinition\\ActivityUpdatedDate;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinition\\DealInsights\\ClosingPeriodFilter;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinitionCollection;\nuse Jiminny\\Component\\ActivitySearch\\Service\\ActivitySearch;\nuse Jiminny\\Models\\Activity\\Search;\nuse Jiminny\\Models\\Activity\\SearchFilter;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Repositories\\ElasticActivityRepository;\nuse Jiminny\\Services\\Kiosk\\AutomatedReports\\AskJiminnyReportActivityService;\nuse Jiminny\\Services\\Kiosk\\AutomatedReports\\AutomatedReportsService;\nuse Jiminny\\VO\\Repository\\OnDemandActivitySearch\\Criteria;\nuse PHPUnit\\Framework\\MockObject\\MockObject;\nuse PHPUnit\\Framework\\TestCase;\nuse Psr\\Log\\LoggerInterface;\n\nclass AskJiminnyReportActivityServiceTest extends TestCase\n{\n private ActivitySearch&MockObject $activitySearch;\n private ElasticActivityRepository&MockObject $elasticRepository;\n private LoggerInterface&MockObject $logger;\n private AskJiminnyReportActivityService $service;\n\n protected function setUp(): void\n {\n $this->activitySearch = $this->createMock(ActivitySearch::class);\n $this->elasticRepository = $this->createMock(ElasticActivityRepository::class);\n $this->logger = $this->createMock(LoggerInterface::class);\n\n $this->service = new AskJiminnyReportActivityService(\n $this->activitySearch,\n $this->elasticRepository,\n $this->logger,\n );\n }\n\n private function makeFilter(string $key, ?string $value): SearchFilter&MockObject\n {\n $filter = $this->createMock(SearchFilter::class);\n $filter->method('getFilterProperty')->willReturn($key);\n $filter->method('getFilterValue')->willReturn($value);\n\n return $filter;\n }\n\n private function makeUser(): User&MockObject\n {\n $tz = new \\DateTimeZone('UTC');\n $user = $this->createMock(User::class);\n $user->method('getTimezone')->willReturn($tz);\n $user->method('getId')->willReturn(1);\n $user->method('getUuid')->willReturn('user-uuid');\n\n return $user;\n }\n\n private function makeSavedSearch(array $filters): Search&MockObject\n {\n $savedSearch = $this->createMock(Search::class);\n $savedSearch->method('getId')->willReturn(42);\n $savedSearch->method('getFilters')->willReturn(new \\Illuminate\\Support\\LazyCollection($filters));\n\n return $savedSearch;\n }\n\n public function testGetActivityIdsForSavedSearchReturnsIds(): void\n {\n $user = $this->makeUser();\n $savedSearch = $this->makeSavedSearch([]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->expects($this->once())\n ->method('getArrayFilterKeys')\n ->with($user)\n ->willReturn([]);\n\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturn($filterSet);\n\n $this->elasticRepository->expects($this->once())\n ->method('onDemandSearchIdsOnly')\n ->willReturn(['id-1', 'id-2', 'id-3']);\n\n $this->logger->expects($this->once())\n ->method('info')\n ->with('[AskJiminnyReport] Fetched activity IDs for saved search');\n\n $result = $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertEquals(['id-1', 'id-2', 'id-3'], $result);\n }\n\n public function testGetActivityIdsForSavedSearchReturnsEmptyWhenNoResults(): void\n {\n $user = $this->makeUser();\n $savedSearch = $this->makeSavedSearch([]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->activitySearch->method('getOnDemandPageFilterSet')->willReturn($filterSet);\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);\n\n $this->logger->expects($this->once())->method('info');\n\n $result = $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertEmpty($result);\n }\n\n public function testGetActivityIdsFiltersOutDateFilters(): void\n {\n $user = $this->makeUser();\n\n $nonDateFilter = $this->makeFilter('owner_id', '123');\n $startDateFilter = $this->makeFilter(ActivityActualDate::PARAM_START_DATE, '2025-01-01 00:00:00');\n $endDateFilter = $this->makeFilter(ActivityActualDate::PARAM_END_DATE, '2025-01-31 23:59:59');\n $updatedFromFilter = $this->makeFilter(ActivityUpdatedDate::PARAM_UPDATED_FROM, '2025-01-01 00:00:00');\n $updatedToFilter = $this->makeFilter(ActivityUpdatedDate::PARAM_UPDATED_TO, '2025-01-31 23:59:59');\n\n $savedSearch = $this->makeSavedSearch([\n $nonDateFilter,\n $startDateFilter,\n $endDateFilter,\n $updatedFromFilter,\n $updatedToFilter,\n ]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n\n $capturedCriteria = null;\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {\n $capturedCriteria = $criteria;\n\n return $filterSet;\n });\n\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);\n $this->logger->method('info');\n\n $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertNotNull($capturedCriteria);\n }\n\n public function testGetActivityIdsFiltersOutClosingPeriodDateFilters(): void\n {\n $user = $this->makeUser();\n\n $closingStartFilter = $this->makeFilter(ClosingPeriodFilter::KEY_START_DATE, '2025-01-01');\n $closingEndFilter = $this->makeFilter(ClosingPeriodFilter::KEY_END_DATE, '2025-03-31');\n $regularFilter = $this->makeFilter('rep_id', '99');\n\n $savedSearch = $this->makeSavedSearch([\n $closingStartFilter,\n $closingEndFilter,\n $regularFilter,\n ]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturn($filterSet);\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn(['id-1']);\n $this->logger->method('info');\n\n $result = $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertEquals(['id-1'], $result);\n }\n\n public function testGetActivityIdsHandlesArrayFilters(): void\n {\n $user = $this->makeUser();\n\n $filter1 = $this->makeFilter('outcome', 'positive');\n $filter2 = $this->makeFilter('outcome', 'negative');\n\n $savedSearch = $this->makeSavedSearch([$filter1, $filter2]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn(['outcome']);\n $this->activitySearch->method('getOnDemandPageFilterSet')->willReturn($filterSet);\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn(['id-1']);\n $this->logger->method('info');\n\n $result = $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertEquals(['id-1'], $result);\n }\n\n public function testGetActivityIdsHandlesScalarFilters(): void\n {\n $user = $this->makeUser();\n\n $filter = $this->makeFilter('direction', 'inbound');\n $savedSearch = $this->makeSavedSearch([$filter]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->activitySearch->method('getOnDemandPageFilterSet')->willReturn($filterSet);\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn(['id-5']);\n $this->logger->method('info');\n\n $result = $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertEquals(['id-5'], $result);\n }\n\n public function testGetActivityIdsPassesNonZeroSequenceNumberToDisableFirstRequestDefaults(): void\n {\n $user = $this->makeUser();\n $savedSearch = $this->makeSavedSearch([]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n\n $capturedCriteria = null;\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {\n $capturedCriteria = $criteria;\n\n return $filterSet;\n });\n\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);\n $this->logger->method('info');\n\n $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertNotNull($capturedCriteria);\n $this->assertFalse($capturedCriteria->isFirstRequest());\n }\n\n public function testGetActivityIdsLogsWithCorrectContext(): void\n {\n $user = $this->makeUser();\n $savedSearch = $this->makeSavedSearch([]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->activitySearch->method('getOnDemandPageFilterSet')->willReturn($filterSet);\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn(['a', 'b']);\n\n $this->logger->expects($this->once())\n ->method('info')\n ->with(\n '[AskJiminnyReport] Fetched activity IDs for saved search',\n $this->callback(fn ($context) => $context['saved_search_id'] === 42\n && $context['user_id'] === 1\n && $context['activity_count'] === 2)\n );\n\n $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n }\n\n public static function frequencyDateRangeProvider(): array\n {\n $now = CarbonImmutable::parse('2025-06-16 12:00:00');\n\n return [\n 'daily' => [\n AutomatedReportsService::FREQUENCY_DAILY,\n $now->subDay()->startOfDay()->format('Y-m-d H:i:s'),\n $now->subDay()->endOfDay()->format('Y-m-d H:i:s'),\n ],\n 'weekly' => [\n AutomatedReportsService::FREQUENCY_WEEKLY,\n $now->subWeek()->startOfWeek()->format('Y-m-d H:i:s'),\n $now->subWeek()->endOfWeek()->format('Y-m-d H:i:s'),\n ],\n 'monthly' => [\n AutomatedReportsService::FREQUENCY_MONTHLY,\n $now->subMonthNoOverflow()->startOfMonth()->format('Y-m-d H:i:s'),\n $now->subMonthNoOverflow()->endOfMonth()->format('Y-m-d H:i:s'),\n ],\n 'quarterly' => [\n AutomatedReportsService::FREQUENCY_QUARTERLY,\n $now->subQuarterNoOverflow()->startOfQuarter()->format('Y-m-d H:i:s'),\n $now->subQuarterNoOverflow()->endOfQuarter()->format('Y-m-d H:i:s'),\n ],\n ];\n }\n\n /**\n * @dataProvider frequencyDateRangeProvider\n */\n public function testGetActivityIdsInjectsDateRangeForFrequency(\n string $frequency,\n string $expectedStartDate,\n string $expectedEndDate,\n ): void {\n CarbonImmutable::setTestNow('2025-06-16 12:00:00');\n\n try {\n $user = $this->makeUser();\n $savedSearch = $this->makeSavedSearch([]);\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->logger->method('info');\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);\n\n $capturedCriteria = null;\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {\n $capturedCriteria = $criteria;\n\n return $filterSet;\n });\n\n $this->service->getActivityIdsForSavedSearch($savedSearch, $user, $frequency);\n\n $this->assertNotNull($capturedCriteria);\n $this->assertSame($expectedStartDate, $capturedCriteria->getStartDate()->format('Y-m-d H:i:s'));\n $this->assertSame($expectedEndDate, $capturedCriteria->getEndDate()->format('Y-m-d H:i:s'));\n } finally {\n CarbonImmutable::setTestNow();\n }\n }\n\n public function testGetActivityIdsWithNullFrequencyDoesNotInjectDates(): void\n {\n $user = $this->makeUser();\n $savedSearch = $this->makeSavedSearch([]);\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->logger->method('info');\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);\n\n $capturedCriteria = null;\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {\n $capturedCriteria = $criteria;\n\n return $filterSet;\n });\n\n $this->service->getActivityIdsForSavedSearch($savedSearch, $user, null);\n\n $this->assertNotNull($capturedCriteria);\n $this->assertNull($capturedCriteria->getStartDate());\n $this->assertNull($capturedCriteria->getEndDate());\n }\n\n public function testGetActivityIdsWithUnknownFrequencyDoesNotInjectDates(): void\n {\n $user = $this->makeUser();\n $savedSearch = $this->makeSavedSearch([]);\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->logger->method('info');\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);\n\n $capturedCriteria = null;\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {\n $capturedCriteria = $criteria;\n\n return $filterSet;\n });\n\n $this->service->getActivityIdsForSavedSearch($savedSearch, $user, AutomatedReportsService::FREQUENCY_ONE_OFF);\n\n $this->assertNotNull($capturedCriteria);\n $this->assertNull($capturedCriteria->getStartDate());\n $this->assertNull($capturedCriteria->getEndDate());\n }\n\n public function testGetActivityIdsFrequencyDateRangeOverridesSavedSearchDateFilters(): void\n {\n CarbonImmutable::setTestNow('2025-06-16 12:00:00');\n\n try {\n $user = $this->makeUser();\n\n $startDateFilter = $this->makeFilter(ActivityActualDate::PARAM_START_DATE, '2024-01-01 00:00:00');\n $endDateFilter = $this->makeFilter(ActivityActualDate::PARAM_END_DATE, '2024-12-31 23:59:59');\n $savedSearch = $this->makeSavedSearch([$startDateFilter, $endDateFilter]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->logger->method('info');\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);\n\n $capturedCriteria = null;\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {\n $capturedCriteria = $criteria;\n\n return $filterSet;\n });\n\n $this->service->getActivityIdsForSavedSearch($savedSearch, $user, AutomatedReportsService::FREQUENCY_DAILY);\n\n $this->assertNotNull($capturedCriteria);\n $this->assertSame('2025-06-15 00:00:00', $capturedCriteria->getStartDate()->format('Y-m-d H:i:s'));\n $this->assertSame('2025-06-15 23:59:59', $capturedCriteria->getEndDate()->format('Y-m-d H:i:s'));\n } finally {\n CarbonImmutable::setTestNow();\n }\n }\n}","depth":4,"value":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Tests\\Unit\\Services\\Kiosk\\AutomatedReports;\n\nuse Carbon\\CarbonImmutable;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinition\\ActivityActualDate;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinition\\ActivityUpdatedDate;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinition\\DealInsights\\ClosingPeriodFilter;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinitionCollection;\nuse Jiminny\\Component\\ActivitySearch\\Service\\ActivitySearch;\nuse Jiminny\\Models\\Activity\\Search;\nuse Jiminny\\Models\\Activity\\SearchFilter;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Repositories\\ElasticActivityRepository;\nuse Jiminny\\Services\\Kiosk\\AutomatedReports\\AskJiminnyReportActivityService;\nuse Jiminny\\Services\\Kiosk\\AutomatedReports\\AutomatedReportsService;\nuse Jiminny\\VO\\Repository\\OnDemandActivitySearch\\Criteria;\nuse PHPUnit\\Framework\\MockObject\\MockObject;\nuse PHPUnit\\Framework\\TestCase;\nuse Psr\\Log\\LoggerInterface;\n\nclass AskJiminnyReportActivityServiceTest extends TestCase\n{\n private ActivitySearch&MockObject $activitySearch;\n private ElasticActivityRepository&MockObject $elasticRepository;\n private LoggerInterface&MockObject $logger;\n private AskJiminnyReportActivityService $service;\n\n protected function setUp(): void\n {\n $this->activitySearch = $this->createMock(ActivitySearch::class);\n $this->elasticRepository = $this->createMock(ElasticActivityRepository::class);\n $this->logger = $this->createMock(LoggerInterface::class);\n\n $this->service = new AskJiminnyReportActivityService(\n $this->activitySearch,\n $this->elasticRepository,\n $this->logger,\n );\n }\n\n private function makeFilter(string $key, ?string $value): SearchFilter&MockObject\n {\n $filter = $this->createMock(SearchFilter::class);\n $filter->method('getFilterProperty')->willReturn($key);\n $filter->method('getFilterValue')->willReturn($value);\n\n return $filter;\n }\n\n private function makeUser(): User&MockObject\n {\n $tz = new \\DateTimeZone('UTC');\n $user = $this->createMock(User::class);\n $user->method('getTimezone')->willReturn($tz);\n $user->method('getId')->willReturn(1);\n $user->method('getUuid')->willReturn('user-uuid');\n\n return $user;\n }\n\n private function makeSavedSearch(array $filters): Search&MockObject\n {\n $savedSearch = $this->createMock(Search::class);\n $savedSearch->method('getId')->willReturn(42);\n $savedSearch->method('getFilters')->willReturn(new \\Illuminate\\Support\\LazyCollection($filters));\n\n return $savedSearch;\n }\n\n public function testGetActivityIdsForSavedSearchReturnsIds(): void\n {\n $user = $this->makeUser();\n $savedSearch = $this->makeSavedSearch([]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->expects($this->once())\n ->method('getArrayFilterKeys')\n ->with($user)\n ->willReturn([]);\n\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturn($filterSet);\n\n $this->elasticRepository->expects($this->once())\n ->method('onDemandSearchIdsOnly')\n ->willReturn(['id-1', 'id-2', 'id-3']);\n\n $this->logger->expects($this->once())\n ->method('info')\n ->with('[AskJiminnyReport] Fetched activity IDs for saved search');\n\n $result = $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertEquals(['id-1', 'id-2', 'id-3'], $result);\n }\n\n public function testGetActivityIdsForSavedSearchReturnsEmptyWhenNoResults(): void\n {\n $user = $this->makeUser();\n $savedSearch = $this->makeSavedSearch([]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->activitySearch->method('getOnDemandPageFilterSet')->willReturn($filterSet);\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);\n\n $this->logger->expects($this->once())->method('info');\n\n $result = $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertEmpty($result);\n }\n\n public function testGetActivityIdsFiltersOutDateFilters(): void\n {\n $user = $this->makeUser();\n\n $nonDateFilter = $this->makeFilter('owner_id', '123');\n $startDateFilter = $this->makeFilter(ActivityActualDate::PARAM_START_DATE, '2025-01-01 00:00:00');\n $endDateFilter = $this->makeFilter(ActivityActualDate::PARAM_END_DATE, '2025-01-31 23:59:59');\n $updatedFromFilter = $this->makeFilter(ActivityUpdatedDate::PARAM_UPDATED_FROM, '2025-01-01 00:00:00');\n $updatedToFilter = $this->makeFilter(ActivityUpdatedDate::PARAM_UPDATED_TO, '2025-01-31 23:59:59');\n\n $savedSearch = $this->makeSavedSearch([\n $nonDateFilter,\n $startDateFilter,\n $endDateFilter,\n $updatedFromFilter,\n $updatedToFilter,\n ]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n\n $capturedCriteria = null;\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {\n $capturedCriteria = $criteria;\n\n return $filterSet;\n });\n\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);\n $this->logger->method('info');\n\n $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertNotNull($capturedCriteria);\n }\n\n public function testGetActivityIdsFiltersOutClosingPeriodDateFilters(): void\n {\n $user = $this->makeUser();\n\n $closingStartFilter = $this->makeFilter(ClosingPeriodFilter::KEY_START_DATE, '2025-01-01');\n $closingEndFilter = $this->makeFilter(ClosingPeriodFilter::KEY_END_DATE, '2025-03-31');\n $regularFilter = $this->makeFilter('rep_id', '99');\n\n $savedSearch = $this->makeSavedSearch([\n $closingStartFilter,\n $closingEndFilter,\n $regularFilter,\n ]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturn($filterSet);\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn(['id-1']);\n $this->logger->method('info');\n\n $result = $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertEquals(['id-1'], $result);\n }\n\n public function testGetActivityIdsHandlesArrayFilters(): void\n {\n $user = $this->makeUser();\n\n $filter1 = $this->makeFilter('outcome', 'positive');\n $filter2 = $this->makeFilter('outcome', 'negative');\n\n $savedSearch = $this->makeSavedSearch([$filter1, $filter2]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn(['outcome']);\n $this->activitySearch->method('getOnDemandPageFilterSet')->willReturn($filterSet);\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn(['id-1']);\n $this->logger->method('info');\n\n $result = $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertEquals(['id-1'], $result);\n }\n\n public function testGetActivityIdsHandlesScalarFilters(): void\n {\n $user = $this->makeUser();\n\n $filter = $this->makeFilter('direction', 'inbound');\n $savedSearch = $this->makeSavedSearch([$filter]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->activitySearch->method('getOnDemandPageFilterSet')->willReturn($filterSet);\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn(['id-5']);\n $this->logger->method('info');\n\n $result = $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertEquals(['id-5'], $result);\n }\n\n public function testGetActivityIdsPassesNonZeroSequenceNumberToDisableFirstRequestDefaults(): void\n {\n $user = $this->makeUser();\n $savedSearch = $this->makeSavedSearch([]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n\n $capturedCriteria = null;\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {\n $capturedCriteria = $criteria;\n\n return $filterSet;\n });\n\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);\n $this->logger->method('info');\n\n $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertNotNull($capturedCriteria);\n $this->assertFalse($capturedCriteria->isFirstRequest());\n }\n\n public function testGetActivityIdsLogsWithCorrectContext(): void\n {\n $user = $this->makeUser();\n $savedSearch = $this->makeSavedSearch([]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->activitySearch->method('getOnDemandPageFilterSet')->willReturn($filterSet);\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn(['a', 'b']);\n\n $this->logger->expects($this->once())\n ->method('info')\n ->with(\n '[AskJiminnyReport] Fetched activity IDs for saved search',\n $this->callback(fn ($context) => $context['saved_search_id'] === 42\n && $context['user_id'] === 1\n && $context['activity_count'] === 2)\n );\n\n $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n }\n\n public static function frequencyDateRangeProvider(): array\n {\n $now = CarbonImmutable::parse('2025-06-16 12:00:00');\n\n return [\n 'daily' => [\n AutomatedReportsService::FREQUENCY_DAILY,\n $now->subDay()->startOfDay()->format('Y-m-d H:i:s'),\n $now->subDay()->endOfDay()->format('Y-m-d H:i:s'),\n ],\n 'weekly' => [\n AutomatedReportsService::FREQUENCY_WEEKLY,\n $now->subWeek()->startOfWeek()->format('Y-m-d H:i:s'),\n $now->subWeek()->endOfWeek()->format('Y-m-d H:i:s'),\n ],\n 'monthly' => [\n AutomatedReportsService::FREQUENCY_MONTHLY,\n $now->subMonthNoOverflow()->startOfMonth()->format('Y-m-d H:i:s'),\n $now->subMonthNoOverflow()->endOfMonth()->format('Y-m-d H:i:s'),\n ],\n 'quarterly' => [\n AutomatedReportsService::FREQUENCY_QUARTERLY,\n $now->subQuarterNoOverflow()->startOfQuarter()->format('Y-m-d H:i:s'),\n $now->subQuarterNoOverflow()->endOfQuarter()->format('Y-m-d H:i:s'),\n ],\n ];\n }\n\n /**\n * @dataProvider frequencyDateRangeProvider\n */\n public function testGetActivityIdsInjectsDateRangeForFrequency(\n string $frequency,\n string $expectedStartDate,\n string $expectedEndDate,\n ): void {\n CarbonImmutable::setTestNow('2025-06-16 12:00:00');\n\n try {\n $user = $this->makeUser();\n $savedSearch = $this->makeSavedSearch([]);\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->logger->method('info');\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);\n\n $capturedCriteria = null;\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {\n $capturedCriteria = $criteria;\n\n return $filterSet;\n });\n\n $this->service->getActivityIdsForSavedSearch($savedSearch, $user, $frequency);\n\n $this->assertNotNull($capturedCriteria);\n $this->assertSame($expectedStartDate, $capturedCriteria->getStartDate()->format('Y-m-d H:i:s'));\n $this->assertSame($expectedEndDate, $capturedCriteria->getEndDate()->format('Y-m-d H:i:s'));\n } finally {\n CarbonImmutable::setTestNow();\n }\n }\n\n public function testGetActivityIdsWithNullFrequencyDoesNotInjectDates(): void\n {\n $user = $this->makeUser();\n $savedSearch = $this->makeSavedSearch([]);\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->logger->method('info');\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);\n\n $capturedCriteria = null;\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {\n $capturedCriteria = $criteria;\n\n return $filterSet;\n });\n\n $this->service->getActivityIdsForSavedSearch($savedSearch, $user, null);\n\n $this->assertNotNull($capturedCriteria);\n $this->assertNull($capturedCriteria->getStartDate());\n $this->assertNull($capturedCriteria->getEndDate());\n }\n\n public function testGetActivityIdsWithUnknownFrequencyDoesNotInjectDates(): void\n {\n $user = $this->makeUser();\n $savedSearch = $this->makeSavedSearch([]);\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->logger->method('info');\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);\n\n $capturedCriteria = null;\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {\n $capturedCriteria = $criteria;\n\n return $filterSet;\n });\n\n $this->service->getActivityIdsForSavedSearch($savedSearch, $user, AutomatedReportsService::FREQUENCY_ONE_OFF);\n\n $this->assertNotNull($capturedCriteria);\n $this->assertNull($capturedCriteria->getStartDate());\n $this->assertNull($capturedCriteria->getEndDate());\n }\n\n public function testGetActivityIdsFrequencyDateRangeOverridesSavedSearchDateFilters(): void\n {\n CarbonImmutable::setTestNow('2025-06-16 12:00:00');\n\n try {\n $user = $this->makeUser();\n\n $startDateFilter = $this->makeFilter(ActivityActualDate::PARAM_START_DATE, '2024-01-01 00:00:00');\n $endDateFilter = $this->makeFilter(ActivityActualDate::PARAM_END_DATE, '2024-12-31 23:59:59');\n $savedSearch = $this->makeSavedSearch([$startDateFilter, $endDateFilter]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->logger->method('info');\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);\n\n $capturedCriteria = null;\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {\n $capturedCriteria = $criteria;\n\n return $filterSet;\n });\n\n $this->service->getActivityIdsForSavedSearch($savedSearch, $user, AutomatedReportsService::FREQUENCY_DAILY);\n\n $this->assertNotNull($capturedCriteria);\n $this->assertSame('2025-06-15 00:00:00', $capturedCriteria->getStartDate()->format('Y-m-d H:i:s'));\n $this->assertSame('2025-06-15 23:59:59', $capturedCriteria->getEndDate()->format('Y-m-d H:i:s'));\n } finally {\n CarbonImmutable::setTestNow();\n }\n }\n}","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Execute","depth":4,"bounds":{"left":0.40492022,"top":0.09896249,"width":0.008643617,"height":0.01915403},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Explain Plan","depth":4,"bounds":{"left":0.41356382,"top":0.09896249,"width":0.008643617,"height":0.01915403},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Browse Query History","depth":4,"bounds":{"left":0.4245346,"top":0.09896249,"width":0.008643617,"height":0.01915403},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"View Parameters","depth":4,"bounds":{"left":0.4331782,"top":0.09896249,"width":0.008643617,"height":0.01915403},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Open Query Execution Settings…","depth":4,"bounds":{"left":0.4418218,"top":0.09896249,"width":0.008643617,"height":0.01915403},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"In-Editor Results","depth":4,"bounds":{"left":0.45279256,"top":0.09896249,"width":0.008643617,"height":0.01915403},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Tx: Auto","depth":4,"bounds":{"left":0.4637633,"top":0.09896249,"width":0.024268618,"height":0.01915403},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Cancel Running Statements","depth":4,"bounds":{"left":0.49035904,"top":0.09896249,"width":0.008643617,"height":0.01915403},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Playground","depth":4,"bounds":{"left":0.5013298,"top":0.09896249,"width":0.029587766,"height":0.01915403},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"jiminny","depth":4,"bounds":{"left":0.69913566,"top":0.09896249,"width":0.02825798,"height":0.01915403},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.042220745,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"27","depth":4,"bounds":{"left":0.6565825,"top":0.123703115,"width":0.009973404,"height":0.015163607},"role_description":"text"},{"role":"AXStaticText","text":"9","depth":4,"bounds":{"left":0.66855055,"top":0.123703115,"width":0.007978723,"height":0.015163607},"role_description":"text"},{"role":"AXStaticText","text":"23","depth":4,"bounds":{"left":0.67852396,"top":0.123703115,"width":0.010305851,"height":0.015163607},"role_description":"text"},{"role":"AXStaticText","text":"3","depth":4,"bounds":{"left":0.69082445,"top":0.123703115,"width":0.007978723,"height":0.015163607},"role_description":"text"},{"role":"AXStaticText","text":"105","depth":4,"bounds":{"left":0.70079786,"top":0.123703115,"width":0.011968086,"height":0.015163607},"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.7144282,"top":0.12210695,"width":0.00731383,"height":0.018355945},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"bounds":{"left":0.72174203,"top":0.12210695,"width":0.006981383,"height":0.018355945},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"SELECT * FROM team_features where team_id = 1;\n\nSELECT * FROM teams WHERE name LIKE '%Vixio%'; # 340,270,11922\nSELECT * FROM users WHERE team_id = 340; # 12015\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 340\nand sa.provider = 'salesforce';\n# and sa.provider = 'salesloft';\n\nselect * from crm_fields where crm_configuration_id = 270 and object_type = 'event';\n# 125558 - Event Type - Event_Type__c\n# 125552 - Event Status - Event_Status__c\n\nSELECT * FROM sidekick_settings WHERE team_id = 340;\n\nSELECT * FROM crm_field_values WHERE crm_field_id in (125552);\n\nselect * from activities where crm_configuration_id = 270\nand type = 'conference' and crm_provider_id IS NOT NULL\nand actual_start_time > '2024-09-16 09:00:00' order by scheduled_start_time;\n\nSELECT * FROM activities WHERE id = 20871677;\nSELECT * FROM crm_field_data WHERE activity_id = 20871677;\n\nselect * from crm_layouts where crm_configuration_id = 270;\nselect * from crm_layout_entities where crm_layout_id in (886,887);\n\nSELECT * FROM crm_configurations WHERE id = 270;\n\nselect * from playbooks where team_id = 340; # 1514\nselect * from groups where team_id = 340;\nSELECT * FROM crm_fields WHERE id IN (125393, 125401);\n\nselect g.name as 'team name', p.name as 'playbook name', f.label as 'activity type field' from groups g\njoin playbooks p on g.playbook_id = p.id\njoin crm_fields f on p.activity_field_id = f.id\nwhere g.team_id = 340;\n\nSELECT * FROM activities WHERE uuid_to_bin('0c180357-67d2-419e-a8c3-b832a3490770') = uuid; # 20448716\nselect * from crm_field_data where object_id = 20448716;\n\nselect * from activities where crm_configuration_id = 270 and provider = 'salesloft' order by id desc;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%CybSafe%'; # 343,273,12008\nselect * from opportunities where team_id = 343;\nselect * from opportunities where team_id = 343 and crm_provider_id = '18099102526';\nselect * from opportunities where team_id = 343 and account_id = 945217482;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 343\nand sa.provider = 'hubspot';\n\nselect * from accounts where team_id = 343 order by name asc;\n\nselect * from stages where crm_configuration_id = 273 and type = 'opportunity';\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Voyado%'; # 353,283,12143\nSELECT * FROM activities WHERE crm_configuration_id = 283 and account_id = 3777844 order by id desc;\nSELECT * FROM accounts WHERE team_id = 353 AND name LIKE '%Salesloft%';\nSELECT * FROM activities WHERE id = 20717903;\n\nselect * from participants where activity_id IN (20929172,20928605,20928468,20926272,20926271,20926270,20926269,20916499,20916454,20916436,20916435,20900015,20900014,20900013,20897312,20897243,20897241,20897237,20897232,20897229,20893648,20893231,20893230,20893229,20893228,20889784,20885039,20885038,20885037,20885036,20885035,20882728,20882708,20882703,20882702,20869828,20869811,20869806,20869801,20869799,20869798,20869796,20869795,20869794,20869761,20869760,20869759,20868688,20868687,20850340,20847195,20841710,20833967,20827021,20825307,20825305,20825297,20824615,20824400,20823927,20821760,20795588,20794233,20794057,20793710,20785811,20781789,20781394,20781307,20762651,20758453,20758282,20757323,20756643,20756636,20756629,20756627,20756606,20756605,20756604,20756603,20756602,20756600,20756599,20756598,20756595,20756594,20756589,20756587,20756577,20756573,20748918,20748386,20748385,20748384,20748383,20748382,20748381,20748380,20748379,20748377,20748375,20748373,20743301,20717905,20717904,20717903,20717901,20717899);\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 353\nand sa.provider = 'salesforce';\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%modern world business solutions%'; # 345,275,12016, l.atkinson@mwbsolutions.co.uk\nSELECT * FROM activities WHERE uuid_to_bin('3921d399-3fef-4609-a291-b0097a166d43') = uuid;\n# id: 20940638, user: 12022, contact: 5305871\nSELECT * FROM activity_summary_logs WHERE activity_id = 20940638;\nselect * from contacts where team_id = 345 and crm_provider_id = '30891432415' order by name asc; # 5305871\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 345\nand sa.provider = 'hubspot';\n\nselect * from users where team_id = 345 and id = 12022;\nSELECT * FROM crm_profiles WHERE user_id = 12022;\nSELECT * FROM participants WHERE activity_id = 20940638;\nSELECT * FROM users u\nJOIN crm_profiles cp ON u.id = cp.user_id\nWHERE u.team_id = 345;\n\nselect * from contacts where team_id = 345 and crm_provider_id = '30880813535' order by name desc; # 5305871\n\nselect * from team_features where team_id = 345;\nSELECT * FROM activities WHERE uuid_to_bin('11701e2d-2f82-4dab-a616-1db4fad238df') = uuid; # 21115197\nSELECT * FROM participants WHERE activity_id = 20897406;\n\n\n\nSELECT * FROM activities WHERE uuid_to_bin('63ba55cd-1abc-447d-83da-0137000005b7') = uuid; # 20953912\nSELECT * FROM activities WHERE crm_configuration_id = 275 and provider = 'ringcentral' and title like '%1252629100%';\n\n\nSELECT * FROM activities WHERE id = 20946641;\nSELECT * FROM crm_profiles WHERE user_id = 10211;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Lunio%'; # 120,97,10984, triger@lunio.ai\nSELECT * FROM opportunities WHERE crm_configuration_id = 97 and crm_provider_id = '006N1000006c5PpIAI';\nselect * from stages where crm_configuration_id = 97 and type = 'opportunity';\nselect * from opportunities where team_id = 120;\n\n\nselect * from crm_configurations crm join teams t on crm.id = t.crm_id\nwhere 1=1\nAND t.current_billing_plan IS NOT NULL\nAND crm.auto_sync_activity = 0\nand crm.provider = 'hubspot';\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Exclaimer%'; # 270,205,10053,james.lewendon@exclaimer.com\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 270\nand sa.provider = 'salesforce';\nSELECT * FROM activities WHERE uuid_to_bin('b54df794-2a9a-4957-8d80-09a600ead5f8') = uuid; # 21637956\nSELECT * FROM crm_profiles WHERE user_id = 11446;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Cygnetise%'; # 372,300,12554, alex.chikly@cygnetise.com\nselect * from playbooks where team_id = 372;\nselect * from crm_fields where crm_configuration_id = 300 and object_type = 'event'; # 141340\nSELECT * FROM crm_field_values WHERE crm_field_id = 141340;\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 372\nand sa.provider = 'salesforce';\n\nselect * from crm_profiles where crm_configuration_id = 300;\nSELECT * FROM crm_configurations WHERE team_id = 372;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Planday%'; # 291,242,11501,mfa@planday.com\nSELECT * FROM opportunities WHERE team_id = 291 and crm_provider_id = '006bG000005DO86QAG'; # 3207756\nselect * from crm_field_data where object_id = 3207756;\nSELECT * FROM crm_fields WHERE id = 111834;\n\nselect f.id, f.crm_provider_id AS field_name, f.label, fd.object_id AS dealId, fd.value\nFROM crm_fields f\nJOIN crm_field_data fd ON f.id = fd.crm_field_id\nWHERE f.crm_configuration_id = 242\nAND f.object_type = 'opportunity'\nAND fd.object_id IN (3207756)\nORDER BY fd.object_id, fd.updated_at;\n\nSELECT * FROM crm_configurations WHERE auto_connect = 1;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Tour%'; # 187,209,8150,salesforce-admin@tourlane.com\nselect * from group_deal_risk_types drgt join groups g on drgt.group_id = g.id\nwhere g.team_id = 187;\n\nselect * from `groups` where team_id = 187;\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 187\nand sa.provider = 'salesforce';\n\n# Destination - 98870 - Destination__c\n# Stage - 79014 - StageName\n# Land Arrangement - 98856 - Land_Arrangement__c\n# Flight - 98848 - Flight__c\n# Last activity date - 98812 - LastActivityDate\n# Last modified date - 98809 - LastModifiedDate\n# Last inbound mail timestamp - 99151 - Last_Inbound_Mail_Timestamp__c\n# next call - 98864 - Next_Call__c\n\nselect * from crm_fields where crm_configuration_id = 209 and object_type = 'opportunity';\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 209;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 682;\n\nselect * from opportunities where team_id = 187 and name LIKE'%Muriel Sal%';\nselect * from opportunities where team_id = 187 and user_id = 9951 and is_closed = 0;\nselect * from activities where opportunity_id = 3538248;\n\nSELECT * FROM crm_profiles WHERE user_id = 8150;\n\nselect * from deal_risks where opportunity_id = 3538248;\n\nselect * from teams where crm_id IS NULL;\n\nSELECT opp.id AS opportunity_id,\n u.group_id AS group_id,\n MAX(\n CASE\n WHEN a.type IN (\"sms-inbound\", \"sms-outbound\") THEN a.created_at\n ELSE a.actual_end_time\n END) as last_date\nFROM opportunities opp\nleft join activities a on a.opportunity_id = opp.id\ninner join users u on opp.user_id = u.id\nwhere opp.user_id IN (9951)\n\nAND opp.is_closed = 0\nand a.status IN ('completed', 'received', 'delivered') OR a.status IS NULL\ngroup by opp.id;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Cybsafe%'; # 343,301,12008,polly.morphew@cybsafe.com\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 343\nand sa.provider = 'hubspot';\n\nSELECT * FROM crm_profiles WHERE crm_configuration_id = 301;\nSELECT * FROM contacts WHERE id = 6612363;\nSELECT * FROM accounts WHERE id = 4235676;\nSELECT * FROM opportunities WHERE crm_configuration_id = 301 and crm_provider_id = 32983784868;\nselect * from opportunity_stages where opportunity_id = 4503759;\n# SELECT * FROM opportunities WHERE id = 4569937;\n\nselect * from activities where crm_configuration_id = 301;\nSELECT * FROM activities WHERE uuid_to_bin('d3b2b28b-c3d0-4c2d-8ed0-eef42855278a') = uuid; # 26330370\nSELECT * FROM participants WHERE activity_id = 26330370;\n\nSELECT * FROM teams WHERE id = 375;\nselect * from playbooks where team_id = 375;\n\nselect * from stages where crm_configuration_id = 301 and type = 'opportunity';\n\nselect * from teams;\nselect * from contact_roles;\n\nSELECT * FROM opportunities WHERE team_id = 343 and user_id = 12871 and close_date >= '2024-11-01';\n\nselect * from users u join crm_profiles cp on cp.user_id = u.id where u.team_id = 343;\n\nSELECT * FROM crm_field_data WHERE object_id = 3771706;\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 343\nand sa.provider = 'hubspot';\n\nSELECT * FROM crm_fields WHERE crm_configuration_id = 301 and object_type = 'opportunity'\nand crm_provider_id LIKE \"%traffic_light%\";\nSELECT * FROM crm_field_values WHERE crm_field_id IN (144020,144048,144111,144113,144126,144481,144508,144531);\n\nSELECT fd.* FROM opportunities o\nJOIN crm_field_data fd ON o.id = fd.object_id\nWHERE o.team_id = 343\n# and o.user_id IS NOT NULL\nand fd.crm_field_id IN (144020,144048,144111,144113,144126,144481,144508,144531)\nand fd.value != ''\norder by value desc\n# group by o.id\n;\n\nSELECT * FROM opportunities WHERE id = 3769843;\n\nSELECT * FROM teams WHERE name LIKE '%Tour%'; # 187,209,8150, salesforce-admin@tourlane.com\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 209;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 682;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Funding Circle%'; # 220,177,8603,aswini.mishra@fundingcircle.com\nSELECT * FROM activities WHERE uuid_to_bin('7a40e99b-3b37-4bb1-b983-325b81801c01') = uuid; # 23139839\n\n\nSELECT * FROM opportunities WHERE id = 3855992;\n\nSELECT * FROM users WHERE name LIKE '%Angus Pollard%'; # 8988\n\nSELECT * FROM teams WHERE name LIKE '%Story Terrace%'; # 379, 307, 12894\nSELECT * FROM crm_fields WHERE crm_configuration_id = 307 and object_type != 'opportunity';\n\nselect * from contacts where team_id = 379 and name like '%bebro%'; # 5874411, crm: 77229348507\nSELECT * FROM crm_field_data WHERE object_id = 5874411;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 379\nand sa.provider = 'hubspot';\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%mentio%'; # 117, 94, 6371, nikhil.kumar@mention-me.com\nSELECT * FROM activities WHERE uuid_to_bin('82939311-1af0-4506-8546-21e8d1fdf2c1') = uuid;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Tourlane%'; # 187, 209, 8150, salesforce-admin@tourlane.com\nSELECT * FROM opportunities WHERE team_id = 187 and crm_provider_id = '006Se000008xfvNIAQ'; # 3537793\nselect * from generic_ai_prompts where subject_id = 3537793;\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Lunio%'; # 120, 97, 10984, triger@lunio.ai\nSELECT * FROM crm_configurations WHERE id = 97;\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 97;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 355;\nSELECT * FROM crm_fields WHERE id = 32682;\n\nselect cfd.value, o.* from opportunities o\njoin crm_field_data cfd on o.id = cfd.object_id and cfd.crm_field_id = 32682\nwhere team_id = 120\nand cfd.value != ''\n;\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 120\nand sa.provider = 'salesforce';\n\nselect * from opportunities where team_id = 120 and crm_provider_id = '006N1000007X8MAIA0';\nSELECT * FROM crm_field_data WHERE object_id = 2313439;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE id = 410;\nSELECT * FROM teams WHERE name LIKE '%Local Business Oxford%';\nselect * from scorecards where team_id = 410;\nselect * from scorecard_rules;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Funding%'; # 220, 177, 8603, aswini.mishra@fundingcircle.com\nselect * from activities a\njoin opportunities o on a.opportunity_id = o.id\njoin users u on o.user_id = u.id\nwhere a.crm_configuration_id = 177 and a.type LIKE '%email-out%'\n# and a.actual_end_time > '2024-12-16 00:00:00'\n# and o.remotely_created_at > '2024-12-01 00:00:00'\n# and u.group_id = 1014\nand u.id = 9021\norder by a.id desc;\nSELECT * FROM opportunities WHERE id in (3981384,4017346);\nSELECT * FROM users WHERE team_id = 220 and id IN (8775, 11435);\n\nselect * from users where id = 9021;\nselect * from inboxes where user_id = 9021;\n\nselect * from inbox_emails where inbox_id = 1349 and email_date > '2024-12-18 00:00:00';\n\nselect * from email_messages where team_id = 220\nand orig_date > '2024-12-16 00:00:00' and orig_date < '2024-12-19 00:00:00'\nand subject LIKE '%Personal%'\n# and 'from' = 'credit@fundingcircle.com'\n;\n\nselect * from activities a\njoin opportunities o on a.opportunity_id = o.id\nwhere a.user_id = 9021 and a.type LIKE '%email-out%'\nand a.actual_end_time > '2024-12-18 00:00:00'\nand o.user_id IS NOT NULL\nand o.remotely_created_at > '2024-12-01 00:00:00'\norder by a.id desc;\n\nSELECT * FROM opportunities WHERE team_id = 220 and name LIKE '%Right Car move Limited%' and id = 3966852;\nselect * from activities where crm_configuration_id = 177 and type LIKE '%email%' and opportunity_id = 3966852 order by id desc;\n\nselect * from team_settings where name IN ('useCloseDate');\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Hurree%'; # 104, 81, 6175, jfarrell@hurree.co\nSELECT * FROM opportunities WHERE team_id = 104 and name = 'PropOp';\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 104\nand sa.provider = 'hubspot';\n\nselect * from crm_configurations where last_synced_at > '2025-01-19 01:00:00'\nselect * from teams where crm_id IS NULL;\n\nselect t.name as 'team', u.name as 'owner', u.email, u.phone\nfrom teams t\njoin activity_providers ap on t.id = ap.team_id\njoin users u on t.owner_id = u.id\nwhere 1=1\n and t.status = 'active'\n and ap.is_enabled = 1\n# and u.status = 1\n and ap.provider = 'ms-teams';\n\nselect * from crm_configurations where provider = 'bullhorn'; # 344\nSELECT * FROM teams WHERE id = 442; # 14293\nselect * from users where team_id = 442;\nselect * from social_accounts sa where sa.sociable_id = 14293;\nselect * from invitations where team_id = 442;\n\n# ********************************************************************************************************\nSELECT * FROM users WHERE email LIKE '%nea.liikamaa@eletive.com%'; # 14022\nSELECT * FROM teams WHERE id = 429;\nselect * from opportunities where team_id = 429 and crm_provider_id IN (16157415775, 22246219645);\nselect * from activities where opportunity_id in (4340436,4353519);\n\nselect * from transcription where activity_id IN (25630961,25381771);\nselect * from generic_ai_prompts where subject_id IN (4353519);\n\nSELECT\n a.id as activity_id,\n a.opportunity_id,\n a.type as activity_type,\n a.language,\n CONCAT(a.title, a.description) AS mail_content,\n e.from AS mail_from,\n e.to AS mail_to,\n e.subject AS mail_subject,\n e.body AS mail_body,\n p.type as prompt_type,\n p.status as prompt_status,\n p.content AS prompt_content,\n a.actual_start_time as created_at\nFROM activities a\n LEFT JOIN ai_prompts p ON a.transcription_id = p.transcription_id AND p.deleted_at IS NULL\n LEFT JOIN email_messages e ON a.id = e.activity_id\nWHERE a.actual_start_time > '2024-01-01 00:00:00'\n AND a.opportunity_id IN (4353519)\n AND a.status IN ('completed', 'received', 'delivered')\n AND a.deleted_at IS NULL\n AND a.type NOT IN ('sms-inbound', 'sms-outbound')\nORDER BY a.opportunity_id ASC, a.id ASC;\n\nSELECT * FROM users WHERE name LIKE '%George Fierstone%'; # 14293\nSELECT * FROM teams WHERE id = 442;\nSELECT * FROM crm_configurations WHERE id = 344;\nselect * from team_features where team_id = 442;\nselect * from groups where team_id = 442;\nselect * from playbooks where team_id = 442;\nselect * from playbook_categories where playbook_id = 1729;\nselect * from crm_fields where crm_configuration_id = 344 and id = 172024;\nSELECT * FROM crm_field_values WHERE crm_field_id = 172024;\nselect * from crm_layouts where crm_configuration_id = 344;\nselect * from playbook_layouts where playbook_id = 1729;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Learning%'; # 260, 221, 9444\n\nselect s.*\n# , s.sent_at, u.name, a.*\nfrom activity_summary_logs s\ninner join activities a on a.id = s.activity_id\ninner join users u on u.id = a.user_id\nwhere a.crm_configuration_id = 356\nand s.sent_at > date_sub(now(), interval 60 day)\norder by a.actual_end_time desc;\n\nselect * from activities a\n# inner join activity_summary_logs s on s.activity_id = a.id\nwhere a.crm_configuration_id = 356 and a.actual_end_time > date_sub(now(), interval 60 day)\n# and a.crm_provider_id is not null\n# and provider <> 'ringcentral'\nand status = 'completed'\norder by a.actual_end_time desc;\n\nselect * from teams order by id desc; # 17328, 32, 17830, integration-account@jiminny.com\nSELECT * FROM users;\nSELECT * FROM users where team_id = 260 and status = 1; # 201 - 150 active\nSELECT * FROM teams WHERE id = 260;\nselect * from team_settings where team_id = 260;\nselect * from crm_configurations where team_id = 260;\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 356;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1184;\n\nselect * from accounts where crm_configuration_id = 221 order by id desc; # 7000\nselect * from leads where crm_configuration_id = 221 order by id desc; # 0\nselect * from contacts where crm_configuration_id = 221 order by id desc; # 200 000\nselect * from opportunities where crm_configuration_id = 221 order by id desc; # 0\nselect * from crm_profiles where crm_configuration_id = 221 order by id desc; # 23\nselect * from crm_fields where crm_configuration_id = 221;\nselect * from crm_field_values where crm_field_id = 5302 order by id desc;\nselect * from crm_layouts where crm_configuration_id = 221 order by id desc;\nselect * from stages where crm_configuration_id = 221 order by id desc;\n\nselect * from accounts where crm_configuration_id = 356 order by id desc; # 7000\nselect * from leads where crm_configuration_id = 356 order by id desc; # 0\nselect * from contacts where crm_configuration_id = 356 order by id desc; # 200 000\nselect * from opportunities where crm_configuration_id = 356 order by id desc; # 0\nselect * from crm_profiles where crm_configuration_id = 356 order by id desc; # 23\nselect * from crm_fields where crm_configuration_id = 356;\nselect * from crm_field_values where crm_field_id = 5302 order by id desc;\nselect * from crm_layouts where crm_configuration_id = 356 order by id desc;\nselect * from stages where crm_configuration_id = 356 order by id desc;\n\nselect * from playbooks where team_id = 260 order by id desc; # 4 (2 deleted)\nselect * from groups where team_id = 260 order by id desc; # 27 groups, (2 deleted)\nselect * from playbook_layouts where playbook_id IN (1410,1409,1276,1254); # 4\nselect ce.* from calendars c\njoin users u on c.user_id = u.id\njoin calendar_events ce on c.id = ce.calendar_id\nwhere u.team_id = 260\nand (ce.start_time > '2025-02-21 00:00:00')\n;\n# calendar events 1207\n#\n\nselect * from opportunities where team_id = 260;\nSELECT * FROM crm_field_data WHERE object_id = 4696496;\n\nselect * from activities where crm_configuration_id = 356 and crm_provider_id IS NOT NULL;\nselect * from activities where crm_configuration_id IN (221) and provider NOT IN ('ms-teams', 'uploader', 'zoom-bot')\n# and type = 'conference' and status = 'scheduled' and activities.is_internal = 0\nand created_at > '2024-03-01 00:00:00'\norder by id desc; # 880 000, ringcentral, avaya\nSELECT * FROM participants WHERE activity_id = 26371744;\n\n# all activities 942 000 +\n# conference 7385 - scheduled 984 - external 343\n\nselect * from activities where id = 26321812;\nselect * from participants where activity_id = 26321812;\nselect * from participants where activity_id in (26414510,26414514,26414516,26414604,26414653,26414655);\nselect * from leads where id in (720428,689175,731546,645866,621037);\n\nselect * from users where id = 13841;\nselect * from opportunities where user_id = 9541;\nselect * from stages where id = 15900;\n\nselect * from accounts where\n# id IN (4160055,5053725,4965303,4896434)\nid in (4584518,3249934,3218025,3891133,3399450,4172999,4485161,3101785,4587203,3070816,2870343,2870341,3563940,4550846,3424464,3249963,2870342)\n;\n\nselect * from activities where id = 26654935;\nSELECT * FROM opportunities WHERE id = 4803458;\n\nSELECT * FROM opportunities where team_id = 260 and user_id = 13841 AND stage_id = 15900;\nSELECT id, uuid, provider, type, lead_id, account_id, contact_id, opportunity_id, stage_id, status, recording_state, title, actual_start_time, actual_end_time\nFROM activities WHERE user_id = 13841 AND opportunity_id IN (4729783, 4731717, 4731726, 4732064, 4732849, 4803458, 4813213);\n\nSELECT DISTINCT\n o.id, o.stage_id, s.name, a.title,\n a.*\nFROM activities a\n# INNER JOIN tracks t ON a.id = t.activity_id\nINNER JOIN users u ON a.user_id = u.id\nINNER JOIN teams team ON u.team_id = team.id\nINNER JOIN groups g ON u.group_id = g.id\nINNER JOIN opportunities o ON a.opportunity_id = o.id\nINNER JOIN stages s ON o.stage_id = s.id\nWHERE\n a.crm_configuration_id = 356\n AND a.status IN ('completed', 'failed')\n AND a.recording_state != 'stopped'\n# and a.user_id = 13841\n AND u.uuid = uuid_to_bin('6f40e4b8-c340-4059-b4ac-1728e87ea99e')\n AND team.uuid = uuid_to_bin('a607fba7-452e-4683-b2af-00d6cb52c93c')\n AND g.uuid = uuid_to_bin('b5d69e40-24a0-4c16-810b-5fa462299f94')\n\n AND a.type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')\n# AND t.type IN ('audio', 'video')\n AND (\n (a.actual_start_time BETWEEN '2025-03-13 00:00:00' AND '2025-03-18 07:59:59')\n OR\n (\n a.actual_start_time IS NULL\n AND a.type IN ('sms-outbound', 'sms-inbound')\n AND a.created_at BETWEEN '2025-03-13 00:00:00' AND '2025-03-18 07:59:59'\n )\n )\n AND (\n a.is_private = 0\n OR (\n a.is_private = 1\n AND u.uuid = uuid_to_bin('6f40e4b8-c340-4059-b4ac-1728e87ea99e')\n )\n )\n AND (\n# s.id = 15900\n s.uuid = uuid_to_bin('04ca1c26-c666-4268-a129-419c0acffd73')\n OR s.uuid IS NULL -- Include records without opportunity stage\n )\n\nORDER BY a.actual_end_time DESC;\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Lead Forensics%'; # 190, 162, 8474, willsc@leadforensics.com\nSELECT * FROM users WHERE team_id = 190;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 190\nand sa.provider = 'hubspot';\n\nselect * from role_user where user_id = 8474;\n\nselect * from crm_configurations where provider = 'bullhorn';\n\nSELECT * FROM opportunities WHERE uuid_to_bin('94578249-65ec-4205-90f2-7d1a7d5ab64a') = uuid;\nSELECT * FROM users WHERE uuid_to_bin('26dbadeb-926f-4150-b11b-771b9d4c2f9a') = uuid;\n\nSELECT * FROM opportunities WHERE id = 4732493;\nselect * from activities where opportunity_id = 4732493;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE id = 443; # 358, 14315, andrea.romano@correrenaturale.com\nSELECT * FROM opportunities WHERE team_id = 443;\n\nSELECT a.id, a.type, a.user_id, a.status, a.deleted_at, u.name, u.email, u.team_id as activity_team_id, u.status, u.deleted_at, t.name, t.status, s.team_id as stage_team_id\nFROM activities AS a\nJOIN stages AS s ON a.stage_id = s.id\nJOIN users AS u ON u.id = a.user_id\nJOIN teams AS t ON t.id = s.team_id\nWHERE u.team_id <> s.team_id and t.id > 135;\n\n\nSELECT\n crm_configuration_id,\n crm_provider_id,\n COUNT(*) as duplicate_count,\n GROUP_CONCAT(id) as stage_ids,\n GROUP_CONCAT(name) as stage_names\nFROM stages\nGROUP BY crm_configuration_id, crm_provider_id\nHAVING COUNT(*) > 1\nORDER BY duplicate_count DESC;\n\nselect * from stages where id IN (14898,14907);\n\nselect * from business_processes;\n\nSELECT *\nFROM crm_configurations\nWHERE team_id IN (\n SELECT team_id\n FROM crm_configurations\n GROUP BY team_id\n HAVING COUNT(*) > 1\n)\nORDER BY team_id;\n\nSELECT *\nFROM teams\nWHERE crm_id IN (\n SELECT crm_id\n FROM teams\n GROUP BY crm_id\n HAVING COUNT(*) > 1\n)\nORDER BY crm_id;\n\n# ***************************************************************************\nselect * from crm_configurations where provider = 'integration-app';\nSELECT * FROM teams WHERE id = 443; # Correre Naturale 358 14315 andrea.romano@correrenaturale.com\nselect * from activities where crm_configuration_id = 358 order by actual_end_time desc;\nselect id, uuid, actual_end_time, crm_provider_id, is_internal, playbook_category_id, type, user_id, lead_id, contact_id, account_id, opportunity_id, status, title from activities where crm_configuration_id = 358 order by actual_end_time desc;\nselect * from team_features where team_id = 358;\nselect * from activity_summary_logs;\n\nselect * from teams where id = 406;\n\n# ************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Sportfive%'; # 267, 202, 14637, srv.salesforce@sportfive.com\nselect * from activities where crm_configuration_id = 202 order by actual_end_time desc;\n\nSELECT * FROM users where id = 14637;\nSELECT * FROM teams where id = 267;\nSELECT * FROM groups where id = 1118;\n\nselect g.name, a.title, uuid_from_bin(a.uuid), a.external_id, a.status, a.recording_state, a.recording_reason_code, a.scheduled_start_time, a.scheduled_end_time, a.actual_start_time, a.actual_end_time from activities a\ninner join users u on u.id = a.user_id\ninner join groups g on g.id = u.group_id\nwhere a.crm_configuration_id = 202\nand a.is_internal = 0\nand (a.scheduled_start_time between '2025-03-19 00:00:00' and '2025-03-21 00:00:00')\nand a.type = 'conference'\nand a.status != 'completed'\nand a.external_id is not null\norder by a.scheduled_start_time desc;\n\nSELECT * FROM activities\nWHERE crm_configuration_id = 202\n AND status IN ('completed', 'failed')\n AND recording_state != 'stopped'\n AND type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')\n AND (is_private = 0 OR user_id = 14637)\n AND (\n (\n actual_start_time BETWEEN '2025-03-12 12:00:00' AND '2025-03-24 11:59:59'\n ) OR (\n actual_start_time IS NULL\n AND type IN ('sms-outbound', 'sms-inbound')\n AND created_at BETWEEN '2025-03-12 12:00:00' AND '2025-03-24 11:59:59'\n )\n )\n AND NOT EXISTS (\n SELECT 1\n FROM tracks\n WHERE\n tracks.activity_id = activities.id\n AND tracks.type IN ('audio', 'video')\n )\nORDER BY actual_end_time DESC;\n\nSELECT DISTINCT\n a.*\nFROM activities a\nINNER JOIN tracks t ON a.id = t.activity_id\nINNER JOIN users u ON a.user_id = u.id\nINNER JOIN teams team ON u.team_id = team.id\nWHERE\n a.crm_configuration_id = 202\n AND a.status IN ('completed', 'failed')\n AND a.recording_state != 'stopped'\n# and a.user_id = 14637\n AND a.type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')\n# AND t.type IN ('audio', 'video')\n AND (\n (a.actual_start_time BETWEEN '2025-03-12 12:00:00' AND '2025-03-24 11:59:59')\n OR\n (\n a.actual_start_time IS NULL\n AND a.type IN ('sms-outbound', 'sms-inbound')\n AND a.created_at BETWEEN '2025-03-12 12:00:00' AND '2025-03-24 11:59:59'\n )\n )\n AND (\n a.is_private = 0\n OR (\n a.is_private = 1\n AND a.user_id = 14637\n )\n )\n\nORDER BY a.actual_end_time DESC\n;\n\nSELECT DISTINCT a.*\nFROM activities a\nINNER JOIN users u ON a.user_id = u.id\nINNER JOIN teams t ON u.team_id = t.id\n# INNER JOIN tracks tr ON a.id = tr.activity_id\n# INNER JOIN groups g ON u.group_id = g.id\nWHERE 1=1\n AND t.id = 267\n# AND t.uuid = uuid_to_bin('aed4927b-f1ea-499e-94c3-83762fd233e8')\n AND a.status IN ('completed', 'failed')\n AND a.recording_state != 'stopped'\n AND a.type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')\n# AND tr.type NOT IN ('audio', 'video')\n AND (\n a.is_private = 0\n OR a.user_id = 14637\n )\n AND (\n (a.actual_start_time BETWEEN '2025-03-19 00:00:00' AND '2025-03-21 23:59:59')\n OR (\n a.actual_start_time IS NULL\n AND a.type IN ('sms-outbound', 'sms-inbound')\n AND a.created_at BETWEEN '2025-03-19 00:00:00' AND '2025-03-21 23:59:59'\n )\n )\n# and NOT EXISTS (\n# SELECT 1\n# FROM tracks t\n# WHERE t.activity_id = a.id\n# AND t.type IN ('audio', 'video')\n# )\n\nORDER BY a.actual_end_time DESC;\n\nSELECT * FROM tracks WHERE activity_id = 26485995;\n\nselect a.is_private, a.title, uuid_from_bin(a.uuid), a.external_id, a.status, a.recording_state, a.recording_reason_code, a.scheduled_start_time, a.scheduled_end_time, a.actual_start_time, a.actual_end_time from activities a\ninner join users u on u.id = a.user_id\nwhere a.crm_configuration_id = 202\n# and a.is_internal = 0\nand (a.actual_start_time between '2025-03-19 00:00:00' and '2025-03-21 00:00:00')\nand a.type IN (\"softphone\",\"softphone-inbound\",\"conference\",\"sms-inbound\")\nand a.status IN ('completed', 'failed')\n# and a.external_id is not null\norder by a.actual_end_time desc;\n\nselect * from activities a where a.crm_configuration_id = 202\nand a.actual_start_time between '2025-03-20 00:00:00' and '2025-03-21 00:00:00'\n# AND a.type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')\n\nselect g.name, a.title, uuid_from_bin(a.uuid), a.external_id, a.status, a.recording_state, a.recording_reason_code, a.scheduled_start_time, a.scheduled_end_time, a.actual_start_time, a.actual_end_time from activities a\ninner join users u on u.id = a.user_id\ninner join groups g on g.id = u.group_id\nwhere a.crm_configuration_id = 202\nand a.is_internal = 0\nand (a.scheduled_start_time between '2025-03-19 00:00:00' and '2025-03-21 00:00:00')\nand a.type = 'conference'\nand a.status != 'completed'\nand a.external_id is not null\norder by a.scheduled_start_time desc;\n\nSELECT * FROM teams WHERE name LIKE '%Tourlane%';\nSELECT * FROM crm_fields WHERE crm_configuration_id = 209 and object_type = 'opportunity';\nSELECT * FROM crm_field_data WHERE crm_field_id = 98809;\n\nselect * from users where status = 1 AND timezone = 'MDT';\n\nselect * from opportunities where id = 3769814;\nselect * from deal_risks where opportunity_id = 3769814;\n\nselect cp.* from crm_profiles cp\njoin users u on cp.user_id = u.id\njoin crm_configurations crm on cp.crm_configuration_id = crm.id\nwhere crm.provider = 'hubspot' AND u.status = 1 AND log_notes != 'none';\n\nselect * from crm_fields where id = 154575;\n\nselect * from team_features where feature = 'SUPPORTS_SYNC_MISSING_CALL_DISPOSITIONS';\nSELECT * FROM teams WHERE id = 176; # crm 148\nselect * from activities where crm_configuration_id = 148 and provider = 'hubspot' order by id desc;\n\nselect * from activity_providers where provider = 'amazon-connect';\n\nselect * from crm_fields cf\njoin crm_configurations crm on crm.id = cf.crm_configuration_id\nwhere crm.provider = 'hubspot' and cf.object_type IN ('account', 'contact');\n\n# *********************************************************************************************\nSELECT * FROM users WHERE id IN (15415, 15418);\nSELECT * FROM groups WHERE id IN (1805,1806);\nSELECT * FROM playbooks WHERE id = 1860;\nSELECT * FROM playbook_categories WHERE id = 38634;\nSELECT * FROM crm_fields WHERE id = 189962;\n\nSELECT * FROM teams WHERE name = 'Pulsar Group'; # 472, 380, 15138 raza.gilani@vuelio.com\n\nSELECT * FROM crm_profiles WHERE user_id = 15415;\nSELECT * FROM social_accounts WHERE sociable_id = 15415 and provider = 'salesforce';\n\nselect * from sidekick_settings where team_id = 472;\n\nSELECT * FROM activities WHERE uuid_to_bin('452c58c7-b87c-4fdd-953e-d7af185e9588') = uuid; # 28617536, user: 15418\nSELECT * FROM activities WHERE uuid_to_bin('399114ee-d3a8-458c-bff5-5f654658db0a') = uuid; # 28344407, user: 15415\nSELECT * FROM activities WHERE uuid_to_bin('f0aa567f-0ab1-4bbb-96aa-37dcf184676b') = uuid; # 28580288, user: 15415\nSELECT * FROM activities WHERE uuid_to_bin('50c086b1-2770-4bca-b5ae-6bac22ec426b') = uuid; # 28566069, user: 15415\n\n# *********************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%TeamTailor%'; # 109, 218, 13969, salesforce-integrations@teamtailor.com\nselect * from crm_configurations where id = 218;\nSELECT * FROM activities WHERE uuid_to_bin('e39b5857-7fdb-4f5a-951a-8d3ca69bb1b0') = uuid; # 28338765\nSELECT * FROM users WHERE id IN (13232, 13230);\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 109\nand sa.provider = 'salesforce';\n\n0057R00000EPL5HQAX Inez Ekblad\n\n1091cb81-5ea1-4951-a0ed-f00b568f0140 Triman Kaur\n\nSELECT * FROM crm_profiles WHERE user_id IN (13232, 13230);\n\n############################################################################################\nSELECT * FROM activities WHERE uuid_to_bin('675eeaeb-5681-42db-90bc-54c07a604408') = uuid; # 28655939 00UVg00000FLvnSMAT\nSELECT * FROM crm_field_data WHERE activity_id = 28655939;\nSELECT * FROM crm_fields WHERE id IN (94491,94493,94498);\nSELECT * FROM users WHERE id = 13658;\nSELECT * FROM teams WHERE id = 109;\nSELECT * FROM crm_configurations WHERE id = 218;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 109\nand sa.provider = 'salesforce';\n\n# ********************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Strengthscope%'; # 481, 390, 15420, katy.holden@strengthscope.comk\nSELECT * FROM stages WHERE crm_configuration_id = 390;\nselect * from business_processes where team_id = 481 and crm_configuration_id = 390;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 481\nand sa.provider = 'salesforce';\n\n\nSELECT * FROM users WHERE id = 15780; # team 462\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 462\nand sa.provider = 'hubspot';\n\n\nselect * from teams where id = 495;\nSELECT * FROM users WHERE id = 15794;\nselect * from social_accounts where sociable_id = 15794;\n\n# ********************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Flight%'; # 427, 333, 13752\nSELECT * FROM accounts WHERE team_id = 427 and crm_provider_id = '668731000183444517';\n\n# ********************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Group GTI%'; # 495, 407, 15794\nSELECT * FROM activities WHERE crm_configuration_id = 407\nand status = 'completed' and type = 'conference'\norder by id desc;\n\nselect ru.*, pr.*, p.* from users u join role_user ru on ru.user_id = u.id\njoin permission_role pr on pr.role_id = ru.role_id\n join permissions p on p.id = pr.permission_id\nwhere team_id = 495 and p.name IN ('dial');\n\nselect * from permission_role;\n\nselect * from activities where crm_configuration_id = 407 and status = 'completed' order by id desc;\nSELECT * FROM activities WHERE id = 29512773;\nSELECT * FROM activities WHERE id IN (29042721,28991325,29002874);\n\nSELECT al.* from activity_summary_logs al join activities a on a.id = al.activity_id\nwhere a.crm_configuration_id = 407\n# and a.id IN (29042721,28991325,29002874);\n\nSELECT * FROM users WHERE id = 15794;\nSELECT * FROM users WHERE team_id = 495;\nSELECT * FROM social_accounts WHERE sociable_id = 15794;\nSELECT * FROM opportunities WHERE team_id = 495 and name like '%OC:%';\nSELECT * FROM contacts WHERE team_id = 495;\nSELECT * FROM leads WHERE team_id = 495;\nSELECT * FROM accounts WHERE team_id = 495;\nSELECT * FROM crm_profiles WHERE crm_configuration_id = 407;\nSELECT * FROM crm_fields WHERE crm_configuration_id = 407;\nSELECT * FROM crm_configurations WHERE id = 407;\nSELECT * FROM opportunities WHERE team_id = 495 and close_date BETWEEN '2025-06-01' AND '2025-07-01'\nand user_id IS NOT NULL and is_closed = 1 and is_won = 1;\n\n# ********************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Hamilton Court FX LLP%'; # 249, 187, 10103\nSELECT * FROM activities WHERE uuid_to_bin('4659c2bb-9a49-484e-9327-a3d66f1e028c') = uuid; # 28951064\nSELECT * FROM crm_fields WHERE crm_configuration_id = 187 and object_type IN ('tasks', 'event');\n\n# *********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Checkstep%'; # 325, 256, 11753\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 325\nand sa.provider = 'hubspot';\n\nSELECT * FROM activities WHERE uuid_to_bin('7be372e2-1916-4d79-a2f3-ca3db1346db3') = uuid; # 28611085\nSELECT * FROM activities WHERE uuid_to_bin('980f0336-840b-4185-a5a9-30cf8b0749a8') = uuid; # 28719733\nSELECT * FROM activity_summary_logs where activity_id = 28719733;\n\n# *************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Learning%'; # 260, 356, 9444\nSELECT * FROM activity_summary_logs where sent_at BETWEEN '2025-06-09 11:38:00' AND '2025-06-09 11:40:00';\nSELECT * FROM leads WHERE crm_configuration_id = 356 and crm_provider_id = '230045001502770504'; # 823630\nselect * from activities where crm_configuration_id = 356 and lead_id = 841732;\n\nSELECT * from activity_summary_logs al join activities a on a.id = al.activity_id\nwhere a.crm_configuration_id = 356;\n\nselect * from activities where crm_configuration_id = 356\nand actual_end_time between '2025-06-09 11:00:00' and '2025-06-09 12:00:00'\norder by id desc;\n\nselect * from accounts where crm_configuration_id = 356 and crm_provider_id = '230045001514403366' order by id desc;\nselect * from leads where crm_configuration_id = 356 and crm_provider_id = '230045001514275654' order by id desc;\nselect * from contacts where crm_configuration_id = 356 and crm_provider_id = '230045001514403366' order by id desc;\nselect * from opportunities where crm_configuration_id = 356 and crm_provider_id = '230045001514403366' order by id desc;\n\nselect * from team_features where team_id = 260;\nselect * from features where id IN (1,2,4,6,18,19,20,9,10,3,23,24,25,26,27);\n\nSELECT * FROM activities WHERE uuid_to_bin('7be372e2-1916-4d79-a2f3-ca3db1346db3') = uuid;\n\nselect * from crm_fields;\nselect * from crm_layout_entities;\n\nSELECT * FROM teams WHERE name LIKE '%Optable%';\n\n# *************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Teamtailor%'; # 109, 218, 13969\nSELECT * FROM crm_configurations WHERE id = 218;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 109\nand sa.provider = 'salesforce';\nSELECT * FROM activities WHERE uuid_to_bin('675eeaeb-5681-42db-90bc-54c07a604408') = uuid; # 28655939\nSELECT * FROM crm_field_data WHERE activity_id = 28655939;\nSELECT * FROM crm_fields WHERE id in (94491,94493,94498);\n\nselect * from teams where crm_id IS NULL;\n\nSELECT * FROM activities WHERE uuid_to_bin('71aa8a0c-9652-4ff6-bee7-d98ae60abef6') = uuid;\n\n# *************************************************************************************************\nselect * from team_domains where team_id = 399;\nSELECT * FROM teams WHERE name LIKE '%Rydoo%'; # 399, 318, 13207\n\nselect * from calendar_events where id = 5163781;\nSELECT * FROM activities WHERE uuid_to_bin('be2cbc52-7fda-46a0-9ae0-25d9553eafc0') = uuid; # 29443896\nSELECT * FROM participants WHERE activity_id = 29443896;\nselect * from contacts where crm_configuration_id = 318 and email = 'marianne.westeng@strawberry.no';\nselect * from leads where crm_configuration_id = 318 and email = 'marianne.westeng@strawberry.no';\n\nselect * from activities where user_id = 14937 order by created_at ;\n\nselect * from users where id = 14937;\n\nselect * from contacts where crm_configuration_id = 318 and email LIKE '%@strawberry.se';\nselect * from opportunities where crm_configuration_id = 318 and crm_provider_id = '006Sf00000D1WOAIA3';\n\nselect * from activities a join participants p on a.id = p.activity_id\nwhere crm_configuration_id = 318 and a.updated_at > '2025-06-23T08:18:43Z';\n\n# *************************************************************************************************\nSELECT * FROM opportunities WHERE team_id = 379 and crm_provider_id = '39334518886';\nSELECT * FROM opportunities WHERE team_id = 379 order by id desc;\nSELECT * FROM teams WHERE id = 379;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 379 and sociable_id = 13852\nand sa.provider = 'hubspot';\n\nSELECT * FROM crm_configurations WHERE id = 307;\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 307;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1027;\nSELECT * FROM crm_fields WHERE crm_configuration_id = 307\n and id IN (144750,144855,145158,155227);\n\nSELECT * FROM activities;\n\n\nselect * from activities\nwhere created_at > '2025-07-01 00:00:00'\n# and created_at < '2025-08-01 00:00:00'\nand type not in ('email-outbound', 'email-inbound')\nand account_id is null\nand contact_id is null\nand lead_id is null\nand opportunity_id is not null\n;\nSELECT * FROM activities WHERE id IN (25344155, 25344296, 25501909, 28692187);\nSELECT * FROM crm_configurations WHERE id in (335,301,200);\n\nselect * from crm_fields where crm_configuration_id = 230 and crm_provider_id = 'Age2__c';\n\nSELECT * FROM teams WHERE name LIKE '%Resights%';\nselect * from crm_fields where crm_configuration_id = 1 and object_type = 'opportunity';\n\nselect * from crm_configurations where provider = 'bullhorn'; # 344\nselect * from teams where id IN (442);\n\nselect * from activities\nwhere crm_configuration_id = 177\nand provider = 'amazon-connect'\n order by id desc;\n# and source <> 'gong';\n\nselect * from activity_providers where provider = 'amazon-connect';\n\nSELECT * FROM activities WHERE uuid_to_bin('cec1993b-a7e5-4164-b74d-d680ea51d2f2') = uuid;\n\n\nselect * from crm_configurations where store_transcript = 1;\nSELECT * FROM teams WHERE id IN (80);\n\n# *************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Sedna%'; # 277, 213, 12594\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 277\nand sa.provider = 'salesforce';\n\nselect * from activities where crm_configuration_id = 213 and account_id = 2511502;\n\nselect * from crm_configurations where id = 213;\n\nSELECT * FROM activities WHERE uuid_to_bin('35aa790a-8569-4544-8268-66f9a4a26804') = uuid; # 33981604\nSELECT * FROM participants WHERE activity_id = 33981604;\nSELECT * FROM crm_fields WHERE crm_configuration_id = 337 and object_type = 'task';\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 431\nand sa.provider = 'salesforce';\nSELECT * FROM activities WHERE uuid_to_bin('b5476c7d-19a8-491b-869d-676ea1e857b6') = uuid; # 33997223\nselect * from activity_summary_logs where activity_id = 33997223;\nselect * from activity_notes where activity_id = 33997223;\n\n# ***********************************\nSELECT * FROM teams WHERE name LIKE '%Abode%';\n\n\nselect * from features;\nselect * from teams t\nwhere t.status = 'active'\nand id NOT IN (select team_id from team_features where feature_id = 9)\n;\n\n\nselect * from playbook_layouts where playbook_id = 1725;\nSELECT * FROM activities WHERE uuid_to_bin('65cc283c-4849-49e6-927f-4c281c8fea19') = uuid; # 34297473\nselect * from teams where id = 318;\nselect * from crm_configurations where team_id = 318;\nselect * from playbooks where team_id = 318;\nSELECT * FROM crm_layouts where crm_configuration_id = 381;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1259;\nSELECT * FROM crm_fields WHERE id IN (192938,192936,192939);\n\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1266;\nSELECT * FROM crm_fields WHERE id IN (192980,192991,192997,192998,193064,193067);\n\nSELECT * FROM activities WHERE uuid_to_bin('a902289b-285c-48eb-9cc2-6ad6c5d938f5') = uuid; # 34297533\n\n\n\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 927;\nSELECT * FROM crm_fields WHERE id IN (131668,131669,131670,131671,131676,131797);\n\nSELECT * FROM teams WHERE name LIKE '%Peripass%'; # 351, 281, 12124\nselect * from crm_layouts where crm_configuration_id = 281;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 927;\nselect * from crm_fields where crm_configuration_id = 281 and id in (131668,131669,131670,131671,131676,131797);\nselect * from opportunities where crm_configuration_id = 281;\n\nSELECT * FROM activities WHERE id IN (34211315, 34130075);\nSELECT * FROM crm_field_data WHERE object_id IN (34211315, 34130075);\n\nselect cf.crm_configuration_id, cle.crm_layout_id, cle.id, cf.id from crm_field_data cfd\njoin crm_layout_entities cle on cle.id = cfd.crm_layout_entity_id\njoin crm_fields cf on cle.crm_field_id = cf.id\nwhere cf.deleted_at IS NOT NULL\nGROUP BY cle.id, cf.id;\n\nselect * from crm_layouts where id IN (355);\nselect u.email, t.crm_id, t.* from teams t\njoin users u on u.id = t.owner_id\nwhere crm_id IN (97);\n\nSELECT * FROM crm_fields WHERE id = 96492;\n\nselect * from permissions;\nselect * from permission_role where permission_id = 247;\nselect * from roles;\n\nselect * from migrations;\n# *****************************************************************\nSELECT * FROM activities WHERE uuid_to_bin('291e3c21-11cc-4728-aee7-6e4bedf86d72') = uuid; # 34262174\nSELECT * FROM crm_configurations WHERE id = 301;\nSELECT * FROM teams WHERE id = 343;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 343\nand sa.provider = 'hubspot';\n\nselect * from participants where activity_id = 34262174;\n\nselect * from contacts where crm_configuration_id = 301 and id = 6976326;\nselect * from accounts where crm_configuration_id = 301 and id IN (4647626, 4815829); # 30761335403\n\nselect * from activity_summary_logs where activity_id = 34262174;\n\nselect * from users where status = 1 AND timezone = 'EST';\n\n# ****************************************************************************\nSELECT * FROM users WHERE id = 13869;\nSELECT * FROM crm_configurations WHERE id = 320;\nSELECT * FROM teams WHERE id = 401;\n\nSELECT * FROM activities WHERE uuid_to_bin('2228c16f-10be-48d5-90d4-67385219dc01') = uuid; # 29670601\n\nSELECT * FROM accounts WHERE id = 7761483;\nSELECT * FROM opportunities WHERE id = 6051814;\n\nSELECT * FROM teams WHERE name LIKE '%Seedlegals%';\n\n;select * from opportunities where updated_at > '2025-10-11' AND crm_provider_id = '34713761166';\n\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 177;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 577;\nSELECT * FROM crm_fields WHERE id IN (68458,68459,68480,68497,68524,68530,68554,68618,68662,68781,68810,68898,68981,69049,97467);\n\nSELECT t.id, crm.id, t.name, crm.sync_objects, crm.provider, crm.last_synced_at FROM crm_configurations crm join teams t on t.crm_id = crm.id\nwhere t.status = 'active' AND crm.provider = 'hubspot' AND crm.last_synced_at < '2025-10-22 00:00:00';\n\nSELECT * FROM activities WHERE uuid_to_bin('fa09449f-cba9-496a-b8f3-865cd3c72351') = uuid;\nSELECT * FROM crm_configurations where id = 184;\nSELECT * FROM teams WHERE id = 246;\nSELECT * FROM social_accounts WHERE sociable_id = 9259 and provider = 'hubspot';\n\nSELECT * FROM users WHERE email LIKE '%rhian.old@bud.co.uk%'; # 17700\nSELECT * FROM teams WHERE id = 551;\n\nSELECT * FROM crm_configurations WHERE id = 471;\nSELECT * FROM activities WHERE crm_configuration_id = 471 and crm_provider_id IS NOT NULL;\nSELECT * FROM crm_fields WHERE crm_configuration_id = 471;\nSELECT * FROM crm_fields WHERE id = 307260;\nSELECT * FROM crm_field_values WHERE crm_field_id = 307260;\n\nselect * from crm_layouts where crm_configuration_id = 471;\n\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1547;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1548;\n\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 551 and sa.provider = 'hubspot';\n\nSELECT * FROM teams WHERE name LIKE '%$PCS%';\n\n# ********************************************************************************************************\nselect * from crm_configurations crm\njoin teams t on t.crm_id = crm.id\nwhere t.status = 'active'\nand crm.provider = 'hubspot';\n\n# $slug = 'HUBSPOT_WEBHOOK_SYNC';\n# $team = Jiminny\\Models\\Team::find(2);\n# $feature = Feature::query()->where('slug', $slug)->first();\n# TeamFeature::query()->create(['feature_id' => $feature->getId(),'team_id' => $team->getId()]);\n\n# hubspot_webhook_metrics\n\nselect * from crm_configurations where id = 331; # 416\nSELECT * FROM teams WHERE id = 416;\nSELECT * FROM opportunities WHERE team_id = 190;\n\nSELECT * FROM teams WHERE name LIKE '%Lead Forensics%';\nSELECT sa.id,\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 190 and sa.provider = 'hubspot';\n\n\n\nSELECT * FROM teams WHERE name LIKE '%Rapaport%'; # 431, 337\nSELECT * FROM teams where id = 431;\nSELECT * FROM crm_configurations where team_id = 431;\nSELECT * FROM activity_providers where team_id = 431;\nSELECT * FROM activities where crm_configuration_id = 337 and type IN ('softphone', 'softphone-outbound')\nand provider NOT IN ('hubspot', 'aircall')\n# and telephony_provider_id = '019c1131-a22f-4792-b9ea-20adf6a02ed0'\norder by id desc;\nSELECT sa.id,\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 431 and sa.provider = 'salesforce';\n\nSELECT * FROM teams WHERE name LIKE '%BiP%'; # 401, 320\nSELECT * FROM teams where id = 401;\nSELECT * FROM crm_configurations where team_id = 401;\nSELECT * FROM activity_providers where team_id = 401;\nSELECT * FROM activities where crm_configuration_id = 320 and type IN ('softphone', 'softphone-outbound')\nand provider NOT IN ('hubspot', 'aircall')\n# and telephony_provider_id = '019c1131-a22f-4792-b9ea-20adf6a02ed0'\norder by id desc;\nSELECT sa.id,\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 401 and sa.provider = 'salesforce';\n\n\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 307; # 379 - Story Terrace Inc , portalId: 3921157\nSELECT * FROM contacts WHERE team_id = 379 and updated_at > '2026-01-31 11:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 379 and updated_at > '2026-02-01 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 379 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 379 and sa.provider = 'hubspot';\n\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 485; # 563 - LATUS Group (ad94d501-5d09-44fd-878f-ca3a9f8865c3) , portalId: 3904501\nSELECT * FROM opportunities WHERE team_id = 563 and updated_at > '2026-02-02 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 563 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 338; # 432 - Formalize , portalId: 9214205\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 432 and sa.provider = 'hubspot';\nSELECT * FROM opportunities WHERE team_id = 432 and updated_at > '2026-02-02 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 432 and updated_at > '2026-02-10 00:00:00' order by updated_at desc;\n\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 436; # 519 - Moxso , portalId: 25531989\nSELECT * FROM opportunities WHERE team_id = 519 and updated_at > '2026-02-02 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 519 and updated_at > '2026-02-04 11:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 96; # 119 - Nourish Care , portalId: 26617984\nSELECT * FROM opportunities WHERE team_id = 119 and updated_at > '2026-02-02 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 119 and updated_at > '2026-02-04 11:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 331; # 416 - The National College , portalId: 7213852\nSELECT * FROM opportunities WHERE team_id = 416 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 416 and updated_at > '2026-02-04 11:00:00' order by updated_at desc;\n\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 308; # 380 - Foodles , portalId: 7723616\nSELECT * FROM opportunities WHERE team_id = 380 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 380 and updated_at > '2026-02-06 10:30:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 379; # 471 - imat-uve , portalId: 9177354\nSELECT * FROM opportunities WHERE team_id = 471 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 471 and updated_at > '2026-02-06 10:30:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 465; # 545 - Spotler , portalId: 144759271\nSELECT * FROM opportunities WHERE team_id = 545 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 545 and updated_at > '2026-02-06 10:30:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 455; # 537 - indevis , portalId: 25666868\nSELECT * FROM opportunities WHERE team_id = 537 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 537 and updated_at > '2026-02-06 10:30:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 200; # 265 - Jobadder , portalId: 6426676\nSELECT * FROM opportunities WHERE team_id = 265 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 265 and updated_at > '2026-02-06 10:30:00' order by updated_at desc;\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 335; # 429 - Eletive , portalId: 6110563\nSELECT * FROM opportunities WHERE team_id = 429 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 429 and updated_at > '2026-02-09 10:30:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 363; # 456 - Global Group , portalId: 8901981\nSELECT * FROM opportunities WHERE team_id = 456 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 456 and updated_at > '2026-02-09 10:30:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 297; # 369 - Unbiased , portalId: 9229005\nSELECT * FROM opportunities WHERE team_id = 369 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 369 and updated_at > '2026-02-09 10:30:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 353; # 449 - Fuuse , portalId: 25781745\nSELECT * FROM opportunities WHERE team_id = 449 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 449 and updated_at > '2026-02-09 10:30:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 487; # 566 - Nimbus , portalId: 39982590\nSELECT * FROM opportunities WHERE team_id = 566 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 566 and updated_at > '2026-02-09 10:30:00' order by updated_at desc;\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 487;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1630;\nselect * from crm_fields where crm_configuration_id = 487 and\n(uuid_to_bin('4c6b2971-64d4-45b8-b377-427be758b5a5') = uuid or uuid_to_bin('59e368d8-65a0-4b77-b611-db37c99fbe68') = uuid);\nSELECT * FROM crm_field_values WHERE crm_field_id = 375177;\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 420; # 506 - voiio , portalId: 145629154\nSELECT * FROM opportunities WHERE team_id = 506 and updated_at > '2026-02-10 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 506 and updated_at > '2026-02-10 15:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 479; # 558 - Momice , portalId: 535962\nSELECT * FROM opportunities WHERE team_id = 558 and updated_at > '2026-02-10 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 558 and updated_at > '2026-02-10 15:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 59; # 80 - Storyclash GmbH , portalId: 4268479\nSELECT * FROM opportunities WHERE team_id = 80 and updated_at > '2026-02-10 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 80 and updated_at > '2026-02-10 15:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 175; # 203 - Team iAM , portalId: 5534732\nSELECT * FROM opportunities WHERE team_id = 203 and updated_at > '2026-02-10 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 203 and updated_at > '2026-02-10 15:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 368; # 460 - OneTouch Health , portalId: 5534732183355\nSELECT * FROM opportunities WHERE team_id = 460 and updated_at > '2026-02-10 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 460 and updated_at > '2026-02-10 15:00:00' order by updated_at desc;\n\n\n\nselect * from users where id = 29643;\nSELECT * FROM crm_field_values WHERE crm_field_id = 375177;\n# ********************************************************************\nSELECT * FROM teams WHERE name LIKE '%Buynomics%'; # 462, 482, 14910\nSELECT * FROM activities WHERE crm_configuration_id = 482\nand type NOT IN ('email-inbound', 'email-outbound')\n# and description like '%The call focused on understanding Welch%'\norder by id desc;\n\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 462 and sa.provider = 'salesforce';\n\nselect * from contacts where crm_configuration_id = 482 and name = 'Cyndall Hill'; # 15504749\nselect * from contacts where id = 10891096; # 482\nSELECT * FROM activities WHERE crm_configuration_id = 482\nand type NOT IN ('email-inbound', 'email-outbound')\nand contact_id = 15504749\norder by id desc;\n\nselect * from activities where id = 36793003; # 96cc7bc1-8622-4d27-92f4-baf664fc1a56, 00UOf00000PDdOXMA1\nselect * from transcription where id = 7646782;\nselect * from ai_prompts where transcription_id = 7646782;\n\n# ********************************************************************\nSELECT * FROM activities WHERE uuid_to_bin('7a8471a3-847e-4822-802b-ddf426bbc252') = uuid; # 37370018\nSELECT * FROM activity_summary_logs WHERE activity_id = 37370018;\nSELECT * FROM teams WHERE id = 555;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 555 and sa.provider = 'hubspot';\n\n# ********************************************************************\nSELECT * FROM activities WHERE uuid_to_bin('7c17b8aa-09df-4f85-a0f7-51f47afd712d') = uuid; # 37395250\nSELECT * FROM activities WHERE uuid_to_bin('14d60388-260d-494b-aa0d-63fdb1c78026') = uuid; # 37395250\n\nSELECT a.* FROM activities a JOIN crm_configurations c on c.id = a.crm_configuration_id\nwhere a.type IN ('softphone', 'softphone-outbound') and c.provider = 'hubspot'\nand a.provider NOT IN ('hubspot')\n# and a.provider IN ('salesloft')\n# and c.id NOT IN (70)\n# and a.duration > 30\n# and actual_start_time > '2026-02-05 00:00:00'\norder by a.id desc;\n\nSELECT * FROM activities WHERE id = 37549787;\nSELECT * FROM crm_profiles WHERE user_id = 17613;\n\nSELECT * FROM crm_configurations WHERE id = 70;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 93 and sa.provider = 'hubspot';\n\nSELECT asf.activity_search_id, asf.id, asf.value\nFROM activity_search_filters asf\nWHERE asf.filter = 'group_id'\nAND asf.value IN (\n SELECT CONCAT(\n HEX(SUBSTR(uuid, 5, 4)), '-',\n HEX(SUBSTR(uuid, 3, 2)), '-',\n HEX(SUBSTR(uuid, 1, 2)), '-',\n HEX(SUBSTR(uuid, 9, 2)), '-',\n HEX(SUBSTR(uuid, 11))\n )\n FROM groups\n WHERE deleted_at IS NOT NULL\n);\n\nSELECT * FROM crm_configurations WHERE id = 373; # KPSBremen.de 465 # - no social account\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 465 and sa.provider = 'hubspot';\n\nselect * from crm_configurations where id = 494;\n\nSELECT * FROM teams WHERE name LIKE '%splose%'; # 572, 495, 18708\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 572 and sa.provider = 'pipedrive';\n\nselect * from opportunities where team_id = 572\n# and name like '%Onebright%'\n# and is_closed = 1 and is_won = 0\n order by id desc;\n\n\nselect * from users where deleted_at is null and status = 2;\n\nselect * from contacts where id = 17900517;\nselect * from accounts where id = 10109838;\nselect * from opportunities where id = 6955880;\n\nselect * from opportunity_contacts where opportunity_id = 6955880;\nselect * from opportunity_contacts where contact_id = 17900517;\n\nselect * from contact_roles cr join crm_configurations crm on cr.crm_configuration_id = crm.id\nwhere crm.provider != 'salesforce';\n\nSELECT * FROM activities WHERE uuid_to_bin('adcb8331-5988-4353-834e-383a355abba2') = uuid; # 38056424, crm 104659682404\nselect * from teams where id = 456;\nSELECT * FROM crm_configurations WHERE id = 363;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 456 and sa.provider = 'hubspot';\n\nselect * from crm_layouts where crm_configuration_id = 363;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id IN (1203, 1204, 1635);\nSELECT * FROM crm_fields WHERE id IN (181536, 181538, 213455);\n\nSELECT * FROM teams WHERE name LIKE '%Electric%'; # 342, 272, 12767\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 342 and sa.provider = 'pipedrive';\nSELECT * FROM opportunities WHERE crm_configuration_id = 272 and name like 'NORTHUMBRIA POL%'; # and updated_at > '2025-07-01 00:00:00';\nSELECT * FROM opportunities WHERE crm_configuration_id = 272 order by remotely_created_at asc; # and updated_at > '2025-07-01 00:00:00';\nSELECT * FROM opportunities WHERE crm_configuration_id = 272 and updated_at > '2026-01-01 00:00:00';\nSELECT * FROM crm_fields WHERE crm_configuration_id = 272 and object_type = 'opportunity';\nSELECT * FROM crm_field_values WHERE crm_field_id = 127164;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 342 and sa.provider = 'pipedrive';\n\nSELECT * FROM teams WHERE id = 472;\nSELECT * FROM crm_configurations WHERE id = 380;\nselect * from activities where id = 38285673; # 38285673\nSELECT * FROM users WHERE id = 16942;\nSELECT * FROM groups WHERE id = 1964;\nSELECT * FROM playbooks WHERE id = 2033;\n\nselect * from teams where created_at > '2026-03-09';\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 499; # 1065\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1678;\n\nSELECT * FROM teams WHERE id = 575;\nselect * from opportunities where team_id = 575;\n\nSELECT * FROM activities WHERE uuid_to_bin('96b1261f-2357-49f9-ab38-23ce12008ea0') = uuid;\n\nselect * from contacts c\nwhere c.crm_configuration_id = 370 order by c.updated_at desc;\n\nSELECT * FROM participants where activity_id = 38833541;\nSELECT * FROM participants where activity_id = 39216301;\nSELECT * FROM activity_summary_logs where activity_id = 39216301;\nSELECT * FROM activities WHERE uuid_to_bin('c7d99fbe-1fb1-41f2-8f4d-52e2bf70e1e9') = uuid; # 38833541, crm 478116564181\nSELECT * FROM activities WHERE uuid_to_bin('2e6ff4d3-9faa-447a-a8c1-9acde4d885ae') = uuid; # 39216301, crm 480171536586\nselect * from crm_profiles where crm_configuration_id = 319 and crm_provider_id = 525785080;\nselect * from opportunities where crm_configuration_id = 319 and crm_provider_id = 410150124747;\nselect * from accounts where crm_configuration_id = 319 and crm_provider_id = 47150650569;\nselect * from contacts where crm_configuration_id = 319 and crm_provider_id IN ('665587441856', '742723347700');\n# owner 13236 525785080\n# contact 1 16779180 665587441856 - activity - Alex Howes alex@supportroom.com created 2026-01-26\n# contact 2 19247563 742723347700 - ash@supportroom.com 2026-03-24\n# company 4176133 47150650569\n# deal 7100953 410150124747\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 400 and sa.provider = 'hubspot';\n\nselect * from features;\nselect * from team_features where feature_id = 40;\n\nselect * from teams where id = 556; # owner: 18101, crm: 477\nselect * from crm_configurations where id = 477;\nSELECT * FROM users WHERE id = 18101;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 556 and sa.provider = 'integration-app';\n\nselect * from opportunities where id = 7594349;\nselect * from opportunity_stages where opportunity_id = 7594349 order by created_at desc;\nselect * from business_processes where id = 6024;\nselect * from business_process_stages where stage_id = 16352;\nselect * from business_process_stages where business_process_id = 6024;\nselect * from stages where team_id = 459;\nselect * from teams where id = 459;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 459 and sa.provider = 'hubspot';\n\nSELECT os.stage_id, s.crm_provider_id, s.name, COUNT(*) as cnt\nFROM opportunity_stages os\nJOIN stages s ON s.id = os.stage_id\nWHERE os.opportunity_id = 7594349\nGROUP BY os.stage_id, s.crm_provider_id, s.name\nORDER BY cnt DESC;\n\nSELECT s.id, s.crm_provider_id, s.name, s.team_id, s.crm_configuration_id\nFROM stages s\nJOIN business_process_stages bps ON bps.stage_id = s.id\nWHERE bps.business_process_id = 6024\nAND s.crm_provider_id = 'contractsent';\n\nselect * from stages where id IN (16352,20612,18281,7344,16378,16309,5036,15223,14535,6293,12098,11607)\n\nSELECT * FROM teams WHERE name LIKE '%Pulsar Group%'; # 472, 380, 15138, raza.gilani@vuelio.com\nselect * from playbooks where team_id = 472; # event 226147\nSELECT * FROM playbook_categories WHERE playbook_id = 2288;\nSELECT * FROM crm_fields WHERE id = 226147;\nSELECT * FROM crm_field_values WHERE crm_field_id = 226147;\n\nSELECT * FROM crm_configurations WHERE id = 380;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 472 and sa.provider = 'salesforce';","depth":4,"value":"SELECT * FROM team_features where team_id = 1;\n\nSELECT * FROM teams WHERE name LIKE '%Vixio%'; # 340,270,11922\nSELECT * FROM users WHERE team_id = 340; # 12015\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 340\nand sa.provider = 'salesforce';\n# and sa.provider = 'salesloft';\n\nselect * from crm_fields where crm_configuration_id = 270 and object_type = 'event';\n# 125558 - Event Type - Event_Type__c\n# 125552 - Event Status - Event_Status__c\n\nSELECT * FROM sidekick_settings WHERE team_id = 340;\n\nSELECT * FROM crm_field_values WHERE crm_field_id in (125552);\n\nselect * from activities where crm_configuration_id = 270\nand type = 'conference' and crm_provider_id IS NOT NULL\nand actual_start_time > '2024-09-16 09:00:00' order by scheduled_start_time;\n\nSELECT * FROM activities WHERE id = 20871677;\nSELECT * FROM crm_field_data WHERE activity_id = 20871677;\n\nselect * from crm_layouts where crm_configuration_id = 270;\nselect * from crm_layout_entities where crm_layout_id in (886,887);\n\nSELECT * FROM crm_configurations WHERE id = 270;\n\nselect * from playbooks where team_id = 340; # 1514\nselect * from groups where team_id = 340;\nSELECT * FROM crm_fields WHERE id IN (125393, 125401);\n\nselect g.name as 'team name', p.name as 'playbook name', f.label as 'activity type field' from groups g\njoin playbooks p on g.playbook_id = p.id\njoin crm_fields f on p.activity_field_id = f.id\nwhere g.team_id = 340;\n\nSELECT * FROM activities WHERE uuid_to_bin('0c180357-67d2-419e-a8c3-b832a3490770') = uuid; # 20448716\nselect * from crm_field_data where object_id = 20448716;\n\nselect * from activities where crm_configuration_id = 270 and provider = 'salesloft' order by id desc;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%CybSafe%'; # 343,273,12008\nselect * from opportunities where team_id = 343;\nselect * from opportunities where team_id = 343 and crm_provider_id = '18099102526';\nselect * from opportunities where team_id = 343 and account_id = 945217482;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 343\nand sa.provider = 'hubspot';\n\nselect * from accounts where team_id = 343 order by name asc;\n\nselect * from stages where crm_configuration_id = 273 and type = 'opportunity';\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Voyado%'; # 353,283,12143\nSELECT * FROM activities WHERE crm_configuration_id = 283 and account_id = 3777844 order by id desc;\nSELECT * FROM accounts WHERE team_id = 353 AND name LIKE '%Salesloft%';\nSELECT * FROM activities WHERE id = 20717903;\n\nselect * from participants where activity_id IN (20929172,20928605,20928468,20926272,20926271,20926270,20926269,20916499,20916454,20916436,20916435,20900015,20900014,20900013,20897312,20897243,20897241,20897237,20897232,20897229,20893648,20893231,20893230,20893229,20893228,20889784,20885039,20885038,20885037,20885036,20885035,20882728,20882708,20882703,20882702,20869828,20869811,20869806,20869801,20869799,20869798,20869796,20869795,20869794,20869761,20869760,20869759,20868688,20868687,20850340,20847195,20841710,20833967,20827021,20825307,20825305,20825297,20824615,20824400,20823927,20821760,20795588,20794233,20794057,20793710,20785811,20781789,20781394,20781307,20762651,20758453,20758282,20757323,20756643,20756636,20756629,20756627,20756606,20756605,20756604,20756603,20756602,20756600,20756599,20756598,20756595,20756594,20756589,20756587,20756577,20756573,20748918,20748386,20748385,20748384,20748383,20748382,20748381,20748380,20748379,20748377,20748375,20748373,20743301,20717905,20717904,20717903,20717901,20717899);\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 353\nand sa.provider = 'salesforce';\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%modern world business solutions%'; # 345,275,12016, l.atkinson@mwbsolutions.co.uk\nSELECT * FROM activities WHERE uuid_to_bin('3921d399-3fef-4609-a291-b0097a166d43') = uuid;\n# id: 20940638, user: 12022, contact: 5305871\nSELECT * FROM activity_summary_logs WHERE activity_id = 20940638;\nselect * from contacts where team_id = 345 and crm_provider_id = '30891432415' order by name asc; # 5305871\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 345\nand sa.provider = 'hubspot';\n\nselect * from users where team_id = 345 and id = 12022;\nSELECT * FROM crm_profiles WHERE user_id = 12022;\nSELECT * FROM participants WHERE activity_id = 20940638;\nSELECT * FROM users u\nJOIN crm_profiles cp ON u.id = cp.user_id\nWHERE u.team_id = 345;\n\nselect * from contacts where team_id = 345 and crm_provider_id = '30880813535' order by name desc; # 5305871\n\nselect * from team_features where team_id = 345;\nSELECT * FROM activities WHERE uuid_to_bin('11701e2d-2f82-4dab-a616-1db4fad238df') = uuid; # 21115197\nSELECT * FROM participants WHERE activity_id = 20897406;\n\n\n\nSELECT * FROM activities WHERE uuid_to_bin('63ba55cd-1abc-447d-83da-0137000005b7') = uuid; # 20953912\nSELECT * FROM activities WHERE crm_configuration_id = 275 and provider = 'ringcentral' and title like '%1252629100%';\n\n\nSELECT * FROM activities WHERE id = 20946641;\nSELECT * FROM crm_profiles WHERE user_id = 10211;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Lunio%'; # 120,97,10984, triger@lunio.ai\nSELECT * FROM opportunities WHERE crm_configuration_id = 97 and crm_provider_id = '006N1000006c5PpIAI';\nselect * from stages where crm_configuration_id = 97 and type = 'opportunity';\nselect * from opportunities where team_id = 120;\n\n\nselect * from crm_configurations crm join teams t on crm.id = t.crm_id\nwhere 1=1\nAND t.current_billing_plan IS NOT NULL\nAND crm.auto_sync_activity = 0\nand crm.provider = 'hubspot';\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Exclaimer%'; # 270,205,10053,james.lewendon@exclaimer.com\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 270\nand sa.provider = 'salesforce';\nSELECT * FROM activities WHERE uuid_to_bin('b54df794-2a9a-4957-8d80-09a600ead5f8') = uuid; # 21637956\nSELECT * FROM crm_profiles WHERE user_id = 11446;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Cygnetise%'; # 372,300,12554, alex.chikly@cygnetise.com\nselect * from playbooks where team_id = 372;\nselect * from crm_fields where crm_configuration_id = 300 and object_type = 'event'; # 141340\nSELECT * FROM crm_field_values WHERE crm_field_id = 141340;\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 372\nand sa.provider = 'salesforce';\n\nselect * from crm_profiles where crm_configuration_id = 300;\nSELECT * FROM crm_configurations WHERE team_id = 372;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Planday%'; # 291,242,11501,mfa@planday.com\nSELECT * FROM opportunities WHERE team_id = 291 and crm_provider_id = '006bG000005DO86QAG'; # 3207756\nselect * from crm_field_data where object_id = 3207756;\nSELECT * FROM crm_fields WHERE id = 111834;\n\nselect f.id, f.crm_provider_id AS field_name, f.label, fd.object_id AS dealId, fd.value\nFROM crm_fields f\nJOIN crm_field_data fd ON f.id = fd.crm_field_id\nWHERE f.crm_configuration_id = 242\nAND f.object_type = 'opportunity'\nAND fd.object_id IN (3207756)\nORDER BY fd.object_id, fd.updated_at;\n\nSELECT * FROM crm_configurations WHERE auto_connect = 1;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Tour%'; # 187,209,8150,salesforce-admin@tourlane.com\nselect * from group_deal_risk_types drgt join groups g on drgt.group_id = g.id\nwhere g.team_id = 187;\n\nselect * from `groups` where team_id = 187;\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 187\nand sa.provider = 'salesforce';\n\n# Destination - 98870 - Destination__c\n# Stage - 79014 - StageName\n# Land Arrangement - 98856 - Land_Arrangement__c\n# Flight - 98848 - Flight__c\n# Last activity date - 98812 - LastActivityDate\n# Last modified date - 98809 - LastModifiedDate\n# Last inbound mail timestamp - 99151 - Last_Inbound_Mail_Timestamp__c\n# next call - 98864 - Next_Call__c\n\nselect * from crm_fields where crm_configuration_id = 209 and object_type = 'opportunity';\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 209;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 682;\n\nselect * from opportunities where team_id = 187 and name LIKE'%Muriel Sal%';\nselect * from opportunities where team_id = 187 and user_id = 9951 and is_closed = 0;\nselect * from activities where opportunity_id = 3538248;\n\nSELECT * FROM crm_profiles WHERE user_id = 8150;\n\nselect * from deal_risks where opportunity_id = 3538248;\n\nselect * from teams where crm_id IS NULL;\n\nSELECT opp.id AS opportunity_id,\n u.group_id AS group_id,\n MAX(\n CASE\n WHEN a.type IN (\"sms-inbound\", \"sms-outbound\") THEN a.created_at\n ELSE a.actual_end_time\n END) as last_date\nFROM opportunities opp\nleft join activities a on a.opportunity_id = opp.id\ninner join users u on opp.user_id = u.id\nwhere opp.user_id IN (9951)\n\nAND opp.is_closed = 0\nand a.status IN ('completed', 'received', 'delivered') OR a.status IS NULL\ngroup by opp.id;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Cybsafe%'; # 343,301,12008,polly.morphew@cybsafe.com\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 343\nand sa.provider = 'hubspot';\n\nSELECT * FROM crm_profiles WHERE crm_configuration_id = 301;\nSELECT * FROM contacts WHERE id = 6612363;\nSELECT * FROM accounts WHERE id = 4235676;\nSELECT * FROM opportunities WHERE crm_configuration_id = 301 and crm_provider_id = 32983784868;\nselect * from opportunity_stages where opportunity_id = 4503759;\n# SELECT * FROM opportunities WHERE id = 4569937;\n\nselect * from activities where crm_configuration_id = 301;\nSELECT * FROM activities WHERE uuid_to_bin('d3b2b28b-c3d0-4c2d-8ed0-eef42855278a') = uuid; # 26330370\nSELECT * FROM participants WHERE activity_id = 26330370;\n\nSELECT * FROM teams WHERE id = 375;\nselect * from playbooks where team_id = 375;\n\nselect * from stages where crm_configuration_id = 301 and type = 'opportunity';\n\nselect * from teams;\nselect * from contact_roles;\n\nSELECT * FROM opportunities WHERE team_id = 343 and user_id = 12871 and close_date >= '2024-11-01';\n\nselect * from users u join crm_profiles cp on cp.user_id = u.id where u.team_id = 343;\n\nSELECT * FROM crm_field_data WHERE object_id = 3771706;\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 343\nand sa.provider = 'hubspot';\n\nSELECT * FROM crm_fields WHERE crm_configuration_id = 301 and object_type = 'opportunity'\nand crm_provider_id LIKE \"%traffic_light%\";\nSELECT * FROM crm_field_values WHERE crm_field_id IN (144020,144048,144111,144113,144126,144481,144508,144531);\n\nSELECT fd.* FROM opportunities o\nJOIN crm_field_data fd ON o.id = fd.object_id\nWHERE o.team_id = 343\n# and o.user_id IS NOT NULL\nand fd.crm_field_id IN (144020,144048,144111,144113,144126,144481,144508,144531)\nand fd.value != ''\norder by value desc\n# group by o.id\n;\n\nSELECT * FROM opportunities WHERE id = 3769843;\n\nSELECT * FROM teams WHERE name LIKE '%Tour%'; # 187,209,8150, salesforce-admin@tourlane.com\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 209;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 682;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Funding Circle%'; # 220,177,8603,aswini.mishra@fundingcircle.com\nSELECT * FROM activities WHERE uuid_to_bin('7a40e99b-3b37-4bb1-b983-325b81801c01') = uuid; # 23139839\n\n\nSELECT * FROM opportunities WHERE id = 3855992;\n\nSELECT * FROM users WHERE name LIKE '%Angus Pollard%'; # 8988\n\nSELECT * FROM teams WHERE name LIKE '%Story Terrace%'; # 379, 307, 12894\nSELECT * FROM crm_fields WHERE crm_configuration_id = 307 and object_type != 'opportunity';\n\nselect * from contacts where team_id = 379 and name like '%bebro%'; # 5874411, crm: 77229348507\nSELECT * FROM crm_field_data WHERE object_id = 5874411;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 379\nand sa.provider = 'hubspot';\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%mentio%'; # 117, 94, 6371, nikhil.kumar@mention-me.com\nSELECT * FROM activities WHERE uuid_to_bin('82939311-1af0-4506-8546-21e8d1fdf2c1') = uuid;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Tourlane%'; # 187, 209, 8150, salesforce-admin@tourlane.com\nSELECT * FROM opportunities WHERE team_id = 187 and crm_provider_id = '006Se000008xfvNIAQ'; # 3537793\nselect * from generic_ai_prompts where subject_id = 3537793;\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Lunio%'; # 120, 97, 10984, triger@lunio.ai\nSELECT * FROM crm_configurations WHERE id = 97;\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 97;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 355;\nSELECT * FROM crm_fields WHERE id = 32682;\n\nselect cfd.value, o.* from opportunities o\njoin crm_field_data cfd on o.id = cfd.object_id and cfd.crm_field_id = 32682\nwhere team_id = 120\nand cfd.value != ''\n;\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 120\nand sa.provider = 'salesforce';\n\nselect * from opportunities where team_id = 120 and crm_provider_id = '006N1000007X8MAIA0';\nSELECT * FROM crm_field_data WHERE object_id = 2313439;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE id = 410;\nSELECT * FROM teams WHERE name LIKE '%Local Business Oxford%';\nselect * from scorecards where team_id = 410;\nselect * from scorecard_rules;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Funding%'; # 220, 177, 8603, aswini.mishra@fundingcircle.com\nselect * from activities a\njoin opportunities o on a.opportunity_id = o.id\njoin users u on o.user_id = u.id\nwhere a.crm_configuration_id = 177 and a.type LIKE '%email-out%'\n# and a.actual_end_time > '2024-12-16 00:00:00'\n# and o.remotely_created_at > '2024-12-01 00:00:00'\n# and u.group_id = 1014\nand u.id = 9021\norder by a.id desc;\nSELECT * FROM opportunities WHERE id in (3981384,4017346);\nSELECT * FROM users WHERE team_id = 220 and id IN (8775, 11435);\n\nselect * from users where id = 9021;\nselect * from inboxes where user_id = 9021;\n\nselect * from inbox_emails where inbox_id = 1349 and email_date > '2024-12-18 00:00:00';\n\nselect * from email_messages where team_id = 220\nand orig_date > '2024-12-16 00:00:00' and orig_date < '2024-12-19 00:00:00'\nand subject LIKE '%Personal%'\n# and 'from' = 'credit@fundingcircle.com'\n;\n\nselect * from activities a\njoin opportunities o on a.opportunity_id = o.id\nwhere a.user_id = 9021 and a.type LIKE '%email-out%'\nand a.actual_end_time > '2024-12-18 00:00:00'\nand o.user_id IS NOT NULL\nand o.remotely_created_at > '2024-12-01 00:00:00'\norder by a.id desc;\n\nSELECT * FROM opportunities WHERE team_id = 220 and name LIKE '%Right Car move Limited%' and id = 3966852;\nselect * from activities where crm_configuration_id = 177 and type LIKE '%email%' and opportunity_id = 3966852 order by id desc;\n\nselect * from team_settings where name IN ('useCloseDate');\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Hurree%'; # 104, 81, 6175, jfarrell@hurree.co\nSELECT * FROM opportunities WHERE team_id = 104 and name = 'PropOp';\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 104\nand sa.provider = 'hubspot';\n\nselect * from crm_configurations where last_synced_at > '2025-01-19 01:00:00'\nselect * from teams where crm_id IS NULL;\n\nselect t.name as 'team', u.name as 'owner', u.email, u.phone\nfrom teams t\njoin activity_providers ap on t.id = ap.team_id\njoin users u on t.owner_id = u.id\nwhere 1=1\n and t.status = 'active'\n and ap.is_enabled = 1\n# and u.status = 1\n and ap.provider = 'ms-teams';\n\nselect * from crm_configurations where provider = 'bullhorn'; # 344\nSELECT * FROM teams WHERE id = 442; # 14293\nselect * from users where team_id = 442;\nselect * from social_accounts sa where sa.sociable_id = 14293;\nselect * from invitations where team_id = 442;\n\n# ********************************************************************************************************\nSELECT * FROM users WHERE email LIKE '%nea.liikamaa@eletive.com%'; # 14022\nSELECT * FROM teams WHERE id = 429;\nselect * from opportunities where team_id = 429 and crm_provider_id IN (16157415775, 22246219645);\nselect * from activities where opportunity_id in (4340436,4353519);\n\nselect * from transcription where activity_id IN (25630961,25381771);\nselect * from generic_ai_prompts where subject_id IN (4353519);\n\nSELECT\n a.id as activity_id,\n a.opportunity_id,\n a.type as activity_type,\n a.language,\n CONCAT(a.title, a.description) AS mail_content,\n e.from AS mail_from,\n e.to AS mail_to,\n e.subject AS mail_subject,\n e.body AS mail_body,\n p.type as prompt_type,\n p.status as prompt_status,\n p.content AS prompt_content,\n a.actual_start_time as created_at\nFROM activities a\n LEFT JOIN ai_prompts p ON a.transcription_id = p.transcription_id AND p.deleted_at IS NULL\n LEFT JOIN email_messages e ON a.id = e.activity_id\nWHERE a.actual_start_time > '2024-01-01 00:00:00'\n AND a.opportunity_id IN (4353519)\n AND a.status IN ('completed', 'received', 'delivered')\n AND a.deleted_at IS NULL\n AND a.type NOT IN ('sms-inbound', 'sms-outbound')\nORDER BY a.opportunity_id ASC, a.id ASC;\n\nSELECT * FROM users WHERE name LIKE '%George Fierstone%'; # 14293\nSELECT * FROM teams WHERE id = 442;\nSELECT * FROM crm_configurations WHERE id = 344;\nselect * from team_features where team_id = 442;\nselect * from groups where team_id = 442;\nselect * from playbooks where team_id = 442;\nselect * from playbook_categories where playbook_id = 1729;\nselect * from crm_fields where crm_configuration_id = 344 and id = 172024;\nSELECT * FROM crm_field_values WHERE crm_field_id = 172024;\nselect * from crm_layouts where crm_configuration_id = 344;\nselect * from playbook_layouts where playbook_id = 1729;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Learning%'; # 260, 221, 9444\n\nselect s.*\n# , s.sent_at, u.name, a.*\nfrom activity_summary_logs s\ninner join activities a on a.id = s.activity_id\ninner join users u on u.id = a.user_id\nwhere a.crm_configuration_id = 356\nand s.sent_at > date_sub(now(), interval 60 day)\norder by a.actual_end_time desc;\n\nselect * from activities a\n# inner join activity_summary_logs s on s.activity_id = a.id\nwhere a.crm_configuration_id = 356 and a.actual_end_time > date_sub(now(), interval 60 day)\n# and a.crm_provider_id is not null\n# and provider <> 'ringcentral'\nand status = 'completed'\norder by a.actual_end_time desc;\n\nselect * from teams order by id desc; # 17328, 32, 17830, integration-account@jiminny.com\nSELECT * FROM users;\nSELECT * FROM users where team_id = 260 and status = 1; # 201 - 150 active\nSELECT * FROM teams WHERE id = 260;\nselect * from team_settings where team_id = 260;\nselect * from crm_configurations where team_id = 260;\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 356;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1184;\n\nselect * from accounts where crm_configuration_id = 221 order by id desc; # 7000\nselect * from leads where crm_configuration_id = 221 order by id desc; # 0\nselect * from contacts where crm_configuration_id = 221 order by id desc; # 200 000\nselect * from opportunities where crm_configuration_id = 221 order by id desc; # 0\nselect * from crm_profiles where crm_configuration_id = 221 order by id desc; # 23\nselect * from crm_fields where crm_configuration_id = 221;\nselect * from crm_field_values where crm_field_id = 5302 order by id desc;\nselect * from crm_layouts where crm_configuration_id = 221 order by id desc;\nselect * from stages where crm_configuration_id = 221 order by id desc;\n\nselect * from accounts where crm_configuration_id = 356 order by id desc; # 7000\nselect * from leads where crm_configuration_id = 356 order by id desc; # 0\nselect * from contacts where crm_configuration_id = 356 order by id desc; # 200 000\nselect * from opportunities where crm_configuration_id = 356 order by id desc; # 0\nselect * from crm_profiles where crm_configuration_id = 356 order by id desc; # 23\nselect * from crm_fields where crm_configuration_id = 356;\nselect * from crm_field_values where crm_field_id = 5302 order by id desc;\nselect * from crm_layouts where crm_configuration_id = 356 order by id desc;\nselect * from stages where crm_configuration_id = 356 order by id desc;\n\nselect * from playbooks where team_id = 260 order by id desc; # 4 (2 deleted)\nselect * from groups where team_id = 260 order by id desc; # 27 groups, (2 deleted)\nselect * from playbook_layouts where playbook_id IN (1410,1409,1276,1254); # 4\nselect ce.* from calendars c\njoin users u on c.user_id = u.id\njoin calendar_events ce on c.id = ce.calendar_id\nwhere u.team_id = 260\nand (ce.start_time > '2025-02-21 00:00:00')\n;\n# calendar events 1207\n#\n\nselect * from opportunities where team_id = 260;\nSELECT * FROM crm_field_data WHERE object_id = 4696496;\n\nselect * from activities where crm_configuration_id = 356 and crm_provider_id IS NOT NULL;\nselect * from activities where crm_configuration_id IN (221) and provider NOT IN ('ms-teams', 'uploader', 'zoom-bot')\n# and type = 'conference' and status = 'scheduled' and activities.is_internal = 0\nand created_at > '2024-03-01 00:00:00'\norder by id desc; # 880 000, ringcentral, avaya\nSELECT * FROM participants WHERE activity_id = 26371744;\n\n# all activities 942 000 +\n# conference 7385 - scheduled 984 - external 343\n\nselect * from activities where id = 26321812;\nselect * from participants where activity_id = 26321812;\nselect * from participants where activity_id in (26414510,26414514,26414516,26414604,26414653,26414655);\nselect * from leads where id in (720428,689175,731546,645866,621037);\n\nselect * from users where id = 13841;\nselect * from opportunities where user_id = 9541;\nselect * from stages where id = 15900;\n\nselect * from accounts where\n# id IN (4160055,5053725,4965303,4896434)\nid in (4584518,3249934,3218025,3891133,3399450,4172999,4485161,3101785,4587203,3070816,2870343,2870341,3563940,4550846,3424464,3249963,2870342)\n;\n\nselect * from activities where id = 26654935;\nSELECT * FROM opportunities WHERE id = 4803458;\n\nSELECT * FROM opportunities where team_id = 260 and user_id = 13841 AND stage_id = 15900;\nSELECT id, uuid, provider, type, lead_id, account_id, contact_id, opportunity_id, stage_id, status, recording_state, title, actual_start_time, actual_end_time\nFROM activities WHERE user_id = 13841 AND opportunity_id IN (4729783, 4731717, 4731726, 4732064, 4732849, 4803458, 4813213);\n\nSELECT DISTINCT\n o.id, o.stage_id, s.name, a.title,\n a.*\nFROM activities a\n# INNER JOIN tracks t ON a.id = t.activity_id\nINNER JOIN users u ON a.user_id = u.id\nINNER JOIN teams team ON u.team_id = team.id\nINNER JOIN groups g ON u.group_id = g.id\nINNER JOIN opportunities o ON a.opportunity_id = o.id\nINNER JOIN stages s ON o.stage_id = s.id\nWHERE\n a.crm_configuration_id = 356\n AND a.status IN ('completed', 'failed')\n AND a.recording_state != 'stopped'\n# and a.user_id = 13841\n AND u.uuid = uuid_to_bin('6f40e4b8-c340-4059-b4ac-1728e87ea99e')\n AND team.uuid = uuid_to_bin('a607fba7-452e-4683-b2af-00d6cb52c93c')\n AND g.uuid = uuid_to_bin('b5d69e40-24a0-4c16-810b-5fa462299f94')\n\n AND a.type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')\n# AND t.type IN ('audio', 'video')\n AND (\n (a.actual_start_time BETWEEN '2025-03-13 00:00:00' AND '2025-03-18 07:59:59')\n OR\n (\n a.actual_start_time IS NULL\n AND a.type IN ('sms-outbound', 'sms-inbound')\n AND a.created_at BETWEEN '2025-03-13 00:00:00' AND '2025-03-18 07:59:59'\n )\n )\n AND (\n a.is_private = 0\n OR (\n a.is_private = 1\n AND u.uuid = uuid_to_bin('6f40e4b8-c340-4059-b4ac-1728e87ea99e')\n )\n )\n AND (\n# s.id = 15900\n s.uuid = uuid_to_bin('04ca1c26-c666-4268-a129-419c0acffd73')\n OR s.uuid IS NULL -- Include records without opportunity stage\n )\n\nORDER BY a.actual_end_time DESC;\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Lead Forensics%'; # 190, 162, 8474, willsc@leadforensics.com\nSELECT * FROM users WHERE team_id = 190;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 190\nand sa.provider = 'hubspot';\n\nselect * from role_user where user_id = 8474;\n\nselect * from crm_configurations where provider = 'bullhorn';\n\nSELECT * FROM opportunities WHERE uuid_to_bin('94578249-65ec-4205-90f2-7d1a7d5ab64a') = uuid;\nSELECT * FROM users WHERE uuid_to_bin('26dbadeb-926f-4150-b11b-771b9d4c2f9a') = uuid;\n\nSELECT * FROM opportunities WHERE id = 4732493;\nselect * from activities where opportunity_id = 4732493;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE id = 443; # 358, 14315, andrea.romano@correrenaturale.com\nSELECT * FROM opportunities WHERE team_id = 443;\n\nSELECT a.id, a.type, a.user_id, a.status, a.deleted_at, u.name, u.email, u.team_id as activity_team_id, u.status, u.deleted_at, t.name, t.status, s.team_id as stage_team_id\nFROM activities AS a\nJOIN stages AS s ON a.stage_id = s.id\nJOIN users AS u ON u.id = a.user_id\nJOIN teams AS t ON t.id = s.team_id\nWHERE u.team_id <> s.team_id and t.id > 135;\n\n\nSELECT\n crm_configuration_id,\n crm_provider_id,\n COUNT(*) as duplicate_count,\n GROUP_CONCAT(id) as stage_ids,\n GROUP_CONCAT(name) as stage_names\nFROM stages\nGROUP BY crm_configuration_id, crm_provider_id\nHAVING COUNT(*) > 1\nORDER BY duplicate_count DESC;\n\nselect * from stages where id IN (14898,14907);\n\nselect * from business_processes;\n\nSELECT *\nFROM crm_configurations\nWHERE team_id IN (\n SELECT team_id\n FROM crm_configurations\n GROUP BY team_id\n HAVING COUNT(*) > 1\n)\nORDER BY team_id;\n\nSELECT *\nFROM teams\nWHERE crm_id IN (\n SELECT crm_id\n FROM teams\n GROUP BY crm_id\n HAVING COUNT(*) > 1\n)\nORDER BY crm_id;\n\n# ***************************************************************************\nselect * from crm_configurations where provider = 'integration-app';\nSELECT * FROM teams WHERE id = 443; # Correre Naturale 358 14315 andrea.romano@correrenaturale.com\nselect * from activities where crm_configuration_id = 358 order by actual_end_time desc;\nselect id, uuid, actual_end_time, crm_provider_id, is_internal, playbook_category_id, type, user_id, lead_id, contact_id, account_id, opportunity_id, status, title from activities where crm_configuration_id = 358 order by actual_end_time desc;\nselect * from team_features where team_id = 358;\nselect * from activity_summary_logs;\n\nselect * from teams where id = 406;\n\n# ************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Sportfive%'; # 267, 202, 14637, srv.salesforce@sportfive.com\nselect * from activities where crm_configuration_id = 202 order by actual_end_time desc;\n\nSELECT * FROM users where id = 14637;\nSELECT * FROM teams where id = 267;\nSELECT * FROM groups where id = 1118;\n\nselect g.name, a.title, uuid_from_bin(a.uuid), a.external_id, a.status, a.recording_state, a.recording_reason_code, a.scheduled_start_time, a.scheduled_end_time, a.actual_start_time, a.actual_end_time from activities a\ninner join users u on u.id = a.user_id\ninner join groups g on g.id = u.group_id\nwhere a.crm_configuration_id = 202\nand a.is_internal = 0\nand (a.scheduled_start_time between '2025-03-19 00:00:00' and '2025-03-21 00:00:00')\nand a.type = 'conference'\nand a.status != 'completed'\nand a.external_id is not null\norder by a.scheduled_start_time desc;\n\nSELECT * FROM activities\nWHERE crm_configuration_id = 202\n AND status IN ('completed', 'failed')\n AND recording_state != 'stopped'\n AND type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')\n AND (is_private = 0 OR user_id = 14637)\n AND (\n (\n actual_start_time BETWEEN '2025-03-12 12:00:00' AND '2025-03-24 11:59:59'\n ) OR (\n actual_start_time IS NULL\n AND type IN ('sms-outbound', 'sms-inbound')\n AND created_at BETWEEN '2025-03-12 12:00:00' AND '2025-03-24 11:59:59'\n )\n )\n AND NOT EXISTS (\n SELECT 1\n FROM tracks\n WHERE\n tracks.activity_id = activities.id\n AND tracks.type IN ('audio', 'video')\n )\nORDER BY actual_end_time DESC;\n\nSELECT DISTINCT\n a.*\nFROM activities a\nINNER JOIN tracks t ON a.id = t.activity_id\nINNER JOIN users u ON a.user_id = u.id\nINNER JOIN teams team ON u.team_id = team.id\nWHERE\n a.crm_configuration_id = 202\n AND a.status IN ('completed', 'failed')\n AND a.recording_state != 'stopped'\n# and a.user_id = 14637\n AND a.type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')\n# AND t.type IN ('audio', 'video')\n AND (\n (a.actual_start_time BETWEEN '2025-03-12 12:00:00' AND '2025-03-24 11:59:59')\n OR\n (\n a.actual_start_time IS NULL\n AND a.type IN ('sms-outbound', 'sms-inbound')\n AND a.created_at BETWEEN '2025-03-12 12:00:00' AND '2025-03-24 11:59:59'\n )\n )\n AND (\n a.is_private = 0\n OR (\n a.is_private = 1\n AND a.user_id = 14637\n )\n )\n\nORDER BY a.actual_end_time DESC\n;\n\nSELECT DISTINCT a.*\nFROM activities a\nINNER JOIN users u ON a.user_id = u.id\nINNER JOIN teams t ON u.team_id = t.id\n# INNER JOIN tracks tr ON a.id = tr.activity_id\n# INNER JOIN groups g ON u.group_id = g.id\nWHERE 1=1\n AND t.id = 267\n# AND t.uuid = uuid_to_bin('aed4927b-f1ea-499e-94c3-83762fd233e8')\n AND a.status IN ('completed', 'failed')\n AND a.recording_state != 'stopped'\n AND a.type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')\n# AND tr.type NOT IN ('audio', 'video')\n AND (\n a.is_private = 0\n OR a.user_id = 14637\n )\n AND (\n (a.actual_start_time BETWEEN '2025-03-19 00:00:00' AND '2025-03-21 23:59:59')\n OR (\n a.actual_start_time IS NULL\n AND a.type IN ('sms-outbound', 'sms-inbound')\n AND a.created_at BETWEEN '2025-03-19 00:00:00' AND '2025-03-21 23:59:59'\n )\n )\n# and NOT EXISTS (\n# SELECT 1\n# FROM tracks t\n# WHERE t.activity_id = a.id\n# AND t.type IN ('audio', 'video')\n# )\n\nORDER BY a.actual_end_time DESC;\n\nSELECT * FROM tracks WHERE activity_id = 26485995;\n\nselect a.is_private, a.title, uuid_from_bin(a.uuid), a.external_id, a.status, a.recording_state, a.recording_reason_code, a.scheduled_start_time, a.scheduled_end_time, a.actual_start_time, a.actual_end_time from activities a\ninner join users u on u.id = a.user_id\nwhere a.crm_configuration_id = 202\n# and a.is_internal = 0\nand (a.actual_start_time between '2025-03-19 00:00:00' and '2025-03-21 00:00:00')\nand a.type IN (\"softphone\",\"softphone-inbound\",\"conference\",\"sms-inbound\")\nand a.status IN ('completed', 'failed')\n# and a.external_id is not null\norder by a.actual_end_time desc;\n\nselect * from activities a where a.crm_configuration_id = 202\nand a.actual_start_time between '2025-03-20 00:00:00' and '2025-03-21 00:00:00'\n# AND a.type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')\n\nselect g.name, a.title, uuid_from_bin(a.uuid), a.external_id, a.status, a.recording_state, a.recording_reason_code, a.scheduled_start_time, a.scheduled_end_time, a.actual_start_time, a.actual_end_time from activities a\ninner join users u on u.id = a.user_id\ninner join groups g on g.id = u.group_id\nwhere a.crm_configuration_id = 202\nand a.is_internal = 0\nand (a.scheduled_start_time between '2025-03-19 00:00:00' and '2025-03-21 00:00:00')\nand a.type = 'conference'\nand a.status != 'completed'\nand a.external_id is not null\norder by a.scheduled_start_time desc;\n\nSELECT * FROM teams WHERE name LIKE '%Tourlane%';\nSELECT * FROM crm_fields WHERE crm_configuration_id = 209 and object_type = 'opportunity';\nSELECT * FROM crm_field_data WHERE crm_field_id = 98809;\n\nselect * from users where status = 1 AND timezone = 'MDT';\n\nselect * from opportunities where id = 3769814;\nselect * from deal_risks where opportunity_id = 3769814;\n\nselect cp.* from crm_profiles cp\njoin users u on cp.user_id = u.id\njoin crm_configurations crm on cp.crm_configuration_id = crm.id\nwhere crm.provider = 'hubspot' AND u.status = 1 AND log_notes != 'none';\n\nselect * from crm_fields where id = 154575;\n\nselect * from team_features where feature = 'SUPPORTS_SYNC_MISSING_CALL_DISPOSITIONS';\nSELECT * FROM teams WHERE id = 176; # crm 148\nselect * from activities where crm_configuration_id = 148 and provider = 'hubspot' order by id desc;\n\nselect * from activity_providers where provider = 'amazon-connect';\n\nselect * from crm_fields cf\njoin crm_configurations crm on crm.id = cf.crm_configuration_id\nwhere crm.provider = 'hubspot' and cf.object_type IN ('account', 'contact');\n\n# *********************************************************************************************\nSELECT * FROM users WHERE id IN (15415, 15418);\nSELECT * FROM groups WHERE id IN (1805,1806);\nSELECT * FROM playbooks WHERE id = 1860;\nSELECT * FROM playbook_categories WHERE id = 38634;\nSELECT * FROM crm_fields WHERE id = 189962;\n\nSELECT * FROM teams WHERE name = 'Pulsar Group'; # 472, 380, 15138 raza.gilani@vuelio.com\n\nSELECT * FROM crm_profiles WHERE user_id = 15415;\nSELECT * FROM social_accounts WHERE sociable_id = 15415 and provider = 'salesforce';\n\nselect * from sidekick_settings where team_id = 472;\n\nSELECT * FROM activities WHERE uuid_to_bin('452c58c7-b87c-4fdd-953e-d7af185e9588') = uuid; # 28617536, user: 15418\nSELECT * FROM activities WHERE uuid_to_bin('399114ee-d3a8-458c-bff5-5f654658db0a') = uuid; # 28344407, user: 15415\nSELECT * FROM activities WHERE uuid_to_bin('f0aa567f-0ab1-4bbb-96aa-37dcf184676b') = uuid; # 28580288, user: 15415\nSELECT * FROM activities WHERE uuid_to_bin('50c086b1-2770-4bca-b5ae-6bac22ec426b') = uuid; # 28566069, user: 15415\n\n# *********************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%TeamTailor%'; # 109, 218, 13969, salesforce-integrations@teamtailor.com\nselect * from crm_configurations where id = 218;\nSELECT * FROM activities WHERE uuid_to_bin('e39b5857-7fdb-4f5a-951a-8d3ca69bb1b0') = uuid; # 28338765\nSELECT * FROM users WHERE id IN (13232, 13230);\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 109\nand sa.provider = 'salesforce';\n\n0057R00000EPL5HQAX Inez Ekblad\n\n1091cb81-5ea1-4951-a0ed-f00b568f0140 Triman Kaur\n\nSELECT * FROM crm_profiles WHERE user_id IN (13232, 13230);\n\n############################################################################################\nSELECT * FROM activities WHERE uuid_to_bin('675eeaeb-5681-42db-90bc-54c07a604408') = uuid; # 28655939 00UVg00000FLvnSMAT\nSELECT * FROM crm_field_data WHERE activity_id = 28655939;\nSELECT * FROM crm_fields WHERE id IN (94491,94493,94498);\nSELECT * FROM users WHERE id = 13658;\nSELECT * FROM teams WHERE id = 109;\nSELECT * FROM crm_configurations WHERE id = 218;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 109\nand sa.provider = 'salesforce';\n\n# ********************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Strengthscope%'; # 481, 390, 15420, katy.holden@strengthscope.comk\nSELECT * FROM stages WHERE crm_configuration_id = 390;\nselect * from business_processes where team_id = 481 and crm_configuration_id = 390;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 481\nand sa.provider = 'salesforce';\n\n\nSELECT * FROM users WHERE id = 15780; # team 462\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 462\nand sa.provider = 'hubspot';\n\n\nselect * from teams where id = 495;\nSELECT * FROM users WHERE id = 15794;\nselect * from social_accounts where sociable_id = 15794;\n\n# ********************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Flight%'; # 427, 333, 13752\nSELECT * FROM accounts WHERE team_id = 427 and crm_provider_id = '668731000183444517';\n\n# ********************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Group GTI%'; # 495, 407, 15794\nSELECT * FROM activities WHERE crm_configuration_id = 407\nand status = 'completed' and type = 'conference'\norder by id desc;\n\nselect ru.*, pr.*, p.* from users u join role_user ru on ru.user_id = u.id\njoin permission_role pr on pr.role_id = ru.role_id\n join permissions p on p.id = pr.permission_id\nwhere team_id = 495 and p.name IN ('dial');\n\nselect * from permission_role;\n\nselect * from activities where crm_configuration_id = 407 and status = 'completed' order by id desc;\nSELECT * FROM activities WHERE id = 29512773;\nSELECT * FROM activities WHERE id IN (29042721,28991325,29002874);\n\nSELECT al.* from activity_summary_logs al join activities a on a.id = al.activity_id\nwhere a.crm_configuration_id = 407\n# and a.id IN (29042721,28991325,29002874);\n\nSELECT * FROM users WHERE id = 15794;\nSELECT * FROM users WHERE team_id = 495;\nSELECT * FROM social_accounts WHERE sociable_id = 15794;\nSELECT * FROM opportunities WHERE team_id = 495 and name like '%OC:%';\nSELECT * FROM contacts WHERE team_id = 495;\nSELECT * FROM leads WHERE team_id = 495;\nSELECT * FROM accounts WHERE team_id = 495;\nSELECT * FROM crm_profiles WHERE crm_configuration_id = 407;\nSELECT * FROM crm_fields WHERE crm_configuration_id = 407;\nSELECT * FROM crm_configurations WHERE id = 407;\nSELECT * FROM opportunities WHERE team_id = 495 and close_date BETWEEN '2025-06-01' AND '2025-07-01'\nand user_id IS NOT NULL and is_closed = 1 and is_won = 1;\n\n# ********************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Hamilton Court FX LLP%'; # 249, 187, 10103\nSELECT * FROM activities WHERE uuid_to_bin('4659c2bb-9a49-484e-9327-a3d66f1e028c') = uuid; # 28951064\nSELECT * FROM crm_fields WHERE crm_configuration_id = 187 and object_type IN ('tasks', 'event');\n\n# *********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Checkstep%'; # 325, 256, 11753\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 325\nand sa.provider = 'hubspot';\n\nSELECT * FROM activities WHERE uuid_to_bin('7be372e2-1916-4d79-a2f3-ca3db1346db3') = uuid; # 28611085\nSELECT * FROM activities WHERE uuid_to_bin('980f0336-840b-4185-a5a9-30cf8b0749a8') = uuid; # 28719733\nSELECT * FROM activity_summary_logs where activity_id = 28719733;\n\n# *************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Learning%'; # 260, 356, 9444\nSELECT * FROM activity_summary_logs where sent_at BETWEEN '2025-06-09 11:38:00' AND '2025-06-09 11:40:00';\nSELECT * FROM leads WHERE crm_configuration_id = 356 and crm_provider_id = '230045001502770504'; # 823630\nselect * from activities where crm_configuration_id = 356 and lead_id = 841732;\n\nSELECT * from activity_summary_logs al join activities a on a.id = al.activity_id\nwhere a.crm_configuration_id = 356;\n\nselect * from activities where crm_configuration_id = 356\nand actual_end_time between '2025-06-09 11:00:00' and '2025-06-09 12:00:00'\norder by id desc;\n\nselect * from accounts where crm_configuration_id = 356 and crm_provider_id = '230045001514403366' order by id desc;\nselect * from leads where crm_configuration_id = 356 and crm_provider_id = '230045001514275654' order by id desc;\nselect * from contacts where crm_configuration_id = 356 and crm_provider_id = '230045001514403366' order by id desc;\nselect * from opportunities where crm_configuration_id = 356 and crm_provider_id = '230045001514403366' order by id desc;\n\nselect * from team_features where team_id = 260;\nselect * from features where id IN (1,2,4,6,18,19,20,9,10,3,23,24,25,26,27);\n\nSELECT * FROM activities WHERE uuid_to_bin('7be372e2-1916-4d79-a2f3-ca3db1346db3') = uuid;\n\nselect * from crm_fields;\nselect * from crm_layout_entities;\n\nSELECT * FROM teams WHERE name LIKE '%Optable%';\n\n# *************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Teamtailor%'; # 109, 218, 13969\nSELECT * FROM crm_configurations WHERE id = 218;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 109\nand sa.provider = 'salesforce';\nSELECT * FROM activities WHERE uuid_to_bin('675eeaeb-5681-42db-90bc-54c07a604408') = uuid; # 28655939\nSELECT * FROM crm_field_data WHERE activity_id = 28655939;\nSELECT * FROM crm_fields WHERE id in (94491,94493,94498);\n\nselect * from teams where crm_id IS NULL;\n\nSELECT * FROM activities WHERE uuid_to_bin('71aa8a0c-9652-4ff6-bee7-d98ae60abef6') = uuid;\n\n# *************************************************************************************************\nselect * from team_domains where team_id = 399;\nSELECT * FROM teams WHERE name LIKE '%Rydoo%'; # 399, 318, 13207\n\nselect * from calendar_events where id = 5163781;\nSELECT * FROM activities WHERE uuid_to_bin('be2cbc52-7fda-46a0-9ae0-25d9553eafc0') = uuid; # 29443896\nSELECT * FROM participants WHERE activity_id = 29443896;\nselect * from contacts where crm_configuration_id = 318 and email = 'marianne.westeng@strawberry.no';\nselect * from leads where crm_configuration_id = 318 and email = 'marianne.westeng@strawberry.no';\n\nselect * from activities where user_id = 14937 order by created_at ;\n\nselect * from users where id = 14937;\n\nselect * from contacts where crm_configuration_id = 318 and email LIKE '%@strawberry.se';\nselect * from opportunities where crm_configuration_id = 318 and crm_provider_id = '006Sf00000D1WOAIA3';\n\nselect * from activities a join participants p on a.id = p.activity_id\nwhere crm_configuration_id = 318 and a.updated_at > '2025-06-23T08:18:43Z';\n\n# *************************************************************************************************\nSELECT * FROM opportunities WHERE team_id = 379 and crm_provider_id = '39334518886';\nSELECT * FROM opportunities WHERE team_id = 379 order by id desc;\nSELECT * FROM teams WHERE id = 379;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 379 and sociable_id = 13852\nand sa.provider = 'hubspot';\n\nSELECT * FROM crm_configurations WHERE id = 307;\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 307;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1027;\nSELECT * FROM crm_fields WHERE crm_configuration_id = 307\n and id IN (144750,144855,145158,155227);\n\nSELECT * FROM activities;\n\n\nselect * from activities\nwhere created_at > '2025-07-01 00:00:00'\n# and created_at < '2025-08-01 00:00:00'\nand type not in ('email-outbound', 'email-inbound')\nand account_id is null\nand contact_id is null\nand lead_id is null\nand opportunity_id is not null\n;\nSELECT * FROM activities WHERE id IN (25344155, 25344296, 25501909, 28692187);\nSELECT * FROM crm_configurations WHERE id in (335,301,200);\n\nselect * from crm_fields where crm_configuration_id = 230 and crm_provider_id = 'Age2__c';\n\nSELECT * FROM teams WHERE name LIKE '%Resights%';\nselect * from crm_fields where crm_configuration_id = 1 and object_type = 'opportunity';\n\nselect * from crm_configurations where provider = 'bullhorn'; # 344\nselect * from teams where id IN (442);\n\nselect * from activities\nwhere crm_configuration_id = 177\nand provider = 'amazon-connect'\n order by id desc;\n# and source <> 'gong';\n\nselect * from activity_providers where provider = 'amazon-connect';\n\nSELECT * FROM activities WHERE uuid_to_bin('cec1993b-a7e5-4164-b74d-d680ea51d2f2') = uuid;\n\n\nselect * from crm_configurations where store_transcript = 1;\nSELECT * FROM teams WHERE id IN (80);\n\n# *************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Sedna%'; # 277, 213, 12594\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 277\nand sa.provider = 'salesforce';\n\nselect * from activities where crm_configuration_id = 213 and account_id = 2511502;\n\nselect * from crm_configurations where id = 213;\n\nSELECT * FROM activities WHERE uuid_to_bin('35aa790a-8569-4544-8268-66f9a4a26804') = uuid; # 33981604\nSELECT * FROM participants WHERE activity_id = 33981604;\nSELECT * FROM crm_fields WHERE crm_configuration_id = 337 and object_type = 'task';\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 431\nand sa.provider = 'salesforce';\nSELECT * FROM activities WHERE uuid_to_bin('b5476c7d-19a8-491b-869d-676ea1e857b6') = uuid; # 33997223\nselect * from activity_summary_logs where activity_id = 33997223;\nselect * from activity_notes where activity_id = 33997223;\n\n# ***********************************\nSELECT * FROM teams WHERE name LIKE '%Abode%';\n\n\nselect * from features;\nselect * from teams t\nwhere t.status = 'active'\nand id NOT IN (select team_id from team_features where feature_id = 9)\n;\n\n\nselect * from playbook_layouts where playbook_id = 1725;\nSELECT * FROM activities WHERE uuid_to_bin('65cc283c-4849-49e6-927f-4c281c8fea19') = uuid; # 34297473\nselect * from teams where id = 318;\nselect * from crm_configurations where team_id = 318;\nselect * from playbooks where team_id = 318;\nSELECT * FROM crm_layouts where crm_configuration_id = 381;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1259;\nSELECT * FROM crm_fields WHERE id IN (192938,192936,192939);\n\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1266;\nSELECT * FROM crm_fields WHERE id IN (192980,192991,192997,192998,193064,193067);\n\nSELECT * FROM activities WHERE uuid_to_bin('a902289b-285c-48eb-9cc2-6ad6c5d938f5') = uuid; # 34297533\n\n\n\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 927;\nSELECT * FROM crm_fields WHERE id IN (131668,131669,131670,131671,131676,131797);\n\nSELECT * FROM teams WHERE name LIKE '%Peripass%'; # 351, 281, 12124\nselect * from crm_layouts where crm_configuration_id = 281;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 927;\nselect * from crm_fields where crm_configuration_id = 281 and id in (131668,131669,131670,131671,131676,131797);\nselect * from opportunities where crm_configuration_id = 281;\n\nSELECT * FROM activities WHERE id IN (34211315, 34130075);\nSELECT * FROM crm_field_data WHERE object_id IN (34211315, 34130075);\n\nselect cf.crm_configuration_id, cle.crm_layout_id, cle.id, cf.id from crm_field_data cfd\njoin crm_layout_entities cle on cle.id = cfd.crm_layout_entity_id\njoin crm_fields cf on cle.crm_field_id = cf.id\nwhere cf.deleted_at IS NOT NULL\nGROUP BY cle.id, cf.id;\n\nselect * from crm_layouts where id IN (355);\nselect u.email, t.crm_id, t.* from teams t\njoin users u on u.id = t.owner_id\nwhere crm_id IN (97);\n\nSELECT * FROM crm_fields WHERE id = 96492;\n\nselect * from permissions;\nselect * from permission_role where permission_id = 247;\nselect * from roles;\n\nselect * from migrations;\n# *****************************************************************\nSELECT * FROM activities WHERE uuid_to_bin('291e3c21-11cc-4728-aee7-6e4bedf86d72') = uuid; # 34262174\nSELECT * FROM crm_configurations WHERE id = 301;\nSELECT * FROM teams WHERE id = 343;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 343\nand sa.provider = 'hubspot';\n\nselect * from participants where activity_id = 34262174;\n\nselect * from contacts where crm_configuration_id = 301 and id = 6976326;\nselect * from accounts where crm_configuration_id = 301 and id IN (4647626, 4815829); # 30761335403\n\nselect * from activity_summary_logs where activity_id = 34262174;\n\nselect * from users where status = 1 AND timezone = 'EST';\n\n# ****************************************************************************\nSELECT * FROM users WHERE id = 13869;\nSELECT * FROM crm_configurations WHERE id = 320;\nSELECT * FROM teams WHERE id = 401;\n\nSELECT * FROM activities WHERE uuid_to_bin('2228c16f-10be-48d5-90d4-67385219dc01') = uuid; # 29670601\n\nSELECT * FROM accounts WHERE id = 7761483;\nSELECT * FROM opportunities WHERE id = 6051814;\n\nSELECT * FROM teams WHERE name LIKE '%Seedlegals%';\n\n;select * from opportunities where updated_at > '2025-10-11' AND crm_provider_id = '34713761166';\n\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 177;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 577;\nSELECT * FROM crm_fields WHERE id IN (68458,68459,68480,68497,68524,68530,68554,68618,68662,68781,68810,68898,68981,69049,97467);\n\nSELECT t.id, crm.id, t.name, crm.sync_objects, crm.provider, crm.last_synced_at FROM crm_configurations crm join teams t on t.crm_id = crm.id\nwhere t.status = 'active' AND crm.provider = 'hubspot' AND crm.last_synced_at < '2025-10-22 00:00:00';\n\nSELECT * FROM activities WHERE uuid_to_bin('fa09449f-cba9-496a-b8f3-865cd3c72351') = uuid;\nSELECT * FROM crm_configurations where id = 184;\nSELECT * FROM teams WHERE id = 246;\nSELECT * FROM social_accounts WHERE sociable_id = 9259 and provider = 'hubspot';\n\nSELECT * FROM users WHERE email LIKE '%rhian.old@bud.co.uk%'; # 17700\nSELECT * FROM teams WHERE id = 551;\n\nSELECT * FROM crm_configurations WHERE id = 471;\nSELECT * FROM activities WHERE crm_configuration_id = 471 and crm_provider_id IS NOT NULL;\nSELECT * FROM crm_fields WHERE crm_configuration_id = 471;\nSELECT * FROM crm_fields WHERE id = 307260;\nSELECT * FROM crm_field_values WHERE crm_field_id = 307260;\n\nselect * from crm_layouts where crm_configuration_id = 471;\n\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1547;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1548;\n\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 551 and sa.provider = 'hubspot';\n\nSELECT * FROM teams WHERE name LIKE '%$PCS%';\n\n# ********************************************************************************************************\nselect * from crm_configurations crm\njoin teams t on t.crm_id = crm.id\nwhere t.status = 'active'\nand crm.provider = 'hubspot';\n\n# $slug = 'HUBSPOT_WEBHOOK_SYNC';\n# $team = Jiminny\\Models\\Team::find(2);\n# $feature = Feature::query()->where('slug', $slug)->first();\n# TeamFeature::query()->create(['feature_id' => $feature->getId(),'team_id' => $team->getId()]);\n\n# hubspot_webhook_metrics\n\nselect * from crm_configurations where id = 331; # 416\nSELECT * FROM teams WHERE id = 416;\nSELECT * FROM opportunities WHERE team_id = 190;\n\nSELECT * FROM teams WHERE name LIKE '%Lead Forensics%';\nSELECT sa.id,\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 190 and sa.provider = 'hubspot';\n\n\n\nSELECT * FROM teams WHERE name LIKE '%Rapaport%'; # 431, 337\nSELECT * FROM teams where id = 431;\nSELECT * FROM crm_configurations where team_id = 431;\nSELECT * FROM activity_providers where team_id = 431;\nSELECT * FROM activities where crm_configuration_id = 337 and type IN ('softphone', 'softphone-outbound')\nand provider NOT IN ('hubspot', 'aircall')\n# and telephony_provider_id = '019c1131-a22f-4792-b9ea-20adf6a02ed0'\norder by id desc;\nSELECT sa.id,\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 431 and sa.provider = 'salesforce';\n\nSELECT * FROM teams WHERE name LIKE '%BiP%'; # 401, 320\nSELECT * FROM teams where id = 401;\nSELECT * FROM crm_configurations where team_id = 401;\nSELECT * FROM activity_providers where team_id = 401;\nSELECT * FROM activities where crm_configuration_id = 320 and type IN ('softphone', 'softphone-outbound')\nand provider NOT IN ('hubspot', 'aircall')\n# and telephony_provider_id = '019c1131-a22f-4792-b9ea-20adf6a02ed0'\norder by id desc;\nSELECT sa.id,\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 401 and sa.provider = 'salesforce';\n\n\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 307; # 379 - Story Terrace Inc , portalId: 3921157\nSELECT * FROM contacts WHERE team_id = 379 and updated_at > '2026-01-31 11:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 379 and updated_at > '2026-02-01 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 379 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 379 and sa.provider = 'hubspot';\n\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 485; # 563 - LATUS Group (ad94d501-5d09-44fd-878f-ca3a9f8865c3) , portalId: 3904501\nSELECT * FROM opportunities WHERE team_id = 563 and updated_at > '2026-02-02 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 563 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 338; # 432 - Formalize , portalId: 9214205\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 432 and sa.provider = 'hubspot';\nSELECT * FROM opportunities WHERE team_id = 432 and updated_at > '2026-02-02 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 432 and updated_at > '2026-02-10 00:00:00' order by updated_at desc;\n\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 436; # 519 - Moxso , portalId: 25531989\nSELECT * FROM opportunities WHERE team_id = 519 and updated_at > '2026-02-02 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 519 and updated_at > '2026-02-04 11:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 96; # 119 - Nourish Care , portalId: 26617984\nSELECT * FROM opportunities WHERE team_id = 119 and updated_at > '2026-02-02 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 119 and updated_at > '2026-02-04 11:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 331; # 416 - The National College , portalId: 7213852\nSELECT * FROM opportunities WHERE team_id = 416 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 416 and updated_at > '2026-02-04 11:00:00' order by updated_at desc;\n\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 308; # 380 - Foodles , portalId: 7723616\nSELECT * FROM opportunities WHERE team_id = 380 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 380 and updated_at > '2026-02-06 10:30:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 379; # 471 - imat-uve , portalId: 9177354\nSELECT * FROM opportunities WHERE team_id = 471 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 471 and updated_at > '2026-02-06 10:30:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 465; # 545 - Spotler , portalId: 144759271\nSELECT * FROM opportunities WHERE team_id = 545 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 545 and updated_at > '2026-02-06 10:30:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 455; # 537 - indevis , portalId: 25666868\nSELECT * FROM opportunities WHERE team_id = 537 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 537 and updated_at > '2026-02-06 10:30:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 200; # 265 - Jobadder , portalId: 6426676\nSELECT * FROM opportunities WHERE team_id = 265 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 265 and updated_at > '2026-02-06 10:30:00' order by updated_at desc;\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 335; # 429 - Eletive , portalId: 6110563\nSELECT * FROM opportunities WHERE team_id = 429 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 429 and updated_at > '2026-02-09 10:30:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 363; # 456 - Global Group , portalId: 8901981\nSELECT * FROM opportunities WHERE team_id = 456 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 456 and updated_at > '2026-02-09 10:30:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 297; # 369 - Unbiased , portalId: 9229005\nSELECT * FROM opportunities WHERE team_id = 369 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 369 and updated_at > '2026-02-09 10:30:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 353; # 449 - Fuuse , portalId: 25781745\nSELECT * FROM opportunities WHERE team_id = 449 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 449 and updated_at > '2026-02-09 10:30:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 487; # 566 - Nimbus , portalId: 39982590\nSELECT * FROM opportunities WHERE team_id = 566 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 566 and updated_at > '2026-02-09 10:30:00' order by updated_at desc;\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 487;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1630;\nselect * from crm_fields where crm_configuration_id = 487 and\n(uuid_to_bin('4c6b2971-64d4-45b8-b377-427be758b5a5') = uuid or uuid_to_bin('59e368d8-65a0-4b77-b611-db37c99fbe68') = uuid);\nSELECT * FROM crm_field_values WHERE crm_field_id = 375177;\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 420; # 506 - voiio , portalId: 145629154\nSELECT * FROM opportunities WHERE team_id = 506 and updated_at > '2026-02-10 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 506 and updated_at > '2026-02-10 15:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 479; # 558 - Momice , portalId: 535962\nSELECT * FROM opportunities WHERE team_id = 558 and updated_at > '2026-02-10 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 558 and updated_at > '2026-02-10 15:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 59; # 80 - Storyclash GmbH , portalId: 4268479\nSELECT * FROM opportunities WHERE team_id = 80 and updated_at > '2026-02-10 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 80 and updated_at > '2026-02-10 15:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 175; # 203 - Team iAM , portalId: 5534732\nSELECT * FROM opportunities WHERE team_id = 203 and updated_at > '2026-02-10 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 203 and updated_at > '2026-02-10 15:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 368; # 460 - OneTouch Health , portalId: 5534732183355\nSELECT * FROM opportunities WHERE team_id = 460 and updated_at > '2026-02-10 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 460 and updated_at > '2026-02-10 15:00:00' order by updated_at desc;\n\n\n\nselect * from users where id = 29643;\nSELECT * FROM crm_field_values WHERE crm_field_id = 375177;\n# ********************************************************************\nSELECT * FROM teams WHERE name LIKE '%Buynomics%'; # 462, 482, 14910\nSELECT * FROM activities WHERE crm_configuration_id = 482\nand type NOT IN ('email-inbound', 'email-outbound')\n# and description like '%The call focused on understanding Welch%'\norder by id desc;\n\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 462 and sa.provider = 'salesforce';\n\nselect * from contacts where crm_configuration_id = 482 and name = 'Cyndall Hill'; # 15504749\nselect * from contacts where id = 10891096; # 482\nSELECT * FROM activities WHERE crm_configuration_id = 482\nand type NOT IN ('email-inbound', 'email-outbound')\nand contact_id = 15504749\norder by id desc;\n\nselect * from activities where id = 36793003; # 96cc7bc1-8622-4d27-92f4-baf664fc1a56, 00UOf00000PDdOXMA1\nselect * from transcription where id = 7646782;\nselect * from ai_prompts where transcription_id = 7646782;\n\n# ********************************************************************\nSELECT * FROM activities WHERE uuid_to_bin('7a8471a3-847e-4822-802b-ddf426bbc252') = uuid; # 37370018\nSELECT * FROM activity_summary_logs WHERE activity_id = 37370018;\nSELECT * FROM teams WHERE id = 555;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 555 and sa.provider = 'hubspot';\n\n# ********************************************************************\nSELECT * FROM activities WHERE uuid_to_bin('7c17b8aa-09df-4f85-a0f7-51f47afd712d') = uuid; # 37395250\nSELECT * FROM activities WHERE uuid_to_bin('14d60388-260d-494b-aa0d-63fdb1c78026') = uuid; # 37395250\n\nSELECT a.* FROM activities a JOIN crm_configurations c on c.id = a.crm_configuration_id\nwhere a.type IN ('softphone', 'softphone-outbound') and c.provider = 'hubspot'\nand a.provider NOT IN ('hubspot')\n# and a.provider IN ('salesloft')\n# and c.id NOT IN (70)\n# and a.duration > 30\n# and actual_start_time > '2026-02-05 00:00:00'\norder by a.id desc;\n\nSELECT * FROM activities WHERE id = 37549787;\nSELECT * FROM crm_profiles WHERE user_id = 17613;\n\nSELECT * FROM crm_configurations WHERE id = 70;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 93 and sa.provider = 'hubspot';\n\nSELECT asf.activity_search_id, asf.id, asf.value\nFROM activity_search_filters asf\nWHERE asf.filter = 'group_id'\nAND asf.value IN (\n SELECT CONCAT(\n HEX(SUBSTR(uuid, 5, 4)), '-',\n HEX(SUBSTR(uuid, 3, 2)), '-',\n HEX(SUBSTR(uuid, 1, 2)), '-',\n HEX(SUBSTR(uuid, 9, 2)), '-',\n HEX(SUBSTR(uuid, 11))\n )\n FROM groups\n WHERE deleted_at IS NOT NULL\n);\n\nSELECT * FROM crm_configurations WHERE id = 373; # KPSBremen.de 465 # - no social account\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 465 and sa.provider = 'hubspot';\n\nselect * from crm_configurations where id = 494;\n\nSELECT * FROM teams WHERE name LIKE '%splose%'; # 572, 495, 18708\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 572 and sa.provider = 'pipedrive';\n\nselect * from opportunities where team_id = 572\n# and name like '%Onebright%'\n# and is_closed = 1 and is_won = 0\n order by id desc;\n\n\nselect * from users where deleted_at is null and status = 2;\n\nselect * from contacts where id = 17900517;\nselect * from accounts where id = 10109838;\nselect * from opportunities where id = 6955880;\n\nselect * from opportunity_contacts where opportunity_id = 6955880;\nselect * from opportunity_contacts where contact_id = 17900517;\n\nselect * from contact_roles cr join crm_configurations crm on cr.crm_configuration_id = crm.id\nwhere crm.provider != 'salesforce';\n\nSELECT * FROM activities WHERE uuid_to_bin('adcb8331-5988-4353-834e-383a355abba2') = uuid; # 38056424, crm 104659682404\nselect * from teams where id = 456;\nSELECT * FROM crm_configurations WHERE id = 363;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 456 and sa.provider = 'hubspot';\n\nselect * from crm_layouts where crm_configuration_id = 363;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id IN (1203, 1204, 1635);\nSELECT * FROM crm_fields WHERE id IN (181536, 181538, 213455);\n\nSELECT * FROM teams WHERE name LIKE '%Electric%'; # 342, 272, 12767\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 342 and sa.provider = 'pipedrive';\nSELECT * FROM opportunities WHERE crm_configuration_id = 272 and name like 'NORTHUMBRIA POL%'; # and updated_at > '2025-07-01 00:00:00';\nSELECT * FROM opportunities WHERE crm_configuration_id = 272 order by remotely_created_at asc; # and updated_at > '2025-07-01 00:00:00';\nSELECT * FROM opportunities WHERE crm_configuration_id = 272 and updated_at > '2026-01-01 00:00:00';\nSELECT * FROM crm_fields WHERE crm_configuration_id = 272 and object_type = 'opportunity';\nSELECT * FROM crm_field_values WHERE crm_field_id = 127164;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 342 and sa.provider = 'pipedrive';\n\nSELECT * FROM teams WHERE id = 472;\nSELECT * FROM crm_configurations WHERE id = 380;\nselect * from activities where id = 38285673; # 38285673\nSELECT * FROM users WHERE id = 16942;\nSELECT * FROM groups WHERE id = 1964;\nSELECT * FROM playbooks WHERE id = 2033;\n\nselect * from teams where created_at > '2026-03-09';\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 499; # 1065\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1678;\n\nSELECT * FROM teams WHERE id = 575;\nselect * from opportunities where team_id = 575;\n\nSELECT * FROM activities WHERE uuid_to_bin('96b1261f-2357-49f9-ab38-23ce12008ea0') = uuid;\n\nselect * from contacts c\nwhere c.crm_configuration_id = 370 order by c.updated_at desc;\n\nSELECT * FROM participants where activity_id = 38833541;\nSELECT * FROM participants where activity_id = 39216301;\nSELECT * FROM activity_summary_logs where activity_id = 39216301;\nSELECT * FROM activities WHERE uuid_to_bin('c7d99fbe-1fb1-41f2-8f4d-52e2bf70e1e9') = uuid; # 38833541, crm 478116564181\nSELECT * FROM activities WHERE uuid_to_bin('2e6ff4d3-9faa-447a-a8c1-9acde4d885ae') = uuid; # 39216301, crm 480171536586\nselect * from crm_profiles where crm_configuration_id = 319 and crm_provider_id = 525785080;\nselect * from opportunities where crm_configuration_id = 319 and crm_provider_id = 410150124747;\nselect * from accounts where crm_configuration_id = 319 and crm_provider_id = 47150650569;\nselect * from contacts where crm_configuration_id = 319 and crm_provider_id IN ('665587441856', '742723347700');\n# owner 13236 525785080\n# contact 1 16779180 665587441856 - activity - Alex Howes alex@supportroom.com created 2026-01-26\n# contact 2 19247563 742723347700 - ash@supportroom.com 2026-03-24\n# company 4176133 47150650569\n# deal 7100953 410150124747\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 400 and sa.provider = 'hubspot';\n\nselect * from features;\nselect * from team_features where feature_id = 40;\n\nselect * from teams where id = 556; # owner: 18101, crm: 477\nselect * from crm_configurations where id = 477;\nSELECT * FROM users WHERE id = 18101;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 556 and sa.provider = 'integration-app';\n\nselect * from opportunities where id = 7594349;\nselect * from opportunity_stages where opportunity_id = 7594349 order by created_at desc;\nselect * from business_processes where id = 6024;\nselect * from business_process_stages where stage_id = 16352;\nselect * from business_process_stages where business_process_id = 6024;\nselect * from stages where team_id = 459;\nselect * from teams where id = 459;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 459 and sa.provider = 'hubspot';\n\nSELECT os.stage_id, s.crm_provider_id, s.name, COUNT(*) as cnt\nFROM opportunity_stages os\nJOIN stages s ON s.id = os.stage_id\nWHERE os.opportunity_id = 7594349\nGROUP BY os.stage_id, s.crm_provider_id, s.name\nORDER BY cnt DESC;\n\nSELECT s.id, s.crm_provider_id, s.name, s.team_id, s.crm_configuration_id\nFROM stages s\nJOIN business_process_stages bps ON bps.stage_id = s.id\nWHERE bps.business_process_id = 6024\nAND s.crm_provider_id = 'contractsent';\n\nselect * from stages where id IN (16352,20612,18281,7344,16378,16309,5036,15223,14535,6293,12098,11607)\n\nSELECT * FROM teams WHERE name LIKE '%Pulsar Group%'; # 472, 380, 15138, raza.gilani@vuelio.com\nselect * from playbooks where team_id = 472; # event 226147\nSELECT * FROM playbook_categories WHERE playbook_id = 2288;\nSELECT * FROM crm_fields WHERE id = 226147;\nSELECT * FROM crm_field_values WHERE crm_field_id = 226147;\n\nSELECT * FROM crm_configurations WHERE id = 380;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 472 and sa.provider = 'salesforce';","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Project","depth":3,"role_description":"text"},{"role":"AXButton","text":"Project","depth":3,"bounds":{"left":0.011968086,"top":0.047885075,"width":0.024268618,"height":0.024740623},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"New File or Directory…","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Expand Selected","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Collapse All","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Options","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
-7588596953593251659
|
2146738724037637229
|
visual_change
|
accessibility
|
NULL
|
Project: faVsco.js, menu
#11894 on JY-18909-automa Project: faVsco.js, menu
#11894 on JY-18909-automated-reports-ask-jiminny, menu
Start Listening for PHP Debug Connections
AskJiminnyReportActivityServiceTest
Run 'AskJiminnyReportActivityServiceTest'
Debug 'AskJiminnyReportActivityServiceTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
3
3
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Tests\Unit\Services\Kiosk\AutomatedReports;
use Carbon\CarbonImmutable;
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\Services\Kiosk\AutomatedReports\AutomatedReportsService;
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);
}
public static function frequencyDateRangeProvider(): array
{
$now = CarbonImmutable::parse('2025-06-16 12:00:00');
return [
'daily' => [
AutomatedReportsService::FREQUENCY_DAILY,
$now->subDay()->startOfDay()->format('Y-m-d H:i:s'),
$now->subDay()->endOfDay()->format('Y-m-d H:i:s'),
],
'weekly' => [
AutomatedReportsService::FREQUENCY_WEEKLY,
$now->subWeek()->startOfWeek()->format('Y-m-d H:i:s'),
$now->subWeek()->endOfWeek()->format('Y-m-d H:i:s'),
],
'monthly' => [
AutomatedReportsService::FREQUENCY_MONTHLY,
$now->subMonthNoOverflow()->startOfMonth()->format('Y-m-d H:i:s'),
$now->subMonthNoOverflow()->endOfMonth()->format('Y-m-d H:i:s'),
],
'quarterly' => [
AutomatedReportsService::FREQUENCY_QUARTERLY,
$now->subQuarterNoOverflow()->startOfQuarter()->format('Y-m-d H:i:s'),
$now->subQuarterNoOverflow()->endOfQuarter()->format('Y-m-d H:i:s'),
],
];
}
/**
* @dataProvider frequencyDateRangeProvider
*/
public function testGetActivityIdsInjectsDateRangeForFrequency(
string $frequency,
string $expectedStartDate,
string $expectedEndDate,
): void {
CarbonImmutable::setTestNow('2025-06-16 12:00:00');
try {
$user = $this->makeUser();
$savedSearch = $this->makeSavedSearch([]);
$filterSet = $this->createMock(FilterDefinitionCollection::class);
$this->activitySearch->method('getArrayFilterKeys')->willReturn([]);
$this->logger->method('info');
$this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);
$capturedCriteria = null;
$this->activitySearch->expects($this->once())
->method('getOnDemandPageFilterSet')
->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {
$capturedCriteria = $criteria;
return $filterSet;
});
$this->service->getActivityIdsForSavedSearch($savedSearch, $user, $frequency);
$this->assertNotNull($capturedCriteria);
$this->assertSame($expectedStartDate, $capturedCriteria->getStartDate()->format('Y-m-d H:i:s'));
$this->assertSame($expectedEndDate, $capturedCriteria->getEndDate()->format('Y-m-d H:i:s'));
} finally {
CarbonImmutable::setTestNow();
}
}
public function testGetActivityIdsWithNullFrequencyDoesNotInjectDates(): void
{
$user = $this->makeUser();
$savedSearch = $this->makeSavedSearch([]);
$filterSet = $this->createMock(FilterDefinitionCollection::class);
$this->activitySearch->method('getArrayFilterKeys')->willReturn([]);
$this->logger->method('info');
$this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);
$capturedCriteria = null;
$this->activitySearch->expects($this->once())
->method('getOnDemandPageFilterSet')
->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {
$capturedCriteria = $criteria;
return $filterSet;
});
$this->service->getActivityIdsForSavedSearch($savedSearch, $user, null);
$this->assertNotNull($capturedCriteria);
$this->assertNull($capturedCriteria->getStartDate());
$this->assertNull($capturedCriteria->getEndDate());
}
public function testGetActivityIdsWithUnknownFrequencyDoesNotInjectDates(): void
{
$user = $this->makeUser();
$savedSearch = $this->makeSavedSearch([]);
$filterSet = $this->createMock(FilterDefinitionCollection::class);
$this->activitySearch->method('getArrayFilterKeys')->willReturn([]);
$this->logger->method('info');
$this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);
$capturedCriteria = null;
$this->activitySearch->expects($this->once())
->method('getOnDemandPageFilterSet')
->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {
$capturedCriteria = $criteria;
return $filterSet;
});
$this->service->getActivityIdsForSavedSearch($savedSearch, $user, AutomatedReportsService::FREQUENCY_ONE_OFF);
$this->assertNotNull($capturedCriteria);
$this->assertNull($capturedCriteria->getStartDate());
$this->assertNull($capturedCriteria->getEndDate());
}
public function testGetActivityIdsFrequencyDateRangeOverridesSavedSearchDateFilters(): void
{
CarbonImmutable::setTestNow('2025-06-16 12:00:00');
try {
$user = $this->makeUser();
$startDateFilter = $this->makeFilter(ActivityActualDate::PARAM_START_DATE, '2024-01-01 00:00:00');
$endDateFilter = $this->makeFilter(ActivityActualDate::PARAM_END_DATE, '2024-12-31 23:59:59');
$savedSearch = $this->makeSavedSearch([$startDateFilter, $endDateFilter]);
$filterSet = $this->createMock(FilterDefinitionCollection::class);
$this->activitySearch->method('getArrayFilterKeys')->willReturn([]);
$this->logger->method('info');
$this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);
$capturedCriteria = null;
$this->activitySearch->expects($this->once())
->method('getOnDemandPageFilterSet')
->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {
$capturedCriteria = $criteria;
return $filterSet;
});
$this->service->getActivityIdsForSavedSearch($savedSearch, $user, AutomatedReportsService::FREQUENCY_DAILY);
$this->assertNotNull($capturedCriteria);
$this->assertSame('2025-06-15 00:00:00', $capturedCriteria->getStartDate()->format('Y-m-d H:i:s'));
$this->assertSame('2025-06-15 23:59:59', $capturedCriteria->getEndDate()->format('Y-m-d H:i:s'));
} finally {
CarbonImmutable::setTestNow();
}
}
}
Execute
Explain Plan
Browse Query History
View Parameters
Open Query Execution Settings…
In-Editor Results
Tx: Auto
Cancel Running Statements
Playground
jiminny
Sync Changes
Hide This Notification
Code changed:
Hide
27
9
23
3
105
Previous Highlighted Error
Next Highlighted Error
SELECT * FROM team_features where team_id = 1;
SELECT * FROM teams WHERE name LIKE '%Vixio%'; # 340,270,11922
SELECT * FROM users WHERE team_id = 340; # 12015
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 340
and sa.provider = 'salesforce';
# and sa.provider = 'salesloft';
select * from crm_fields where crm_configuration_id = 270 and object_type = 'event';
# 125558 - Event Type - Event_Type__c
# 125552 - Event Status - Event_Status__c
SELECT * FROM sidekick_settings WHERE team_id = 340;
SELECT * FROM crm_field_values WHERE crm_field_id in (125552);
select * from activities where crm_configuration_id = 270
and type = 'conference' and crm_provider_id IS NOT NULL
and actual_start_time > '2024-09-16 09:00:00' order by scheduled_start_time;
SELECT * FROM activities WHERE id = 20871677;
SELECT * FROM crm_field_data WHERE activity_id = 20871677;
select * from crm_layouts where crm_configuration_id = 270;
select * from crm_layout_entities where crm_layout_id in (886,887);
SELECT * FROM crm_configurations WHERE id = 270;
select * from playbooks where team_id = 340; # 1514
select * from groups where team_id = 340;
SELECT * FROM crm_fields WHERE id IN (125393, 125401);
select g.name as 'team name', p.name as 'playbook name', f.label as 'activity type field' from groups g
join playbooks p on g.playbook_id = p.id
join crm_fields f on p.activity_field_id = f.id
where g.team_id = 340;
SELECT * FROM activities WHERE uuid_to_bin('0c180357-67d2-419e-a8c3-b832a3490770') = uuid; # 20448716
select * from crm_field_data where object_id = 20448716;
select * from activities where crm_configuration_id = 270 and provider = 'salesloft' order by id desc;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%CybSafe%'; # 343,273,12008
select * from opportunities where team_id = 343;
select * from opportunities where team_id = 343 and crm_provider_id = '18099102526';
select * from opportunities where team_id = 343 and account_id = 945217482;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 343
and sa.provider = 'hubspot';
select * from accounts where team_id = 343 order by name asc;
select * from stages where crm_configuration_id = 273 and type = 'opportunity';
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Voyado%'; # 353,283,12143
SELECT * FROM activities WHERE crm_configuration_id = 283 and account_id = 3777844 order by id desc;
SELECT * FROM accounts WHERE team_id = 353 AND name LIKE '%Salesloft%';
SELECT * FROM activities WHERE id = 20717903;
select * from participants where activity_id IN (20929172,20928605,20928468,20926272,20926271,20926270,20926269,20916499,20916454,20916436,20916435,20900015,20900014,20900013,20897312,20897243,20897241,20897237,20897232,20897229,20893648,20893231,20893230,20893229,20893228,20889784,20885039,20885038,20885037,20885036,20885035,20882728,20882708,20882703,20882702,20869828,20869811,20869806,20869801,20869799,20869798,20869796,20869795,20869794,20869761,20869760,20869759,20868688,20868687,20850340,20847195,20841710,20833967,20827021,20825307,20825305,20825297,20824615,20824400,20823927,20821760,20795588,20794233,20794057,20793710,20785811,20781789,20781394,20781307,20762651,20758453,20758282,20757323,20756643,20756636,20756629,20756627,20756606,20756605,20756604,20756603,20756602,20756600,20756599,20756598,20756595,20756594,20756589,20756587,20756577,20756573,20748918,20748386,20748385,20748384,20748383,20748382,20748381,20748380,20748379,20748377,20748375,20748373,20743301,20717905,20717904,20717903,20717901,20717899);
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 353
and sa.provider = 'salesforce';
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%modern world business solutions%'; # 345,275,12016, [EMAIL]
SELECT * FROM activities WHERE uuid_to_bin('3921d399-3fef-4609-a291-b0097a166d43') = uuid;
# id: 20940638, user: 12022, contact: 5305871
SELECT * FROM activity_summary_logs WHERE activity_id = 20940638;
select * from contacts where team_id = 345 and crm_provider_id = '30891432415' order by name asc; # 5305871
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 345
and sa.provider = 'hubspot';
select * from users where team_id = 345 and id = 12022;
SELECT * FROM crm_profiles WHERE user_id = 12022;
SELECT * FROM participants WHERE activity_id = 20940638;
SELECT * FROM users u
JOIN crm_profiles cp ON u.id = cp.user_id
WHERE u.team_id = 345;
select * from contacts where team_id = 345 and crm_provider_id = '30880813535' order by name desc; # 5305871
select * from team_features where team_id = 345;
SELECT * FROM activities WHERE uuid_to_bin('11701e2d-2f82-4dab-a616-1db4fad238df') = uuid; # 21115197
SELECT * FROM participants WHERE activity_id = 20897406;
SELECT * FROM activities WHERE uuid_to_bin('63ba55cd-1abc-447d-83da-0137000005b7') = uuid; # 20953912
SELECT * FROM activities WHERE crm_configuration_id = 275 and provider = 'ringcentral' and title like '%1252629100%';
SELECT * FROM activities WHERE id = 20946641;
SELECT * FROM crm_profiles WHERE user_id = 10211;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Lunio%'; # 120,97,10984, [EMAIL]
SELECT * FROM opportunities WHERE crm_configuration_id = 97 and crm_provider_id = '006N1000006c5PpIAI';
select * from stages where crm_configuration_id = 97 and type = 'opportunity';
select * from opportunities where team_id = 120;
select * from crm_configurations crm join teams t on crm.id = t.crm_id
where 1=1
AND t.current_billing_plan IS NOT NULL
AND crm.auto_sync_activity = 0
and crm.provider = 'hubspot';
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Exclaimer%'; # 270,205,10053,[EMAIL]
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 270
and sa.provider = 'salesforce';
SELECT * FROM activities WHERE uuid_to_bin('b54df794-2a9a-4957-8d80-09a600ead5f8') = uuid; # 21637956
SELECT * FROM crm_profiles WHERE user_id = 11446;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Cygnetise%'; # 372,300,12554, [EMAIL]
select * from playbooks where team_id = 372;
select * from crm_fields where crm_configuration_id = 300 and object_type = 'event'; # 141340
SELECT * FROM crm_field_values WHERE crm_field_id = 141340;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 372
and sa.provider = 'salesforce';
select * from crm_profiles where crm_configuration_id = 300;
SELECT * FROM crm_configurations WHERE team_id = 372;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Planday%'; # 291,242,11501,[EMAIL]
SELECT * FROM opportunities WHERE team_id = 291 and crm_provider_id = '006bG000005DO86QAG'; # 3207756
select * from crm_field_data where object_id = 3207756;
SELECT * FROM crm_fields WHERE id = 111834;
select f.id, f.crm_provider_id AS field_name, f.label, fd.object_id AS dealId, fd.value
FROM crm_fields f
JOIN crm_field_data fd ON f.id = fd.crm_field_id
WHERE f.crm_configuration_id = 242
AND f.object_type = 'opportunity'
AND fd.object_id IN (3207756)
ORDER BY fd.object_id, fd.updated_at;
SELECT * FROM crm_configurations WHERE auto_connect = 1;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Tour%'; # 187,209,8150,[EMAIL]
select * from group_deal_risk_types drgt join groups g on drgt.group_id = g.id
where g.team_id = 187;
select * from `groups` where team_id = 187;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 187
and sa.provider = 'salesforce';
# Destination - 98870 - Destination__c
# Stage - 79014 - StageName
# Land Arrangement - 98856 - Land_Arrangement__c
# Flight - 98848 - Flight__c
# Last activity date - 98812 - LastActivityDate
# Last modified date - 98809 - LastModifiedDate
# Last inbound mail timestamp - 99151 - Last_Inbound_Mail_Timestamp__c
# next call - 98864 - Next_Call__c
select * from crm_fields where crm_configuration_id = 209 and object_type = 'opportunity';
SELECT * FROM crm_layouts WHERE crm_configuration_id = 209;
SELECT * FROM crm_layout_entities WHERE crm_layout_id = 682;
select * from opportunities where team_id = 187 and name LIKE'%Muriel Sal%';
select * from opportunities where team_id = 187 and user_id = 9951 and is_closed = 0;
select * from activities where opportunity_id = 3538248;
SELECT * FROM crm_profiles WHERE user_id = 8150;
select * from deal_risks where opportunity_id = 3538248;
select * from teams where crm_id IS NULL;
SELECT opp.id AS opportunity_id,
u.group_id AS group_id,
MAX(
CASE
WHEN a.type IN ("sms-inbound", "sms-outbound") THEN a.created_at
ELSE a.actual_end_time
END) as last_date
FROM opportunities opp
left join activities a on a.opportunity_id = opp.id
inner join users u on opp.user_id = u.id
where opp.user_id IN (9951)
AND opp.is_closed = 0
and a.status IN ('completed', 'received', 'delivered') OR a.status IS NULL
group by opp.id;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Cybsafe%'; # 343,301,12008,[EMAIL]
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 343
and sa.provider = 'hubspot';
SELECT * FROM crm_profiles WHERE crm_configuration_id = 301;
SELECT * FROM contacts WHERE id = 6612363;
SELECT * FROM accounts WHERE id = 4235676;
SELECT * FROM opportunities WHERE crm_configuration_id = 301 and crm_provider_id = 32983784868;
select * from opportunity_stages where opportunity_id = 4503759;
# SELECT * FROM opportunities WHERE id = 4569937;
select * from activities where crm_configuration_id = 301;
SELECT * FROM activities WHERE uuid_to_bin('d3b2b28b-c3d0-4c2d-8ed0-eef42855278a') = uuid; # 26330370
SELECT * FROM participants WHERE activity_id = 26330370;
SELECT * FROM teams WHERE id = 375;
select * from playbooks where team_id = 375;
select * from stages where crm_configuration_id = 301 and type = 'opportunity';
select * from teams;
select * from contact_roles;
SELECT * FROM opportunities WHERE team_id = 343 and user_id = 12871 and close_date >= '2024-11-01';
select * from users u join crm_profiles cp on cp.user_id = u.id where u.team_id = 343;
SELECT * FROM crm_field_data WHERE object_id = 3771706;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 343
and sa.provider = 'hubspot';
SELECT * FROM crm_fields WHERE crm_configuration_id = 301 and object_type = 'opportunity'
and crm_provider_id LIKE "%traffic_light%";
SELECT * FROM crm_field_values WHERE crm_field_id IN (144020,144048,144111,144113,144126,144481,144508,144531);
SELECT fd.* FROM opportunities o
JOIN crm_field_data fd ON o.id = fd.object_id
WHERE o.team_id = 343
# and o.user_id IS NOT NULL
and fd.crm_field_id IN (144020,144048,144111,144113,144126,144481,144508,144531)
and fd.value != ''
order by value desc
# group by o.id
;
SELECT * FROM opportunities WHERE id = 3769843;
SELECT * FROM teams WHERE name LIKE '%Tour%'; # 187,209,8150, [EMAIL]
SELECT * FROM crm_layouts WHERE crm_configuration_id = 209;
SELECT * FROM crm_layout_entities WHERE crm_layout_id = 682;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Funding Circle%'; # 220,177,8603,[EMAIL]
SELECT * FROM activities WHERE uuid_to_bin('7a40e99b-3b37-4bb1-b983-325b81801c01') = uuid; # 23139839
SELECT * FROM opportunities WHERE id = 3855992;
SELECT * FROM users WHERE name LIKE '%Angus Pollard%'; # 8988
SELECT * FROM teams WHERE name LIKE '%Story Terrace%'; # 379, 307, 12894
SELECT * FROM crm_fields WHERE crm_configuration_id = 307 and object_type != 'opportunity';
select * from contacts where team_id = 379 and name like '%bebro%'; # 5874411, crm: 77229348507
SELECT * FROM crm_field_data WHERE object_id = 5874411;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 379
and sa.provider = 'hubspot';
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%mentio%'; # 117, 94, 6371, [EMAIL]
SELECT * FROM activities WHERE uuid_to_bin('82939311-1af0-4506-8546-21e8d1fdf2c1') = uuid;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Tourlane%'; # 187, 209, 8150, [EMAIL]
SELECT * FROM opportunities WHERE team_id = 187 and crm_provider_id = '006Se000008xfvNIAQ'; # 3537793
select * from generic_ai_prompts where subject_id = 3537793;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Lunio%'; # 120, 97, 10984, [EMAIL]
SELECT * FROM crm_configurations WHERE id = 97;
SELECT * FROM crm_layouts WHERE crm_configuration_id = 97;
SELECT * FROM crm_layout_entities WHERE crm_layout_id = 355;
SELECT * FROM crm_fields WHERE id = 32682;
select cfd.value, o.* from opportunities o
join crm_field_data cfd on o.id = cfd.object_id and cfd.crm_field_id = 32682
where team_id = 120
and cfd.value != ''
;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 120
and sa.provider = 'salesforce';
select * from opportunities where team_id = 120 and crm_provider_id = '006N1000007X8MAIA0';
SELECT * FROM crm_field_data WHERE object_id = 2313439;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE id = 410;
SELECT * FROM teams WHERE name LIKE '%Local Business Oxford%';
select * from scorecards where team_id = 410;
select * from scorecard_rules;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Funding%'; # 220, 177, 8603, [EMAIL]
select * from activities a
join opportunities o on a.opportunity_id = o.id
join users u on o.user_id = u.id
where a.crm_configuration_id = 177 and a.type LIKE '%email-out%'
# and a.actual_end_time > '2024-12-16 00:00:00'
# and o.remotely_created_at > '2024-12-01 00:00:00'
# and u.group_id = 1014
and u.id = 9021
order by a.id desc;
SELECT * FROM opportunities WHERE id in (3981384,4017346);
SELECT * FROM users WHERE team_id = 220 and id IN (8775, 11435);
select * from users where id = 9021;
select * from inboxes where user_id = 9021;
select * from inbox_emails where inbox_id = 1349 and email_date > '2024-12-18 00:00:00';
select * from email_messages where team_id = 220
and orig_date > '2024-12-16 00:00:00' and orig_date < '2024-12-19 00:00:00'
and subject LIKE '%Personal%'
# and 'from' = '[EMAIL]'
;
select * from activities a
join opportunities o on a.opportunity_id = o.id
where a.user_id = 9021 and a.type LIKE '%email-out%'
and a.actual_end_time > '2024-12-18 00:00:00'
and o.user_id IS NOT NULL
and o.remotely_created_at > '2024-12-01 00:00:00'
order by a.id desc;
SELECT * FROM opportunities WHERE team_id = 220 and name LIKE '%Right Car move Limited%' and id = 3966852;
select * from activities where crm_configuration_id = 177 and type LIKE '%email%' and opportunity_id = 3966852 order by id desc;
select * from team_settings where name IN ('useCloseDate');
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Hurree%'; # 104, 81, 6175, [EMAIL]
SELECT * FROM opportunities WHERE team_id = 104 and name = 'PropOp';
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 104
and sa.provider = 'hubspot';
select * from crm_configurations where last_synced_at > '2025-01-19 01:00:00'
select * from teams where crm_id IS NULL;
select t.name as 'team', u.name as 'owner', u.email, u.phone
from teams t
join activity_providers ap on t.id = ap.team_id
join users u on t.owner_id = u.id
where 1=1
and t.status = 'active'
and ap.is_enabled = 1
# and u.status = 1
and ap.provider = 'ms-teams';
select * from crm_configurations where provider = 'bullhorn'; # 344
SELECT * FROM teams WHERE id = 442; # 14293
select * from users where team_id = 442;
select * from social_accounts sa where sa.sociable_id = 14293;
select * from invitations where team_id = 442;
# [PASSWORD_DOTS]
SELECT * FROM users WHERE email LIKE '%[EMAIL]%'; # 14022
SELECT * FROM teams WHERE id = 429;
select * from opportunities where team_id = 429 and crm_provider_id IN (16157415775, 22246219645);
select * from activities where opportunity_id in (4340436,4353519);
select * from transcription where activity_id IN (25630961,25381771);
select * from generic_ai_prompts where subject_id IN (4353519);
SELECT
a.id as activity_id,
a.opportunity_id,
a.type as activity_type,
a.language,
CONCAT(a.title, a.description) AS mail_content,
e.from AS mail_from,
e.to AS mail_to,
e.subject AS mail_subject,
e.body AS mail_body,
p.type as prompt_type,
p.status as prompt_status,
p.content AS prompt_content,
a.actual_start_time as created_at
FROM activities a
LEFT JOIN ai_prompts p ON a.transcription_id = p.transcription_id AND p.deleted_at IS NULL
LEFT JOIN email_messages e ON a.id = e.activity_id
WHERE a.actual_start_time > '2024-01-01 00:00:00'
AND a.opportunity_id IN (4353519)
AND a.status IN ('completed', 'received', 'delivered')
AND a.deleted_at IS NULL
AND a.type NOT IN ('sms-inbound', 'sms-outbound')
ORDER BY a.opportunity_id ASC, a.id ASC;
SELECT * FROM users WHERE name LIKE '%George Fierstone%'; # 14293
SELECT * FROM teams WHERE id = 442;
SELECT * FROM crm_configurations WHERE id = 344;
select * from team_features where team_id = 442;
select * from groups where team_id = 442;
select * from playbooks where team_id = 442;
select * from playbook_categories where playbook_id = 1729;
select * from crm_fields where crm_configuration_id = 344 and id = 172024;
SELECT * FROM crm_field_values WHERE crm_field_id = 172024;
select * from crm_layouts where crm_configuration_id = 344;
select * from playbook_layouts where playbook_id = 1729;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Learning%'; # 260, 221, 9444
select s.*
# , s.sent_at, u.name, a.*
from activity_summary_logs s
inner join activities a on a.id = s.activity_id
inner join users u on u.id = a.user_id
where a.crm_configuration_id = 356
and s.sent_at > date_sub(now(), interval 60 day)
order by a.actual_end_time desc;
select * from activities a
# inner join activity_summary_logs s on s.activity_id = a.id
where a.crm_configuration_id = 356 and a.actual_end_time > date_sub(now(), interval 60 day)
# and a.crm_provider_id is not null
# and provider <> 'ringcentral'
and status = 'completed'
order by a.actual_end_time desc;
select * from teams order by id desc; # 17328, 32, 17830, [EMAIL]
SELECT * FROM users;
SELECT * FROM users where team_id = 260 and status = 1; # 201 - 150 active
SELECT * FROM teams WHERE id = 260;
select * from team_settings where team_id = 260;
select * from crm_configurations where team_id = 260;
SELECT * FROM crm_layouts WHERE crm_configuration_id = 356;
SELECT * FROM crm_layout_entities WHERE crm_layout_id = 1184;
select * from accounts where crm_configuration_id = 221 order by id desc; # 7000
select * from leads where crm_configuration_id = 221 order by id desc; # 0
select * from contacts where crm_configuration_id = 221 order by id desc; # 200 000
select * from opportunities where crm_configuration_id = 221 order by id desc; # 0
select * from crm_profiles where crm_configuration_id = 221 order by id desc; # 23
select * from crm_fields where crm_configuration_id = 221;
select * from crm_field_values where crm_field_id = 5302 order by id desc;
select * from crm_layouts where crm_configuration_id = 221 order by id desc;
select * from stages where crm_configuration_id = 221 order by id desc;
select * from accounts where crm_configuration_id = 356 order by id desc; # 7000
select * from leads where crm_configuration_id = 356 order by id desc; # 0
select * from contacts where crm_configuration_id = 356 order by id desc; # 200 000
select * from opportunities where crm_configuration_id = 356 order by id desc; # 0
select * from crm_profiles where crm_configuration_id = 356 order by id desc; # 23
select * from crm_fields where crm_configuration_id = 356;
select * from crm_field_values where crm_field_id = 5302 order by id desc;
select * from crm_layouts where crm_configuration_id = 356 order by id desc;
select * from stages where crm_configuration_id = 356 order by id desc;
select * from playbooks where team_id = 260 order by id desc; # 4 (2 deleted)
select * from groups where team_id = 260 order by id desc; # 27 groups, (2 deleted)
select * from playbook_layouts where playbook_id IN (1410,1409,1276,1254); # 4
select ce.* from calendars c
join users u on c.user_id = u.id
join calendar_events ce on c.id = ce.calendar_id
where u.team_id = 260
and (ce.start_time > '2025-02-21 00:00:00')
;
# calendar events 1207
#
select * from opportunities where team_id = 260;
SELECT * FROM crm_field_data WHERE object_id = 4696496;
select * from activities where crm_configuration_id = 356 and crm_provider_id IS NOT NULL;
select * from activities where crm_configuration_id IN (221) and provider NOT IN ('ms-teams', 'uploader', 'zoom-bot')
# and type = 'conference' and status = 'scheduled' and activities.is_internal = 0
and created_at > '2024-03-01 00:00:00'
order by id desc; # 880 000, ringcentral, avaya
SELECT * FROM participants WHERE activity_id = 26371744;
# all activities 942 000 +
# conference 7385 - scheduled 984 - external 343
select * from activities where id = 26321812;
select * from participants where activity_id = 26321812;
select * from participants where activity_id in (26414510,26414514,26414516,26414604,26414653,26414655);
select * from leads where id in (720428,689175,731546,645866,621037);
select * from users where id = 13841;
select * from opportunities where user_id = 9541;
select * from stages where id = 15900;
select * from accounts where
# id IN (4160055,5053725,4965303,4896434)
id in (4584518,3249934,3218025,3891133,3399450,4172999,4485161,3101785,4587203,3070816,2870343,2870341,3563940,4550846,3424464,3249963,2870342)
;
select * from activities where id = 26654935;
SELECT * FROM opportunities WHERE id = 4803458;
SELECT * FROM opportunities where team_id = 260 and user_id = 13841 AND stage_id = 15900;
SELECT id, uuid, provider, type, lead_id, account_id, contact_id, opportunity_id, stage_id, status, recording_state, title, actual_start_time, actual_end_time
FROM activities WHERE user_id = 13841 AND opportunity_id IN (4729783, 4731717, 4731726, 4732064, 4732849, 4803458, 4813213);
SELECT DISTINCT
o.id, o.stage_id, s.name, a.title,
a.*
FROM activities a
# INNER JOIN tracks t ON a.id = t.activity_id
INNER JOIN users u ON a.user_id = u.id
INNER JOIN teams team ON u.team_id = team.id
INNER JOIN groups g ON u.group_id = g.id
INNER JOIN opportunities o ON a.opportunity_id = o.id
INNER JOIN stages s ON o.stage_id = s.id
WHERE
a.crm_configuration_id = 356
AND a.status IN ('completed', 'failed')
AND a.recording_state != 'stopped'
# and a.user_id = 13841
AND u.uuid = uuid_to_bin('6f40e4b8-c340-4059-b4ac-1728e87ea99e')
AND team.uuid = uuid_to_bin('a607fba7-452e-4683-b2af-00d6cb52c93c')
AND g.uuid = uuid_to_bin('b5d69e40-24a0-4c16-810b-5fa462299f94')
AND a.type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')
# AND t.type IN ('audio', 'video')
AND (
(a.actual_start_time BETWEEN '2025-03-13 00:00:00' AND '2025-03-18 07:59:59')
OR
(
a.actual_start_time IS NULL
AND a.type IN ('sms-outbound', 'sms-inbound')
AND a.created_at BETWEEN '2025-03-13 00:00:00' AND '2025-03-18 07:59:59'
)
)
AND (
a.is_private = 0
OR (
a.is_private = 1
AND u.uuid = uuid_to_bin('6f40e4b8-c340-4059-b4ac-1728e87ea99e')
)
)
AND (
# s.id = 15900
s.uuid = uuid_to_bin('04ca1c26-c666-4268-a129-419c0acffd73')
OR s.uuid IS NULL -- Include records without opportunity stage
)
ORDER BY a.actual_end_time DESC;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Lead Forensics%'; # 190, 162, 8474, [EMAIL]
SELECT * FROM users WHERE team_id = 190;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 190
and sa.provider = 'hubspot';
select * from role_user where user_id = 8474;
select * from crm_configurations where provider = 'bullhorn';
SELECT * FROM opportunities WHERE uuid_to_bin('94578249-65ec-4205-90f2-7d1a7d5ab64a') = uuid;
SELECT * FROM users WHERE uuid_to_bin('26dbadeb-926f-4150-b11b-771b9d4c2f9a') = uuid;
SELECT * FROM opportunities WHERE id = 4732493;
select * from activities where opportunity_id = 4732493;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE id = 443; # 358, 14315, [EMAIL]
SELECT * FROM opportunities WHERE team_id = 443;
SELECT a.id, a.type, a.user_id, a.status, a.deleted_at, u.name, u.email, u.team_id as activity_team_id, u.status, u.deleted_at, t.name, t.status, s.team_id as stage_team_id
FROM activities AS a
JOIN stages AS s ON a.stage_id = s.id
JOIN users AS u ON u.id = a.user_id
JOIN teams AS t ON t.id = s.team_id
WHERE u.team_id <> s.team_id and t.id > 135;
SELECT
crm_configuration_id,
crm_provider_id,
COUNT(*) as duplicate_count,
GROUP_CONCAT(id) as stage_ids,
GROUP_CONCAT(name) as stage_names
FROM stages
GROUP BY crm_configuration_id, crm_provider_id
HAVING COUNT(*) > 1
ORDER BY duplicate_count DESC;
select * from stages where id IN (14898,14907);
select * from business_processes;
SELECT *
FROM crm_configurations
WHERE team_id IN (
SELECT team_id
FROM crm_configurations
GROUP BY team_id
HAVING COUNT(*) > 1
)
ORDER BY team_id;
SELECT *
FROM teams
WHERE crm_id IN (
SELECT crm_id
FROM teams
GROUP BY crm_id
HAVING COUNT(*) > 1
)
ORDER BY crm_id;
# [PASSWORD_DOTS]
select * from crm_configurations where provider = 'integration-app';
SELECT * FROM teams WHERE id = 443; # Correre Naturale 358 14315 [EMAIL]
select * from activities where crm_configuration_id = 358 order by actual_end_time desc;
select id, uuid, actual_end_time, crm_provider_id, is_internal, playbook_category_id, type, user_id, lead_id, contact_id, account_id, opportunity_id, status, title from activities where crm_configuration_id = 358 order by actual_end_time desc;
select * from team_features where team_id = 358;
select * from activity_summary_logs;
select * from teams where id = 406;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Sportfive%'; # 267, 202, 14637, [EMAIL]
select * from activities where crm_configuration_id = 202 order by actual_end_time desc;
SELECT * FROM users where id = 14637;
SELECT * FROM teams where id = 267;
SELECT * FROM groups where id = 1118;
select g.name, a.title, uuid_from_bin(a.uuid), a.external_id, a.status, a.recording_state, a.recording_reason_code, a.scheduled_start_time, a.scheduled_end_time, a.actual_start_time, a.actual_end_time from activities a
inner join users u on u.id = a.user_id
inner join groups g on g.id = u.group_id
where a.crm_configuration_id = 202
and a.is_internal = 0
and (a.scheduled_start_time between '2025-03-19 00:00:00' and '2025-03-21 00:00:00')
and a.type = 'conference'
and a.status != 'completed'
and a.external_id is not null
order by a.scheduled_start_time desc;
SELECT * FROM activities
WHERE crm_configuration_id = 202
AND status IN ('completed', 'failed')
AND recording_state != 'stopped'
AND type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')
AND (is_private = 0 OR user_id = 14637)
AND (
(
actual_start_time BETWEEN '2025-03-12 12:00:00' AND '2025-03-24 11:59:59'
) OR (
actual_start_time IS NULL
AND type IN ('sms-outbound', 'sms-inbound')
AND created_at BETWEEN '2025-03-12 12:00:00' AND '2025-03-24 11:59:59'
)
)
AND NOT EXISTS (
SELECT 1
FROM tracks
WHERE
tracks.activity_id = activities.id
AND tracks.type IN ('audio', 'video')
)
ORDER BY actual_end_time DESC;
SELECT DISTINCT
a.*
FROM activities a
INNER JOIN tracks t ON a.id = t.activity_id
INNER JOIN users u ON a.user_id = u.id
INNER JOIN teams team ON u.team_id = team.id
WHERE
a.crm_configuration_id = 202
AND a.status IN ('completed', 'failed')
AND a.recording_state != 'stopped'
# and a.user_id = 14637
AND a.type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')
# AND t.type IN ('audio', 'video')
AND (
(a.actual_start_time BETWEEN '2025-03-12 12:00:00' AND '2025-03-24 11:59:59')
OR
(
a.actual_start_time IS NULL
AND a.type IN ('sms-outbound', 'sms-inbound')
AND a.created_at BETWEEN '2025-03-12 12:00:00' AND '2025-03-24 11:59:59'
)
)
AND (
a.is_private = 0
OR (
a.is_private = 1
AND a.user_id = 14637
)
)
ORDER BY a.actual_end_time DESC
;
SELECT DISTINCT a.*
FROM activities a
INNER JOIN users u ON a.user_id = u.id
INNER JOIN teams t ON u.team_id = t.id
# INNER JOIN tracks tr ON a.id = tr.activity_id
# INNER JOIN groups g ON u.group_id = g.id
WHERE 1=1
AND t.id = 267
# AND t.uuid = uuid_to_bin('aed4927b-f1ea-499e-94c3-83762fd233e8')
AND a.status IN ('completed', 'failed')
AND a.recording_state != 'stopped'
AND a.type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')
# AND tr.type NOT IN ('audio', 'video')
AND (
a.is_private = 0
OR a.user_id = 14637
)
AND (
(a.actual_start_time BETWEEN '2025-03-19 00:00:00' AND '2025-03-21 23:59:59')
OR (
a.actual_start_time IS NULL
AND a.type IN ('sms-outbound', 'sms-inbound')
AND a.created_at BETWEEN '2025-03-19 00:00:00' AND '2025-03-21 23:59:59'
)
)
# and NOT EXISTS (
# SELECT 1
# FROM tracks t
# WHERE t.activity_id = a.id
# AND t.type IN ('audio', 'video')
# )
ORDER BY a.actual_end_time DESC;
SELECT * FROM tracks WHERE activity_id = 26485995;
select a.is_private, a.title, uuid_from_bin(a.uuid), a.external_id, a.status, a.recording_state, a.recording_reason_code, a.scheduled...
|
NULL
|
|
55724
|
NULL
|
0
|
2026-04-20T10:03:39.939415+00:00
|
/Users/lukas/.screenpipe/data/data/2026-04-20/1776 /Users/lukas/.screenpipe/data/data/2026-04-20/1776679419939_m1.jpg...
|
PhpStorm
|
faVsco.js – AskJiminnyReportActivityServiceTest.ph faVsco.js – AskJiminnyReportActivityServiceTest.php...
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
#11894 on JY-18909-automa Project: faVsco.js, menu
#11894 on JY-18909-automated-reports-ask-jiminny, menu
Start Listening for PHP Debug Connections
AskJiminnyReportActivityServiceTest
Run 'AskJiminnyReportActivityServiceTest'
Debug 'AskJiminnyReportActivityServiceTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
3
3
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Tests\Unit\Services\Kiosk\AutomatedReports;
use Carbon\CarbonImmutable;
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\Services\Kiosk\AutomatedReports\AutomatedReportsService;
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);
}
public static function frequencyDateRangeProvider(): array
{
$now = CarbonImmutable::parse('2025-06-16 12:00:00');
return [
'daily' => [
AutomatedReportsService::FREQUENCY_DAILY,
$now->subDay()->startOfDay()->format('Y-m-d H:i:s'),
$now->subDay()->endOfDay()->format('Y-m-d H:i:s'),
],
'weekly' => [
AutomatedReportsService::FREQUENCY_WEEKLY,
$now->subWeek()->startOfWeek()->format('Y-m-d H:i:s'),
$now->subWeek()->endOfWeek()->format('Y-m-d H:i:s'),
],
'monthly' => [
AutomatedReportsService::FREQUENCY_MONTHLY,
$now->subMonthNoOverflow()->startOfMonth()->format('Y-m-d H:i:s'),
$now->subMonthNoOverflow()->endOfMonth()->format('Y-m-d H:i:s'),
],
'quarterly' => [
AutomatedReportsService::FREQUENCY_QUARTERLY,
$now->subQuarterNoOverflow()->startOfQuarter()->format('Y-m-d H:i:s'),
$now->subQuarterNoOverflow()->endOfQuarter()->format('Y-m-d H:i:s'),
],
];
}
/**
* @dataProvider frequencyDateRangeProvider
*/
public function testGetActivityIdsInjectsDateRangeForFrequency(
string $frequency,
string $expectedStartDate,
string $expectedEndDate,
): void {
CarbonImmutable::setTestNow('2025-06-16 12:00:00');
try {
$user = $this->makeUser();
$savedSearch = $this->makeSavedSearch([]);
$filterSet = $this->createMock(FilterDefinitionCollection::class);
$this->activitySearch->method('getArrayFilterKeys')->willReturn([]);
$this->logger->method('info');
$this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);
$capturedCriteria = null;
$this->activitySearch->expects($this->once())
->method('getOnDemandPageFilterSet')
->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {
$capturedCriteria = $criteria;
return $filterSet;
});
$this->service->getActivityIdsForSavedSearch($savedSearch, $user, $frequency);
$this->assertNotNull($capturedCriteria);
$this->assertSame($expectedStartDate, $capturedCriteria->getStartDate()->format('Y-m-d H:i:s'));
$this->assertSame($expectedEndDate, $capturedCriteria->getEndDate()->format('Y-m-d H:i:s'));
} finally {
CarbonImmutable::setTestNow();
}
}
public function testGetActivityIdsWithNullFrequencyDoesNotInjectDates(): void
{
$user = $this->makeUser();
$savedSearch = $this->makeSavedSearch([]);
$filterSet = $this->createMock(FilterDefinitionCollection::class);
$this->activitySearch->method('getArrayFilterKeys')->willReturn([]);
$this->logger->method('info');
$this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);
$capturedCriteria = null;
$this->activitySearch->expects($this->once())
->method('getOnDemandPageFilterSet')
->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {
$capturedCriteria = $criteria;
return $filterSet;
});
$this->service->getActivityIdsForSavedSearch($savedSearch, $user, null);
$this->assertNotNull($capturedCriteria);
$this->assertNull($capturedCriteria->getStartDate());
$this->assertNull($capturedCriteria->getEndDate());
}
public function testGetActivityIdsWithUnknownFrequencyDoesNotInjectDates(): void
{
$user = $this->makeUser();
$savedSearch = $this->makeSavedSearch([]);
$filterSet = $this->createMock(FilterDefinitionCollection::class);
$this->activitySearch->method('getArrayFilterKeys')->willReturn([]);
$this->logger->method('info');
$this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);
$capturedCriteria = null;
$this->activitySearch->expects($this->once())
->method('getOnDemandPageFilterSet')
->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {
$capturedCriteria = $criteria;
return $filterSet;
});
$this->service->getActivityIdsForSavedSearch($savedSearch, $user, AutomatedReportsService::FREQUENCY_ONE_OFF);
$this->assertNotNull($capturedCriteria);
$this->assertNull($capturedCriteria->getStartDate());
$this->assertNull($capturedCriteria->getEndDate());
}
public function testGetActivityIdsFrequencyDateRangeOverridesSavedSearchDateFilters(): void
{
CarbonImmutable::setTestNow('2025-06-16 12:00:00');
try {
$user = $this->makeUser();
$startDateFilter = $this->makeFilter(ActivityActualDate::PARAM_START_DATE, '2024-01-01 00:00:00');
$endDateFilter = $this->makeFilter(ActivityActualDate::PARAM_END_DATE, '2024-12-31 23:59:59');
$savedSearch = $this->makeSavedSearch([$startDateFilter, $endDateFilter]);
$filterSet = $this->createMock(FilterDefinitionCollection::class);
$this->activitySearch->method('getArrayFilterKeys')->willReturn([]);
$this->logger->method('info');
$this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);
$capturedCriteria = null;
$this->activitySearch->expects($this->once())
->method('getOnDemandPageFilterSet')
->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {
$capturedCriteria = $criteria;
return $filterSet;
});
$this->service->getActivityIdsForSavedSearch($savedSearch, $user, AutomatedReportsService::FREQUENCY_DAILY);
$this->assertNotNull($capturedCriteria);
$this->assertSame('2025-06-15 00:00:00', $capturedCriteria->getStartDate()->format('Y-m-d H:i:s'));
$this->assertSame('2025-06-15 23:59:59', $capturedCriteria->getEndDate()->format('Y-m-d H:i:s'));
} finally {
CarbonImmutable::setTestNow();
}
}
}
Execute
Explain Plan
Browse Query History
View Parameters
Open Query Execution Settings…
In-Editor Results
Tx: Auto
Cancel Running Statements
Playground
jiminny
Sync Changes
Hide This Notification
Code changed:
Hide
27
9
23
3
105
Previous Highlighted Error
Next Highlighted Error
SELECT * FROM team_features where team_id = 1;
SELECT * FROM teams WHERE name LIKE '%Vixio%'; # 340,270,11922
SELECT * FROM users WHERE team_id = 340; # 12015
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 340
and sa.provider = 'salesforce';
# and sa.provider = 'salesloft';
select * from crm_fields where crm_configuration_id = 270 and object_type = 'event';
# 125558 - Event Type - Event_Type__c
# 125552 - Event Status - Event_Status__c
SELECT * FROM sidekick_settings WHERE team_id = 340;
SELECT * FROM crm_field_values WHERE crm_field_id in (125552);
select * from activities where crm_configuration_id = 270
and type = 'conference' and crm_provider_id IS NOT NULL
and actual_start_time > '2024-09-16 09:00:00' order by scheduled_start_time;
SELECT * FROM activities WHERE id = 20871677;
SELECT * FROM crm_field_data WHERE activity_id = 20871677;
select * from crm_layouts where crm_configuration_id = 270;
select * from crm_layout_entities where crm_layout_id in (886,887);
SELECT * FROM crm_configurations WHERE id = 270;
select * from playbooks where team_id = 340; # 1514
select * from groups where team_id = 340;
SELECT * FROM crm_fields WHERE id IN (125393, 125401);
select g.name as 'team name', p.name as 'playbook name', f.label as 'activity type field' from groups g
join playbooks p on g.playbook_id = p.id
join crm_fields f on p.activity_field_id = f.id
where g.team_id = 340;
SELECT * FROM activities WHERE uuid_to_bin('0c180357-67d2-419e-a8c3-b832a3490770') = uuid; # 20448716
select * from crm_field_data where object_id = 20448716;
select * from activities where crm_configuration_id = 270 and provider = 'salesloft' order by id desc;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%CybSafe%'; # 343,273,12008
select * from opportunities where team_id = 343;
select * from opportunities where team_id = 343 and crm_provider_id = '18099102526';
select * from opportunities where team_id = 343 and account_id = 945217482;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 343
and sa.provider = 'hubspot';
select * from accounts where team_id = 343 order by name asc;
select * from stages where crm_configuration_id = 273 and type = 'opportunity';
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Voyado%'; # 353,283,12143
SELECT * FROM activities WHERE crm_configuration_id = 283 and account_id = 3777844 order by id desc;
SELECT * FROM accounts WHERE team_id = 353 AND name LIKE '%Salesloft%';
SELECT * FROM activities WHERE id = 20717903;
select * from participants where activity_id IN (20929172,20928605,20928468,20926272,20926271,20926270,20926269,20916499,20916454,20916436,20916435,20900015,20900014,20900013,20897312,20897243,20897241,20897237,20897232,20897229,20893648,20893231,20893230,20893229,20893228,20889784,20885039,20885038,20885037,20885036,20885035,20882728,20882708,20882703,20882702,20869828,20869811,20869806,20869801,20869799,20869798,20869796,20869795,20869794,20869761,20869760,20869759,20868688,20868687,20850340,20847195,20841710,20833967,20827021,20825307,20825305,20825297,20824615,20824400,20823927,20821760,20795588,20794233,20794057,20793710,20785811,20781789,20781394,20781307,20762651,20758453,20758282,20757323,20756643,20756636,20756629,20756627,20756606,20756605,20756604,20756603,20756602,20756600,20756599,20756598,20756595,20756594,20756589,20756587,20756577,20756573,20748918,20748386,20748385,20748384,20748383,20748382,20748381,20748380,20748379,20748377,20748375,20748373,20743301,20717905,20717904,20717903,20717901,20717899);
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 353
and sa.provider = 'salesforce';
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%modern world business solutions%'; # 345,275,12016, [EMAIL]
SELECT * FROM activities WHERE uuid_to_bin('3921d399-3fef-4609-a291-b0097a166d43') = uuid;
# id: 20940638, user: 12022, contact: 5305871
SELECT * FROM activity_summary_logs WHERE activity_id = 20940638;
select * from contacts where team_id = 345 and crm_provider_id = '30891432415' order by name asc; # 5305871
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 345
and sa.provider = 'hubspot';
select * from users where team_id = 345 and id = 12022;
SELECT * FROM crm_profiles WHERE user_id = 12022;
SELECT * FROM participants WHERE activity_id = 20940638;
SELECT * FROM users u
JOIN crm_profiles cp ON u.id = cp.user_id
WHERE u.team_id = 345;
select * from contacts where team_id = 345 and crm_provider_id = '30880813535' order by name desc; # 5305871
select * from team_features where team_id = 345;
SELECT * FROM activities WHERE uuid_to_bin('11701e2d-2f82-4dab-a616-1db4fad238df') = uuid; # 21115197
SELECT * FROM participants WHERE activity_id = 20897406;
SELECT * FROM activities WHERE uuid_to_bin('63ba55cd-1abc-447d-83da-0137000005b7') = uuid; # 20953912
SELECT * FROM activities WHERE crm_configuration_id = 275 and provider = 'ringcentral' and title like '%1252629100%';
SELECT * FROM activities WHERE id = 20946641;
SELECT * FROM crm_profiles WHERE user_id = 10211;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Lunio%'; # 120,97,10984, [EMAIL]
SELECT * FROM opportunities WHERE crm_configuration_id = 97 and crm_provider_id = '006N1000006c5PpIAI';
select * from stages where crm_configuration_id = 97 and type = 'opportunity';
select * from opportunities where team_id = 120;
select * from crm_configurations crm join teams t on crm.id = t.crm_id
where 1=1
AND t.current_billing_plan IS NOT NULL
AND crm.auto_sync_activity = 0
and crm.provider = 'hubspot';
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Exclaimer%'; # 270,205,10053,[EMAIL]
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 270
and sa.provider = 'salesforce';
SELECT * FROM activities WHERE uuid_to_bin('b54df794-2a9a-4957-8d80-09a600ead5f8') = uuid; # 21637956
SELECT * FROM crm_profiles WHERE user_id = 11446;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Cygnetise%'; # 372,300,12554, [EMAIL]
select * from playbooks where team_id = 372;
select * from crm_fields where crm_configuration_id = 300 and object_type = 'event'; # 141340
SELECT * FROM crm_field_values WHERE crm_field_id = 141340;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 372
and sa.provider = 'salesforce';
select * from crm_profiles where crm_configuration_id = 300;
SELECT * FROM crm_configurations WHERE team_id = 372;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Planday%'; # 291,242,11501,[EMAIL]
SELECT * FROM opportunities WHERE team_id = 291 and crm_provider_id = '006bG000005DO86QAG'; # 3207756
select * from crm_field_data where object_id = 3207756;
SELECT * FROM crm_fields WHERE id = 111834;
select f.id, f.crm_provider_id AS field_name, f.label, fd.object_id AS dealId, fd.value
FROM crm_fields f
JOIN crm_field_data fd ON f.id = fd.crm_field_id
WHERE f.crm_configuration_id = 242
AND f.object_type = 'opportunity'
AND fd.object_id IN (3207756)
ORDER BY fd.object_id, fd.updated_at;
SELECT * FROM crm_configurations WHERE auto_connect = 1;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Tour%'; # 187,209,8150,[EMAIL]
select * from group_deal_risk_types drgt join groups g on drgt.group_id = g.id
where g.team_id = 187;
select * from `groups` where team_id = 187;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 187
and sa.provider = 'salesforce';
# Destination - 98870 - Destination__c
# Stage - 79014 - StageName
# Land Arrangement - 98856 - Land_Arrangement__c
# Flight - 98848 - Flight__c
# Last activity date - 98812 - LastActivityDate
# Last modified date - 98809 - LastModifiedDate
# Last inbound mail timestamp - 99151 - Last_Inbound_Mail_Timestamp__c
# next call - 98864 - Next_Call__c
select * from crm_fields where crm_configuration_id = 209 and object_type = 'opportunity';
SELECT * FROM crm_layouts WHERE crm_configuration_id = 209;
SELECT * FROM crm_layout_entities WHERE crm_layout_id = 682;
select * from opportunities where team_id = 187 and name LIKE'%Muriel Sal%';
select * from opportunities where team_id = 187 and user_id = 9951 and is_closed = 0;
select * from activities where opportunity_id = 3538248;
SELECT * FROM crm_profiles WHERE user_id = 8150;
select * from deal_risks where opportunity_id = 3538248;
select * from teams where crm_id IS NULL;
SELECT opp.id AS opportunity_id,
u.group_id AS group_id,
MAX(
CASE
WHEN a.type IN ("sms-inbound", "sms-outbound") THEN a.created_at
ELSE a.actual_end_time
END) as last_date
FROM opportunities opp
left join activities a on a.opportunity_id = opp.id
inner join users u on opp.user_id = u.id
where opp.user_id IN (9951)
AND opp.is_closed = 0
and a.status IN ('completed', 'received', 'delivered') OR a.status IS NULL
group by opp.id;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Cybsafe%'; # 343,301,12008,[EMAIL]
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 343
and sa.provider = 'hubspot';
SELECT * FROM crm_profiles WHERE crm_configuration_id = 301;
SELECT * FROM contacts WHERE id = 6612363;
SELECT * FROM accounts WHERE id = 4235676;
SELECT * FROM opportunities WHERE crm_configuration_id = 301 and crm_provider_id = 32983784868;
select * from opportunity_stages where opportunity_id = 4503759;
# SELECT * FROM opportunities WHERE id = 4569937;
select * from activities where crm_configuration_id = 301;
SELECT * FROM activities WHERE uuid_to_bin('d3b2b28b-c3d0-4c2d-8ed0-eef42855278a') = uuid; # 26330370
SELECT * FROM participants WHERE activity_id = 26330370;
SELECT * FROM teams WHERE id = 375;
select * from playbooks where team_id = 375;
select * from stages where crm_configuration_id = 301 and type = 'opportunity';
select * from teams;
select * from contact_roles;
SELECT * FROM opportunities WHERE team_id = 343 and user_id = 12871 and close_date >= '2024-11-01';
select * from users u join crm_profiles cp on cp.user_id = u.id where u.team_id = 343;
SELECT * FROM crm_field_data WHERE object_id = 3771706;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 343
and sa.provider = 'hubspot';
SELECT * FROM crm_fields WHERE crm_configuration_id = 301 and object_type = 'opportunity'
and crm_provider_id LIKE "%traffic_light%";
SELECT * FROM crm_field_values WHERE crm_field_id IN (144020,144048,144111,144113,144126,144481,144508,144531);
SELECT fd.* FROM opportunities o
JOIN crm_field_data fd ON o.id = fd.object_id
WHERE o.team_id = 343
# and o.user_id IS NOT NULL
and fd.crm_field_id IN (144020,144048,144111,144113,144126,144481,144508,144531)
and fd.value != ''
order by value desc
# group by o.id
;
SELECT * FROM opportunities WHERE id = 3769843;
SELECT * FROM teams WHERE name LIKE '%Tour%'; # 187,209,8150, [EMAIL]
SELECT * FROM crm_layouts WHERE crm_configuration_id = 209;
SELECT * FROM crm_layout_entities WHERE crm_layout_id = 682;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Funding Circle%'; # 220,177,8603,[EMAIL]
SELECT * FROM activities WHERE uuid_to_bin('7a40e99b-3b37-4bb1-b983-325b81801c01') = uuid; # 23139839
SELECT * FROM opportunities WHERE id = 3855992;
SELECT * FROM users WHERE name LIKE '%Angus Pollard%'; # 8988
SELECT * FROM teams WHERE name LIKE '%Story Terrace%'; # 379, 307, 12894
SELECT * FROM crm_fields WHERE crm_configuration_id = 307 and object_type != 'opportunity';
select * from contacts where team_id = 379 and name like '%bebro%'; # 5874411, crm: 77229348507
SELECT * FROM crm_field_data WHERE object_id = 5874411;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 379
and sa.provider = 'hubspot';
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%mentio%'; # 117, 94, 6371, [EMAIL]
SELECT * FROM activities WHERE uuid_to_bin('82939311-1af0-4506-8546-21e8d1fdf2c1') = uuid;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Tourlane%'; # 187, 209, 8150, [EMAIL]
SELECT * FROM opportunities WHERE team_id = 187 and crm_provider_id = '006Se000008xfvNIAQ'; # 3537793
select * from generic_ai_prompts where subject_id = 3537793;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Lunio%'; # 120, 97, 10984, [EMAIL]
SELECT * FROM crm_configurations WHERE id = 97;
SELECT * FROM crm_layouts WHERE crm_configuration_id = 97;
SELECT * FROM crm_layout_entities WHERE crm_layout_id = 355;
SELECT * FROM crm_fields WHERE id = 32682;
select cfd.value, o.* from opportunities o
join crm_field_data cfd on o.id = cfd.object_id and cfd.crm_field_id = 32682
where team_id = 120
and cfd.value != ''
;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 120
and sa.provider = 'salesforce';
select * from opportunities where team_id = 120 and crm_provider_id = '006N1000007X8MAIA0';
SELECT * FROM crm_field_data WHERE object_id = 2313439;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE id = 410;
SELECT * FROM teams WHERE name LIKE '%Local Business Oxford%';
select * from scorecards where team_id = 410;
select * from scorecard_rules;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Funding%'; # 220, 177, 8603, [EMAIL]
select * from activities a
join opportunities o on a.opportunity_id = o.id
join users u on o.user_id = u.id
where a.crm_configuration_id = 177 and a.type LIKE '%email-out%'
# and a.actual_end_time > '2024-12-16 00:00:00'
# and o.remotely_created_at > '2024-12-01 00:00:00'
# and u.group_id = 1014
and u.id = 9021
order by a.id desc;
SELECT * FROM opportunities WHERE id in (3981384,4017346);
SELECT * FROM users WHERE team_id = 220 and id IN (8775, 11435);
select * from users where id = 9021;
select * from inboxes where user_id = 9021;
select * from inbox_emails where inbox_id = 1349 and email_date > '2024-12-18 00:00:00';
select * from email_messages where team_id = 220
and orig_date > '2024-12-16 00:00:00' and orig_date < '2024-12-19 00:00:00'
and subject LIKE '%Personal%'
# and 'from' = '[EMAIL]'
;
select * from activities a
join opportunities o on a.opportunity_id = o.id
where a.user_id = 9021 and a.type LIKE '%email-out%'
and a.actual_end_time > '2024-12-18 00:00:00'
and o.user_id IS NOT NULL
and o.remotely_created_at > '2024-12-01 00:00:00'
order by a.id desc;
SELECT * FROM opportunities WHERE team_id = 220 and name LIKE '%Right Car move Limited%' and id = 3966852;
select * from activities where crm_configuration_id = 177 and type LIKE '%email%' and opportunity_id = 3966852 order by id desc;
select * from team_settings where name IN ('useCloseDate');
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Hurree%'; # 104, 81, 6175, [EMAIL]
SELECT * FROM opportunities WHERE team_id = 104 and name = 'PropOp';
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 104
and sa.provider = 'hubspot';
select * from crm_configurations where last_synced_at > '2025-01-19 01:00:00'
select * from teams where crm_id IS NULL;
select t.name as 'team', u.name as 'owner', u.email, u.phone
from teams t
join activity_providers ap on t.id = ap.team_id
join users u on t.owner_id = u.id
where 1=1
and t.status = 'active'
and ap.is_enabled = 1
# and u.status = 1
and ap.provider = 'ms-teams';
select * from crm_configurations where provider = 'bullhorn'; # 344
SELECT * FROM teams WHERE id = 442; # 14293
select * from users where team_id = 442;
select * from social_accounts sa where sa.sociable_id = 14293;
select * from invitations where team_id = 442;
# [PASSWORD_DOTS]
SELECT * FROM users WHERE email LIKE '%[EMAIL]%'; # 14022
SELECT * FROM teams WHERE id = 429;
select * from opportunities where team_id = 429 and crm_provider_id IN (16157415775, 22246219645);
select * from activities where opportunity_id in (4340436,4353519);
select * from transcription where activity_id IN (25630961,25381771);
select * from generic_ai_prompts where subject_id IN (4353519);
SELECT
a.id as activity_id,
a.opportunity_id,
a.type as activity_type,
a.language,
CONCAT(a.title, a.description) AS mail_content,
e.from AS mail_from,
e.to AS mail_to,
e.subject AS mail_subject,
e.body AS mail_body,
p.type as prompt_type,
p.status as prompt_status,
p.content AS prompt_content,
a.actual_start_time as created_at
FROM activities a
LEFT JOIN ai_prompts p ON a.transcription_id = p.transcription_id AND p.deleted_at IS NULL
LEFT JOIN email_messages e ON a.id = e.activity_id
WHERE a.actual_start_time > '2024-01-01 00:00:00'
AND a.opportunity_id IN (4353519)
AND a.status IN ('completed', 'received', 'delivered')
AND a.deleted_at IS NULL
AND a.type NOT IN ('sms-inbound', 'sms-outbound')
ORDER BY a.opportunity_id ASC, a.id ASC;
SELECT * FROM users WHERE name LIKE '%George Fierstone%'; # 14293
SELECT * FROM teams WHERE id = 442;
SELECT * FROM crm_configurations WHERE id = 344;
select * from team_features where team_id = 442;
select * from groups where team_id = 442;
select * from playbooks where team_id = 442;
select * from playbook_categories where playbook_id = 1729;
select * from crm_fields where crm_configuration_id = 344 and id = 172024;
SELECT * FROM crm_field_values WHERE crm_field_id = 172024;
select * from crm_layouts where crm_configuration_id = 344;
select * from playbook_layouts where playbook_id = 1729;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Learning%'; # 260, 221, 9444
select s.*
# , s.sent_at, u.name, a.*
from activity_summary_logs s
inner join activities a on a.id = s.activity_id
inner join users u on u.id = a.user_id
where a.crm_configuration_id = 356
and s.sent_at > date_sub(now(), interval 60 day)
order by a.actual_end_time desc;
select * from activities a
# inner join activity_summary_logs s on s.activity_id = a.id
where a.crm_configuration_id = 356 and a.actual_end_time > date_sub(now(), interval 60 day)
# and a.crm_provider_id is not null
# and provider <> 'ringcentral'
and status = 'completed'
order by a.actual_end_time desc;
select * from teams order by id desc; # 17328, 32, 17830, [EMAIL]
SELECT * FROM users;
SELECT * FROM users where team_id = 260 and status = 1; # 201 - 150 active
SELECT * FROM teams WHERE id = 260;
select * from team_settings where team_id = 260;
select * from crm_configurations where team_id = 260;
SELECT * FROM crm_layouts WHERE crm_configuration_id = 356;
SELECT * FROM crm_layout_entities WHERE crm_layout_id = 1184;
select * from accounts where crm_configuration_id = 221 order by id desc; # 7000
select * from leads where crm_configuration_id = 221 order by id desc; # 0
select * from contacts where crm_configuration_id = 221 order by id desc; # 200 000
select * from opportunities where crm_configuration_id = 221 order by id desc; # 0
select * from crm_profiles where crm_configuration_id = 221 order by id desc; # 23
select * from crm_fields where crm_configuration_id = 221;
select * from crm_field_values where crm_field_id = 5302 order by id desc;
select * from crm_layouts where crm_configuration_id = 221 order by id desc;
select * from stages where crm_configuration_id = 221 order by id desc;
select * from accounts where crm_configuration_id = 356 order by id desc; # 7000
select * from leads where crm_configuration_id = 356 order by id desc; # 0
select * from contacts where crm_configuration_id = 356 order by id desc; # 200 000
select * from opportunities where crm_configuration_id = 356 order by id desc; # 0
select * from crm_profiles where crm_configuration_id = 356 order by id desc; # 23
select * from crm_fields where crm_configuration_id = 356;
select * from crm_field_values where crm_field_id = 5302 order by id desc;
select * from crm_layouts where crm_configuration_id = 356 order by id desc;
select * from stages where crm_configuration_id = 356 order by id desc;
select * from playbooks where team_id = 260 order by id desc; # 4 (2 deleted)
select * from groups where team_id = 260 order by id desc; # 27 groups, (2 deleted)
select * from playbook_layouts where playbook_id IN (1410,1409,1276,1254); # 4
select ce.* from calendars c
join users u on c.user_id = u.id
join calendar_events ce on c.id = ce.calendar_id
where u.team_id = 260
and (ce.start_time > '2025-02-21 00:00:00')
;
# calendar events 1207
#
select * from opportunities where team_id = 260;
SELECT * FROM crm_field_data WHERE object_id = 4696496;
select * from activities where crm_configuration_id = 356 and crm_provider_id IS NOT NULL;
select * from activities where crm_configuration_id IN (221) and provider NOT IN ('ms-teams', 'uploader', 'zoom-bot')
# and type = 'conference' and status = 'scheduled' and activities.is_internal = 0
and created_at > '2024-03-01 00:00:00'
order by id desc; # 880 000, ringcentral, avaya
SELECT * FROM participants WHERE activity_id = 26371744;
# all activities 942 000 +
# conference 7385 - scheduled 984 - external 343
select * from activities where id = 26321812;
select * from participants where activity_id = 26321812;
select * from participants where activity_id in (26414510,26414514,26414516,26414604,26414653,26414655);
select * from leads where id in (720428,689175,731546,645866,621037);
select * from users where id = 13841;
select * from opportunities where user_id = 9541;
select * from stages where id = 15900;
select * from accounts where
# id IN (4160055,5053725,4965303,4896434)
id in (4584518,3249934,3218025,3891133,3399450,4172999,4485161,3101785,4587203,3070816,2870343,2870341,3563940,4550846,3424464,3249963,2870342)
;
select * from activities where id = 26654935;
SELECT * FROM opportunities WHERE id = 4803458;
SELECT * FROM opportunities where team_id = 260 and user_id = 13841 AND stage_id = 15900;
SELECT id, uuid, provider, type, lead_id, account_id, contact_id, opportunity_id, stage_id, status, recording_state, title, actual_start_time, actual_end_time
FROM activities WHERE user_id = 13841 AND opportunity_id IN (4729783, 4731717, 4731726, 4732064, 4732849, 4803458, 4813213);
SELECT DISTINCT
o.id, o.stage_id, s.name, a.title,
a.*
FROM activities a
# INNER JOIN tracks t ON a.id = t.activity_id
INNER JOIN users u ON a.user_id = u.id
INNER JOIN teams team ON u.team_id = team.id
INNER JOIN groups g ON u.group_id = g.id
INNER JOIN opportunities o ON a.opportunity_id = o.id
INNER JOIN stages s ON o.stage_id = s.id
WHERE
a.crm_configuration_id = 356
AND a.status IN ('completed', 'failed')
AND a.recording_state != 'stopped'
# and a.user_id = 13841
AND u.uuid = uuid_to_bin('6f40e4b8-c340-4059-b4ac-1728e87ea99e')
AND team.uuid = uuid_to_bin('a607fba7-452e-4683-b2af-00d6cb52c93c')
AND g.uuid = uuid_to_bin('b5d69e40-24a0-4c16-810b-5fa462299f94')
AND a.type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')
# AND t.type IN ('audio', 'video')
AND (
(a.actual_start_time BETWEEN '2025-03-13 00:00:00' AND '2025-03-18 07:59:59')
OR
(
a.actual_start_time IS NULL
AND a.type IN ('sms-outbound', 'sms-inbound')
AND a.created_at BETWEEN '2025-03-13 00:00:00' AND '2025-03-18 07:59:59'
)
)
AND (
a.is_private = 0
OR (
a.is_private = 1
AND u.uuid = uuid_to_bin('6f40e4b8-c340-4059-b4ac-1728e87ea99e')
)
)
AND (
# s.id = 15900
s.uuid = uuid_to_bin('04ca1c26-c666-4268-a129-419c0acffd73')
OR s.uuid IS NULL -- Include records without opportunity stage
)
ORDER BY a.actual_end_time DESC;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Lead Forensics%'; # 190, 162, 8474, [EMAIL]
SELECT * FROM users WHERE team_id = 190;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 190
and sa.provider = 'hubspot';
select * from role_user where user_id = 8474;
select * from crm_configurations where provider = 'bullhorn';
SELECT * FROM opportunities WHERE uuid_to_bin('94578249-65ec-4205-90f2-7d1a7d5ab64a') = uuid;
SELECT * FROM users WHERE uuid_to_bin('26dbadeb-926f-4150-b11b-771b9d4c2f9a') = uuid;
SELECT * FROM opportunities WHERE id = 4732493;
select * from activities where opportunity_id = 4732493;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE id = 443; # 358, 14315, [EMAIL]
SELECT * FROM opportunities WHERE team_id = 443;
SELECT a.id, a.type, a.user_id, a.status, a.deleted_at, u.name, u.email, u.team_id as activity_team_id, u.status, u.deleted_at, t.name, t.status, s.team_id as stage_team_id
FROM activities AS a
JOIN stages AS s ON a.stage_id = s.id
JOIN users AS u ON u.id = a.user_id
JOIN teams AS t ON t.id = s.team_id
WHERE u.team_id <> s.team_id and t.id > 135;
SELECT
crm_configuration_id,
crm_provider_id,
COUNT(*) as duplicate_count,
GROUP_CONCAT(id) as stage_ids,
GROUP_CONCAT(name) as stage_names
FROM stages
GROUP BY crm_configuration_id, crm_provider_id
HAVING COUNT(*) > 1
ORDER BY duplicate_count DESC;
select * from stages where id IN (14898,14907);
select * from business_processes;
SELECT *
FROM crm_configurations
WHERE team_id IN (
SELECT team_id
FROM crm_configurations
GROUP BY team_id
HAVING COUNT(*) > 1
)
ORDER BY team_id;
SELECT *
FROM teams
WHERE crm_id IN (
SELECT crm_id
FROM teams
GROUP BY crm_id
HAVING COUNT(*) > 1
)
ORDER BY crm_id;
# [PASSWORD_DOTS]
select * from crm_configurations where provider = 'integration-app';
SELECT * FROM teams WHERE id = 443; # Correre Naturale 358 14315 [EMAIL]
select * from activities where crm_configuration_id = 358 order by actual_end_time desc;
select id, uuid, actual_end_time, crm_provider_id, is_internal, playbook_category_id, type, user_id, lead_id, contact_id, account_id, opportunity_id, status, title from activities where crm_configuration_id = 358 order by actual_end_time desc;
select * from team_features where team_id = 358;
select * from activity_summary_logs;
select * from teams where id = 406;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Sportfive%'; # 267, 202, 14637, [EMAIL]
select * from activities where crm_configuration_id = 202 order by actual_end_time desc;
SELECT * FROM users where id = 14637;
SELECT * FROM teams where id = 267;
SELECT * FROM groups where id = 1118;
select g.name, a.title, uuid_from_bin(a.uuid), a.external_id, a.status, a.recording_state, a.recording_reason_code, a.scheduled_start_time, a.scheduled_end_time, a.actual_start_time, a.actual_end_time from activities a
inner join users u on u.id = a.user_id
inner join groups g on g.id = u.group_id
where a.crm_configuration_id = 202
and a.is_internal = 0
and (a.scheduled_start_time between '2025-03-19 00:00:00' and '2025-03-21 00:00:00')
and a.type = 'conference'
and a.status != 'completed'
and a.external_id is not null
order by a.scheduled_start_time desc;
SELECT * FROM activities
WHERE crm_configuration_id = 202
AND status IN ('completed', 'failed')
AND recording_state != 'stopped'
AND type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')
AND (is_private = 0 OR user_id = 14637)
AND (
(
actual_start_time BETWEEN '2025-03-12 12:00:00' AND '2025-03-24 11:59:59'
) OR (
actual_start_time IS NULL
AND type IN ('sms-outbound', 'sms-inbound')
AND created_at BETWEEN '2025-03-12 12:00:00' AND '2025-03-24 11:59:59'
)
)
AND NOT EXISTS (
SELECT 1
FROM tracks
WHERE
tracks.activity_id = activities.id
AND tracks.type IN ('audio', 'video')
)
ORDER BY actual_end_time DESC;
SELECT DISTINCT
a.*
FROM activities a
INNER JOIN tracks t ON a.id = t.activity_id
INNER JOIN users u ON a.user_id = u.id
INNER JOIN teams team ON u.team_id = team.id
WHERE
a.crm_configuration_id = 202
AND a.status IN ('completed', 'failed')
AND a.recording_state != 'stopped'
# and a.user_id = 14637
AND a.type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')
# AND t.type IN ('audio', 'video')
AND (
(a.actual_start_time BETWEEN '2025-03-12 12:00:00' AND '2025-03-24 11:59:59')
OR
(
a.actual_start_time IS NULL
AND a.type IN ('sms-outbound', 'sms-inbound')
AND a.created_at BETWEEN '2025-03-12 12:00:00' AND '2025-03-24 11:59:59'
)
)
AND (
a.is_private = 0
OR (
a.is_private = 1
AND a.user_id = 14637
)
)
ORDER BY a.actual_end_time DESC
;
SELECT DISTINCT a.*
FROM activities a
INNER JOIN users u ON a.user_id = u.id
INNER JOIN teams t ON u.team_id = t.id
# INNER JOIN tracks tr ON a.id = tr.activity_id
# INNER JOIN groups g ON u.group_id = g.id
WHERE 1=1
AND t.id = 267
# AND t.uuid = uuid_to_bin('aed4927b-f1ea-499e-94c3-83762fd233e8')
AND a.status IN ('completed', 'failed')
AND a.recording_state != 'stopped'
AND a.type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')
# AND tr.type NOT IN ('audio', 'video')
AND (
a.is_private = 0
OR a.user_id = 14637
)
AND (
(a.actual_start_time BETWEEN '2025-03-19 00:00:00' AND '2025-03-21 23:59:59')
OR (
a.actual_start_time IS NULL
AND a.type IN ('sms-outbound', 'sms-inbound')
AND a.created_at BETWEEN '2025-03-19 00:00:00' AND '2025-03-21 23:59:59'
)
)
# and NOT EXISTS (
# SELECT 1
# FROM tracks t
# WHERE t.activity_id = a.id
# AND t.type IN ('audio', 'video')
# )
ORDER BY a.actual_end_time DESC;
SELECT * FROM tracks WHERE activity_id = 26485995;
select a.is_private, a.title, uuid_from_bin(a.uuid), a.external_id, a.status, a.recording_state, a.recording_reason_code, a.scheduled...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"#11894 on JY-18909-automated-reports-ask-jiminny, menu","depth":5,"help_text":"Pull request #11894 exists for current branch JY-18909-automated-reports-ask-jiminny","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"AskJiminnyReportActivityServiceTest","depth":6,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run 'AskJiminnyReportActivityServiceTest'","depth":6,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'AskJiminnyReportActivityServiceTest'","depth":6,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"More Actions","depth":6,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JetBrains AI","depth":5,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Search Everywhere","depth":5,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"IDE and Project Settings","depth":5,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.088194445,"height":0.027777778},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"3","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.016666668,"height":0.02111111},"role_description":"text"},{"role":"AXStaticText","text":"3","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.016666668,"height":0.02111111},"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.015277778,"height":0.025555555},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.014583333,"height":0.025555555},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Tests\\Unit\\Services\\Kiosk\\AutomatedReports;\n\nuse Carbon\\CarbonImmutable;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinition\\ActivityActualDate;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinition\\ActivityUpdatedDate;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinition\\DealInsights\\ClosingPeriodFilter;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinitionCollection;\nuse Jiminny\\Component\\ActivitySearch\\Service\\ActivitySearch;\nuse Jiminny\\Models\\Activity\\Search;\nuse Jiminny\\Models\\Activity\\SearchFilter;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Repositories\\ElasticActivityRepository;\nuse Jiminny\\Services\\Kiosk\\AutomatedReports\\AskJiminnyReportActivityService;\nuse Jiminny\\Services\\Kiosk\\AutomatedReports\\AutomatedReportsService;\nuse Jiminny\\VO\\Repository\\OnDemandActivitySearch\\Criteria;\nuse PHPUnit\\Framework\\MockObject\\MockObject;\nuse PHPUnit\\Framework\\TestCase;\nuse Psr\\Log\\LoggerInterface;\n\nclass AskJiminnyReportActivityServiceTest extends TestCase\n{\n private ActivitySearch&MockObject $activitySearch;\n private ElasticActivityRepository&MockObject $elasticRepository;\n private LoggerInterface&MockObject $logger;\n private AskJiminnyReportActivityService $service;\n\n protected function setUp(): void\n {\n $this->activitySearch = $this->createMock(ActivitySearch::class);\n $this->elasticRepository = $this->createMock(ElasticActivityRepository::class);\n $this->logger = $this->createMock(LoggerInterface::class);\n\n $this->service = new AskJiminnyReportActivityService(\n $this->activitySearch,\n $this->elasticRepository,\n $this->logger,\n );\n }\n\n private function makeFilter(string $key, ?string $value): SearchFilter&MockObject\n {\n $filter = $this->createMock(SearchFilter::class);\n $filter->method('getFilterProperty')->willReturn($key);\n $filter->method('getFilterValue')->willReturn($value);\n\n return $filter;\n }\n\n private function makeUser(): User&MockObject\n {\n $tz = new \\DateTimeZone('UTC');\n $user = $this->createMock(User::class);\n $user->method('getTimezone')->willReturn($tz);\n $user->method('getId')->willReturn(1);\n $user->method('getUuid')->willReturn('user-uuid');\n\n return $user;\n }\n\n private function makeSavedSearch(array $filters): Search&MockObject\n {\n $savedSearch = $this->createMock(Search::class);\n $savedSearch->method('getId')->willReturn(42);\n $savedSearch->method('getFilters')->willReturn(new \\Illuminate\\Support\\LazyCollection($filters));\n\n return $savedSearch;\n }\n\n public function testGetActivityIdsForSavedSearchReturnsIds(): void\n {\n $user = $this->makeUser();\n $savedSearch = $this->makeSavedSearch([]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->expects($this->once())\n ->method('getArrayFilterKeys')\n ->with($user)\n ->willReturn([]);\n\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturn($filterSet);\n\n $this->elasticRepository->expects($this->once())\n ->method('onDemandSearchIdsOnly')\n ->willReturn(['id-1', 'id-2', 'id-3']);\n\n $this->logger->expects($this->once())\n ->method('info')\n ->with('[AskJiminnyReport] Fetched activity IDs for saved search');\n\n $result = $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertEquals(['id-1', 'id-2', 'id-3'], $result);\n }\n\n public function testGetActivityIdsForSavedSearchReturnsEmptyWhenNoResults(): void\n {\n $user = $this->makeUser();\n $savedSearch = $this->makeSavedSearch([]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->activitySearch->method('getOnDemandPageFilterSet')->willReturn($filterSet);\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);\n\n $this->logger->expects($this->once())->method('info');\n\n $result = $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertEmpty($result);\n }\n\n public function testGetActivityIdsFiltersOutDateFilters(): void\n {\n $user = $this->makeUser();\n\n $nonDateFilter = $this->makeFilter('owner_id', '123');\n $startDateFilter = $this->makeFilter(ActivityActualDate::PARAM_START_DATE, '2025-01-01 00:00:00');\n $endDateFilter = $this->makeFilter(ActivityActualDate::PARAM_END_DATE, '2025-01-31 23:59:59');\n $updatedFromFilter = $this->makeFilter(ActivityUpdatedDate::PARAM_UPDATED_FROM, '2025-01-01 00:00:00');\n $updatedToFilter = $this->makeFilter(ActivityUpdatedDate::PARAM_UPDATED_TO, '2025-01-31 23:59:59');\n\n $savedSearch = $this->makeSavedSearch([\n $nonDateFilter,\n $startDateFilter,\n $endDateFilter,\n $updatedFromFilter,\n $updatedToFilter,\n ]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n\n $capturedCriteria = null;\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {\n $capturedCriteria = $criteria;\n\n return $filterSet;\n });\n\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);\n $this->logger->method('info');\n\n $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertNotNull($capturedCriteria);\n }\n\n public function testGetActivityIdsFiltersOutClosingPeriodDateFilters(): void\n {\n $user = $this->makeUser();\n\n $closingStartFilter = $this->makeFilter(ClosingPeriodFilter::KEY_START_DATE, '2025-01-01');\n $closingEndFilter = $this->makeFilter(ClosingPeriodFilter::KEY_END_DATE, '2025-03-31');\n $regularFilter = $this->makeFilter('rep_id', '99');\n\n $savedSearch = $this->makeSavedSearch([\n $closingStartFilter,\n $closingEndFilter,\n $regularFilter,\n ]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturn($filterSet);\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn(['id-1']);\n $this->logger->method('info');\n\n $result = $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertEquals(['id-1'], $result);\n }\n\n public function testGetActivityIdsHandlesArrayFilters(): void\n {\n $user = $this->makeUser();\n\n $filter1 = $this->makeFilter('outcome', 'positive');\n $filter2 = $this->makeFilter('outcome', 'negative');\n\n $savedSearch = $this->makeSavedSearch([$filter1, $filter2]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn(['outcome']);\n $this->activitySearch->method('getOnDemandPageFilterSet')->willReturn($filterSet);\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn(['id-1']);\n $this->logger->method('info');\n\n $result = $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertEquals(['id-1'], $result);\n }\n\n public function testGetActivityIdsHandlesScalarFilters(): void\n {\n $user = $this->makeUser();\n\n $filter = $this->makeFilter('direction', 'inbound');\n $savedSearch = $this->makeSavedSearch([$filter]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->activitySearch->method('getOnDemandPageFilterSet')->willReturn($filterSet);\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn(['id-5']);\n $this->logger->method('info');\n\n $result = $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertEquals(['id-5'], $result);\n }\n\n public function testGetActivityIdsPassesNonZeroSequenceNumberToDisableFirstRequestDefaults(): void\n {\n $user = $this->makeUser();\n $savedSearch = $this->makeSavedSearch([]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n\n $capturedCriteria = null;\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {\n $capturedCriteria = $criteria;\n\n return $filterSet;\n });\n\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);\n $this->logger->method('info');\n\n $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertNotNull($capturedCriteria);\n $this->assertFalse($capturedCriteria->isFirstRequest());\n }\n\n public function testGetActivityIdsLogsWithCorrectContext(): void\n {\n $user = $this->makeUser();\n $savedSearch = $this->makeSavedSearch([]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->activitySearch->method('getOnDemandPageFilterSet')->willReturn($filterSet);\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn(['a', 'b']);\n\n $this->logger->expects($this->once())\n ->method('info')\n ->with(\n '[AskJiminnyReport] Fetched activity IDs for saved search',\n $this->callback(fn ($context) => $context['saved_search_id'] === 42\n && $context['user_id'] === 1\n && $context['activity_count'] === 2)\n );\n\n $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n }\n\n public static function frequencyDateRangeProvider(): array\n {\n $now = CarbonImmutable::parse('2025-06-16 12:00:00');\n\n return [\n 'daily' => [\n AutomatedReportsService::FREQUENCY_DAILY,\n $now->subDay()->startOfDay()->format('Y-m-d H:i:s'),\n $now->subDay()->endOfDay()->format('Y-m-d H:i:s'),\n ],\n 'weekly' => [\n AutomatedReportsService::FREQUENCY_WEEKLY,\n $now->subWeek()->startOfWeek()->format('Y-m-d H:i:s'),\n $now->subWeek()->endOfWeek()->format('Y-m-d H:i:s'),\n ],\n 'monthly' => [\n AutomatedReportsService::FREQUENCY_MONTHLY,\n $now->subMonthNoOverflow()->startOfMonth()->format('Y-m-d H:i:s'),\n $now->subMonthNoOverflow()->endOfMonth()->format('Y-m-d H:i:s'),\n ],\n 'quarterly' => [\n AutomatedReportsService::FREQUENCY_QUARTERLY,\n $now->subQuarterNoOverflow()->startOfQuarter()->format('Y-m-d H:i:s'),\n $now->subQuarterNoOverflow()->endOfQuarter()->format('Y-m-d H:i:s'),\n ],\n ];\n }\n\n /**\n * @dataProvider frequencyDateRangeProvider\n */\n public function testGetActivityIdsInjectsDateRangeForFrequency(\n string $frequency,\n string $expectedStartDate,\n string $expectedEndDate,\n ): void {\n CarbonImmutable::setTestNow('2025-06-16 12:00:00');\n\n try {\n $user = $this->makeUser();\n $savedSearch = $this->makeSavedSearch([]);\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->logger->method('info');\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);\n\n $capturedCriteria = null;\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {\n $capturedCriteria = $criteria;\n\n return $filterSet;\n });\n\n $this->service->getActivityIdsForSavedSearch($savedSearch, $user, $frequency);\n\n $this->assertNotNull($capturedCriteria);\n $this->assertSame($expectedStartDate, $capturedCriteria->getStartDate()->format('Y-m-d H:i:s'));\n $this->assertSame($expectedEndDate, $capturedCriteria->getEndDate()->format('Y-m-d H:i:s'));\n } finally {\n CarbonImmutable::setTestNow();\n }\n }\n\n public function testGetActivityIdsWithNullFrequencyDoesNotInjectDates(): void\n {\n $user = $this->makeUser();\n $savedSearch = $this->makeSavedSearch([]);\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->logger->method('info');\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);\n\n $capturedCriteria = null;\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {\n $capturedCriteria = $criteria;\n\n return $filterSet;\n });\n\n $this->service->getActivityIdsForSavedSearch($savedSearch, $user, null);\n\n $this->assertNotNull($capturedCriteria);\n $this->assertNull($capturedCriteria->getStartDate());\n $this->assertNull($capturedCriteria->getEndDate());\n }\n\n public function testGetActivityIdsWithUnknownFrequencyDoesNotInjectDates(): void\n {\n $user = $this->makeUser();\n $savedSearch = $this->makeSavedSearch([]);\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->logger->method('info');\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);\n\n $capturedCriteria = null;\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {\n $capturedCriteria = $criteria;\n\n return $filterSet;\n });\n\n $this->service->getActivityIdsForSavedSearch($savedSearch, $user, AutomatedReportsService::FREQUENCY_ONE_OFF);\n\n $this->assertNotNull($capturedCriteria);\n $this->assertNull($capturedCriteria->getStartDate());\n $this->assertNull($capturedCriteria->getEndDate());\n }\n\n public function testGetActivityIdsFrequencyDateRangeOverridesSavedSearchDateFilters(): void\n {\n CarbonImmutable::setTestNow('2025-06-16 12:00:00');\n\n try {\n $user = $this->makeUser();\n\n $startDateFilter = $this->makeFilter(ActivityActualDate::PARAM_START_DATE, '2024-01-01 00:00:00');\n $endDateFilter = $this->makeFilter(ActivityActualDate::PARAM_END_DATE, '2024-12-31 23:59:59');\n $savedSearch = $this->makeSavedSearch([$startDateFilter, $endDateFilter]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->logger->method('info');\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);\n\n $capturedCriteria = null;\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {\n $capturedCriteria = $criteria;\n\n return $filterSet;\n });\n\n $this->service->getActivityIdsForSavedSearch($savedSearch, $user, AutomatedReportsService::FREQUENCY_DAILY);\n\n $this->assertNotNull($capturedCriteria);\n $this->assertSame('2025-06-15 00:00:00', $capturedCriteria->getStartDate()->format('Y-m-d H:i:s'));\n $this->assertSame('2025-06-15 23:59:59', $capturedCriteria->getEndDate()->format('Y-m-d H:i:s'));\n } finally {\n CarbonImmutable::setTestNow();\n }\n }\n}","depth":4,"value":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Tests\\Unit\\Services\\Kiosk\\AutomatedReports;\n\nuse Carbon\\CarbonImmutable;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinition\\ActivityActualDate;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinition\\ActivityUpdatedDate;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinition\\DealInsights\\ClosingPeriodFilter;\nuse Jiminny\\Component\\ActivitySearch\\FilterDefinitionCollection;\nuse Jiminny\\Component\\ActivitySearch\\Service\\ActivitySearch;\nuse Jiminny\\Models\\Activity\\Search;\nuse Jiminny\\Models\\Activity\\SearchFilter;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Repositories\\ElasticActivityRepository;\nuse Jiminny\\Services\\Kiosk\\AutomatedReports\\AskJiminnyReportActivityService;\nuse Jiminny\\Services\\Kiosk\\AutomatedReports\\AutomatedReportsService;\nuse Jiminny\\VO\\Repository\\OnDemandActivitySearch\\Criteria;\nuse PHPUnit\\Framework\\MockObject\\MockObject;\nuse PHPUnit\\Framework\\TestCase;\nuse Psr\\Log\\LoggerInterface;\n\nclass AskJiminnyReportActivityServiceTest extends TestCase\n{\n private ActivitySearch&MockObject $activitySearch;\n private ElasticActivityRepository&MockObject $elasticRepository;\n private LoggerInterface&MockObject $logger;\n private AskJiminnyReportActivityService $service;\n\n protected function setUp(): void\n {\n $this->activitySearch = $this->createMock(ActivitySearch::class);\n $this->elasticRepository = $this->createMock(ElasticActivityRepository::class);\n $this->logger = $this->createMock(LoggerInterface::class);\n\n $this->service = new AskJiminnyReportActivityService(\n $this->activitySearch,\n $this->elasticRepository,\n $this->logger,\n );\n }\n\n private function makeFilter(string $key, ?string $value): SearchFilter&MockObject\n {\n $filter = $this->createMock(SearchFilter::class);\n $filter->method('getFilterProperty')->willReturn($key);\n $filter->method('getFilterValue')->willReturn($value);\n\n return $filter;\n }\n\n private function makeUser(): User&MockObject\n {\n $tz = new \\DateTimeZone('UTC');\n $user = $this->createMock(User::class);\n $user->method('getTimezone')->willReturn($tz);\n $user->method('getId')->willReturn(1);\n $user->method('getUuid')->willReturn('user-uuid');\n\n return $user;\n }\n\n private function makeSavedSearch(array $filters): Search&MockObject\n {\n $savedSearch = $this->createMock(Search::class);\n $savedSearch->method('getId')->willReturn(42);\n $savedSearch->method('getFilters')->willReturn(new \\Illuminate\\Support\\LazyCollection($filters));\n\n return $savedSearch;\n }\n\n public function testGetActivityIdsForSavedSearchReturnsIds(): void\n {\n $user = $this->makeUser();\n $savedSearch = $this->makeSavedSearch([]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->expects($this->once())\n ->method('getArrayFilterKeys')\n ->with($user)\n ->willReturn([]);\n\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturn($filterSet);\n\n $this->elasticRepository->expects($this->once())\n ->method('onDemandSearchIdsOnly')\n ->willReturn(['id-1', 'id-2', 'id-3']);\n\n $this->logger->expects($this->once())\n ->method('info')\n ->with('[AskJiminnyReport] Fetched activity IDs for saved search');\n\n $result = $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertEquals(['id-1', 'id-2', 'id-3'], $result);\n }\n\n public function testGetActivityIdsForSavedSearchReturnsEmptyWhenNoResults(): void\n {\n $user = $this->makeUser();\n $savedSearch = $this->makeSavedSearch([]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->activitySearch->method('getOnDemandPageFilterSet')->willReturn($filterSet);\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);\n\n $this->logger->expects($this->once())->method('info');\n\n $result = $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertEmpty($result);\n }\n\n public function testGetActivityIdsFiltersOutDateFilters(): void\n {\n $user = $this->makeUser();\n\n $nonDateFilter = $this->makeFilter('owner_id', '123');\n $startDateFilter = $this->makeFilter(ActivityActualDate::PARAM_START_DATE, '2025-01-01 00:00:00');\n $endDateFilter = $this->makeFilter(ActivityActualDate::PARAM_END_DATE, '2025-01-31 23:59:59');\n $updatedFromFilter = $this->makeFilter(ActivityUpdatedDate::PARAM_UPDATED_FROM, '2025-01-01 00:00:00');\n $updatedToFilter = $this->makeFilter(ActivityUpdatedDate::PARAM_UPDATED_TO, '2025-01-31 23:59:59');\n\n $savedSearch = $this->makeSavedSearch([\n $nonDateFilter,\n $startDateFilter,\n $endDateFilter,\n $updatedFromFilter,\n $updatedToFilter,\n ]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n\n $capturedCriteria = null;\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {\n $capturedCriteria = $criteria;\n\n return $filterSet;\n });\n\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);\n $this->logger->method('info');\n\n $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertNotNull($capturedCriteria);\n }\n\n public function testGetActivityIdsFiltersOutClosingPeriodDateFilters(): void\n {\n $user = $this->makeUser();\n\n $closingStartFilter = $this->makeFilter(ClosingPeriodFilter::KEY_START_DATE, '2025-01-01');\n $closingEndFilter = $this->makeFilter(ClosingPeriodFilter::KEY_END_DATE, '2025-03-31');\n $regularFilter = $this->makeFilter('rep_id', '99');\n\n $savedSearch = $this->makeSavedSearch([\n $closingStartFilter,\n $closingEndFilter,\n $regularFilter,\n ]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturn($filterSet);\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn(['id-1']);\n $this->logger->method('info');\n\n $result = $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertEquals(['id-1'], $result);\n }\n\n public function testGetActivityIdsHandlesArrayFilters(): void\n {\n $user = $this->makeUser();\n\n $filter1 = $this->makeFilter('outcome', 'positive');\n $filter2 = $this->makeFilter('outcome', 'negative');\n\n $savedSearch = $this->makeSavedSearch([$filter1, $filter2]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn(['outcome']);\n $this->activitySearch->method('getOnDemandPageFilterSet')->willReturn($filterSet);\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn(['id-1']);\n $this->logger->method('info');\n\n $result = $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertEquals(['id-1'], $result);\n }\n\n public function testGetActivityIdsHandlesScalarFilters(): void\n {\n $user = $this->makeUser();\n\n $filter = $this->makeFilter('direction', 'inbound');\n $savedSearch = $this->makeSavedSearch([$filter]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->activitySearch->method('getOnDemandPageFilterSet')->willReturn($filterSet);\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn(['id-5']);\n $this->logger->method('info');\n\n $result = $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertEquals(['id-5'], $result);\n }\n\n public function testGetActivityIdsPassesNonZeroSequenceNumberToDisableFirstRequestDefaults(): void\n {\n $user = $this->makeUser();\n $savedSearch = $this->makeSavedSearch([]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n\n $capturedCriteria = null;\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {\n $capturedCriteria = $criteria;\n\n return $filterSet;\n });\n\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);\n $this->logger->method('info');\n\n $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n\n $this->assertNotNull($capturedCriteria);\n $this->assertFalse($capturedCriteria->isFirstRequest());\n }\n\n public function testGetActivityIdsLogsWithCorrectContext(): void\n {\n $user = $this->makeUser();\n $savedSearch = $this->makeSavedSearch([]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->activitySearch->method('getOnDemandPageFilterSet')->willReturn($filterSet);\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn(['a', 'b']);\n\n $this->logger->expects($this->once())\n ->method('info')\n ->with(\n '[AskJiminnyReport] Fetched activity IDs for saved search',\n $this->callback(fn ($context) => $context['saved_search_id'] === 42\n && $context['user_id'] === 1\n && $context['activity_count'] === 2)\n );\n\n $this->service->getActivityIdsForSavedSearch($savedSearch, $user);\n }\n\n public static function frequencyDateRangeProvider(): array\n {\n $now = CarbonImmutable::parse('2025-06-16 12:00:00');\n\n return [\n 'daily' => [\n AutomatedReportsService::FREQUENCY_DAILY,\n $now->subDay()->startOfDay()->format('Y-m-d H:i:s'),\n $now->subDay()->endOfDay()->format('Y-m-d H:i:s'),\n ],\n 'weekly' => [\n AutomatedReportsService::FREQUENCY_WEEKLY,\n $now->subWeek()->startOfWeek()->format('Y-m-d H:i:s'),\n $now->subWeek()->endOfWeek()->format('Y-m-d H:i:s'),\n ],\n 'monthly' => [\n AutomatedReportsService::FREQUENCY_MONTHLY,\n $now->subMonthNoOverflow()->startOfMonth()->format('Y-m-d H:i:s'),\n $now->subMonthNoOverflow()->endOfMonth()->format('Y-m-d H:i:s'),\n ],\n 'quarterly' => [\n AutomatedReportsService::FREQUENCY_QUARTERLY,\n $now->subQuarterNoOverflow()->startOfQuarter()->format('Y-m-d H:i:s'),\n $now->subQuarterNoOverflow()->endOfQuarter()->format('Y-m-d H:i:s'),\n ],\n ];\n }\n\n /**\n * @dataProvider frequencyDateRangeProvider\n */\n public function testGetActivityIdsInjectsDateRangeForFrequency(\n string $frequency,\n string $expectedStartDate,\n string $expectedEndDate,\n ): void {\n CarbonImmutable::setTestNow('2025-06-16 12:00:00');\n\n try {\n $user = $this->makeUser();\n $savedSearch = $this->makeSavedSearch([]);\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->logger->method('info');\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);\n\n $capturedCriteria = null;\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {\n $capturedCriteria = $criteria;\n\n return $filterSet;\n });\n\n $this->service->getActivityIdsForSavedSearch($savedSearch, $user, $frequency);\n\n $this->assertNotNull($capturedCriteria);\n $this->assertSame($expectedStartDate, $capturedCriteria->getStartDate()->format('Y-m-d H:i:s'));\n $this->assertSame($expectedEndDate, $capturedCriteria->getEndDate()->format('Y-m-d H:i:s'));\n } finally {\n CarbonImmutable::setTestNow();\n }\n }\n\n public function testGetActivityIdsWithNullFrequencyDoesNotInjectDates(): void\n {\n $user = $this->makeUser();\n $savedSearch = $this->makeSavedSearch([]);\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->logger->method('info');\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);\n\n $capturedCriteria = null;\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {\n $capturedCriteria = $criteria;\n\n return $filterSet;\n });\n\n $this->service->getActivityIdsForSavedSearch($savedSearch, $user, null);\n\n $this->assertNotNull($capturedCriteria);\n $this->assertNull($capturedCriteria->getStartDate());\n $this->assertNull($capturedCriteria->getEndDate());\n }\n\n public function testGetActivityIdsWithUnknownFrequencyDoesNotInjectDates(): void\n {\n $user = $this->makeUser();\n $savedSearch = $this->makeSavedSearch([]);\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->logger->method('info');\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);\n\n $capturedCriteria = null;\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {\n $capturedCriteria = $criteria;\n\n return $filterSet;\n });\n\n $this->service->getActivityIdsForSavedSearch($savedSearch, $user, AutomatedReportsService::FREQUENCY_ONE_OFF);\n\n $this->assertNotNull($capturedCriteria);\n $this->assertNull($capturedCriteria->getStartDate());\n $this->assertNull($capturedCriteria->getEndDate());\n }\n\n public function testGetActivityIdsFrequencyDateRangeOverridesSavedSearchDateFilters(): void\n {\n CarbonImmutable::setTestNow('2025-06-16 12:00:00');\n\n try {\n $user = $this->makeUser();\n\n $startDateFilter = $this->makeFilter(ActivityActualDate::PARAM_START_DATE, '2024-01-01 00:00:00');\n $endDateFilter = $this->makeFilter(ActivityActualDate::PARAM_END_DATE, '2024-12-31 23:59:59');\n $savedSearch = $this->makeSavedSearch([$startDateFilter, $endDateFilter]);\n\n $filterSet = $this->createMock(FilterDefinitionCollection::class);\n\n $this->activitySearch->method('getArrayFilterKeys')->willReturn([]);\n $this->logger->method('info');\n $this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);\n\n $capturedCriteria = null;\n $this->activitySearch->expects($this->once())\n ->method('getOnDemandPageFilterSet')\n ->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {\n $capturedCriteria = $criteria;\n\n return $filterSet;\n });\n\n $this->service->getActivityIdsForSavedSearch($savedSearch, $user, AutomatedReportsService::FREQUENCY_DAILY);\n\n $this->assertNotNull($capturedCriteria);\n $this->assertSame('2025-06-15 00:00:00', $capturedCriteria->getStartDate()->format('Y-m-d H:i:s'));\n $this->assertSame('2025-06-15 23:59:59', $capturedCriteria->getEndDate()->format('Y-m-d H:i:s'));\n } finally {\n CarbonImmutable::setTestNow();\n }\n }\n}","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Execute","depth":4,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Explain Plan","depth":4,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Browse Query History","depth":4,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"View Parameters","depth":4,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Open Query Execution Settings…","depth":4,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"In-Editor Results","depth":4,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Tx: Auto","depth":4,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Cancel Running Statements","depth":4,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Playground","depth":4,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"jiminny","depth":4,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.088194445,"height":0.027777778},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"27","depth":4,"role_description":"text"},{"role":"AXStaticText","text":"9","depth":4,"role_description":"text"},{"role":"AXStaticText","text":"23","depth":4,"role_description":"text"},{"role":"AXStaticText","text":"3","depth":4,"role_description":"text"},{"role":"AXStaticText","text":"105","depth":4,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"SELECT * FROM team_features where team_id = 1;\n\nSELECT * FROM teams WHERE name LIKE '%Vixio%'; # 340,270,11922\nSELECT * FROM users WHERE team_id = 340; # 12015\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 340\nand sa.provider = 'salesforce';\n# and sa.provider = 'salesloft';\n\nselect * from crm_fields where crm_configuration_id = 270 and object_type = 'event';\n# 125558 - Event Type - Event_Type__c\n# 125552 - Event Status - Event_Status__c\n\nSELECT * FROM sidekick_settings WHERE team_id = 340;\n\nSELECT * FROM crm_field_values WHERE crm_field_id in (125552);\n\nselect * from activities where crm_configuration_id = 270\nand type = 'conference' and crm_provider_id IS NOT NULL\nand actual_start_time > '2024-09-16 09:00:00' order by scheduled_start_time;\n\nSELECT * FROM activities WHERE id = 20871677;\nSELECT * FROM crm_field_data WHERE activity_id = 20871677;\n\nselect * from crm_layouts where crm_configuration_id = 270;\nselect * from crm_layout_entities where crm_layout_id in (886,887);\n\nSELECT * FROM crm_configurations WHERE id = 270;\n\nselect * from playbooks where team_id = 340; # 1514\nselect * from groups where team_id = 340;\nSELECT * FROM crm_fields WHERE id IN (125393, 125401);\n\nselect g.name as 'team name', p.name as 'playbook name', f.label as 'activity type field' from groups g\njoin playbooks p on g.playbook_id = p.id\njoin crm_fields f on p.activity_field_id = f.id\nwhere g.team_id = 340;\n\nSELECT * FROM activities WHERE uuid_to_bin('0c180357-67d2-419e-a8c3-b832a3490770') = uuid; # 20448716\nselect * from crm_field_data where object_id = 20448716;\n\nselect * from activities where crm_configuration_id = 270 and provider = 'salesloft' order by id desc;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%CybSafe%'; # 343,273,12008\nselect * from opportunities where team_id = 343;\nselect * from opportunities where team_id = 343 and crm_provider_id = '18099102526';\nselect * from opportunities where team_id = 343 and account_id = 945217482;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 343\nand sa.provider = 'hubspot';\n\nselect * from accounts where team_id = 343 order by name asc;\n\nselect * from stages where crm_configuration_id = 273 and type = 'opportunity';\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Voyado%'; # 353,283,12143\nSELECT * FROM activities WHERE crm_configuration_id = 283 and account_id = 3777844 order by id desc;\nSELECT * FROM accounts WHERE team_id = 353 AND name LIKE '%Salesloft%';\nSELECT * FROM activities WHERE id = 20717903;\n\nselect * from participants where activity_id IN (20929172,20928605,20928468,20926272,20926271,20926270,20926269,20916499,20916454,20916436,20916435,20900015,20900014,20900013,20897312,20897243,20897241,20897237,20897232,20897229,20893648,20893231,20893230,20893229,20893228,20889784,20885039,20885038,20885037,20885036,20885035,20882728,20882708,20882703,20882702,20869828,20869811,20869806,20869801,20869799,20869798,20869796,20869795,20869794,20869761,20869760,20869759,20868688,20868687,20850340,20847195,20841710,20833967,20827021,20825307,20825305,20825297,20824615,20824400,20823927,20821760,20795588,20794233,20794057,20793710,20785811,20781789,20781394,20781307,20762651,20758453,20758282,20757323,20756643,20756636,20756629,20756627,20756606,20756605,20756604,20756603,20756602,20756600,20756599,20756598,20756595,20756594,20756589,20756587,20756577,20756573,20748918,20748386,20748385,20748384,20748383,20748382,20748381,20748380,20748379,20748377,20748375,20748373,20743301,20717905,20717904,20717903,20717901,20717899);\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 353\nand sa.provider = 'salesforce';\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%modern world business solutions%'; # 345,275,12016, l.atkinson@mwbsolutions.co.uk\nSELECT * FROM activities WHERE uuid_to_bin('3921d399-3fef-4609-a291-b0097a166d43') = uuid;\n# id: 20940638, user: 12022, contact: 5305871\nSELECT * FROM activity_summary_logs WHERE activity_id = 20940638;\nselect * from contacts where team_id = 345 and crm_provider_id = '30891432415' order by name asc; # 5305871\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 345\nand sa.provider = 'hubspot';\n\nselect * from users where team_id = 345 and id = 12022;\nSELECT * FROM crm_profiles WHERE user_id = 12022;\nSELECT * FROM participants WHERE activity_id = 20940638;\nSELECT * FROM users u\nJOIN crm_profiles cp ON u.id = cp.user_id\nWHERE u.team_id = 345;\n\nselect * from contacts where team_id = 345 and crm_provider_id = '30880813535' order by name desc; # 5305871\n\nselect * from team_features where team_id = 345;\nSELECT * FROM activities WHERE uuid_to_bin('11701e2d-2f82-4dab-a616-1db4fad238df') = uuid; # 21115197\nSELECT * FROM participants WHERE activity_id = 20897406;\n\n\n\nSELECT * FROM activities WHERE uuid_to_bin('63ba55cd-1abc-447d-83da-0137000005b7') = uuid; # 20953912\nSELECT * FROM activities WHERE crm_configuration_id = 275 and provider = 'ringcentral' and title like '%1252629100%';\n\n\nSELECT * FROM activities WHERE id = 20946641;\nSELECT * FROM crm_profiles WHERE user_id = 10211;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Lunio%'; # 120,97,10984, triger@lunio.ai\nSELECT * FROM opportunities WHERE crm_configuration_id = 97 and crm_provider_id = '006N1000006c5PpIAI';\nselect * from stages where crm_configuration_id = 97 and type = 'opportunity';\nselect * from opportunities where team_id = 120;\n\n\nselect * from crm_configurations crm join teams t on crm.id = t.crm_id\nwhere 1=1\nAND t.current_billing_plan IS NOT NULL\nAND crm.auto_sync_activity = 0\nand crm.provider = 'hubspot';\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Exclaimer%'; # 270,205,10053,james.lewendon@exclaimer.com\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 270\nand sa.provider = 'salesforce';\nSELECT * FROM activities WHERE uuid_to_bin('b54df794-2a9a-4957-8d80-09a600ead5f8') = uuid; # 21637956\nSELECT * FROM crm_profiles WHERE user_id = 11446;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Cygnetise%'; # 372,300,12554, alex.chikly@cygnetise.com\nselect * from playbooks where team_id = 372;\nselect * from crm_fields where crm_configuration_id = 300 and object_type = 'event'; # 141340\nSELECT * FROM crm_field_values WHERE crm_field_id = 141340;\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 372\nand sa.provider = 'salesforce';\n\nselect * from crm_profiles where crm_configuration_id = 300;\nSELECT * FROM crm_configurations WHERE team_id = 372;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Planday%'; # 291,242,11501,mfa@planday.com\nSELECT * FROM opportunities WHERE team_id = 291 and crm_provider_id = '006bG000005DO86QAG'; # 3207756\nselect * from crm_field_data where object_id = 3207756;\nSELECT * FROM crm_fields WHERE id = 111834;\n\nselect f.id, f.crm_provider_id AS field_name, f.label, fd.object_id AS dealId, fd.value\nFROM crm_fields f\nJOIN crm_field_data fd ON f.id = fd.crm_field_id\nWHERE f.crm_configuration_id = 242\nAND f.object_type = 'opportunity'\nAND fd.object_id IN (3207756)\nORDER BY fd.object_id, fd.updated_at;\n\nSELECT * FROM crm_configurations WHERE auto_connect = 1;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Tour%'; # 187,209,8150,salesforce-admin@tourlane.com\nselect * from group_deal_risk_types drgt join groups g on drgt.group_id = g.id\nwhere g.team_id = 187;\n\nselect * from `groups` where team_id = 187;\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 187\nand sa.provider = 'salesforce';\n\n# Destination - 98870 - Destination__c\n# Stage - 79014 - StageName\n# Land Arrangement - 98856 - Land_Arrangement__c\n# Flight - 98848 - Flight__c\n# Last activity date - 98812 - LastActivityDate\n# Last modified date - 98809 - LastModifiedDate\n# Last inbound mail timestamp - 99151 - Last_Inbound_Mail_Timestamp__c\n# next call - 98864 - Next_Call__c\n\nselect * from crm_fields where crm_configuration_id = 209 and object_type = 'opportunity';\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 209;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 682;\n\nselect * from opportunities where team_id = 187 and name LIKE'%Muriel Sal%';\nselect * from opportunities where team_id = 187 and user_id = 9951 and is_closed = 0;\nselect * from activities where opportunity_id = 3538248;\n\nSELECT * FROM crm_profiles WHERE user_id = 8150;\n\nselect * from deal_risks where opportunity_id = 3538248;\n\nselect * from teams where crm_id IS NULL;\n\nSELECT opp.id AS opportunity_id,\n u.group_id AS group_id,\n MAX(\n CASE\n WHEN a.type IN (\"sms-inbound\", \"sms-outbound\") THEN a.created_at\n ELSE a.actual_end_time\n END) as last_date\nFROM opportunities opp\nleft join activities a on a.opportunity_id = opp.id\ninner join users u on opp.user_id = u.id\nwhere opp.user_id IN (9951)\n\nAND opp.is_closed = 0\nand a.status IN ('completed', 'received', 'delivered') OR a.status IS NULL\ngroup by opp.id;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Cybsafe%'; # 343,301,12008,polly.morphew@cybsafe.com\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 343\nand sa.provider = 'hubspot';\n\nSELECT * FROM crm_profiles WHERE crm_configuration_id = 301;\nSELECT * FROM contacts WHERE id = 6612363;\nSELECT * FROM accounts WHERE id = 4235676;\nSELECT * FROM opportunities WHERE crm_configuration_id = 301 and crm_provider_id = 32983784868;\nselect * from opportunity_stages where opportunity_id = 4503759;\n# SELECT * FROM opportunities WHERE id = 4569937;\n\nselect * from activities where crm_configuration_id = 301;\nSELECT * FROM activities WHERE uuid_to_bin('d3b2b28b-c3d0-4c2d-8ed0-eef42855278a') = uuid; # 26330370\nSELECT * FROM participants WHERE activity_id = 26330370;\n\nSELECT * FROM teams WHERE id = 375;\nselect * from playbooks where team_id = 375;\n\nselect * from stages where crm_configuration_id = 301 and type = 'opportunity';\n\nselect * from teams;\nselect * from contact_roles;\n\nSELECT * FROM opportunities WHERE team_id = 343 and user_id = 12871 and close_date >= '2024-11-01';\n\nselect * from users u join crm_profiles cp on cp.user_id = u.id where u.team_id = 343;\n\nSELECT * FROM crm_field_data WHERE object_id = 3771706;\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 343\nand sa.provider = 'hubspot';\n\nSELECT * FROM crm_fields WHERE crm_configuration_id = 301 and object_type = 'opportunity'\nand crm_provider_id LIKE \"%traffic_light%\";\nSELECT * FROM crm_field_values WHERE crm_field_id IN (144020,144048,144111,144113,144126,144481,144508,144531);\n\nSELECT fd.* FROM opportunities o\nJOIN crm_field_data fd ON o.id = fd.object_id\nWHERE o.team_id = 343\n# and o.user_id IS NOT NULL\nand fd.crm_field_id IN (144020,144048,144111,144113,144126,144481,144508,144531)\nand fd.value != ''\norder by value desc\n# group by o.id\n;\n\nSELECT * FROM opportunities WHERE id = 3769843;\n\nSELECT * FROM teams WHERE name LIKE '%Tour%'; # 187,209,8150, salesforce-admin@tourlane.com\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 209;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 682;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Funding Circle%'; # 220,177,8603,aswini.mishra@fundingcircle.com\nSELECT * FROM activities WHERE uuid_to_bin('7a40e99b-3b37-4bb1-b983-325b81801c01') = uuid; # 23139839\n\n\nSELECT * FROM opportunities WHERE id = 3855992;\n\nSELECT * FROM users WHERE name LIKE '%Angus Pollard%'; # 8988\n\nSELECT * FROM teams WHERE name LIKE '%Story Terrace%'; # 379, 307, 12894\nSELECT * FROM crm_fields WHERE crm_configuration_id = 307 and object_type != 'opportunity';\n\nselect * from contacts where team_id = 379 and name like '%bebro%'; # 5874411, crm: 77229348507\nSELECT * FROM crm_field_data WHERE object_id = 5874411;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 379\nand sa.provider = 'hubspot';\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%mentio%'; # 117, 94, 6371, nikhil.kumar@mention-me.com\nSELECT * FROM activities WHERE uuid_to_bin('82939311-1af0-4506-8546-21e8d1fdf2c1') = uuid;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Tourlane%'; # 187, 209, 8150, salesforce-admin@tourlane.com\nSELECT * FROM opportunities WHERE team_id = 187 and crm_provider_id = '006Se000008xfvNIAQ'; # 3537793\nselect * from generic_ai_prompts where subject_id = 3537793;\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Lunio%'; # 120, 97, 10984, triger@lunio.ai\nSELECT * FROM crm_configurations WHERE id = 97;\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 97;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 355;\nSELECT * FROM crm_fields WHERE id = 32682;\n\nselect cfd.value, o.* from opportunities o\njoin crm_field_data cfd on o.id = cfd.object_id and cfd.crm_field_id = 32682\nwhere team_id = 120\nand cfd.value != ''\n;\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 120\nand sa.provider = 'salesforce';\n\nselect * from opportunities where team_id = 120 and crm_provider_id = '006N1000007X8MAIA0';\nSELECT * FROM crm_field_data WHERE object_id = 2313439;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE id = 410;\nSELECT * FROM teams WHERE name LIKE '%Local Business Oxford%';\nselect * from scorecards where team_id = 410;\nselect * from scorecard_rules;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Funding%'; # 220, 177, 8603, aswini.mishra@fundingcircle.com\nselect * from activities a\njoin opportunities o on a.opportunity_id = o.id\njoin users u on o.user_id = u.id\nwhere a.crm_configuration_id = 177 and a.type LIKE '%email-out%'\n# and a.actual_end_time > '2024-12-16 00:00:00'\n# and o.remotely_created_at > '2024-12-01 00:00:00'\n# and u.group_id = 1014\nand u.id = 9021\norder by a.id desc;\nSELECT * FROM opportunities WHERE id in (3981384,4017346);\nSELECT * FROM users WHERE team_id = 220 and id IN (8775, 11435);\n\nselect * from users where id = 9021;\nselect * from inboxes where user_id = 9021;\n\nselect * from inbox_emails where inbox_id = 1349 and email_date > '2024-12-18 00:00:00';\n\nselect * from email_messages where team_id = 220\nand orig_date > '2024-12-16 00:00:00' and orig_date < '2024-12-19 00:00:00'\nand subject LIKE '%Personal%'\n# and 'from' = 'credit@fundingcircle.com'\n;\n\nselect * from activities a\njoin opportunities o on a.opportunity_id = o.id\nwhere a.user_id = 9021 and a.type LIKE '%email-out%'\nand a.actual_end_time > '2024-12-18 00:00:00'\nand o.user_id IS NOT NULL\nand o.remotely_created_at > '2024-12-01 00:00:00'\norder by a.id desc;\n\nSELECT * FROM opportunities WHERE team_id = 220 and name LIKE '%Right Car move Limited%' and id = 3966852;\nselect * from activities where crm_configuration_id = 177 and type LIKE '%email%' and opportunity_id = 3966852 order by id desc;\n\nselect * from team_settings where name IN ('useCloseDate');\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Hurree%'; # 104, 81, 6175, jfarrell@hurree.co\nSELECT * FROM opportunities WHERE team_id = 104 and name = 'PropOp';\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 104\nand sa.provider = 'hubspot';\n\nselect * from crm_configurations where last_synced_at > '2025-01-19 01:00:00'\nselect * from teams where crm_id IS NULL;\n\nselect t.name as 'team', u.name as 'owner', u.email, u.phone\nfrom teams t\njoin activity_providers ap on t.id = ap.team_id\njoin users u on t.owner_id = u.id\nwhere 1=1\n and t.status = 'active'\n and ap.is_enabled = 1\n# and u.status = 1\n and ap.provider = 'ms-teams';\n\nselect * from crm_configurations where provider = 'bullhorn'; # 344\nSELECT * FROM teams WHERE id = 442; # 14293\nselect * from users where team_id = 442;\nselect * from social_accounts sa where sa.sociable_id = 14293;\nselect * from invitations where team_id = 442;\n\n# ********************************************************************************************************\nSELECT * FROM users WHERE email LIKE '%nea.liikamaa@eletive.com%'; # 14022\nSELECT * FROM teams WHERE id = 429;\nselect * from opportunities where team_id = 429 and crm_provider_id IN (16157415775, 22246219645);\nselect * from activities where opportunity_id in (4340436,4353519);\n\nselect * from transcription where activity_id IN (25630961,25381771);\nselect * from generic_ai_prompts where subject_id IN (4353519);\n\nSELECT\n a.id as activity_id,\n a.opportunity_id,\n a.type as activity_type,\n a.language,\n CONCAT(a.title, a.description) AS mail_content,\n e.from AS mail_from,\n e.to AS mail_to,\n e.subject AS mail_subject,\n e.body AS mail_body,\n p.type as prompt_type,\n p.status as prompt_status,\n p.content AS prompt_content,\n a.actual_start_time as created_at\nFROM activities a\n LEFT JOIN ai_prompts p ON a.transcription_id = p.transcription_id AND p.deleted_at IS NULL\n LEFT JOIN email_messages e ON a.id = e.activity_id\nWHERE a.actual_start_time > '2024-01-01 00:00:00'\n AND a.opportunity_id IN (4353519)\n AND a.status IN ('completed', 'received', 'delivered')\n AND a.deleted_at IS NULL\n AND a.type NOT IN ('sms-inbound', 'sms-outbound')\nORDER BY a.opportunity_id ASC, a.id ASC;\n\nSELECT * FROM users WHERE name LIKE '%George Fierstone%'; # 14293\nSELECT * FROM teams WHERE id = 442;\nSELECT * FROM crm_configurations WHERE id = 344;\nselect * from team_features where team_id = 442;\nselect * from groups where team_id = 442;\nselect * from playbooks where team_id = 442;\nselect * from playbook_categories where playbook_id = 1729;\nselect * from crm_fields where crm_configuration_id = 344 and id = 172024;\nSELECT * FROM crm_field_values WHERE crm_field_id = 172024;\nselect * from crm_layouts where crm_configuration_id = 344;\nselect * from playbook_layouts where playbook_id = 1729;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Learning%'; # 260, 221, 9444\n\nselect s.*\n# , s.sent_at, u.name, a.*\nfrom activity_summary_logs s\ninner join activities a on a.id = s.activity_id\ninner join users u on u.id = a.user_id\nwhere a.crm_configuration_id = 356\nand s.sent_at > date_sub(now(), interval 60 day)\norder by a.actual_end_time desc;\n\nselect * from activities a\n# inner join activity_summary_logs s on s.activity_id = a.id\nwhere a.crm_configuration_id = 356 and a.actual_end_time > date_sub(now(), interval 60 day)\n# and a.crm_provider_id is not null\n# and provider <> 'ringcentral'\nand status = 'completed'\norder by a.actual_end_time desc;\n\nselect * from teams order by id desc; # 17328, 32, 17830, integration-account@jiminny.com\nSELECT * FROM users;\nSELECT * FROM users where team_id = 260 and status = 1; # 201 - 150 active\nSELECT * FROM teams WHERE id = 260;\nselect * from team_settings where team_id = 260;\nselect * from crm_configurations where team_id = 260;\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 356;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1184;\n\nselect * from accounts where crm_configuration_id = 221 order by id desc; # 7000\nselect * from leads where crm_configuration_id = 221 order by id desc; # 0\nselect * from contacts where crm_configuration_id = 221 order by id desc; # 200 000\nselect * from opportunities where crm_configuration_id = 221 order by id desc; # 0\nselect * from crm_profiles where crm_configuration_id = 221 order by id desc; # 23\nselect * from crm_fields where crm_configuration_id = 221;\nselect * from crm_field_values where crm_field_id = 5302 order by id desc;\nselect * from crm_layouts where crm_configuration_id = 221 order by id desc;\nselect * from stages where crm_configuration_id = 221 order by id desc;\n\nselect * from accounts where crm_configuration_id = 356 order by id desc; # 7000\nselect * from leads where crm_configuration_id = 356 order by id desc; # 0\nselect * from contacts where crm_configuration_id = 356 order by id desc; # 200 000\nselect * from opportunities where crm_configuration_id = 356 order by id desc; # 0\nselect * from crm_profiles where crm_configuration_id = 356 order by id desc; # 23\nselect * from crm_fields where crm_configuration_id = 356;\nselect * from crm_field_values where crm_field_id = 5302 order by id desc;\nselect * from crm_layouts where crm_configuration_id = 356 order by id desc;\nselect * from stages where crm_configuration_id = 356 order by id desc;\n\nselect * from playbooks where team_id = 260 order by id desc; # 4 (2 deleted)\nselect * from groups where team_id = 260 order by id desc; # 27 groups, (2 deleted)\nselect * from playbook_layouts where playbook_id IN (1410,1409,1276,1254); # 4\nselect ce.* from calendars c\njoin users u on c.user_id = u.id\njoin calendar_events ce on c.id = ce.calendar_id\nwhere u.team_id = 260\nand (ce.start_time > '2025-02-21 00:00:00')\n;\n# calendar events 1207\n#\n\nselect * from opportunities where team_id = 260;\nSELECT * FROM crm_field_data WHERE object_id = 4696496;\n\nselect * from activities where crm_configuration_id = 356 and crm_provider_id IS NOT NULL;\nselect * from activities where crm_configuration_id IN (221) and provider NOT IN ('ms-teams', 'uploader', 'zoom-bot')\n# and type = 'conference' and status = 'scheduled' and activities.is_internal = 0\nand created_at > '2024-03-01 00:00:00'\norder by id desc; # 880 000, ringcentral, avaya\nSELECT * FROM participants WHERE activity_id = 26371744;\n\n# all activities 942 000 +\n# conference 7385 - scheduled 984 - external 343\n\nselect * from activities where id = 26321812;\nselect * from participants where activity_id = 26321812;\nselect * from participants where activity_id in (26414510,26414514,26414516,26414604,26414653,26414655);\nselect * from leads where id in (720428,689175,731546,645866,621037);\n\nselect * from users where id = 13841;\nselect * from opportunities where user_id = 9541;\nselect * from stages where id = 15900;\n\nselect * from accounts where\n# id IN (4160055,5053725,4965303,4896434)\nid in (4584518,3249934,3218025,3891133,3399450,4172999,4485161,3101785,4587203,3070816,2870343,2870341,3563940,4550846,3424464,3249963,2870342)\n;\n\nselect * from activities where id = 26654935;\nSELECT * FROM opportunities WHERE id = 4803458;\n\nSELECT * FROM opportunities where team_id = 260 and user_id = 13841 AND stage_id = 15900;\nSELECT id, uuid, provider, type, lead_id, account_id, contact_id, opportunity_id, stage_id, status, recording_state, title, actual_start_time, actual_end_time\nFROM activities WHERE user_id = 13841 AND opportunity_id IN (4729783, 4731717, 4731726, 4732064, 4732849, 4803458, 4813213);\n\nSELECT DISTINCT\n o.id, o.stage_id, s.name, a.title,\n a.*\nFROM activities a\n# INNER JOIN tracks t ON a.id = t.activity_id\nINNER JOIN users u ON a.user_id = u.id\nINNER JOIN teams team ON u.team_id = team.id\nINNER JOIN groups g ON u.group_id = g.id\nINNER JOIN opportunities o ON a.opportunity_id = o.id\nINNER JOIN stages s ON o.stage_id = s.id\nWHERE\n a.crm_configuration_id = 356\n AND a.status IN ('completed', 'failed')\n AND a.recording_state != 'stopped'\n# and a.user_id = 13841\n AND u.uuid = uuid_to_bin('6f40e4b8-c340-4059-b4ac-1728e87ea99e')\n AND team.uuid = uuid_to_bin('a607fba7-452e-4683-b2af-00d6cb52c93c')\n AND g.uuid = uuid_to_bin('b5d69e40-24a0-4c16-810b-5fa462299f94')\n\n AND a.type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')\n# AND t.type IN ('audio', 'video')\n AND (\n (a.actual_start_time BETWEEN '2025-03-13 00:00:00' AND '2025-03-18 07:59:59')\n OR\n (\n a.actual_start_time IS NULL\n AND a.type IN ('sms-outbound', 'sms-inbound')\n AND a.created_at BETWEEN '2025-03-13 00:00:00' AND '2025-03-18 07:59:59'\n )\n )\n AND (\n a.is_private = 0\n OR (\n a.is_private = 1\n AND u.uuid = uuid_to_bin('6f40e4b8-c340-4059-b4ac-1728e87ea99e')\n )\n )\n AND (\n# s.id = 15900\n s.uuid = uuid_to_bin('04ca1c26-c666-4268-a129-419c0acffd73')\n OR s.uuid IS NULL -- Include records without opportunity stage\n )\n\nORDER BY a.actual_end_time DESC;\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Lead Forensics%'; # 190, 162, 8474, willsc@leadforensics.com\nSELECT * FROM users WHERE team_id = 190;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 190\nand sa.provider = 'hubspot';\n\nselect * from role_user where user_id = 8474;\n\nselect * from crm_configurations where provider = 'bullhorn';\n\nSELECT * FROM opportunities WHERE uuid_to_bin('94578249-65ec-4205-90f2-7d1a7d5ab64a') = uuid;\nSELECT * FROM users WHERE uuid_to_bin('26dbadeb-926f-4150-b11b-771b9d4c2f9a') = uuid;\n\nSELECT * FROM opportunities WHERE id = 4732493;\nselect * from activities where opportunity_id = 4732493;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE id = 443; # 358, 14315, andrea.romano@correrenaturale.com\nSELECT * FROM opportunities WHERE team_id = 443;\n\nSELECT a.id, a.type, a.user_id, a.status, a.deleted_at, u.name, u.email, u.team_id as activity_team_id, u.status, u.deleted_at, t.name, t.status, s.team_id as stage_team_id\nFROM activities AS a\nJOIN stages AS s ON a.stage_id = s.id\nJOIN users AS u ON u.id = a.user_id\nJOIN teams AS t ON t.id = s.team_id\nWHERE u.team_id <> s.team_id and t.id > 135;\n\n\nSELECT\n crm_configuration_id,\n crm_provider_id,\n COUNT(*) as duplicate_count,\n GROUP_CONCAT(id) as stage_ids,\n GROUP_CONCAT(name) as stage_names\nFROM stages\nGROUP BY crm_configuration_id, crm_provider_id\nHAVING COUNT(*) > 1\nORDER BY duplicate_count DESC;\n\nselect * from stages where id IN (14898,14907);\n\nselect * from business_processes;\n\nSELECT *\nFROM crm_configurations\nWHERE team_id IN (\n SELECT team_id\n FROM crm_configurations\n GROUP BY team_id\n HAVING COUNT(*) > 1\n)\nORDER BY team_id;\n\nSELECT *\nFROM teams\nWHERE crm_id IN (\n SELECT crm_id\n FROM teams\n GROUP BY crm_id\n HAVING COUNT(*) > 1\n)\nORDER BY crm_id;\n\n# ***************************************************************************\nselect * from crm_configurations where provider = 'integration-app';\nSELECT * FROM teams WHERE id = 443; # Correre Naturale 358 14315 andrea.romano@correrenaturale.com\nselect * from activities where crm_configuration_id = 358 order by actual_end_time desc;\nselect id, uuid, actual_end_time, crm_provider_id, is_internal, playbook_category_id, type, user_id, lead_id, contact_id, account_id, opportunity_id, status, title from activities where crm_configuration_id = 358 order by actual_end_time desc;\nselect * from team_features where team_id = 358;\nselect * from activity_summary_logs;\n\nselect * from teams where id = 406;\n\n# ************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Sportfive%'; # 267, 202, 14637, srv.salesforce@sportfive.com\nselect * from activities where crm_configuration_id = 202 order by actual_end_time desc;\n\nSELECT * FROM users where id = 14637;\nSELECT * FROM teams where id = 267;\nSELECT * FROM groups where id = 1118;\n\nselect g.name, a.title, uuid_from_bin(a.uuid), a.external_id, a.status, a.recording_state, a.recording_reason_code, a.scheduled_start_time, a.scheduled_end_time, a.actual_start_time, a.actual_end_time from activities a\ninner join users u on u.id = a.user_id\ninner join groups g on g.id = u.group_id\nwhere a.crm_configuration_id = 202\nand a.is_internal = 0\nand (a.scheduled_start_time between '2025-03-19 00:00:00' and '2025-03-21 00:00:00')\nand a.type = 'conference'\nand a.status != 'completed'\nand a.external_id is not null\norder by a.scheduled_start_time desc;\n\nSELECT * FROM activities\nWHERE crm_configuration_id = 202\n AND status IN ('completed', 'failed')\n AND recording_state != 'stopped'\n AND type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')\n AND (is_private = 0 OR user_id = 14637)\n AND (\n (\n actual_start_time BETWEEN '2025-03-12 12:00:00' AND '2025-03-24 11:59:59'\n ) OR (\n actual_start_time IS NULL\n AND type IN ('sms-outbound', 'sms-inbound')\n AND created_at BETWEEN '2025-03-12 12:00:00' AND '2025-03-24 11:59:59'\n )\n )\n AND NOT EXISTS (\n SELECT 1\n FROM tracks\n WHERE\n tracks.activity_id = activities.id\n AND tracks.type IN ('audio', 'video')\n )\nORDER BY actual_end_time DESC;\n\nSELECT DISTINCT\n a.*\nFROM activities a\nINNER JOIN tracks t ON a.id = t.activity_id\nINNER JOIN users u ON a.user_id = u.id\nINNER JOIN teams team ON u.team_id = team.id\nWHERE\n a.crm_configuration_id = 202\n AND a.status IN ('completed', 'failed')\n AND a.recording_state != 'stopped'\n# and a.user_id = 14637\n AND a.type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')\n# AND t.type IN ('audio', 'video')\n AND (\n (a.actual_start_time BETWEEN '2025-03-12 12:00:00' AND '2025-03-24 11:59:59')\n OR\n (\n a.actual_start_time IS NULL\n AND a.type IN ('sms-outbound', 'sms-inbound')\n AND a.created_at BETWEEN '2025-03-12 12:00:00' AND '2025-03-24 11:59:59'\n )\n )\n AND (\n a.is_private = 0\n OR (\n a.is_private = 1\n AND a.user_id = 14637\n )\n )\n\nORDER BY a.actual_end_time DESC\n;\n\nSELECT DISTINCT a.*\nFROM activities a\nINNER JOIN users u ON a.user_id = u.id\nINNER JOIN teams t ON u.team_id = t.id\n# INNER JOIN tracks tr ON a.id = tr.activity_id\n# INNER JOIN groups g ON u.group_id = g.id\nWHERE 1=1\n AND t.id = 267\n# AND t.uuid = uuid_to_bin('aed4927b-f1ea-499e-94c3-83762fd233e8')\n AND a.status IN ('completed', 'failed')\n AND a.recording_state != 'stopped'\n AND a.type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')\n# AND tr.type NOT IN ('audio', 'video')\n AND (\n a.is_private = 0\n OR a.user_id = 14637\n )\n AND (\n (a.actual_start_time BETWEEN '2025-03-19 00:00:00' AND '2025-03-21 23:59:59')\n OR (\n a.actual_start_time IS NULL\n AND a.type IN ('sms-outbound', 'sms-inbound')\n AND a.created_at BETWEEN '2025-03-19 00:00:00' AND '2025-03-21 23:59:59'\n )\n )\n# and NOT EXISTS (\n# SELECT 1\n# FROM tracks t\n# WHERE t.activity_id = a.id\n# AND t.type IN ('audio', 'video')\n# )\n\nORDER BY a.actual_end_time DESC;\n\nSELECT * FROM tracks WHERE activity_id = 26485995;\n\nselect a.is_private, a.title, uuid_from_bin(a.uuid), a.external_id, a.status, a.recording_state, a.recording_reason_code, a.scheduled_start_time, a.scheduled_end_time, a.actual_start_time, a.actual_end_time from activities a\ninner join users u on u.id = a.user_id\nwhere a.crm_configuration_id = 202\n# and a.is_internal = 0\nand (a.actual_start_time between '2025-03-19 00:00:00' and '2025-03-21 00:00:00')\nand a.type IN (\"softphone\",\"softphone-inbound\",\"conference\",\"sms-inbound\")\nand a.status IN ('completed', 'failed')\n# and a.external_id is not null\norder by a.actual_end_time desc;\n\nselect * from activities a where a.crm_configuration_id = 202\nand a.actual_start_time between '2025-03-20 00:00:00' and '2025-03-21 00:00:00'\n# AND a.type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')\n\nselect g.name, a.title, uuid_from_bin(a.uuid), a.external_id, a.status, a.recording_state, a.recording_reason_code, a.scheduled_start_time, a.scheduled_end_time, a.actual_start_time, a.actual_end_time from activities a\ninner join users u on u.id = a.user_id\ninner join groups g on g.id = u.group_id\nwhere a.crm_configuration_id = 202\nand a.is_internal = 0\nand (a.scheduled_start_time between '2025-03-19 00:00:00' and '2025-03-21 00:00:00')\nand a.type = 'conference'\nand a.status != 'completed'\nand a.external_id is not null\norder by a.scheduled_start_time desc;\n\nSELECT * FROM teams WHERE name LIKE '%Tourlane%';\nSELECT * FROM crm_fields WHERE crm_configuration_id = 209 and object_type = 'opportunity';\nSELECT * FROM crm_field_data WHERE crm_field_id = 98809;\n\nselect * from users where status = 1 AND timezone = 'MDT';\n\nselect * from opportunities where id = 3769814;\nselect * from deal_risks where opportunity_id = 3769814;\n\nselect cp.* from crm_profiles cp\njoin users u on cp.user_id = u.id\njoin crm_configurations crm on cp.crm_configuration_id = crm.id\nwhere crm.provider = 'hubspot' AND u.status = 1 AND log_notes != 'none';\n\nselect * from crm_fields where id = 154575;\n\nselect * from team_features where feature = 'SUPPORTS_SYNC_MISSING_CALL_DISPOSITIONS';\nSELECT * FROM teams WHERE id = 176; # crm 148\nselect * from activities where crm_configuration_id = 148 and provider = 'hubspot' order by id desc;\n\nselect * from activity_providers where provider = 'amazon-connect';\n\nselect * from crm_fields cf\njoin crm_configurations crm on crm.id = cf.crm_configuration_id\nwhere crm.provider = 'hubspot' and cf.object_type IN ('account', 'contact');\n\n# *********************************************************************************************\nSELECT * FROM users WHERE id IN (15415, 15418);\nSELECT * FROM groups WHERE id IN (1805,1806);\nSELECT * FROM playbooks WHERE id = 1860;\nSELECT * FROM playbook_categories WHERE id = 38634;\nSELECT * FROM crm_fields WHERE id = 189962;\n\nSELECT * FROM teams WHERE name = 'Pulsar Group'; # 472, 380, 15138 raza.gilani@vuelio.com\n\nSELECT * FROM crm_profiles WHERE user_id = 15415;\nSELECT * FROM social_accounts WHERE sociable_id = 15415 and provider = 'salesforce';\n\nselect * from sidekick_settings where team_id = 472;\n\nSELECT * FROM activities WHERE uuid_to_bin('452c58c7-b87c-4fdd-953e-d7af185e9588') = uuid; # 28617536, user: 15418\nSELECT * FROM activities WHERE uuid_to_bin('399114ee-d3a8-458c-bff5-5f654658db0a') = uuid; # 28344407, user: 15415\nSELECT * FROM activities WHERE uuid_to_bin('f0aa567f-0ab1-4bbb-96aa-37dcf184676b') = uuid; # 28580288, user: 15415\nSELECT * FROM activities WHERE uuid_to_bin('50c086b1-2770-4bca-b5ae-6bac22ec426b') = uuid; # 28566069, user: 15415\n\n# *********************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%TeamTailor%'; # 109, 218, 13969, salesforce-integrations@teamtailor.com\nselect * from crm_configurations where id = 218;\nSELECT * FROM activities WHERE uuid_to_bin('e39b5857-7fdb-4f5a-951a-8d3ca69bb1b0') = uuid; # 28338765\nSELECT * FROM users WHERE id IN (13232, 13230);\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 109\nand sa.provider = 'salesforce';\n\n0057R00000EPL5HQAX Inez Ekblad\n\n1091cb81-5ea1-4951-a0ed-f00b568f0140 Triman Kaur\n\nSELECT * FROM crm_profiles WHERE user_id IN (13232, 13230);\n\n############################################################################################\nSELECT * FROM activities WHERE uuid_to_bin('675eeaeb-5681-42db-90bc-54c07a604408') = uuid; # 28655939 00UVg00000FLvnSMAT\nSELECT * FROM crm_field_data WHERE activity_id = 28655939;\nSELECT * FROM crm_fields WHERE id IN (94491,94493,94498);\nSELECT * FROM users WHERE id = 13658;\nSELECT * FROM teams WHERE id = 109;\nSELECT * FROM crm_configurations WHERE id = 218;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 109\nand sa.provider = 'salesforce';\n\n# ********************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Strengthscope%'; # 481, 390, 15420, katy.holden@strengthscope.comk\nSELECT * FROM stages WHERE crm_configuration_id = 390;\nselect * from business_processes where team_id = 481 and crm_configuration_id = 390;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 481\nand sa.provider = 'salesforce';\n\n\nSELECT * FROM users WHERE id = 15780; # team 462\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 462\nand sa.provider = 'hubspot';\n\n\nselect * from teams where id = 495;\nSELECT * FROM users WHERE id = 15794;\nselect * from social_accounts where sociable_id = 15794;\n\n# ********************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Flight%'; # 427, 333, 13752\nSELECT * FROM accounts WHERE team_id = 427 and crm_provider_id = '668731000183444517';\n\n# ********************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Group GTI%'; # 495, 407, 15794\nSELECT * FROM activities WHERE crm_configuration_id = 407\nand status = 'completed' and type = 'conference'\norder by id desc;\n\nselect ru.*, pr.*, p.* from users u join role_user ru on ru.user_id = u.id\njoin permission_role pr on pr.role_id = ru.role_id\n join permissions p on p.id = pr.permission_id\nwhere team_id = 495 and p.name IN ('dial');\n\nselect * from permission_role;\n\nselect * from activities where crm_configuration_id = 407 and status = 'completed' order by id desc;\nSELECT * FROM activities WHERE id = 29512773;\nSELECT * FROM activities WHERE id IN (29042721,28991325,29002874);\n\nSELECT al.* from activity_summary_logs al join activities a on a.id = al.activity_id\nwhere a.crm_configuration_id = 407\n# and a.id IN (29042721,28991325,29002874);\n\nSELECT * FROM users WHERE id = 15794;\nSELECT * FROM users WHERE team_id = 495;\nSELECT * FROM social_accounts WHERE sociable_id = 15794;\nSELECT * FROM opportunities WHERE team_id = 495 and name like '%OC:%';\nSELECT * FROM contacts WHERE team_id = 495;\nSELECT * FROM leads WHERE team_id = 495;\nSELECT * FROM accounts WHERE team_id = 495;\nSELECT * FROM crm_profiles WHERE crm_configuration_id = 407;\nSELECT * FROM crm_fields WHERE crm_configuration_id = 407;\nSELECT * FROM crm_configurations WHERE id = 407;\nSELECT * FROM opportunities WHERE team_id = 495 and close_date BETWEEN '2025-06-01' AND '2025-07-01'\nand user_id IS NOT NULL and is_closed = 1 and is_won = 1;\n\n# ********************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Hamilton Court FX LLP%'; # 249, 187, 10103\nSELECT * FROM activities WHERE uuid_to_bin('4659c2bb-9a49-484e-9327-a3d66f1e028c') = uuid; # 28951064\nSELECT * FROM crm_fields WHERE crm_configuration_id = 187 and object_type IN ('tasks', 'event');\n\n# *********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Checkstep%'; # 325, 256, 11753\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 325\nand sa.provider = 'hubspot';\n\nSELECT * FROM activities WHERE uuid_to_bin('7be372e2-1916-4d79-a2f3-ca3db1346db3') = uuid; # 28611085\nSELECT * FROM activities WHERE uuid_to_bin('980f0336-840b-4185-a5a9-30cf8b0749a8') = uuid; # 28719733\nSELECT * FROM activity_summary_logs where activity_id = 28719733;\n\n# *************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Learning%'; # 260, 356, 9444\nSELECT * FROM activity_summary_logs where sent_at BETWEEN '2025-06-09 11:38:00' AND '2025-06-09 11:40:00';\nSELECT * FROM leads WHERE crm_configuration_id = 356 and crm_provider_id = '230045001502770504'; # 823630\nselect * from activities where crm_configuration_id = 356 and lead_id = 841732;\n\nSELECT * from activity_summary_logs al join activities a on a.id = al.activity_id\nwhere a.crm_configuration_id = 356;\n\nselect * from activities where crm_configuration_id = 356\nand actual_end_time between '2025-06-09 11:00:00' and '2025-06-09 12:00:00'\norder by id desc;\n\nselect * from accounts where crm_configuration_id = 356 and crm_provider_id = '230045001514403366' order by id desc;\nselect * from leads where crm_configuration_id = 356 and crm_provider_id = '230045001514275654' order by id desc;\nselect * from contacts where crm_configuration_id = 356 and crm_provider_id = '230045001514403366' order by id desc;\nselect * from opportunities where crm_configuration_id = 356 and crm_provider_id = '230045001514403366' order by id desc;\n\nselect * from team_features where team_id = 260;\nselect * from features where id IN (1,2,4,6,18,19,20,9,10,3,23,24,25,26,27);\n\nSELECT * FROM activities WHERE uuid_to_bin('7be372e2-1916-4d79-a2f3-ca3db1346db3') = uuid;\n\nselect * from crm_fields;\nselect * from crm_layout_entities;\n\nSELECT * FROM teams WHERE name LIKE '%Optable%';\n\n# *************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Teamtailor%'; # 109, 218, 13969\nSELECT * FROM crm_configurations WHERE id = 218;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 109\nand sa.provider = 'salesforce';\nSELECT * FROM activities WHERE uuid_to_bin('675eeaeb-5681-42db-90bc-54c07a604408') = uuid; # 28655939\nSELECT * FROM crm_field_data WHERE activity_id = 28655939;\nSELECT * FROM crm_fields WHERE id in (94491,94493,94498);\n\nselect * from teams where crm_id IS NULL;\n\nSELECT * FROM activities WHERE uuid_to_bin('71aa8a0c-9652-4ff6-bee7-d98ae60abef6') = uuid;\n\n# *************************************************************************************************\nselect * from team_domains where team_id = 399;\nSELECT * FROM teams WHERE name LIKE '%Rydoo%'; # 399, 318, 13207\n\nselect * from calendar_events where id = 5163781;\nSELECT * FROM activities WHERE uuid_to_bin('be2cbc52-7fda-46a0-9ae0-25d9553eafc0') = uuid; # 29443896\nSELECT * FROM participants WHERE activity_id = 29443896;\nselect * from contacts where crm_configuration_id = 318 and email = 'marianne.westeng@strawberry.no';\nselect * from leads where crm_configuration_id = 318 and email = 'marianne.westeng@strawberry.no';\n\nselect * from activities where user_id = 14937 order by created_at ;\n\nselect * from users where id = 14937;\n\nselect * from contacts where crm_configuration_id = 318 and email LIKE '%@strawberry.se';\nselect * from opportunities where crm_configuration_id = 318 and crm_provider_id = '006Sf00000D1WOAIA3';\n\nselect * from activities a join participants p on a.id = p.activity_id\nwhere crm_configuration_id = 318 and a.updated_at > '2025-06-23T08:18:43Z';\n\n# *************************************************************************************************\nSELECT * FROM opportunities WHERE team_id = 379 and crm_provider_id = '39334518886';\nSELECT * FROM opportunities WHERE team_id = 379 order by id desc;\nSELECT * FROM teams WHERE id = 379;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 379 and sociable_id = 13852\nand sa.provider = 'hubspot';\n\nSELECT * FROM crm_configurations WHERE id = 307;\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 307;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1027;\nSELECT * FROM crm_fields WHERE crm_configuration_id = 307\n and id IN (144750,144855,145158,155227);\n\nSELECT * FROM activities;\n\n\nselect * from activities\nwhere created_at > '2025-07-01 00:00:00'\n# and created_at < '2025-08-01 00:00:00'\nand type not in ('email-outbound', 'email-inbound')\nand account_id is null\nand contact_id is null\nand lead_id is null\nand opportunity_id is not null\n;\nSELECT * FROM activities WHERE id IN (25344155, 25344296, 25501909, 28692187);\nSELECT * FROM crm_configurations WHERE id in (335,301,200);\n\nselect * from crm_fields where crm_configuration_id = 230 and crm_provider_id = 'Age2__c';\n\nSELECT * FROM teams WHERE name LIKE '%Resights%';\nselect * from crm_fields where crm_configuration_id = 1 and object_type = 'opportunity';\n\nselect * from crm_configurations where provider = 'bullhorn'; # 344\nselect * from teams where id IN (442);\n\nselect * from activities\nwhere crm_configuration_id = 177\nand provider = 'amazon-connect'\n order by id desc;\n# and source <> 'gong';\n\nselect * from activity_providers where provider = 'amazon-connect';\n\nSELECT * FROM activities WHERE uuid_to_bin('cec1993b-a7e5-4164-b74d-d680ea51d2f2') = uuid;\n\n\nselect * from crm_configurations where store_transcript = 1;\nSELECT * FROM teams WHERE id IN (80);\n\n# *************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Sedna%'; # 277, 213, 12594\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 277\nand sa.provider = 'salesforce';\n\nselect * from activities where crm_configuration_id = 213 and account_id = 2511502;\n\nselect * from crm_configurations where id = 213;\n\nSELECT * FROM activities WHERE uuid_to_bin('35aa790a-8569-4544-8268-66f9a4a26804') = uuid; # 33981604\nSELECT * FROM participants WHERE activity_id = 33981604;\nSELECT * FROM crm_fields WHERE crm_configuration_id = 337 and object_type = 'task';\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 431\nand sa.provider = 'salesforce';\nSELECT * FROM activities WHERE uuid_to_bin('b5476c7d-19a8-491b-869d-676ea1e857b6') = uuid; # 33997223\nselect * from activity_summary_logs where activity_id = 33997223;\nselect * from activity_notes where activity_id = 33997223;\n\n# ***********************************\nSELECT * FROM teams WHERE name LIKE '%Abode%';\n\n\nselect * from features;\nselect * from teams t\nwhere t.status = 'active'\nand id NOT IN (select team_id from team_features where feature_id = 9)\n;\n\n\nselect * from playbook_layouts where playbook_id = 1725;\nSELECT * FROM activities WHERE uuid_to_bin('65cc283c-4849-49e6-927f-4c281c8fea19') = uuid; # 34297473\nselect * from teams where id = 318;\nselect * from crm_configurations where team_id = 318;\nselect * from playbooks where team_id = 318;\nSELECT * FROM crm_layouts where crm_configuration_id = 381;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1259;\nSELECT * FROM crm_fields WHERE id IN (192938,192936,192939);\n\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1266;\nSELECT * FROM crm_fields WHERE id IN (192980,192991,192997,192998,193064,193067);\n\nSELECT * FROM activities WHERE uuid_to_bin('a902289b-285c-48eb-9cc2-6ad6c5d938f5') = uuid; # 34297533\n\n\n\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 927;\nSELECT * FROM crm_fields WHERE id IN (131668,131669,131670,131671,131676,131797);\n\nSELECT * FROM teams WHERE name LIKE '%Peripass%'; # 351, 281, 12124\nselect * from crm_layouts where crm_configuration_id = 281;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 927;\nselect * from crm_fields where crm_configuration_id = 281 and id in (131668,131669,131670,131671,131676,131797);\nselect * from opportunities where crm_configuration_id = 281;\n\nSELECT * FROM activities WHERE id IN (34211315, 34130075);\nSELECT * FROM crm_field_data WHERE object_id IN (34211315, 34130075);\n\nselect cf.crm_configuration_id, cle.crm_layout_id, cle.id, cf.id from crm_field_data cfd\njoin crm_layout_entities cle on cle.id = cfd.crm_layout_entity_id\njoin crm_fields cf on cle.crm_field_id = cf.id\nwhere cf.deleted_at IS NOT NULL\nGROUP BY cle.id, cf.id;\n\nselect * from crm_layouts where id IN (355);\nselect u.email, t.crm_id, t.* from teams t\njoin users u on u.id = t.owner_id\nwhere crm_id IN (97);\n\nSELECT * FROM crm_fields WHERE id = 96492;\n\nselect * from permissions;\nselect * from permission_role where permission_id = 247;\nselect * from roles;\n\nselect * from migrations;\n# *****************************************************************\nSELECT * FROM activities WHERE uuid_to_bin('291e3c21-11cc-4728-aee7-6e4bedf86d72') = uuid; # 34262174\nSELECT * FROM crm_configurations WHERE id = 301;\nSELECT * FROM teams WHERE id = 343;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 343\nand sa.provider = 'hubspot';\n\nselect * from participants where activity_id = 34262174;\n\nselect * from contacts where crm_configuration_id = 301 and id = 6976326;\nselect * from accounts where crm_configuration_id = 301 and id IN (4647626, 4815829); # 30761335403\n\nselect * from activity_summary_logs where activity_id = 34262174;\n\nselect * from users where status = 1 AND timezone = 'EST';\n\n# ****************************************************************************\nSELECT * FROM users WHERE id = 13869;\nSELECT * FROM crm_configurations WHERE id = 320;\nSELECT * FROM teams WHERE id = 401;\n\nSELECT * FROM activities WHERE uuid_to_bin('2228c16f-10be-48d5-90d4-67385219dc01') = uuid; # 29670601\n\nSELECT * FROM accounts WHERE id = 7761483;\nSELECT * FROM opportunities WHERE id = 6051814;\n\nSELECT * FROM teams WHERE name LIKE '%Seedlegals%';\n\n;select * from opportunities where updated_at > '2025-10-11' AND crm_provider_id = '34713761166';\n\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 177;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 577;\nSELECT * FROM crm_fields WHERE id IN (68458,68459,68480,68497,68524,68530,68554,68618,68662,68781,68810,68898,68981,69049,97467);\n\nSELECT t.id, crm.id, t.name, crm.sync_objects, crm.provider, crm.last_synced_at FROM crm_configurations crm join teams t on t.crm_id = crm.id\nwhere t.status = 'active' AND crm.provider = 'hubspot' AND crm.last_synced_at < '2025-10-22 00:00:00';\n\nSELECT * FROM activities WHERE uuid_to_bin('fa09449f-cba9-496a-b8f3-865cd3c72351') = uuid;\nSELECT * FROM crm_configurations where id = 184;\nSELECT * FROM teams WHERE id = 246;\nSELECT * FROM social_accounts WHERE sociable_id = 9259 and provider = 'hubspot';\n\nSELECT * FROM users WHERE email LIKE '%rhian.old@bud.co.uk%'; # 17700\nSELECT * FROM teams WHERE id = 551;\n\nSELECT * FROM crm_configurations WHERE id = 471;\nSELECT * FROM activities WHERE crm_configuration_id = 471 and crm_provider_id IS NOT NULL;\nSELECT * FROM crm_fields WHERE crm_configuration_id = 471;\nSELECT * FROM crm_fields WHERE id = 307260;\nSELECT * FROM crm_field_values WHERE crm_field_id = 307260;\n\nselect * from crm_layouts where crm_configuration_id = 471;\n\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1547;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1548;\n\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 551 and sa.provider = 'hubspot';\n\nSELECT * FROM teams WHERE name LIKE '%$PCS%';\n\n# ********************************************************************************************************\nselect * from crm_configurations crm\njoin teams t on t.crm_id = crm.id\nwhere t.status = 'active'\nand crm.provider = 'hubspot';\n\n# $slug = 'HUBSPOT_WEBHOOK_SYNC';\n# $team = Jiminny\\Models\\Team::find(2);\n# $feature = Feature::query()->where('slug', $slug)->first();\n# TeamFeature::query()->create(['feature_id' => $feature->getId(),'team_id' => $team->getId()]);\n\n# hubspot_webhook_metrics\n\nselect * from crm_configurations where id = 331; # 416\nSELECT * FROM teams WHERE id = 416;\nSELECT * FROM opportunities WHERE team_id = 190;\n\nSELECT * FROM teams WHERE name LIKE '%Lead Forensics%';\nSELECT sa.id,\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 190 and sa.provider = 'hubspot';\n\n\n\nSELECT * FROM teams WHERE name LIKE '%Rapaport%'; # 431, 337\nSELECT * FROM teams where id = 431;\nSELECT * FROM crm_configurations where team_id = 431;\nSELECT * FROM activity_providers where team_id = 431;\nSELECT * FROM activities where crm_configuration_id = 337 and type IN ('softphone', 'softphone-outbound')\nand provider NOT IN ('hubspot', 'aircall')\n# and telephony_provider_id = '019c1131-a22f-4792-b9ea-20adf6a02ed0'\norder by id desc;\nSELECT sa.id,\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 431 and sa.provider = 'salesforce';\n\nSELECT * FROM teams WHERE name LIKE '%BiP%'; # 401, 320\nSELECT * FROM teams where id = 401;\nSELECT * FROM crm_configurations where team_id = 401;\nSELECT * FROM activity_providers where team_id = 401;\nSELECT * FROM activities where crm_configuration_id = 320 and type IN ('softphone', 'softphone-outbound')\nand provider NOT IN ('hubspot', 'aircall')\n# and telephony_provider_id = '019c1131-a22f-4792-b9ea-20adf6a02ed0'\norder by id desc;\nSELECT sa.id,\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 401 and sa.provider = 'salesforce';\n\n\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 307; # 379 - Story Terrace Inc , portalId: 3921157\nSELECT * FROM contacts WHERE team_id = 379 and updated_at > '2026-01-31 11:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 379 and updated_at > '2026-02-01 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 379 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 379 and sa.provider = 'hubspot';\n\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 485; # 563 - LATUS Group (ad94d501-5d09-44fd-878f-ca3a9f8865c3) , portalId: 3904501\nSELECT * FROM opportunities WHERE team_id = 563 and updated_at > '2026-02-02 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 563 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 338; # 432 - Formalize , portalId: 9214205\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 432 and sa.provider = 'hubspot';\nSELECT * FROM opportunities WHERE team_id = 432 and updated_at > '2026-02-02 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 432 and updated_at > '2026-02-10 00:00:00' order by updated_at desc;\n\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 436; # 519 - Moxso , portalId: 25531989\nSELECT * FROM opportunities WHERE team_id = 519 and updated_at > '2026-02-02 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 519 and updated_at > '2026-02-04 11:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 96; # 119 - Nourish Care , portalId: 26617984\nSELECT * FROM opportunities WHERE team_id = 119 and updated_at > '2026-02-02 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 119 and updated_at > '2026-02-04 11:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 331; # 416 - The National College , portalId: 7213852\nSELECT * FROM opportunities WHERE team_id = 416 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 416 and updated_at > '2026-02-04 11:00:00' order by updated_at desc;\n\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 308; # 380 - Foodles , portalId: 7723616\nSELECT * FROM opportunities WHERE team_id = 380 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 380 and updated_at > '2026-02-06 10:30:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 379; # 471 - imat-uve , portalId: 9177354\nSELECT * FROM opportunities WHERE team_id = 471 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 471 and updated_at > '2026-02-06 10:30:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 465; # 545 - Spotler , portalId: 144759271\nSELECT * FROM opportunities WHERE team_id = 545 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 545 and updated_at > '2026-02-06 10:30:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 455; # 537 - indevis , portalId: 25666868\nSELECT * FROM opportunities WHERE team_id = 537 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 537 and updated_at > '2026-02-06 10:30:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 200; # 265 - Jobadder , portalId: 6426676\nSELECT * FROM opportunities WHERE team_id = 265 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 265 and updated_at > '2026-02-06 10:30:00' order by updated_at desc;\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 335; # 429 - Eletive , portalId: 6110563\nSELECT * FROM opportunities WHERE team_id = 429 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 429 and updated_at > '2026-02-09 10:30:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 363; # 456 - Global Group , portalId: 8901981\nSELECT * FROM opportunities WHERE team_id = 456 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 456 and updated_at > '2026-02-09 10:30:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 297; # 369 - Unbiased , portalId: 9229005\nSELECT * FROM opportunities WHERE team_id = 369 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 369 and updated_at > '2026-02-09 10:30:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 353; # 449 - Fuuse , portalId: 25781745\nSELECT * FROM opportunities WHERE team_id = 449 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 449 and updated_at > '2026-02-09 10:30:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 487; # 566 - Nimbus , portalId: 39982590\nSELECT * FROM opportunities WHERE team_id = 566 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 566 and updated_at > '2026-02-09 10:30:00' order by updated_at desc;\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 487;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1630;\nselect * from crm_fields where crm_configuration_id = 487 and\n(uuid_to_bin('4c6b2971-64d4-45b8-b377-427be758b5a5') = uuid or uuid_to_bin('59e368d8-65a0-4b77-b611-db37c99fbe68') = uuid);\nSELECT * FROM crm_field_values WHERE crm_field_id = 375177;\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 420; # 506 - voiio , portalId: 145629154\nSELECT * FROM opportunities WHERE team_id = 506 and updated_at > '2026-02-10 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 506 and updated_at > '2026-02-10 15:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 479; # 558 - Momice , portalId: 535962\nSELECT * FROM opportunities WHERE team_id = 558 and updated_at > '2026-02-10 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 558 and updated_at > '2026-02-10 15:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 59; # 80 - Storyclash GmbH , portalId: 4268479\nSELECT * FROM opportunities WHERE team_id = 80 and updated_at > '2026-02-10 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 80 and updated_at > '2026-02-10 15:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 175; # 203 - Team iAM , portalId: 5534732\nSELECT * FROM opportunities WHERE team_id = 203 and updated_at > '2026-02-10 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 203 and updated_at > '2026-02-10 15:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 368; # 460 - OneTouch Health , portalId: 5534732183355\nSELECT * FROM opportunities WHERE team_id = 460 and updated_at > '2026-02-10 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 460 and updated_at > '2026-02-10 15:00:00' order by updated_at desc;\n\n\n\nselect * from users where id = 29643;\nSELECT * FROM crm_field_values WHERE crm_field_id = 375177;\n# ********************************************************************\nSELECT * FROM teams WHERE name LIKE '%Buynomics%'; # 462, 482, 14910\nSELECT * FROM activities WHERE crm_configuration_id = 482\nand type NOT IN ('email-inbound', 'email-outbound')\n# and description like '%The call focused on understanding Welch%'\norder by id desc;\n\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 462 and sa.provider = 'salesforce';\n\nselect * from contacts where crm_configuration_id = 482 and name = 'Cyndall Hill'; # 15504749\nselect * from contacts where id = 10891096; # 482\nSELECT * FROM activities WHERE crm_configuration_id = 482\nand type NOT IN ('email-inbound', 'email-outbound')\nand contact_id = 15504749\norder by id desc;\n\nselect * from activities where id = 36793003; # 96cc7bc1-8622-4d27-92f4-baf664fc1a56, 00UOf00000PDdOXMA1\nselect * from transcription where id = 7646782;\nselect * from ai_prompts where transcription_id = 7646782;\n\n# ********************************************************************\nSELECT * FROM activities WHERE uuid_to_bin('7a8471a3-847e-4822-802b-ddf426bbc252') = uuid; # 37370018\nSELECT * FROM activity_summary_logs WHERE activity_id = 37370018;\nSELECT * FROM teams WHERE id = 555;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 555 and sa.provider = 'hubspot';\n\n# ********************************************************************\nSELECT * FROM activities WHERE uuid_to_bin('7c17b8aa-09df-4f85-a0f7-51f47afd712d') = uuid; # 37395250\nSELECT * FROM activities WHERE uuid_to_bin('14d60388-260d-494b-aa0d-63fdb1c78026') = uuid; # 37395250\n\nSELECT a.* FROM activities a JOIN crm_configurations c on c.id = a.crm_configuration_id\nwhere a.type IN ('softphone', 'softphone-outbound') and c.provider = 'hubspot'\nand a.provider NOT IN ('hubspot')\n# and a.provider IN ('salesloft')\n# and c.id NOT IN (70)\n# and a.duration > 30\n# and actual_start_time > '2026-02-05 00:00:00'\norder by a.id desc;\n\nSELECT * FROM activities WHERE id = 37549787;\nSELECT * FROM crm_profiles WHERE user_id = 17613;\n\nSELECT * FROM crm_configurations WHERE id = 70;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 93 and sa.provider = 'hubspot';\n\nSELECT asf.activity_search_id, asf.id, asf.value\nFROM activity_search_filters asf\nWHERE asf.filter = 'group_id'\nAND asf.value IN (\n SELECT CONCAT(\n HEX(SUBSTR(uuid, 5, 4)), '-',\n HEX(SUBSTR(uuid, 3, 2)), '-',\n HEX(SUBSTR(uuid, 1, 2)), '-',\n HEX(SUBSTR(uuid, 9, 2)), '-',\n HEX(SUBSTR(uuid, 11))\n )\n FROM groups\n WHERE deleted_at IS NOT NULL\n);\n\nSELECT * FROM crm_configurations WHERE id = 373; # KPSBremen.de 465 # - no social account\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 465 and sa.provider = 'hubspot';\n\nselect * from crm_configurations where id = 494;\n\nSELECT * FROM teams WHERE name LIKE '%splose%'; # 572, 495, 18708\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 572 and sa.provider = 'pipedrive';\n\nselect * from opportunities where team_id = 572\n# and name like '%Onebright%'\n# and is_closed = 1 and is_won = 0\n order by id desc;\n\n\nselect * from users where deleted_at is null and status = 2;\n\nselect * from contacts where id = 17900517;\nselect * from accounts where id = 10109838;\nselect * from opportunities where id = 6955880;\n\nselect * from opportunity_contacts where opportunity_id = 6955880;\nselect * from opportunity_contacts where contact_id = 17900517;\n\nselect * from contact_roles cr join crm_configurations crm on cr.crm_configuration_id = crm.id\nwhere crm.provider != 'salesforce';\n\nSELECT * FROM activities WHERE uuid_to_bin('adcb8331-5988-4353-834e-383a355abba2') = uuid; # 38056424, crm 104659682404\nselect * from teams where id = 456;\nSELECT * FROM crm_configurations WHERE id = 363;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 456 and sa.provider = 'hubspot';\n\nselect * from crm_layouts where crm_configuration_id = 363;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id IN (1203, 1204, 1635);\nSELECT * FROM crm_fields WHERE id IN (181536, 181538, 213455);\n\nSELECT * FROM teams WHERE name LIKE '%Electric%'; # 342, 272, 12767\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 342 and sa.provider = 'pipedrive';\nSELECT * FROM opportunities WHERE crm_configuration_id = 272 and name like 'NORTHUMBRIA POL%'; # and updated_at > '2025-07-01 00:00:00';\nSELECT * FROM opportunities WHERE crm_configuration_id = 272 order by remotely_created_at asc; # and updated_at > '2025-07-01 00:00:00';\nSELECT * FROM opportunities WHERE crm_configuration_id = 272 and updated_at > '2026-01-01 00:00:00';\nSELECT * FROM crm_fields WHERE crm_configuration_id = 272 and object_type = 'opportunity';\nSELECT * FROM crm_field_values WHERE crm_field_id = 127164;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 342 and sa.provider = 'pipedrive';\n\nSELECT * FROM teams WHERE id = 472;\nSELECT * FROM crm_configurations WHERE id = 380;\nselect * from activities where id = 38285673; # 38285673\nSELECT * FROM users WHERE id = 16942;\nSELECT * FROM groups WHERE id = 1964;\nSELECT * FROM playbooks WHERE id = 2033;\n\nselect * from teams where created_at > '2026-03-09';\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 499; # 1065\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1678;\n\nSELECT * FROM teams WHERE id = 575;\nselect * from opportunities where team_id = 575;\n\nSELECT * FROM activities WHERE uuid_to_bin('96b1261f-2357-49f9-ab38-23ce12008ea0') = uuid;\n\nselect * from contacts c\nwhere c.crm_configuration_id = 370 order by c.updated_at desc;\n\nSELECT * FROM participants where activity_id = 38833541;\nSELECT * FROM participants where activity_id = 39216301;\nSELECT * FROM activity_summary_logs where activity_id = 39216301;\nSELECT * FROM activities WHERE uuid_to_bin('c7d99fbe-1fb1-41f2-8f4d-52e2bf70e1e9') = uuid; # 38833541, crm 478116564181\nSELECT * FROM activities WHERE uuid_to_bin('2e6ff4d3-9faa-447a-a8c1-9acde4d885ae') = uuid; # 39216301, crm 480171536586\nselect * from crm_profiles where crm_configuration_id = 319 and crm_provider_id = 525785080;\nselect * from opportunities where crm_configuration_id = 319 and crm_provider_id = 410150124747;\nselect * from accounts where crm_configuration_id = 319 and crm_provider_id = 47150650569;\nselect * from contacts where crm_configuration_id = 319 and crm_provider_id IN ('665587441856', '742723347700');\n# owner 13236 525785080\n# contact 1 16779180 665587441856 - activity - Alex Howes alex@supportroom.com created 2026-01-26\n# contact 2 19247563 742723347700 - ash@supportroom.com 2026-03-24\n# company 4176133 47150650569\n# deal 7100953 410150124747\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 400 and sa.provider = 'hubspot';\n\nselect * from features;\nselect * from team_features where feature_id = 40;\n\nselect * from teams where id = 556; # owner: 18101, crm: 477\nselect * from crm_configurations where id = 477;\nSELECT * FROM users WHERE id = 18101;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 556 and sa.provider = 'integration-app';\n\nselect * from opportunities where id = 7594349;\nselect * from opportunity_stages where opportunity_id = 7594349 order by created_at desc;\nselect * from business_processes where id = 6024;\nselect * from business_process_stages where stage_id = 16352;\nselect * from business_process_stages where business_process_id = 6024;\nselect * from stages where team_id = 459;\nselect * from teams where id = 459;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 459 and sa.provider = 'hubspot';\n\nSELECT os.stage_id, s.crm_provider_id, s.name, COUNT(*) as cnt\nFROM opportunity_stages os\nJOIN stages s ON s.id = os.stage_id\nWHERE os.opportunity_id = 7594349\nGROUP BY os.stage_id, s.crm_provider_id, s.name\nORDER BY cnt DESC;\n\nSELECT s.id, s.crm_provider_id, s.name, s.team_id, s.crm_configuration_id\nFROM stages s\nJOIN business_process_stages bps ON bps.stage_id = s.id\nWHERE bps.business_process_id = 6024\nAND s.crm_provider_id = 'contractsent';\n\nselect * from stages where id IN (16352,20612,18281,7344,16378,16309,5036,15223,14535,6293,12098,11607)\n\nSELECT * FROM teams WHERE name LIKE '%Pulsar Group%'; # 472, 380, 15138, raza.gilani@vuelio.com\nselect * from playbooks where team_id = 472; # event 226147\nSELECT * FROM playbook_categories WHERE playbook_id = 2288;\nSELECT * FROM crm_fields WHERE id = 226147;\nSELECT * FROM crm_field_values WHERE crm_field_id = 226147;\n\nSELECT * FROM crm_configurations WHERE id = 380;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 472 and sa.provider = 'salesforce';","depth":4,"value":"SELECT * FROM team_features where team_id = 1;\n\nSELECT * FROM teams WHERE name LIKE '%Vixio%'; # 340,270,11922\nSELECT * FROM users WHERE team_id = 340; # 12015\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 340\nand sa.provider = 'salesforce';\n# and sa.provider = 'salesloft';\n\nselect * from crm_fields where crm_configuration_id = 270 and object_type = 'event';\n# 125558 - Event Type - Event_Type__c\n# 125552 - Event Status - Event_Status__c\n\nSELECT * FROM sidekick_settings WHERE team_id = 340;\n\nSELECT * FROM crm_field_values WHERE crm_field_id in (125552);\n\nselect * from activities where crm_configuration_id = 270\nand type = 'conference' and crm_provider_id IS NOT NULL\nand actual_start_time > '2024-09-16 09:00:00' order by scheduled_start_time;\n\nSELECT * FROM activities WHERE id = 20871677;\nSELECT * FROM crm_field_data WHERE activity_id = 20871677;\n\nselect * from crm_layouts where crm_configuration_id = 270;\nselect * from crm_layout_entities where crm_layout_id in (886,887);\n\nSELECT * FROM crm_configurations WHERE id = 270;\n\nselect * from playbooks where team_id = 340; # 1514\nselect * from groups where team_id = 340;\nSELECT * FROM crm_fields WHERE id IN (125393, 125401);\n\nselect g.name as 'team name', p.name as 'playbook name', f.label as 'activity type field' from groups g\njoin playbooks p on g.playbook_id = p.id\njoin crm_fields f on p.activity_field_id = f.id\nwhere g.team_id = 340;\n\nSELECT * FROM activities WHERE uuid_to_bin('0c180357-67d2-419e-a8c3-b832a3490770') = uuid; # 20448716\nselect * from crm_field_data where object_id = 20448716;\n\nselect * from activities where crm_configuration_id = 270 and provider = 'salesloft' order by id desc;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%CybSafe%'; # 343,273,12008\nselect * from opportunities where team_id = 343;\nselect * from opportunities where team_id = 343 and crm_provider_id = '18099102526';\nselect * from opportunities where team_id = 343 and account_id = 945217482;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 343\nand sa.provider = 'hubspot';\n\nselect * from accounts where team_id = 343 order by name asc;\n\nselect * from stages where crm_configuration_id = 273 and type = 'opportunity';\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Voyado%'; # 353,283,12143\nSELECT * FROM activities WHERE crm_configuration_id = 283 and account_id = 3777844 order by id desc;\nSELECT * FROM accounts WHERE team_id = 353 AND name LIKE '%Salesloft%';\nSELECT * FROM activities WHERE id = 20717903;\n\nselect * from participants where activity_id IN (20929172,20928605,20928468,20926272,20926271,20926270,20926269,20916499,20916454,20916436,20916435,20900015,20900014,20900013,20897312,20897243,20897241,20897237,20897232,20897229,20893648,20893231,20893230,20893229,20893228,20889784,20885039,20885038,20885037,20885036,20885035,20882728,20882708,20882703,20882702,20869828,20869811,20869806,20869801,20869799,20869798,20869796,20869795,20869794,20869761,20869760,20869759,20868688,20868687,20850340,20847195,20841710,20833967,20827021,20825307,20825305,20825297,20824615,20824400,20823927,20821760,20795588,20794233,20794057,20793710,20785811,20781789,20781394,20781307,20762651,20758453,20758282,20757323,20756643,20756636,20756629,20756627,20756606,20756605,20756604,20756603,20756602,20756600,20756599,20756598,20756595,20756594,20756589,20756587,20756577,20756573,20748918,20748386,20748385,20748384,20748383,20748382,20748381,20748380,20748379,20748377,20748375,20748373,20743301,20717905,20717904,20717903,20717901,20717899);\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 353\nand sa.provider = 'salesforce';\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%modern world business solutions%'; # 345,275,12016, l.atkinson@mwbsolutions.co.uk\nSELECT * FROM activities WHERE uuid_to_bin('3921d399-3fef-4609-a291-b0097a166d43') = uuid;\n# id: 20940638, user: 12022, contact: 5305871\nSELECT * FROM activity_summary_logs WHERE activity_id = 20940638;\nselect * from contacts where team_id = 345 and crm_provider_id = '30891432415' order by name asc; # 5305871\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 345\nand sa.provider = 'hubspot';\n\nselect * from users where team_id = 345 and id = 12022;\nSELECT * FROM crm_profiles WHERE user_id = 12022;\nSELECT * FROM participants WHERE activity_id = 20940638;\nSELECT * FROM users u\nJOIN crm_profiles cp ON u.id = cp.user_id\nWHERE u.team_id = 345;\n\nselect * from contacts where team_id = 345 and crm_provider_id = '30880813535' order by name desc; # 5305871\n\nselect * from team_features where team_id = 345;\nSELECT * FROM activities WHERE uuid_to_bin('11701e2d-2f82-4dab-a616-1db4fad238df') = uuid; # 21115197\nSELECT * FROM participants WHERE activity_id = 20897406;\n\n\n\nSELECT * FROM activities WHERE uuid_to_bin('63ba55cd-1abc-447d-83da-0137000005b7') = uuid; # 20953912\nSELECT * FROM activities WHERE crm_configuration_id = 275 and provider = 'ringcentral' and title like '%1252629100%';\n\n\nSELECT * FROM activities WHERE id = 20946641;\nSELECT * FROM crm_profiles WHERE user_id = 10211;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Lunio%'; # 120,97,10984, triger@lunio.ai\nSELECT * FROM opportunities WHERE crm_configuration_id = 97 and crm_provider_id = '006N1000006c5PpIAI';\nselect * from stages where crm_configuration_id = 97 and type = 'opportunity';\nselect * from opportunities where team_id = 120;\n\n\nselect * from crm_configurations crm join teams t on crm.id = t.crm_id\nwhere 1=1\nAND t.current_billing_plan IS NOT NULL\nAND crm.auto_sync_activity = 0\nand crm.provider = 'hubspot';\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Exclaimer%'; # 270,205,10053,james.lewendon@exclaimer.com\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 270\nand sa.provider = 'salesforce';\nSELECT * FROM activities WHERE uuid_to_bin('b54df794-2a9a-4957-8d80-09a600ead5f8') = uuid; # 21637956\nSELECT * FROM crm_profiles WHERE user_id = 11446;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Cygnetise%'; # 372,300,12554, alex.chikly@cygnetise.com\nselect * from playbooks where team_id = 372;\nselect * from crm_fields where crm_configuration_id = 300 and object_type = 'event'; # 141340\nSELECT * FROM crm_field_values WHERE crm_field_id = 141340;\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 372\nand sa.provider = 'salesforce';\n\nselect * from crm_profiles where crm_configuration_id = 300;\nSELECT * FROM crm_configurations WHERE team_id = 372;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Planday%'; # 291,242,11501,mfa@planday.com\nSELECT * FROM opportunities WHERE team_id = 291 and crm_provider_id = '006bG000005DO86QAG'; # 3207756\nselect * from crm_field_data where object_id = 3207756;\nSELECT * FROM crm_fields WHERE id = 111834;\n\nselect f.id, f.crm_provider_id AS field_name, f.label, fd.object_id AS dealId, fd.value\nFROM crm_fields f\nJOIN crm_field_data fd ON f.id = fd.crm_field_id\nWHERE f.crm_configuration_id = 242\nAND f.object_type = 'opportunity'\nAND fd.object_id IN (3207756)\nORDER BY fd.object_id, fd.updated_at;\n\nSELECT * FROM crm_configurations WHERE auto_connect = 1;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Tour%'; # 187,209,8150,salesforce-admin@tourlane.com\nselect * from group_deal_risk_types drgt join groups g on drgt.group_id = g.id\nwhere g.team_id = 187;\n\nselect * from `groups` where team_id = 187;\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 187\nand sa.provider = 'salesforce';\n\n# Destination - 98870 - Destination__c\n# Stage - 79014 - StageName\n# Land Arrangement - 98856 - Land_Arrangement__c\n# Flight - 98848 - Flight__c\n# Last activity date - 98812 - LastActivityDate\n# Last modified date - 98809 - LastModifiedDate\n# Last inbound mail timestamp - 99151 - Last_Inbound_Mail_Timestamp__c\n# next call - 98864 - Next_Call__c\n\nselect * from crm_fields where crm_configuration_id = 209 and object_type = 'opportunity';\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 209;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 682;\n\nselect * from opportunities where team_id = 187 and name LIKE'%Muriel Sal%';\nselect * from opportunities where team_id = 187 and user_id = 9951 and is_closed = 0;\nselect * from activities where opportunity_id = 3538248;\n\nSELECT * FROM crm_profiles WHERE user_id = 8150;\n\nselect * from deal_risks where opportunity_id = 3538248;\n\nselect * from teams where crm_id IS NULL;\n\nSELECT opp.id AS opportunity_id,\n u.group_id AS group_id,\n MAX(\n CASE\n WHEN a.type IN (\"sms-inbound\", \"sms-outbound\") THEN a.created_at\n ELSE a.actual_end_time\n END) as last_date\nFROM opportunities opp\nleft join activities a on a.opportunity_id = opp.id\ninner join users u on opp.user_id = u.id\nwhere opp.user_id IN (9951)\n\nAND opp.is_closed = 0\nand a.status IN ('completed', 'received', 'delivered') OR a.status IS NULL\ngroup by opp.id;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Cybsafe%'; # 343,301,12008,polly.morphew@cybsafe.com\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 343\nand sa.provider = 'hubspot';\n\nSELECT * FROM crm_profiles WHERE crm_configuration_id = 301;\nSELECT * FROM contacts WHERE id = 6612363;\nSELECT * FROM accounts WHERE id = 4235676;\nSELECT * FROM opportunities WHERE crm_configuration_id = 301 and crm_provider_id = 32983784868;\nselect * from opportunity_stages where opportunity_id = 4503759;\n# SELECT * FROM opportunities WHERE id = 4569937;\n\nselect * from activities where crm_configuration_id = 301;\nSELECT * FROM activities WHERE uuid_to_bin('d3b2b28b-c3d0-4c2d-8ed0-eef42855278a') = uuid; # 26330370\nSELECT * FROM participants WHERE activity_id = 26330370;\n\nSELECT * FROM teams WHERE id = 375;\nselect * from playbooks where team_id = 375;\n\nselect * from stages where crm_configuration_id = 301 and type = 'opportunity';\n\nselect * from teams;\nselect * from contact_roles;\n\nSELECT * FROM opportunities WHERE team_id = 343 and user_id = 12871 and close_date >= '2024-11-01';\n\nselect * from users u join crm_profiles cp on cp.user_id = u.id where u.team_id = 343;\n\nSELECT * FROM crm_field_data WHERE object_id = 3771706;\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 343\nand sa.provider = 'hubspot';\n\nSELECT * FROM crm_fields WHERE crm_configuration_id = 301 and object_type = 'opportunity'\nand crm_provider_id LIKE \"%traffic_light%\";\nSELECT * FROM crm_field_values WHERE crm_field_id IN (144020,144048,144111,144113,144126,144481,144508,144531);\n\nSELECT fd.* FROM opportunities o\nJOIN crm_field_data fd ON o.id = fd.object_id\nWHERE o.team_id = 343\n# and o.user_id IS NOT NULL\nand fd.crm_field_id IN (144020,144048,144111,144113,144126,144481,144508,144531)\nand fd.value != ''\norder by value desc\n# group by o.id\n;\n\nSELECT * FROM opportunities WHERE id = 3769843;\n\nSELECT * FROM teams WHERE name LIKE '%Tour%'; # 187,209,8150, salesforce-admin@tourlane.com\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 209;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 682;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Funding Circle%'; # 220,177,8603,aswini.mishra@fundingcircle.com\nSELECT * FROM activities WHERE uuid_to_bin('7a40e99b-3b37-4bb1-b983-325b81801c01') = uuid; # 23139839\n\n\nSELECT * FROM opportunities WHERE id = 3855992;\n\nSELECT * FROM users WHERE name LIKE '%Angus Pollard%'; # 8988\n\nSELECT * FROM teams WHERE name LIKE '%Story Terrace%'; # 379, 307, 12894\nSELECT * FROM crm_fields WHERE crm_configuration_id = 307 and object_type != 'opportunity';\n\nselect * from contacts where team_id = 379 and name like '%bebro%'; # 5874411, crm: 77229348507\nSELECT * FROM crm_field_data WHERE object_id = 5874411;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 379\nand sa.provider = 'hubspot';\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%mentio%'; # 117, 94, 6371, nikhil.kumar@mention-me.com\nSELECT * FROM activities WHERE uuid_to_bin('82939311-1af0-4506-8546-21e8d1fdf2c1') = uuid;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Tourlane%'; # 187, 209, 8150, salesforce-admin@tourlane.com\nSELECT * FROM opportunities WHERE team_id = 187 and crm_provider_id = '006Se000008xfvNIAQ'; # 3537793\nselect * from generic_ai_prompts where subject_id = 3537793;\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Lunio%'; # 120, 97, 10984, triger@lunio.ai\nSELECT * FROM crm_configurations WHERE id = 97;\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 97;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 355;\nSELECT * FROM crm_fields WHERE id = 32682;\n\nselect cfd.value, o.* from opportunities o\njoin crm_field_data cfd on o.id = cfd.object_id and cfd.crm_field_id = 32682\nwhere team_id = 120\nand cfd.value != ''\n;\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 120\nand sa.provider = 'salesforce';\n\nselect * from opportunities where team_id = 120 and crm_provider_id = '006N1000007X8MAIA0';\nSELECT * FROM crm_field_data WHERE object_id = 2313439;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE id = 410;\nSELECT * FROM teams WHERE name LIKE '%Local Business Oxford%';\nselect * from scorecards where team_id = 410;\nselect * from scorecard_rules;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Funding%'; # 220, 177, 8603, aswini.mishra@fundingcircle.com\nselect * from activities a\njoin opportunities o on a.opportunity_id = o.id\njoin users u on o.user_id = u.id\nwhere a.crm_configuration_id = 177 and a.type LIKE '%email-out%'\n# and a.actual_end_time > '2024-12-16 00:00:00'\n# and o.remotely_created_at > '2024-12-01 00:00:00'\n# and u.group_id = 1014\nand u.id = 9021\norder by a.id desc;\nSELECT * FROM opportunities WHERE id in (3981384,4017346);\nSELECT * FROM users WHERE team_id = 220 and id IN (8775, 11435);\n\nselect * from users where id = 9021;\nselect * from inboxes where user_id = 9021;\n\nselect * from inbox_emails where inbox_id = 1349 and email_date > '2024-12-18 00:00:00';\n\nselect * from email_messages where team_id = 220\nand orig_date > '2024-12-16 00:00:00' and orig_date < '2024-12-19 00:00:00'\nand subject LIKE '%Personal%'\n# and 'from' = 'credit@fundingcircle.com'\n;\n\nselect * from activities a\njoin opportunities o on a.opportunity_id = o.id\nwhere a.user_id = 9021 and a.type LIKE '%email-out%'\nand a.actual_end_time > '2024-12-18 00:00:00'\nand o.user_id IS NOT NULL\nand o.remotely_created_at > '2024-12-01 00:00:00'\norder by a.id desc;\n\nSELECT * FROM opportunities WHERE team_id = 220 and name LIKE '%Right Car move Limited%' and id = 3966852;\nselect * from activities where crm_configuration_id = 177 and type LIKE '%email%' and opportunity_id = 3966852 order by id desc;\n\nselect * from team_settings where name IN ('useCloseDate');\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Hurree%'; # 104, 81, 6175, jfarrell@hurree.co\nSELECT * FROM opportunities WHERE team_id = 104 and name = 'PropOp';\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 104\nand sa.provider = 'hubspot';\n\nselect * from crm_configurations where last_synced_at > '2025-01-19 01:00:00'\nselect * from teams where crm_id IS NULL;\n\nselect t.name as 'team', u.name as 'owner', u.email, u.phone\nfrom teams t\njoin activity_providers ap on t.id = ap.team_id\njoin users u on t.owner_id = u.id\nwhere 1=1\n and t.status = 'active'\n and ap.is_enabled = 1\n# and u.status = 1\n and ap.provider = 'ms-teams';\n\nselect * from crm_configurations where provider = 'bullhorn'; # 344\nSELECT * FROM teams WHERE id = 442; # 14293\nselect * from users where team_id = 442;\nselect * from social_accounts sa where sa.sociable_id = 14293;\nselect * from invitations where team_id = 442;\n\n# ********************************************************************************************************\nSELECT * FROM users WHERE email LIKE '%nea.liikamaa@eletive.com%'; # 14022\nSELECT * FROM teams WHERE id = 429;\nselect * from opportunities where team_id = 429 and crm_provider_id IN (16157415775, 22246219645);\nselect * from activities where opportunity_id in (4340436,4353519);\n\nselect * from transcription where activity_id IN (25630961,25381771);\nselect * from generic_ai_prompts where subject_id IN (4353519);\n\nSELECT\n a.id as activity_id,\n a.opportunity_id,\n a.type as activity_type,\n a.language,\n CONCAT(a.title, a.description) AS mail_content,\n e.from AS mail_from,\n e.to AS mail_to,\n e.subject AS mail_subject,\n e.body AS mail_body,\n p.type as prompt_type,\n p.status as prompt_status,\n p.content AS prompt_content,\n a.actual_start_time as created_at\nFROM activities a\n LEFT JOIN ai_prompts p ON a.transcription_id = p.transcription_id AND p.deleted_at IS NULL\n LEFT JOIN email_messages e ON a.id = e.activity_id\nWHERE a.actual_start_time > '2024-01-01 00:00:00'\n AND a.opportunity_id IN (4353519)\n AND a.status IN ('completed', 'received', 'delivered')\n AND a.deleted_at IS NULL\n AND a.type NOT IN ('sms-inbound', 'sms-outbound')\nORDER BY a.opportunity_id ASC, a.id ASC;\n\nSELECT * FROM users WHERE name LIKE '%George Fierstone%'; # 14293\nSELECT * FROM teams WHERE id = 442;\nSELECT * FROM crm_configurations WHERE id = 344;\nselect * from team_features where team_id = 442;\nselect * from groups where team_id = 442;\nselect * from playbooks where team_id = 442;\nselect * from playbook_categories where playbook_id = 1729;\nselect * from crm_fields where crm_configuration_id = 344 and id = 172024;\nSELECT * FROM crm_field_values WHERE crm_field_id = 172024;\nselect * from crm_layouts where crm_configuration_id = 344;\nselect * from playbook_layouts where playbook_id = 1729;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Learning%'; # 260, 221, 9444\n\nselect s.*\n# , s.sent_at, u.name, a.*\nfrom activity_summary_logs s\ninner join activities a on a.id = s.activity_id\ninner join users u on u.id = a.user_id\nwhere a.crm_configuration_id = 356\nand s.sent_at > date_sub(now(), interval 60 day)\norder by a.actual_end_time desc;\n\nselect * from activities a\n# inner join activity_summary_logs s on s.activity_id = a.id\nwhere a.crm_configuration_id = 356 and a.actual_end_time > date_sub(now(), interval 60 day)\n# and a.crm_provider_id is not null\n# and provider <> 'ringcentral'\nand status = 'completed'\norder by a.actual_end_time desc;\n\nselect * from teams order by id desc; # 17328, 32, 17830, integration-account@jiminny.com\nSELECT * FROM users;\nSELECT * FROM users where team_id = 260 and status = 1; # 201 - 150 active\nSELECT * FROM teams WHERE id = 260;\nselect * from team_settings where team_id = 260;\nselect * from crm_configurations where team_id = 260;\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 356;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1184;\n\nselect * from accounts where crm_configuration_id = 221 order by id desc; # 7000\nselect * from leads where crm_configuration_id = 221 order by id desc; # 0\nselect * from contacts where crm_configuration_id = 221 order by id desc; # 200 000\nselect * from opportunities where crm_configuration_id = 221 order by id desc; # 0\nselect * from crm_profiles where crm_configuration_id = 221 order by id desc; # 23\nselect * from crm_fields where crm_configuration_id = 221;\nselect * from crm_field_values where crm_field_id = 5302 order by id desc;\nselect * from crm_layouts where crm_configuration_id = 221 order by id desc;\nselect * from stages where crm_configuration_id = 221 order by id desc;\n\nselect * from accounts where crm_configuration_id = 356 order by id desc; # 7000\nselect * from leads where crm_configuration_id = 356 order by id desc; # 0\nselect * from contacts where crm_configuration_id = 356 order by id desc; # 200 000\nselect * from opportunities where crm_configuration_id = 356 order by id desc; # 0\nselect * from crm_profiles where crm_configuration_id = 356 order by id desc; # 23\nselect * from crm_fields where crm_configuration_id = 356;\nselect * from crm_field_values where crm_field_id = 5302 order by id desc;\nselect * from crm_layouts where crm_configuration_id = 356 order by id desc;\nselect * from stages where crm_configuration_id = 356 order by id desc;\n\nselect * from playbooks where team_id = 260 order by id desc; # 4 (2 deleted)\nselect * from groups where team_id = 260 order by id desc; # 27 groups, (2 deleted)\nselect * from playbook_layouts where playbook_id IN (1410,1409,1276,1254); # 4\nselect ce.* from calendars c\njoin users u on c.user_id = u.id\njoin calendar_events ce on c.id = ce.calendar_id\nwhere u.team_id = 260\nand (ce.start_time > '2025-02-21 00:00:00')\n;\n# calendar events 1207\n#\n\nselect * from opportunities where team_id = 260;\nSELECT * FROM crm_field_data WHERE object_id = 4696496;\n\nselect * from activities where crm_configuration_id = 356 and crm_provider_id IS NOT NULL;\nselect * from activities where crm_configuration_id IN (221) and provider NOT IN ('ms-teams', 'uploader', 'zoom-bot')\n# and type = 'conference' and status = 'scheduled' and activities.is_internal = 0\nand created_at > '2024-03-01 00:00:00'\norder by id desc; # 880 000, ringcentral, avaya\nSELECT * FROM participants WHERE activity_id = 26371744;\n\n# all activities 942 000 +\n# conference 7385 - scheduled 984 - external 343\n\nselect * from activities where id = 26321812;\nselect * from participants where activity_id = 26321812;\nselect * from participants where activity_id in (26414510,26414514,26414516,26414604,26414653,26414655);\nselect * from leads where id in (720428,689175,731546,645866,621037);\n\nselect * from users where id = 13841;\nselect * from opportunities where user_id = 9541;\nselect * from stages where id = 15900;\n\nselect * from accounts where\n# id IN (4160055,5053725,4965303,4896434)\nid in (4584518,3249934,3218025,3891133,3399450,4172999,4485161,3101785,4587203,3070816,2870343,2870341,3563940,4550846,3424464,3249963,2870342)\n;\n\nselect * from activities where id = 26654935;\nSELECT * FROM opportunities WHERE id = 4803458;\n\nSELECT * FROM opportunities where team_id = 260 and user_id = 13841 AND stage_id = 15900;\nSELECT id, uuid, provider, type, lead_id, account_id, contact_id, opportunity_id, stage_id, status, recording_state, title, actual_start_time, actual_end_time\nFROM activities WHERE user_id = 13841 AND opportunity_id IN (4729783, 4731717, 4731726, 4732064, 4732849, 4803458, 4813213);\n\nSELECT DISTINCT\n o.id, o.stage_id, s.name, a.title,\n a.*\nFROM activities a\n# INNER JOIN tracks t ON a.id = t.activity_id\nINNER JOIN users u ON a.user_id = u.id\nINNER JOIN teams team ON u.team_id = team.id\nINNER JOIN groups g ON u.group_id = g.id\nINNER JOIN opportunities o ON a.opportunity_id = o.id\nINNER JOIN stages s ON o.stage_id = s.id\nWHERE\n a.crm_configuration_id = 356\n AND a.status IN ('completed', 'failed')\n AND a.recording_state != 'stopped'\n# and a.user_id = 13841\n AND u.uuid = uuid_to_bin('6f40e4b8-c340-4059-b4ac-1728e87ea99e')\n AND team.uuid = uuid_to_bin('a607fba7-452e-4683-b2af-00d6cb52c93c')\n AND g.uuid = uuid_to_bin('b5d69e40-24a0-4c16-810b-5fa462299f94')\n\n AND a.type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')\n# AND t.type IN ('audio', 'video')\n AND (\n (a.actual_start_time BETWEEN '2025-03-13 00:00:00' AND '2025-03-18 07:59:59')\n OR\n (\n a.actual_start_time IS NULL\n AND a.type IN ('sms-outbound', 'sms-inbound')\n AND a.created_at BETWEEN '2025-03-13 00:00:00' AND '2025-03-18 07:59:59'\n )\n )\n AND (\n a.is_private = 0\n OR (\n a.is_private = 1\n AND u.uuid = uuid_to_bin('6f40e4b8-c340-4059-b4ac-1728e87ea99e')\n )\n )\n AND (\n# s.id = 15900\n s.uuid = uuid_to_bin('04ca1c26-c666-4268-a129-419c0acffd73')\n OR s.uuid IS NULL -- Include records without opportunity stage\n )\n\nORDER BY a.actual_end_time DESC;\n# ********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Lead Forensics%'; # 190, 162, 8474, willsc@leadforensics.com\nSELECT * FROM users WHERE team_id = 190;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 190\nand sa.provider = 'hubspot';\n\nselect * from role_user where user_id = 8474;\n\nselect * from crm_configurations where provider = 'bullhorn';\n\nSELECT * FROM opportunities WHERE uuid_to_bin('94578249-65ec-4205-90f2-7d1a7d5ab64a') = uuid;\nSELECT * FROM users WHERE uuid_to_bin('26dbadeb-926f-4150-b11b-771b9d4c2f9a') = uuid;\n\nSELECT * FROM opportunities WHERE id = 4732493;\nselect * from activities where opportunity_id = 4732493;\n\n# ********************************************************************************************************\nSELECT * FROM teams WHERE id = 443; # 358, 14315, andrea.romano@correrenaturale.com\nSELECT * FROM opportunities WHERE team_id = 443;\n\nSELECT a.id, a.type, a.user_id, a.status, a.deleted_at, u.name, u.email, u.team_id as activity_team_id, u.status, u.deleted_at, t.name, t.status, s.team_id as stage_team_id\nFROM activities AS a\nJOIN stages AS s ON a.stage_id = s.id\nJOIN users AS u ON u.id = a.user_id\nJOIN teams AS t ON t.id = s.team_id\nWHERE u.team_id <> s.team_id and t.id > 135;\n\n\nSELECT\n crm_configuration_id,\n crm_provider_id,\n COUNT(*) as duplicate_count,\n GROUP_CONCAT(id) as stage_ids,\n GROUP_CONCAT(name) as stage_names\nFROM stages\nGROUP BY crm_configuration_id, crm_provider_id\nHAVING COUNT(*) > 1\nORDER BY duplicate_count DESC;\n\nselect * from stages where id IN (14898,14907);\n\nselect * from business_processes;\n\nSELECT *\nFROM crm_configurations\nWHERE team_id IN (\n SELECT team_id\n FROM crm_configurations\n GROUP BY team_id\n HAVING COUNT(*) > 1\n)\nORDER BY team_id;\n\nSELECT *\nFROM teams\nWHERE crm_id IN (\n SELECT crm_id\n FROM teams\n GROUP BY crm_id\n HAVING COUNT(*) > 1\n)\nORDER BY crm_id;\n\n# ***************************************************************************\nselect * from crm_configurations where provider = 'integration-app';\nSELECT * FROM teams WHERE id = 443; # Correre Naturale 358 14315 andrea.romano@correrenaturale.com\nselect * from activities where crm_configuration_id = 358 order by actual_end_time desc;\nselect id, uuid, actual_end_time, crm_provider_id, is_internal, playbook_category_id, type, user_id, lead_id, contact_id, account_id, opportunity_id, status, title from activities where crm_configuration_id = 358 order by actual_end_time desc;\nselect * from team_features where team_id = 358;\nselect * from activity_summary_logs;\n\nselect * from teams where id = 406;\n\n# ************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Sportfive%'; # 267, 202, 14637, srv.salesforce@sportfive.com\nselect * from activities where crm_configuration_id = 202 order by actual_end_time desc;\n\nSELECT * FROM users where id = 14637;\nSELECT * FROM teams where id = 267;\nSELECT * FROM groups where id = 1118;\n\nselect g.name, a.title, uuid_from_bin(a.uuid), a.external_id, a.status, a.recording_state, a.recording_reason_code, a.scheduled_start_time, a.scheduled_end_time, a.actual_start_time, a.actual_end_time from activities a\ninner join users u on u.id = a.user_id\ninner join groups g on g.id = u.group_id\nwhere a.crm_configuration_id = 202\nand a.is_internal = 0\nand (a.scheduled_start_time between '2025-03-19 00:00:00' and '2025-03-21 00:00:00')\nand a.type = 'conference'\nand a.status != 'completed'\nand a.external_id is not null\norder by a.scheduled_start_time desc;\n\nSELECT * FROM activities\nWHERE crm_configuration_id = 202\n AND status IN ('completed', 'failed')\n AND recording_state != 'stopped'\n AND type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')\n AND (is_private = 0 OR user_id = 14637)\n AND (\n (\n actual_start_time BETWEEN '2025-03-12 12:00:00' AND '2025-03-24 11:59:59'\n ) OR (\n actual_start_time IS NULL\n AND type IN ('sms-outbound', 'sms-inbound')\n AND created_at BETWEEN '2025-03-12 12:00:00' AND '2025-03-24 11:59:59'\n )\n )\n AND NOT EXISTS (\n SELECT 1\n FROM tracks\n WHERE\n tracks.activity_id = activities.id\n AND tracks.type IN ('audio', 'video')\n )\nORDER BY actual_end_time DESC;\n\nSELECT DISTINCT\n a.*\nFROM activities a\nINNER JOIN tracks t ON a.id = t.activity_id\nINNER JOIN users u ON a.user_id = u.id\nINNER JOIN teams team ON u.team_id = team.id\nWHERE\n a.crm_configuration_id = 202\n AND a.status IN ('completed', 'failed')\n AND a.recording_state != 'stopped'\n# and a.user_id = 14637\n AND a.type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')\n# AND t.type IN ('audio', 'video')\n AND (\n (a.actual_start_time BETWEEN '2025-03-12 12:00:00' AND '2025-03-24 11:59:59')\n OR\n (\n a.actual_start_time IS NULL\n AND a.type IN ('sms-outbound', 'sms-inbound')\n AND a.created_at BETWEEN '2025-03-12 12:00:00' AND '2025-03-24 11:59:59'\n )\n )\n AND (\n a.is_private = 0\n OR (\n a.is_private = 1\n AND a.user_id = 14637\n )\n )\n\nORDER BY a.actual_end_time DESC\n;\n\nSELECT DISTINCT a.*\nFROM activities a\nINNER JOIN users u ON a.user_id = u.id\nINNER JOIN teams t ON u.team_id = t.id\n# INNER JOIN tracks tr ON a.id = tr.activity_id\n# INNER JOIN groups g ON u.group_id = g.id\nWHERE 1=1\n AND t.id = 267\n# AND t.uuid = uuid_to_bin('aed4927b-f1ea-499e-94c3-83762fd233e8')\n AND a.status IN ('completed', 'failed')\n AND a.recording_state != 'stopped'\n AND a.type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')\n# AND tr.type NOT IN ('audio', 'video')\n AND (\n a.is_private = 0\n OR a.user_id = 14637\n )\n AND (\n (a.actual_start_time BETWEEN '2025-03-19 00:00:00' AND '2025-03-21 23:59:59')\n OR (\n a.actual_start_time IS NULL\n AND a.type IN ('sms-outbound', 'sms-inbound')\n AND a.created_at BETWEEN '2025-03-19 00:00:00' AND '2025-03-21 23:59:59'\n )\n )\n# and NOT EXISTS (\n# SELECT 1\n# FROM tracks t\n# WHERE t.activity_id = a.id\n# AND t.type IN ('audio', 'video')\n# )\n\nORDER BY a.actual_end_time DESC;\n\nSELECT * FROM tracks WHERE activity_id = 26485995;\n\nselect a.is_private, a.title, uuid_from_bin(a.uuid), a.external_id, a.status, a.recording_state, a.recording_reason_code, a.scheduled_start_time, a.scheduled_end_time, a.actual_start_time, a.actual_end_time from activities a\ninner join users u on u.id = a.user_id\nwhere a.crm_configuration_id = 202\n# and a.is_internal = 0\nand (a.actual_start_time between '2025-03-19 00:00:00' and '2025-03-21 00:00:00')\nand a.type IN (\"softphone\",\"softphone-inbound\",\"conference\",\"sms-inbound\")\nand a.status IN ('completed', 'failed')\n# and a.external_id is not null\norder by a.actual_end_time desc;\n\nselect * from activities a where a.crm_configuration_id = 202\nand a.actual_start_time between '2025-03-20 00:00:00' and '2025-03-21 00:00:00'\n# AND a.type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')\n\nselect g.name, a.title, uuid_from_bin(a.uuid), a.external_id, a.status, a.recording_state, a.recording_reason_code, a.scheduled_start_time, a.scheduled_end_time, a.actual_start_time, a.actual_end_time from activities a\ninner join users u on u.id = a.user_id\ninner join groups g on g.id = u.group_id\nwhere a.crm_configuration_id = 202\nand a.is_internal = 0\nand (a.scheduled_start_time between '2025-03-19 00:00:00' and '2025-03-21 00:00:00')\nand a.type = 'conference'\nand a.status != 'completed'\nand a.external_id is not null\norder by a.scheduled_start_time desc;\n\nSELECT * FROM teams WHERE name LIKE '%Tourlane%';\nSELECT * FROM crm_fields WHERE crm_configuration_id = 209 and object_type = 'opportunity';\nSELECT * FROM crm_field_data WHERE crm_field_id = 98809;\n\nselect * from users where status = 1 AND timezone = 'MDT';\n\nselect * from opportunities where id = 3769814;\nselect * from deal_risks where opportunity_id = 3769814;\n\nselect cp.* from crm_profiles cp\njoin users u on cp.user_id = u.id\njoin crm_configurations crm on cp.crm_configuration_id = crm.id\nwhere crm.provider = 'hubspot' AND u.status = 1 AND log_notes != 'none';\n\nselect * from crm_fields where id = 154575;\n\nselect * from team_features where feature = 'SUPPORTS_SYNC_MISSING_CALL_DISPOSITIONS';\nSELECT * FROM teams WHERE id = 176; # crm 148\nselect * from activities where crm_configuration_id = 148 and provider = 'hubspot' order by id desc;\n\nselect * from activity_providers where provider = 'amazon-connect';\n\nselect * from crm_fields cf\njoin crm_configurations crm on crm.id = cf.crm_configuration_id\nwhere crm.provider = 'hubspot' and cf.object_type IN ('account', 'contact');\n\n# *********************************************************************************************\nSELECT * FROM users WHERE id IN (15415, 15418);\nSELECT * FROM groups WHERE id IN (1805,1806);\nSELECT * FROM playbooks WHERE id = 1860;\nSELECT * FROM playbook_categories WHERE id = 38634;\nSELECT * FROM crm_fields WHERE id = 189962;\n\nSELECT * FROM teams WHERE name = 'Pulsar Group'; # 472, 380, 15138 raza.gilani@vuelio.com\n\nSELECT * FROM crm_profiles WHERE user_id = 15415;\nSELECT * FROM social_accounts WHERE sociable_id = 15415 and provider = 'salesforce';\n\nselect * from sidekick_settings where team_id = 472;\n\nSELECT * FROM activities WHERE uuid_to_bin('452c58c7-b87c-4fdd-953e-d7af185e9588') = uuid; # 28617536, user: 15418\nSELECT * FROM activities WHERE uuid_to_bin('399114ee-d3a8-458c-bff5-5f654658db0a') = uuid; # 28344407, user: 15415\nSELECT * FROM activities WHERE uuid_to_bin('f0aa567f-0ab1-4bbb-96aa-37dcf184676b') = uuid; # 28580288, user: 15415\nSELECT * FROM activities WHERE uuid_to_bin('50c086b1-2770-4bca-b5ae-6bac22ec426b') = uuid; # 28566069, user: 15415\n\n# *********************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%TeamTailor%'; # 109, 218, 13969, salesforce-integrations@teamtailor.com\nselect * from crm_configurations where id = 218;\nSELECT * FROM activities WHERE uuid_to_bin('e39b5857-7fdb-4f5a-951a-8d3ca69bb1b0') = uuid; # 28338765\nSELECT * FROM users WHERE id IN (13232, 13230);\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 109\nand sa.provider = 'salesforce';\n\n0057R00000EPL5HQAX Inez Ekblad\n\n1091cb81-5ea1-4951-a0ed-f00b568f0140 Triman Kaur\n\nSELECT * FROM crm_profiles WHERE user_id IN (13232, 13230);\n\n############################################################################################\nSELECT * FROM activities WHERE uuid_to_bin('675eeaeb-5681-42db-90bc-54c07a604408') = uuid; # 28655939 00UVg00000FLvnSMAT\nSELECT * FROM crm_field_data WHERE activity_id = 28655939;\nSELECT * FROM crm_fields WHERE id IN (94491,94493,94498);\nSELECT * FROM users WHERE id = 13658;\nSELECT * FROM teams WHERE id = 109;\nSELECT * FROM crm_configurations WHERE id = 218;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 109\nand sa.provider = 'salesforce';\n\n# ********************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Strengthscope%'; # 481, 390, 15420, katy.holden@strengthscope.comk\nSELECT * FROM stages WHERE crm_configuration_id = 390;\nselect * from business_processes where team_id = 481 and crm_configuration_id = 390;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 481\nand sa.provider = 'salesforce';\n\n\nSELECT * FROM users WHERE id = 15780; # team 462\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 462\nand sa.provider = 'hubspot';\n\n\nselect * from teams where id = 495;\nSELECT * FROM users WHERE id = 15794;\nselect * from social_accounts where sociable_id = 15794;\n\n# ********************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Flight%'; # 427, 333, 13752\nSELECT * FROM accounts WHERE team_id = 427 and crm_provider_id = '668731000183444517';\n\n# ********************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Group GTI%'; # 495, 407, 15794\nSELECT * FROM activities WHERE crm_configuration_id = 407\nand status = 'completed' and type = 'conference'\norder by id desc;\n\nselect ru.*, pr.*, p.* from users u join role_user ru on ru.user_id = u.id\njoin permission_role pr on pr.role_id = ru.role_id\n join permissions p on p.id = pr.permission_id\nwhere team_id = 495 and p.name IN ('dial');\n\nselect * from permission_role;\n\nselect * from activities where crm_configuration_id = 407 and status = 'completed' order by id desc;\nSELECT * FROM activities WHERE id = 29512773;\nSELECT * FROM activities WHERE id IN (29042721,28991325,29002874);\n\nSELECT al.* from activity_summary_logs al join activities a on a.id = al.activity_id\nwhere a.crm_configuration_id = 407\n# and a.id IN (29042721,28991325,29002874);\n\nSELECT * FROM users WHERE id = 15794;\nSELECT * FROM users WHERE team_id = 495;\nSELECT * FROM social_accounts WHERE sociable_id = 15794;\nSELECT * FROM opportunities WHERE team_id = 495 and name like '%OC:%';\nSELECT * FROM contacts WHERE team_id = 495;\nSELECT * FROM leads WHERE team_id = 495;\nSELECT * FROM accounts WHERE team_id = 495;\nSELECT * FROM crm_profiles WHERE crm_configuration_id = 407;\nSELECT * FROM crm_fields WHERE crm_configuration_id = 407;\nSELECT * FROM crm_configurations WHERE id = 407;\nSELECT * FROM opportunities WHERE team_id = 495 and close_date BETWEEN '2025-06-01' AND '2025-07-01'\nand user_id IS NOT NULL and is_closed = 1 and is_won = 1;\n\n# ********************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Hamilton Court FX LLP%'; # 249, 187, 10103\nSELECT * FROM activities WHERE uuid_to_bin('4659c2bb-9a49-484e-9327-a3d66f1e028c') = uuid; # 28951064\nSELECT * FROM crm_fields WHERE crm_configuration_id = 187 and object_type IN ('tasks', 'event');\n\n# *********************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Checkstep%'; # 325, 256, 11753\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 325\nand sa.provider = 'hubspot';\n\nSELECT * FROM activities WHERE uuid_to_bin('7be372e2-1916-4d79-a2f3-ca3db1346db3') = uuid; # 28611085\nSELECT * FROM activities WHERE uuid_to_bin('980f0336-840b-4185-a5a9-30cf8b0749a8') = uuid; # 28719733\nSELECT * FROM activity_summary_logs where activity_id = 28719733;\n\n# *************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Learning%'; # 260, 356, 9444\nSELECT * FROM activity_summary_logs where sent_at BETWEEN '2025-06-09 11:38:00' AND '2025-06-09 11:40:00';\nSELECT * FROM leads WHERE crm_configuration_id = 356 and crm_provider_id = '230045001502770504'; # 823630\nselect * from activities where crm_configuration_id = 356 and lead_id = 841732;\n\nSELECT * from activity_summary_logs al join activities a on a.id = al.activity_id\nwhere a.crm_configuration_id = 356;\n\nselect * from activities where crm_configuration_id = 356\nand actual_end_time between '2025-06-09 11:00:00' and '2025-06-09 12:00:00'\norder by id desc;\n\nselect * from accounts where crm_configuration_id = 356 and crm_provider_id = '230045001514403366' order by id desc;\nselect * from leads where crm_configuration_id = 356 and crm_provider_id = '230045001514275654' order by id desc;\nselect * from contacts where crm_configuration_id = 356 and crm_provider_id = '230045001514403366' order by id desc;\nselect * from opportunities where crm_configuration_id = 356 and crm_provider_id = '230045001514403366' order by id desc;\n\nselect * from team_features where team_id = 260;\nselect * from features where id IN (1,2,4,6,18,19,20,9,10,3,23,24,25,26,27);\n\nSELECT * FROM activities WHERE uuid_to_bin('7be372e2-1916-4d79-a2f3-ca3db1346db3') = uuid;\n\nselect * from crm_fields;\nselect * from crm_layout_entities;\n\nSELECT * FROM teams WHERE name LIKE '%Optable%';\n\n# *************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Teamtailor%'; # 109, 218, 13969\nSELECT * FROM crm_configurations WHERE id = 218;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 109\nand sa.provider = 'salesforce';\nSELECT * FROM activities WHERE uuid_to_bin('675eeaeb-5681-42db-90bc-54c07a604408') = uuid; # 28655939\nSELECT * FROM crm_field_data WHERE activity_id = 28655939;\nSELECT * FROM crm_fields WHERE id in (94491,94493,94498);\n\nselect * from teams where crm_id IS NULL;\n\nSELECT * FROM activities WHERE uuid_to_bin('71aa8a0c-9652-4ff6-bee7-d98ae60abef6') = uuid;\n\n# *************************************************************************************************\nselect * from team_domains where team_id = 399;\nSELECT * FROM teams WHERE name LIKE '%Rydoo%'; # 399, 318, 13207\n\nselect * from calendar_events where id = 5163781;\nSELECT * FROM activities WHERE uuid_to_bin('be2cbc52-7fda-46a0-9ae0-25d9553eafc0') = uuid; # 29443896\nSELECT * FROM participants WHERE activity_id = 29443896;\nselect * from contacts where crm_configuration_id = 318 and email = 'marianne.westeng@strawberry.no';\nselect * from leads where crm_configuration_id = 318 and email = 'marianne.westeng@strawberry.no';\n\nselect * from activities where user_id = 14937 order by created_at ;\n\nselect * from users where id = 14937;\n\nselect * from contacts where crm_configuration_id = 318 and email LIKE '%@strawberry.se';\nselect * from opportunities where crm_configuration_id = 318 and crm_provider_id = '006Sf00000D1WOAIA3';\n\nselect * from activities a join participants p on a.id = p.activity_id\nwhere crm_configuration_id = 318 and a.updated_at > '2025-06-23T08:18:43Z';\n\n# *************************************************************************************************\nSELECT * FROM opportunities WHERE team_id = 379 and crm_provider_id = '39334518886';\nSELECT * FROM opportunities WHERE team_id = 379 order by id desc;\nSELECT * FROM teams WHERE id = 379;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 379 and sociable_id = 13852\nand sa.provider = 'hubspot';\n\nSELECT * FROM crm_configurations WHERE id = 307;\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 307;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1027;\nSELECT * FROM crm_fields WHERE crm_configuration_id = 307\n and id IN (144750,144855,145158,155227);\n\nSELECT * FROM activities;\n\n\nselect * from activities\nwhere created_at > '2025-07-01 00:00:00'\n# and created_at < '2025-08-01 00:00:00'\nand type not in ('email-outbound', 'email-inbound')\nand account_id is null\nand contact_id is null\nand lead_id is null\nand opportunity_id is not null\n;\nSELECT * FROM activities WHERE id IN (25344155, 25344296, 25501909, 28692187);\nSELECT * FROM crm_configurations WHERE id in (335,301,200);\n\nselect * from crm_fields where crm_configuration_id = 230 and crm_provider_id = 'Age2__c';\n\nSELECT * FROM teams WHERE name LIKE '%Resights%';\nselect * from crm_fields where crm_configuration_id = 1 and object_type = 'opportunity';\n\nselect * from crm_configurations where provider = 'bullhorn'; # 344\nselect * from teams where id IN (442);\n\nselect * from activities\nwhere crm_configuration_id = 177\nand provider = 'amazon-connect'\n order by id desc;\n# and source <> 'gong';\n\nselect * from activity_providers where provider = 'amazon-connect';\n\nSELECT * FROM activities WHERE uuid_to_bin('cec1993b-a7e5-4164-b74d-d680ea51d2f2') = uuid;\n\n\nselect * from crm_configurations where store_transcript = 1;\nSELECT * FROM teams WHERE id IN (80);\n\n# *************************************************************************************************\nSELECT * FROM teams WHERE name LIKE '%Sedna%'; # 277, 213, 12594\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 277\nand sa.provider = 'salesforce';\n\nselect * from activities where crm_configuration_id = 213 and account_id = 2511502;\n\nselect * from crm_configurations where id = 213;\n\nSELECT * FROM activities WHERE uuid_to_bin('35aa790a-8569-4544-8268-66f9a4a26804') = uuid; # 33981604\nSELECT * FROM participants WHERE activity_id = 33981604;\nSELECT * FROM crm_fields WHERE crm_configuration_id = 337 and object_type = 'task';\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 431\nand sa.provider = 'salesforce';\nSELECT * FROM activities WHERE uuid_to_bin('b5476c7d-19a8-491b-869d-676ea1e857b6') = uuid; # 33997223\nselect * from activity_summary_logs where activity_id = 33997223;\nselect * from activity_notes where activity_id = 33997223;\n\n# ***********************************\nSELECT * FROM teams WHERE name LIKE '%Abode%';\n\n\nselect * from features;\nselect * from teams t\nwhere t.status = 'active'\nand id NOT IN (select team_id from team_features where feature_id = 9)\n;\n\n\nselect * from playbook_layouts where playbook_id = 1725;\nSELECT * FROM activities WHERE uuid_to_bin('65cc283c-4849-49e6-927f-4c281c8fea19') = uuid; # 34297473\nselect * from teams where id = 318;\nselect * from crm_configurations where team_id = 318;\nselect * from playbooks where team_id = 318;\nSELECT * FROM crm_layouts where crm_configuration_id = 381;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1259;\nSELECT * FROM crm_fields WHERE id IN (192938,192936,192939);\n\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1266;\nSELECT * FROM crm_fields WHERE id IN (192980,192991,192997,192998,193064,193067);\n\nSELECT * FROM activities WHERE uuid_to_bin('a902289b-285c-48eb-9cc2-6ad6c5d938f5') = uuid; # 34297533\n\n\n\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 927;\nSELECT * FROM crm_fields WHERE id IN (131668,131669,131670,131671,131676,131797);\n\nSELECT * FROM teams WHERE name LIKE '%Peripass%'; # 351, 281, 12124\nselect * from crm_layouts where crm_configuration_id = 281;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 927;\nselect * from crm_fields where crm_configuration_id = 281 and id in (131668,131669,131670,131671,131676,131797);\nselect * from opportunities where crm_configuration_id = 281;\n\nSELECT * FROM activities WHERE id IN (34211315, 34130075);\nSELECT * FROM crm_field_data WHERE object_id IN (34211315, 34130075);\n\nselect cf.crm_configuration_id, cle.crm_layout_id, cle.id, cf.id from crm_field_data cfd\njoin crm_layout_entities cle on cle.id = cfd.crm_layout_entity_id\njoin crm_fields cf on cle.crm_field_id = cf.id\nwhere cf.deleted_at IS NOT NULL\nGROUP BY cle.id, cf.id;\n\nselect * from crm_layouts where id IN (355);\nselect u.email, t.crm_id, t.* from teams t\njoin users u on u.id = t.owner_id\nwhere crm_id IN (97);\n\nSELECT * FROM crm_fields WHERE id = 96492;\n\nselect * from permissions;\nselect * from permission_role where permission_id = 247;\nselect * from roles;\n\nselect * from migrations;\n# *****************************************************************\nSELECT * FROM activities WHERE uuid_to_bin('291e3c21-11cc-4728-aee7-6e4bedf86d72') = uuid; # 34262174\nSELECT * FROM crm_configurations WHERE id = 301;\nSELECT * FROM teams WHERE id = 343;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 343\nand sa.provider = 'hubspot';\n\nselect * from participants where activity_id = 34262174;\n\nselect * from contacts where crm_configuration_id = 301 and id = 6976326;\nselect * from accounts where crm_configuration_id = 301 and id IN (4647626, 4815829); # 30761335403\n\nselect * from activity_summary_logs where activity_id = 34262174;\n\nselect * from users where status = 1 AND timezone = 'EST';\n\n# ****************************************************************************\nSELECT * FROM users WHERE id = 13869;\nSELECT * FROM crm_configurations WHERE id = 320;\nSELECT * FROM teams WHERE id = 401;\n\nSELECT * FROM activities WHERE uuid_to_bin('2228c16f-10be-48d5-90d4-67385219dc01') = uuid; # 29670601\n\nSELECT * FROM accounts WHERE id = 7761483;\nSELECT * FROM opportunities WHERE id = 6051814;\n\nSELECT * FROM teams WHERE name LIKE '%Seedlegals%';\n\n;select * from opportunities where updated_at > '2025-10-11' AND crm_provider_id = '34713761166';\n\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 177;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 577;\nSELECT * FROM crm_fields WHERE id IN (68458,68459,68480,68497,68524,68530,68554,68618,68662,68781,68810,68898,68981,69049,97467);\n\nSELECT t.id, crm.id, t.name, crm.sync_objects, crm.provider, crm.last_synced_at FROM crm_configurations crm join teams t on t.crm_id = crm.id\nwhere t.status = 'active' AND crm.provider = 'hubspot' AND crm.last_synced_at < '2025-10-22 00:00:00';\n\nSELECT * FROM activities WHERE uuid_to_bin('fa09449f-cba9-496a-b8f3-865cd3c72351') = uuid;\nSELECT * FROM crm_configurations where id = 184;\nSELECT * FROM teams WHERE id = 246;\nSELECT * FROM social_accounts WHERE sociable_id = 9259 and provider = 'hubspot';\n\nSELECT * FROM users WHERE email LIKE '%rhian.old@bud.co.uk%'; # 17700\nSELECT * FROM teams WHERE id = 551;\n\nSELECT * FROM crm_configurations WHERE id = 471;\nSELECT * FROM activities WHERE crm_configuration_id = 471 and crm_provider_id IS NOT NULL;\nSELECT * FROM crm_fields WHERE crm_configuration_id = 471;\nSELECT * FROM crm_fields WHERE id = 307260;\nSELECT * FROM crm_field_values WHERE crm_field_id = 307260;\n\nselect * from crm_layouts where crm_configuration_id = 471;\n\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1547;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1548;\n\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 551 and sa.provider = 'hubspot';\n\nSELECT * FROM teams WHERE name LIKE '%$PCS%';\n\n# ********************************************************************************************************\nselect * from crm_configurations crm\njoin teams t on t.crm_id = crm.id\nwhere t.status = 'active'\nand crm.provider = 'hubspot';\n\n# $slug = 'HUBSPOT_WEBHOOK_SYNC';\n# $team = Jiminny\\Models\\Team::find(2);\n# $feature = Feature::query()->where('slug', $slug)->first();\n# TeamFeature::query()->create(['feature_id' => $feature->getId(),'team_id' => $team->getId()]);\n\n# hubspot_webhook_metrics\n\nselect * from crm_configurations where id = 331; # 416\nSELECT * FROM teams WHERE id = 416;\nSELECT * FROM opportunities WHERE team_id = 190;\n\nSELECT * FROM teams WHERE name LIKE '%Lead Forensics%';\nSELECT sa.id,\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 190 and sa.provider = 'hubspot';\n\n\n\nSELECT * FROM teams WHERE name LIKE '%Rapaport%'; # 431, 337\nSELECT * FROM teams where id = 431;\nSELECT * FROM crm_configurations where team_id = 431;\nSELECT * FROM activity_providers where team_id = 431;\nSELECT * FROM activities where crm_configuration_id = 337 and type IN ('softphone', 'softphone-outbound')\nand provider NOT IN ('hubspot', 'aircall')\n# and telephony_provider_id = '019c1131-a22f-4792-b9ea-20adf6a02ed0'\norder by id desc;\nSELECT sa.id,\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 431 and sa.provider = 'salesforce';\n\nSELECT * FROM teams WHERE name LIKE '%BiP%'; # 401, 320\nSELECT * FROM teams where id = 401;\nSELECT * FROM crm_configurations where team_id = 401;\nSELECT * FROM activity_providers where team_id = 401;\nSELECT * FROM activities where crm_configuration_id = 320 and type IN ('softphone', 'softphone-outbound')\nand provider NOT IN ('hubspot', 'aircall')\n# and telephony_provider_id = '019c1131-a22f-4792-b9ea-20adf6a02ed0'\norder by id desc;\nSELECT sa.id,\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 401 and sa.provider = 'salesforce';\n\n\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 307; # 379 - Story Terrace Inc , portalId: 3921157\nSELECT * FROM contacts WHERE team_id = 379 and updated_at > '2026-01-31 11:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 379 and updated_at > '2026-02-01 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 379 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 379 and sa.provider = 'hubspot';\n\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 485; # 563 - LATUS Group (ad94d501-5d09-44fd-878f-ca3a9f8865c3) , portalId: 3904501\nSELECT * FROM opportunities WHERE team_id = 563 and updated_at > '2026-02-02 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 563 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 338; # 432 - Formalize , portalId: 9214205\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 432 and sa.provider = 'hubspot';\nSELECT * FROM opportunities WHERE team_id = 432 and updated_at > '2026-02-02 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 432 and updated_at > '2026-02-10 00:00:00' order by updated_at desc;\n\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 436; # 519 - Moxso , portalId: 25531989\nSELECT * FROM opportunities WHERE team_id = 519 and updated_at > '2026-02-02 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 519 and updated_at > '2026-02-04 11:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 96; # 119 - Nourish Care , portalId: 26617984\nSELECT * FROM opportunities WHERE team_id = 119 and updated_at > '2026-02-02 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 119 and updated_at > '2026-02-04 11:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 331; # 416 - The National College , portalId: 7213852\nSELECT * FROM opportunities WHERE team_id = 416 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 416 and updated_at > '2026-02-04 11:00:00' order by updated_at desc;\n\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 308; # 380 - Foodles , portalId: 7723616\nSELECT * FROM opportunities WHERE team_id = 380 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 380 and updated_at > '2026-02-06 10:30:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 379; # 471 - imat-uve , portalId: 9177354\nSELECT * FROM opportunities WHERE team_id = 471 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 471 and updated_at > '2026-02-06 10:30:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 465; # 545 - Spotler , portalId: 144759271\nSELECT * FROM opportunities WHERE team_id = 545 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 545 and updated_at > '2026-02-06 10:30:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 455; # 537 - indevis , portalId: 25666868\nSELECT * FROM opportunities WHERE team_id = 537 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 537 and updated_at > '2026-02-06 10:30:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 200; # 265 - Jobadder , portalId: 6426676\nSELECT * FROM opportunities WHERE team_id = 265 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 265 and updated_at > '2026-02-06 10:30:00' order by updated_at desc;\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 335; # 429 - Eletive , portalId: 6110563\nSELECT * FROM opportunities WHERE team_id = 429 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 429 and updated_at > '2026-02-09 10:30:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 363; # 456 - Global Group , portalId: 8901981\nSELECT * FROM opportunities WHERE team_id = 456 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 456 and updated_at > '2026-02-09 10:30:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 297; # 369 - Unbiased , portalId: 9229005\nSELECT * FROM opportunities WHERE team_id = 369 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 369 and updated_at > '2026-02-09 10:30:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 353; # 449 - Fuuse , portalId: 25781745\nSELECT * FROM opportunities WHERE team_id = 449 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 449 and updated_at > '2026-02-09 10:30:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 487; # 566 - Nimbus , portalId: 39982590\nSELECT * FROM opportunities WHERE team_id = 566 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 566 and updated_at > '2026-02-09 10:30:00' order by updated_at desc;\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 487;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1630;\nselect * from crm_fields where crm_configuration_id = 487 and\n(uuid_to_bin('4c6b2971-64d4-45b8-b377-427be758b5a5') = uuid or uuid_to_bin('59e368d8-65a0-4b77-b611-db37c99fbe68') = uuid);\nSELECT * FROM crm_field_values WHERE crm_field_id = 375177;\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 420; # 506 - voiio , portalId: 145629154\nSELECT * FROM opportunities WHERE team_id = 506 and updated_at > '2026-02-10 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 506 and updated_at > '2026-02-10 15:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 479; # 558 - Momice , portalId: 535962\nSELECT * FROM opportunities WHERE team_id = 558 and updated_at > '2026-02-10 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 558 and updated_at > '2026-02-10 15:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 59; # 80 - Storyclash GmbH , portalId: 4268479\nSELECT * FROM opportunities WHERE team_id = 80 and updated_at > '2026-02-10 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 80 and updated_at > '2026-02-10 15:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 175; # 203 - Team iAM , portalId: 5534732\nSELECT * FROM opportunities WHERE team_id = 203 and updated_at > '2026-02-10 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 203 and updated_at > '2026-02-10 15:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 368; # 460 - OneTouch Health , portalId: 5534732183355\nSELECT * FROM opportunities WHERE team_id = 460 and updated_at > '2026-02-10 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 460 and updated_at > '2026-02-10 15:00:00' order by updated_at desc;\n\n\n\nselect * from users where id = 29643;\nSELECT * FROM crm_field_values WHERE crm_field_id = 375177;\n# ********************************************************************\nSELECT * FROM teams WHERE name LIKE '%Buynomics%'; # 462, 482, 14910\nSELECT * FROM activities WHERE crm_configuration_id = 482\nand type NOT IN ('email-inbound', 'email-outbound')\n# and description like '%The call focused on understanding Welch%'\norder by id desc;\n\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 462 and sa.provider = 'salesforce';\n\nselect * from contacts where crm_configuration_id = 482 and name = 'Cyndall Hill'; # 15504749\nselect * from contacts where id = 10891096; # 482\nSELECT * FROM activities WHERE crm_configuration_id = 482\nand type NOT IN ('email-inbound', 'email-outbound')\nand contact_id = 15504749\norder by id desc;\n\nselect * from activities where id = 36793003; # 96cc7bc1-8622-4d27-92f4-baf664fc1a56, 00UOf00000PDdOXMA1\nselect * from transcription where id = 7646782;\nselect * from ai_prompts where transcription_id = 7646782;\n\n# ********************************************************************\nSELECT * FROM activities WHERE uuid_to_bin('7a8471a3-847e-4822-802b-ddf426bbc252') = uuid; # 37370018\nSELECT * FROM activity_summary_logs WHERE activity_id = 37370018;\nSELECT * FROM teams WHERE id = 555;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 555 and sa.provider = 'hubspot';\n\n# ********************************************************************\nSELECT * FROM activities WHERE uuid_to_bin('7c17b8aa-09df-4f85-a0f7-51f47afd712d') = uuid; # 37395250\nSELECT * FROM activities WHERE uuid_to_bin('14d60388-260d-494b-aa0d-63fdb1c78026') = uuid; # 37395250\n\nSELECT a.* FROM activities a JOIN crm_configurations c on c.id = a.crm_configuration_id\nwhere a.type IN ('softphone', 'softphone-outbound') and c.provider = 'hubspot'\nand a.provider NOT IN ('hubspot')\n# and a.provider IN ('salesloft')\n# and c.id NOT IN (70)\n# and a.duration > 30\n# and actual_start_time > '2026-02-05 00:00:00'\norder by a.id desc;\n\nSELECT * FROM activities WHERE id = 37549787;\nSELECT * FROM crm_profiles WHERE user_id = 17613;\n\nSELECT * FROM crm_configurations WHERE id = 70;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 93 and sa.provider = 'hubspot';\n\nSELECT asf.activity_search_id, asf.id, asf.value\nFROM activity_search_filters asf\nWHERE asf.filter = 'group_id'\nAND asf.value IN (\n SELECT CONCAT(\n HEX(SUBSTR(uuid, 5, 4)), '-',\n HEX(SUBSTR(uuid, 3, 2)), '-',\n HEX(SUBSTR(uuid, 1, 2)), '-',\n HEX(SUBSTR(uuid, 9, 2)), '-',\n HEX(SUBSTR(uuid, 11))\n )\n FROM groups\n WHERE deleted_at IS NOT NULL\n);\n\nSELECT * FROM crm_configurations WHERE id = 373; # KPSBremen.de 465 # - no social account\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 465 and sa.provider = 'hubspot';\n\nselect * from crm_configurations where id = 494;\n\nSELECT * FROM teams WHERE name LIKE '%splose%'; # 572, 495, 18708\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 572 and sa.provider = 'pipedrive';\n\nselect * from opportunities where team_id = 572\n# and name like '%Onebright%'\n# and is_closed = 1 and is_won = 0\n order by id desc;\n\n\nselect * from users where deleted_at is null and status = 2;\n\nselect * from contacts where id = 17900517;\nselect * from accounts where id = 10109838;\nselect * from opportunities where id = 6955880;\n\nselect * from opportunity_contacts where opportunity_id = 6955880;\nselect * from opportunity_contacts where contact_id = 17900517;\n\nselect * from contact_roles cr join crm_configurations crm on cr.crm_configuration_id = crm.id\nwhere crm.provider != 'salesforce';\n\nSELECT * FROM activities WHERE uuid_to_bin('adcb8331-5988-4353-834e-383a355abba2') = uuid; # 38056424, crm 104659682404\nselect * from teams where id = 456;\nSELECT * FROM crm_configurations WHERE id = 363;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 456 and sa.provider = 'hubspot';\n\nselect * from crm_layouts where crm_configuration_id = 363;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id IN (1203, 1204, 1635);\nSELECT * FROM crm_fields WHERE id IN (181536, 181538, 213455);\n\nSELECT * FROM teams WHERE name LIKE '%Electric%'; # 342, 272, 12767\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 342 and sa.provider = 'pipedrive';\nSELECT * FROM opportunities WHERE crm_configuration_id = 272 and name like 'NORTHUMBRIA POL%'; # and updated_at > '2025-07-01 00:00:00';\nSELECT * FROM opportunities WHERE crm_configuration_id = 272 order by remotely_created_at asc; # and updated_at > '2025-07-01 00:00:00';\nSELECT * FROM opportunities WHERE crm_configuration_id = 272 and updated_at > '2026-01-01 00:00:00';\nSELECT * FROM crm_fields WHERE crm_configuration_id = 272 and object_type = 'opportunity';\nSELECT * FROM crm_field_values WHERE crm_field_id = 127164;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 342 and sa.provider = 'pipedrive';\n\nSELECT * FROM teams WHERE id = 472;\nSELECT * FROM crm_configurations WHERE id = 380;\nselect * from activities where id = 38285673; # 38285673\nSELECT * FROM users WHERE id = 16942;\nSELECT * FROM groups WHERE id = 1964;\nSELECT * FROM playbooks WHERE id = 2033;\n\nselect * from teams where created_at > '2026-03-09';\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 499; # 1065\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1678;\n\nSELECT * FROM teams WHERE id = 575;\nselect * from opportunities where team_id = 575;\n\nSELECT * FROM activities WHERE uuid_to_bin('96b1261f-2357-49f9-ab38-23ce12008ea0') = uuid;\n\nselect * from contacts c\nwhere c.crm_configuration_id = 370 order by c.updated_at desc;\n\nSELECT * FROM participants where activity_id = 38833541;\nSELECT * FROM participants where activity_id = 39216301;\nSELECT * FROM activity_summary_logs where activity_id = 39216301;\nSELECT * FROM activities WHERE uuid_to_bin('c7d99fbe-1fb1-41f2-8f4d-52e2bf70e1e9') = uuid; # 38833541, crm 478116564181\nSELECT * FROM activities WHERE uuid_to_bin('2e6ff4d3-9faa-447a-a8c1-9acde4d885ae') = uuid; # 39216301, crm 480171536586\nselect * from crm_profiles where crm_configuration_id = 319 and crm_provider_id = 525785080;\nselect * from opportunities where crm_configuration_id = 319 and crm_provider_id = 410150124747;\nselect * from accounts where crm_configuration_id = 319 and crm_provider_id = 47150650569;\nselect * from contacts where crm_configuration_id = 319 and crm_provider_id IN ('665587441856', '742723347700');\n# owner 13236 525785080\n# contact 1 16779180 665587441856 - activity - Alex Howes alex@supportroom.com created 2026-01-26\n# contact 2 19247563 742723347700 - ash@supportroom.com 2026-03-24\n# company 4176133 47150650569\n# deal 7100953 410150124747\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 400 and sa.provider = 'hubspot';\n\nselect * from features;\nselect * from team_features where feature_id = 40;\n\nselect * from teams where id = 556; # owner: 18101, crm: 477\nselect * from crm_configurations where id = 477;\nSELECT * FROM users WHERE id = 18101;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 556 and sa.provider = 'integration-app';\n\nselect * from opportunities where id = 7594349;\nselect * from opportunity_stages where opportunity_id = 7594349 order by created_at desc;\nselect * from business_processes where id = 6024;\nselect * from business_process_stages where stage_id = 16352;\nselect * from business_process_stages where business_process_id = 6024;\nselect * from stages where team_id = 459;\nselect * from teams where id = 459;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 459 and sa.provider = 'hubspot';\n\nSELECT os.stage_id, s.crm_provider_id, s.name, COUNT(*) as cnt\nFROM opportunity_stages os\nJOIN stages s ON s.id = os.stage_id\nWHERE os.opportunity_id = 7594349\nGROUP BY os.stage_id, s.crm_provider_id, s.name\nORDER BY cnt DESC;\n\nSELECT s.id, s.crm_provider_id, s.name, s.team_id, s.crm_configuration_id\nFROM stages s\nJOIN business_process_stages bps ON bps.stage_id = s.id\nWHERE bps.business_process_id = 6024\nAND s.crm_provider_id = 'contractsent';\n\nselect * from stages where id IN (16352,20612,18281,7344,16378,16309,5036,15223,14535,6293,12098,11607)\n\nSELECT * FROM teams WHERE name LIKE '%Pulsar Group%'; # 472, 380, 15138, raza.gilani@vuelio.com\nselect * from playbooks where team_id = 472; # event 226147\nSELECT * FROM playbook_categories WHERE playbook_id = 2288;\nSELECT * FROM crm_fields WHERE id = 226147;\nSELECT * FROM crm_field_values WHERE crm_field_id = 226147;\n\nSELECT * FROM crm_configurations WHERE id = 380;\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 472 and sa.provider = 'salesforce';","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Project","depth":3,"role_description":"text"},{"role":"AXButton","text":"Project","depth":3,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"New File or Directory…","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Expand Selected","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Collapse All","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Options","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Cascade","depth":3,"role_description":"text"},{"role":"AXButton","text":"Options","depth":4,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Project","depth":3,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Structure","depth":3,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Bookmarks","depth":3,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Welcome to SonarQube for IDE","depth":3,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Pull Requests","depth":3,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"More","depth":3,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Problems","depth":3,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Terminal","depth":3,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"TODO","depth":3,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Windsurf Console","depth":3,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"SonarQube for IDE","depth":3,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Git","depth":3,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Services","depth":3,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Find","depth":3,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Notifications","depth":3,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Cascade","depth":3,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Database","depth":3,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"AI Chat","depth":3,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run","depth":3,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"More","depth":3,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Tests passed: 15 (a minute ago)","depth":4,"role_description":"text"},{"role":"AXStaticText","text":"Hide processes (1)","depth":3,"role_description":"text"},{"role":"AXStaticText","text":"Windsurf Teams","depth":3,"help_text":"Windsurf","role_description":"text"},{"role":"AXStaticText","text":"279:1","depth":3,"help_text":"Go to Line","role_description":"text"},{"role":"AXStaticText","text":"Language Services Button","depth":3,"role_description":"text"},{"role":"AXStaticText","text":"UTF-8","depth":3,"help_text":"File Encoding: UTF-8","role_description":"text"},{"role":"AXStaticText","text":"Column selection mode","depth":3,"help_text":"Column selection mode","role_description":"text"},{"role":"AXStaticText","text":"4 spaces","depth":3,"role_description":"text"},{"role":"AXStaticText","text":"JSON: schema.json","depth":3,"bounds":{"left":0.0,"top":0.0,"width":0.0875,"height":0.025555555},"help_text":"JSON Schema: https://getcomposer.org/schema.json","role_description":"text"}]...
|
-7588596953593251659
|
2146738724037637229
|
idle
|
accessibility
|
NULL
|
Project: faVsco.js, menu
#11894 on JY-18909-automa Project: faVsco.js, menu
#11894 on JY-18909-automated-reports-ask-jiminny, menu
Start Listening for PHP Debug Connections
AskJiminnyReportActivityServiceTest
Run 'AskJiminnyReportActivityServiceTest'
Debug 'AskJiminnyReportActivityServiceTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
3
3
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Tests\Unit\Services\Kiosk\AutomatedReports;
use Carbon\CarbonImmutable;
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\Services\Kiosk\AutomatedReports\AutomatedReportsService;
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);
}
public static function frequencyDateRangeProvider(): array
{
$now = CarbonImmutable::parse('2025-06-16 12:00:00');
return [
'daily' => [
AutomatedReportsService::FREQUENCY_DAILY,
$now->subDay()->startOfDay()->format('Y-m-d H:i:s'),
$now->subDay()->endOfDay()->format('Y-m-d H:i:s'),
],
'weekly' => [
AutomatedReportsService::FREQUENCY_WEEKLY,
$now->subWeek()->startOfWeek()->format('Y-m-d H:i:s'),
$now->subWeek()->endOfWeek()->format('Y-m-d H:i:s'),
],
'monthly' => [
AutomatedReportsService::FREQUENCY_MONTHLY,
$now->subMonthNoOverflow()->startOfMonth()->format('Y-m-d H:i:s'),
$now->subMonthNoOverflow()->endOfMonth()->format('Y-m-d H:i:s'),
],
'quarterly' => [
AutomatedReportsService::FREQUENCY_QUARTERLY,
$now->subQuarterNoOverflow()->startOfQuarter()->format('Y-m-d H:i:s'),
$now->subQuarterNoOverflow()->endOfQuarter()->format('Y-m-d H:i:s'),
],
];
}
/**
* @dataProvider frequencyDateRangeProvider
*/
public function testGetActivityIdsInjectsDateRangeForFrequency(
string $frequency,
string $expectedStartDate,
string $expectedEndDate,
): void {
CarbonImmutable::setTestNow('2025-06-16 12:00:00');
try {
$user = $this->makeUser();
$savedSearch = $this->makeSavedSearch([]);
$filterSet = $this->createMock(FilterDefinitionCollection::class);
$this->activitySearch->method('getArrayFilterKeys')->willReturn([]);
$this->logger->method('info');
$this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);
$capturedCriteria = null;
$this->activitySearch->expects($this->once())
->method('getOnDemandPageFilterSet')
->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {
$capturedCriteria = $criteria;
return $filterSet;
});
$this->service->getActivityIdsForSavedSearch($savedSearch, $user, $frequency);
$this->assertNotNull($capturedCriteria);
$this->assertSame($expectedStartDate, $capturedCriteria->getStartDate()->format('Y-m-d H:i:s'));
$this->assertSame($expectedEndDate, $capturedCriteria->getEndDate()->format('Y-m-d H:i:s'));
} finally {
CarbonImmutable::setTestNow();
}
}
public function testGetActivityIdsWithNullFrequencyDoesNotInjectDates(): void
{
$user = $this->makeUser();
$savedSearch = $this->makeSavedSearch([]);
$filterSet = $this->createMock(FilterDefinitionCollection::class);
$this->activitySearch->method('getArrayFilterKeys')->willReturn([]);
$this->logger->method('info');
$this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);
$capturedCriteria = null;
$this->activitySearch->expects($this->once())
->method('getOnDemandPageFilterSet')
->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {
$capturedCriteria = $criteria;
return $filterSet;
});
$this->service->getActivityIdsForSavedSearch($savedSearch, $user, null);
$this->assertNotNull($capturedCriteria);
$this->assertNull($capturedCriteria->getStartDate());
$this->assertNull($capturedCriteria->getEndDate());
}
public function testGetActivityIdsWithUnknownFrequencyDoesNotInjectDates(): void
{
$user = $this->makeUser();
$savedSearch = $this->makeSavedSearch([]);
$filterSet = $this->createMock(FilterDefinitionCollection::class);
$this->activitySearch->method('getArrayFilterKeys')->willReturn([]);
$this->logger->method('info');
$this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);
$capturedCriteria = null;
$this->activitySearch->expects($this->once())
->method('getOnDemandPageFilterSet')
->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {
$capturedCriteria = $criteria;
return $filterSet;
});
$this->service->getActivityIdsForSavedSearch($savedSearch, $user, AutomatedReportsService::FREQUENCY_ONE_OFF);
$this->assertNotNull($capturedCriteria);
$this->assertNull($capturedCriteria->getStartDate());
$this->assertNull($capturedCriteria->getEndDate());
}
public function testGetActivityIdsFrequencyDateRangeOverridesSavedSearchDateFilters(): void
{
CarbonImmutable::setTestNow('2025-06-16 12:00:00');
try {
$user = $this->makeUser();
$startDateFilter = $this->makeFilter(ActivityActualDate::PARAM_START_DATE, '2024-01-01 00:00:00');
$endDateFilter = $this->makeFilter(ActivityActualDate::PARAM_END_DATE, '2024-12-31 23:59:59');
$savedSearch = $this->makeSavedSearch([$startDateFilter, $endDateFilter]);
$filterSet = $this->createMock(FilterDefinitionCollection::class);
$this->activitySearch->method('getArrayFilterKeys')->willReturn([]);
$this->logger->method('info');
$this->elasticRepository->method('onDemandSearchIdsOnly')->willReturn([]);
$capturedCriteria = null;
$this->activitySearch->expects($this->once())
->method('getOnDemandPageFilterSet')
->willReturnCallback(function (Criteria $criteria) use ($filterSet, &$capturedCriteria) {
$capturedCriteria = $criteria;
return $filterSet;
});
$this->service->getActivityIdsForSavedSearch($savedSearch, $user, AutomatedReportsService::FREQUENCY_DAILY);
$this->assertNotNull($capturedCriteria);
$this->assertSame('2025-06-15 00:00:00', $capturedCriteria->getStartDate()->format('Y-m-d H:i:s'));
$this->assertSame('2025-06-15 23:59:59', $capturedCriteria->getEndDate()->format('Y-m-d H:i:s'));
} finally {
CarbonImmutable::setTestNow();
}
}
}
Execute
Explain Plan
Browse Query History
View Parameters
Open Query Execution Settings…
In-Editor Results
Tx: Auto
Cancel Running Statements
Playground
jiminny
Sync Changes
Hide This Notification
Code changed:
Hide
27
9
23
3
105
Previous Highlighted Error
Next Highlighted Error
SELECT * FROM team_features where team_id = 1;
SELECT * FROM teams WHERE name LIKE '%Vixio%'; # 340,270,11922
SELECT * FROM users WHERE team_id = 340; # 12015
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 340
and sa.provider = 'salesforce';
# and sa.provider = 'salesloft';
select * from crm_fields where crm_configuration_id = 270 and object_type = 'event';
# 125558 - Event Type - Event_Type__c
# 125552 - Event Status - Event_Status__c
SELECT * FROM sidekick_settings WHERE team_id = 340;
SELECT * FROM crm_field_values WHERE crm_field_id in (125552);
select * from activities where crm_configuration_id = 270
and type = 'conference' and crm_provider_id IS NOT NULL
and actual_start_time > '2024-09-16 09:00:00' order by scheduled_start_time;
SELECT * FROM activities WHERE id = 20871677;
SELECT * FROM crm_field_data WHERE activity_id = 20871677;
select * from crm_layouts where crm_configuration_id = 270;
select * from crm_layout_entities where crm_layout_id in (886,887);
SELECT * FROM crm_configurations WHERE id = 270;
select * from playbooks where team_id = 340; # 1514
select * from groups where team_id = 340;
SELECT * FROM crm_fields WHERE id IN (125393, 125401);
select g.name as 'team name', p.name as 'playbook name', f.label as 'activity type field' from groups g
join playbooks p on g.playbook_id = p.id
join crm_fields f on p.activity_field_id = f.id
where g.team_id = 340;
SELECT * FROM activities WHERE uuid_to_bin('0c180357-67d2-419e-a8c3-b832a3490770') = uuid; # 20448716
select * from crm_field_data where object_id = 20448716;
select * from activities where crm_configuration_id = 270 and provider = 'salesloft' order by id desc;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%CybSafe%'; # 343,273,12008
select * from opportunities where team_id = 343;
select * from opportunities where team_id = 343 and crm_provider_id = '18099102526';
select * from opportunities where team_id = 343 and account_id = 945217482;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 343
and sa.provider = 'hubspot';
select * from accounts where team_id = 343 order by name asc;
select * from stages where crm_configuration_id = 273 and type = 'opportunity';
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Voyado%'; # 353,283,12143
SELECT * FROM activities WHERE crm_configuration_id = 283 and account_id = 3777844 order by id desc;
SELECT * FROM accounts WHERE team_id = 353 AND name LIKE '%Salesloft%';
SELECT * FROM activities WHERE id = 20717903;
select * from participants where activity_id IN (20929172,20928605,20928468,20926272,20926271,20926270,20926269,20916499,20916454,20916436,20916435,20900015,20900014,20900013,20897312,20897243,20897241,20897237,20897232,20897229,20893648,20893231,20893230,20893229,20893228,20889784,20885039,20885038,20885037,20885036,20885035,20882728,20882708,20882703,20882702,20869828,20869811,20869806,20869801,20869799,20869798,20869796,20869795,20869794,20869761,20869760,20869759,20868688,20868687,20850340,20847195,20841710,20833967,20827021,20825307,20825305,20825297,20824615,20824400,20823927,20821760,20795588,20794233,20794057,20793710,20785811,20781789,20781394,20781307,20762651,20758453,20758282,20757323,20756643,20756636,20756629,20756627,20756606,20756605,20756604,20756603,20756602,20756600,20756599,20756598,20756595,20756594,20756589,20756587,20756577,20756573,20748918,20748386,20748385,20748384,20748383,20748382,20748381,20748380,20748379,20748377,20748375,20748373,20743301,20717905,20717904,20717903,20717901,20717899);
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 353
and sa.provider = 'salesforce';
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%modern world business solutions%'; # 345,275,12016, [EMAIL]
SELECT * FROM activities WHERE uuid_to_bin('3921d399-3fef-4609-a291-b0097a166d43') = uuid;
# id: 20940638, user: 12022, contact: 5305871
SELECT * FROM activity_summary_logs WHERE activity_id = 20940638;
select * from contacts where team_id = 345 and crm_provider_id = '30891432415' order by name asc; # 5305871
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 345
and sa.provider = 'hubspot';
select * from users where team_id = 345 and id = 12022;
SELECT * FROM crm_profiles WHERE user_id = 12022;
SELECT * FROM participants WHERE activity_id = 20940638;
SELECT * FROM users u
JOIN crm_profiles cp ON u.id = cp.user_id
WHERE u.team_id = 345;
select * from contacts where team_id = 345 and crm_provider_id = '30880813535' order by name desc; # 5305871
select * from team_features where team_id = 345;
SELECT * FROM activities WHERE uuid_to_bin('11701e2d-2f82-4dab-a616-1db4fad238df') = uuid; # 21115197
SELECT * FROM participants WHERE activity_id = 20897406;
SELECT * FROM activities WHERE uuid_to_bin('63ba55cd-1abc-447d-83da-0137000005b7') = uuid; # 20953912
SELECT * FROM activities WHERE crm_configuration_id = 275 and provider = 'ringcentral' and title like '%1252629100%';
SELECT * FROM activities WHERE id = 20946641;
SELECT * FROM crm_profiles WHERE user_id = 10211;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Lunio%'; # 120,97,10984, [EMAIL]
SELECT * FROM opportunities WHERE crm_configuration_id = 97 and crm_provider_id = '006N1000006c5PpIAI';
select * from stages where crm_configuration_id = 97 and type = 'opportunity';
select * from opportunities where team_id = 120;
select * from crm_configurations crm join teams t on crm.id = t.crm_id
where 1=1
AND t.current_billing_plan IS NOT NULL
AND crm.auto_sync_activity = 0
and crm.provider = 'hubspot';
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Exclaimer%'; # 270,205,10053,[EMAIL]
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 270
and sa.provider = 'salesforce';
SELECT * FROM activities WHERE uuid_to_bin('b54df794-2a9a-4957-8d80-09a600ead5f8') = uuid; # 21637956
SELECT * FROM crm_profiles WHERE user_id = 11446;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Cygnetise%'; # 372,300,12554, [EMAIL]
select * from playbooks where team_id = 372;
select * from crm_fields where crm_configuration_id = 300 and object_type = 'event'; # 141340
SELECT * FROM crm_field_values WHERE crm_field_id = 141340;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 372
and sa.provider = 'salesforce';
select * from crm_profiles where crm_configuration_id = 300;
SELECT * FROM crm_configurations WHERE team_id = 372;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Planday%'; # 291,242,11501,[EMAIL]
SELECT * FROM opportunities WHERE team_id = 291 and crm_provider_id = '006bG000005DO86QAG'; # 3207756
select * from crm_field_data where object_id = 3207756;
SELECT * FROM crm_fields WHERE id = 111834;
select f.id, f.crm_provider_id AS field_name, f.label, fd.object_id AS dealId, fd.value
FROM crm_fields f
JOIN crm_field_data fd ON f.id = fd.crm_field_id
WHERE f.crm_configuration_id = 242
AND f.object_type = 'opportunity'
AND fd.object_id IN (3207756)
ORDER BY fd.object_id, fd.updated_at;
SELECT * FROM crm_configurations WHERE auto_connect = 1;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Tour%'; # 187,209,8150,[EMAIL]
select * from group_deal_risk_types drgt join groups g on drgt.group_id = g.id
where g.team_id = 187;
select * from `groups` where team_id = 187;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 187
and sa.provider = 'salesforce';
# Destination - 98870 - Destination__c
# Stage - 79014 - StageName
# Land Arrangement - 98856 - Land_Arrangement__c
# Flight - 98848 - Flight__c
# Last activity date - 98812 - LastActivityDate
# Last modified date - 98809 - LastModifiedDate
# Last inbound mail timestamp - 99151 - Last_Inbound_Mail_Timestamp__c
# next call - 98864 - Next_Call__c
select * from crm_fields where crm_configuration_id = 209 and object_type = 'opportunity';
SELECT * FROM crm_layouts WHERE crm_configuration_id = 209;
SELECT * FROM crm_layout_entities WHERE crm_layout_id = 682;
select * from opportunities where team_id = 187 and name LIKE'%Muriel Sal%';
select * from opportunities where team_id = 187 and user_id = 9951 and is_closed = 0;
select * from activities where opportunity_id = 3538248;
SELECT * FROM crm_profiles WHERE user_id = 8150;
select * from deal_risks where opportunity_id = 3538248;
select * from teams where crm_id IS NULL;
SELECT opp.id AS opportunity_id,
u.group_id AS group_id,
MAX(
CASE
WHEN a.type IN ("sms-inbound", "sms-outbound") THEN a.created_at
ELSE a.actual_end_time
END) as last_date
FROM opportunities opp
left join activities a on a.opportunity_id = opp.id
inner join users u on opp.user_id = u.id
where opp.user_id IN (9951)
AND opp.is_closed = 0
and a.status IN ('completed', 'received', 'delivered') OR a.status IS NULL
group by opp.id;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Cybsafe%'; # 343,301,12008,[EMAIL]
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 343
and sa.provider = 'hubspot';
SELECT * FROM crm_profiles WHERE crm_configuration_id = 301;
SELECT * FROM contacts WHERE id = 6612363;
SELECT * FROM accounts WHERE id = 4235676;
SELECT * FROM opportunities WHERE crm_configuration_id = 301 and crm_provider_id = 32983784868;
select * from opportunity_stages where opportunity_id = 4503759;
# SELECT * FROM opportunities WHERE id = 4569937;
select * from activities where crm_configuration_id = 301;
SELECT * FROM activities WHERE uuid_to_bin('d3b2b28b-c3d0-4c2d-8ed0-eef42855278a') = uuid; # 26330370
SELECT * FROM participants WHERE activity_id = 26330370;
SELECT * FROM teams WHERE id = 375;
select * from playbooks where team_id = 375;
select * from stages where crm_configuration_id = 301 and type = 'opportunity';
select * from teams;
select * from contact_roles;
SELECT * FROM opportunities WHERE team_id = 343 and user_id = 12871 and close_date >= '2024-11-01';
select * from users u join crm_profiles cp on cp.user_id = u.id where u.team_id = 343;
SELECT * FROM crm_field_data WHERE object_id = 3771706;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 343
and sa.provider = 'hubspot';
SELECT * FROM crm_fields WHERE crm_configuration_id = 301 and object_type = 'opportunity'
and crm_provider_id LIKE "%traffic_light%";
SELECT * FROM crm_field_values WHERE crm_field_id IN (144020,144048,144111,144113,144126,144481,144508,144531);
SELECT fd.* FROM opportunities o
JOIN crm_field_data fd ON o.id = fd.object_id
WHERE o.team_id = 343
# and o.user_id IS NOT NULL
and fd.crm_field_id IN (144020,144048,144111,144113,144126,144481,144508,144531)
and fd.value != ''
order by value desc
# group by o.id
;
SELECT * FROM opportunities WHERE id = 3769843;
SELECT * FROM teams WHERE name LIKE '%Tour%'; # 187,209,8150, [EMAIL]
SELECT * FROM crm_layouts WHERE crm_configuration_id = 209;
SELECT * FROM crm_layout_entities WHERE crm_layout_id = 682;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Funding Circle%'; # 220,177,8603,[EMAIL]
SELECT * FROM activities WHERE uuid_to_bin('7a40e99b-3b37-4bb1-b983-325b81801c01') = uuid; # 23139839
SELECT * FROM opportunities WHERE id = 3855992;
SELECT * FROM users WHERE name LIKE '%Angus Pollard%'; # 8988
SELECT * FROM teams WHERE name LIKE '%Story Terrace%'; # 379, 307, 12894
SELECT * FROM crm_fields WHERE crm_configuration_id = 307 and object_type != 'opportunity';
select * from contacts where team_id = 379 and name like '%bebro%'; # 5874411, crm: 77229348507
SELECT * FROM crm_field_data WHERE object_id = 5874411;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 379
and sa.provider = 'hubspot';
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%mentio%'; # 117, 94, 6371, [EMAIL]
SELECT * FROM activities WHERE uuid_to_bin('82939311-1af0-4506-8546-21e8d1fdf2c1') = uuid;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Tourlane%'; # 187, 209, 8150, [EMAIL]
SELECT * FROM opportunities WHERE team_id = 187 and crm_provider_id = '006Se000008xfvNIAQ'; # 3537793
select * from generic_ai_prompts where subject_id = 3537793;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Lunio%'; # 120, 97, 10984, [EMAIL]
SELECT * FROM crm_configurations WHERE id = 97;
SELECT * FROM crm_layouts WHERE crm_configuration_id = 97;
SELECT * FROM crm_layout_entities WHERE crm_layout_id = 355;
SELECT * FROM crm_fields WHERE id = 32682;
select cfd.value, o.* from opportunities o
join crm_field_data cfd on o.id = cfd.object_id and cfd.crm_field_id = 32682
where team_id = 120
and cfd.value != ''
;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 120
and sa.provider = 'salesforce';
select * from opportunities where team_id = 120 and crm_provider_id = '006N1000007X8MAIA0';
SELECT * FROM crm_field_data WHERE object_id = 2313439;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE id = 410;
SELECT * FROM teams WHERE name LIKE '%Local Business Oxford%';
select * from scorecards where team_id = 410;
select * from scorecard_rules;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Funding%'; # 220, 177, 8603, [EMAIL]
select * from activities a
join opportunities o on a.opportunity_id = o.id
join users u on o.user_id = u.id
where a.crm_configuration_id = 177 and a.type LIKE '%email-out%'
# and a.actual_end_time > '2024-12-16 00:00:00'
# and o.remotely_created_at > '2024-12-01 00:00:00'
# and u.group_id = 1014
and u.id = 9021
order by a.id desc;
SELECT * FROM opportunities WHERE id in (3981384,4017346);
SELECT * FROM users WHERE team_id = 220 and id IN (8775, 11435);
select * from users where id = 9021;
select * from inboxes where user_id = 9021;
select * from inbox_emails where inbox_id = 1349 and email_date > '2024-12-18 00:00:00';
select * from email_messages where team_id = 220
and orig_date > '2024-12-16 00:00:00' and orig_date < '2024-12-19 00:00:00'
and subject LIKE '%Personal%'
# and 'from' = '[EMAIL]'
;
select * from activities a
join opportunities o on a.opportunity_id = o.id
where a.user_id = 9021 and a.type LIKE '%email-out%'
and a.actual_end_time > '2024-12-18 00:00:00'
and o.user_id IS NOT NULL
and o.remotely_created_at > '2024-12-01 00:00:00'
order by a.id desc;
SELECT * FROM opportunities WHERE team_id = 220 and name LIKE '%Right Car move Limited%' and id = 3966852;
select * from activities where crm_configuration_id = 177 and type LIKE '%email%' and opportunity_id = 3966852 order by id desc;
select * from team_settings where name IN ('useCloseDate');
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Hurree%'; # 104, 81, 6175, [EMAIL]
SELECT * FROM opportunities WHERE team_id = 104 and name = 'PropOp';
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 104
and sa.provider = 'hubspot';
select * from crm_configurations where last_synced_at > '2025-01-19 01:00:00'
select * from teams where crm_id IS NULL;
select t.name as 'team', u.name as 'owner', u.email, u.phone
from teams t
join activity_providers ap on t.id = ap.team_id
join users u on t.owner_id = u.id
where 1=1
and t.status = 'active'
and ap.is_enabled = 1
# and u.status = 1
and ap.provider = 'ms-teams';
select * from crm_configurations where provider = 'bullhorn'; # 344
SELECT * FROM teams WHERE id = 442; # 14293
select * from users where team_id = 442;
select * from social_accounts sa where sa.sociable_id = 14293;
select * from invitations where team_id = 442;
# [PASSWORD_DOTS]
SELECT * FROM users WHERE email LIKE '%[EMAIL]%'; # 14022
SELECT * FROM teams WHERE id = 429;
select * from opportunities where team_id = 429 and crm_provider_id IN (16157415775, 22246219645);
select * from activities where opportunity_id in (4340436,4353519);
select * from transcription where activity_id IN (25630961,25381771);
select * from generic_ai_prompts where subject_id IN (4353519);
SELECT
a.id as activity_id,
a.opportunity_id,
a.type as activity_type,
a.language,
CONCAT(a.title, a.description) AS mail_content,
e.from AS mail_from,
e.to AS mail_to,
e.subject AS mail_subject,
e.body AS mail_body,
p.type as prompt_type,
p.status as prompt_status,
p.content AS prompt_content,
a.actual_start_time as created_at
FROM activities a
LEFT JOIN ai_prompts p ON a.transcription_id = p.transcription_id AND p.deleted_at IS NULL
LEFT JOIN email_messages e ON a.id = e.activity_id
WHERE a.actual_start_time > '2024-01-01 00:00:00'
AND a.opportunity_id IN (4353519)
AND a.status IN ('completed', 'received', 'delivered')
AND a.deleted_at IS NULL
AND a.type NOT IN ('sms-inbound', 'sms-outbound')
ORDER BY a.opportunity_id ASC, a.id ASC;
SELECT * FROM users WHERE name LIKE '%George Fierstone%'; # 14293
SELECT * FROM teams WHERE id = 442;
SELECT * FROM crm_configurations WHERE id = 344;
select * from team_features where team_id = 442;
select * from groups where team_id = 442;
select * from playbooks where team_id = 442;
select * from playbook_categories where playbook_id = 1729;
select * from crm_fields where crm_configuration_id = 344 and id = 172024;
SELECT * FROM crm_field_values WHERE crm_field_id = 172024;
select * from crm_layouts where crm_configuration_id = 344;
select * from playbook_layouts where playbook_id = 1729;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Learning%'; # 260, 221, 9444
select s.*
# , s.sent_at, u.name, a.*
from activity_summary_logs s
inner join activities a on a.id = s.activity_id
inner join users u on u.id = a.user_id
where a.crm_configuration_id = 356
and s.sent_at > date_sub(now(), interval 60 day)
order by a.actual_end_time desc;
select * from activities a
# inner join activity_summary_logs s on s.activity_id = a.id
where a.crm_configuration_id = 356 and a.actual_end_time > date_sub(now(), interval 60 day)
# and a.crm_provider_id is not null
# and provider <> 'ringcentral'
and status = 'completed'
order by a.actual_end_time desc;
select * from teams order by id desc; # 17328, 32, 17830, [EMAIL]
SELECT * FROM users;
SELECT * FROM users where team_id = 260 and status = 1; # 201 - 150 active
SELECT * FROM teams WHERE id = 260;
select * from team_settings where team_id = 260;
select * from crm_configurations where team_id = 260;
SELECT * FROM crm_layouts WHERE crm_configuration_id = 356;
SELECT * FROM crm_layout_entities WHERE crm_layout_id = 1184;
select * from accounts where crm_configuration_id = 221 order by id desc; # 7000
select * from leads where crm_configuration_id = 221 order by id desc; # 0
select * from contacts where crm_configuration_id = 221 order by id desc; # 200 000
select * from opportunities where crm_configuration_id = 221 order by id desc; # 0
select * from crm_profiles where crm_configuration_id = 221 order by id desc; # 23
select * from crm_fields where crm_configuration_id = 221;
select * from crm_field_values where crm_field_id = 5302 order by id desc;
select * from crm_layouts where crm_configuration_id = 221 order by id desc;
select * from stages where crm_configuration_id = 221 order by id desc;
select * from accounts where crm_configuration_id = 356 order by id desc; # 7000
select * from leads where crm_configuration_id = 356 order by id desc; # 0
select * from contacts where crm_configuration_id = 356 order by id desc; # 200 000
select * from opportunities where crm_configuration_id = 356 order by id desc; # 0
select * from crm_profiles where crm_configuration_id = 356 order by id desc; # 23
select * from crm_fields where crm_configuration_id = 356;
select * from crm_field_values where crm_field_id = 5302 order by id desc;
select * from crm_layouts where crm_configuration_id = 356 order by id desc;
select * from stages where crm_configuration_id = 356 order by id desc;
select * from playbooks where team_id = 260 order by id desc; # 4 (2 deleted)
select * from groups where team_id = 260 order by id desc; # 27 groups, (2 deleted)
select * from playbook_layouts where playbook_id IN (1410,1409,1276,1254); # 4
select ce.* from calendars c
join users u on c.user_id = u.id
join calendar_events ce on c.id = ce.calendar_id
where u.team_id = 260
and (ce.start_time > '2025-02-21 00:00:00')
;
# calendar events 1207
#
select * from opportunities where team_id = 260;
SELECT * FROM crm_field_data WHERE object_id = 4696496;
select * from activities where crm_configuration_id = 356 and crm_provider_id IS NOT NULL;
select * from activities where crm_configuration_id IN (221) and provider NOT IN ('ms-teams', 'uploader', 'zoom-bot')
# and type = 'conference' and status = 'scheduled' and activities.is_internal = 0
and created_at > '2024-03-01 00:00:00'
order by id desc; # 880 000, ringcentral, avaya
SELECT * FROM participants WHERE activity_id = 26371744;
# all activities 942 000 +
# conference 7385 - scheduled 984 - external 343
select * from activities where id = 26321812;
select * from participants where activity_id = 26321812;
select * from participants where activity_id in (26414510,26414514,26414516,26414604,26414653,26414655);
select * from leads where id in (720428,689175,731546,645866,621037);
select * from users where id = 13841;
select * from opportunities where user_id = 9541;
select * from stages where id = 15900;
select * from accounts where
# id IN (4160055,5053725,4965303,4896434)
id in (4584518,3249934,3218025,3891133,3399450,4172999,4485161,3101785,4587203,3070816,2870343,2870341,3563940,4550846,3424464,3249963,2870342)
;
select * from activities where id = 26654935;
SELECT * FROM opportunities WHERE id = 4803458;
SELECT * FROM opportunities where team_id = 260 and user_id = 13841 AND stage_id = 15900;
SELECT id, uuid, provider, type, lead_id, account_id, contact_id, opportunity_id, stage_id, status, recording_state, title, actual_start_time, actual_end_time
FROM activities WHERE user_id = 13841 AND opportunity_id IN (4729783, 4731717, 4731726, 4732064, 4732849, 4803458, 4813213);
SELECT DISTINCT
o.id, o.stage_id, s.name, a.title,
a.*
FROM activities a
# INNER JOIN tracks t ON a.id = t.activity_id
INNER JOIN users u ON a.user_id = u.id
INNER JOIN teams team ON u.team_id = team.id
INNER JOIN groups g ON u.group_id = g.id
INNER JOIN opportunities o ON a.opportunity_id = o.id
INNER JOIN stages s ON o.stage_id = s.id
WHERE
a.crm_configuration_id = 356
AND a.status IN ('completed', 'failed')
AND a.recording_state != 'stopped'
# and a.user_id = 13841
AND u.uuid = uuid_to_bin('6f40e4b8-c340-4059-b4ac-1728e87ea99e')
AND team.uuid = uuid_to_bin('a607fba7-452e-4683-b2af-00d6cb52c93c')
AND g.uuid = uuid_to_bin('b5d69e40-24a0-4c16-810b-5fa462299f94')
AND a.type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')
# AND t.type IN ('audio', 'video')
AND (
(a.actual_start_time BETWEEN '2025-03-13 00:00:00' AND '2025-03-18 07:59:59')
OR
(
a.actual_start_time IS NULL
AND a.type IN ('sms-outbound', 'sms-inbound')
AND a.created_at BETWEEN '2025-03-13 00:00:00' AND '2025-03-18 07:59:59'
)
)
AND (
a.is_private = 0
OR (
a.is_private = 1
AND u.uuid = uuid_to_bin('6f40e4b8-c340-4059-b4ac-1728e87ea99e')
)
)
AND (
# s.id = 15900
s.uuid = uuid_to_bin('04ca1c26-c666-4268-a129-419c0acffd73')
OR s.uuid IS NULL -- Include records without opportunity stage
)
ORDER BY a.actual_end_time DESC;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Lead Forensics%'; # 190, 162, 8474, [EMAIL]
SELECT * FROM users WHERE team_id = 190;
select * from social_accounts sa
join users u on sa.sociable_id = u.id
where u.team_id = 190
and sa.provider = 'hubspot';
select * from role_user where user_id = 8474;
select * from crm_configurations where provider = 'bullhorn';
SELECT * FROM opportunities WHERE uuid_to_bin('94578249-65ec-4205-90f2-7d1a7d5ab64a') = uuid;
SELECT * FROM users WHERE uuid_to_bin('26dbadeb-926f-4150-b11b-771b9d4c2f9a') = uuid;
SELECT * FROM opportunities WHERE id = 4732493;
select * from activities where opportunity_id = 4732493;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE id = 443; # 358, 14315, [EMAIL]
SELECT * FROM opportunities WHERE team_id = 443;
SELECT a.id, a.type, a.user_id, a.status, a.deleted_at, u.name, u.email, u.team_id as activity_team_id, u.status, u.deleted_at, t.name, t.status, s.team_id as stage_team_id
FROM activities AS a
JOIN stages AS s ON a.stage_id = s.id
JOIN users AS u ON u.id = a.user_id
JOIN teams AS t ON t.id = s.team_id
WHERE u.team_id <> s.team_id and t.id > 135;
SELECT
crm_configuration_id,
crm_provider_id,
COUNT(*) as duplicate_count,
GROUP_CONCAT(id) as stage_ids,
GROUP_CONCAT(name) as stage_names
FROM stages
GROUP BY crm_configuration_id, crm_provider_id
HAVING COUNT(*) > 1
ORDER BY duplicate_count DESC;
select * from stages where id IN (14898,14907);
select * from business_processes;
SELECT *
FROM crm_configurations
WHERE team_id IN (
SELECT team_id
FROM crm_configurations
GROUP BY team_id
HAVING COUNT(*) > 1
)
ORDER BY team_id;
SELECT *
FROM teams
WHERE crm_id IN (
SELECT crm_id
FROM teams
GROUP BY crm_id
HAVING COUNT(*) > 1
)
ORDER BY crm_id;
# [PASSWORD_DOTS]
select * from crm_configurations where provider = 'integration-app';
SELECT * FROM teams WHERE id = 443; # Correre Naturale 358 14315 [EMAIL]
select * from activities where crm_configuration_id = 358 order by actual_end_time desc;
select id, uuid, actual_end_time, crm_provider_id, is_internal, playbook_category_id, type, user_id, lead_id, contact_id, account_id, opportunity_id, status, title from activities where crm_configuration_id = 358 order by actual_end_time desc;
select * from team_features where team_id = 358;
select * from activity_summary_logs;
select * from teams where id = 406;
# [PASSWORD_DOTS]
SELECT * FROM teams WHERE name LIKE '%Sportfive%'; # 267, 202, 14637, [EMAIL]
select * from activities where crm_configuration_id = 202 order by actual_end_time desc;
SELECT * FROM users where id = 14637;
SELECT * FROM teams where id = 267;
SELECT * FROM groups where id = 1118;
select g.name, a.title, uuid_from_bin(a.uuid), a.external_id, a.status, a.recording_state, a.recording_reason_code, a.scheduled_start_time, a.scheduled_end_time, a.actual_start_time, a.actual_end_time from activities a
inner join users u on u.id = a.user_id
inner join groups g on g.id = u.group_id
where a.crm_configuration_id = 202
and a.is_internal = 0
and (a.scheduled_start_time between '2025-03-19 00:00:00' and '2025-03-21 00:00:00')
and a.type = 'conference'
and a.status != 'completed'
and a.external_id is not null
order by a.scheduled_start_time desc;
SELECT * FROM activities
WHERE crm_configuration_id = 202
AND status IN ('completed', 'failed')
AND recording_state != 'stopped'
AND type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')
AND (is_private = 0 OR user_id = 14637)
AND (
(
actual_start_time BETWEEN '2025-03-12 12:00:00' AND '2025-03-24 11:59:59'
) OR (
actual_start_time IS NULL
AND type IN ('sms-outbound', 'sms-inbound')
AND created_at BETWEEN '2025-03-12 12:00:00' AND '2025-03-24 11:59:59'
)
)
AND NOT EXISTS (
SELECT 1
FROM tracks
WHERE
tracks.activity_id = activities.id
AND tracks.type IN ('audio', 'video')
)
ORDER BY actual_end_time DESC;
SELECT DISTINCT
a.*
FROM activities a
INNER JOIN tracks t ON a.id = t.activity_id
INNER JOIN users u ON a.user_id = u.id
INNER JOIN teams team ON u.team_id = team.id
WHERE
a.crm_configuration_id = 202
AND a.status IN ('completed', 'failed')
AND a.recording_state != 'stopped'
# and a.user_id = 14637
AND a.type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')
# AND t.type IN ('audio', 'video')
AND (
(a.actual_start_time BETWEEN '2025-03-12 12:00:00' AND '2025-03-24 11:59:59')
OR
(
a.actual_start_time IS NULL
AND a.type IN ('sms-outbound', 'sms-inbound')
AND a.created_at BETWEEN '2025-03-12 12:00:00' AND '2025-03-24 11:59:59'
)
)
AND (
a.is_private = 0
OR (
a.is_private = 1
AND a.user_id = 14637
)
)
ORDER BY a.actual_end_time DESC
;
SELECT DISTINCT a.*
FROM activities a
INNER JOIN users u ON a.user_id = u.id
INNER JOIN teams t ON u.team_id = t.id
# INNER JOIN tracks tr ON a.id = tr.activity_id
# INNER JOIN groups g ON u.group_id = g.id
WHERE 1=1
AND t.id = 267
# AND t.uuid = uuid_to_bin('aed4927b-f1ea-499e-94c3-83762fd233e8')
AND a.status IN ('completed', 'failed')
AND a.recording_state != 'stopped'
AND a.type IN ('softphone', 'softphone-inbound', 'conference', 'sms-inbound', 'sms-outbound')
# AND tr.type NOT IN ('audio', 'video')
AND (
a.is_private = 0
OR a.user_id = 14637
)
AND (
(a.actual_start_time BETWEEN '2025-03-19 00:00:00' AND '2025-03-21 23:59:59')
OR (
a.actual_start_time IS NULL
AND a.type IN ('sms-outbound', 'sms-inbound')
AND a.created_at BETWEEN '2025-03-19 00:00:00' AND '2025-03-21 23:59:59'
)
)
# and NOT EXISTS (
# SELECT 1
# FROM tracks t
# WHERE t.activity_id = a.id
# AND t.type IN ('audio', 'video')
# )
ORDER BY a.actual_end_time DESC;
SELECT * FROM tracks WHERE activity_id = 26485995;
select a.is_private, a.title, uuid_from_bin(a.uuid), a.external_id, a.status, a.recording_state, a.recording_reason_code, a.scheduled...
|
55720
|