|
15910
|
706
|
8
|
2026-05-11T07:37:33.245370+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-11/1778 /Users/lukas/.screenpipe/data/data/2026-05-11/1778485053245_m1.jpg...
|
PhpStorm
|
faVsco.js – JiminnyDebugCommand.php
|
1
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
JY-20725-handle-HS-search Project: faVsco.js, menu
JY-20725-handle-HS-search-rate-limit, 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
93
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Console\Commands;
use Carbon\Carbon;
use Carbon\CarbonImmutable;
use Illuminate\Console\Command;
use InvalidArgumentException;
use Jiminny\Jobs\AutomatedReports\RequestGenerateAskJiminnyReportJob;
use Jiminny\Jobs\AutomatedReports\SendReportMailJob;
use Jiminny\Jobs\JobDispatcherInterface;
use Jiminny\Models\Activity;
use Jiminny\Models\AutomatedReport;
use Jiminny\Models\AutomatedReportResult;
use Jiminny\Models\Team;
use Jiminny\Models\User;
use Jiminny\Repositories\AutomatedReportsRepository;
use Jiminny\Services\Activity\CrmOwnerResolver;
use Jiminny\Services\Kiosk\AutomatedReports\AutomatedReportsService;
use Jiminny\Services\UserPilot\UserPilotClient;
/**
* Class JiminnyDebugCommand
*
* @package Jiminny\Console\Commands
*/
class JiminnyDebugCommand extends Command
{
public const string FREQUENCY_DAILY = 'daily';
public const string FREQUENCY_WEEKLY = 'weekly';
public const string FREQUENCY_MONTHLY = 'monthly';
public const string FREQUENCY_QUARTERLY = 'quarterly';
public const string FREQUENCY_ONE_OFF = 'one_off';
protected $signature = 'jiminny:debug';
public function handle(
JobDispatcherInterface $jobDispatcher,
AutomatedReportsService $automatedReportsService,
AutomatedReportsRepository $automatedReportsRepository,
UserPilotClient $userPilotClient
): void {
$this->rateLimit();
exit(1);
$report = AutomatedReport::find(71);
$last = AutomatedReportResult::query()
->where('report_id', $report->getId())
->whereIn('status', [AutomatedReportResult::STATUS_DEFAULT, AutomatedReportResult::STATUS_FAILED])
// ->where('reason', '!=', AutomatedReportResult::REASON_NOT_ENOUGH_ACTIVITIES)
->whereDate('created_at', CarbonImmutable::now()->toDateString())
->latest()
->first();
$this->info("Last: {$last->getId()}");
exit(1);
$user = User::find(143);
// $count = $automatedReportsRepository->countUserReports($user);
// $this->info("Count: {$count}");
// $count = $automatedReportsRepository->countAllUserReports($user);
// $this->info("All count: {$count}");
$payload = [
'report_type' => 'ask_jiminny',
'frequency' => 'weekly',
];
$userPilotClient->track($user, 'ask-jiminny-report-generated', $payload);
exit(1);
$now = Carbon::now()->subDay(1);
$this->info("Now: {$now->toDateTimeString()}");
$weekStart = Carbon::getWeekStartsAt();
$this->info("Now: {$weekStart}");
// $from = $now->copy()->previousWeekday()->startOfDay();
// $to = $now->copy()->previousWeekday()->endOfDay();
// $fromOld = $now->copy()->subWeeks(1)->startOfDay();
// $toOld = $now->copy()->subDay()->endOfDay();
// $fromNew = $now->copy()->subWeek()->startOfWeek();
// $toNew = $now->copy()->subWeek()->endOfWeek();
// $fromOld = $now->copy()->subMonths(1)->startOfDay();
// $toOld = $now->copy()->subDay()->endOfDay();
// $fromNew = $now->copy()->subMonthNoOverflow()->startOfMonth();
// $toNew = $now->copy()->subMonthNoOverflow()->endOfMonth();
$fromOld = $now->copy()->subMonths(3)->startOfDay();
$toOld = $now->copy()->subDay()->endOfDay();
$fromNew = $now->copy()->subQuarterNoOverflow()->startOfQuarter();
$toNew = $now->copy()->subQuarterNoOverflow()->endOfQuarter();
$this->info("From old: {$fromOld->toDateTimeString()}");
$this->info("To old: {$toOld->toDateTimeString()}");
$this->info("From new: {$fromNew->toDateTimeString()}");
$this->info("To new: {$toNew->toDateTimeString()}");
exit(1);
$report = AutomatedReport::find(71);
$job = new RequestGenerateAskJiminnyReportJob($report->getUuid());
$jobDispatcher->dispatch($job);
exit(1);
// $this->formatDate($jobDispatcher);
// $this->sendMail($jobDispatcher, $automatedReportsService);
// $this->crmService();
$this->getPayload($automatedReportsService);
exit(1);
}
private function crmService()
{
$activity = Activity::find(418141);
$team = Team::find(19);
$config = $team->getCrmConfiguration();
$crmResolver = app(CrmOwnerResolver::class, [
'team' => $team,
'integrationAdmin' => $team->getOwner(),
'providerSlug' => $config->getProviderName(),
]);
$crmService = $crmResolver->prepareCrmService();
$crmService->createTranscriptNotes($activity);
}
private function sendMail(JobDispatcherInterface $jobDispatcher, AutomatedReportsService $automatedReportsService)
{
$reportUuid = '';
// $report = $automatedReportsService->getReportResult($reportUuid);
$report = AutomatedReportResult::find(275);
$validRecipients = $automatedReportsService->getValidRecipientUsers(
$report->getReport(),
includeJiminny: true,
);
$recipient = $validRecipients[0];
$fileName = $automatedReportsService->getReportFileName($report);
$typeName = $report->getReport()->getCustomName()
?? $automatedReportsService->getReportTypeName($report);
$teamsName = $automatedReportsService->getReportTeamsName($report);
$periodName = $automatedReportsService->getReportPeriodName($report);
$s3Path = $automatedReportsService->getMediaPath($report);
\Illuminate\Support\Facades\Log::channel('custom_channel')->info('$fileName ' . PHP_EOL . print_r($fileName, true));
\Illuminate\Support\Facades\Log::channel('custom_channel')->info('$typeName ' . PHP_EOL . print_r($typeName, true));
\Illuminate\Support\Facades\Log::channel('custom_channel')->info('$teamsName ' . PHP_EOL . print_r($teamsName, true));
\Illuminate\Support\Facades\Log::channel('custom_channel')->info('$periodName ' . PHP_EOL . print_r($periodName, true));
\Illuminate\Support\Facades\Log::channel('custom_channel')->info('$s3Path ' . PHP_EOL . print_r($s3Path, true));
$jobDispatcher->dispatch(
new SendReportMailJob(
reportUuid: $report->getUuid(),
s3Path: $s3Path,
recipientEmail: $recipient['email'],
recipientName: $recipient['name'] ?? null,
fileName: $fileName,
typeName: $typeName,
teamsName: $teamsName,
periodName: $periodName,
isAskJiminny: true,
)
);
exit(1);
}
private function formatDate(JobDispatcherInterface $jobDispatcher): void
{
$customName = 'Custom report name';
// $frequency = self::FREQUENCY_DAILY;
// $frequency = self::FREQUENCY_WEEKLY;
$frequency = self::FREQUENCY_MONTHLY;
// $frequency = self::FREQUENCY_QUARTERLY;
// $frequency = self::FREQUENCY_ONE_OFF;
$period = $this->calculateFromAndToDatePeriod($frequency);
$from = $period['fromDate'];
$to = $period['toDate'];
$periodName = $this->formatReportPeriodName($frequency, $from, $to);
$filenameSuffix = null;
if ($customName) {
if ($filenameSuffix) {
$customName .= " {$filenameSuffix}";
}
$result = $this->sanitizeFileName("{$customName} - {$periodName}");
}
$this->info($result);
}
public function calculateFromAndToDatePeriod(
string $frequency,
?Carbon $fromDate = null,
?Carbon $toDate = null
): array {
if ($frequency === self::FREQUENCY_ONE_OFF) {
return [
'fromDate' => $fromDate,
'toDate' => $toDate,
];
}
$now = Carbon::now();
return match ($frequency) {
self::FREQUENCY_DAILY => [
'fromDate' => $now->copy()->subDay()->startOfDay(),
'toDate' => $now->copy()->subDay()->endOfDay(),
],
self::FREQUENCY_WEEKLY => [
'fromDate' => $now->copy()->subWeeks(1)->startOfDay(),
'toDate' => $now->copy()->subDay()->endOfDay(),
],
self::FREQUENCY_MONTHLY => [
'fromDate' => $now->copy()->subMonths(1)->startOfDay(),
'toDate' => $now->copy()->subDay()->endOfDay(),
],
self::FREQUENCY_QUARTERLY => [
'fromDate' => $now->copy()->subMonths(3)->startOfDay(),
'toDate' => $now->copy()->subDay()->endOfDay(),
],
default => throw new InvalidArgumentException("Unsupported frequency: {$frequency}"),
};
}
private function formatReportPeriodName(string $frequency, Carbon $from, Carbon $to): string
{
$fromYear = $from->format('Y');
$toYear = $to->format('Y');
$differentYears = $fromYear !== $toYear;
switch ($frequency) {
case self::FREQUENCY_DAILY:
return $from->format('j M Y');
case self::FREQUENCY_QUARTERLY:
// 'Jan-Mar 2025' or 'Nov 2024-Jan 2025' if years differ
$startMonth = $from->format('M');
$endMonth = $to->copy()->subMonth();
$endMonthName = $endMonth->format('M');
$endMonthYear = $endMonth->format('Y');
if ($differentYears) {
return "{$startMonth} {$fromYear} - {$endMonthName} {$endMonthYear}";
}
return "{$startMonth} - {$endMonthName} {$toYear}";
case self::FREQUENCY_MONTHLY:
// 'May 2025' - monthly reports are always within the same year
return $from->format('M Y');
case self::FREQUENCY_WEEKLY:
// '4 - 8 Aug 2025', '27 Oct - 3 Nov 2025', or '28 Dec 2024 - 3 Jan 2025' if years differ
$startDay = $from->format('j');
$endDay = $to->format('j');
$startMonth = $from->format('M');
$endMonth = $to->format('M');
if ($differentYears) {
return "{$startDay} {$startMonth} {$fromYear} - {$endDay} {$endMonth} {$toYear}";
}
if ($startMonth !== $endMonth) {
return "{$startDay} {$startMonth} - {$endDay} {$endMonth} {$toYear}";
}
return "{$startDay} - {$endDay} {$endMonth} {$toYear}";
case self::FREQUENCY_ONE_OFF:
// '2 May-31 May 2025' or '15 Dec 2024-15 Jan 2025' if years differ
$startDay = $from->format('j');
$startMonth = $from->format('M');
$endDay = $to->format('j');
$endMonth = $to->format('M');
// If same month and year, use a format like '2-31 May 2025'
if ($startMonth === $endMonth && ! $differentYears) {
return "{$startDay} - {$endDay} {$startMonth} {$toYear}";
}
// If different years, include both years
if ($differentYears) {
return "{$startDay} {$startMonth} {$fromYear} - {$endDay} {$endMonth} {$toYear}";
}
// Same year but different months
return "{$startDay} {$startMonth} - {$endDay} {$endMonth} {$toYear}";
default:
// Default format for unknown frequencies
return $from->format('j M Y') . ' - ' . $to->format('j M Y');
}
}
public function sanitizeFileName(string $fileName): string
{
return str_replace(['/', '\\'], '-', $fileName);
}
private function getPayload(AutomatedReportsService $automatedReportsService)
{
$reportResult = AutomatedReportResult::find(269);
$automatedReport = $reportResult->getReport();
$activityIds = [1,2,3];
$payload = $automatedReportsService->getAskJiminnyGenerateReportPayload(
automatedReport: $automatedReport,
reportResult: $reportResult,
activityIds: $activityIds,
);
\Illuminate\Support\Facades\Log::channel('custom_channel')->info('$payload ' . PHP_EOL . print_r($payload, true));
}
private function rateLimit()
{
$team = Team::find(2);
$config = $team->getCrmConfiguration();
$crmResolver = app(CrmOwnerResolver::class, [
'team' => $team,
'integrationAdmin' => $team->getOwner(),
'providerSlug' => $config->getProviderName(),
]);
$crmService = $crmResolver->prepareCrmService();
for ($i = 0 ; $i < 3; $i++) {
// if ($i % 25 === 0) {
// $this->info("Syncing opportunity {$i}");
$this->info("Matching contact {$i}");
// }
// $crmService->syncOpportunity('374720564');
$crmService->matchByName('Robot');
}
}
}
Sync Changes
Hide This Notification
Code changed:
Hide
19
Previous Highlighted Error
Next Highlighted Error
[2026-05-07 14:21:15] local.INFO: [Hubspot] DEBUG Getting headers {
"headers":{
"Date":["Thu,07 May 2026 14:21:15 GMT"],
"Content-Type":["application/json;charset=utf-8"],
"Transfer-Encoding":["chunked"],
"Connection":["keep-alive"],
"CF-Ray":["9f80deb8db60dc3a-SOF"],
"CF-Cache-Status":["DYNAMIC"],
"Strict-Transport-Security":["max-age=31536000; includeSubDomains; preload"],
"Vary":["origin,
accept-encoding"],
"access-control-allow-credentials":["false"],
"server-timing":["hcid;desc=\"019e02d0-6fd8-7812-bdba-885b7ccb3ee3\",
cfr;desc=\"9f80deb8e7c6dc3a-IAD\""],
"x-content-type-options":["nosniff"],
"x-hubspot-correlation-id":["019e02d0-6fd8-7812-bdba-885b7ccb3ee3"],
"Set-Cookie":["__cf_bm=SIUrtdQgXVrik50pdqF6hZVYKhzTnQBidvMabeCtm0Y-1778163675-[IP_ADDRESS]-rI.ZggtDKxTge5zr8_2gbBfWMQQ.ufZEXDZyHz2mBUFdzdo2gTHEsOkXMSEShjK0hGYxNhUGM1ZoBpX7BcFZcHEjA7Cs_.SMUhUnd2nYjko; path=/; expires=Thu,
07-May-26 14:51:15 GMT; domain=.hubapi.com; HttpOnly; Secure; SameSite=None"],
"Report-To":["{
\"endpoints\":[{
\"url\":\"https:\\/\\/a.nel.cloudflare.com\\/report\\/v4?s=NYAlsVTP0fYm32qrSDjxYE4sd2RWRqiSp3wHsmdEgZlzoYdxI%2BIxVpHmsKn3O%2BKVA3mFIJ2m7YRECDGSM%2BW2IYTzo6FM4%2BdUIjURO8srzKSvJgZ%2BQ6R79arKQw3uHLlX\"}],
\"group\":\"cf-nel\",
\"max_age\":604800}"],
"NEL":["{
\"success_fraction\":0.01,
\"report_to\":\"cf-nel\",
\"max_age\":604800}"],
"Server":["cloudflare"]}} {
"correlation_id":"95236535-ec98-4541-b92a-adfa73b69eab",
"trace_id":"c7ab8365-903f-46d4-9403-0e5b551e3545"}
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"on_screen":true,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JY-20725-handle-HS-search-rate-limit, menu","depth":5,"on_screen":true,"help_text":"Git Branch: JY-20725-handle-HS-search-rate-limit","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,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"AskJiminnyReportActivityServiceTest","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run 'AskJiminnyReportActivityServiceTest'","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'AskJiminnyReportActivityServiceTest'","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"More Actions","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JetBrains AI","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Search Everywhere","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"IDE and Project Settings","depth":5,"on_screen":true,"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},"on_screen":false,"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},"on_screen":false,"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},"on_screen":false,"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},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"93","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"on_screen":true,"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\\Console\\Commands;\n\nuse Carbon\\Carbon;\nuse Carbon\\CarbonImmutable;\nuse Illuminate\\Console\\Command;\nuse InvalidArgumentException;\nuse Jiminny\\Jobs\\AutomatedReports\\RequestGenerateAskJiminnyReportJob;\nuse Jiminny\\Jobs\\AutomatedReports\\SendReportMailJob;\nuse Jiminny\\Jobs\\JobDispatcherInterface;\nuse Jiminny\\Models\\Activity;\nuse Jiminny\\Models\\AutomatedReport;\nuse Jiminny\\Models\\AutomatedReportResult;\nuse Jiminny\\Models\\Team;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Repositories\\AutomatedReportsRepository;\nuse Jiminny\\Services\\Activity\\CrmOwnerResolver;\nuse Jiminny\\Services\\Kiosk\\AutomatedReports\\AutomatedReportsService;\nuse Jiminny\\Services\\UserPilot\\UserPilotClient;\n\n/**\n * Class JiminnyDebugCommand\n *\n * @package Jiminny\\Console\\Commands\n */\nclass JiminnyDebugCommand extends Command\n{\n public const string FREQUENCY_DAILY = 'daily';\n public const string FREQUENCY_WEEKLY = 'weekly';\n public const string FREQUENCY_MONTHLY = 'monthly';\n public const string FREQUENCY_QUARTERLY = 'quarterly';\n public const string FREQUENCY_ONE_OFF = 'one_off';\n protected $signature = 'jiminny:debug';\n\n public function handle(\n JobDispatcherInterface $jobDispatcher,\n AutomatedReportsService $automatedReportsService,\n AutomatedReportsRepository $automatedReportsRepository,\n UserPilotClient $userPilotClient\n ): void {\n $this->rateLimit();\n exit(1);\n\n\n\n $report = AutomatedReport::find(71);\n $last = AutomatedReportResult::query()\n ->where('report_id', $report->getId())\n ->whereIn('status', [AutomatedReportResult::STATUS_DEFAULT, AutomatedReportResult::STATUS_FAILED])\n// ->where('reason', '!=', AutomatedReportResult::REASON_NOT_ENOUGH_ACTIVITIES)\n ->whereDate('created_at', CarbonImmutable::now()->toDateString())\n ->latest()\n ->first();\n\n $this->info(\"Last: {$last->getId()}\");\n\n exit(1);\n\n $user = User::find(143);\n // $count = $automatedReportsRepository->countUserReports($user);\n // $this->info(\"Count: {$count}\");\n // $count = $automatedReportsRepository->countAllUserReports($user);\n // $this->info(\"All count: {$count}\");\n\n $payload = [\n 'report_type' => 'ask_jiminny',\n 'frequency' => 'weekly',\n ];\n $userPilotClient->track($user, 'ask-jiminny-report-generated', $payload);\n\n exit(1);\n\n $now = Carbon::now()->subDay(1);\n $this->info(\"Now: {$now->toDateTimeString()}\");\n $weekStart = Carbon::getWeekStartsAt();\n $this->info(\"Now: {$weekStart}\");\n\n // $from = $now->copy()->previousWeekday()->startOfDay();\n // $to = $now->copy()->previousWeekday()->endOfDay();\n\n // $fromOld = $now->copy()->subWeeks(1)->startOfDay();\n // $toOld = $now->copy()->subDay()->endOfDay();\n // $fromNew = $now->copy()->subWeek()->startOfWeek();\n // $toNew = $now->copy()->subWeek()->endOfWeek();\n\n // $fromOld = $now->copy()->subMonths(1)->startOfDay();\n // $toOld = $now->copy()->subDay()->endOfDay();\n // $fromNew = $now->copy()->subMonthNoOverflow()->startOfMonth();\n // $toNew = $now->copy()->subMonthNoOverflow()->endOfMonth();\n\n $fromOld = $now->copy()->subMonths(3)->startOfDay();\n $toOld = $now->copy()->subDay()->endOfDay();\n $fromNew = $now->copy()->subQuarterNoOverflow()->startOfQuarter();\n $toNew = $now->copy()->subQuarterNoOverflow()->endOfQuarter();\n\n $this->info(\"From old: {$fromOld->toDateTimeString()}\");\n $this->info(\"To old: {$toOld->toDateTimeString()}\");\n $this->info(\"From new: {$fromNew->toDateTimeString()}\");\n $this->info(\"To new: {$toNew->toDateTimeString()}\");\n\n exit(1);\n\n $report = AutomatedReport::find(71);\n\n $job = new RequestGenerateAskJiminnyReportJob($report->getUuid());\n $jobDispatcher->dispatch($job);\n\n exit(1);\n\n\n // $this->formatDate($jobDispatcher);\n // $this->sendMail($jobDispatcher, $automatedReportsService);\n // $this->crmService();\n\n $this->getPayload($automatedReportsService);\n\n exit(1);\n }\n\n\n\n private function crmService()\n {\n $activity = Activity::find(418141);\n\n $team = Team::find(19);\n $config = $team->getCrmConfiguration();\n\n $crmResolver = app(CrmOwnerResolver::class, [\n 'team' => $team,\n 'integrationAdmin' => $team->getOwner(),\n 'providerSlug' => $config->getProviderName(),\n ]);\n\n $crmService = $crmResolver->prepareCrmService();\n\n $crmService->createTranscriptNotes($activity);\n }\n\n private function sendMail(JobDispatcherInterface $jobDispatcher, AutomatedReportsService $automatedReportsService)\n {\n $reportUuid = '';\n // $report = $automatedReportsService->getReportResult($reportUuid);\n $report = AutomatedReportResult::find(275);\n $validRecipients = $automatedReportsService->getValidRecipientUsers(\n $report->getReport(),\n includeJiminny: true,\n );\n\n $recipient = $validRecipients[0];\n\n $fileName = $automatedReportsService->getReportFileName($report);\n $typeName = $report->getReport()->getCustomName()\n ?? $automatedReportsService->getReportTypeName($report);\n $teamsName = $automatedReportsService->getReportTeamsName($report);\n $periodName = $automatedReportsService->getReportPeriodName($report);\n $s3Path = $automatedReportsService->getMediaPath($report);\n\n \\Illuminate\\Support\\Facades\\Log::channel('custom_channel')->info('$fileName ' . PHP_EOL . print_r($fileName, true));\n \\Illuminate\\Support\\Facades\\Log::channel('custom_channel')->info('$typeName ' . PHP_EOL . print_r($typeName, true));\n \\Illuminate\\Support\\Facades\\Log::channel('custom_channel')->info('$teamsName ' . PHP_EOL . print_r($teamsName, true));\n \\Illuminate\\Support\\Facades\\Log::channel('custom_channel')->info('$periodName ' . PHP_EOL . print_r($periodName, true));\n \\Illuminate\\Support\\Facades\\Log::channel('custom_channel')->info('$s3Path ' . PHP_EOL . print_r($s3Path, true));\n\n $jobDispatcher->dispatch(\n new SendReportMailJob(\n reportUuid: $report->getUuid(),\n s3Path: $s3Path,\n recipientEmail: $recipient['email'],\n recipientName: $recipient['name'] ?? null,\n fileName: $fileName,\n typeName: $typeName,\n teamsName: $teamsName,\n periodName: $periodName,\n isAskJiminny: true,\n )\n );\n\n exit(1);\n }\n\n private function formatDate(JobDispatcherInterface $jobDispatcher): void\n {\n $customName = 'Custom report name';\n // $frequency = self::FREQUENCY_DAILY;\n // $frequency = self::FREQUENCY_WEEKLY;\n $frequency = self::FREQUENCY_MONTHLY;\n // $frequency = self::FREQUENCY_QUARTERLY;\n // $frequency = self::FREQUENCY_ONE_OFF;\n $period = $this->calculateFromAndToDatePeriod($frequency);\n $from = $period['fromDate'];\n $to = $period['toDate'];\n $periodName = $this->formatReportPeriodName($frequency, $from, $to);\n $filenameSuffix = null;\n\n if ($customName) {\n if ($filenameSuffix) {\n $customName .= \" {$filenameSuffix}\";\n }\n\n $result = $this->sanitizeFileName(\"{$customName} - {$periodName}\");\n }\n\n $this->info($result);\n }\n\n public function calculateFromAndToDatePeriod(\n string $frequency,\n ?Carbon $fromDate = null,\n ?Carbon $toDate = null\n ): array {\n if ($frequency === self::FREQUENCY_ONE_OFF) {\n return [\n 'fromDate' => $fromDate,\n 'toDate' => $toDate,\n ];\n }\n\n $now = Carbon::now();\n\n return match ($frequency) {\n self::FREQUENCY_DAILY => [\n 'fromDate' => $now->copy()->subDay()->startOfDay(),\n 'toDate' => $now->copy()->subDay()->endOfDay(),\n ],\n self::FREQUENCY_WEEKLY => [\n 'fromDate' => $now->copy()->subWeeks(1)->startOfDay(),\n 'toDate' => $now->copy()->subDay()->endOfDay(),\n ],\n self::FREQUENCY_MONTHLY => [\n 'fromDate' => $now->copy()->subMonths(1)->startOfDay(),\n 'toDate' => $now->copy()->subDay()->endOfDay(),\n ],\n self::FREQUENCY_QUARTERLY => [\n 'fromDate' => $now->copy()->subMonths(3)->startOfDay(),\n 'toDate' => $now->copy()->subDay()->endOfDay(),\n ],\n default => throw new InvalidArgumentException(\"Unsupported frequency: {$frequency}\"),\n };\n }\n\n private function formatReportPeriodName(string $frequency, Carbon $from, Carbon $to): string\n {\n $fromYear = $from->format('Y');\n $toYear = $to->format('Y');\n $differentYears = $fromYear !== $toYear;\n\n switch ($frequency) {\n case self::FREQUENCY_DAILY:\n return $from->format('j M Y');\n\n case self::FREQUENCY_QUARTERLY:\n // 'Jan-Mar 2025' or 'Nov 2024-Jan 2025' if years differ\n $startMonth = $from->format('M');\n $endMonth = $to->copy()->subMonth();\n $endMonthName = $endMonth->format('M');\n $endMonthYear = $endMonth->format('Y');\n\n if ($differentYears) {\n return \"{$startMonth} {$fromYear} - {$endMonthName} {$endMonthYear}\";\n }\n\n return \"{$startMonth} - {$endMonthName} {$toYear}\";\n\n case self::FREQUENCY_MONTHLY:\n // 'May 2025' - monthly reports are always within the same year\n return $from->format('M Y');\n\n case self::FREQUENCY_WEEKLY:\n // '4 - 8 Aug 2025', '27 Oct - 3 Nov 2025', or '28 Dec 2024 - 3 Jan 2025' if years differ\n $startDay = $from->format('j');\n $endDay = $to->format('j');\n $startMonth = $from->format('M');\n $endMonth = $to->format('M');\n\n if ($differentYears) {\n return \"{$startDay} {$startMonth} {$fromYear} - {$endDay} {$endMonth} {$toYear}\";\n }\n\n if ($startMonth !== $endMonth) {\n return \"{$startDay} {$startMonth} - {$endDay} {$endMonth} {$toYear}\";\n }\n\n return \"{$startDay} - {$endDay} {$endMonth} {$toYear}\";\n\n case self::FREQUENCY_ONE_OFF:\n // '2 May-31 May 2025' or '15 Dec 2024-15 Jan 2025' if years differ\n $startDay = $from->format('j');\n $startMonth = $from->format('M');\n $endDay = $to->format('j');\n $endMonth = $to->format('M');\n\n // If same month and year, use a format like '2-31 May 2025'\n if ($startMonth === $endMonth && ! $differentYears) {\n return \"{$startDay} - {$endDay} {$startMonth} {$toYear}\";\n }\n\n // If different years, include both years\n if ($differentYears) {\n return \"{$startDay} {$startMonth} {$fromYear} - {$endDay} {$endMonth} {$toYear}\";\n }\n\n // Same year but different months\n return \"{$startDay} {$startMonth} - {$endDay} {$endMonth} {$toYear}\";\n\n default:\n // Default format for unknown frequencies\n return $from->format('j M Y') . ' - ' . $to->format('j M Y');\n }\n }\n\n public function sanitizeFileName(string $fileName): string\n {\n return str_replace(['/', '\\\\'], '-', $fileName);\n }\n\n private function getPayload(AutomatedReportsService $automatedReportsService)\n {\n $reportResult = AutomatedReportResult::find(269);\n $automatedReport = $reportResult->getReport();\n $activityIds = [1,2,3];\n $payload = $automatedReportsService->getAskJiminnyGenerateReportPayload(\n automatedReport: $automatedReport,\n reportResult: $reportResult,\n activityIds: $activityIds,\n );\n\n \\Illuminate\\Support\\Facades\\Log::channel('custom_channel')->info('$payload ' . PHP_EOL . print_r($payload, true));\n }\n\n private function rateLimit()\n {\n $team = Team::find(2);\n $config = $team->getCrmConfiguration();\n\n $crmResolver = app(CrmOwnerResolver::class, [\n 'team' => $team,\n 'integrationAdmin' => $team->getOwner(),\n 'providerSlug' => $config->getProviderName(),\n ]);\n\n $crmService = $crmResolver->prepareCrmService();\n\n for ($i = 0 ; $i < 3; $i++) {\n// if ($i % 25 === 0) {\n// $this->info(\"Syncing opportunity {$i}\");\n $this->info(\"Matching contact {$i}\");\n// }\n// $crmService->syncOpportunity('374720564');\n $crmService->matchByName('Robot');\n }\n }\n}","depth":4,"on_screen":true,"value":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Console\\Commands;\n\nuse Carbon\\Carbon;\nuse Carbon\\CarbonImmutable;\nuse Illuminate\\Console\\Command;\nuse InvalidArgumentException;\nuse Jiminny\\Jobs\\AutomatedReports\\RequestGenerateAskJiminnyReportJob;\nuse Jiminny\\Jobs\\AutomatedReports\\SendReportMailJob;\nuse Jiminny\\Jobs\\JobDispatcherInterface;\nuse Jiminny\\Models\\Activity;\nuse Jiminny\\Models\\AutomatedReport;\nuse Jiminny\\Models\\AutomatedReportResult;\nuse Jiminny\\Models\\Team;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Repositories\\AutomatedReportsRepository;\nuse Jiminny\\Services\\Activity\\CrmOwnerResolver;\nuse Jiminny\\Services\\Kiosk\\AutomatedReports\\AutomatedReportsService;\nuse Jiminny\\Services\\UserPilot\\UserPilotClient;\n\n/**\n * Class JiminnyDebugCommand\n *\n * @package Jiminny\\Console\\Commands\n */\nclass JiminnyDebugCommand extends Command\n{\n public const string FREQUENCY_DAILY = 'daily';\n public const string FREQUENCY_WEEKLY = 'weekly';\n public const string FREQUENCY_MONTHLY = 'monthly';\n public const string FREQUENCY_QUARTERLY = 'quarterly';\n public const string FREQUENCY_ONE_OFF = 'one_off';\n protected $signature = 'jiminny:debug';\n\n public function handle(\n JobDispatcherInterface $jobDispatcher,\n AutomatedReportsService $automatedReportsService,\n AutomatedReportsRepository $automatedReportsRepository,\n UserPilotClient $userPilotClient\n ): void {\n $this->rateLimit();\n exit(1);\n\n\n\n $report = AutomatedReport::find(71);\n $last = AutomatedReportResult::query()\n ->where('report_id', $report->getId())\n ->whereIn('status', [AutomatedReportResult::STATUS_DEFAULT, AutomatedReportResult::STATUS_FAILED])\n// ->where('reason', '!=', AutomatedReportResult::REASON_NOT_ENOUGH_ACTIVITIES)\n ->whereDate('created_at', CarbonImmutable::now()->toDateString())\n ->latest()\n ->first();\n\n $this->info(\"Last: {$last->getId()}\");\n\n exit(1);\n\n $user = User::find(143);\n // $count = $automatedReportsRepository->countUserReports($user);\n // $this->info(\"Count: {$count}\");\n // $count = $automatedReportsRepository->countAllUserReports($user);\n // $this->info(\"All count: {$count}\");\n\n $payload = [\n 'report_type' => 'ask_jiminny',\n 'frequency' => 'weekly',\n ];\n $userPilotClient->track($user, 'ask-jiminny-report-generated', $payload);\n\n exit(1);\n\n $now = Carbon::now()->subDay(1);\n $this->info(\"Now: {$now->toDateTimeString()}\");\n $weekStart = Carbon::getWeekStartsAt();\n $this->info(\"Now: {$weekStart}\");\n\n // $from = $now->copy()->previousWeekday()->startOfDay();\n // $to = $now->copy()->previousWeekday()->endOfDay();\n\n // $fromOld = $now->copy()->subWeeks(1)->startOfDay();\n // $toOld = $now->copy()->subDay()->endOfDay();\n // $fromNew = $now->copy()->subWeek()->startOfWeek();\n // $toNew = $now->copy()->subWeek()->endOfWeek();\n\n // $fromOld = $now->copy()->subMonths(1)->startOfDay();\n // $toOld = $now->copy()->subDay()->endOfDay();\n // $fromNew = $now->copy()->subMonthNoOverflow()->startOfMonth();\n // $toNew = $now->copy()->subMonthNoOverflow()->endOfMonth();\n\n $fromOld = $now->copy()->subMonths(3)->startOfDay();\n $toOld = $now->copy()->subDay()->endOfDay();\n $fromNew = $now->copy()->subQuarterNoOverflow()->startOfQuarter();\n $toNew = $now->copy()->subQuarterNoOverflow()->endOfQuarter();\n\n $this->info(\"From old: {$fromOld->toDateTimeString()}\");\n $this->info(\"To old: {$toOld->toDateTimeString()}\");\n $this->info(\"From new: {$fromNew->toDateTimeString()}\");\n $this->info(\"To new: {$toNew->toDateTimeString()}\");\n\n exit(1);\n\n $report = AutomatedReport::find(71);\n\n $job = new RequestGenerateAskJiminnyReportJob($report->getUuid());\n $jobDispatcher->dispatch($job);\n\n exit(1);\n\n\n // $this->formatDate($jobDispatcher);\n // $this->sendMail($jobDispatcher, $automatedReportsService);\n // $this->crmService();\n\n $this->getPayload($automatedReportsService);\n\n exit(1);\n }\n\n\n\n private function crmService()\n {\n $activity = Activity::find(418141);\n\n $team = Team::find(19);\n $config = $team->getCrmConfiguration();\n\n $crmResolver = app(CrmOwnerResolver::class, [\n 'team' => $team,\n 'integrationAdmin' => $team->getOwner(),\n 'providerSlug' => $config->getProviderName(),\n ]);\n\n $crmService = $crmResolver->prepareCrmService();\n\n $crmService->createTranscriptNotes($activity);\n }\n\n private function sendMail(JobDispatcherInterface $jobDispatcher, AutomatedReportsService $automatedReportsService)\n {\n $reportUuid = '';\n // $report = $automatedReportsService->getReportResult($reportUuid);\n $report = AutomatedReportResult::find(275);\n $validRecipients = $automatedReportsService->getValidRecipientUsers(\n $report->getReport(),\n includeJiminny: true,\n );\n\n $recipient = $validRecipients[0];\n\n $fileName = $automatedReportsService->getReportFileName($report);\n $typeName = $report->getReport()->getCustomName()\n ?? $automatedReportsService->getReportTypeName($report);\n $teamsName = $automatedReportsService->getReportTeamsName($report);\n $periodName = $automatedReportsService->getReportPeriodName($report);\n $s3Path = $automatedReportsService->getMediaPath($report);\n\n \\Illuminate\\Support\\Facades\\Log::channel('custom_channel')->info('$fileName ' . PHP_EOL . print_r($fileName, true));\n \\Illuminate\\Support\\Facades\\Log::channel('custom_channel')->info('$typeName ' . PHP_EOL . print_r($typeName, true));\n \\Illuminate\\Support\\Facades\\Log::channel('custom_channel')->info('$teamsName ' . PHP_EOL . print_r($teamsName, true));\n \\Illuminate\\Support\\Facades\\Log::channel('custom_channel')->info('$periodName ' . PHP_EOL . print_r($periodName, true));\n \\Illuminate\\Support\\Facades\\Log::channel('custom_channel')->info('$s3Path ' . PHP_EOL . print_r($s3Path, true));\n\n $jobDispatcher->dispatch(\n new SendReportMailJob(\n reportUuid: $report->getUuid(),\n s3Path: $s3Path,\n recipientEmail: $recipient['email'],\n recipientName: $recipient['name'] ?? null,\n fileName: $fileName,\n typeName: $typeName,\n teamsName: $teamsName,\n periodName: $periodName,\n isAskJiminny: true,\n )\n );\n\n exit(1);\n }\n\n private function formatDate(JobDispatcherInterface $jobDispatcher): void\n {\n $customName = 'Custom report name';\n // $frequency = self::FREQUENCY_DAILY;\n // $frequency = self::FREQUENCY_WEEKLY;\n $frequency = self::FREQUENCY_MONTHLY;\n // $frequency = self::FREQUENCY_QUARTERLY;\n // $frequency = self::FREQUENCY_ONE_OFF;\n $period = $this->calculateFromAndToDatePeriod($frequency);\n $from = $period['fromDate'];\n $to = $period['toDate'];\n $periodName = $this->formatReportPeriodName($frequency, $from, $to);\n $filenameSuffix = null;\n\n if ($customName) {\n if ($filenameSuffix) {\n $customName .= \" {$filenameSuffix}\";\n }\n\n $result = $this->sanitizeFileName(\"{$customName} - {$periodName}\");\n }\n\n $this->info($result);\n }\n\n public function calculateFromAndToDatePeriod(\n string $frequency,\n ?Carbon $fromDate = null,\n ?Carbon $toDate = null\n ): array {\n if ($frequency === self::FREQUENCY_ONE_OFF) {\n return [\n 'fromDate' => $fromDate,\n 'toDate' => $toDate,\n ];\n }\n\n $now = Carbon::now();\n\n return match ($frequency) {\n self::FREQUENCY_DAILY => [\n 'fromDate' => $now->copy()->subDay()->startOfDay(),\n 'toDate' => $now->copy()->subDay()->endOfDay(),\n ],\n self::FREQUENCY_WEEKLY => [\n 'fromDate' => $now->copy()->subWeeks(1)->startOfDay(),\n 'toDate' => $now->copy()->subDay()->endOfDay(),\n ],\n self::FREQUENCY_MONTHLY => [\n 'fromDate' => $now->copy()->subMonths(1)->startOfDay(),\n 'toDate' => $now->copy()->subDay()->endOfDay(),\n ],\n self::FREQUENCY_QUARTERLY => [\n 'fromDate' => $now->copy()->subMonths(3)->startOfDay(),\n 'toDate' => $now->copy()->subDay()->endOfDay(),\n ],\n default => throw new InvalidArgumentException(\"Unsupported frequency: {$frequency}\"),\n };\n }\n\n private function formatReportPeriodName(string $frequency, Carbon $from, Carbon $to): string\n {\n $fromYear = $from->format('Y');\n $toYear = $to->format('Y');\n $differentYears = $fromYear !== $toYear;\n\n switch ($frequency) {\n case self::FREQUENCY_DAILY:\n return $from->format('j M Y');\n\n case self::FREQUENCY_QUARTERLY:\n // 'Jan-Mar 2025' or 'Nov 2024-Jan 2025' if years differ\n $startMonth = $from->format('M');\n $endMonth = $to->copy()->subMonth();\n $endMonthName = $endMonth->format('M');\n $endMonthYear = $endMonth->format('Y');\n\n if ($differentYears) {\n return \"{$startMonth} {$fromYear} - {$endMonthName} {$endMonthYear}\";\n }\n\n return \"{$startMonth} - {$endMonthName} {$toYear}\";\n\n case self::FREQUENCY_MONTHLY:\n // 'May 2025' - monthly reports are always within the same year\n return $from->format('M Y');\n\n case self::FREQUENCY_WEEKLY:\n // '4 - 8 Aug 2025', '27 Oct - 3 Nov 2025', or '28 Dec 2024 - 3 Jan 2025' if years differ\n $startDay = $from->format('j');\n $endDay = $to->format('j');\n $startMonth = $from->format('M');\n $endMonth = $to->format('M');\n\n if ($differentYears) {\n return \"{$startDay} {$startMonth} {$fromYear} - {$endDay} {$endMonth} {$toYear}\";\n }\n\n if ($startMonth !== $endMonth) {\n return \"{$startDay} {$startMonth} - {$endDay} {$endMonth} {$toYear}\";\n }\n\n return \"{$startDay} - {$endDay} {$endMonth} {$toYear}\";\n\n case self::FREQUENCY_ONE_OFF:\n // '2 May-31 May 2025' or '15 Dec 2024-15 Jan 2025' if years differ\n $startDay = $from->format('j');\n $startMonth = $from->format('M');\n $endDay = $to->format('j');\n $endMonth = $to->format('M');\n\n // If same month and year, use a format like '2-31 May 2025'\n if ($startMonth === $endMonth && ! $differentYears) {\n return \"{$startDay} - {$endDay} {$startMonth} {$toYear}\";\n }\n\n // If different years, include both years\n if ($differentYears) {\n return \"{$startDay} {$startMonth} {$fromYear} - {$endDay} {$endMonth} {$toYear}\";\n }\n\n // Same year but different months\n return \"{$startDay} {$startMonth} - {$endDay} {$endMonth} {$toYear}\";\n\n default:\n // Default format for unknown frequencies\n return $from->format('j M Y') . ' - ' . $to->format('j M Y');\n }\n }\n\n public function sanitizeFileName(string $fileName): string\n {\n return str_replace(['/', '\\\\'], '-', $fileName);\n }\n\n private function getPayload(AutomatedReportsService $automatedReportsService)\n {\n $reportResult = AutomatedReportResult::find(269);\n $automatedReport = $reportResult->getReport();\n $activityIds = [1,2,3];\n $payload = $automatedReportsService->getAskJiminnyGenerateReportPayload(\n automatedReport: $automatedReport,\n reportResult: $reportResult,\n activityIds: $activityIds,\n );\n\n \\Illuminate\\Support\\Facades\\Log::channel('custom_channel')->info('$payload ' . PHP_EOL . print_r($payload, true));\n }\n\n private function rateLimit()\n {\n $team = Team::find(2);\n $config = $team->getCrmConfiguration();\n\n $crmResolver = app(CrmOwnerResolver::class, [\n 'team' => $team,\n 'integrationAdmin' => $team->getOwner(),\n 'providerSlug' => $config->getProviderName(),\n ]);\n\n $crmService = $crmResolver->prepareCrmService();\n\n for ($i = 0 ; $i < 3; $i++) {\n// if ($i % 25 === 0) {\n// $this->info(\"Syncing opportunity {$i}\");\n $this->info(\"Matching contact {$i}\");\n// }\n// $crmService->syncOpportunity('374720564');\n $crmService->matchByName('Robot');\n }\n }\n}","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"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},"on_screen":false,"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},"on_screen":false,"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},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"19","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"[2026-05-07 14:21:15] local.INFO: [Hubspot] DEBUG Getting headers {\n\"headers\":{\n\"Date\":[\"Thu,07 May 2026 14:21:15 GMT\"],\n \"Content-Type\":[\"application/json;charset=utf-8\"],\n \"Transfer-Encoding\":[\"chunked\"],\n \"Connection\":[\"keep-alive\"],\n \"CF-Ray\":[\"9f80deb8db60dc3a-SOF\"],\n \"CF-Cache-Status\":[\"DYNAMIC\"],\n \"Strict-Transport-Security\":[\"max-age=31536000; includeSubDomains; preload\"],\n \"Vary\":[\"origin,\n accept-encoding\"],\n \"access-control-allow-credentials\":[\"false\"],\n \"server-timing\":[\"hcid;desc=\\\"019e02d0-6fd8-7812-bdba-885b7ccb3ee3\\\",\n cfr;desc=\\\"9f80deb8e7c6dc3a-IAD\\\"\"],\n \"x-content-type-options\":[\"nosniff\"],\n \"x-hubspot-correlation-id\":[\"019e02d0-6fd8-7812-bdba-885b7ccb3ee3\"],\n \"Set-Cookie\":[\"__cf_bm=SIUrtdQgXVrik50pdqF6hZVYKhzTnQBidvMabeCtm0Y-1778163675-1.0.1.1-rI.ZggtDKxTge5zr8_2gbBfWMQQ.ufZEXDZyHz2mBUFdzdo2gTHEsOkXMSEShjK0hGYxNhUGM1ZoBpX7BcFZcHEjA7Cs_.SMUhUnd2nYjko; path=/; expires=Thu,\n 07-May-26 14:51:15 GMT; domain=.hubapi.com; HttpOnly; Secure; SameSite=None\"],\n \"Report-To\":[\"{\n\\\"endpoints\\\":[{\n\\\"url\\\":\\\"https:\\\\/\\\\/a.nel.cloudflare.com\\\\/report\\\\/v4?s=NYAlsVTP0fYm32qrSDjxYE4sd2RWRqiSp3wHsmdEgZlzoYdxI%2BIxVpHmsKn3O%2BKVA3mFIJ2m7YRECDGSM%2BW2IYTzo6FM4%2BdUIjURO8srzKSvJgZ%2BQ6R79arKQw3uHLlX\\\"}],\n\\\"group\\\":\\\"cf-nel\\\",\n\\\"max_age\\\":604800}\"],\n\"NEL\":[\"{\n\\\"success_fraction\\\":0.01,\n\\\"report_to\\\":\\\"cf-nel\\\",\n\\\"max_age\\\":604800}\"],\n\"Server\":[\"cloudflare\"]}} {\n\"correlation_id\":\"95236535-ec98-4541-b92a-adfa73b69eab\",\n\"trace_id\":\"c7ab8365-903f-46d4-9403-0e5b551e3545\"}","depth":4,"on_screen":true,"value":"[2026-05-07 14:21:15] local.INFO: [Hubspot] DEBUG Getting headers {\n\"headers\":{\n\"Date\":[\"Thu,07 May 2026 14:21:15 GMT\"],\n \"Content-Type\":[\"application/json;charset=utf-8\"],\n \"Transfer-Encoding\":[\"chunked\"],\n \"Connection\":[\"keep-alive\"],\n \"CF-Ray\":[\"9f80deb8db60dc3a-SOF\"],\n \"CF-Cache-Status\":[\"DYNAMIC\"],\n \"Strict-Transport-Security\":[\"max-age=31536000; includeSubDomains; preload\"],\n \"Vary\":[\"origin,\n accept-encoding\"],\n \"access-control-allow-credentials\":[\"false\"],\n \"server-timing\":[\"hcid;desc=\\\"019e02d0-6fd8-7812-bdba-885b7ccb3ee3\\\",\n cfr;desc=\\\"9f80deb8e7c6dc3a-IAD\\\"\"],\n \"x-content-type-options\":[\"nosniff\"],\n \"x-hubspot-correlation-id\":[\"019e02d0-6fd8-7812-bdba-885b7ccb3ee3\"],\n \"Set-Cookie\":[\"__cf_bm=SIUrtdQgXVrik50pdqF6hZVYKhzTnQBidvMabeCtm0Y-1778163675-1.0.1.1-rI.ZggtDKxTge5zr8_2gbBfWMQQ.ufZEXDZyHz2mBUFdzdo2gTHEsOkXMSEShjK0hGYxNhUGM1ZoBpX7BcFZcHEjA7Cs_.SMUhUnd2nYjko; path=/; expires=Thu,\n 07-May-26 14:51:15 GMT; domain=.hubapi.com; HttpOnly; Secure; SameSite=None\"],\n \"Report-To\":[\"{\n\\\"endpoints\\\":[{\n\\\"url\\\":\\\"https:\\\\/\\\\/a.nel.cloudflare.com\\\\/report\\\\/v4?s=NYAlsVTP0fYm32qrSDjxYE4sd2RWRqiSp3wHsmdEgZlzoYdxI%2BIxVpHmsKn3O%2BKVA3mFIJ2m7YRECDGSM%2BW2IYTzo6FM4%2BdUIjURO8srzKSvJgZ%2BQ6R79arKQw3uHLlX\\\"}],\n\\\"group\\\":\\\"cf-nel\\\",\n\\\"max_age\\\":604800}\"],\n\"NEL\":[\"{\n\\\"success_fraction\\\":0.01,\n\\\"report_to\\\":\\\"cf-nel\\\",\n\\\"max_age\\\":604800}\"],\n\"Server\":[\"cloudflare\"]}} {\n\"correlation_id\":\"95236535-ec98-4541-b92a-adfa73b69eab\",\n\"trace_id\":\"c7ab8365-903f-46d4-9403-0e5b551e3545\"}","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Project","depth":3,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Project","depth":3,"on_screen":true,"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},"on_screen":false,"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},"on_screen":false,"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},"on_screen":false,"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},"on_screen":false,"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},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
1360482693066405372
|
8214981560006962571
|
click
|
accessibility
|
NULL
|
Project: faVsco.js, menu
JY-20725-handle-HS-search Project: faVsco.js, menu
JY-20725-handle-HS-search-rate-limit, 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
93
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Console\Commands;
use Carbon\Carbon;
use Carbon\CarbonImmutable;
use Illuminate\Console\Command;
use InvalidArgumentException;
use Jiminny\Jobs\AutomatedReports\RequestGenerateAskJiminnyReportJob;
use Jiminny\Jobs\AutomatedReports\SendReportMailJob;
use Jiminny\Jobs\JobDispatcherInterface;
use Jiminny\Models\Activity;
use Jiminny\Models\AutomatedReport;
use Jiminny\Models\AutomatedReportResult;
use Jiminny\Models\Team;
use Jiminny\Models\User;
use Jiminny\Repositories\AutomatedReportsRepository;
use Jiminny\Services\Activity\CrmOwnerResolver;
use Jiminny\Services\Kiosk\AutomatedReports\AutomatedReportsService;
use Jiminny\Services\UserPilot\UserPilotClient;
/**
* Class JiminnyDebugCommand
*
* @package Jiminny\Console\Commands
*/
class JiminnyDebugCommand extends Command
{
public const string FREQUENCY_DAILY = 'daily';
public const string FREQUENCY_WEEKLY = 'weekly';
public const string FREQUENCY_MONTHLY = 'monthly';
public const string FREQUENCY_QUARTERLY = 'quarterly';
public const string FREQUENCY_ONE_OFF = 'one_off';
protected $signature = 'jiminny:debug';
public function handle(
JobDispatcherInterface $jobDispatcher,
AutomatedReportsService $automatedReportsService,
AutomatedReportsRepository $automatedReportsRepository,
UserPilotClient $userPilotClient
): void {
$this->rateLimit();
exit(1);
$report = AutomatedReport::find(71);
$last = AutomatedReportResult::query()
->where('report_id', $report->getId())
->whereIn('status', [AutomatedReportResult::STATUS_DEFAULT, AutomatedReportResult::STATUS_FAILED])
// ->where('reason', '!=', AutomatedReportResult::REASON_NOT_ENOUGH_ACTIVITIES)
->whereDate('created_at', CarbonImmutable::now()->toDateString())
->latest()
->first();
$this->info("Last: {$last->getId()}");
exit(1);
$user = User::find(143);
// $count = $automatedReportsRepository->countUserReports($user);
// $this->info("Count: {$count}");
// $count = $automatedReportsRepository->countAllUserReports($user);
// $this->info("All count: {$count}");
$payload = [
'report_type' => 'ask_jiminny',
'frequency' => 'weekly',
];
$userPilotClient->track($user, 'ask-jiminny-report-generated', $payload);
exit(1);
$now = Carbon::now()->subDay(1);
$this->info("Now: {$now->toDateTimeString()}");
$weekStart = Carbon::getWeekStartsAt();
$this->info("Now: {$weekStart}");
// $from = $now->copy()->previousWeekday()->startOfDay();
// $to = $now->copy()->previousWeekday()->endOfDay();
// $fromOld = $now->copy()->subWeeks(1)->startOfDay();
// $toOld = $now->copy()->subDay()->endOfDay();
// $fromNew = $now->copy()->subWeek()->startOfWeek();
// $toNew = $now->copy()->subWeek()->endOfWeek();
// $fromOld = $now->copy()->subMonths(1)->startOfDay();
// $toOld = $now->copy()->subDay()->endOfDay();
// $fromNew = $now->copy()->subMonthNoOverflow()->startOfMonth();
// $toNew = $now->copy()->subMonthNoOverflow()->endOfMonth();
$fromOld = $now->copy()->subMonths(3)->startOfDay();
$toOld = $now->copy()->subDay()->endOfDay();
$fromNew = $now->copy()->subQuarterNoOverflow()->startOfQuarter();
$toNew = $now->copy()->subQuarterNoOverflow()->endOfQuarter();
$this->info("From old: {$fromOld->toDateTimeString()}");
$this->info("To old: {$toOld->toDateTimeString()}");
$this->info("From new: {$fromNew->toDateTimeString()}");
$this->info("To new: {$toNew->toDateTimeString()}");
exit(1);
$report = AutomatedReport::find(71);
$job = new RequestGenerateAskJiminnyReportJob($report->getUuid());
$jobDispatcher->dispatch($job);
exit(1);
// $this->formatDate($jobDispatcher);
// $this->sendMail($jobDispatcher, $automatedReportsService);
// $this->crmService();
$this->getPayload($automatedReportsService);
exit(1);
}
private function crmService()
{
$activity = Activity::find(418141);
$team = Team::find(19);
$config = $team->getCrmConfiguration();
$crmResolver = app(CrmOwnerResolver::class, [
'team' => $team,
'integrationAdmin' => $team->getOwner(),
'providerSlug' => $config->getProviderName(),
]);
$crmService = $crmResolver->prepareCrmService();
$crmService->createTranscriptNotes($activity);
}
private function sendMail(JobDispatcherInterface $jobDispatcher, AutomatedReportsService $automatedReportsService)
{
$reportUuid = '';
// $report = $automatedReportsService->getReportResult($reportUuid);
$report = AutomatedReportResult::find(275);
$validRecipients = $automatedReportsService->getValidRecipientUsers(
$report->getReport(),
includeJiminny: true,
);
$recipient = $validRecipients[0];
$fileName = $automatedReportsService->getReportFileName($report);
$typeName = $report->getReport()->getCustomName()
?? $automatedReportsService->getReportTypeName($report);
$teamsName = $automatedReportsService->getReportTeamsName($report);
$periodName = $automatedReportsService->getReportPeriodName($report);
$s3Path = $automatedReportsService->getMediaPath($report);
\Illuminate\Support\Facades\Log::channel('custom_channel')->info('$fileName ' . PHP_EOL . print_r($fileName, true));
\Illuminate\Support\Facades\Log::channel('custom_channel')->info('$typeName ' . PHP_EOL . print_r($typeName, true));
\Illuminate\Support\Facades\Log::channel('custom_channel')->info('$teamsName ' . PHP_EOL . print_r($teamsName, true));
\Illuminate\Support\Facades\Log::channel('custom_channel')->info('$periodName ' . PHP_EOL . print_r($periodName, true));
\Illuminate\Support\Facades\Log::channel('custom_channel')->info('$s3Path ' . PHP_EOL . print_r($s3Path, true));
$jobDispatcher->dispatch(
new SendReportMailJob(
reportUuid: $report->getUuid(),
s3Path: $s3Path,
recipientEmail: $recipient['email'],
recipientName: $recipient['name'] ?? null,
fileName: $fileName,
typeName: $typeName,
teamsName: $teamsName,
periodName: $periodName,
isAskJiminny: true,
)
);
exit(1);
}
private function formatDate(JobDispatcherInterface $jobDispatcher): void
{
$customName = 'Custom report name';
// $frequency = self::FREQUENCY_DAILY;
// $frequency = self::FREQUENCY_WEEKLY;
$frequency = self::FREQUENCY_MONTHLY;
// $frequency = self::FREQUENCY_QUARTERLY;
// $frequency = self::FREQUENCY_ONE_OFF;
$period = $this->calculateFromAndToDatePeriod($frequency);
$from = $period['fromDate'];
$to = $period['toDate'];
$periodName = $this->formatReportPeriodName($frequency, $from, $to);
$filenameSuffix = null;
if ($customName) {
if ($filenameSuffix) {
$customName .= " {$filenameSuffix}";
}
$result = $this->sanitizeFileName("{$customName} - {$periodName}");
}
$this->info($result);
}
public function calculateFromAndToDatePeriod(
string $frequency,
?Carbon $fromDate = null,
?Carbon $toDate = null
): array {
if ($frequency === self::FREQUENCY_ONE_OFF) {
return [
'fromDate' => $fromDate,
'toDate' => $toDate,
];
}
$now = Carbon::now();
return match ($frequency) {
self::FREQUENCY_DAILY => [
'fromDate' => $now->copy()->subDay()->startOfDay(),
'toDate' => $now->copy()->subDay()->endOfDay(),
],
self::FREQUENCY_WEEKLY => [
'fromDate' => $now->copy()->subWeeks(1)->startOfDay(),
'toDate' => $now->copy()->subDay()->endOfDay(),
],
self::FREQUENCY_MONTHLY => [
'fromDate' => $now->copy()->subMonths(1)->startOfDay(),
'toDate' => $now->copy()->subDay()->endOfDay(),
],
self::FREQUENCY_QUARTERLY => [
'fromDate' => $now->copy()->subMonths(3)->startOfDay(),
'toDate' => $now->copy()->subDay()->endOfDay(),
],
default => throw new InvalidArgumentException("Unsupported frequency: {$frequency}"),
};
}
private function formatReportPeriodName(string $frequency, Carbon $from, Carbon $to): string
{
$fromYear = $from->format('Y');
$toYear = $to->format('Y');
$differentYears = $fromYear !== $toYear;
switch ($frequency) {
case self::FREQUENCY_DAILY:
return $from->format('j M Y');
case self::FREQUENCY_QUARTERLY:
// 'Jan-Mar 2025' or 'Nov 2024-Jan 2025' if years differ
$startMonth = $from->format('M');
$endMonth = $to->copy()->subMonth();
$endMonthName = $endMonth->format('M');
$endMonthYear = $endMonth->format('Y');
if ($differentYears) {
return "{$startMonth} {$fromYear} - {$endMonthName} {$endMonthYear}";
}
return "{$startMonth} - {$endMonthName} {$toYear}";
case self::FREQUENCY_MONTHLY:
// 'May 2025' - monthly reports are always within the same year
return $from->format('M Y');
case self::FREQUENCY_WEEKLY:
// '4 - 8 Aug 2025', '27 Oct - 3 Nov 2025', or '28 Dec 2024 - 3 Jan 2025' if years differ
$startDay = $from->format('j');
$endDay = $to->format('j');
$startMonth = $from->format('M');
$endMonth = $to->format('M');
if ($differentYears) {
return "{$startDay} {$startMonth} {$fromYear} - {$endDay} {$endMonth} {$toYear}";
}
if ($startMonth !== $endMonth) {
return "{$startDay} {$startMonth} - {$endDay} {$endMonth} {$toYear}";
}
return "{$startDay} - {$endDay} {$endMonth} {$toYear}";
case self::FREQUENCY_ONE_OFF:
// '2 May-31 May 2025' or '15 Dec 2024-15 Jan 2025' if years differ
$startDay = $from->format('j');
$startMonth = $from->format('M');
$endDay = $to->format('j');
$endMonth = $to->format('M');
// If same month and year, use a format like '2-31 May 2025'
if ($startMonth === $endMonth && ! $differentYears) {
return "{$startDay} - {$endDay} {$startMonth} {$toYear}";
}
// If different years, include both years
if ($differentYears) {
return "{$startDay} {$startMonth} {$fromYear} - {$endDay} {$endMonth} {$toYear}";
}
// Same year but different months
return "{$startDay} {$startMonth} - {$endDay} {$endMonth} {$toYear}";
default:
// Default format for unknown frequencies
return $from->format('j M Y') . ' - ' . $to->format('j M Y');
}
}
public function sanitizeFileName(string $fileName): string
{
return str_replace(['/', '\\'], '-', $fileName);
}
private function getPayload(AutomatedReportsService $automatedReportsService)
{
$reportResult = AutomatedReportResult::find(269);
$automatedReport = $reportResult->getReport();
$activityIds = [1,2,3];
$payload = $automatedReportsService->getAskJiminnyGenerateReportPayload(
automatedReport: $automatedReport,
reportResult: $reportResult,
activityIds: $activityIds,
);
\Illuminate\Support\Facades\Log::channel('custom_channel')->info('$payload ' . PHP_EOL . print_r($payload, true));
}
private function rateLimit()
{
$team = Team::find(2);
$config = $team->getCrmConfiguration();
$crmResolver = app(CrmOwnerResolver::class, [
'team' => $team,
'integrationAdmin' => $team->getOwner(),
'providerSlug' => $config->getProviderName(),
]);
$crmService = $crmResolver->prepareCrmService();
for ($i = 0 ; $i < 3; $i++) {
// if ($i % 25 === 0) {
// $this->info("Syncing opportunity {$i}");
$this->info("Matching contact {$i}");
// }
// $crmService->syncOpportunity('374720564');
$crmService->matchByName('Robot');
}
}
}
Sync Changes
Hide This Notification
Code changed:
Hide
19
Previous Highlighted Error
Next Highlighted Error
[2026-05-07 14:21:15] local.INFO: [Hubspot] DEBUG Getting headers {
"headers":{
"Date":["Thu,07 May 2026 14:21:15 GMT"],
"Content-Type":["application/json;charset=utf-8"],
"Transfer-Encoding":["chunked"],
"Connection":["keep-alive"],
"CF-Ray":["9f80deb8db60dc3a-SOF"],
"CF-Cache-Status":["DYNAMIC"],
"Strict-Transport-Security":["max-age=31536000; includeSubDomains; preload"],
"Vary":["origin,
accept-encoding"],
"access-control-allow-credentials":["false"],
"server-timing":["hcid;desc=\"019e02d0-6fd8-7812-bdba-885b7ccb3ee3\",
cfr;desc=\"9f80deb8e7c6dc3a-IAD\""],
"x-content-type-options":["nosniff"],
"x-hubspot-correlation-id":["019e02d0-6fd8-7812-bdba-885b7ccb3ee3"],
"Set-Cookie":["__cf_bm=SIUrtdQgXVrik50pdqF6hZVYKhzTnQBidvMabeCtm0Y-1778163675-[IP_ADDRESS]-rI.ZggtDKxTge5zr8_2gbBfWMQQ.ufZEXDZyHz2mBUFdzdo2gTHEsOkXMSEShjK0hGYxNhUGM1ZoBpX7BcFZcHEjA7Cs_.SMUhUnd2nYjko; path=/; expires=Thu,
07-May-26 14:51:15 GMT; domain=.hubapi.com; HttpOnly; Secure; SameSite=None"],
"Report-To":["{
\"endpoints\":[{
\"url\":\"https:\\/\\/a.nel.cloudflare.com\\/report\\/v4?s=NYAlsVTP0fYm32qrSDjxYE4sd2RWRqiSp3wHsmdEgZlzoYdxI%2BIxVpHmsKn3O%2BKVA3mFIJ2m7YRECDGSM%2BW2IYTzo6FM4%2BdUIjURO8srzKSvJgZ%2BQ6R79arKQw3uHLlX\"}],
\"group\":\"cf-nel\",
\"max_age\":604800}"],
"NEL":["{
\"success_fraction\":0.01,
\"report_to\":\"cf-nel\",
\"max_age\":604800}"],
"Server":["cloudflare"]}} {
"correlation_id":"95236535-ec98-4541-b92a-adfa73b69eab",
"trace_id":"c7ab8365-903f-46d4-9403-0e5b551e3545"}
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
15909
|
706
|
7
|
2026-05-11T07:37:31.775869+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-11/1778 /Users/lukas/.screenpipe/data/data/2026-05-11/1778485051775_m1.jpg...
|
PhpStorm
|
faVsco.js – JiminnyDebugCommand.php
|
1
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
JY-20725-handle-HS-search Project: faVsco.js, menu
JY-20725-handle-HS-search-rate-limit, menu
Start Listening for PHP Debug Connections
AskJiminnyReportActivityServiceTest...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"on_screen":true,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JY-20725-handle-HS-search-rate-limit, menu","depth":5,"on_screen":true,"help_text":"Git Branch: JY-20725-handle-HS-search-rate-limit","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,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"AskJiminnyReportActivityServiceTest","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
-4070455067304395933
|
-7195625898145019518
|
click
|
hybrid
|
NULL
|
Project: faVsco.js, menu
JY-20725-handle-HS-search Project: faVsco.js, menu
JY-20725-handle-HS-search-rate-limit, menu
Start Listening for PHP Debug Connections
AskJiminnyReportActivityServiceTest
Firefox FileEditViewHistoryBookmarksProfilesToolsWindowHelp<DEV (docker)• жз• Support Daily • in 4h 23 mDOCKERO 81DEV (docker)882APP (-zsh)masterJY-20818-move-AJ-reports-to-separated-datadog-metricJY-20773-fix-automated-reports-user-pilot-trackingJY-20157-AJ-report-not-send-notificationJY-20508-notify-before-AJ-report-expirationJY-20372-ai-reports-promotion-pagesJY-20352-sync-opportunities-without-a-local-owner-user-id-is-nullJY-20738-debug-AJ-tracking-UPJY-18909-automated-reports-ask-jiminnyJY-20692-fix-integration-app-[API_KEY] laysJY-20698-fix-SF-activity-types-on-new-playbookJY-20543-AJ-report-trackingJY-20384-handle-auto-sync-with-no-access-to-event-typeJY-20458-ask-Jiminny-user-definitionsJY-19666-fix-import-contacts-account-associationJY-19666-HS-import-contacts-and-accounts-batch-jobJY-20458-Ask-Jiminny-ReportsJY-20200-batch-update-CRM-objects-SalesforceJY-19666-HS-webhooks-add-contact-and-companyJY-20348-trigger-setup-DI-layout-on-team-creationJY-20326-refactor-info-message-in-commandJY-20317-fix-auto-log-delay-issue-on-all-channels-disabledJY-20312-remove-on-update-change-last-synced-at-crm-configurationsJY-20306-SF-skip-auto-sync-for-task-based-playbookJY-20192-remove-deleted-team-from-saved-search-filtersJY-20197-import-opportunity-batch-jobJY-20293-enable-status-field-for-pipedrive-dealsJY-20191-remove-commands-interactive-promptsJY-20118-change-default-sync-strategyJY-20183-add-cache-on-auto-log-delayJY-20197-add-import-opportunity-batch-job20118-hs-opportunity-make-webhook-strategy-defaultJY-20118-make-default-hs-opportunity-sync-strategy-webhook-basedJY-20196-handle-opportunity-without-noteJY-20118-improve-opportunity-importJY-20189-handle-activity-search-on-deleted-groupsJY-20160JY-20145-filter-out-converted-leads-when-matchingJY-20150-skip-push-summary-on-summary-ready-1f-autologJY-20132-fix-note-encodingJY-19792-clean-logslukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (JY-20725-handle-HS-search-rate-limit) $ devroot@docker_lamp_1:/home/jiminny# ]-zsh84-zsh885100% <78• Mon 11 May 10:37:31181screenpipe"0 ₴6DEV...
|
15899
|
NULL
|
NULL
|
NULL
|
|
32903
|
1257
|
15
|
2026-05-13T09:44:58.477887+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-13/1778 /Users/lukas/.screenpipe/data/data/2026-05-13/1778665498477_m2.jpg...
|
PhpStorm
|
faVsco.js – InviteUserToTeamAction.php
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
master, menu
Start Listen Project: faVsco.js, menu
master, menu
Start Listening for PHP Debug Connections
AskJiminnyReportActivityServiceTest
Run 'AskJiminnyReportActivityServiceTest'
Debug 'AskJiminnyReportActivityServiceTest'
More Actions...
|
[{"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},"on_screen":true,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"master, menu","depth":5,"bounds":{"left":0.064494684,"top":0.019952115,"width":0.034242023,"height":0.025538707},"on_screen":true,"help_text":"Git Branch: master","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},"on_screen":true,"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},"on_screen":true,"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},"on_screen":true,"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},"on_screen":true,"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},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
-943456739835505562
|
-8636494053633454656
|
click
|
hybrid
|
NULL
|
Project: faVsco.js, menu
master, menu
Start Listen Project: faVsco.js, menu
master, menu
Start Listening for PHP Debug Connections
AskJiminnyReportActivityServiceTest
Run 'AskJiminnyReportActivityServiceTest'
Debug 'AskJiminnyReportActivityServiceTest'
More Actions
PhostormVIeWINavigarecodeLaravelKeractorWindowFV faVsco.js°9 master ~ProjectC) CreateTeam.onp© InviteUserToTeamAction.php >vDappv D Actionsc Inviteuserlol eamactionncmiiclotie rsuisaninleeeelnetС мaгkuserasOnboardable.© SyncRecordingFlagsActio© UpdateTeamMemberActi 19© UpdateUserRolesAction.p 20v _ componentC7 AclActionitemsW ActivityActivitvAnalvticsActivitySearchAlActivitv ivoeIM A AutomationM AiCal|ScorinaAskAnything>M DtosM svents(c) AckAnvthinaPromntSe 34© HistoryService.phpD AskJiminnyAiD AWSD BillingManagementD Cache_ coachingreedbackD CountryC CustomerAp®0) Database_ Datadoo0 DateTimeDealinsiahtsDealRiskSElasticSearchEloquentD Encodinga EncrvotionMESFaken/ FeatureFlaasM SsMnedM silleSvstemM GeckoD GongD GuzzleHttpN KevPoints|iM KiockMlanaunaoNotontionMlivoSoodMlockeM Mothpubuic tunccion-_constructprivace kolekeposicoryincertace srolekeposicory.private koLechangelogger srorechangerogger,{...}oubuc tuncrion execure userinvirarionulu soro: vo1oi** ovar Invitation Sinvitation *Sinvitation = Invitation::update0rCreate('team_1d" => $dto->teamid,emanl => sdto->emanu'aroun id' = Sdto->arountd.'secondary emarl' => Sdto->secondarveman.erm reauired' => Sdto->crmRequirediItoken! => Stn. •randomd lenath: 40).1is ownent => Sdto->ichwnen-loadMiccina("'team'l)•Sinvitation->roles->sync($dto->roleIds):Snotifiable = new EmailNotifiable(Sinvitation->email, Sinvitation->getTeamO):lSLoonessace = "user 1nviced co crial'.if (Sinvitation->qetTeam->owner_ id === null) {Snotifiable->notifyNowCnew OwnerInvitedToTrial(Sinvitation)):SloqMessage = 'Owner invited to trial':—eLse <Snot1r1able->not1fvvownew Userinvitedioleamsinvitatlon.:collect(Sdto->roleids)->man(fn Gint Sroleid): Role => Sthis->roleRenository->aet(Sroletd))->eachfunction Role Srole) use Sdto. Sinvitation: void «...):lnn. •into SioaMeccaap."toantdi => Cinvitation->teamid.lItpamlamel => Sinvitation->aetTeamo->name.A3V1A|aravel.l0gA SF (jiminny@localhost]4 HS_local [jiminny@localhost]& console (PROD] X A console [EU]A console [STAGING] S616Tx: AutovSo jiminnyCONCAT(u.id, CASE WHEN U.id = t.owner_id THEN ' (owner)' ELSE'' END) AS user_id,040 A1 A40 V 64 ^sa.*t.owner_id FROM social_accounts saNolN usens u on u.id e sa.sociablle i.diJOIN teams t .n<->l: on t.id = u.team_icWHERE u.team_id = 581 and sa.provider = 'salesforce';SELECT * FROM automated_report_results order by id desc;select * from features;select * from team_features where feature_id = 40;select * from teams where id = 556:select * from automated_reports:where id = 54; # 4fdd41f6-dcf0-30d0-b339-7345381b6044["pdf" "podcast"]SELECT * FROM automated report_ results WHERE uuid to bin( '822fa41b-afd3-43a9-a248-86b0e36f3131') = uuid:select * from automated_report_results order by za desc;SELECT * FROM automated report resultsWHERE id = 1919select * from automated report results WHERE report id = 54:select * from opportunities where 1d = 75943494SELE * FROM teamsWHERE name LIKE '%Les%': # 711, 692. 16067 -Timinnvintearationdlesmills.comselect * from playbooks where team id = 711; # event 226147SELEd * FROM Davbook catedonies WHERE Dlavbook 10 e 55151SELECT * FROM crm_fields WHERE crm_configuration_id = 692 and object_type =SELECT * EROM eom fields WHERE 1d = 226147-1SELECT * EROM eom field values WHERE com field 1d = 226147.SELECT * FROM crm_configurations WHERE id = 692;SEISCTCONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '• END) AS user_id,nemailSa.xt.owner id FROM social accounts saJOIN users u on u.id = sa.sociable idJOIN teams t 1..n<->1: on t.id = u.team_idWHERE U.team id = 711 and sa.provider = 'salesforce':SELECT * FROM crm profiles co JOIN users u 1..n<->1: on u.id = co.user id WHERE u.team_id = 711:select * from leads:select * from calendars:SELECTS0 hl• suppont Dally • In Zn 10m100% L2• Wed 13 May 12:44:58AskJiminnyReportActivityServiceTest-CascadeTrial Owner Role SelecThouaht for 3s >6 / 7 tasks done• Review current role assianment when owner sians in(7 Document findinas and provide imolementation olanTnoughttor 4s7 7 tasks done)I nought for 4SCurrent Flow Analvsis: Owner Role Assianment in Trial CreationBackend Flow1. Team Creation Entry Point• TeamController::store() (lines 24-45)Calls GreateTeam interaction to create the team•Colle TnvitellcerToTeamAct ion with UserInvitationDT0:: for0wner Srequest, Steam)2. app/DTO/Invitation/UserInvitationDTO.ohpD• UserInvitationDT0:: for0wner() (lines 52-72 in /app/DT0/Invitation/UserInvitationDT0.oho)•Lines 54-57: This is where the owner's role is hardcodediohrSrolelds = Role::whereln"name',User::ROLE RECORDER,→>oluck("id'→>toArravo:• Awavs assians ROIF ADMIN + ROLF RECORDER to the ownen• This is the key location that needs modificationS. Invitation Creation•InviteUserToTeamAction: :execute@ (Uines 28-81)+0 ..• Creates an Invitation with roles from the DTO (line 45: Sinvitation->roles()->sync(Sdto->roleIds))• Sends OwnerInvitedToTrial notificationl1. Owner Sian-in Flow•Owner receives email invitation• RegisterController::showRegistrationForm• shows reaistration form with invitation dataOwner redisters and accents invitation•Roles are already assigned via the invitation, so owner gets ROLE ADMIN + ROLE RECORDER automaticallyFrontend Flow1. EditTeamModal.vue (/front-end/src/comnonentc/Settinas/Kiock/modals/FditTeamModal/FditTearModal.vne)Ask anvthina (884-L)SWE-16O0 1WN Windsurf Teams29-58io 4 spaces...
|
32901
|
NULL
|
NULL
|
NULL
|
|
32902
|
1256
|
18
|
2026-05-13T09:44:58.463903+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-13/1778 /Users/lukas/.screenpipe/data/data/2026-05-13/1778665498463_m1.jpg...
|
PhpStorm
|
faVsco.js – InviteUserToTeamAction.php
|
1
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
master, menu
Start Listen Project: faVsco.js, menu
master, menu
Start Listening for PHP Debug Connections
AskJiminnyReportActivityServiceTest
Run 'AskJiminnyReportActivityServiceTest'
Debug 'AskJiminnyReportActivityServiceTest'
More Actions...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"on_screen":true,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"master, menu","depth":5,"on_screen":true,"help_text":"Git Branch: master","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,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"AskJiminnyReportActivityServiceTest","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run 'AskJiminnyReportActivityServiceTest'","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'AskJiminnyReportActivityServiceTest'","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"More Actions","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
-943456739835505562
|
-8636494053633454656
|
click
|
hybrid
|
NULL
|
Project: faVsco.js, menu
master, menu
Start Listen Project: faVsco.js, menu
master, menu
Start Listening for PHP Debug Connections
AskJiminnyReportActivityServiceTest
Run 'AskJiminnyReportActivityServiceTest'
Debug 'AskJiminnyReportActivityServiceTest'
More Actions
SlackFile Edit ViewGoHistoryWindowHelpAPPDOCKER₴81DEV (docker)₴82APP (-zshtests/Unit/Component/ParticipantSpeech/Services/ParticipantSpeechesDeleterTest.phptests/Unit/Component/ParticipantSpeech/Services/ParticipantSpeechesProviderTest.phptests/Unit/Component/ParticipantSpeech/Services/ParticipantSpeechesUploaderTest.phptests/Unit/Component/Transcription/Diarization/Services/GetNormalizedParticipantSpeeches?tests/Unit/Component/Transcription/Diarization/Source/MeetingBotSourceTest.phptests/Unit/Contracts/Services/Calendar/CalendarTraitTest.phptests/Unit/Http/Controllers/Kiosk/ActivityControllerTest.phptests/Unit/Jobs/Activity/Import/ImportTwilioVideoSpeechesJobTest.phptests/Unit/Jobs/Activity/Import/IsActivityReadyForProcessingJobTest.phptests/Unit/Jobs/Calendar/SetupCalendarSyncTest.phptests/Unit/Services/Activity/ParticipantsServiceTest.phptests/Unit/Services/Calendar/Command/ImportParticipantsTest.phptests/Unit/Services/Calendar/GoogleCalendarServiceTest.phptests/Unit/Services/Crm/Close/ServiceTest.phptests/Unit/Services/Crm/Hubspot/ServiceTest.phptests/Unit/Services/Crm/Hubspot/ServiceTraits/OpportunitySyncTest.phptests/Unit/Services/Crm/Hubspot/ServiceTraits/OpportunitySyncTraitMatchActivitiesTest.phytests/Unit/Services/Crm/IntegrationApp/ServiceTraits/SyncCrmEntitiesTraitOpportunitiesTe:tests/Unit/Services/Crm/Pipedrive/ImportOpportunityMatchActivitiesTest.phptests/Unit/Services/Crm/Salesforce/ServiceTest.phptests/Unit/Services/Mail/0ffice/EmailApiClientTest.phptests/Unit/Services/RecallAI/RecallAIServiceTest.php113 files changed, 4143 insertions(+), 1740 deletions(-)create mode 120000 CLAUDE.mdcreate mode 100644 app/Component/AiAutomation/Services/CrmFillingEligibilityChecker.phpdelete mode 100644 app/Component/ES/ElasticSearchWorkerManager.phpdelete mode 100644 app/Component/ES/Worker/ActivityWorker.phpdelete mode 100644 app/Component/ES/Worker/EntityWorker.phpdelete mode100644 app/Component/ES/Worker/WorkerAmount.phpdelete mode100644 app/Component/ES/Worker/WorkerInterface.phpcreate mode100644 app/Component/ProphetAi/Exceptions/InsufficientTranscriptException.phtcreate mode100644 app/Component/Transcription/DTO/Http/Transcription/AssemblyAI/Assembl:create mode100644 app/Component/Transcription/DTO/Http/Transcription/TranscriptionIsNot(create mode 100644 app/Console/Commands/Crm/Backfill0pportunityUserFromAccountCommand.phpdelete mode 100644 app/Console/Commands/Elasticsearch/AsyncUpdateEsActivities.phpcreate mode100644 front-end/src/components/shared/modals/EntityPickerModal/__tests__/us‹create mode 100644 tests/Feature/Component/Nudge/Process0rganisationImmediateNudgesJobTe:create mode 100644 tests/Unit/Component/AiAutomation/Services/CrmFillingEligibilityCheck‹delete mode 100644 tests/Unit/Component/ES/ElasticSearchWorkerManagerTest.phpdelete mode 100644 tests/Unit/Component/ES/Worker/ActivityWorkerTest.phpdelete mode 100644 tests/Unit/Component/ES/Worker/EntityWorkerTest.phpdelete mode 100644 tests/Unit/Component/ES/Worker/WorkerAmountTest.phpcreate mode 100644 tests/Unit/Component/ParticipantSpeech/Services/ParticipantSpeechesCr‹create mode 100644 tests/Unit/Http/Controllers/Kiosk/ActivityControllerTest.phpLukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~/jiminny/app (master) $ I|HomeDMsActivityFilesLaterMore(aol§ Support Daily - in 2h 16 m100% <78•Wed 13 May12:44:58ED-→Describe what you are looking forJiminny ...Nikolay Ivanov6 0curoaroylau# engineering# general# jiminny-bg# platform-tickets# product_launches#random# releases# sofia-office# support# thank-yous# the_people_of_jimi...MessagesAdd canvas@ Files+Lukas Kovalik 11.Today ~мен все ме праща наhttps://app.vanta.com/c/jiminny.com/employee/onboardingNikolay Ivanov 11:01 AMХм, Джейс дали не може да ти помогне?Lukas Kovalik 11:01 AMще питам James, предполагам че нямам правада мерсиNikolay Ivanov 11:01 AMмда° Direct messages& Nikolay Ivanovdo James Graham. Stoyan Tanev. Galya Dimitrova. Steliyan Georgievo Petko Kashinski®. Aneliya Angelovaã. Stefka Stoyanova•. Vasil Vasilev •!Lukas Kovalik y...МОЛЯLukas Kovalik 12:13 PMНики сори, още един въпрос имамкогато ги правеше ти FE ли оправяима vulnerabilities no npmNikolay Ivanov 12:28 PMнетях ги оставямLukas Kovalik 12:29 PMаз погледнах твоя тикет и там друго нямашесамо FEкак стигна до Workerl:: AppsJira CloudMessage Nikolay IvanovToast...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
32901
|
1257
|
14
|
2026-05-13T09:44:53.090869+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-13/1778 /Users/lukas/.screenpipe/data/data/2026-05-13/1778665493090_m2.jpg...
|
PhpStorm
|
faVsco.js – InviteUserToTeamAction.php
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
master, menu
Start Listen Project: faVsco.js, menu
master, 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
1
Previous Highlighted Error
Next Highlighted Error
<?php
namespace Jiminny\Actions;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Str;
use Jiminny\Component\Acl\RoleChangeContext;
use Jiminny\Component\Acl\RoleChangeLogger;
use Jiminny\Component\Acl\RoleChangeType;
use Jiminny\Contracts\Acl\RoleRepositoryInterface;
use Jiminny\DTO\Invitation\UserInvitationDTO;
use Jiminny\Models\Invitation;
use Jiminny\Models\Role;
use Jiminny\Models\User;
use Jiminny\Notifications\Channels\EmailNotifiable;
use Jiminny\Notifications\OwnerInvitedToTrial;
use Jiminny\Notifications\UserInvitedToTeam;
use Jiminny\Notifications\UserInvitedToTeamWithEmailOnly;
class InviteUserToTeamAction
{
public function __construct(
private RoleRepositoryInterface $roleRepository,
private RoleChangeLogger $roleChangeLogger,
) {
}
public function execute(UserInvitationDTO $dto): void
{
/** @var Invitation $invitation */
$invitation = Invitation::updateOrCreate(
[
'team_id' => $dto->teamId,
'email' => $dto->email,
],
[
'group_id' => $dto->groupId,
'secondary_email' => $dto->secondaryEmail,
'crm_required' => $dto->crmRequired,
'token' => Str::random(40),
'is_owner' => $dto->isOwner,
]
)->loadMissing(['team']);
$invitation->roles()->sync($dto->roleIds);
$notifiable = new EmailNotifiable($invitation->email, $invitation->getTeam());
$logMessage = 'User invited to trial';
if ($invitation->getTeam()->owner_id === null) {
$notifiable->notifyNow(new OwnerInvitedToTrial($invitation));
$logMessage = 'Owner invited to trial';
} else {
$notifiable->notifyNow(new UserInvitedToTeam($invitation));
}
collect($dto->roleIds)
->map(fn (int $roleId): Role => $this->roleRepository->get($roleId))
->each(function (Role $role) use ($dto, $invitation): void {
$this->roleChangeLogger->log(
$dto->currentUser,
$invitation,
$role,
$invitation->wasRecentlyCreated
? RoleChangeType::INVITE_USER
: RoleChangeType::RESEND_INVITATION,
RoleChangeContext::APP,
);
});
Log::info($logMessage, [
'teamId' => $invitation->team_id,
'teamName' => $invitation->getTeam()->name,
'email' => $invitation->email,
'crmRequired' => $invitation->crm_required ? 'yes' : 'no',
]);
$invitation->touch();
}
public function executeWithEmailOnly(User $user): void
{
$notifiable = new EmailNotifiable($user->getEmailAddress(), $user->getTeam());
$notifiable->notifyNow(new UserInvitedToTeamWithEmailOnly($user));
}
}
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
40
1
40
64
Previous Highlighted Error
Next Highlighted Error
SELECT * FROM teams WHERE name LIKE '%litify%'; # 1069, 994, 24993
SELECT * FROM users WHERE id = 25061;
SELECT * FROM crm_profiles WHERE crm_configuration_id = 994;
SELECT * FROM crm_profiles WHERE user_id = 25061;
select * from crm_configurations where id = 834;
SELECT * FROM teams WHERE id = 882;
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 = 882 and sa.provider = 'hubspot';
SELECT * FROM crm_configurations where id = 882; # 933 - GoGlobal
SELECT * FROM opportunities WHERE team_id = 933 order by updated_at desc;
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 = 933 and sa.provider = 'hubspot';
SELECT * FROM crm_configurations WHERE provider = 'hubspot' and crm_provider_id = 7270388;
SELECT * FROM contacts where crm_configuration_id = 834;
SELECT * FROM opportunities WHERE team_id = 933
# AND crm_provider_id IN ('20131586060','46017317898','52543911090','53451356564','54101251892','54323768459');
AND id IN (8482561,18352941,19042734,19232139,19445140,19472541);
SELECT * FROM opportunity_contacts
WHERE opportunity_id IN (8482561,18352941,19042734,19232139,19445140,19472541);
# [PASSWORD_DOTS]
SELECT * FROM crm_configurations where id = 485; #
SELECT * FROM opportunities WHERE team_id = 933 order by updated_at desc;
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 = 933 and sa.provider = 'hubspot';
select crm.provider, l.* from leads l join crm_configurations crm on l.crm_configuration_id = crm.id
where crm.provider NOT IN ('salesforce', 'integration-app', 'bullhorn', 'copper')
# and l.converted_at IS NOT NULL
;
# [PASSWORD_DOTS]
SELECT * FROM activities a WHERE type IN ('email-inbound', 'email-outbound')
and opportunity_id IS NULL
order by id desc;
SELECT * FROM teams WHERE id = 604; # 598
SELECT * FROM activities WHERE id = 74410828; # [EMAIL]
SELECT * FROM accounts WHERE id = 20068382;
SELECT * FROM accounts WHERE id = 35186038;
SELECT * FROM contacts WHERE team_id = 852 and updated_at > '2026-01-23 12:30:00' order by updated_at desc;
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 = 559 and sa.provider = 'hubspot';
SELECT * FROM activities WHERE uuid_to_bin('cb6342b6-a183-401c-b0af-ede92b2ae763') = uuid;
select * from sidekick_settings where team_id = 781;
SELECT * FROM crm_configurations where provider = 'hubspot' and crm_provider_id = 26651871; # Teya
SELECT * FROM crm_configurations where provider = 'hubspot' and crm_provider_id = 7562435;
SELECT * FROM crm_configurations where provider = 'hubspot' and crm_provider_id = 8420347; # opflit 2100
SELECT * FROM crm_layouts WHERE crm_configuration_id = 711;
SELECT * FROM activities where crm_configuration_id = 711 and crm_provider_id IS NULL
and is_internal = 0 and status = 'completed'
order by id desc;
SELECT * FROM crm_layout_entities
WHERE crm_layout_id IN (2352, 2353);
;
SELECT * FROM crm_configurations where provider = 'hubspot' and id = 530;
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 = 556 and sa.provider = 'hubspot';
SELECT * FROM activities WHERE uuid_to_bin('c6ca4b22-7738-4563-a95d-b8a9598924ae') = uuid;
SELECT * FROM activities WHERE uuid_to_bin('442abb2b-28bd-4be8-9c25-19e9bf02766d') = uuid;
select * from contacts
where crm_configuration_id = 530
and crm_provider_id = 872252;
select * from activities where crm_configuration_id = 530
and user_id = 14343 and type like '%softphone%'
and created_at between '2026-01-28 15:00:00' and '2026-01-28 15:10:00';
SELECT * FROM crm_configurations where provider = 'hubspot' and crm_provider_id = 25666868; # Teya
SELECT * FROM crm_configurations where provider = 'hubspot' and crm_provider_id = 8646335; # Teya
SELECT * FROM crm_configurations where provider = 'hubspot' and crm_provider_id IN (5933397);
SELECT t.name, t.id, t.owner_id, c.id, c.provider, c.crm_base_url FROM teams t
JOIN crm_configurations c ON t.id = c.team_id
WHERE t.status = 'active';
SELECT * FROM teams where id = 1091;
SELECT * FROM crm_configurations where team_id = 1091;
SELECT * FROM activity_providers where team_id = 1091;
SELECT * FROM activities where crm_configuration_id = 1024 and type IN ('softphone', 'softphone-outbound')
and provider NOT IN ('hubspot', 'aircall')
# and telephony_provider_id = '019c1131-a22f-4792-b9ea-20adf6a02ed0'
order by id desc;
SELECT * FROM teams WHERE name LIKE '%Leadventure%';
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 = 1091 and sa.provider = 'salesforce';
SELECT * FROM teams WHERE name LIKE '%Wilson%'; # 862, 812
SELECT * FROM teams where id = 862;
SELECT * FROM crm_configurations where team_id = 862;
SELECT * FROM activity_providers where team_id = 862;
SELECT * FROM activities where crm_configuration_id = 812 and type IN ('softphone', 'softphone-outbound')
and provider NOT IN ('hubspot', 'aircall')
# and telephony_provider_id = '019c1131-a22f-4792-b9ea-20adf6a02ed0'
order by id desc;
SELECT t.id, crm.id, crm.provider, ap.* FROM teams t
join crm_configurations crm on t.id = crm.team_id
join activity_providers ap on t.id = ap.team_id
where t.status = 'active' and ap.is_enabled = 1
and crm.provider = 'hubspot'
and ap.provider NOT IN ('hubspot', 'aircall', 'uploader', 'gong', 'twilio', 'zoom-bot', 'google-meet', 'ms-teams',
'outreach', 'close', 'ringcentral', 'dialpad', 'zoom-phone');
SELECT * FROM teams where id = 1068;
SELECT * FROM crm_configurations where team_id = 1068;
SELECT * FROM activity_providers where team_id = 1068;
SELECT * FROM activities a
where crm_configuration_id = 993 and type IN ('softphone', 'softphone-outbound')
and a.provider NOT IN ('hubspot', 'uploader', 'gong', 'twilio', 'google-meet', 'ms-teams','close'
)
# and telephony_provider_id = '019c1131-a22f-4792-b9ea-20adf6a02ed0'
order by a.id desc;
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 = 1068 and sa.provider = 'hubspot';
# [PASSWORD_DOTS]
# [PASSWORD_DOTS]
# [PASSWORD_DOTS]
SELECT * FROM crm_configurations where id = 882; # 933 - GoGlobal , portalId: 6017093
SELECT * FROM opportunities WHERE team_id = 933 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;
SELECT * FROM opportunities WHERE team_id = 933 and updated_at > '2026-02-06 00:00:00' order by updated_at desc;
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 = 933 and sa.provider = 'hubspot';
# [PASSWORD_DOTS]
SELECT * FROM crm_configurations where id = 834; # 882 - AnyVan , portalId: 5468262
SELECT * FROM contacts WHERE crm_configuration_id = 834 and updated_at > '2026-03-30 00:00:00' order by updated_at desc;
SELECT * FROM opportunities WHERE crm_configuration_id = 834 and updated_at > '2026-03-04 08:00:00' order by updated_at desc;
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 = 882 and sa.provider = 'hubspot';
select * from crm_layouts where crm_configuration_id = 834;
select * from crm_layout_entities where crm_layout_id = 2780;
select * from crm_fields where id IN (321153,321192,321193,321194);
SELECT * FROM opportunities WHERE crm_configuration_id = 834 and id = 10993426;
# [PASSWORD_DOTS]
SELECT * FROM crm_configurations where id = 988; # 1057 - Teya (543ce4f4-168c-4571-91ea-5b35c253f06f) , portalId: 26651871
SELECT * FROM opportunities WHERE team_id = 1057 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;
SELECT * FROM opportunities WHERE team_id = 1057 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;
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 = 1057 and sa.provider = 'hubspot';
SELECT * FROM crm_configurations where id = 533; # 559 - Connectd , portalId: 6710988
SELECT * FROM opportunities WHERE team_id = 559 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;
SELECT * FROM opportunities WHERE team_id = 559 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;
SELECT * FROM crm_configurations where id = 801; # 852 - Rise Vision , portalId: 2700250
SELECT * FROM opportunities WHERE team_id = 852 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;
SELECT * FROM opportunities WHERE team_id = 852 and updated_at > '2026-02-04 00:00:00' order by updated_at desc; # 6th last
SELECT * FROM crm_configurations where id = 962; # 1034 - evergrowth.io , portalId: 143180990
SELECT * FROM opportunities WHERE team_id = 1034 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;
SELECT * FROM opportunities WHERE team_id = 1034 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;
# [PASSWORD_DOTS]
SELECT * FROM crm_configurations where id = 1037; # 1102 - Jibble , portalId: 6649755
SELECT * FROM opportunities WHERE team_id = 1102 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;
SELECT * FROM opportunities WHERE team_id = 1102 and updated_at > '2026-02-04 12:30:00' order by updated_at desc; # 8
SELECT * FROM crm_configurations where id = 1015; # 1049 - Travefy , portalId: 48904401
SELECT * FROM opportunities WHERE team_id = 1049 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;
SELECT * FROM opportunities WHERE team_id = 1049 and updated_at > '2026-02-04 12:30:00' order by updated_at desc; # 20
SELECT * FROM crm_configurations where id = 64; # 70 - SalaryFinance , portalId: 3404115
SELECT * FROM opportunities WHERE team_id = 70 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;
SELECT * FROM opportunities WHERE team_id = 70 and updated_at > '2026-02-04 12:30:00' order by updated_at desc; # 6th last
SELECT * FROM crm_configurations where id = 802; # 853 - Street Group , portalId: 7658438
SELECT * FROM opportunities WHERE team_id = 853 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;
SELECT * FROM opportunities WHERE team_id = 853 and updated_at > '2026-02-04 12:30:00' order by updated_at desc; # 10
SELECT * FROM crm_configurations where id = 872; # 921 - In Professional Development , portalId: 9238273
SELECT * FROM opportunities WHERE team_id = 921 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;
SELECT * FROM opportunities WHERE team_id = 921 and updated_at > '2026-02-04 12:30:00' order by updated_at desc; # 2
# [PASSWORD_DOTS]
SELECT * FROM crm_configurations where id = 550; # 576 - SeedLegals , portalId: 3028661
SELECT * FROM opportunities WHERE team_id = 576 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;
SELECT * FROM opportunities WHERE team_id = 576 and updated_at > '2026-02-05 14:00:00' order by updated_at desc;
SELECT * FROM crm_configurations where id = 989; # 1058 - rtaoutdoor.com , portalId: 22371204
SELECT * FROM opportunities WHERE team_id = 1058 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;
SELECT * FROM opportunities WHERE team_id = 1058 and updated_at > '2026-02-05 14:00:00' order by updated_at desc;
SELECT * FROM crm_configurations where id = 896; # 946 - Mintago , portalId: 6621281
SELECT * FROM opportunities WHERE team_id = 946 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;
SELECT * FROM opportunities WHERE team_id = 946 and updated_at > '2026-02-05 14:00:00' order by updated_at desc;
SELECT * FROM crm_configurations where id = 617; # 641 - PCS , portalId: 5244937
SELECT * FROM opportunities WHERE team_id = 641 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;
SELECT * FROM opportunities WHERE team_id = 641 and updated_at > '2026-02-05 14:00:00' order by updated_at desc; # 7th
# [PASSWORD_DOTS]
SELECT * FROM crm_configurations where id = 649; # 670 - Eventeny , portalId: 4492849
SELECT * FROM opportunities WHERE team_id = 670 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;
SELECT * FROM opportunities WHERE team_id = 670 and updated_at > '2026-02-09 08:00:00' order by updated_at desc; #
SELECT * FROM crm_configurations where id = 48; # 51 - CleanCloud , portalId: 4373137
SELECT * FROM opportunities WHERE team_id = 51 and updated_at > '2026-03-04 00:00:00' order by updated_at desc;
SELECT * FROM opportunities WHERE team_id = 51 and updated_at > '2026-02-09 08:00:00' order by updated_at desc;
select * from users where team_id = 51; # 7783
SELECT * FROM groups WHERE uuid_to_bin('8a8d2cb6-8b55-4fa3-8b5c-5f0e3d8de59a') = uuid; # 1130
select * from activity_searches where user_id = 7783;
select * from activity_search_filters where activity_search_id IN (32291, 32292);
SELECT asf.activity_search_id, asf.id, asf.value
FROM activity_search_filters asf
WHERE asf.filter = 'group_id'
AND asf.value IN (
SELECT CONCAT(
HEX(SUBSTR(uuid, 5, 4)), '-',
HEX(SUBSTR(uuid, 3, 2)), '-',
HEX(SUBSTR(uuid, 1, 2)), '-',
HEX(SUBSTR(uuid, 9, 2)), '-',
HEX(SUBSTR(uuid, 11))
)
FROM groups
WHERE deleted_at IS NOT NULL
);
SELECT * FROM crm_configurations where id = 272; # 290 - Bonham & Brook , portalId: 5705856
SELECT * FROM opportunities WHERE team_id = 290 and updated_at > '2026-02-05 00:00:00' order by updated_at desc;
SELECT * FROM opportunities WHERE team_id = 290 and updated_at > '2026-02-09 08:00:00' order by updated_at desc; # 6th
# [PASSWORD_DOTS]
SELECT * FROM crm_configurations where provider = 'hubspot';
SELECT * FROM crm_configurations where id = 1056; # 1119 - Chromatic , portalId: 45602133
SELECT * FROM opportunities WHERE team_id = 1119 and remotely_created_at > '2026-02-01 00:00:00' order by updated_at desc;
SELECT * FROM opportunities WHERE team_id = 1119 and updated_at > '2026-02-09 09:00:00' order by updated_at desc; # null
# [PASSWORD_DOTS]
select * from contacts where crm_provider_id = '003Uu00000ojD4NIAU';
select
cp.*
# DISTINCT t.id
# cp.id, cp.user_id, t.id, cp.crm_configuration_id, cp.contact_fields
FROM crm_profiles cp
JOIN crm_configurations crm on crm.id = cp.crm_configuration_id
JOIN users u on u.id = cp.user_id
JOIN teams t ON t.id = crm.team_id
WHERE crm.provider = 'salesforce' and t.status = 'active'
and cp.archived_at IS NULL and u.deleted_at IS NULL
and t.id NOT IN (1093)
and t.id = 2
and cp.contact_fields IS NULL;
# and c.crm_provider_id = '003Uu00000ojD4NIAU';
SELECT * FROM users WHERE id = 26484;
SELECT * FROM crm_profiles WHERE user_id = 26484;
SELECT * FROM social_accounts WHERE sociable_id = 26484;
SELECT * FROM crm_configurations where provider = 'salesforce';
select * from users where id IN (10022, 10403);
select * from users where team_id IN (526);
select * from teams where id IN (526, 532);
select * from crm_configurations where id IN (500, 516);
select * from crm_profiles where crm_configuration_id IN (500, 516) and user_id IN (10022, 10403);
select * from contacts where crm_configuration_id IN (500, 516) and crm_provider_id = '003Uu00000ojD4NIAU';
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 = 526 and sa.provider = 'salesforce';
select * from team_settings where team_id IN (526, 532);
select * from users where id IN (22824);
select * from crm_profiles where crm_configuration_id IN (1026);
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 = 1093 and sa.provider = 'salesforce';
select * from teams where id = 1099;
select * from users where id = 29643
select * from activity_processing_states;
SELECT * FROM teams where name LIKE '%Fare%'; # 233
SELECT * FROM opportunities where crm_configuration_id = 215
# and crm_provider_id = 'oppo_ogESZf2P50nDrd1nGPvKDXeA6sSaTN5v51Lp4ayVzKR'
;
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 = 1088 and sa.provider = 'hubspot';
SELECT * FROM teams order by updated_at DESC
SELECT * FROM crm_configurations WHERE id = 1019; # SimpleConsign 1088 - no social account
select * from crm_configurations where provider = 'pipedrive';
select * from teams where id = 957;
select * from crm_configurations where id = 957;
SELECT * FROM teams WHERE name LIKE '%Prolific%'; # 544, 518, 10743
SELECT * FROM opportunities where crm_configuration_id = 518 order by id desc;
select * from users where team_id = 1; # 26726 - Gabriela Dureva
SELECT * FROM opportunities where user_id = 26726; # 16834447 - Prolific
select * from activities where user_id = 26726 order by id desc;
select * from contacts where crm_configuration_id = 1
and email IN ('[EMAIL]', '[EMAIL]'); # 2094416, 2093620
SELECT * FROM contacts WHERE id = 6284931;
SELECT p.* FROM activities a JOIN participants p ON a.id = p.activity_id
WHERE a.user_id = 26726 and p.lead_id IN (2094416, 2093620) and a.created_at > '2026-01-01 00:00:00' order by p.email;
select * from activities where id IN (75509259,75509261,75509261,75511034,75026464,75517602,75517605);
select * from crm_configurations where id = 1;
43801692-1aeb-32ce-acba-5b80a479701a
44c3c9cf-6f5e-75f3-8179-bc9f75dd2b1b
405975c0-b3d0-7aaa-821f-09d59cae6dd1
4caf848d-4bed-2299-b248-7788d41f9fca
49bedc3f-f196-eef3-89c3-dea6a3b4aa63
43420989-a09d-b8f8-9806-c8bbf7a02aac
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 = 1 and sa.provider = 'salesforce';
SELECT * FROM activities WHERE id = 75461988;
SELECT * FROM activities WHERE uuid_to_bin('d6c5052e-e972-49e9-8912-26f2f7d6c5f6') = uuid;
select * from contacts where id = 17900517;
select * from contact_roles cr join crm_configurations crm on cr.crm_configuration_id = crm.id
where crm.provider != 'salesforce';
select * from users where id = 21047;
SELECT * FROM crm_configurations WHERE id = 892;
SELECT * FROM teams WHERE id = 942;
select * from opportunities where team_id = 942 order by updated_at desc;
select * from contacts where team_id = 942 order by updated_at desc;
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 = 942 and sa.provider = 'hubspot';
SELECT * FROM opportunities where team_id = 1 and crm_provider_id IN ('006Pq00000NeH6XIAV', '006Pq000007z8kdIAA'); # 10697889, 6621430
SELECT * FROM crm_configurations WHERE id = 1;
SELECT * FROM teams WHERE crm_id = 1;
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 = 1 and sa.provider = 'salesforce';
select id, user_id, opportunity_fields from crm_profiles where crm_configuration_id = 1
SELECT * FROM opportunities where team_id = 1 order by updated_at desc; # 10697889, 6621430
select * from teams where id = 852;
select * from groups where id = 2286;
select * from sidekick_settings where team_id = 852;
select * from default_activity_types where team_id = 852;
SELECT cc.provider, cc.id, p.id, u.*
FROM users u
LEFT JOIN crm_profiles p ON u.id = p.user_id AND p.id IS NULL -- no profile
INNER JOIN teams t ON u.team_id = t.id AND t.status = 'active' -- team is active
INNER JOIN crm_configurations cc ON t.crm_id = cc.id
WHERE u.status = 1 AND u.deleted_at IS NULL
AND u.crm_required = 1
AND u.team_id = 1
ORDER BY u.team_id;
SELECT * FROM crm_profiles cp where cp.crm_configuration_id = 1 and cp.user_id IN (
18481
);
SELECT cc.provider, cc.id, p.id, u.*
FROM users u
LEFT JOIN crm_profiles p ON u.id = p.user_id
INNER JOIN teams t ON u.team_id = t.id AND t.status = 'active'
INNER JOIN crm_configurations cc ON t.crm_id = cc.id
WHERE u.status = 1
AND u.deleted_at IS NULL
AND u.crm_required = 1
# AND u.team_id = 1
AND p.id IS NULL -- Move this condition to WHERE clause
ORDER BY u.team_id;
SELECT * FROM opportunities WHERE id = 20002609;
select * from teams where id = 1122; # Velatir, 29953 - [EMAIL]
select * from crm_configurations where id = 1060;
select * from crm_layouts where crm_configuration_id = 1060;
SELECT * FROM crm_layout_entities WHERE crm_layout_id = 3596;
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 = 1122 and sa.provider = 'hubspot';
select * from opportunities where team_id = 1122 order by updated_at desc;
select * from crm_field_data where object_type = 'contact';
SELECT * FROM activities WHERE uuid_to_bin('374fc8ed-3315-4c9f-9b25-318b7fd2928f') = uuid; # 76584262
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 = 248 and sa.provider = 'salesforce';
SELECT * FROM crm_profiles where user_id = 24115; # 005QF000002CswMYAS
SELECT * FROM users where id = 24115;
SELECT * FROM accounts where id = 4002896;
SELECT * FROM teams WHERE name LIKE '%adswerve%';
SELECT * FROM opportunities where crm_configuration_id = 230 AND crm_provider_id IN ("0069N000003GIQ9QAO","0061r000019yGP9AAM","0066900001S2KWlAAN","0066900001TDpj2AAD","0066900001b8uEwAAI","0069N000001rQi0QAE","006QF00000KD40mYAD","006QF00000LzpRJYAZ","0069N000002uomtQAA","0069N000002xlMLQAY","0066900001NV6ubAAD","0061r00001HJp45AAD","006QF00000uTlUoYAK","006QF00000v0bZqYAI");
SELECT * FROM opportunities WHERE crm_configuration_id = 230 AND crm_provider_id = '0069N000003GIQ9QAO'; # 6272203
SELECT u.id, u.email, ac.name, a.* FROM activities a
JOIN users u ON a.user_id = u.id
JOIN accounts ac ON a.account_id = ac.id
WHERE
uuid_to_bin('e3269598-b562-44fb-b5e9-9d2694dc63e0') = a.uuid or
uuid_to_bin('66ddc3ab-4e15-45aa-af0c-248c1eece593') = a.uuid or
uuid_to_bin('826bd328-e1cc-4213-b8d8-572454cacc07') = a.uuid;
select * from users where id = 5825;
SELECT * FROM activities WHERE uuid_to_bin('e56aa2e8-231a-421b-ab1f-cb38ed2bf573') = uuid;
select * from activities where uuid_to_bin('91e13b2f-2d1b-45f8-b1fd-1141b6563782') = uuid;
19594, 862
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 = 862 and sa.provider = 'salesforce';
select * from automated_reports where id = 36;
select ar.frequency, r.*, ar.* from automated_report_results r
join automated_reports ar on r.report_id = ar.id
where ar.frequency != 'one_off';
select s.* from activity_searches s join users u ON s.user_id = u.id where u.team_id = 882;
select * from nudges n where n.activity_search_id
select * from teams where created_at > '2026-03-09';
SELECT * FROM crm_layouts WHERE crm_configuration_id = 1065; # 1065
SELECT * FROM crm_layout_entities WHERE crm_layout_id = 3617;
select * from users where team_id = 1 and name like '%Lukas%'; # 7160
SELECT * FROM teams WHERE id = 575;
select * from opportunities where team_id = 575;
SELECT * FROM teams WHERE name LIKE '%Integrum ESG%'; # 1126, 1065,
select * from opportunities where team_id = 1126;
SELECT * FROM teams WHERE name LIKE '%Base%'; # 1125, 1063,
select * from opportunities where team_id = 1125;
select * from contacts c
where c.team_id = 882;
SELECT * FROM activities WHERE id = 76822967;
SELECT * FROM crm_profiles WHERE user_id = 15440;
SELECT * FROM crm_profiles WHERE crm_configuration_id = 555;
SELECT * FROM crm_configurations WHERE id = 555;
SELECT * FROM users WHERE id = 15440; # team. 581, gr. 15440, pl. 3911, act. field 162182
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 = 581 and sa.provider = 'salesforce';
SELECT * FROM automated_report_results order by id desc;
select * from features;
select * from team_features where feature_id = 40;
select * from teams where id = 556;
select * from automated_reports;
where id = 54; # 4fdd41f6-dcf0-30d0-b339-7345381b6044 , ["pdf","podcast"]
SELECT * FROM automated_report_results WHERE uuid_to_bin('822fa41b-afd3-43a9-a248-86b0e36f3131') = uuid;
select * from automated_report_results order by id desc;
SELECT * FROM automated_report_results WHERE id = 1919;
select * from automated_report_results WHERE report_id = 54;
select * from opportunities where id = 7594349;
SELECT * FROM teams WHERE name LIKE '%Les%'; # 711, 692, 16067 - [EMAIL]
select * from playbooks where team_id = 711; # event 226147
SELECT * FROM playbook_categories WHERE playbook_id = 5515;
SELECT * FROM crm_fields WHERE crm_configuration_id = 692 and object_type = 'event';
SELECT * FROM crm_fields WHERE id = 226147;
SELECT * FROM crm_field_values WHERE crm_field_id = 226147;
SELECT * FROM crm_configurations WHERE id = 692;
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 = 711 and sa.provider = 'salesforce';
SELECT * FROM crm_profiles cp JOIN users u on u.id = cp.user_id WHERE u.team_id = 711;
select * from leads;
select * from calendars;
SELECT
t.id AS team_id,
t.name,
LOWER(SUBSTRING_INDEX(c.calendar_provider_id, '@', -1)) AS calendar_domain
FROM teams t
JOIN users u ON u.team_id = t.id
JOIN calendars c ON c.user_id = u.id AND c.status = 'active' AND c.calendar_provider_id LIKE '%@%'
LEFT JOIN team_domains td
ON td.team_id = t.id
AND td.deleted_at IS NULL
AND td.domain = LOWER(SUBSTRING_INDEX(c.calendar_provider_id, '@', -1))
GROUP BY t.id, t.name, calendar_domain
ORDER BY t.name, calendar_domain;
select * from users u join calendars c on c.user_id = u.id
where u.team_id = 882;
select * from activities where id = 74049485; # team 563 crm 537
select * from activities where id = 73272382; # team 563 crm 537
select * from activities where id = 64400389; # team 563 crm 537
select * from activities where id = 58081273; # team 563 crm 537
select * from activities where id = 54520297; # team 563 crm 537
select * from participants where activity_id = 58081273;
select * from activities where crm_configuration_id = 537 and provider = 'aircall'
and account_id = 19003658 order by updated_at desc;
select * from contacts where crm_configuration_id = 537 and id = 35957759;
select * from accounts where crm_configuration_id = 537 and id = 19003658;
select * from automated_report_results where id = 1976;
select * from automated_reports where id = 583;
select * from activity_searches where id = 87714;
select * from activity_search_filters where activity_search_id = 87714;
SELECT * FROM activities WHERE uuid_to_bin('8827f672-202d-4162-9d04-73ff5f0566a9') = uuid
or uuid_to_bin('47842446-af51-4bcb-854f-cc6560290101') = uuid;
SELECT * FROM crm_configurations WHERE provider = 'hubspot';
select * from rate_limits;
select * from automated_report_results where media_type = 'pdf' and status = 2
and id IN (18, 1872);
select * from automated_reports where id = 54;
SELECT * FROM users WHERE id IN (24623,29443,29613);
SELECT * FROM automated_report_results WHERE uuid_to_bin('822fa41b-afd3-43a9-a248-86b0e36f3131') = uuid;
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide
app ~/jiminny/app, folder
.circleci, folder
.cursor, folder
.github
.sonarlint, folder
.vscode, folder
.windsurf, folder
app, sources root
Actions
InviteUserToTeamAction.php, class
MarkUserAsOnboardableAction.php, class
SyncRecordingFlagsAction.php, class
UpdateTeamMemberAction.php, class
UpdateUserRolesAction.php, class
Component
Acl
ActionItems
Activity
ActivityAnalytics
ActivitySearch
AiActivityType
AiAutomation
AiCallScoring
AskAnything
Dtos
Events
AskAnythingPromptService.php, class
HistoryService.php, class
AskJiminnyAi
AWS
BillingManagement
Cache
CoachingFeedback
Country
CustomerApi
Database
Datadog
DateTime
DealInsights
DealRisks
ElasticSearch
Eloquent
Encoding...
|
[{"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},"on_screen":true,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"master, menu","depth":5,"bounds":{"left":0.064494684,"top":0.019952115,"width":0.034242023,"height":0.025538707},"on_screen":true,"help_text":"Git Branch: master","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},"on_screen":true,"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},"on_screen":true,"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},"on_screen":true,"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},"on_screen":true,"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},"on_screen":true,"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},"on_screen":true,"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},"on_screen":true,"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},"on_screen":true,"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},"on_screen":false,"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},"on_screen":false,"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},"on_screen":false,"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},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"3","depth":4,"bounds":{"left":0.37466756,"top":0.07581804,"width":0.007978723,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"1","depth":4,"bounds":{"left":0.38464096,"top":0.07581804,"width":0.00731383,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.39361703,"top":0.074221864,"width":0.00731383,"height":0.018355945},"on_screen":true,"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.40093085,"top":0.074221864,"width":0.006981383,"height":0.018355945},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"<?php\n\nnamespace Jiminny\\Actions;\n\nuse Illuminate\\Support\\Facades\\Log;\nuse Illuminate\\Support\\Str;\nuse Jiminny\\Component\\Acl\\RoleChangeContext;\nuse Jiminny\\Component\\Acl\\RoleChangeLogger;\nuse Jiminny\\Component\\Acl\\RoleChangeType;\nuse Jiminny\\Contracts\\Acl\\RoleRepositoryInterface;\nuse Jiminny\\DTO\\Invitation\\UserInvitationDTO;\nuse Jiminny\\Models\\Invitation;\nuse Jiminny\\Models\\Role;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Notifications\\Channels\\EmailNotifiable;\nuse Jiminny\\Notifications\\OwnerInvitedToTrial;\nuse Jiminny\\Notifications\\UserInvitedToTeam;\nuse Jiminny\\Notifications\\UserInvitedToTeamWithEmailOnly;\n\nclass InviteUserToTeamAction\n{\n public function __construct(\n private RoleRepositoryInterface $roleRepository,\n private RoleChangeLogger $roleChangeLogger,\n ) {\n }\n\n public function execute(UserInvitationDTO $dto): void\n {\n /** @var Invitation $invitation */\n $invitation = Invitation::updateOrCreate(\n [\n 'team_id' => $dto->teamId,\n 'email' => $dto->email,\n ],\n [\n 'group_id' => $dto->groupId,\n 'secondary_email' => $dto->secondaryEmail,\n 'crm_required' => $dto->crmRequired,\n 'token' => Str::random(40),\n 'is_owner' => $dto->isOwner,\n ]\n )->loadMissing(['team']);\n\n $invitation->roles()->sync($dto->roleIds);\n\n $notifiable = new EmailNotifiable($invitation->email, $invitation->getTeam());\n\n $logMessage = 'User invited to trial';\n\n if ($invitation->getTeam()->owner_id === null) {\n $notifiable->notifyNow(new OwnerInvitedToTrial($invitation));\n\n $logMessage = 'Owner invited to trial';\n } else {\n $notifiable->notifyNow(new UserInvitedToTeam($invitation));\n }\n\n collect($dto->roleIds)\n ->map(fn (int $roleId): Role => $this->roleRepository->get($roleId))\n ->each(function (Role $role) use ($dto, $invitation): void {\n $this->roleChangeLogger->log(\n $dto->currentUser,\n $invitation,\n $role,\n $invitation->wasRecentlyCreated\n ? RoleChangeType::INVITE_USER\n : RoleChangeType::RESEND_INVITATION,\n RoleChangeContext::APP,\n );\n });\n\n Log::info($logMessage, [\n 'teamId' => $invitation->team_id,\n 'teamName' => $invitation->getTeam()->name,\n 'email' => $invitation->email,\n 'crmRequired' => $invitation->crm_required ? 'yes' : 'no',\n ]);\n\n $invitation->touch();\n }\n\n public function executeWithEmailOnly(User $user): void\n {\n $notifiable = new EmailNotifiable($user->getEmailAddress(), $user->getTeam());\n\n $notifiable->notifyNow(new UserInvitedToTeamWithEmailOnly($user));\n }\n}","depth":4,"bounds":{"left":0.11968085,"top":0.0726257,"width":0.28823137,"height":0.9273743},"on_screen":true,"value":"<?php\n\nnamespace Jiminny\\Actions;\n\nuse Illuminate\\Support\\Facades\\Log;\nuse Illuminate\\Support\\Str;\nuse Jiminny\\Component\\Acl\\RoleChangeContext;\nuse Jiminny\\Component\\Acl\\RoleChangeLogger;\nuse Jiminny\\Component\\Acl\\RoleChangeType;\nuse Jiminny\\Contracts\\Acl\\RoleRepositoryInterface;\nuse Jiminny\\DTO\\Invitation\\UserInvitationDTO;\nuse Jiminny\\Models\\Invitation;\nuse Jiminny\\Models\\Role;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Notifications\\Channels\\EmailNotifiable;\nuse Jiminny\\Notifications\\OwnerInvitedToTrial;\nuse Jiminny\\Notifications\\UserInvitedToTeam;\nuse Jiminny\\Notifications\\UserInvitedToTeamWithEmailOnly;\n\nclass InviteUserToTeamAction\n{\n public function __construct(\n private RoleRepositoryInterface $roleRepository,\n private RoleChangeLogger $roleChangeLogger,\n ) {\n }\n\n public function execute(UserInvitationDTO $dto): void\n {\n /** @var Invitation $invitation */\n $invitation = Invitation::updateOrCreate(\n [\n 'team_id' => $dto->teamId,\n 'email' => $dto->email,\n ],\n [\n 'group_id' => $dto->groupId,\n 'secondary_email' => $dto->secondaryEmail,\n 'crm_required' => $dto->crmRequired,\n 'token' => Str::random(40),\n 'is_owner' => $dto->isOwner,\n ]\n )->loadMissing(['team']);\n\n $invitation->roles()->sync($dto->roleIds);\n\n $notifiable = new EmailNotifiable($invitation->email, $invitation->getTeam());\n\n $logMessage = 'User invited to trial';\n\n if ($invitation->getTeam()->owner_id === null) {\n $notifiable->notifyNow(new OwnerInvitedToTrial($invitation));\n\n $logMessage = 'Owner invited to trial';\n } else {\n $notifiable->notifyNow(new UserInvitedToTeam($invitation));\n }\n\n collect($dto->roleIds)\n ->map(fn (int $roleId): Role => $this->roleRepository->get($roleId))\n ->each(function (Role $role) use ($dto, $invitation): void {\n $this->roleChangeLogger->log(\n $dto->currentUser,\n $invitation,\n $role,\n $invitation->wasRecentlyCreated\n ? RoleChangeType::INVITE_USER\n : RoleChangeType::RESEND_INVITATION,\n RoleChangeContext::APP,\n );\n });\n\n Log::info($logMessage, [\n 'teamId' => $invitation->team_id,\n 'teamName' => $invitation->getTeam()->name,\n 'email' => $invitation->email,\n 'crmRequired' => $invitation->crm_required ? 'yes' : 'no',\n ]);\n\n $invitation->touch();\n }\n\n public function executeWithEmailOnly(User $user): void\n {\n $notifiable = new EmailNotifiable($user->getEmailAddress(), $user->getTeam());\n\n $notifiable->notifyNow(new UserInvitedToTeamWithEmailOnly($user));\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.40957448,"top":0.09896249,"width":0.008643617,"height":0.01915403},"on_screen":true,"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.41821808,"top":0.09896249,"width":0.008643617,"height":0.01915403},"on_screen":true,"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.42918882,"top":0.09896249,"width":0.008643617,"height":0.01915403},"on_screen":true,"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.43783244,"top":0.09896249,"width":0.008643617,"height":0.01915403},"on_screen":true,"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.44647607,"top":0.09896249,"width":0.008643617,"height":0.01915403},"on_screen":true,"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.4574468,"top":0.09896249,"width":0.008643617,"height":0.01915403},"on_screen":true,"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.46841756,"top":0.09896249,"width":0.024268618,"height":0.01915403},"on_screen":true,"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.4950133,"top":0.09896249,"width":0.008643617,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Playground","depth":4,"bounds":{"left":0.50598407,"top":0.09896249,"width":0.029587766,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"jiminny","depth":4,"bounds":{"left":0.7084442,"top":0.09896249,"width":0.02825798,"height":0.01915403},"on_screen":true,"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},"on_screen":false,"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},"on_screen":false,"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},"on_screen":false,"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},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"40","depth":4,"bounds":{"left":0.67785907,"top":0.123703115,"width":0.010305851,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"1","depth":4,"bounds":{"left":0.69015956,"top":0.123703115,"width":0.00731383,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"40","depth":4,"bounds":{"left":0.6994681,"top":0.123703115,"width":0.010305851,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"64","depth":4,"bounds":{"left":0.7117686,"top":0.123703115,"width":0.010305851,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.7237367,"top":0.12210695,"width":0.00731383,"height":0.018355945},"on_screen":true,"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.73105055,"top":0.12210695,"width":0.006981383,"height":0.018355945},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"SELECT * FROM teams WHERE name LIKE '%litify%'; # 1069, 994, 24993\nSELECT * FROM users WHERE id = 25061;\nSELECT * FROM crm_profiles WHERE crm_configuration_id = 994;\nSELECT * FROM crm_profiles WHERE user_id = 25061;\n\nselect * from crm_configurations where id = 834;\nSELECT * FROM teams WHERE id = 882;\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 = 882 and sa.provider = 'hubspot';\n\nSELECT * FROM crm_configurations where id = 882; # 933 - GoGlobal\nSELECT * FROM opportunities WHERE team_id = 933 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 = 933 and sa.provider = 'hubspot';\n\nSELECT * FROM crm_configurations WHERE provider = 'hubspot' and crm_provider_id = 7270388;\n\nSELECT * FROM contacts where crm_configuration_id = 834;\nSELECT * FROM opportunities WHERE team_id = 933\n# AND crm_provider_id IN ('20131586060','46017317898','52543911090','53451356564','54101251892','54323768459');\nAND id IN (8482561,18352941,19042734,19232139,19445140,19472541);\nSELECT * FROM opportunity_contacts\nWHERE opportunity_id IN (8482561,18352941,19042734,19232139,19445140,19472541);\n\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 485; #\nSELECT * FROM opportunities WHERE team_id = 933 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 = 933 and sa.provider = 'hubspot';\n\nselect crm.provider, l.* from leads l join crm_configurations crm on l.crm_configuration_id = crm.id\nwhere crm.provider NOT IN ('salesforce', 'integration-app', 'bullhorn', 'copper')\n# and l.converted_at IS NOT NULL\n;\n\n# ********************************************************************\nSELECT * FROM activities a WHERE type IN ('email-inbound', 'email-outbound')\nand opportunity_id IS NULL\norder by id desc;\n\nSELECT * FROM teams WHERE id = 604; # 598\nSELECT * FROM activities WHERE id = 74410828; # chelseaw@allvoices.co\nSELECT * FROM accounts WHERE id = 20068382;\nSELECT * FROM accounts WHERE id = 35186038;\n\nSELECT * FROM contacts WHERE team_id = 852 and updated_at > '2026-01-23 12:30: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 = 559 and sa.provider = 'hubspot';\n\nSELECT * FROM activities WHERE uuid_to_bin('cb6342b6-a183-401c-b0af-ede92b2ae763') = uuid;\nselect * from sidekick_settings where team_id = 781;\n\nSELECT * FROM crm_configurations where provider = 'hubspot' and crm_provider_id = 26651871; # Teya\nSELECT * FROM crm_configurations where provider = 'hubspot' and crm_provider_id = 7562435;\nSELECT * FROM crm_configurations where provider = 'hubspot' and crm_provider_id = 8420347; # opflit 2100\n\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 711;\nSELECT * FROM activities where crm_configuration_id = 711 and crm_provider_id IS NULL\nand is_internal = 0 and status = 'completed'\norder by id desc;\n\nSELECT * FROM crm_layout_entities\nWHERE crm_layout_id IN (2352, 2353);\n;\n\nSELECT * FROM crm_configurations where provider = 'hubspot' and id = 530;\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 = 'hubspot';\n\nSELECT * FROM activities WHERE uuid_to_bin('c6ca4b22-7738-4563-a95d-b8a9598924ae') = uuid;\nSELECT * FROM activities WHERE uuid_to_bin('442abb2b-28bd-4be8-9c25-19e9bf02766d') = uuid;\nselect * from contacts\nwhere crm_configuration_id = 530\nand crm_provider_id = 872252;\n\nselect * from activities where crm_configuration_id = 530\nand user_id = 14343 and type like '%softphone%'\nand created_at between '2026-01-28 15:00:00' and '2026-01-28 15:10:00';\n\nSELECT * FROM crm_configurations where provider = 'hubspot' and crm_provider_id = 25666868; # Teya\nSELECT * FROM crm_configurations where provider = 'hubspot' and crm_provider_id = 8646335; # Teya\nSELECT * FROM crm_configurations where provider = 'hubspot' and crm_provider_id IN (5933397);\n\n\nSELECT t.name, t.id, t.owner_id, c.id, c.provider, c.crm_base_url FROM teams t\nJOIN crm_configurations c ON t.id = c.team_id\nWHERE t.status = 'active';\n\nSELECT * FROM teams where id = 1091;\nSELECT * FROM crm_configurations where team_id = 1091;\nSELECT * FROM activity_providers where team_id = 1091;\nSELECT * FROM activities where crm_configuration_id = 1024 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;\n\n\nSELECT * FROM teams WHERE name LIKE '%Leadventure%';\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 = 1091 and sa.provider = 'salesforce';\n\nSELECT * FROM teams WHERE name LIKE '%Wilson%'; # 862, 812\nSELECT * FROM teams where id = 862;\nSELECT * FROM crm_configurations where team_id = 862;\nSELECT * FROM activity_providers where team_id = 862;\nSELECT * FROM activities where crm_configuration_id = 812 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;\n\n\nSELECT t.id, crm.id, crm.provider, ap.* FROM teams t\njoin crm_configurations crm on t.id = crm.team_id\njoin activity_providers ap on t.id = ap.team_id\nwhere t.status = 'active' and ap.is_enabled = 1\nand crm.provider = 'hubspot'\nand ap.provider NOT IN ('hubspot', 'aircall', 'uploader', 'gong', 'twilio', 'zoom-bot', 'google-meet', 'ms-teams',\n 'outreach', 'close', 'ringcentral', 'dialpad', 'zoom-phone');\n\nSELECT * FROM teams where id = 1068;\nSELECT * FROM crm_configurations where team_id = 1068;\nSELECT * FROM activity_providers where team_id = 1068;\n\nSELECT * FROM activities a\nwhere crm_configuration_id = 993 and type IN ('softphone', 'softphone-outbound')\nand a.provider NOT IN ('hubspot', 'uploader', 'gong', 'twilio', 'google-meet', 'ms-teams','close'\n )\n# and telephony_provider_id = '019c1131-a22f-4792-b9ea-20adf6a02ed0'\norder by a.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 = 1068 and sa.provider = 'hubspot';\n\n# ********************************************************************\n# ********************************************************************\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 882; # 933 - GoGlobal , portalId: 6017093\nSELECT * FROM opportunities WHERE team_id = 933 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 933 and updated_at > '2026-02-06 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 = 933 and sa.provider = 'hubspot';\n\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 834; # 882 - AnyVan , portalId: 5468262\nSELECT * FROM contacts WHERE crm_configuration_id = 834 and updated_at > '2026-03-30 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE crm_configuration_id = 834 and updated_at > '2026-03-04 08: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 = 882 and sa.provider = 'hubspot';\nselect * from crm_layouts where crm_configuration_id = 834;\nselect * from crm_layout_entities where crm_layout_id = 2780;\nselect * from crm_fields where id IN (321153,321192,321193,321194);\n\nSELECT * FROM opportunities WHERE crm_configuration_id = 834 and id = 10993426;\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 988; # 1057 - Teya (543ce4f4-168c-4571-91ea-5b35c253f06f) , portalId: 26651871\nSELECT * FROM opportunities WHERE team_id = 1057 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 1057 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 = 1057 and sa.provider = 'hubspot';\n\nSELECT * FROM crm_configurations where id = 533; # 559 - Connectd , portalId: 6710988\nSELECT * FROM opportunities WHERE team_id = 559 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 559 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 801; # 852 - Rise Vision , portalId: 2700250\nSELECT * FROM opportunities WHERE team_id = 852 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 852 and updated_at > '2026-02-04 00:00:00' order by updated_at desc; # 6th last\n\nSELECT * FROM crm_configurations where id = 962; # 1034 - evergrowth.io , portalId: 143180990\nSELECT * FROM opportunities WHERE team_id = 1034 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 1034 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\n\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 1037; # 1102 - Jibble , portalId: 6649755\nSELECT * FROM opportunities WHERE team_id = 1102 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 1102 and updated_at > '2026-02-04 12:30:00' order by updated_at desc; # 8\n\nSELECT * FROM crm_configurations where id = 1015; # 1049 - Travefy , portalId: 48904401\nSELECT * FROM opportunities WHERE team_id = 1049 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 1049 and updated_at > '2026-02-04 12:30:00' order by updated_at desc; # 20\n\nSELECT * FROM crm_configurations where id = 64; # 70 - SalaryFinance , portalId: 3404115\nSELECT * FROM opportunities WHERE team_id = 70 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 70 and updated_at > '2026-02-04 12:30:00' order by updated_at desc; # 6th last\n\nSELECT * FROM crm_configurations where id = 802; # 853 - Street Group , portalId: 7658438\nSELECT * FROM opportunities WHERE team_id = 853 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 853 and updated_at > '2026-02-04 12:30:00' order by updated_at desc; # 10\n\nSELECT * FROM crm_configurations where id = 872; # 921 - In Professional Development , portalId: 9238273\nSELECT * FROM opportunities WHERE team_id = 921 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 921 and updated_at > '2026-02-04 12:30:00' order by updated_at desc; # 2\n\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 550; # 576 - SeedLegals , portalId: 3028661\nSELECT * FROM opportunities WHERE team_id = 576 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 576 and updated_at > '2026-02-05 14:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 989; # 1058 - rtaoutdoor.com , portalId: 22371204\nSELECT * FROM opportunities WHERE team_id = 1058 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 1058 and updated_at > '2026-02-05 14:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 896; # 946 - Mintago , portalId: 6621281\nSELECT * FROM opportunities WHERE team_id = 946 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 946 and updated_at > '2026-02-05 14:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 617; # 641 - PCS , portalId: 5244937\nSELECT * FROM opportunities WHERE team_id = 641 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 641 and updated_at > '2026-02-05 14:00:00' order by updated_at desc; # 7th\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 649; # 670 - Eventeny , portalId: 4492849\nSELECT * FROM opportunities WHERE team_id = 670 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 670 and updated_at > '2026-02-09 08:00:00' order by updated_at desc; #\n\nSELECT * FROM crm_configurations where id = 48; # 51 - CleanCloud , portalId: 4373137\nSELECT * FROM opportunities WHERE team_id = 51 and updated_at > '2026-03-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 51 and updated_at > '2026-02-09 08:00:00' order by updated_at desc;\nselect * from users where team_id = 51; # 7783\nSELECT * FROM groups WHERE uuid_to_bin('8a8d2cb6-8b55-4fa3-8b5c-5f0e3d8de59a') = uuid; # 1130\nselect * from activity_searches where user_id = 7783;\nselect * from activity_search_filters where activity_search_id IN (32291, 32292);\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 = 272; # 290 - Bonham & Brook , portalId: 5705856\nSELECT * FROM opportunities WHERE team_id = 290 and updated_at > '2026-02-05 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 290 and updated_at > '2026-02-09 08:00:00' order by updated_at desc; # 6th\n# ********************************************************************\nSELECT * FROM crm_configurations where provider = 'hubspot';\nSELECT * FROM crm_configurations where id = 1056; # 1119 - Chromatic , portalId: 45602133\nSELECT * FROM opportunities WHERE team_id = 1119 and remotely_created_at > '2026-02-01 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 1119 and updated_at > '2026-02-09 09:00:00' order by updated_at desc; # null\n# ********************************************************************\n\nselect * from contacts where crm_provider_id = '003Uu00000ojD4NIAU';\nselect\n cp.*\n# DISTINCT t.id\n# cp.id, cp.user_id, t.id, cp.crm_configuration_id, cp.contact_fields\nFROM crm_profiles cp\nJOIN crm_configurations crm on crm.id = cp.crm_configuration_id\nJOIN users u on u.id = cp.user_id\nJOIN teams t ON t.id = crm.team_id\nWHERE crm.provider = 'salesforce' and t.status = 'active'\n and cp.archived_at IS NULL and u.deleted_at IS NULL\n and t.id NOT IN (1093)\n and t.id = 2\n and cp.contact_fields IS NULL;\n# and c.crm_provider_id = '003Uu00000ojD4NIAU';\n\nSELECT * FROM users WHERE id = 26484;\nSELECT * FROM crm_profiles WHERE user_id = 26484;\nSELECT * FROM social_accounts WHERE sociable_id = 26484;\nSELECT * FROM crm_configurations where provider = 'salesforce';\nselect * from users where id IN (10022, 10403);\nselect * from users where team_id IN (526);\nselect * from teams where id IN (526, 532);\nselect * from crm_configurations where id IN (500, 516);\nselect * from crm_profiles where crm_configuration_id IN (500, 516) and user_id IN (10022, 10403);\nselect * from contacts where crm_configuration_id IN (500, 516) and crm_provider_id = '003Uu00000ojD4NIAU';\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 = 526 and sa.provider = 'salesforce';\nselect * from team_settings where team_id IN (526, 532);\n\nselect * from users where id IN (22824);\nselect * from crm_profiles where crm_configuration_id IN (1026);\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 = 1093 and sa.provider = 'salesforce';\n\nselect * from teams where id = 1099;\nselect * from users where id = 29643\n\nselect * from activity_processing_states;\n\nSELECT * FROM teams where name LIKE '%Fare%'; # 233\nSELECT * FROM opportunities where crm_configuration_id = 215\n# and crm_provider_id = 'oppo_ogESZf2P50nDrd1nGPvKDXeA6sSaTN5v51Lp4ayVzKR'\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 = 1088 and sa.provider = 'hubspot';\n\nSELECT * FROM teams order by updated_at DESC\nSELECT * FROM crm_configurations WHERE id = 1019; # SimpleConsign 1088 - no social account\n\nselect * from crm_configurations where provider = 'pipedrive';\n\nselect * from teams where id = 957;\nselect * from crm_configurations where id = 957;\n\nSELECT * FROM teams WHERE name LIKE '%Prolific%'; # 544, 518, 10743\nSELECT * FROM opportunities where crm_configuration_id = 518 order by id desc;\n\nselect * from users where team_id = 1; # 26726 - Gabriela Dureva\nSELECT * FROM opportunities where user_id = 26726; # 16834447 - Prolific\nselect * from activities where user_id = 26726 order by id desc;\nselect * from contacts where crm_configuration_id = 1\nand email IN ('charlotte.ward@prolific.com', 'frankie.bryant@prolific.com'); # 2094416, 2093620\nSELECT * FROM contacts WHERE id = 6284931;\n\nSELECT p.* FROM activities a JOIN participants p ON a.id = p.activity_id\nWHERE a.user_id = 26726 and p.lead_id IN (2094416, 2093620) and a.created_at > '2026-01-01 00:00:00' order by p.email;\n\nselect * from activities where id IN (75509259,75509261,75509261,75511034,75026464,75517602,75517605);\nselect * from crm_configurations where id = 1;\n\n43801692-1aeb-32ce-acba-5b80a479701a\n44c3c9cf-6f5e-75f3-8179-bc9f75dd2b1b\n405975c0-b3d0-7aaa-821f-09d59cae6dd1\n4caf848d-4bed-2299-b248-7788d41f9fca\n49bedc3f-f196-eef3-89c3-dea6a3b4aa63\n43420989-a09d-b8f8-9806-c8bbf7a02aac\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 = 1 and sa.provider = 'salesforce';\n\nSELECT * FROM activities WHERE id = 75461988;\n\nSELECT * FROM activities WHERE uuid_to_bin('d6c5052e-e972-49e9-8912-26f2f7d6c5f6') = uuid;\n\nselect * from contacts where 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 users where id = 21047;\nSELECT * FROM crm_configurations WHERE id = 892;\nSELECT * FROM teams WHERE id = 942;\nselect * from opportunities where team_id = 942 order by updated_at desc;\nselect * from contacts where team_id = 942 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 = 942 and sa.provider = 'hubspot';\n\nSELECT * FROM opportunities where team_id = 1 and crm_provider_id IN ('006Pq00000NeH6XIAV', '006Pq000007z8kdIAA'); # 10697889, 6621430\nSELECT * FROM crm_configurations WHERE id = 1;\nSELECT * FROM teams WHERE crm_id = 1;\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 = 1 and sa.provider = 'salesforce';\n\nselect id, user_id, opportunity_fields from crm_profiles where crm_configuration_id = 1\nSELECT * FROM opportunities where team_id = 1 order by updated_at desc; # 10697889, 6621430\n\nselect * from teams where id = 852;\nselect * from groups where id = 2286;\nselect * from sidekick_settings where team_id = 852;\nselect * from default_activity_types where team_id = 852;\n\n\nSELECT cc.provider, cc.id, p.id, u.*\nFROM users u\nLEFT JOIN crm_profiles p ON u.id = p.user_id AND p.id IS NULL -- no profile\nINNER JOIN teams t ON u.team_id = t.id AND t.status = 'active' -- team is active\nINNER JOIN crm_configurations cc ON t.crm_id = cc.id\nWHERE u.status = 1 AND u.deleted_at IS NULL\nAND u.crm_required = 1\nAND u.team_id = 1\nORDER BY u.team_id;\n\nSELECT * FROM crm_profiles cp where cp.crm_configuration_id = 1 and cp.user_id IN (\n18481\n );\n\nSELECT cc.provider, cc.id, p.id, u.*\nFROM users u\nLEFT JOIN crm_profiles p ON u.id = p.user_id\nINNER JOIN teams t ON u.team_id = t.id AND t.status = 'active'\nINNER JOIN crm_configurations cc ON t.crm_id = cc.id\nWHERE u.status = 1\n AND u.deleted_at IS NULL\n AND u.crm_required = 1\n# AND u.team_id = 1\n AND p.id IS NULL -- Move this condition to WHERE clause\nORDER BY u.team_id;\n\nSELECT * FROM opportunities WHERE id = 20002609;\nselect * from teams where id = 1122; # Velatir, 29953 - christian@velatir.com\nselect * from crm_configurations where id = 1060;\nselect * from crm_layouts where crm_configuration_id = 1060;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 3596;\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 = 1122 and sa.provider = 'hubspot';\nselect * from opportunities where team_id = 1122 order by updated_at desc;\n\nselect * from crm_field_data where object_type = 'contact';\n\nSELECT * FROM activities WHERE uuid_to_bin('374fc8ed-3315-4c9f-9b25-318b7fd2928f') = uuid; # 76584262\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 = 248 and sa.provider = 'salesforce';\n\nSELECT * FROM crm_profiles where user_id = 24115; # 005QF000002CswMYAS\nSELECT * FROM users where id = 24115;\nSELECT * FROM accounts where id = 4002896;\nSELECT * FROM teams WHERE name LIKE '%adswerve%';\nSELECT * FROM opportunities where crm_configuration_id = 230 AND crm_provider_id IN (\"0069N000003GIQ9QAO\",\"0061r000019yGP9AAM\",\"0066900001S2KWlAAN\",\"0066900001TDpj2AAD\",\"0066900001b8uEwAAI\",\"0069N000001rQi0QAE\",\"006QF00000KD40mYAD\",\"006QF00000LzpRJYAZ\",\"0069N000002uomtQAA\",\"0069N000002xlMLQAY\",\"0066900001NV6ubAAD\",\"0061r00001HJp45AAD\",\"006QF00000uTlUoYAK\",\"006QF00000v0bZqYAI\");\nSELECT * FROM opportunities WHERE crm_configuration_id = 230 AND crm_provider_id = '0069N000003GIQ9QAO'; # 6272203\n\nSELECT u.id, u.email, ac.name, a.* FROM activities a\nJOIN users u ON a.user_id = u.id\nJOIN accounts ac ON a.account_id = ac.id\nWHERE\nuuid_to_bin('e3269598-b562-44fb-b5e9-9d2694dc63e0') = a.uuid or\nuuid_to_bin('66ddc3ab-4e15-45aa-af0c-248c1eece593') = a.uuid or\nuuid_to_bin('826bd328-e1cc-4213-b8d8-572454cacc07') = a.uuid;\n\nselect * from users where id = 5825;\nSELECT * FROM activities WHERE uuid_to_bin('e56aa2e8-231a-421b-ab1f-cb38ed2bf573') = uuid;\n\nselect * from activities where uuid_to_bin('91e13b2f-2d1b-45f8-b1fd-1141b6563782') = uuid;\n19594, 862\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 = 862 and sa.provider = 'salesforce';\n\nselect * from automated_reports where id = 36;\nselect ar.frequency, r.*, ar.* from automated_report_results r\njoin automated_reports ar on r.report_id = ar.id\nwhere ar.frequency != 'one_off';\n\nselect s.* from activity_searches s join users u ON s.user_id = u.id where u.team_id = 882;\nselect * from nudges n where n.activity_search_id\n\nselect * from teams where created_at > '2026-03-09';\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 1065; # 1065\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 3617;\n\nselect * from users where team_id = 1 and name like '%Lukas%'; # 7160\n\nSELECT * FROM teams WHERE id = 575;\nselect * from opportunities where team_id = 575;\nSELECT * FROM teams WHERE name LIKE '%Integrum ESG%'; # 1126, 1065,\nselect * from opportunities where team_id = 1126;\nSELECT * FROM teams WHERE name LIKE '%Base%'; # 1125, 1063,\nselect * from opportunities where team_id = 1125;\nselect * from contacts c\nwhere c.team_id = 882;\n\nSELECT * FROM activities WHERE id = 76822967;\nSELECT * FROM crm_profiles WHERE user_id = 15440;\nSELECT * FROM crm_profiles WHERE crm_configuration_id = 555;\nSELECT * FROM crm_configurations WHERE id = 555;\nSELECT * FROM users WHERE id = 15440; # team. 581, gr. 15440, pl. 3911, act. field 162182\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 = 581 and sa.provider = 'salesforce';\n\nSELECT * FROM automated_report_results order by id desc;\n\nselect * from features;\nselect * from team_features where feature_id = 40;\n\nselect * from teams where id = 556;\n\nselect * from automated_reports;\nwhere id = 54; # 4fdd41f6-dcf0-30d0-b339-7345381b6044 , [\"pdf\",\"podcast\"]\nSELECT * FROM automated_report_results WHERE uuid_to_bin('822fa41b-afd3-43a9-a248-86b0e36f3131') = uuid;\nselect * from automated_report_results order by id desc;\nSELECT * FROM automated_report_results WHERE id = 1919;\n\nselect * from automated_report_results WHERE report_id = 54;\n\nselect * from opportunities where id = 7594349;\n\nSELECT * FROM teams WHERE name LIKE '%Les%'; # 711, 692, 16067 - jiminnyintegration@lesmills.com\nselect * from playbooks where team_id = 711; # event 226147\nSELECT * FROM playbook_categories WHERE playbook_id = 5515;\nSELECT * FROM crm_fields WHERE crm_configuration_id = 692 and object_type = 'event';\nSELECT * FROM crm_fields WHERE id = 226147;\nSELECT * FROM crm_field_values WHERE crm_field_id = 226147;\n\nSELECT * FROM crm_configurations WHERE id = 692;\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 = 711 and sa.provider = 'salesforce';\n\nSELECT * FROM crm_profiles cp JOIN users u on u.id = cp.user_id WHERE u.team_id = 711;\n\nselect * from leads;\n\nselect * from calendars;\n\nSELECT\n t.id AS team_id,\n t.name,\n LOWER(SUBSTRING_INDEX(c.calendar_provider_id, '@', -1)) AS calendar_domain\nFROM teams t\nJOIN users u ON u.team_id = t.id\nJOIN calendars c ON c.user_id = u.id AND c.status = 'active' AND c.calendar_provider_id LIKE '%@%'\nLEFT JOIN team_domains td\n ON td.team_id = t.id\n AND td.deleted_at IS NULL\n AND td.domain = LOWER(SUBSTRING_INDEX(c.calendar_provider_id, '@', -1))\nGROUP BY t.id, t.name, calendar_domain\nORDER BY t.name, calendar_domain;\n\nselect * from users u join calendars c on c.user_id = u.id\nwhere u.team_id = 882;\n\n\nselect * from activities where id = 74049485; # team 563 crm 537\nselect * from activities where id = 73272382; # team 563 crm 537\nselect * from activities where id = 64400389; # team 563 crm 537\nselect * from activities where id = 58081273; # team 563 crm 537\nselect * from activities where id = 54520297; # team 563 crm 537\nselect * from participants where activity_id = 58081273;\n\nselect * from activities where crm_configuration_id = 537 and provider = 'aircall'\nand account_id = 19003658 order by updated_at desc;\n\nselect * from contacts where crm_configuration_id = 537 and id = 35957759;\nselect * from accounts where crm_configuration_id = 537 and id = 19003658;\n\nselect * from automated_report_results where id = 1976;\nselect * from automated_reports where id = 583;\nselect * from activity_searches where id = 87714;\nselect * from activity_search_filters where activity_search_id = 87714;\n\nSELECT * FROM activities WHERE uuid_to_bin('8827f672-202d-4162-9d04-73ff5f0566a9') = uuid\nor uuid_to_bin('47842446-af51-4bcb-854f-cc6560290101') = uuid;\n\nSELECT * FROM crm_configurations WHERE provider = 'hubspot';\nselect * from rate_limits;\n\nselect * from automated_report_results where media_type = 'pdf' and status = 2\nand id IN (18, 1872);\nselect * from automated_reports where id = 54;\nSELECT * FROM users WHERE id IN (24623,29443,29613);\n\nSELECT * FROM automated_report_results WHERE uuid_to_bin('822fa41b-afd3-43a9-a248-86b0e36f3131') = uuid;","depth":4,"on_screen":true,"value":"SELECT * FROM teams WHERE name LIKE '%litify%'; # 1069, 994, 24993\nSELECT * FROM users WHERE id = 25061;\nSELECT * FROM crm_profiles WHERE crm_configuration_id = 994;\nSELECT * FROM crm_profiles WHERE user_id = 25061;\n\nselect * from crm_configurations where id = 834;\nSELECT * FROM teams WHERE id = 882;\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 = 882 and sa.provider = 'hubspot';\n\nSELECT * FROM crm_configurations where id = 882; # 933 - GoGlobal\nSELECT * FROM opportunities WHERE team_id = 933 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 = 933 and sa.provider = 'hubspot';\n\nSELECT * FROM crm_configurations WHERE provider = 'hubspot' and crm_provider_id = 7270388;\n\nSELECT * FROM contacts where crm_configuration_id = 834;\nSELECT * FROM opportunities WHERE team_id = 933\n# AND crm_provider_id IN ('20131586060','46017317898','52543911090','53451356564','54101251892','54323768459');\nAND id IN (8482561,18352941,19042734,19232139,19445140,19472541);\nSELECT * FROM opportunity_contacts\nWHERE opportunity_id IN (8482561,18352941,19042734,19232139,19445140,19472541);\n\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 485; #\nSELECT * FROM opportunities WHERE team_id = 933 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 = 933 and sa.provider = 'hubspot';\n\nselect crm.provider, l.* from leads l join crm_configurations crm on l.crm_configuration_id = crm.id\nwhere crm.provider NOT IN ('salesforce', 'integration-app', 'bullhorn', 'copper')\n# and l.converted_at IS NOT NULL\n;\n\n# ********************************************************************\nSELECT * FROM activities a WHERE type IN ('email-inbound', 'email-outbound')\nand opportunity_id IS NULL\norder by id desc;\n\nSELECT * FROM teams WHERE id = 604; # 598\nSELECT * FROM activities WHERE id = 74410828; # chelseaw@allvoices.co\nSELECT * FROM accounts WHERE id = 20068382;\nSELECT * FROM accounts WHERE id = 35186038;\n\nSELECT * FROM contacts WHERE team_id = 852 and updated_at > '2026-01-23 12:30: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 = 559 and sa.provider = 'hubspot';\n\nSELECT * FROM activities WHERE uuid_to_bin('cb6342b6-a183-401c-b0af-ede92b2ae763') = uuid;\nselect * from sidekick_settings where team_id = 781;\n\nSELECT * FROM crm_configurations where provider = 'hubspot' and crm_provider_id = 26651871; # Teya\nSELECT * FROM crm_configurations where provider = 'hubspot' and crm_provider_id = 7562435;\nSELECT * FROM crm_configurations where provider = 'hubspot' and crm_provider_id = 8420347; # opflit 2100\n\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 711;\nSELECT * FROM activities where crm_configuration_id = 711 and crm_provider_id IS NULL\nand is_internal = 0 and status = 'completed'\norder by id desc;\n\nSELECT * FROM crm_layout_entities\nWHERE crm_layout_id IN (2352, 2353);\n;\n\nSELECT * FROM crm_configurations where provider = 'hubspot' and id = 530;\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 = 'hubspot';\n\nSELECT * FROM activities WHERE uuid_to_bin('c6ca4b22-7738-4563-a95d-b8a9598924ae') = uuid;\nSELECT * FROM activities WHERE uuid_to_bin('442abb2b-28bd-4be8-9c25-19e9bf02766d') = uuid;\nselect * from contacts\nwhere crm_configuration_id = 530\nand crm_provider_id = 872252;\n\nselect * from activities where crm_configuration_id = 530\nand user_id = 14343 and type like '%softphone%'\nand created_at between '2026-01-28 15:00:00' and '2026-01-28 15:10:00';\n\nSELECT * FROM crm_configurations where provider = 'hubspot' and crm_provider_id = 25666868; # Teya\nSELECT * FROM crm_configurations where provider = 'hubspot' and crm_provider_id = 8646335; # Teya\nSELECT * FROM crm_configurations where provider = 'hubspot' and crm_provider_id IN (5933397);\n\n\nSELECT t.name, t.id, t.owner_id, c.id, c.provider, c.crm_base_url FROM teams t\nJOIN crm_configurations c ON t.id = c.team_id\nWHERE t.status = 'active';\n\nSELECT * FROM teams where id = 1091;\nSELECT * FROM crm_configurations where team_id = 1091;\nSELECT * FROM activity_providers where team_id = 1091;\nSELECT * FROM activities where crm_configuration_id = 1024 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;\n\n\nSELECT * FROM teams WHERE name LIKE '%Leadventure%';\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 = 1091 and sa.provider = 'salesforce';\n\nSELECT * FROM teams WHERE name LIKE '%Wilson%'; # 862, 812\nSELECT * FROM teams where id = 862;\nSELECT * FROM crm_configurations where team_id = 862;\nSELECT * FROM activity_providers where team_id = 862;\nSELECT * FROM activities where crm_configuration_id = 812 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;\n\n\nSELECT t.id, crm.id, crm.provider, ap.* FROM teams t\njoin crm_configurations crm on t.id = crm.team_id\njoin activity_providers ap on t.id = ap.team_id\nwhere t.status = 'active' and ap.is_enabled = 1\nand crm.provider = 'hubspot'\nand ap.provider NOT IN ('hubspot', 'aircall', 'uploader', 'gong', 'twilio', 'zoom-bot', 'google-meet', 'ms-teams',\n 'outreach', 'close', 'ringcentral', 'dialpad', 'zoom-phone');\n\nSELECT * FROM teams where id = 1068;\nSELECT * FROM crm_configurations where team_id = 1068;\nSELECT * FROM activity_providers where team_id = 1068;\n\nSELECT * FROM activities a\nwhere crm_configuration_id = 993 and type IN ('softphone', 'softphone-outbound')\nand a.provider NOT IN ('hubspot', 'uploader', 'gong', 'twilio', 'google-meet', 'ms-teams','close'\n )\n# and telephony_provider_id = '019c1131-a22f-4792-b9ea-20adf6a02ed0'\norder by a.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 = 1068 and sa.provider = 'hubspot';\n\n# ********************************************************************\n# ********************************************************************\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 882; # 933 - GoGlobal , portalId: 6017093\nSELECT * FROM opportunities WHERE team_id = 933 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 933 and updated_at > '2026-02-06 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 = 933 and sa.provider = 'hubspot';\n\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 834; # 882 - AnyVan , portalId: 5468262\nSELECT * FROM contacts WHERE crm_configuration_id = 834 and updated_at > '2026-03-30 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE crm_configuration_id = 834 and updated_at > '2026-03-04 08: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 = 882 and sa.provider = 'hubspot';\nselect * from crm_layouts where crm_configuration_id = 834;\nselect * from crm_layout_entities where crm_layout_id = 2780;\nselect * from crm_fields where id IN (321153,321192,321193,321194);\n\nSELECT * FROM opportunities WHERE crm_configuration_id = 834 and id = 10993426;\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 988; # 1057 - Teya (543ce4f4-168c-4571-91ea-5b35c253f06f) , portalId: 26651871\nSELECT * FROM opportunities WHERE team_id = 1057 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 1057 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 = 1057 and sa.provider = 'hubspot';\n\nSELECT * FROM crm_configurations where id = 533; # 559 - Connectd , portalId: 6710988\nSELECT * FROM opportunities WHERE team_id = 559 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 559 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 801; # 852 - Rise Vision , portalId: 2700250\nSELECT * FROM opportunities WHERE team_id = 852 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 852 and updated_at > '2026-02-04 00:00:00' order by updated_at desc; # 6th last\n\nSELECT * FROM crm_configurations where id = 962; # 1034 - evergrowth.io , portalId: 143180990\nSELECT * FROM opportunities WHERE team_id = 1034 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 1034 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\n\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 1037; # 1102 - Jibble , portalId: 6649755\nSELECT * FROM opportunities WHERE team_id = 1102 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 1102 and updated_at > '2026-02-04 12:30:00' order by updated_at desc; # 8\n\nSELECT * FROM crm_configurations where id = 1015; # 1049 - Travefy , portalId: 48904401\nSELECT * FROM opportunities WHERE team_id = 1049 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 1049 and updated_at > '2026-02-04 12:30:00' order by updated_at desc; # 20\n\nSELECT * FROM crm_configurations where id = 64; # 70 - SalaryFinance , portalId: 3404115\nSELECT * FROM opportunities WHERE team_id = 70 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 70 and updated_at > '2026-02-04 12:30:00' order by updated_at desc; # 6th last\n\nSELECT * FROM crm_configurations where id = 802; # 853 - Street Group , portalId: 7658438\nSELECT * FROM opportunities WHERE team_id = 853 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 853 and updated_at > '2026-02-04 12:30:00' order by updated_at desc; # 10\n\nSELECT * FROM crm_configurations where id = 872; # 921 - In Professional Development , portalId: 9238273\nSELECT * FROM opportunities WHERE team_id = 921 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 921 and updated_at > '2026-02-04 12:30:00' order by updated_at desc; # 2\n\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 550; # 576 - SeedLegals , portalId: 3028661\nSELECT * FROM opportunities WHERE team_id = 576 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 576 and updated_at > '2026-02-05 14:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 989; # 1058 - rtaoutdoor.com , portalId: 22371204\nSELECT * FROM opportunities WHERE team_id = 1058 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 1058 and updated_at > '2026-02-05 14:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 896; # 946 - Mintago , portalId: 6621281\nSELECT * FROM opportunities WHERE team_id = 946 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 946 and updated_at > '2026-02-05 14:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 617; # 641 - PCS , portalId: 5244937\nSELECT * FROM opportunities WHERE team_id = 641 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 641 and updated_at > '2026-02-05 14:00:00' order by updated_at desc; # 7th\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 649; # 670 - Eventeny , portalId: 4492849\nSELECT * FROM opportunities WHERE team_id = 670 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 670 and updated_at > '2026-02-09 08:00:00' order by updated_at desc; #\n\nSELECT * FROM crm_configurations where id = 48; # 51 - CleanCloud , portalId: 4373137\nSELECT * FROM opportunities WHERE team_id = 51 and updated_at > '2026-03-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 51 and updated_at > '2026-02-09 08:00:00' order by updated_at desc;\nselect * from users where team_id = 51; # 7783\nSELECT * FROM groups WHERE uuid_to_bin('8a8d2cb6-8b55-4fa3-8b5c-5f0e3d8de59a') = uuid; # 1130\nselect * from activity_searches where user_id = 7783;\nselect * from activity_search_filters where activity_search_id IN (32291, 32292);\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 = 272; # 290 - Bonham & Brook , portalId: 5705856\nSELECT * FROM opportunities WHERE team_id = 290 and updated_at > '2026-02-05 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 290 and updated_at > '2026-02-09 08:00:00' order by updated_at desc; # 6th\n# ********************************************************************\nSELECT * FROM crm_configurations where provider = 'hubspot';\nSELECT * FROM crm_configurations where id = 1056; # 1119 - Chromatic , portalId: 45602133\nSELECT * FROM opportunities WHERE team_id = 1119 and remotely_created_at > '2026-02-01 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 1119 and updated_at > '2026-02-09 09:00:00' order by updated_at desc; # null\n# ********************************************************************\n\nselect * from contacts where crm_provider_id = '003Uu00000ojD4NIAU';\nselect\n cp.*\n# DISTINCT t.id\n# cp.id, cp.user_id, t.id, cp.crm_configuration_id, cp.contact_fields\nFROM crm_profiles cp\nJOIN crm_configurations crm on crm.id = cp.crm_configuration_id\nJOIN users u on u.id = cp.user_id\nJOIN teams t ON t.id = crm.team_id\nWHERE crm.provider = 'salesforce' and t.status = 'active'\n and cp.archived_at IS NULL and u.deleted_at IS NULL\n and t.id NOT IN (1093)\n and t.id = 2\n and cp.contact_fields IS NULL;\n# and c.crm_provider_id = '003Uu00000ojD4NIAU';\n\nSELECT * FROM users WHERE id = 26484;\nSELECT * FROM crm_profiles WHERE user_id = 26484;\nSELECT * FROM social_accounts WHERE sociable_id = 26484;\nSELECT * FROM crm_configurations where provider = 'salesforce';\nselect * from users where id IN (10022, 10403);\nselect * from users where team_id IN (526);\nselect * from teams where id IN (526, 532);\nselect * from crm_configurations where id IN (500, 516);\nselect * from crm_profiles where crm_configuration_id IN (500, 516) and user_id IN (10022, 10403);\nselect * from contacts where crm_configuration_id IN (500, 516) and crm_provider_id = '003Uu00000ojD4NIAU';\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 = 526 and sa.provider = 'salesforce';\nselect * from team_settings where team_id IN (526, 532);\n\nselect * from users where id IN (22824);\nselect * from crm_profiles where crm_configuration_id IN (1026);\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 = 1093 and sa.provider = 'salesforce';\n\nselect * from teams where id = 1099;\nselect * from users where id = 29643\n\nselect * from activity_processing_states;\n\nSELECT * FROM teams where name LIKE '%Fare%'; # 233\nSELECT * FROM opportunities where crm_configuration_id = 215\n# and crm_provider_id = 'oppo_ogESZf2P50nDrd1nGPvKDXeA6sSaTN5v51Lp4ayVzKR'\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 = 1088 and sa.provider = 'hubspot';\n\nSELECT * FROM teams order by updated_at DESC\nSELECT * FROM crm_configurations WHERE id = 1019; # SimpleConsign 1088 - no social account\n\nselect * from crm_configurations where provider = 'pipedrive';\n\nselect * from teams where id = 957;\nselect * from crm_configurations where id = 957;\n\nSELECT * FROM teams WHERE name LIKE '%Prolific%'; # 544, 518, 10743\nSELECT * FROM opportunities where crm_configuration_id = 518 order by id desc;\n\nselect * from users where team_id = 1; # 26726 - Gabriela Dureva\nSELECT * FROM opportunities where user_id = 26726; # 16834447 - Prolific\nselect * from activities where user_id = 26726 order by id desc;\nselect * from contacts where crm_configuration_id = 1\nand email IN ('charlotte.ward@prolific.com', 'frankie.bryant@prolific.com'); # 2094416, 2093620\nSELECT * FROM contacts WHERE id = 6284931;\n\nSELECT p.* FROM activities a JOIN participants p ON a.id = p.activity_id\nWHERE a.user_id = 26726 and p.lead_id IN (2094416, 2093620) and a.created_at > '2026-01-01 00:00:00' order by p.email;\n\nselect * from activities where id IN (75509259,75509261,75509261,75511034,75026464,75517602,75517605);\nselect * from crm_configurations where id = 1;\n\n43801692-1aeb-32ce-acba-5b80a479701a\n44c3c9cf-6f5e-75f3-8179-bc9f75dd2b1b\n405975c0-b3d0-7aaa-821f-09d59cae6dd1\n4caf848d-4bed-2299-b248-7788d41f9fca\n49bedc3f-f196-eef3-89c3-dea6a3b4aa63\n43420989-a09d-b8f8-9806-c8bbf7a02aac\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 = 1 and sa.provider = 'salesforce';\n\nSELECT * FROM activities WHERE id = 75461988;\n\nSELECT * FROM activities WHERE uuid_to_bin('d6c5052e-e972-49e9-8912-26f2f7d6c5f6') = uuid;\n\nselect * from contacts where 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 users where id = 21047;\nSELECT * FROM crm_configurations WHERE id = 892;\nSELECT * FROM teams WHERE id = 942;\nselect * from opportunities where team_id = 942 order by updated_at desc;\nselect * from contacts where team_id = 942 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 = 942 and sa.provider = 'hubspot';\n\nSELECT * FROM opportunities where team_id = 1 and crm_provider_id IN ('006Pq00000NeH6XIAV', '006Pq000007z8kdIAA'); # 10697889, 6621430\nSELECT * FROM crm_configurations WHERE id = 1;\nSELECT * FROM teams WHERE crm_id = 1;\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 = 1 and sa.provider = 'salesforce';\n\nselect id, user_id, opportunity_fields from crm_profiles where crm_configuration_id = 1\nSELECT * FROM opportunities where team_id = 1 order by updated_at desc; # 10697889, 6621430\n\nselect * from teams where id = 852;\nselect * from groups where id = 2286;\nselect * from sidekick_settings where team_id = 852;\nselect * from default_activity_types where team_id = 852;\n\n\nSELECT cc.provider, cc.id, p.id, u.*\nFROM users u\nLEFT JOIN crm_profiles p ON u.id = p.user_id AND p.id IS NULL -- no profile\nINNER JOIN teams t ON u.team_id = t.id AND t.status = 'active' -- team is active\nINNER JOIN crm_configurations cc ON t.crm_id = cc.id\nWHERE u.status = 1 AND u.deleted_at IS NULL\nAND u.crm_required = 1\nAND u.team_id = 1\nORDER BY u.team_id;\n\nSELECT * FROM crm_profiles cp where cp.crm_configuration_id = 1 and cp.user_id IN (\n18481\n );\n\nSELECT cc.provider, cc.id, p.id, u.*\nFROM users u\nLEFT JOIN crm_profiles p ON u.id = p.user_id\nINNER JOIN teams t ON u.team_id = t.id AND t.status = 'active'\nINNER JOIN crm_configurations cc ON t.crm_id = cc.id\nWHERE u.status = 1\n AND u.deleted_at IS NULL\n AND u.crm_required = 1\n# AND u.team_id = 1\n AND p.id IS NULL -- Move this condition to WHERE clause\nORDER BY u.team_id;\n\nSELECT * FROM opportunities WHERE id = 20002609;\nselect * from teams where id = 1122; # Velatir, 29953 - christian@velatir.com\nselect * from crm_configurations where id = 1060;\nselect * from crm_layouts where crm_configuration_id = 1060;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 3596;\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 = 1122 and sa.provider = 'hubspot';\nselect * from opportunities where team_id = 1122 order by updated_at desc;\n\nselect * from crm_field_data where object_type = 'contact';\n\nSELECT * FROM activities WHERE uuid_to_bin('374fc8ed-3315-4c9f-9b25-318b7fd2928f') = uuid; # 76584262\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 = 248 and sa.provider = 'salesforce';\n\nSELECT * FROM crm_profiles where user_id = 24115; # 005QF000002CswMYAS\nSELECT * FROM users where id = 24115;\nSELECT * FROM accounts where id = 4002896;\nSELECT * FROM teams WHERE name LIKE '%adswerve%';\nSELECT * FROM opportunities where crm_configuration_id = 230 AND crm_provider_id IN (\"0069N000003GIQ9QAO\",\"0061r000019yGP9AAM\",\"0066900001S2KWlAAN\",\"0066900001TDpj2AAD\",\"0066900001b8uEwAAI\",\"0069N000001rQi0QAE\",\"006QF00000KD40mYAD\",\"006QF00000LzpRJYAZ\",\"0069N000002uomtQAA\",\"0069N000002xlMLQAY\",\"0066900001NV6ubAAD\",\"0061r00001HJp45AAD\",\"006QF00000uTlUoYAK\",\"006QF00000v0bZqYAI\");\nSELECT * FROM opportunities WHERE crm_configuration_id = 230 AND crm_provider_id = '0069N000003GIQ9QAO'; # 6272203\n\nSELECT u.id, u.email, ac.name, a.* FROM activities a\nJOIN users u ON a.user_id = u.id\nJOIN accounts ac ON a.account_id = ac.id\nWHERE\nuuid_to_bin('e3269598-b562-44fb-b5e9-9d2694dc63e0') = a.uuid or\nuuid_to_bin('66ddc3ab-4e15-45aa-af0c-248c1eece593') = a.uuid or\nuuid_to_bin('826bd328-e1cc-4213-b8d8-572454cacc07') = a.uuid;\n\nselect * from users where id = 5825;\nSELECT * FROM activities WHERE uuid_to_bin('e56aa2e8-231a-421b-ab1f-cb38ed2bf573') = uuid;\n\nselect * from activities where uuid_to_bin('91e13b2f-2d1b-45f8-b1fd-1141b6563782') = uuid;\n19594, 862\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 = 862 and sa.provider = 'salesforce';\n\nselect * from automated_reports where id = 36;\nselect ar.frequency, r.*, ar.* from automated_report_results r\njoin automated_reports ar on r.report_id = ar.id\nwhere ar.frequency != 'one_off';\n\nselect s.* from activity_searches s join users u ON s.user_id = u.id where u.team_id = 882;\nselect * from nudges n where n.activity_search_id\n\nselect * from teams where created_at > '2026-03-09';\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 1065; # 1065\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 3617;\n\nselect * from users where team_id = 1 and name like '%Lukas%'; # 7160\n\nSELECT * FROM teams WHERE id = 575;\nselect * from opportunities where team_id = 575;\nSELECT * FROM teams WHERE name LIKE '%Integrum ESG%'; # 1126, 1065,\nselect * from opportunities where team_id = 1126;\nSELECT * FROM teams WHERE name LIKE '%Base%'; # 1125, 1063,\nselect * from opportunities where team_id = 1125;\nselect * from contacts c\nwhere c.team_id = 882;\n\nSELECT * FROM activities WHERE id = 76822967;\nSELECT * FROM crm_profiles WHERE user_id = 15440;\nSELECT * FROM crm_profiles WHERE crm_configuration_id = 555;\nSELECT * FROM crm_configurations WHERE id = 555;\nSELECT * FROM users WHERE id = 15440; # team. 581, gr. 15440, pl. 3911, act. field 162182\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 = 581 and sa.provider = 'salesforce';\n\nSELECT * FROM automated_report_results order by id desc;\n\nselect * from features;\nselect * from team_features where feature_id = 40;\n\nselect * from teams where id = 556;\n\nselect * from automated_reports;\nwhere id = 54; # 4fdd41f6-dcf0-30d0-b339-7345381b6044 , [\"pdf\",\"podcast\"]\nSELECT * FROM automated_report_results WHERE uuid_to_bin('822fa41b-afd3-43a9-a248-86b0e36f3131') = uuid;\nselect * from automated_report_results order by id desc;\nSELECT * FROM automated_report_results WHERE id = 1919;\n\nselect * from automated_report_results WHERE report_id = 54;\n\nselect * from opportunities where id = 7594349;\n\nSELECT * FROM teams WHERE name LIKE '%Les%'; # 711, 692, 16067 - jiminnyintegration@lesmills.com\nselect * from playbooks where team_id = 711; # event 226147\nSELECT * FROM playbook_categories WHERE playbook_id = 5515;\nSELECT * FROM crm_fields WHERE crm_configuration_id = 692 and object_type = 'event';\nSELECT * FROM crm_fields WHERE id = 226147;\nSELECT * FROM crm_field_values WHERE crm_field_id = 226147;\n\nSELECT * FROM crm_configurations WHERE id = 692;\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 = 711 and sa.provider = 'salesforce';\n\nSELECT * FROM crm_profiles cp JOIN users u on u.id = cp.user_id WHERE u.team_id = 711;\n\nselect * from leads;\n\nselect * from calendars;\n\nSELECT\n t.id AS team_id,\n t.name,\n LOWER(SUBSTRING_INDEX(c.calendar_provider_id, '@', -1)) AS calendar_domain\nFROM teams t\nJOIN users u ON u.team_id = t.id\nJOIN calendars c ON c.user_id = u.id AND c.status = 'active' AND c.calendar_provider_id LIKE '%@%'\nLEFT JOIN team_domains td\n ON td.team_id = t.id\n AND td.deleted_at IS NULL\n AND td.domain = LOWER(SUBSTRING_INDEX(c.calendar_provider_id, '@', -1))\nGROUP BY t.id, t.name, calendar_domain\nORDER BY t.name, calendar_domain;\n\nselect * from users u join calendars c on c.user_id = u.id\nwhere u.team_id = 882;\n\n\nselect * from activities where id = 74049485; # team 563 crm 537\nselect * from activities where id = 73272382; # team 563 crm 537\nselect * from activities where id = 64400389; # team 563 crm 537\nselect * from activities where id = 58081273; # team 563 crm 537\nselect * from activities where id = 54520297; # team 563 crm 537\nselect * from participants where activity_id = 58081273;\n\nselect * from activities where crm_configuration_id = 537 and provider = 'aircall'\nand account_id = 19003658 order by updated_at desc;\n\nselect * from contacts where crm_configuration_id = 537 and id = 35957759;\nselect * from accounts where crm_configuration_id = 537 and id = 19003658;\n\nselect * from automated_report_results where id = 1976;\nselect * from automated_reports where id = 583;\nselect * from activity_searches where id = 87714;\nselect * from activity_search_filters where activity_search_id = 87714;\n\nSELECT * FROM activities WHERE uuid_to_bin('8827f672-202d-4162-9d04-73ff5f0566a9') = uuid\nor uuid_to_bin('47842446-af51-4bcb-854f-cc6560290101') = uuid;\n\nSELECT * FROM crm_configurations WHERE provider = 'hubspot';\nselect * from rate_limits;\n\nselect * from automated_report_results where media_type = 'pdf' and status = 2\nand id IN (18, 1872);\nselect * from automated_reports where id = 54;\nSELECT * FROM users WHERE id IN (24623,29443,29613);\n\nSELECT * FROM automated_report_results WHERE uuid_to_bin('822fa41b-afd3-43a9-a248-86b0e36f3131') = uuid;","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Project","depth":3,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Project","depth":3,"bounds":{"left":0.011968086,"top":0.047885075,"width":0.024268618,"height":0.024740623},"on_screen":true,"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},"on_screen":false,"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},"on_screen":false,"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},"on_screen":false,"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},"on_screen":false,"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},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"app ~/jiminny/app, folder","depth":6,"bounds":{"left":0.020944148,"top":0.0,"width":0.045877658,"height":0.017557861},"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":".circleci, folder","depth":7,"bounds":{"left":0.027260639,"top":0.0,"width":0.023936171,"height":0.017557861},"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":".cursor, folder","depth":7,"bounds":{"left":0.027260639,"top":0.0,"width":0.022273935,"height":0.017557861},"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":".github","depth":7,"bounds":{"left":0.027260639,"top":0.0023942539,"width":0.022273935,"height":0.017557861},"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":".sonarlint, folder","depth":7,"bounds":{"left":0.027260639,"top":0.019952115,"width":0.026928192,"height":0.017557861},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":".vscode, folder","depth":7,"bounds":{"left":0.027260639,"top":0.037509978,"width":0.024268618,"height":0.017557861},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":".windsurf, folder","depth":7,"bounds":{"left":0.027260639,"top":0.055067837,"width":0.026928192,"height":0.017557861},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"app, sources root","depth":7,"bounds":{"left":0.027260639,"top":0.0726257,"width":0.015957447,"height":0.017557861},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Actions","depth":8,"bounds":{"left":0.03357713,"top":0.090183556,"width":0.023603724,"height":0.017557861},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"InviteUserToTeamAction.php, class","depth":9,"bounds":{"left":0.039893616,"top":0.10774142,"width":0.06781915,"height":0.017557861},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"MarkUserAsOnboardableAction.php, class","depth":9,"bounds":{"left":0.039893616,"top":0.12529927,"width":0.08178192,"height":0.017557861},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"SyncRecordingFlagsAction.php, class","depth":9,"bounds":{"left":0.039893616,"top":0.14285715,"width":0.07180851,"height":0.017557861},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"UpdateTeamMemberAction.php, class","depth":9,"bounds":{"left":0.039893616,"top":0.16041501,"width":0.073803194,"height":0.017557861},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"UpdateUserRolesAction.php, class","depth":9,"bounds":{"left":0.039893616,"top":0.17797287,"width":0.06582447,"height":0.017557861},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Component","depth":8,"bounds":{"left":0.03357713,"top":0.19553073,"width":0.031914894,"height":0.017557861},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Acl","depth":9,"bounds":{"left":0.039893616,"top":0.21308859,"width":0.01462766,"height":0.017557861},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"ActionItems","depth":9,"bounds":{"left":0.039893616,"top":0.23064645,"width":0.032579787,"height":0.017557861},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Activity","depth":9,"bounds":{"left":0.039893616,"top":0.2482043,"width":0.023603724,"height":0.017557861},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"ActivityAnalytics","depth":9,"bounds":{"left":0.039893616,"top":0.26576218,"width":0.042220745,"height":0.017557861},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"ActivitySearch","depth":9,"bounds":{"left":0.039893616,"top":0.28332004,"width":0.037898935,"height":0.017557861},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"AiActivityType","depth":9,"bounds":{"left":0.039893616,"top":0.3008779,"width":0.037898935,"height":0.017557861},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"AiAutomation","depth":9,"bounds":{"left":0.039893616,"top":0.31843576,"width":0.03557181,"height":0.017557861},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"AiCallScoring","depth":9,"bounds":{"left":0.039893616,"top":0.33599362,"width":0.03523936,"height":0.017557861},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"AskAnything","depth":9,"bounds":{"left":0.039893616,"top":0.35355148,"width":0.033909574,"height":0.017557861},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Dtos","depth":10,"bounds":{"left":0.046210106,"top":0.37110934,"width":0.01761968,"height":0.017557861},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Events","depth":10,"bounds":{"left":0.046210106,"top":0.3886672,"width":0.021941489,"height":0.017557861},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"AskAnythingPromptService.php, class","depth":10,"bounds":{"left":0.046210106,"top":0.40622506,"width":0.0731383,"height":0.017557861},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"HistoryService.php, class","depth":10,"bounds":{"left":0.046210106,"top":0.4237829,"width":0.04720745,"height":0.017557861},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"AskJiminnyAi","depth":9,"bounds":{"left":0.039893616,"top":0.44134077,"width":0.03523936,"height":0.017557861},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"AWS","depth":9,"bounds":{"left":0.039893616,"top":0.45889863,"width":0.017952127,"height":0.017557861},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"BillingManagement","depth":9,"bounds":{"left":0.039893616,"top":0.4764565,"width":0.046875,"height":0.017557861},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Cache","depth":9,"bounds":{"left":0.039893616,"top":0.49401435,"width":0.021276595,"height":0.017557861},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"CoachingFeedback","depth":9,"bounds":{"left":0.039893616,"top":0.51157224,"width":0.047539894,"height":0.017557861},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Country","depth":9,"bounds":{"left":0.039893616,"top":0.5291301,"width":0.024601065,"height":0.017557861},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"CustomerApi","depth":9,"bounds":{"left":0.039893616,"top":0.54668796,"width":0.034574468,"height":0.017557861},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Database","depth":9,"bounds":{"left":0.039893616,"top":0.5642458,"width":0.027593086,"height":0.017557861},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Datadog","depth":9,"bounds":{"left":0.039893616,"top":0.5818037,"width":0.025598405,"height":0.017557861},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"DateTime","depth":9,"bounds":{"left":0.039893616,"top":0.59936154,"width":0.027925532,"height":0.017557861},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"DealInsights","depth":9,"bounds":{"left":0.039893616,"top":0.6169194,"width":0.03324468,"height":0.017557861},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"DealRisks","depth":9,"bounds":{"left":0.039893616,"top":0.63447726,"width":0.027925532,"height":0.017557861},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"ElasticSearch","depth":9,"bounds":{"left":0.039893616,"top":0.6520351,"width":0.035904255,"height":0.017557861},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Eloquent","depth":9,"bounds":{"left":0.039893616,"top":0.669593,"width":0.025930852,"height":0.017557861},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Encoding","depth":9,"bounds":{"left":0.039893616,"top":0.68715084,"width":0.027260639,"height":0.017557861},"on_screen":true,"role_description":"text"}]...
|
2576053587826717010
|
1065678636275087173
|
click
|
accessibility
|
NULL
|
Project: faVsco.js, menu
master, menu
Start Listen Project: faVsco.js, menu
master, 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
1
Previous Highlighted Error
Next Highlighted Error
<?php
namespace Jiminny\Actions;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Str;
use Jiminny\Component\Acl\RoleChangeContext;
use Jiminny\Component\Acl\RoleChangeLogger;
use Jiminny\Component\Acl\RoleChangeType;
use Jiminny\Contracts\Acl\RoleRepositoryInterface;
use Jiminny\DTO\Invitation\UserInvitationDTO;
use Jiminny\Models\Invitation;
use Jiminny\Models\Role;
use Jiminny\Models\User;
use Jiminny\Notifications\Channels\EmailNotifiable;
use Jiminny\Notifications\OwnerInvitedToTrial;
use Jiminny\Notifications\UserInvitedToTeam;
use Jiminny\Notifications\UserInvitedToTeamWithEmailOnly;
class InviteUserToTeamAction
{
public function __construct(
private RoleRepositoryInterface $roleRepository,
private RoleChangeLogger $roleChangeLogger,
) {
}
public function execute(UserInvitationDTO $dto): void
{
/** @var Invitation $invitation */
$invitation = Invitation::updateOrCreate(
[
'team_id' => $dto->teamId,
'email' => $dto->email,
],
[
'group_id' => $dto->groupId,
'secondary_email' => $dto->secondaryEmail,
'crm_required' => $dto->crmRequired,
'token' => Str::random(40),
'is_owner' => $dto->isOwner,
]
)->loadMissing(['team']);
$invitation->roles()->sync($dto->roleIds);
$notifiable = new EmailNotifiable($invitation->email, $invitation->getTeam());
$logMessage = 'User invited to trial';
if ($invitation->getTeam()->owner_id === null) {
$notifiable->notifyNow(new OwnerInvitedToTrial($invitation));
$logMessage = 'Owner invited to trial';
} else {
$notifiable->notifyNow(new UserInvitedToTeam($invitation));
}
collect($dto->roleIds)
->map(fn (int $roleId): Role => $this->roleRepository->get($roleId))
->each(function (Role $role) use ($dto, $invitation): void {
$this->roleChangeLogger->log(
$dto->currentUser,
$invitation,
$role,
$invitation->wasRecentlyCreated
? RoleChangeType::INVITE_USER
: RoleChangeType::RESEND_INVITATION,
RoleChangeContext::APP,
);
});
Log::info($logMessage, [
'teamId' => $invitation->team_id,
'teamName' => $invitation->getTeam()->name,
'email' => $invitation->email,
'crmRequired' => $invitation->crm_required ? 'yes' : 'no',
]);
$invitation->touch();
}
public function executeWithEmailOnly(User $user): void
{
$notifiable = new EmailNotifiable($user->getEmailAddress(), $user->getTeam());
$notifiable->notifyNow(new UserInvitedToTeamWithEmailOnly($user));
}
}
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
40
1
40
64
Previous Highlighted Error
Next Highlighted Error
SELECT * FROM teams WHERE name LIKE '%litify%'; # 1069, 994, 24993
SELECT * FROM users WHERE id = 25061;
SELECT * FROM crm_profiles WHERE crm_configuration_id = 994;
SELECT * FROM crm_profiles WHERE user_id = 25061;
select * from crm_configurations where id = 834;
SELECT * FROM teams WHERE id = 882;
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 = 882 and sa.provider = 'hubspot';
SELECT * FROM crm_configurations where id = 882; # 933 - GoGlobal
SELECT * FROM opportunities WHERE team_id = 933 order by updated_at desc;
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 = 933 and sa.provider = 'hubspot';
SELECT * FROM crm_configurations WHERE provider = 'hubspot' and crm_provider_id = 7270388;
SELECT * FROM contacts where crm_configuration_id = 834;
SELECT * FROM opportunities WHERE team_id = 933
# AND crm_provider_id IN ('20131586060','46017317898','52543911090','53451356564','54101251892','54323768459');
AND id IN (8482561,18352941,19042734,19232139,19445140,19472541);
SELECT * FROM opportunity_contacts
WHERE opportunity_id IN (8482561,18352941,19042734,19232139,19445140,19472541);
# [PASSWORD_DOTS]
SELECT * FROM crm_configurations where id = 485; #
SELECT * FROM opportunities WHERE team_id = 933 order by updated_at desc;
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 = 933 and sa.provider = 'hubspot';
select crm.provider, l.* from leads l join crm_configurations crm on l.crm_configuration_id = crm.id
where crm.provider NOT IN ('salesforce', 'integration-app', 'bullhorn', 'copper')
# and l.converted_at IS NOT NULL
;
# [PASSWORD_DOTS]
SELECT * FROM activities a WHERE type IN ('email-inbound', 'email-outbound')
and opportunity_id IS NULL
order by id desc;
SELECT * FROM teams WHERE id = 604; # 598
SELECT * FROM activities WHERE id = 74410828; # [EMAIL]
SELECT * FROM accounts WHERE id = 20068382;
SELECT * FROM accounts WHERE id = 35186038;
SELECT * FROM contacts WHERE team_id = 852 and updated_at > '2026-01-23 12:30:00' order by updated_at desc;
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 = 559 and sa.provider = 'hubspot';
SELECT * FROM activities WHERE uuid_to_bin('cb6342b6-a183-401c-b0af-ede92b2ae763') = uuid;
select * from sidekick_settings where team_id = 781;
SELECT * FROM crm_configurations where provider = 'hubspot' and crm_provider_id = 26651871; # Teya
SELECT * FROM crm_configurations where provider = 'hubspot' and crm_provider_id = 7562435;
SELECT * FROM crm_configurations where provider = 'hubspot' and crm_provider_id = 8420347; # opflit 2100
SELECT * FROM crm_layouts WHERE crm_configuration_id = 711;
SELECT * FROM activities where crm_configuration_id = 711 and crm_provider_id IS NULL
and is_internal = 0 and status = 'completed'
order by id desc;
SELECT * FROM crm_layout_entities
WHERE crm_layout_id IN (2352, 2353);
;
SELECT * FROM crm_configurations where provider = 'hubspot' and id = 530;
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 = 556 and sa.provider = 'hubspot';
SELECT * FROM activities WHERE uuid_to_bin('c6ca4b22-7738-4563-a95d-b8a9598924ae') = uuid;
SELECT * FROM activities WHERE uuid_to_bin('442abb2b-28bd-4be8-9c25-19e9bf02766d') = uuid;
select * from contacts
where crm_configuration_id = 530
and crm_provider_id = 872252;
select * from activities where crm_configuration_id = 530
and user_id = 14343 and type like '%softphone%'
and created_at between '2026-01-28 15:00:00' and '2026-01-28 15:10:00';
SELECT * FROM crm_configurations where provider = 'hubspot' and crm_provider_id = 25666868; # Teya
SELECT * FROM crm_configurations where provider = 'hubspot' and crm_provider_id = 8646335; # Teya
SELECT * FROM crm_configurations where provider = 'hubspot' and crm_provider_id IN (5933397);
SELECT t.name, t.id, t.owner_id, c.id, c.provider, c.crm_base_url FROM teams t
JOIN crm_configurations c ON t.id = c.team_id
WHERE t.status = 'active';
SELECT * FROM teams where id = 1091;
SELECT * FROM crm_configurations where team_id = 1091;
SELECT * FROM activity_providers where team_id = 1091;
SELECT * FROM activities where crm_configuration_id = 1024 and type IN ('softphone', 'softphone-outbound')
and provider NOT IN ('hubspot', 'aircall')
# and telephony_provider_id = '019c1131-a22f-4792-b9ea-20adf6a02ed0'
order by id desc;
SELECT * FROM teams WHERE name LIKE '%Leadventure%';
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 = 1091 and sa.provider = 'salesforce';
SELECT * FROM teams WHERE name LIKE '%Wilson%'; # 862, 812
SELECT * FROM teams where id = 862;
SELECT * FROM crm_configurations where team_id = 862;
SELECT * FROM activity_providers where team_id = 862;
SELECT * FROM activities where crm_configuration_id = 812 and type IN ('softphone', 'softphone-outbound')
and provider NOT IN ('hubspot', 'aircall')
# and telephony_provider_id = '019c1131-a22f-4792-b9ea-20adf6a02ed0'
order by id desc;
SELECT t.id, crm.id, crm.provider, ap.* FROM teams t
join crm_configurations crm on t.id = crm.team_id
join activity_providers ap on t.id = ap.team_id
where t.status = 'active' and ap.is_enabled = 1
and crm.provider = 'hubspot'
and ap.provider NOT IN ('hubspot', 'aircall', 'uploader', 'gong', 'twilio', 'zoom-bot', 'google-meet', 'ms-teams',
'outreach', 'close', 'ringcentral', 'dialpad', 'zoom-phone');
SELECT * FROM teams where id = 1068;
SELECT * FROM crm_configurations where team_id = 1068;
SELECT * FROM activity_providers where team_id = 1068;
SELECT * FROM activities a
where crm_configuration_id = 993 and type IN ('softphone', 'softphone-outbound')
and a.provider NOT IN ('hubspot', 'uploader', 'gong', 'twilio', 'google-meet', 'ms-teams','close'
)
# and telephony_provider_id = '019c1131-a22f-4792-b9ea-20adf6a02ed0'
order by a.id desc;
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 = 1068 and sa.provider = 'hubspot';
# [PASSWORD_DOTS]
# [PASSWORD_DOTS]
# [PASSWORD_DOTS]
SELECT * FROM crm_configurations where id = 882; # 933 - GoGlobal , portalId: 6017093
SELECT * FROM opportunities WHERE team_id = 933 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;
SELECT * FROM opportunities WHERE team_id = 933 and updated_at > '2026-02-06 00:00:00' order by updated_at desc;
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 = 933 and sa.provider = 'hubspot';
# [PASSWORD_DOTS]
SELECT * FROM crm_configurations where id = 834; # 882 - AnyVan , portalId: 5468262
SELECT * FROM contacts WHERE crm_configuration_id = 834 and updated_at > '2026-03-30 00:00:00' order by updated_at desc;
SELECT * FROM opportunities WHERE crm_configuration_id = 834 and updated_at > '2026-03-04 08:00:00' order by updated_at desc;
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 = 882 and sa.provider = 'hubspot';
select * from crm_layouts where crm_configuration_id = 834;
select * from crm_layout_entities where crm_layout_id = 2780;
select * from crm_fields where id IN (321153,321192,321193,321194);
SELECT * FROM opportunities WHERE crm_configuration_id = 834 and id = 10993426;
# [PASSWORD_DOTS]
SELECT * FROM crm_configurations where id = 988; # 1057 - Teya (543ce4f4-168c-4571-91ea-5b35c253f06f) , portalId: 26651871
SELECT * FROM opportunities WHERE team_id = 1057 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;
SELECT * FROM opportunities WHERE team_id = 1057 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;
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 = 1057 and sa.provider = 'hubspot';
SELECT * FROM crm_configurations where id = 533; # 559 - Connectd , portalId: 6710988
SELECT * FROM opportunities WHERE team_id = 559 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;
SELECT * FROM opportunities WHERE team_id = 559 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;
SELECT * FROM crm_configurations where id = 801; # 852 - Rise Vision , portalId: 2700250
SELECT * FROM opportunities WHERE team_id = 852 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;
SELECT * FROM opportunities WHERE team_id = 852 and updated_at > '2026-02-04 00:00:00' order by updated_at desc; # 6th last
SELECT * FROM crm_configurations where id = 962; # 1034 - evergrowth.io , portalId: 143180990
SELECT * FROM opportunities WHERE team_id = 1034 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;
SELECT * FROM opportunities WHERE team_id = 1034 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;
# [PASSWORD_DOTS]
SELECT * FROM crm_configurations where id = 1037; # 1102 - Jibble , portalId: 6649755
SELECT * FROM opportunities WHERE team_id = 1102 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;
SELECT * FROM opportunities WHERE team_id = 1102 and updated_at > '2026-02-04 12:30:00' order by updated_at desc; # 8
SELECT * FROM crm_configurations where id = 1015; # 1049 - Travefy , portalId: 48904401
SELECT * FROM opportunities WHERE team_id = 1049 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;
SELECT * FROM opportunities WHERE team_id = 1049 and updated_at > '2026-02-04 12:30:00' order by updated_at desc; # 20
SELECT * FROM crm_configurations where id = 64; # 70 - SalaryFinance , portalId: 3404115
SELECT * FROM opportunities WHERE team_id = 70 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;
SELECT * FROM opportunities WHERE team_id = 70 and updated_at > '2026-02-04 12:30:00' order by updated_at desc; # 6th last
SELECT * FROM crm_configurations where id = 802; # 853 - Street Group , portalId: 7658438
SELECT * FROM opportunities WHERE team_id = 853 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;
SELECT * FROM opportunities WHERE team_id = 853 and updated_at > '2026-02-04 12:30:00' order by updated_at desc; # 10
SELECT * FROM crm_configurations where id = 872; # 921 - In Professional Development , portalId: 9238273
SELECT * FROM opportunities WHERE team_id = 921 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;
SELECT * FROM opportunities WHERE team_id = 921 and updated_at > '2026-02-04 12:30:00' order by updated_at desc; # 2
# [PASSWORD_DOTS]
SELECT * FROM crm_configurations where id = 550; # 576 - SeedLegals , portalId: 3028661
SELECT * FROM opportunities WHERE team_id = 576 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;
SELECT * FROM opportunities WHERE team_id = 576 and updated_at > '2026-02-05 14:00:00' order by updated_at desc;
SELECT * FROM crm_configurations where id = 989; # 1058 - rtaoutdoor.com , portalId: 22371204
SELECT * FROM opportunities WHERE team_id = 1058 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;
SELECT * FROM opportunities WHERE team_id = 1058 and updated_at > '2026-02-05 14:00:00' order by updated_at desc;
SELECT * FROM crm_configurations where id = 896; # 946 - Mintago , portalId: 6621281
SELECT * FROM opportunities WHERE team_id = 946 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;
SELECT * FROM opportunities WHERE team_id = 946 and updated_at > '2026-02-05 14:00:00' order by updated_at desc;
SELECT * FROM crm_configurations where id = 617; # 641 - PCS , portalId: 5244937
SELECT * FROM opportunities WHERE team_id = 641 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;
SELECT * FROM opportunities WHERE team_id = 641 and updated_at > '2026-02-05 14:00:00' order by updated_at desc; # 7th
# [PASSWORD_DOTS]
SELECT * FROM crm_configurations where id = 649; # 670 - Eventeny , portalId: 4492849
SELECT * FROM opportunities WHERE team_id = 670 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;
SELECT * FROM opportunities WHERE team_id = 670 and updated_at > '2026-02-09 08:00:00' order by updated_at desc; #
SELECT * FROM crm_configurations where id = 48; # 51 - CleanCloud , portalId: 4373137
SELECT * FROM opportunities WHERE team_id = 51 and updated_at > '2026-03-04 00:00:00' order by updated_at desc;
SELECT * FROM opportunities WHERE team_id = 51 and updated_at > '2026-02-09 08:00:00' order by updated_at desc;
select * from users where team_id = 51; # 7783
SELECT * FROM groups WHERE uuid_to_bin('8a8d2cb6-8b55-4fa3-8b5c-5f0e3d8de59a') = uuid; # 1130
select * from activity_searches where user_id = 7783;
select * from activity_search_filters where activity_search_id IN (32291, 32292);
SELECT asf.activity_search_id, asf.id, asf.value
FROM activity_search_filters asf
WHERE asf.filter = 'group_id'
AND asf.value IN (
SELECT CONCAT(
HEX(SUBSTR(uuid, 5, 4)), '-',
HEX(SUBSTR(uuid, 3, 2)), '-',
HEX(SUBSTR(uuid, 1, 2)), '-',
HEX(SUBSTR(uuid, 9, 2)), '-',
HEX(SUBSTR(uuid, 11))
)
FROM groups
WHERE deleted_at IS NOT NULL
);
SELECT * FROM crm_configurations where id = 272; # 290 - Bonham & Brook , portalId: 5705856
SELECT * FROM opportunities WHERE team_id = 290 and updated_at > '2026-02-05 00:00:00' order by updated_at desc;
SELECT * FROM opportunities WHERE team_id = 290 and updated_at > '2026-02-09 08:00:00' order by updated_at desc; # 6th
# [PASSWORD_DOTS]
SELECT * FROM crm_configurations where provider = 'hubspot';
SELECT * FROM crm_configurations where id = 1056; # 1119 - Chromatic , portalId: 45602133
SELECT * FROM opportunities WHERE team_id = 1119 and remotely_created_at > '2026-02-01 00:00:00' order by updated_at desc;
SELECT * FROM opportunities WHERE team_id = 1119 and updated_at > '2026-02-09 09:00:00' order by updated_at desc; # null
# [PASSWORD_DOTS]
select * from contacts where crm_provider_id = '003Uu00000ojD4NIAU';
select
cp.*
# DISTINCT t.id
# cp.id, cp.user_id, t.id, cp.crm_configuration_id, cp.contact_fields
FROM crm_profiles cp
JOIN crm_configurations crm on crm.id = cp.crm_configuration_id
JOIN users u on u.id = cp.user_id
JOIN teams t ON t.id = crm.team_id
WHERE crm.provider = 'salesforce' and t.status = 'active'
and cp.archived_at IS NULL and u.deleted_at IS NULL
and t.id NOT IN (1093)
and t.id = 2
and cp.contact_fields IS NULL;
# and c.crm_provider_id = '003Uu00000ojD4NIAU';
SELECT * FROM users WHERE id = 26484;
SELECT * FROM crm_profiles WHERE user_id = 26484;
SELECT * FROM social_accounts WHERE sociable_id = 26484;
SELECT * FROM crm_configurations where provider = 'salesforce';
select * from users where id IN (10022, 10403);
select * from users where team_id IN (526);
select * from teams where id IN (526, 532);
select * from crm_configurations where id IN (500, 516);
select * from crm_profiles where crm_configuration_id IN (500, 516) and user_id IN (10022, 10403);
select * from contacts where crm_configuration_id IN (500, 516) and crm_provider_id = '003Uu00000ojD4NIAU';
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 = 526 and sa.provider = 'salesforce';
select * from team_settings where team_id IN (526, 532);
select * from users where id IN (22824);
select * from crm_profiles where crm_configuration_id IN (1026);
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 = 1093 and sa.provider = 'salesforce';
select * from teams where id = 1099;
select * from users where id = 29643
select * from activity_processing_states;
SELECT * FROM teams where name LIKE '%Fare%'; # 233
SELECT * FROM opportunities where crm_configuration_id = 215
# and crm_provider_id = 'oppo_ogESZf2P50nDrd1nGPvKDXeA6sSaTN5v51Lp4ayVzKR'
;
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 = 1088 and sa.provider = 'hubspot';
SELECT * FROM teams order by updated_at DESC
SELECT * FROM crm_configurations WHERE id = 1019; # SimpleConsign 1088 - no social account
select * from crm_configurations where provider = 'pipedrive';
select * from teams where id = 957;
select * from crm_configurations where id = 957;
SELECT * FROM teams WHERE name LIKE '%Prolific%'; # 544, 518, 10743
SELECT * FROM opportunities where crm_configuration_id = 518 order by id desc;
select * from users where team_id = 1; # 26726 - Gabriela Dureva
SELECT * FROM opportunities where user_id = 26726; # 16834447 - Prolific
select * from activities where user_id = 26726 order by id desc;
select * from contacts where crm_configuration_id = 1
and email IN ('[EMAIL]', '[EMAIL]'); # 2094416, 2093620
SELECT * FROM contacts WHERE id = 6284931;
SELECT p.* FROM activities a JOIN participants p ON a.id = p.activity_id
WHERE a.user_id = 26726 and p.lead_id IN (2094416, 2093620) and a.created_at > '2026-01-01 00:00:00' order by p.email;
select * from activities where id IN (75509259,75509261,75509261,75511034,75026464,75517602,75517605);
select * from crm_configurations where id = 1;
43801692-1aeb-32ce-acba-5b80a479701a
44c3c9cf-6f5e-75f3-8179-bc9f75dd2b1b
405975c0-b3d0-7aaa-821f-09d59cae6dd1
4caf848d-4bed-2299-b248-7788d41f9fca
49bedc3f-f196-eef3-89c3-dea6a3b4aa63
43420989-a09d-b8f8-9806-c8bbf7a02aac
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 = 1 and sa.provider = 'salesforce';
SELECT * FROM activities WHERE id = 75461988;
SELECT * FROM activities WHERE uuid_to_bin('d6c5052e-e972-49e9-8912-26f2f7d6c5f6') = uuid;
select * from contacts where id = 17900517;
select * from contact_roles cr join crm_configurations crm on cr.crm_configuration_id = crm.id
where crm.provider != 'salesforce';
select * from users where id = 21047;
SELECT * FROM crm_configurations WHERE id = 892;
SELECT * FROM teams WHERE id = 942;
select * from opportunities where team_id = 942 order by updated_at desc;
select * from contacts where team_id = 942 order by updated_at desc;
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 = 942 and sa.provider = 'hubspot';
SELECT * FROM opportunities where team_id = 1 and crm_provider_id IN ('006Pq00000NeH6XIAV', '006Pq000007z8kdIAA'); # 10697889, 6621430
SELECT * FROM crm_configurations WHERE id = 1;
SELECT * FROM teams WHERE crm_id = 1;
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 = 1 and sa.provider = 'salesforce';
select id, user_id, opportunity_fields from crm_profiles where crm_configuration_id = 1
SELECT * FROM opportunities where team_id = 1 order by updated_at desc; # 10697889, 6621430
select * from teams where id = 852;
select * from groups where id = 2286;
select * from sidekick_settings where team_id = 852;
select * from default_activity_types where team_id = 852;
SELECT cc.provider, cc.id, p.id, u.*
FROM users u
LEFT JOIN crm_profiles p ON u.id = p.user_id AND p.id IS NULL -- no profile
INNER JOIN teams t ON u.team_id = t.id AND t.status = 'active' -- team is active
INNER JOIN crm_configurations cc ON t.crm_id = cc.id
WHERE u.status = 1 AND u.deleted_at IS NULL
AND u.crm_required = 1
AND u.team_id = 1
ORDER BY u.team_id;
SELECT * FROM crm_profiles cp where cp.crm_configuration_id = 1 and cp.user_id IN (
18481
);
SELECT cc.provider, cc.id, p.id, u.*
FROM users u
LEFT JOIN crm_profiles p ON u.id = p.user_id
INNER JOIN teams t ON u.team_id = t.id AND t.status = 'active'
INNER JOIN crm_configurations cc ON t.crm_id = cc.id
WHERE u.status = 1
AND u.deleted_at IS NULL
AND u.crm_required = 1
# AND u.team_id = 1
AND p.id IS NULL -- Move this condition to WHERE clause
ORDER BY u.team_id;
SELECT * FROM opportunities WHERE id = 20002609;
select * from teams where id = 1122; # Velatir, 29953 - [EMAIL]
select * from crm_configurations where id = 1060;
select * from crm_layouts where crm_configuration_id = 1060;
SELECT * FROM crm_layout_entities WHERE crm_layout_id = 3596;
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 = 1122 and sa.provider = 'hubspot';
select * from opportunities where team_id = 1122 order by updated_at desc;
select * from crm_field_data where object_type = 'contact';
SELECT * FROM activities WHERE uuid_to_bin('374fc8ed-3315-4c9f-9b25-318b7fd2928f') = uuid; # 76584262
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 = 248 and sa.provider = 'salesforce';
SELECT * FROM crm_profiles where user_id = 24115; # 005QF000002CswMYAS
SELECT * FROM users where id = 24115;
SELECT * FROM accounts where id = 4002896;
SELECT * FROM teams WHERE name LIKE '%adswerve%';
SELECT * FROM opportunities where crm_configuration_id = 230 AND crm_provider_id IN ("0069N000003GIQ9QAO","0061r000019yGP9AAM","0066900001S2KWlAAN","0066900001TDpj2AAD","0066900001b8uEwAAI","0069N000001rQi0QAE","006QF00000KD40mYAD","006QF00000LzpRJYAZ","0069N000002uomtQAA","0069N000002xlMLQAY","0066900001NV6ubAAD","0061r00001HJp45AAD","006QF00000uTlUoYAK","006QF00000v0bZqYAI");
SELECT * FROM opportunities WHERE crm_configuration_id = 230 AND crm_provider_id = '0069N000003GIQ9QAO'; # 6272203
SELECT u.id, u.email, ac.name, a.* FROM activities a
JOIN users u ON a.user_id = u.id
JOIN accounts ac ON a.account_id = ac.id
WHERE
uuid_to_bin('e3269598-b562-44fb-b5e9-9d2694dc63e0') = a.uuid or
uuid_to_bin('66ddc3ab-4e15-45aa-af0c-248c1eece593') = a.uuid or
uuid_to_bin('826bd328-e1cc-4213-b8d8-572454cacc07') = a.uuid;
select * from users where id = 5825;
SELECT * FROM activities WHERE uuid_to_bin('e56aa2e8-231a-421b-ab1f-cb38ed2bf573') = uuid;
select * from activities where uuid_to_bin('91e13b2f-2d1b-45f8-b1fd-1141b6563782') = uuid;
19594, 862
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 = 862 and sa.provider = 'salesforce';
select * from automated_reports where id = 36;
select ar.frequency, r.*, ar.* from automated_report_results r
join automated_reports ar on r.report_id = ar.id
where ar.frequency != 'one_off';
select s.* from activity_searches s join users u ON s.user_id = u.id where u.team_id = 882;
select * from nudges n where n.activity_search_id
select * from teams where created_at > '2026-03-09';
SELECT * FROM crm_layouts WHERE crm_configuration_id = 1065; # 1065
SELECT * FROM crm_layout_entities WHERE crm_layout_id = 3617;
select * from users where team_id = 1 and name like '%Lukas%'; # 7160
SELECT * FROM teams WHERE id = 575;
select * from opportunities where team_id = 575;
SELECT * FROM teams WHERE name LIKE '%Integrum ESG%'; # 1126, 1065,
select * from opportunities where team_id = 1126;
SELECT * FROM teams WHERE name LIKE '%Base%'; # 1125, 1063,
select * from opportunities where team_id = 1125;
select * from contacts c
where c.team_id = 882;
SELECT * FROM activities WHERE id = 76822967;
SELECT * FROM crm_profiles WHERE user_id = 15440;
SELECT * FROM crm_profiles WHERE crm_configuration_id = 555;
SELECT * FROM crm_configurations WHERE id = 555;
SELECT * FROM users WHERE id = 15440; # team. 581, gr. 15440, pl. 3911, act. field 162182
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 = 581 and sa.provider = 'salesforce';
SELECT * FROM automated_report_results order by id desc;
select * from features;
select * from team_features where feature_id = 40;
select * from teams where id = 556;
select * from automated_reports;
where id = 54; # 4fdd41f6-dcf0-30d0-b339-7345381b6044 , ["pdf","podcast"]
SELECT * FROM automated_report_results WHERE uuid_to_bin('822fa41b-afd3-43a9-a248-86b0e36f3131') = uuid;
select * from automated_report_results order by id desc;
SELECT * FROM automated_report_results WHERE id = 1919;
select * from automated_report_results WHERE report_id = 54;
select * from opportunities where id = 7594349;
SELECT * FROM teams WHERE name LIKE '%Les%'; # 711, 692, 16067 - [EMAIL]
select * from playbooks where team_id = 711; # event 226147
SELECT * FROM playbook_categories WHERE playbook_id = 5515;
SELECT * FROM crm_fields WHERE crm_configuration_id = 692 and object_type = 'event';
SELECT * FROM crm_fields WHERE id = 226147;
SELECT * FROM crm_field_values WHERE crm_field_id = 226147;
SELECT * FROM crm_configurations WHERE id = 692;
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 = 711 and sa.provider = 'salesforce';
SELECT * FROM crm_profiles cp JOIN users u on u.id = cp.user_id WHERE u.team_id = 711;
select * from leads;
select * from calendars;
SELECT
t.id AS team_id,
t.name,
LOWER(SUBSTRING_INDEX(c.calendar_provider_id, '@', -1)) AS calendar_domain
FROM teams t
JOIN users u ON u.team_id = t.id
JOIN calendars c ON c.user_id = u.id AND c.status = 'active' AND c.calendar_provider_id LIKE '%@%'
LEFT JOIN team_domains td
ON td.team_id = t.id
AND td.deleted_at IS NULL
AND td.domain = LOWER(SUBSTRING_INDEX(c.calendar_provider_id, '@', -1))
GROUP BY t.id, t.name, calendar_domain
ORDER BY t.name, calendar_domain;
select * from users u join calendars c on c.user_id = u.id
where u.team_id = 882;
select * from activities where id = 74049485; # team 563 crm 537
select * from activities where id = 73272382; # team 563 crm 537
select * from activities where id = 64400389; # team 563 crm 537
select * from activities where id = 58081273; # team 563 crm 537
select * from activities where id = 54520297; # team 563 crm 537
select * from participants where activity_id = 58081273;
select * from activities where crm_configuration_id = 537 and provider = 'aircall'
and account_id = 19003658 order by updated_at desc;
select * from contacts where crm_configuration_id = 537 and id = 35957759;
select * from accounts where crm_configuration_id = 537 and id = 19003658;
select * from automated_report_results where id = 1976;
select * from automated_reports where id = 583;
select * from activity_searches where id = 87714;
select * from activity_search_filters where activity_search_id = 87714;
SELECT * FROM activities WHERE uuid_to_bin('8827f672-202d-4162-9d04-73ff5f0566a9') = uuid
or uuid_to_bin('47842446-af51-4bcb-854f-cc6560290101') = uuid;
SELECT * FROM crm_configurations WHERE provider = 'hubspot';
select * from rate_limits;
select * from automated_report_results where media_type = 'pdf' and status = 2
and id IN (18, 1872);
select * from automated_reports where id = 54;
SELECT * FROM users WHERE id IN (24623,29443,29613);
SELECT * FROM automated_report_results WHERE uuid_to_bin('822fa41b-afd3-43a9-a248-86b0e36f3131') = uuid;
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide
app ~/jiminny/app, folder
.circleci, folder
.cursor, folder
.github
.sonarlint, folder
.vscode, folder
.windsurf, folder
app, sources root
Actions
InviteUserToTeamAction.php, class
MarkUserAsOnboardableAction.php, class
SyncRecordingFlagsAction.php, class
UpdateTeamMemberAction.php, class
UpdateUserRolesAction.php, class
Component
Acl
ActionItems
Activity
ActivityAnalytics
ActivitySearch
AiActivityType
AiAutomation
AiCallScoring
AskAnything
Dtos
Events
AskAnythingPromptService.php, class
HistoryService.php, class
AskJiminnyAi
AWS
BillingManagement
Cache
CoachingFeedback
Country
CustomerApi
Database
Datadog
DateTime
DealInsights
DealRisks
ElasticSearch
Eloquent
Encoding...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
32900
|
1256
|
17
|
2026-05-13T09:44:53.057549+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-13/1778 /Users/lukas/.screenpipe/data/data/2026-05-13/1778665493057_m1.jpg...
|
PhpStorm
|
faVsco.js – InviteUserToTeamAction.php
|
1
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
master, menu
Start Listen Project: faVsco.js, menu
master, 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
1
Previous Highlighted Error
Next Highlighted Error
<?php
namespace Jiminny\Actions;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Str;
use Jiminny\Component\Acl\RoleChangeContext;
use Jiminny\Component\Acl\RoleChangeLogger;
use Jiminny\Component\Acl\RoleChangeType;
use Jiminny\Contracts\Acl\RoleRepositoryInterface;
use Jiminny\DTO\Invitation\UserInvitationDTO;
use Jiminny\Models\Invitation;
use Jiminny\Models\Role;
use Jiminny\Models\User;
use Jiminny\Notifications\Channels\EmailNotifiable;
use Jiminny\Notifications\OwnerInvitedToTrial;
use Jiminny\Notifications\UserInvitedToTeam;
use Jiminny\Notifications\UserInvitedToTeamWithEmailOnly;
class InviteUserToTeamAction
{
public function __construct(
private RoleRepositoryInterface $roleRepository,
private RoleChangeLogger $roleChangeLogger,
) {
}
public function execute(UserInvitationDTO $dto): void
{
/** @var Invitation $invitation */
$invitation = Invitation::updateOrCreate(
[
'team_id' => $dto->teamId,
'email' => $dto->email,
],
[
'group_id' => $dto->groupId,
'secondary_email' => $dto->secondaryEmail,
'crm_required' => $dto->crmRequired,
'token' => Str::random(40),
'is_owner' => $dto->isOwner,
]
)->loadMissing(['team']);
$invitation->roles()->sync($dto->roleIds);
$notifiable = new EmailNotifiable($invitation->email, $invitation->getTeam());
$logMessage = 'User invited to trial';
if ($invitation->getTeam()->owner_id === null) {
$notifiable->notifyNow(new OwnerInvitedToTrial($invitation));
$logMessage = 'Owner invited to trial';
} else {
$notifiable->notifyNow(new UserInvitedToTeam($invitation));
}
collect($dto->roleIds)
->map(fn (int $roleId): Role => $this->roleRepository->get($roleId))
->each(function (Role $role) use ($dto, $invitation): void {
$this->roleChangeLogger->log(
$dto->currentUser,
$invitation,
$role,
$invitation->wasRecentlyCreated
? RoleChangeType::INVITE_USER
: RoleChangeType::RESEND_INVITATION,
RoleChangeContext::APP,
);
});
Log::info($logMessage, [
'teamId' => $invitation->team_id,
'teamName' => $invitation->getTeam()->name,
'email' => $invitation->email,
'crmRequired' => $invitation->crm_required ? 'yes' : 'no',
]);
$invitation->touch();
}
public function executeWithEmailOnly(User $user): void
{
$notifiable = new EmailNotifiable($user->getEmailAddress(), $user->getTeam());
$notifiable->notifyNow(new UserInvitedToTeamWithEmailOnly($user));
}
}
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
40
1
40
64
Previous Highlighted Error
Next Highlighted Error
SELECT * FROM teams WHERE name LIKE '%litify%'; # 1069, 994, 24993
SELECT * FROM users WHERE id = 25061;
SELECT * FROM crm_profiles WHERE crm_configuration_id = 994;
SELECT * FROM crm_profiles WHERE user_id = 25061;
select * from crm_configurations where id = 834;
SELECT * FROM teams WHERE id = 882;
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 = 882 and sa.provider = 'hubspot';
SELECT * FROM crm_configurations where id = 882; # 933 - GoGlobal
SELECT * FROM opportunities WHERE team_id = 933 order by updated_at desc;
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 = 933 and sa.provider = 'hubspot';
SELECT * FROM crm_configurations WHERE provider = 'hubspot' and crm_provider_id = 7270388;
SELECT * FROM contacts where crm_configuration_id = 834;
SELECT * FROM opportunities WHERE team_id = 933
# AND crm_provider_id IN ('20131586060','46017317898','52543911090','53451356564','54101251892','54323768459');
AND id IN (8482561,18352941,19042734,19232139,19445140,19472541);
SELECT * FROM opportunity_contacts
WHERE opportunity_id IN (8482561,18352941,19042734,19232139,19445140,19472541);
# [PASSWORD_DOTS]
SELECT * FROM crm_configurations where id = 485; #
SELECT * FROM opportunities WHERE team_id = 933 order by updated_at desc;
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 = 933 and sa.provider = 'hubspot';
select crm.provider, l.* from leads l join crm_configurations crm on l.crm_configuration_id = crm.id
where crm.provider NOT IN ('salesforce', 'integration-app', 'bullhorn', 'copper')
# and l.converted_at IS NOT NULL
;
# [PASSWORD_DOTS]
SELECT * FROM activities a WHERE type IN ('email-inbound', 'email-outbound')
and opportunity_id IS NULL
order by id desc;
SELECT * FROM teams WHERE id = 604; # 598
SELECT * FROM activities WHERE id = 74410828; # [EMAIL]
SELECT * FROM accounts WHERE id = 20068382;
SELECT * FROM accounts WHERE id = 35186038;
SELECT * FROM contacts WHERE team_id = 852 and updated_at > '2026-01-23 12:30:00' order by updated_at desc;
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 = 559 and sa.provider = 'hubspot';
SELECT * FROM activities WHERE uuid_to_bin('cb6342b6-a183-401c-b0af-ede92b2ae763') = uuid;
select * from sidekick_settings where team_id = 781;
SELECT * FROM crm_configurations where provider = 'hubspot' and crm_provider_id = 26651871; # Teya
SELECT * FROM crm_configurations where provider = 'hubspot' and crm_provider_id = 7562435;
SELECT * FROM crm_configurations where provider = 'hubspot' and crm_provider_id = 8420347; # opflit 2100
SELECT * FROM crm_layouts WHERE crm_configuration_id = 711;
SELECT * FROM activities where crm_configuration_id = 711 and crm_provider_id IS NULL
and is_internal = 0 and status = 'completed'
order by id desc;
SELECT * FROM crm_layout_entities
WHERE crm_layout_id IN (2352, 2353);
;
SELECT * FROM crm_configurations where provider = 'hubspot' and id = 530;
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 = 556 and sa.provider = 'hubspot';
SELECT * FROM activities WHERE uuid_to_bin('c6ca4b22-7738-4563-a95d-b8a9598924ae') = uuid;
SELECT * FROM activities WHERE uuid_to_bin('442abb2b-28bd-4be8-9c25-19e9bf02766d') = uuid;
select * from contacts
where crm_configuration_id = 530
and crm_provider_id = 872252;
select * from activities where crm_configuration_id = 530
and user_id = 14343 and type like '%softphone%'
and created_at between '2026-01-28 15:00:00' and '2026-01-28 15:10:00';
SELECT * FROM crm_configurations where provider = 'hubspot' and crm_provider_id = 25666868; # Teya
SELECT * FROM crm_configurations where provider = 'hubspot' and crm_provider_id = 8646335; # Teya
SELECT * FROM crm_configurations where provider = 'hubspot' and crm_provider_id IN (5933397);
SELECT t.name, t.id, t.owner_id, c.id, c.provider, c.crm_base_url FROM teams t
JOIN crm_configurations c ON t.id = c.team_id
WHERE t.status = 'active';
SELECT * FROM teams where id = 1091;
SELECT * FROM crm_configurations where team_id = 1091;
SELECT * FROM activity_providers where team_id = 1091;
SELECT * FROM activities where crm_configuration_id = 1024 and type IN ('softphone', 'softphone-outbound')
and provider NOT IN ('hubspot', 'aircall')
# and telephony_provider_id = '019c1131-a22f-4792-b9ea-20adf6a02ed0'
order by id desc;
SELECT * FROM teams WHERE name LIKE '%Leadventure%';
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 = 1091 and sa.provider = 'salesforce';
SELECT * FROM teams WHERE name LIKE '%Wilson%'; # 862, 812
SELECT * FROM teams where id = 862;
SELECT * FROM crm_configurations where team_id = 862;
SELECT * FROM activity_providers where team_id = 862;
SELECT * FROM activities where crm_configuration_id = 812 and type IN ('softphone', 'softphone-outbound')
and provider NOT IN ('hubspot', 'aircall')
# and telephony_provider_id = '019c1131-a22f-4792-b9ea-20adf6a02ed0'
order by id desc;
SELECT t.id, crm.id, crm.provider, ap.* FROM teams t
join crm_configurations crm on t.id = crm.team_id
join activity_providers ap on t.id = ap.team_id
where t.status = 'active' and ap.is_enabled = 1
and crm.provider = 'hubspot'
and ap.provider NOT IN ('hubspot', 'aircall', 'uploader', 'gong', 'twilio', 'zoom-bot', 'google-meet', 'ms-teams',
'outreach', 'close', 'ringcentral', 'dialpad', 'zoom-phone');
SELECT * FROM teams where id = 1068;
SELECT * FROM crm_configurations where team_id = 1068;
SELECT * FROM activity_providers where team_id = 1068;
SELECT * FROM activities a
where crm_configuration_id = 993 and type IN ('softphone', 'softphone-outbound')
and a.provider NOT IN ('hubspot', 'uploader', 'gong', 'twilio', 'google-meet', 'ms-teams','close'
)
# and telephony_provider_id = '019c1131-a22f-4792-b9ea-20adf6a02ed0'
order by a.id desc;
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 = 1068 and sa.provider = 'hubspot';
# [PASSWORD_DOTS]
# [PASSWORD_DOTS]
# [PASSWORD_DOTS]
SELECT * FROM crm_configurations where id = 882; # 933 - GoGlobal , portalId: 6017093
SELECT * FROM opportunities WHERE team_id = 933 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;
SELECT * FROM opportunities WHERE team_id = 933 and updated_at > '2026-02-06 00:00:00' order by updated_at desc;
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 = 933 and sa.provider = 'hubspot';
# [PASSWORD_DOTS]
SELECT * FROM crm_configurations where id = 834; # 882 - AnyVan , portalId: 5468262
SELECT * FROM contacts WHERE crm_configuration_id = 834 and updated_at > '2026-03-30 00:00:00' order by updated_at desc;
SELECT * FROM opportunities WHERE crm_configuration_id = 834 and updated_at > '2026-03-04 08:00:00' order by updated_at desc;
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 = 882 and sa.provider = 'hubspot';
select * from crm_layouts where crm_configuration_id = 834;
select * from crm_layout_entities where crm_layout_id = 2780;
select * from crm_fields where id IN (321153,321192,321193,321194);
SELECT * FROM opportunities WHERE crm_configuration_id = 834 and id = 10993426;
# [PASSWORD_DOTS]
SELECT * FROM crm_configurations where id = 988; # 1057 - Teya (543ce4f4-168c-4571-91ea-5b35c253f06f) , portalId: 26651871
SELECT * FROM opportunities WHERE team_id = 1057 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;
SELECT * FROM opportunities WHERE team_id = 1057 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;
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 = 1057 and sa.provider = 'hubspot';
SELECT * FROM crm_configurations where id = 533; # 559 - Connectd , portalId: 6710988
SELECT * FROM opportunities WHERE team_id = 559 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;
SELECT * FROM opportunities WHERE team_id = 559 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;
SELECT * FROM crm_configurations where id = 801; # 852 - Rise Vision , portalId: 2700250
SELECT * FROM opportunities WHERE team_id = 852 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;
SELECT * FROM opportunities WHERE team_id = 852 and updated_at > '2026-02-04 00:00:00' order by updated_at desc; # 6th last
SELECT * FROM crm_configurations where id = 962; # 1034 - evergrowth.io , portalId: 143180990
SELECT * FROM opportunities WHERE team_id = 1034 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;
SELECT * FROM opportunities WHERE team_id = 1034 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;
# [PASSWORD_DOTS]
SELECT * FROM crm_configurations where id = 1037; # 1102 - Jibble , portalId: 6649755
SELECT * FROM opportunities WHERE team_id = 1102 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;
SELECT * FROM opportunities WHERE team_id = 1102 and updated_at > '2026-02-04 12:30:00' order by updated_at desc; # 8
SELECT * FROM crm_configurations where id = 1015; # 1049 - Travefy , portalId: 48904401
SELECT * FROM opportunities WHERE team_id = 1049 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;
SELECT * FROM opportunities WHERE team_id = 1049 and updated_at > '2026-02-04 12:30:00' order by updated_at desc; # 20
SELECT * FROM crm_configurations where id = 64; # 70 - SalaryFinance , portalId: 3404115
SELECT * FROM opportunities WHERE team_id = 70 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;
SELECT * FROM opportunities WHERE team_id = 70 and updated_at > '2026-02-04 12:30:00' order by updated_at desc; # 6th last
SELECT * FROM crm_configurations where id = 802; # 853 - Street Group , portalId: 7658438
SELECT * FROM opportunities WHERE team_id = 853 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;
SELECT * FROM opportunities WHERE team_id = 853 and updated_at > '2026-02-04 12:30:00' order by updated_at desc; # 10
SELECT * FROM crm_configurations where id = 872; # 921 - In Professional Development , portalId: 9238273
SELECT * FROM opportunities WHERE team_id = 921 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;
SELECT * FROM opportunities WHERE team_id = 921 and updated_at > '2026-02-04 12:30:00' order by updated_at desc; # 2
# [PASSWORD_DOTS]
SELECT * FROM crm_configurations where id = 550; # 576 - SeedLegals , portalId: 3028661
SELECT * FROM opportunities WHERE team_id = 576 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;
SELECT * FROM opportunities WHERE team_id = 576 and updated_at > '2026-02-05 14:00:00' order by updated_at desc;
SELECT * FROM crm_configurations where id = 989; # 1058 - rtaoutdoor.com , portalId: 22371204
SELECT * FROM opportunities WHERE team_id = 1058 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;
SELECT * FROM opportunities WHERE team_id = 1058 and updated_at > '2026-02-05 14:00:00' order by updated_at desc;
SELECT * FROM crm_configurations where id = 896; # 946 - Mintago , portalId: 6621281
SELECT * FROM opportunities WHERE team_id = 946 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;
SELECT * FROM opportunities WHERE team_id = 946 and updated_at > '2026-02-05 14:00:00' order by updated_at desc;
SELECT * FROM crm_configurations where id = 617; # 641 - PCS , portalId: 5244937
SELECT * FROM opportunities WHERE team_id = 641 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;
SELECT * FROM opportunities WHERE team_id = 641 and updated_at > '2026-02-05 14:00:00' order by updated_at desc; # 7th
# [PASSWORD_DOTS]
SELECT * FROM crm_configurations where id = 649; # 670 - Eventeny , portalId: 4492849
SELECT * FROM opportunities WHERE team_id = 670 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;
SELECT * FROM opportunities WHERE team_id = 670 and updated_at > '2026-02-09 08:00:00' order by updated_at desc; #
SELECT * FROM crm_configurations where id = 48; # 51 - CleanCloud , portalId: 4373137
SELECT * FROM opportunities WHERE team_id = 51 and updated_at > '2026-03-04 00:00:00' order by updated_at desc;
SELECT * FROM opportunities WHERE team_id = 51 and updated_at > '2026-02-09 08:00:00' order by updated_at desc;
select * from users where team_id = 51; # 7783
SELECT * FROM groups WHERE uuid_to_bin('8a8d2cb6-8b55-4fa3-8b5c-5f0e3d8de59a') = uuid; # 1130
select * from activity_searches where user_id = 7783;
select * from activity_search_filters where activity_search_id IN (32291, 32292);
SELECT asf.activity_search_id, asf.id, asf.value
FROM activity_search_filters asf
WHERE asf.filter = 'group_id'
AND asf.value IN (
SELECT CONCAT(
HEX(SUBSTR(uuid, 5, 4)), '-',
HEX(SUBSTR(uuid, 3, 2)), '-',
HEX(SUBSTR(uuid, 1, 2)), '-',
HEX(SUBSTR(uuid, 9, 2)), '-',
HEX(SUBSTR(uuid, 11))
)
FROM groups
WHERE deleted_at IS NOT NULL
);
SELECT * FROM crm_configurations where id = 272; # 290 - Bonham & Brook , portalId: 5705856
SELECT * FROM opportunities WHERE team_id = 290 and updated_at > '2026-02-05 00:00:00' order by updated_at desc;
SELECT * FROM opportunities WHERE team_id = 290 and updated_at > '2026-02-09 08:00:00' order by updated_at desc; # 6th
# [PASSWORD_DOTS]
SELECT * FROM crm_configurations where provider = 'hubspot';
SELECT * FROM crm_configurations where id = 1056; # 1119 - Chromatic , portalId: 45602133
SELECT * FROM opportunities WHERE team_id = 1119 and remotely_created_at > '2026-02-01 00:00:00' order by updated_at desc;
SELECT * FROM opportunities WHERE team_id = 1119 and updated_at > '2026-02-09 09:00:00' order by updated_at desc; # null
# [PASSWORD_DOTS]
select * from contacts where crm_provider_id = '003Uu00000ojD4NIAU';
select
cp.*
# DISTINCT t.id
# cp.id, cp.user_id, t.id, cp.crm_configuration_id, cp.contact_fields
FROM crm_profiles cp
JOIN crm_configurations crm on crm.id = cp.crm_configuration_id
JOIN users u on u.id = cp.user_id
JOIN teams t ON t.id = crm.team_id
WHERE crm.provider = 'salesforce' and t.status = 'active'
and cp.archived_at IS NULL and u.deleted_at IS NULL
and t.id NOT IN (1093)
and t.id = 2
and cp.contact_fields IS NULL;
# and c.crm_provider_id = '003Uu00000ojD4NIAU';
SELECT * FROM users WHERE id = 26484;
SELECT * FROM crm_profiles WHERE user_id = 26484;
SELECT * FROM social_accounts WHERE sociable_id = 26484;
SELECT * FROM crm_configurations where provider = 'salesforce';
select * from users where id IN (10022, 10403);
select * from users where team_id IN (526);
select * from teams where id IN (526, 532);
select * from crm_configurations where id IN (500, 516);
select * from crm_profiles where crm_configuration_id IN (500, 516) and user_id IN (10022, 10403);
select * from contacts where crm_configuration_id IN (500, 516) and crm_provider_id = '003Uu00000ojD4NIAU';
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 = 526 and sa.provider = 'salesforce';
select * from team_settings where team_id IN (526, 532);
select * from users where id IN (22824);
select * from crm_profiles where crm_configuration_id IN (1026);
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 = 1093 and sa.provider = 'salesforce';
select * from teams where id = 1099;
select * from users where id = 29643
select * from activity_processing_states;
SELECT * FROM teams where name LIKE '%Fare%'; # 233
SELECT * FROM opportunities where crm_configuration_id = 215
# and crm_provider_id = 'oppo_ogESZf2P50nDrd1nGPvKDXeA6sSaTN5v51Lp4ayVzKR'
;
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 = 1088 and sa.provider = 'hubspot';
SELECT * FROM teams order by updated_at DESC
SELECT * FROM crm_configurations WHERE id = 1019; # SimpleConsign 1088 - no social account
select * from crm_configurations where provider = 'pipedrive';
select * from teams where id = 957;
select * from crm_configurations where id = 957;
SELECT * FROM teams WHERE name LIKE '%Prolific%'; # 544, 518, 10743
SELECT * FROM opportunities where crm_configuration_id = 518 order by id desc;
select * from users where team_id = 1; # 26726 - Gabriela Dureva
SELECT * FROM opportunities where user_id = 26726; # 16834447 - Prolific
select * from activities where user_id = 26726 order by id desc;
select * from contacts where crm_configuration_id = 1
and email IN ('[EMAIL]', '[EMAIL]'); # 2094416, 2093620
SELECT * FROM contacts WHERE id = 6284931;
SELECT p.* FROM activities a JOIN participants p ON a.id = p.activity_id
WHERE a.user_id = 26726 and p.lead_id IN (2094416, 2093620) and a.created_at > '2026-01-01 00:00:00' order by p.email;
select * from activities where id IN (75509259,75509261,75509261,75511034,75026464,75517602,75517605);
select * from crm_configurations where id = 1;
43801692-1aeb-32ce-acba-5b80a479701a
44c3c9cf-6f5e-75f3-8179-bc9f75dd2b1b
405975c0-b3d0-7aaa-821f-09d59cae6dd1
4caf848d-4bed-2299-b248-7788d41f9fca
49bedc3f-f196-eef3-89c3-dea6a3b4aa63
43420989-a09d-b8f8-9806-c8bbf7a02aac
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 = 1 and sa.provider = 'salesforce';
SELECT * FROM activities WHERE id = 75461988;
SELECT * FROM activities WHERE uuid_to_bin('d6c5052e-e972-49e9-8912-26f2f7d6c5f6') = uuid;
select * from contacts where id = 17900517;
select * from contact_roles cr join crm_configurations crm on cr.crm_configuration_id = crm.id
where crm.provider != 'salesforce';
select * from users where id = 21047;
SELECT * FROM crm_configurations WHERE id = 892;
SELECT * FROM teams WHERE id = 942;
select * from opportunities where team_id = 942 order by updated_at desc;
select * from contacts where team_id = 942 order by updated_at desc;
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 = 942 and sa.provider = 'hubspot';
SELECT * FROM opportunities where team_id = 1 and crm_provider_id IN ('006Pq00000NeH6XIAV', '006Pq000007z8kdIAA'); # 10697889, 6621430
SELECT * FROM crm_configurations WHERE id = 1;
SELECT * FROM teams WHERE crm_id = 1;
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 = 1 and sa.provider = 'salesforce';
select id, user_id, opportunity_fields from crm_profiles where crm_configuration_id = 1
SELECT * FROM opportunities where team_id = 1 order by updated_at desc; # 10697889, 6621430
select * from teams where id = 852;
select * from groups where id = 2286;
select * from sidekick_settings where team_id = 852;
select * from default_activity_types where team_id = 852;
SELECT cc.provider, cc.id, p.id, u.*
FROM users u
LEFT JOIN crm_profiles p ON u.id = p.user_id AND p.id IS NULL -- no profile
INNER JOIN teams t ON u.team_id = t.id AND t.status = 'active' -- team is active
INNER JOIN crm_configurations cc ON t.crm_id = cc.id
WHERE u.status = 1 AND u.deleted_at IS NULL
AND u.crm_required = 1
AND u.team_id = 1
ORDER BY u.team_id;
SELECT * FROM crm_profiles cp where cp.crm_configuration_id = 1 and cp.user_id IN (
18481
);
SELECT cc.provider, cc.id, p.id, u.*
FROM users u
LEFT JOIN crm_profiles p ON u.id = p.user_id
INNER JOIN teams t ON u.team_id = t.id AND t.status = 'active'
INNER JOIN crm_configurations cc ON t.crm_id = cc.id
WHERE u.status = 1
AND u.deleted_at IS NULL
AND u.crm_required = 1
# AND u.team_id = 1
AND p.id IS NULL -- Move this condition to WHERE clause
ORDER BY u.team_id;
SELECT * FROM opportunities WHERE id = 20002609;
select * from teams where id = 1122; # Velatir, 29953 - [EMAIL]
select * from crm_configurations where id = 1060;
select * from crm_layouts where crm_configuration_id = 1060;
SELECT * FROM crm_layout_entities WHERE crm_layout_id = 3596;
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 = 1122 and sa.provider = 'hubspot';
select * from opportunities where team_id = 1122 order by updated_at desc;
select * from crm_field_data where object_type = 'contact';
SELECT * FROM activities WHERE uuid_to_bin('374fc8ed-3315-4c9f-9b25-318b7fd2928f') = uuid; # 76584262
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 = 248 and sa.provider = 'salesforce';
SELECT * FROM crm_profiles where user_id = 24115; # 005QF000002CswMYAS
SELECT * FROM users where id = 24115;
SELECT * FROM accounts where id = 4002896;
SELECT * FROM teams WHERE name LIKE '%adswerve%';
SELECT * FROM opportunities where crm_configuration_id = 230 AND crm_provider_id IN ("0069N000003GIQ9QAO","0061r000019yGP9AAM","0066900001S2KWlAAN","0066900001TDpj2AAD","0066900001b8uEwAAI","0069N000001rQi0QAE","006QF00000KD40mYAD","006QF00000LzpRJYAZ","0069N000002uomtQAA","0069N000002xlMLQAY","0066900001NV6ubAAD","0061r00001HJp45AAD","006QF00000uTlUoYAK","006QF00000v0bZqYAI");
SELECT * FROM opportunities WHERE crm_configuration_id = 230 AND crm_provider_id = '0069N000003GIQ9QAO'; # 6272203
SELECT u.id, u.email, ac.name, a.* FROM activities a
JOIN users u ON a.user_id = u.id
JOIN accounts ac ON a.account_id = ac.id
WHERE
uuid_to_bin('e3269598-b562-44fb-b5e9-9d2694dc63e0') = a.uuid or
uuid_to_bin('66ddc3ab-4e15-45aa-af0c-248c1eece593') = a.uuid or
uuid_to_bin('826bd328-e1cc-4213-b8d8-572454cacc07') = a.uuid;
select * from users where id = 5825;
SELECT * FROM activities WHERE uuid_to_bin('e56aa2e8-231a-421b-ab1f-cb38ed2bf573') = uuid;
select * from activities where uuid_to_bin('91e13b2f-2d1b-45f8-b1fd-1141b6563782') = uuid;
19594, 862
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 = 862 and sa.provider = 'salesforce';
select * from automated_reports where id = 36;
select ar.frequency, r.*, ar.* from automated_report_results r
join automated_reports ar on r.report_id = ar.id
where ar.frequency != 'one_off';
select s.* from activity_searches s join users u ON s.user_id = u.id where u.team_id = 882;
select * from nudges n where n.activity_search_id
select * from teams where created_at > '2026-03-09';
SELECT * FROM crm_layouts WHERE crm_configuration_id = 1065; # 1065
SELECT * FROM crm_layout_entities WHERE crm_layout_id = 3617;
select * from users where team_id = 1 and name like '%Lukas%'; # 7160
SELECT * FROM teams WHERE id = 575;
select * from opportunities where team_id = 575;
SELECT * FROM teams WHERE name LIKE '%Integrum ESG%'; # 1126, 1065,
select * from opportunities where team_id = 1126;
SELECT * FROM teams WHERE name LIKE '%Base%'; # 1125, 1063,
select * from opportunities where team_id = 1125;
select * from contacts c
where c.team_id = 882;
SELECT * FROM activities WHERE id = 76822967;
SELECT * FROM crm_profiles WHERE user_id = 15440;
SELECT * FROM crm_profiles WHERE crm_configuration_id = 555;
SELECT * FROM crm_configurations WHERE id = 555;
SELECT * FROM users WHERE id = 15440; # team. 581, gr. 15440, pl. 3911, act. field 162182
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 = 581 and sa.provider = 'salesforce';
SELECT * FROM automated_report_results order by id desc;
select * from features;
select * from team_features where feature_id = 40;
select * from teams where id = 556;
select * from automated_reports;
where id = 54; # 4fdd41f6-dcf0-30d0-b339-7345381b6044 , ["pdf","podcast"]
SELECT * FROM automated_report_results WHERE uuid_to_bin('822fa41b-afd3-43a9-a248-86b0e36f3131') = uuid;
select * from automated_report_results order by id desc;
SELECT * FROM automated_report_results WHERE id = 1919;
select * from automated_report_results WHERE report_id = 54;
select * from opportunities where id = 7594349;
SELECT * FROM teams WHERE name LIKE '%Les%'; # 711, 692, 16067 - [EMAIL]
select * from playbooks where team_id = 711; # event 226147
SELECT * FROM playbook_categories WHERE playbook_id = 5515;
SELECT * FROM crm_fields WHERE crm_configuration_id = 692 and object_type = 'event';
SELECT * FROM crm_fields WHERE id = 226147;
SELECT * FROM crm_field_values WHERE crm_field_id = 226147;
SELECT * FROM crm_configurations WHERE id = 692;
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 = 711 and sa.provider = 'salesforce';
SELECT * FROM crm_profiles cp JOIN users u on u.id = cp.user_id WHERE u.team_id = 711;
select * from leads;
select * from calendars;
SELECT
t.id AS team_id,
t.name,
LOWER(SUBSTRING_INDEX(c.calendar_provider_id, '@', -1)) AS calendar_domain
FROM teams t
JOIN users u ON u.team_id = t.id
JOIN calendars c ON c.user_id = u.id AND c.status = 'active' AND c.calendar_provider_id LIKE '%@%'
LEFT JOIN team_domains td
ON td.team_id = t.id
AND td.deleted_at IS NULL
AND td.domain = LOWER(SUBSTRING_INDEX(c.calendar_provider_id, '@', -1))
GROUP BY t.id, t.name, calendar_domain
ORDER BY t.name, calendar_domain;
select * from users u join calendars c on c.user_id = u.id
where u.team_id = 882;
select * from activities where id = 74049485; # team 563 crm 537
select * from activities where id = 73272382; # team 563 crm 537
select * from activities where id = 64400389; # team 563 crm 537
select * from activities where id = 58081273; # team 563 crm 537
select * from activities where id = 54520297; # team 563 crm 537
select * from participants where activity_id = 58081273;
select * from activities where crm_configuration_id = 537 and provider = 'aircall'
and account_id = 19003658 order by updated_at desc;
select * from contacts where crm_configuration_id = 537 and id = 35957759;
select * from accounts where crm_configuration_id = 537 and id = 19003658;
select * from automated_report_results where id = 1976;
select * from automated_reports where id = 583;
select * from activity_searches where id = 87714;
select * from activity_search_filters where activity_search_id = 87714;
SELECT * FROM activities WHERE uuid_to_bin('8827f672-202d-4162-9d04-73ff5f0566a9') = uuid
or uuid_to_bin('47842446-af51-4bcb-854f-cc6560290101') = uuid;
SELECT * FROM crm_configurations WHERE provider = 'hubspot';
select * from rate_limits;
select * from automated_report_results where media_type = 'pdf' and status = 2
and id IN (18, 1872);
select * from automated_reports where id = 54;
SELECT * FROM users WHERE id IN (24623,29443,29613);
SELECT * FROM automated_report_results WHERE uuid_to_bin('822fa41b-afd3-43a9-a248-86b0e36f3131') = uuid;
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide
app ~/jiminny/app, folder
.circleci, folder
.cursor, folder
.github
.sonarlint, folder
.vscode, folder
.windsurf, folder
app, sources root
Actions
InviteUserToTeamAction.php, class
MarkUserAsOnboardableAction.php, class
SyncRecordingFlagsAction.php, class
UpdateTeamMemberAction.php, class
UpdateUserRolesAction.php, class
Component
Acl
ActionItems
Activity
ActivityAnalytics
ActivitySearch
AiActivityType
AiAutomation
AiCallScoring
AskAnything
Dtos
Events
AskAnythingPromptService.php, class
HistoryService.php, class
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, folder
MobileSettings, folder
Model, folder...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"on_screen":true,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"master, menu","depth":5,"on_screen":true,"help_text":"Git Branch: master","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,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"AskJiminnyReportActivityServiceTest","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run 'AskJiminnyReportActivityServiceTest'","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'AskJiminnyReportActivityServiceTest'","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"More Actions","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JetBrains AI","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Search Everywhere","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"IDE and Project Settings","depth":5,"on_screen":true,"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},"on_screen":false,"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},"on_screen":false,"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},"on_screen":false,"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},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"3","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"1","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"<?php\n\nnamespace Jiminny\\Actions;\n\nuse Illuminate\\Support\\Facades\\Log;\nuse Illuminate\\Support\\Str;\nuse Jiminny\\Component\\Acl\\RoleChangeContext;\nuse Jiminny\\Component\\Acl\\RoleChangeLogger;\nuse Jiminny\\Component\\Acl\\RoleChangeType;\nuse Jiminny\\Contracts\\Acl\\RoleRepositoryInterface;\nuse Jiminny\\DTO\\Invitation\\UserInvitationDTO;\nuse Jiminny\\Models\\Invitation;\nuse Jiminny\\Models\\Role;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Notifications\\Channels\\EmailNotifiable;\nuse Jiminny\\Notifications\\OwnerInvitedToTrial;\nuse Jiminny\\Notifications\\UserInvitedToTeam;\nuse Jiminny\\Notifications\\UserInvitedToTeamWithEmailOnly;\n\nclass InviteUserToTeamAction\n{\n public function __construct(\n private RoleRepositoryInterface $roleRepository,\n private RoleChangeLogger $roleChangeLogger,\n ) {\n }\n\n public function execute(UserInvitationDTO $dto): void\n {\n /** @var Invitation $invitation */\n $invitation = Invitation::updateOrCreate(\n [\n 'team_id' => $dto->teamId,\n 'email' => $dto->email,\n ],\n [\n 'group_id' => $dto->groupId,\n 'secondary_email' => $dto->secondaryEmail,\n 'crm_required' => $dto->crmRequired,\n 'token' => Str::random(40),\n 'is_owner' => $dto->isOwner,\n ]\n )->loadMissing(['team']);\n\n $invitation->roles()->sync($dto->roleIds);\n\n $notifiable = new EmailNotifiable($invitation->email, $invitation->getTeam());\n\n $logMessage = 'User invited to trial';\n\n if ($invitation->getTeam()->owner_id === null) {\n $notifiable->notifyNow(new OwnerInvitedToTrial($invitation));\n\n $logMessage = 'Owner invited to trial';\n } else {\n $notifiable->notifyNow(new UserInvitedToTeam($invitation));\n }\n\n collect($dto->roleIds)\n ->map(fn (int $roleId): Role => $this->roleRepository->get($roleId))\n ->each(function (Role $role) use ($dto, $invitation): void {\n $this->roleChangeLogger->log(\n $dto->currentUser,\n $invitation,\n $role,\n $invitation->wasRecentlyCreated\n ? RoleChangeType::INVITE_USER\n : RoleChangeType::RESEND_INVITATION,\n RoleChangeContext::APP,\n );\n });\n\n Log::info($logMessage, [\n 'teamId' => $invitation->team_id,\n 'teamName' => $invitation->getTeam()->name,\n 'email' => $invitation->email,\n 'crmRequired' => $invitation->crm_required ? 'yes' : 'no',\n ]);\n\n $invitation->touch();\n }\n\n public function executeWithEmailOnly(User $user): void\n {\n $notifiable = new EmailNotifiable($user->getEmailAddress(), $user->getTeam());\n\n $notifiable->notifyNow(new UserInvitedToTeamWithEmailOnly($user));\n }\n}","depth":4,"on_screen":true,"value":"<?php\n\nnamespace Jiminny\\Actions;\n\nuse Illuminate\\Support\\Facades\\Log;\nuse Illuminate\\Support\\Str;\nuse Jiminny\\Component\\Acl\\RoleChangeContext;\nuse Jiminny\\Component\\Acl\\RoleChangeLogger;\nuse Jiminny\\Component\\Acl\\RoleChangeType;\nuse Jiminny\\Contracts\\Acl\\RoleRepositoryInterface;\nuse Jiminny\\DTO\\Invitation\\UserInvitationDTO;\nuse Jiminny\\Models\\Invitation;\nuse Jiminny\\Models\\Role;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Notifications\\Channels\\EmailNotifiable;\nuse Jiminny\\Notifications\\OwnerInvitedToTrial;\nuse Jiminny\\Notifications\\UserInvitedToTeam;\nuse Jiminny\\Notifications\\UserInvitedToTeamWithEmailOnly;\n\nclass InviteUserToTeamAction\n{\n public function __construct(\n private RoleRepositoryInterface $roleRepository,\n private RoleChangeLogger $roleChangeLogger,\n ) {\n }\n\n public function execute(UserInvitationDTO $dto): void\n {\n /** @var Invitation $invitation */\n $invitation = Invitation::updateOrCreate(\n [\n 'team_id' => $dto->teamId,\n 'email' => $dto->email,\n ],\n [\n 'group_id' => $dto->groupId,\n 'secondary_email' => $dto->secondaryEmail,\n 'crm_required' => $dto->crmRequired,\n 'token' => Str::random(40),\n 'is_owner' => $dto->isOwner,\n ]\n )->loadMissing(['team']);\n\n $invitation->roles()->sync($dto->roleIds);\n\n $notifiable = new EmailNotifiable($invitation->email, $invitation->getTeam());\n\n $logMessage = 'User invited to trial';\n\n if ($invitation->getTeam()->owner_id === null) {\n $notifiable->notifyNow(new OwnerInvitedToTrial($invitation));\n\n $logMessage = 'Owner invited to trial';\n } else {\n $notifiable->notifyNow(new UserInvitedToTeam($invitation));\n }\n\n collect($dto->roleIds)\n ->map(fn (int $roleId): Role => $this->roleRepository->get($roleId))\n ->each(function (Role $role) use ($dto, $invitation): void {\n $this->roleChangeLogger->log(\n $dto->currentUser,\n $invitation,\n $role,\n $invitation->wasRecentlyCreated\n ? RoleChangeType::INVITE_USER\n : RoleChangeType::RESEND_INVITATION,\n RoleChangeContext::APP,\n );\n });\n\n Log::info($logMessage, [\n 'teamId' => $invitation->team_id,\n 'teamName' => $invitation->getTeam()->name,\n 'email' => $invitation->email,\n 'crmRequired' => $invitation->crm_required ? 'yes' : 'no',\n ]);\n\n $invitation->touch();\n }\n\n public function executeWithEmailOnly(User $user): void\n {\n $notifiable = new EmailNotifiable($user->getEmailAddress(), $user->getTeam());\n\n $notifiable->notifyNow(new UserInvitedToTeamWithEmailOnly($user));\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,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Explain Plan","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Browse Query History","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"View Parameters","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Open Query Execution Settings…","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"In-Editor Results","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Tx: Auto","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Cancel Running Statements","depth":4,"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Playground","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"jiminny","depth":4,"on_screen":true,"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},"on_screen":false,"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},"on_screen":false,"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},"on_screen":false,"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},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"40","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"1","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"40","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"64","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"SELECT * FROM teams WHERE name LIKE '%litify%'; # 1069, 994, 24993\nSELECT * FROM users WHERE id = 25061;\nSELECT * FROM crm_profiles WHERE crm_configuration_id = 994;\nSELECT * FROM crm_profiles WHERE user_id = 25061;\n\nselect * from crm_configurations where id = 834;\nSELECT * FROM teams WHERE id = 882;\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 = 882 and sa.provider = 'hubspot';\n\nSELECT * FROM crm_configurations where id = 882; # 933 - GoGlobal\nSELECT * FROM opportunities WHERE team_id = 933 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 = 933 and sa.provider = 'hubspot';\n\nSELECT * FROM crm_configurations WHERE provider = 'hubspot' and crm_provider_id = 7270388;\n\nSELECT * FROM contacts where crm_configuration_id = 834;\nSELECT * FROM opportunities WHERE team_id = 933\n# AND crm_provider_id IN ('20131586060','46017317898','52543911090','53451356564','54101251892','54323768459');\nAND id IN (8482561,18352941,19042734,19232139,19445140,19472541);\nSELECT * FROM opportunity_contacts\nWHERE opportunity_id IN (8482561,18352941,19042734,19232139,19445140,19472541);\n\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 485; #\nSELECT * FROM opportunities WHERE team_id = 933 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 = 933 and sa.provider = 'hubspot';\n\nselect crm.provider, l.* from leads l join crm_configurations crm on l.crm_configuration_id = crm.id\nwhere crm.provider NOT IN ('salesforce', 'integration-app', 'bullhorn', 'copper')\n# and l.converted_at IS NOT NULL\n;\n\n# ********************************************************************\nSELECT * FROM activities a WHERE type IN ('email-inbound', 'email-outbound')\nand opportunity_id IS NULL\norder by id desc;\n\nSELECT * FROM teams WHERE id = 604; # 598\nSELECT * FROM activities WHERE id = 74410828; # chelseaw@allvoices.co\nSELECT * FROM accounts WHERE id = 20068382;\nSELECT * FROM accounts WHERE id = 35186038;\n\nSELECT * FROM contacts WHERE team_id = 852 and updated_at > '2026-01-23 12:30: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 = 559 and sa.provider = 'hubspot';\n\nSELECT * FROM activities WHERE uuid_to_bin('cb6342b6-a183-401c-b0af-ede92b2ae763') = uuid;\nselect * from sidekick_settings where team_id = 781;\n\nSELECT * FROM crm_configurations where provider = 'hubspot' and crm_provider_id = 26651871; # Teya\nSELECT * FROM crm_configurations where provider = 'hubspot' and crm_provider_id = 7562435;\nSELECT * FROM crm_configurations where provider = 'hubspot' and crm_provider_id = 8420347; # opflit 2100\n\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 711;\nSELECT * FROM activities where crm_configuration_id = 711 and crm_provider_id IS NULL\nand is_internal = 0 and status = 'completed'\norder by id desc;\n\nSELECT * FROM crm_layout_entities\nWHERE crm_layout_id IN (2352, 2353);\n;\n\nSELECT * FROM crm_configurations where provider = 'hubspot' and id = 530;\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 = 'hubspot';\n\nSELECT * FROM activities WHERE uuid_to_bin('c6ca4b22-7738-4563-a95d-b8a9598924ae') = uuid;\nSELECT * FROM activities WHERE uuid_to_bin('442abb2b-28bd-4be8-9c25-19e9bf02766d') = uuid;\nselect * from contacts\nwhere crm_configuration_id = 530\nand crm_provider_id = 872252;\n\nselect * from activities where crm_configuration_id = 530\nand user_id = 14343 and type like '%softphone%'\nand created_at between '2026-01-28 15:00:00' and '2026-01-28 15:10:00';\n\nSELECT * FROM crm_configurations where provider = 'hubspot' and crm_provider_id = 25666868; # Teya\nSELECT * FROM crm_configurations where provider = 'hubspot' and crm_provider_id = 8646335; # Teya\nSELECT * FROM crm_configurations where provider = 'hubspot' and crm_provider_id IN (5933397);\n\n\nSELECT t.name, t.id, t.owner_id, c.id, c.provider, c.crm_base_url FROM teams t\nJOIN crm_configurations c ON t.id = c.team_id\nWHERE t.status = 'active';\n\nSELECT * FROM teams where id = 1091;\nSELECT * FROM crm_configurations where team_id = 1091;\nSELECT * FROM activity_providers where team_id = 1091;\nSELECT * FROM activities where crm_configuration_id = 1024 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;\n\n\nSELECT * FROM teams WHERE name LIKE '%Leadventure%';\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 = 1091 and sa.provider = 'salesforce';\n\nSELECT * FROM teams WHERE name LIKE '%Wilson%'; # 862, 812\nSELECT * FROM teams where id = 862;\nSELECT * FROM crm_configurations where team_id = 862;\nSELECT * FROM activity_providers where team_id = 862;\nSELECT * FROM activities where crm_configuration_id = 812 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;\n\n\nSELECT t.id, crm.id, crm.provider, ap.* FROM teams t\njoin crm_configurations crm on t.id = crm.team_id\njoin activity_providers ap on t.id = ap.team_id\nwhere t.status = 'active' and ap.is_enabled = 1\nand crm.provider = 'hubspot'\nand ap.provider NOT IN ('hubspot', 'aircall', 'uploader', 'gong', 'twilio', 'zoom-bot', 'google-meet', 'ms-teams',\n 'outreach', 'close', 'ringcentral', 'dialpad', 'zoom-phone');\n\nSELECT * FROM teams where id = 1068;\nSELECT * FROM crm_configurations where team_id = 1068;\nSELECT * FROM activity_providers where team_id = 1068;\n\nSELECT * FROM activities a\nwhere crm_configuration_id = 993 and type IN ('softphone', 'softphone-outbound')\nand a.provider NOT IN ('hubspot', 'uploader', 'gong', 'twilio', 'google-meet', 'ms-teams','close'\n )\n# and telephony_provider_id = '019c1131-a22f-4792-b9ea-20adf6a02ed0'\norder by a.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 = 1068 and sa.provider = 'hubspot';\n\n# ********************************************************************\n# ********************************************************************\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 882; # 933 - GoGlobal , portalId: 6017093\nSELECT * FROM opportunities WHERE team_id = 933 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 933 and updated_at > '2026-02-06 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 = 933 and sa.provider = 'hubspot';\n\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 834; # 882 - AnyVan , portalId: 5468262\nSELECT * FROM contacts WHERE crm_configuration_id = 834 and updated_at > '2026-03-30 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE crm_configuration_id = 834 and updated_at > '2026-03-04 08: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 = 882 and sa.provider = 'hubspot';\nselect * from crm_layouts where crm_configuration_id = 834;\nselect * from crm_layout_entities where crm_layout_id = 2780;\nselect * from crm_fields where id IN (321153,321192,321193,321194);\n\nSELECT * FROM opportunities WHERE crm_configuration_id = 834 and id = 10993426;\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 988; # 1057 - Teya (543ce4f4-168c-4571-91ea-5b35c253f06f) , portalId: 26651871\nSELECT * FROM opportunities WHERE team_id = 1057 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 1057 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 = 1057 and sa.provider = 'hubspot';\n\nSELECT * FROM crm_configurations where id = 533; # 559 - Connectd , portalId: 6710988\nSELECT * FROM opportunities WHERE team_id = 559 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 559 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 801; # 852 - Rise Vision , portalId: 2700250\nSELECT * FROM opportunities WHERE team_id = 852 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 852 and updated_at > '2026-02-04 00:00:00' order by updated_at desc; # 6th last\n\nSELECT * FROM crm_configurations where id = 962; # 1034 - evergrowth.io , portalId: 143180990\nSELECT * FROM opportunities WHERE team_id = 1034 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 1034 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\n\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 1037; # 1102 - Jibble , portalId: 6649755\nSELECT * FROM opportunities WHERE team_id = 1102 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 1102 and updated_at > '2026-02-04 12:30:00' order by updated_at desc; # 8\n\nSELECT * FROM crm_configurations where id = 1015; # 1049 - Travefy , portalId: 48904401\nSELECT * FROM opportunities WHERE team_id = 1049 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 1049 and updated_at > '2026-02-04 12:30:00' order by updated_at desc; # 20\n\nSELECT * FROM crm_configurations where id = 64; # 70 - SalaryFinance , portalId: 3404115\nSELECT * FROM opportunities WHERE team_id = 70 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 70 and updated_at > '2026-02-04 12:30:00' order by updated_at desc; # 6th last\n\nSELECT * FROM crm_configurations where id = 802; # 853 - Street Group , portalId: 7658438\nSELECT * FROM opportunities WHERE team_id = 853 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 853 and updated_at > '2026-02-04 12:30:00' order by updated_at desc; # 10\n\nSELECT * FROM crm_configurations where id = 872; # 921 - In Professional Development , portalId: 9238273\nSELECT * FROM opportunities WHERE team_id = 921 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 921 and updated_at > '2026-02-04 12:30:00' order by updated_at desc; # 2\n\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 550; # 576 - SeedLegals , portalId: 3028661\nSELECT * FROM opportunities WHERE team_id = 576 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 576 and updated_at > '2026-02-05 14:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 989; # 1058 - rtaoutdoor.com , portalId: 22371204\nSELECT * FROM opportunities WHERE team_id = 1058 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 1058 and updated_at > '2026-02-05 14:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 896; # 946 - Mintago , portalId: 6621281\nSELECT * FROM opportunities WHERE team_id = 946 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 946 and updated_at > '2026-02-05 14:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 617; # 641 - PCS , portalId: 5244937\nSELECT * FROM opportunities WHERE team_id = 641 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 641 and updated_at > '2026-02-05 14:00:00' order by updated_at desc; # 7th\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 649; # 670 - Eventeny , portalId: 4492849\nSELECT * FROM opportunities WHERE team_id = 670 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 670 and updated_at > '2026-02-09 08:00:00' order by updated_at desc; #\n\nSELECT * FROM crm_configurations where id = 48; # 51 - CleanCloud , portalId: 4373137\nSELECT * FROM opportunities WHERE team_id = 51 and updated_at > '2026-03-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 51 and updated_at > '2026-02-09 08:00:00' order by updated_at desc;\nselect * from users where team_id = 51; # 7783\nSELECT * FROM groups WHERE uuid_to_bin('8a8d2cb6-8b55-4fa3-8b5c-5f0e3d8de59a') = uuid; # 1130\nselect * from activity_searches where user_id = 7783;\nselect * from activity_search_filters where activity_search_id IN (32291, 32292);\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 = 272; # 290 - Bonham & Brook , portalId: 5705856\nSELECT * FROM opportunities WHERE team_id = 290 and updated_at > '2026-02-05 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 290 and updated_at > '2026-02-09 08:00:00' order by updated_at desc; # 6th\n# ********************************************************************\nSELECT * FROM crm_configurations where provider = 'hubspot';\nSELECT * FROM crm_configurations where id = 1056; # 1119 - Chromatic , portalId: 45602133\nSELECT * FROM opportunities WHERE team_id = 1119 and remotely_created_at > '2026-02-01 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 1119 and updated_at > '2026-02-09 09:00:00' order by updated_at desc; # null\n# ********************************************************************\n\nselect * from contacts where crm_provider_id = '003Uu00000ojD4NIAU';\nselect\n cp.*\n# DISTINCT t.id\n# cp.id, cp.user_id, t.id, cp.crm_configuration_id, cp.contact_fields\nFROM crm_profiles cp\nJOIN crm_configurations crm on crm.id = cp.crm_configuration_id\nJOIN users u on u.id = cp.user_id\nJOIN teams t ON t.id = crm.team_id\nWHERE crm.provider = 'salesforce' and t.status = 'active'\n and cp.archived_at IS NULL and u.deleted_at IS NULL\n and t.id NOT IN (1093)\n and t.id = 2\n and cp.contact_fields IS NULL;\n# and c.crm_provider_id = '003Uu00000ojD4NIAU';\n\nSELECT * FROM users WHERE id = 26484;\nSELECT * FROM crm_profiles WHERE user_id = 26484;\nSELECT * FROM social_accounts WHERE sociable_id = 26484;\nSELECT * FROM crm_configurations where provider = 'salesforce';\nselect * from users where id IN (10022, 10403);\nselect * from users where team_id IN (526);\nselect * from teams where id IN (526, 532);\nselect * from crm_configurations where id IN (500, 516);\nselect * from crm_profiles where crm_configuration_id IN (500, 516) and user_id IN (10022, 10403);\nselect * from contacts where crm_configuration_id IN (500, 516) and crm_provider_id = '003Uu00000ojD4NIAU';\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 = 526 and sa.provider = 'salesforce';\nselect * from team_settings where team_id IN (526, 532);\n\nselect * from users where id IN (22824);\nselect * from crm_profiles where crm_configuration_id IN (1026);\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 = 1093 and sa.provider = 'salesforce';\n\nselect * from teams where id = 1099;\nselect * from users where id = 29643\n\nselect * from activity_processing_states;\n\nSELECT * FROM teams where name LIKE '%Fare%'; # 233\nSELECT * FROM opportunities where crm_configuration_id = 215\n# and crm_provider_id = 'oppo_ogESZf2P50nDrd1nGPvKDXeA6sSaTN5v51Lp4ayVzKR'\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 = 1088 and sa.provider = 'hubspot';\n\nSELECT * FROM teams order by updated_at DESC\nSELECT * FROM crm_configurations WHERE id = 1019; # SimpleConsign 1088 - no social account\n\nselect * from crm_configurations where provider = 'pipedrive';\n\nselect * from teams where id = 957;\nselect * from crm_configurations where id = 957;\n\nSELECT * FROM teams WHERE name LIKE '%Prolific%'; # 544, 518, 10743\nSELECT * FROM opportunities where crm_configuration_id = 518 order by id desc;\n\nselect * from users where team_id = 1; # 26726 - Gabriela Dureva\nSELECT * FROM opportunities where user_id = 26726; # 16834447 - Prolific\nselect * from activities where user_id = 26726 order by id desc;\nselect * from contacts where crm_configuration_id = 1\nand email IN ('charlotte.ward@prolific.com', 'frankie.bryant@prolific.com'); # 2094416, 2093620\nSELECT * FROM contacts WHERE id = 6284931;\n\nSELECT p.* FROM activities a JOIN participants p ON a.id = p.activity_id\nWHERE a.user_id = 26726 and p.lead_id IN (2094416, 2093620) and a.created_at > '2026-01-01 00:00:00' order by p.email;\n\nselect * from activities where id IN (75509259,75509261,75509261,75511034,75026464,75517602,75517605);\nselect * from crm_configurations where id = 1;\n\n43801692-1aeb-32ce-acba-5b80a479701a\n44c3c9cf-6f5e-75f3-8179-bc9f75dd2b1b\n405975c0-b3d0-7aaa-821f-09d59cae6dd1\n4caf848d-4bed-2299-b248-7788d41f9fca\n49bedc3f-f196-eef3-89c3-dea6a3b4aa63\n43420989-a09d-b8f8-9806-c8bbf7a02aac\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 = 1 and sa.provider = 'salesforce';\n\nSELECT * FROM activities WHERE id = 75461988;\n\nSELECT * FROM activities WHERE uuid_to_bin('d6c5052e-e972-49e9-8912-26f2f7d6c5f6') = uuid;\n\nselect * from contacts where 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 users where id = 21047;\nSELECT * FROM crm_configurations WHERE id = 892;\nSELECT * FROM teams WHERE id = 942;\nselect * from opportunities where team_id = 942 order by updated_at desc;\nselect * from contacts where team_id = 942 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 = 942 and sa.provider = 'hubspot';\n\nSELECT * FROM opportunities where team_id = 1 and crm_provider_id IN ('006Pq00000NeH6XIAV', '006Pq000007z8kdIAA'); # 10697889, 6621430\nSELECT * FROM crm_configurations WHERE id = 1;\nSELECT * FROM teams WHERE crm_id = 1;\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 = 1 and sa.provider = 'salesforce';\n\nselect id, user_id, opportunity_fields from crm_profiles where crm_configuration_id = 1\nSELECT * FROM opportunities where team_id = 1 order by updated_at desc; # 10697889, 6621430\n\nselect * from teams where id = 852;\nselect * from groups where id = 2286;\nselect * from sidekick_settings where team_id = 852;\nselect * from default_activity_types where team_id = 852;\n\n\nSELECT cc.provider, cc.id, p.id, u.*\nFROM users u\nLEFT JOIN crm_profiles p ON u.id = p.user_id AND p.id IS NULL -- no profile\nINNER JOIN teams t ON u.team_id = t.id AND t.status = 'active' -- team is active\nINNER JOIN crm_configurations cc ON t.crm_id = cc.id\nWHERE u.status = 1 AND u.deleted_at IS NULL\nAND u.crm_required = 1\nAND u.team_id = 1\nORDER BY u.team_id;\n\nSELECT * FROM crm_profiles cp where cp.crm_configuration_id = 1 and cp.user_id IN (\n18481\n );\n\nSELECT cc.provider, cc.id, p.id, u.*\nFROM users u\nLEFT JOIN crm_profiles p ON u.id = p.user_id\nINNER JOIN teams t ON u.team_id = t.id AND t.status = 'active'\nINNER JOIN crm_configurations cc ON t.crm_id = cc.id\nWHERE u.status = 1\n AND u.deleted_at IS NULL\n AND u.crm_required = 1\n# AND u.team_id = 1\n AND p.id IS NULL -- Move this condition to WHERE clause\nORDER BY u.team_id;\n\nSELECT * FROM opportunities WHERE id = 20002609;\nselect * from teams where id = 1122; # Velatir, 29953 - christian@velatir.com\nselect * from crm_configurations where id = 1060;\nselect * from crm_layouts where crm_configuration_id = 1060;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 3596;\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 = 1122 and sa.provider = 'hubspot';\nselect * from opportunities where team_id = 1122 order by updated_at desc;\n\nselect * from crm_field_data where object_type = 'contact';\n\nSELECT * FROM activities WHERE uuid_to_bin('374fc8ed-3315-4c9f-9b25-318b7fd2928f') = uuid; # 76584262\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 = 248 and sa.provider = 'salesforce';\n\nSELECT * FROM crm_profiles where user_id = 24115; # 005QF000002CswMYAS\nSELECT * FROM users where id = 24115;\nSELECT * FROM accounts where id = 4002896;\nSELECT * FROM teams WHERE name LIKE '%adswerve%';\nSELECT * FROM opportunities where crm_configuration_id = 230 AND crm_provider_id IN (\"0069N000003GIQ9QAO\",\"0061r000019yGP9AAM\",\"0066900001S2KWlAAN\",\"0066900001TDpj2AAD\",\"0066900001b8uEwAAI\",\"0069N000001rQi0QAE\",\"006QF00000KD40mYAD\",\"006QF00000LzpRJYAZ\",\"0069N000002uomtQAA\",\"0069N000002xlMLQAY\",\"0066900001NV6ubAAD\",\"0061r00001HJp45AAD\",\"006QF00000uTlUoYAK\",\"006QF00000v0bZqYAI\");\nSELECT * FROM opportunities WHERE crm_configuration_id = 230 AND crm_provider_id = '0069N000003GIQ9QAO'; # 6272203\n\nSELECT u.id, u.email, ac.name, a.* FROM activities a\nJOIN users u ON a.user_id = u.id\nJOIN accounts ac ON a.account_id = ac.id\nWHERE\nuuid_to_bin('e3269598-b562-44fb-b5e9-9d2694dc63e0') = a.uuid or\nuuid_to_bin('66ddc3ab-4e15-45aa-af0c-248c1eece593') = a.uuid or\nuuid_to_bin('826bd328-e1cc-4213-b8d8-572454cacc07') = a.uuid;\n\nselect * from users where id = 5825;\nSELECT * FROM activities WHERE uuid_to_bin('e56aa2e8-231a-421b-ab1f-cb38ed2bf573') = uuid;\n\nselect * from activities where uuid_to_bin('91e13b2f-2d1b-45f8-b1fd-1141b6563782') = uuid;\n19594, 862\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 = 862 and sa.provider = 'salesforce';\n\nselect * from automated_reports where id = 36;\nselect ar.frequency, r.*, ar.* from automated_report_results r\njoin automated_reports ar on r.report_id = ar.id\nwhere ar.frequency != 'one_off';\n\nselect s.* from activity_searches s join users u ON s.user_id = u.id where u.team_id = 882;\nselect * from nudges n where n.activity_search_id\n\nselect * from teams where created_at > '2026-03-09';\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 1065; # 1065\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 3617;\n\nselect * from users where team_id = 1 and name like '%Lukas%'; # 7160\n\nSELECT * FROM teams WHERE id = 575;\nselect * from opportunities where team_id = 575;\nSELECT * FROM teams WHERE name LIKE '%Integrum ESG%'; # 1126, 1065,\nselect * from opportunities where team_id = 1126;\nSELECT * FROM teams WHERE name LIKE '%Base%'; # 1125, 1063,\nselect * from opportunities where team_id = 1125;\nselect * from contacts c\nwhere c.team_id = 882;\n\nSELECT * FROM activities WHERE id = 76822967;\nSELECT * FROM crm_profiles WHERE user_id = 15440;\nSELECT * FROM crm_profiles WHERE crm_configuration_id = 555;\nSELECT * FROM crm_configurations WHERE id = 555;\nSELECT * FROM users WHERE id = 15440; # team. 581, gr. 15440, pl. 3911, act. field 162182\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 = 581 and sa.provider = 'salesforce';\n\nSELECT * FROM automated_report_results order by id desc;\n\nselect * from features;\nselect * from team_features where feature_id = 40;\n\nselect * from teams where id = 556;\n\nselect * from automated_reports;\nwhere id = 54; # 4fdd41f6-dcf0-30d0-b339-7345381b6044 , [\"pdf\",\"podcast\"]\nSELECT * FROM automated_report_results WHERE uuid_to_bin('822fa41b-afd3-43a9-a248-86b0e36f3131') = uuid;\nselect * from automated_report_results order by id desc;\nSELECT * FROM automated_report_results WHERE id = 1919;\n\nselect * from automated_report_results WHERE report_id = 54;\n\nselect * from opportunities where id = 7594349;\n\nSELECT * FROM teams WHERE name LIKE '%Les%'; # 711, 692, 16067 - jiminnyintegration@lesmills.com\nselect * from playbooks where team_id = 711; # event 226147\nSELECT * FROM playbook_categories WHERE playbook_id = 5515;\nSELECT * FROM crm_fields WHERE crm_configuration_id = 692 and object_type = 'event';\nSELECT * FROM crm_fields WHERE id = 226147;\nSELECT * FROM crm_field_values WHERE crm_field_id = 226147;\n\nSELECT * FROM crm_configurations WHERE id = 692;\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 = 711 and sa.provider = 'salesforce';\n\nSELECT * FROM crm_profiles cp JOIN users u on u.id = cp.user_id WHERE u.team_id = 711;\n\nselect * from leads;\n\nselect * from calendars;\n\nSELECT\n t.id AS team_id,\n t.name,\n LOWER(SUBSTRING_INDEX(c.calendar_provider_id, '@', -1)) AS calendar_domain\nFROM teams t\nJOIN users u ON u.team_id = t.id\nJOIN calendars c ON c.user_id = u.id AND c.status = 'active' AND c.calendar_provider_id LIKE '%@%'\nLEFT JOIN team_domains td\n ON td.team_id = t.id\n AND td.deleted_at IS NULL\n AND td.domain = LOWER(SUBSTRING_INDEX(c.calendar_provider_id, '@', -1))\nGROUP BY t.id, t.name, calendar_domain\nORDER BY t.name, calendar_domain;\n\nselect * from users u join calendars c on c.user_id = u.id\nwhere u.team_id = 882;\n\n\nselect * from activities where id = 74049485; # team 563 crm 537\nselect * from activities where id = 73272382; # team 563 crm 537\nselect * from activities where id = 64400389; # team 563 crm 537\nselect * from activities where id = 58081273; # team 563 crm 537\nselect * from activities where id = 54520297; # team 563 crm 537\nselect * from participants where activity_id = 58081273;\n\nselect * from activities where crm_configuration_id = 537 and provider = 'aircall'\nand account_id = 19003658 order by updated_at desc;\n\nselect * from contacts where crm_configuration_id = 537 and id = 35957759;\nselect * from accounts where crm_configuration_id = 537 and id = 19003658;\n\nselect * from automated_report_results where id = 1976;\nselect * from automated_reports where id = 583;\nselect * from activity_searches where id = 87714;\nselect * from activity_search_filters where activity_search_id = 87714;\n\nSELECT * FROM activities WHERE uuid_to_bin('8827f672-202d-4162-9d04-73ff5f0566a9') = uuid\nor uuid_to_bin('47842446-af51-4bcb-854f-cc6560290101') = uuid;\n\nSELECT * FROM crm_configurations WHERE provider = 'hubspot';\nselect * from rate_limits;\n\nselect * from automated_report_results where media_type = 'pdf' and status = 2\nand id IN (18, 1872);\nselect * from automated_reports where id = 54;\nSELECT * FROM users WHERE id IN (24623,29443,29613);\n\nSELECT * FROM automated_report_results WHERE uuid_to_bin('822fa41b-afd3-43a9-a248-86b0e36f3131') = uuid;","depth":4,"on_screen":true,"value":"SELECT * FROM teams WHERE name LIKE '%litify%'; # 1069, 994, 24993\nSELECT * FROM users WHERE id = 25061;\nSELECT * FROM crm_profiles WHERE crm_configuration_id = 994;\nSELECT * FROM crm_profiles WHERE user_id = 25061;\n\nselect * from crm_configurations where id = 834;\nSELECT * FROM teams WHERE id = 882;\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 = 882 and sa.provider = 'hubspot';\n\nSELECT * FROM crm_configurations where id = 882; # 933 - GoGlobal\nSELECT * FROM opportunities WHERE team_id = 933 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 = 933 and sa.provider = 'hubspot';\n\nSELECT * FROM crm_configurations WHERE provider = 'hubspot' and crm_provider_id = 7270388;\n\nSELECT * FROM contacts where crm_configuration_id = 834;\nSELECT * FROM opportunities WHERE team_id = 933\n# AND crm_provider_id IN ('20131586060','46017317898','52543911090','53451356564','54101251892','54323768459');\nAND id IN (8482561,18352941,19042734,19232139,19445140,19472541);\nSELECT * FROM opportunity_contacts\nWHERE opportunity_id IN (8482561,18352941,19042734,19232139,19445140,19472541);\n\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 485; #\nSELECT * FROM opportunities WHERE team_id = 933 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 = 933 and sa.provider = 'hubspot';\n\nselect crm.provider, l.* from leads l join crm_configurations crm on l.crm_configuration_id = crm.id\nwhere crm.provider NOT IN ('salesforce', 'integration-app', 'bullhorn', 'copper')\n# and l.converted_at IS NOT NULL\n;\n\n# ********************************************************************\nSELECT * FROM activities a WHERE type IN ('email-inbound', 'email-outbound')\nand opportunity_id IS NULL\norder by id desc;\n\nSELECT * FROM teams WHERE id = 604; # 598\nSELECT * FROM activities WHERE id = 74410828; # chelseaw@allvoices.co\nSELECT * FROM accounts WHERE id = 20068382;\nSELECT * FROM accounts WHERE id = 35186038;\n\nSELECT * FROM contacts WHERE team_id = 852 and updated_at > '2026-01-23 12:30: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 = 559 and sa.provider = 'hubspot';\n\nSELECT * FROM activities WHERE uuid_to_bin('cb6342b6-a183-401c-b0af-ede92b2ae763') = uuid;\nselect * from sidekick_settings where team_id = 781;\n\nSELECT * FROM crm_configurations where provider = 'hubspot' and crm_provider_id = 26651871; # Teya\nSELECT * FROM crm_configurations where provider = 'hubspot' and crm_provider_id = 7562435;\nSELECT * FROM crm_configurations where provider = 'hubspot' and crm_provider_id = 8420347; # opflit 2100\n\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 711;\nSELECT * FROM activities where crm_configuration_id = 711 and crm_provider_id IS NULL\nand is_internal = 0 and status = 'completed'\norder by id desc;\n\nSELECT * FROM crm_layout_entities\nWHERE crm_layout_id IN (2352, 2353);\n;\n\nSELECT * FROM crm_configurations where provider = 'hubspot' and id = 530;\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 = 'hubspot';\n\nSELECT * FROM activities WHERE uuid_to_bin('c6ca4b22-7738-4563-a95d-b8a9598924ae') = uuid;\nSELECT * FROM activities WHERE uuid_to_bin('442abb2b-28bd-4be8-9c25-19e9bf02766d') = uuid;\nselect * from contacts\nwhere crm_configuration_id = 530\nand crm_provider_id = 872252;\n\nselect * from activities where crm_configuration_id = 530\nand user_id = 14343 and type like '%softphone%'\nand created_at between '2026-01-28 15:00:00' and '2026-01-28 15:10:00';\n\nSELECT * FROM crm_configurations where provider = 'hubspot' and crm_provider_id = 25666868; # Teya\nSELECT * FROM crm_configurations where provider = 'hubspot' and crm_provider_id = 8646335; # Teya\nSELECT * FROM crm_configurations where provider = 'hubspot' and crm_provider_id IN (5933397);\n\n\nSELECT t.name, t.id, t.owner_id, c.id, c.provider, c.crm_base_url FROM teams t\nJOIN crm_configurations c ON t.id = c.team_id\nWHERE t.status = 'active';\n\nSELECT * FROM teams where id = 1091;\nSELECT * FROM crm_configurations where team_id = 1091;\nSELECT * FROM activity_providers where team_id = 1091;\nSELECT * FROM activities where crm_configuration_id = 1024 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;\n\n\nSELECT * FROM teams WHERE name LIKE '%Leadventure%';\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 = 1091 and sa.provider = 'salesforce';\n\nSELECT * FROM teams WHERE name LIKE '%Wilson%'; # 862, 812\nSELECT * FROM teams where id = 862;\nSELECT * FROM crm_configurations where team_id = 862;\nSELECT * FROM activity_providers where team_id = 862;\nSELECT * FROM activities where crm_configuration_id = 812 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;\n\n\nSELECT t.id, crm.id, crm.provider, ap.* FROM teams t\njoin crm_configurations crm on t.id = crm.team_id\njoin activity_providers ap on t.id = ap.team_id\nwhere t.status = 'active' and ap.is_enabled = 1\nand crm.provider = 'hubspot'\nand ap.provider NOT IN ('hubspot', 'aircall', 'uploader', 'gong', 'twilio', 'zoom-bot', 'google-meet', 'ms-teams',\n 'outreach', 'close', 'ringcentral', 'dialpad', 'zoom-phone');\n\nSELECT * FROM teams where id = 1068;\nSELECT * FROM crm_configurations where team_id = 1068;\nSELECT * FROM activity_providers where team_id = 1068;\n\nSELECT * FROM activities a\nwhere crm_configuration_id = 993 and type IN ('softphone', 'softphone-outbound')\nand a.provider NOT IN ('hubspot', 'uploader', 'gong', 'twilio', 'google-meet', 'ms-teams','close'\n )\n# and telephony_provider_id = '019c1131-a22f-4792-b9ea-20adf6a02ed0'\norder by a.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 = 1068 and sa.provider = 'hubspot';\n\n# ********************************************************************\n# ********************************************************************\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 882; # 933 - GoGlobal , portalId: 6017093\nSELECT * FROM opportunities WHERE team_id = 933 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 933 and updated_at > '2026-02-06 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 = 933 and sa.provider = 'hubspot';\n\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 834; # 882 - AnyVan , portalId: 5468262\nSELECT * FROM contacts WHERE crm_configuration_id = 834 and updated_at > '2026-03-30 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE crm_configuration_id = 834 and updated_at > '2026-03-04 08: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 = 882 and sa.provider = 'hubspot';\nselect * from crm_layouts where crm_configuration_id = 834;\nselect * from crm_layout_entities where crm_layout_id = 2780;\nselect * from crm_fields where id IN (321153,321192,321193,321194);\n\nSELECT * FROM opportunities WHERE crm_configuration_id = 834 and id = 10993426;\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 988; # 1057 - Teya (543ce4f4-168c-4571-91ea-5b35c253f06f) , portalId: 26651871\nSELECT * FROM opportunities WHERE team_id = 1057 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 1057 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 = 1057 and sa.provider = 'hubspot';\n\nSELECT * FROM crm_configurations where id = 533; # 559 - Connectd , portalId: 6710988\nSELECT * FROM opportunities WHERE team_id = 559 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 559 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 801; # 852 - Rise Vision , portalId: 2700250\nSELECT * FROM opportunities WHERE team_id = 852 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 852 and updated_at > '2026-02-04 00:00:00' order by updated_at desc; # 6th last\n\nSELECT * FROM crm_configurations where id = 962; # 1034 - evergrowth.io , portalId: 143180990\nSELECT * FROM opportunities WHERE team_id = 1034 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 1034 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;\n\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 1037; # 1102 - Jibble , portalId: 6649755\nSELECT * FROM opportunities WHERE team_id = 1102 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 1102 and updated_at > '2026-02-04 12:30:00' order by updated_at desc; # 8\n\nSELECT * FROM crm_configurations where id = 1015; # 1049 - Travefy , portalId: 48904401\nSELECT * FROM opportunities WHERE team_id = 1049 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 1049 and updated_at > '2026-02-04 12:30:00' order by updated_at desc; # 20\n\nSELECT * FROM crm_configurations where id = 64; # 70 - SalaryFinance , portalId: 3404115\nSELECT * FROM opportunities WHERE team_id = 70 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 70 and updated_at > '2026-02-04 12:30:00' order by updated_at desc; # 6th last\n\nSELECT * FROM crm_configurations where id = 802; # 853 - Street Group , portalId: 7658438\nSELECT * FROM opportunities WHERE team_id = 853 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 853 and updated_at > '2026-02-04 12:30:00' order by updated_at desc; # 10\n\nSELECT * FROM crm_configurations where id = 872; # 921 - In Professional Development , portalId: 9238273\nSELECT * FROM opportunities WHERE team_id = 921 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 921 and updated_at > '2026-02-04 12:30:00' order by updated_at desc; # 2\n\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 550; # 576 - SeedLegals , portalId: 3028661\nSELECT * FROM opportunities WHERE team_id = 576 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 576 and updated_at > '2026-02-05 14:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 989; # 1058 - rtaoutdoor.com , portalId: 22371204\nSELECT * FROM opportunities WHERE team_id = 1058 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 1058 and updated_at > '2026-02-05 14:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 896; # 946 - Mintago , portalId: 6621281\nSELECT * FROM opportunities WHERE team_id = 946 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 946 and updated_at > '2026-02-05 14:00:00' order by updated_at desc;\n\nSELECT * FROM crm_configurations where id = 617; # 641 - PCS , portalId: 5244937\nSELECT * FROM opportunities WHERE team_id = 641 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 641 and updated_at > '2026-02-05 14:00:00' order by updated_at desc; # 7th\n# ********************************************************************\nSELECT * FROM crm_configurations where id = 649; # 670 - Eventeny , portalId: 4492849\nSELECT * FROM opportunities WHERE team_id = 670 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 670 and updated_at > '2026-02-09 08:00:00' order by updated_at desc; #\n\nSELECT * FROM crm_configurations where id = 48; # 51 - CleanCloud , portalId: 4373137\nSELECT * FROM opportunities WHERE team_id = 51 and updated_at > '2026-03-04 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 51 and updated_at > '2026-02-09 08:00:00' order by updated_at desc;\nselect * from users where team_id = 51; # 7783\nSELECT * FROM groups WHERE uuid_to_bin('8a8d2cb6-8b55-4fa3-8b5c-5f0e3d8de59a') = uuid; # 1130\nselect * from activity_searches where user_id = 7783;\nselect * from activity_search_filters where activity_search_id IN (32291, 32292);\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 = 272; # 290 - Bonham & Brook , portalId: 5705856\nSELECT * FROM opportunities WHERE team_id = 290 and updated_at > '2026-02-05 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 290 and updated_at > '2026-02-09 08:00:00' order by updated_at desc; # 6th\n# ********************************************************************\nSELECT * FROM crm_configurations where provider = 'hubspot';\nSELECT * FROM crm_configurations where id = 1056; # 1119 - Chromatic , portalId: 45602133\nSELECT * FROM opportunities WHERE team_id = 1119 and remotely_created_at > '2026-02-01 00:00:00' order by updated_at desc;\nSELECT * FROM opportunities WHERE team_id = 1119 and updated_at > '2026-02-09 09:00:00' order by updated_at desc; # null\n# ********************************************************************\n\nselect * from contacts where crm_provider_id = '003Uu00000ojD4NIAU';\nselect\n cp.*\n# DISTINCT t.id\n# cp.id, cp.user_id, t.id, cp.crm_configuration_id, cp.contact_fields\nFROM crm_profiles cp\nJOIN crm_configurations crm on crm.id = cp.crm_configuration_id\nJOIN users u on u.id = cp.user_id\nJOIN teams t ON t.id = crm.team_id\nWHERE crm.provider = 'salesforce' and t.status = 'active'\n and cp.archived_at IS NULL and u.deleted_at IS NULL\n and t.id NOT IN (1093)\n and t.id = 2\n and cp.contact_fields IS NULL;\n# and c.crm_provider_id = '003Uu00000ojD4NIAU';\n\nSELECT * FROM users WHERE id = 26484;\nSELECT * FROM crm_profiles WHERE user_id = 26484;\nSELECT * FROM social_accounts WHERE sociable_id = 26484;\nSELECT * FROM crm_configurations where provider = 'salesforce';\nselect * from users where id IN (10022, 10403);\nselect * from users where team_id IN (526);\nselect * from teams where id IN (526, 532);\nselect * from crm_configurations where id IN (500, 516);\nselect * from crm_profiles where crm_configuration_id IN (500, 516) and user_id IN (10022, 10403);\nselect * from contacts where crm_configuration_id IN (500, 516) and crm_provider_id = '003Uu00000ojD4NIAU';\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 = 526 and sa.provider = 'salesforce';\nselect * from team_settings where team_id IN (526, 532);\n\nselect * from users where id IN (22824);\nselect * from crm_profiles where crm_configuration_id IN (1026);\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 = 1093 and sa.provider = 'salesforce';\n\nselect * from teams where id = 1099;\nselect * from users where id = 29643\n\nselect * from activity_processing_states;\n\nSELECT * FROM teams where name LIKE '%Fare%'; # 233\nSELECT * FROM opportunities where crm_configuration_id = 215\n# and crm_provider_id = 'oppo_ogESZf2P50nDrd1nGPvKDXeA6sSaTN5v51Lp4ayVzKR'\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 = 1088 and sa.provider = 'hubspot';\n\nSELECT * FROM teams order by updated_at DESC\nSELECT * FROM crm_configurations WHERE id = 1019; # SimpleConsign 1088 - no social account\n\nselect * from crm_configurations where provider = 'pipedrive';\n\nselect * from teams where id = 957;\nselect * from crm_configurations where id = 957;\n\nSELECT * FROM teams WHERE name LIKE '%Prolific%'; # 544, 518, 10743\nSELECT * FROM opportunities where crm_configuration_id = 518 order by id desc;\n\nselect * from users where team_id = 1; # 26726 - Gabriela Dureva\nSELECT * FROM opportunities where user_id = 26726; # 16834447 - Prolific\nselect * from activities where user_id = 26726 order by id desc;\nselect * from contacts where crm_configuration_id = 1\nand email IN ('charlotte.ward@prolific.com', 'frankie.bryant@prolific.com'); # 2094416, 2093620\nSELECT * FROM contacts WHERE id = 6284931;\n\nSELECT p.* FROM activities a JOIN participants p ON a.id = p.activity_id\nWHERE a.user_id = 26726 and p.lead_id IN (2094416, 2093620) and a.created_at > '2026-01-01 00:00:00' order by p.email;\n\nselect * from activities where id IN (75509259,75509261,75509261,75511034,75026464,75517602,75517605);\nselect * from crm_configurations where id = 1;\n\n43801692-1aeb-32ce-acba-5b80a479701a\n44c3c9cf-6f5e-75f3-8179-bc9f75dd2b1b\n405975c0-b3d0-7aaa-821f-09d59cae6dd1\n4caf848d-4bed-2299-b248-7788d41f9fca\n49bedc3f-f196-eef3-89c3-dea6a3b4aa63\n43420989-a09d-b8f8-9806-c8bbf7a02aac\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 = 1 and sa.provider = 'salesforce';\n\nSELECT * FROM activities WHERE id = 75461988;\n\nSELECT * FROM activities WHERE uuid_to_bin('d6c5052e-e972-49e9-8912-26f2f7d6c5f6') = uuid;\n\nselect * from contacts where 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 users where id = 21047;\nSELECT * FROM crm_configurations WHERE id = 892;\nSELECT * FROM teams WHERE id = 942;\nselect * from opportunities where team_id = 942 order by updated_at desc;\nselect * from contacts where team_id = 942 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 = 942 and sa.provider = 'hubspot';\n\nSELECT * FROM opportunities where team_id = 1 and crm_provider_id IN ('006Pq00000NeH6XIAV', '006Pq000007z8kdIAA'); # 10697889, 6621430\nSELECT * FROM crm_configurations WHERE id = 1;\nSELECT * FROM teams WHERE crm_id = 1;\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 = 1 and sa.provider = 'salesforce';\n\nselect id, user_id, opportunity_fields from crm_profiles where crm_configuration_id = 1\nSELECT * FROM opportunities where team_id = 1 order by updated_at desc; # 10697889, 6621430\n\nselect * from teams where id = 852;\nselect * from groups where id = 2286;\nselect * from sidekick_settings where team_id = 852;\nselect * from default_activity_types where team_id = 852;\n\n\nSELECT cc.provider, cc.id, p.id, u.*\nFROM users u\nLEFT JOIN crm_profiles p ON u.id = p.user_id AND p.id IS NULL -- no profile\nINNER JOIN teams t ON u.team_id = t.id AND t.status = 'active' -- team is active\nINNER JOIN crm_configurations cc ON t.crm_id = cc.id\nWHERE u.status = 1 AND u.deleted_at IS NULL\nAND u.crm_required = 1\nAND u.team_id = 1\nORDER BY u.team_id;\n\nSELECT * FROM crm_profiles cp where cp.crm_configuration_id = 1 and cp.user_id IN (\n18481\n );\n\nSELECT cc.provider, cc.id, p.id, u.*\nFROM users u\nLEFT JOIN crm_profiles p ON u.id = p.user_id\nINNER JOIN teams t ON u.team_id = t.id AND t.status = 'active'\nINNER JOIN crm_configurations cc ON t.crm_id = cc.id\nWHERE u.status = 1\n AND u.deleted_at IS NULL\n AND u.crm_required = 1\n# AND u.team_id = 1\n AND p.id IS NULL -- Move this condition to WHERE clause\nORDER BY u.team_id;\n\nSELECT * FROM opportunities WHERE id = 20002609;\nselect * from teams where id = 1122; # Velatir, 29953 - christian@velatir.com\nselect * from crm_configurations where id = 1060;\nselect * from crm_layouts where crm_configuration_id = 1060;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 3596;\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 = 1122 and sa.provider = 'hubspot';\nselect * from opportunities where team_id = 1122 order by updated_at desc;\n\nselect * from crm_field_data where object_type = 'contact';\n\nSELECT * FROM activities WHERE uuid_to_bin('374fc8ed-3315-4c9f-9b25-318b7fd2928f') = uuid; # 76584262\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 = 248 and sa.provider = 'salesforce';\n\nSELECT * FROM crm_profiles where user_id = 24115; # 005QF000002CswMYAS\nSELECT * FROM users where id = 24115;\nSELECT * FROM accounts where id = 4002896;\nSELECT * FROM teams WHERE name LIKE '%adswerve%';\nSELECT * FROM opportunities where crm_configuration_id = 230 AND crm_provider_id IN (\"0069N000003GIQ9QAO\",\"0061r000019yGP9AAM\",\"0066900001S2KWlAAN\",\"0066900001TDpj2AAD\",\"0066900001b8uEwAAI\",\"0069N000001rQi0QAE\",\"006QF00000KD40mYAD\",\"006QF00000LzpRJYAZ\",\"0069N000002uomtQAA\",\"0069N000002xlMLQAY\",\"0066900001NV6ubAAD\",\"0061r00001HJp45AAD\",\"006QF00000uTlUoYAK\",\"006QF00000v0bZqYAI\");\nSELECT * FROM opportunities WHERE crm_configuration_id = 230 AND crm_provider_id = '0069N000003GIQ9QAO'; # 6272203\n\nSELECT u.id, u.email, ac.name, a.* FROM activities a\nJOIN users u ON a.user_id = u.id\nJOIN accounts ac ON a.account_id = ac.id\nWHERE\nuuid_to_bin('e3269598-b562-44fb-b5e9-9d2694dc63e0') = a.uuid or\nuuid_to_bin('66ddc3ab-4e15-45aa-af0c-248c1eece593') = a.uuid or\nuuid_to_bin('826bd328-e1cc-4213-b8d8-572454cacc07') = a.uuid;\n\nselect * from users where id = 5825;\nSELECT * FROM activities WHERE uuid_to_bin('e56aa2e8-231a-421b-ab1f-cb38ed2bf573') = uuid;\n\nselect * from activities where uuid_to_bin('91e13b2f-2d1b-45f8-b1fd-1141b6563782') = uuid;\n19594, 862\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 = 862 and sa.provider = 'salesforce';\n\nselect * from automated_reports where id = 36;\nselect ar.frequency, r.*, ar.* from automated_report_results r\njoin automated_reports ar on r.report_id = ar.id\nwhere ar.frequency != 'one_off';\n\nselect s.* from activity_searches s join users u ON s.user_id = u.id where u.team_id = 882;\nselect * from nudges n where n.activity_search_id\n\nselect * from teams where created_at > '2026-03-09';\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 1065; # 1065\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 3617;\n\nselect * from users where team_id = 1 and name like '%Lukas%'; # 7160\n\nSELECT * FROM teams WHERE id = 575;\nselect * from opportunities where team_id = 575;\nSELECT * FROM teams WHERE name LIKE '%Integrum ESG%'; # 1126, 1065,\nselect * from opportunities where team_id = 1126;\nSELECT * FROM teams WHERE name LIKE '%Base%'; # 1125, 1063,\nselect * from opportunities where team_id = 1125;\nselect * from contacts c\nwhere c.team_id = 882;\n\nSELECT * FROM activities WHERE id = 76822967;\nSELECT * FROM crm_profiles WHERE user_id = 15440;\nSELECT * FROM crm_profiles WHERE crm_configuration_id = 555;\nSELECT * FROM crm_configurations WHERE id = 555;\nSELECT * FROM users WHERE id = 15440; # team. 581, gr. 15440, pl. 3911, act. field 162182\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 = 581 and sa.provider = 'salesforce';\n\nSELECT * FROM automated_report_results order by id desc;\n\nselect * from features;\nselect * from team_features where feature_id = 40;\n\nselect * from teams where id = 556;\n\nselect * from automated_reports;\nwhere id = 54; # 4fdd41f6-dcf0-30d0-b339-7345381b6044 , [\"pdf\",\"podcast\"]\nSELECT * FROM automated_report_results WHERE uuid_to_bin('822fa41b-afd3-43a9-a248-86b0e36f3131') = uuid;\nselect * from automated_report_results order by id desc;\nSELECT * FROM automated_report_results WHERE id = 1919;\n\nselect * from automated_report_results WHERE report_id = 54;\n\nselect * from opportunities where id = 7594349;\n\nSELECT * FROM teams WHERE name LIKE '%Les%'; # 711, 692, 16067 - jiminnyintegration@lesmills.com\nselect * from playbooks where team_id = 711; # event 226147\nSELECT * FROM playbook_categories WHERE playbook_id = 5515;\nSELECT * FROM crm_fields WHERE crm_configuration_id = 692 and object_type = 'event';\nSELECT * FROM crm_fields WHERE id = 226147;\nSELECT * FROM crm_field_values WHERE crm_field_id = 226147;\n\nSELECT * FROM crm_configurations WHERE id = 692;\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 = 711 and sa.provider = 'salesforce';\n\nSELECT * FROM crm_profiles cp JOIN users u on u.id = cp.user_id WHERE u.team_id = 711;\n\nselect * from leads;\n\nselect * from calendars;\n\nSELECT\n t.id AS team_id,\n t.name,\n LOWER(SUBSTRING_INDEX(c.calendar_provider_id, '@', -1)) AS calendar_domain\nFROM teams t\nJOIN users u ON u.team_id = t.id\nJOIN calendars c ON c.user_id = u.id AND c.status = 'active' AND c.calendar_provider_id LIKE '%@%'\nLEFT JOIN team_domains td\n ON td.team_id = t.id\n AND td.deleted_at IS NULL\n AND td.domain = LOWER(SUBSTRING_INDEX(c.calendar_provider_id, '@', -1))\nGROUP BY t.id, t.name, calendar_domain\nORDER BY t.name, calendar_domain;\n\nselect * from users u join calendars c on c.user_id = u.id\nwhere u.team_id = 882;\n\n\nselect * from activities where id = 74049485; # team 563 crm 537\nselect * from activities where id = 73272382; # team 563 crm 537\nselect * from activities where id = 64400389; # team 563 crm 537\nselect * from activities where id = 58081273; # team 563 crm 537\nselect * from activities where id = 54520297; # team 563 crm 537\nselect * from participants where activity_id = 58081273;\n\nselect * from activities where crm_configuration_id = 537 and provider = 'aircall'\nand account_id = 19003658 order by updated_at desc;\n\nselect * from contacts where crm_configuration_id = 537 and id = 35957759;\nselect * from accounts where crm_configuration_id = 537 and id = 19003658;\n\nselect * from automated_report_results where id = 1976;\nselect * from automated_reports where id = 583;\nselect * from activity_searches where id = 87714;\nselect * from activity_search_filters where activity_search_id = 87714;\n\nSELECT * FROM activities WHERE uuid_to_bin('8827f672-202d-4162-9d04-73ff5f0566a9') = uuid\nor uuid_to_bin('47842446-af51-4bcb-854f-cc6560290101') = uuid;\n\nSELECT * FROM crm_configurations WHERE provider = 'hubspot';\nselect * from rate_limits;\n\nselect * from automated_report_results where media_type = 'pdf' and status = 2\nand id IN (18, 1872);\nselect * from automated_reports where id = 54;\nSELECT * FROM users WHERE id IN (24623,29443,29613);\n\nSELECT * FROM automated_report_results WHERE uuid_to_bin('822fa41b-afd3-43a9-a248-86b0e36f3131') = uuid;","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Project","depth":3,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Project","depth":3,"on_screen":true,"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},"on_screen":false,"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},"on_screen":false,"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},"on_screen":false,"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},"on_screen":false,"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},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"app ~/jiminny/app, folder","depth":6,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":".circleci, folder","depth":7,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":".cursor, folder","depth":7,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":".github","depth":7,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":".sonarlint, folder","depth":7,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":".vscode, folder","depth":7,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":".windsurf, folder","depth":7,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"app, sources root","depth":7,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Actions","depth":8,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"InviteUserToTeamAction.php, class","depth":9,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"MarkUserAsOnboardableAction.php, class","depth":9,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"SyncRecordingFlagsAction.php, class","depth":9,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"UpdateTeamMemberAction.php, class","depth":9,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"UpdateUserRolesAction.php, class","depth":9,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Component","depth":8,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Acl","depth":9,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"ActionItems","depth":9,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Activity","depth":9,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"ActivityAnalytics","depth":9,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"ActivitySearch","depth":9,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"AiActivityType","depth":9,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"AiAutomation","depth":9,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"AiCallScoring","depth":9,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"AskAnything","depth":9,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Dtos","depth":10,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Events","depth":10,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"AskAnythingPromptService.php, class","depth":10,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"HistoryService.php, class","depth":10,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"AskJiminnyAi","depth":9,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"AWS","depth":9,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"BillingManagement","depth":9,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Cache","depth":9,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"CoachingFeedback","depth":9,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Country","depth":9,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"CustomerApi","depth":9,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Database","depth":9,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Datadog","depth":9,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"DateTime","depth":9,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"DealInsights","depth":9,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"DealRisks","depth":9,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"ElasticSearch","depth":9,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Eloquent","depth":9,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Encoding","depth":9,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Encryption","depth":9,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"ES","depth":9,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Faker","depth":9,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"FeatureFlags","depth":9,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"FFMpeg","depth":9,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"FileSystem","depth":9,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Gecko","depth":9,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Gong","depth":9,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"GuzzleHttp","depth":9,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"KeyPoints","depth":9,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Kiosk","depth":9,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"LanguageDetection","depth":9,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"LiveFeed","depth":9,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Locks","depth":9,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"Math","depth":9,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"MediaPipeline","depth":9,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"MeetingBot, folder","depth":9,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"MobileSettings, folder","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Model, folder","depth":9,"on_screen":false,"role_description":"text"}]...
|
2213224875418358514
|
1065696228461131589
|
click
|
accessibility
|
NULL
|
Project: faVsco.js, menu
master, menu
Start Listen Project: faVsco.js, menu
master, 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
1
Previous Highlighted Error
Next Highlighted Error
<?php
namespace Jiminny\Actions;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Str;
use Jiminny\Component\Acl\RoleChangeContext;
use Jiminny\Component\Acl\RoleChangeLogger;
use Jiminny\Component\Acl\RoleChangeType;
use Jiminny\Contracts\Acl\RoleRepositoryInterface;
use Jiminny\DTO\Invitation\UserInvitationDTO;
use Jiminny\Models\Invitation;
use Jiminny\Models\Role;
use Jiminny\Models\User;
use Jiminny\Notifications\Channels\EmailNotifiable;
use Jiminny\Notifications\OwnerInvitedToTrial;
use Jiminny\Notifications\UserInvitedToTeam;
use Jiminny\Notifications\UserInvitedToTeamWithEmailOnly;
class InviteUserToTeamAction
{
public function __construct(
private RoleRepositoryInterface $roleRepository,
private RoleChangeLogger $roleChangeLogger,
) {
}
public function execute(UserInvitationDTO $dto): void
{
/** @var Invitation $invitation */
$invitation = Invitation::updateOrCreate(
[
'team_id' => $dto->teamId,
'email' => $dto->email,
],
[
'group_id' => $dto->groupId,
'secondary_email' => $dto->secondaryEmail,
'crm_required' => $dto->crmRequired,
'token' => Str::random(40),
'is_owner' => $dto->isOwner,
]
)->loadMissing(['team']);
$invitation->roles()->sync($dto->roleIds);
$notifiable = new EmailNotifiable($invitation->email, $invitation->getTeam());
$logMessage = 'User invited to trial';
if ($invitation->getTeam()->owner_id === null) {
$notifiable->notifyNow(new OwnerInvitedToTrial($invitation));
$logMessage = 'Owner invited to trial';
} else {
$notifiable->notifyNow(new UserInvitedToTeam($invitation));
}
collect($dto->roleIds)
->map(fn (int $roleId): Role => $this->roleRepository->get($roleId))
->each(function (Role $role) use ($dto, $invitation): void {
$this->roleChangeLogger->log(
$dto->currentUser,
$invitation,
$role,
$invitation->wasRecentlyCreated
? RoleChangeType::INVITE_USER
: RoleChangeType::RESEND_INVITATION,
RoleChangeContext::APP,
);
});
Log::info($logMessage, [
'teamId' => $invitation->team_id,
'teamName' => $invitation->getTeam()->name,
'email' => $invitation->email,
'crmRequired' => $invitation->crm_required ? 'yes' : 'no',
]);
$invitation->touch();
}
public function executeWithEmailOnly(User $user): void
{
$notifiable = new EmailNotifiable($user->getEmailAddress(), $user->getTeam());
$notifiable->notifyNow(new UserInvitedToTeamWithEmailOnly($user));
}
}
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
40
1
40
64
Previous Highlighted Error
Next Highlighted Error
SELECT * FROM teams WHERE name LIKE '%litify%'; # 1069, 994, 24993
SELECT * FROM users WHERE id = 25061;
SELECT * FROM crm_profiles WHERE crm_configuration_id = 994;
SELECT * FROM crm_profiles WHERE user_id = 25061;
select * from crm_configurations where id = 834;
SELECT * FROM teams WHERE id = 882;
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 = 882 and sa.provider = 'hubspot';
SELECT * FROM crm_configurations where id = 882; # 933 - GoGlobal
SELECT * FROM opportunities WHERE team_id = 933 order by updated_at desc;
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 = 933 and sa.provider = 'hubspot';
SELECT * FROM crm_configurations WHERE provider = 'hubspot' and crm_provider_id = 7270388;
SELECT * FROM contacts where crm_configuration_id = 834;
SELECT * FROM opportunities WHERE team_id = 933
# AND crm_provider_id IN ('20131586060','46017317898','52543911090','53451356564','54101251892','54323768459');
AND id IN (8482561,18352941,19042734,19232139,19445140,19472541);
SELECT * FROM opportunity_contacts
WHERE opportunity_id IN (8482561,18352941,19042734,19232139,19445140,19472541);
# [PASSWORD_DOTS]
SELECT * FROM crm_configurations where id = 485; #
SELECT * FROM opportunities WHERE team_id = 933 order by updated_at desc;
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 = 933 and sa.provider = 'hubspot';
select crm.provider, l.* from leads l join crm_configurations crm on l.crm_configuration_id = crm.id
where crm.provider NOT IN ('salesforce', 'integration-app', 'bullhorn', 'copper')
# and l.converted_at IS NOT NULL
;
# [PASSWORD_DOTS]
SELECT * FROM activities a WHERE type IN ('email-inbound', 'email-outbound')
and opportunity_id IS NULL
order by id desc;
SELECT * FROM teams WHERE id = 604; # 598
SELECT * FROM activities WHERE id = 74410828; # [EMAIL]
SELECT * FROM accounts WHERE id = 20068382;
SELECT * FROM accounts WHERE id = 35186038;
SELECT * FROM contacts WHERE team_id = 852 and updated_at > '2026-01-23 12:30:00' order by updated_at desc;
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 = 559 and sa.provider = 'hubspot';
SELECT * FROM activities WHERE uuid_to_bin('cb6342b6-a183-401c-b0af-ede92b2ae763') = uuid;
select * from sidekick_settings where team_id = 781;
SELECT * FROM crm_configurations where provider = 'hubspot' and crm_provider_id = 26651871; # Teya
SELECT * FROM crm_configurations where provider = 'hubspot' and crm_provider_id = 7562435;
SELECT * FROM crm_configurations where provider = 'hubspot' and crm_provider_id = 8420347; # opflit 2100
SELECT * FROM crm_layouts WHERE crm_configuration_id = 711;
SELECT * FROM activities where crm_configuration_id = 711 and crm_provider_id IS NULL
and is_internal = 0 and status = 'completed'
order by id desc;
SELECT * FROM crm_layout_entities
WHERE crm_layout_id IN (2352, 2353);
;
SELECT * FROM crm_configurations where provider = 'hubspot' and id = 530;
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 = 556 and sa.provider = 'hubspot';
SELECT * FROM activities WHERE uuid_to_bin('c6ca4b22-7738-4563-a95d-b8a9598924ae') = uuid;
SELECT * FROM activities WHERE uuid_to_bin('442abb2b-28bd-4be8-9c25-19e9bf02766d') = uuid;
select * from contacts
where crm_configuration_id = 530
and crm_provider_id = 872252;
select * from activities where crm_configuration_id = 530
and user_id = 14343 and type like '%softphone%'
and created_at between '2026-01-28 15:00:00' and '2026-01-28 15:10:00';
SELECT * FROM crm_configurations where provider = 'hubspot' and crm_provider_id = 25666868; # Teya
SELECT * FROM crm_configurations where provider = 'hubspot' and crm_provider_id = 8646335; # Teya
SELECT * FROM crm_configurations where provider = 'hubspot' and crm_provider_id IN (5933397);
SELECT t.name, t.id, t.owner_id, c.id, c.provider, c.crm_base_url FROM teams t
JOIN crm_configurations c ON t.id = c.team_id
WHERE t.status = 'active';
SELECT * FROM teams where id = 1091;
SELECT * FROM crm_configurations where team_id = 1091;
SELECT * FROM activity_providers where team_id = 1091;
SELECT * FROM activities where crm_configuration_id = 1024 and type IN ('softphone', 'softphone-outbound')
and provider NOT IN ('hubspot', 'aircall')
# and telephony_provider_id = '019c1131-a22f-4792-b9ea-20adf6a02ed0'
order by id desc;
SELECT * FROM teams WHERE name LIKE '%Leadventure%';
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 = 1091 and sa.provider = 'salesforce';
SELECT * FROM teams WHERE name LIKE '%Wilson%'; # 862, 812
SELECT * FROM teams where id = 862;
SELECT * FROM crm_configurations where team_id = 862;
SELECT * FROM activity_providers where team_id = 862;
SELECT * FROM activities where crm_configuration_id = 812 and type IN ('softphone', 'softphone-outbound')
and provider NOT IN ('hubspot', 'aircall')
# and telephony_provider_id = '019c1131-a22f-4792-b9ea-20adf6a02ed0'
order by id desc;
SELECT t.id, crm.id, crm.provider, ap.* FROM teams t
join crm_configurations crm on t.id = crm.team_id
join activity_providers ap on t.id = ap.team_id
where t.status = 'active' and ap.is_enabled = 1
and crm.provider = 'hubspot'
and ap.provider NOT IN ('hubspot', 'aircall', 'uploader', 'gong', 'twilio', 'zoom-bot', 'google-meet', 'ms-teams',
'outreach', 'close', 'ringcentral', 'dialpad', 'zoom-phone');
SELECT * FROM teams where id = 1068;
SELECT * FROM crm_configurations where team_id = 1068;
SELECT * FROM activity_providers where team_id = 1068;
SELECT * FROM activities a
where crm_configuration_id = 993 and type IN ('softphone', 'softphone-outbound')
and a.provider NOT IN ('hubspot', 'uploader', 'gong', 'twilio', 'google-meet', 'ms-teams','close'
)
# and telephony_provider_id = '019c1131-a22f-4792-b9ea-20adf6a02ed0'
order by a.id desc;
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 = 1068 and sa.provider = 'hubspot';
# [PASSWORD_DOTS]
# [PASSWORD_DOTS]
# [PASSWORD_DOTS]
SELECT * FROM crm_configurations where id = 882; # 933 - GoGlobal , portalId: 6017093
SELECT * FROM opportunities WHERE team_id = 933 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;
SELECT * FROM opportunities WHERE team_id = 933 and updated_at > '2026-02-06 00:00:00' order by updated_at desc;
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 = 933 and sa.provider = 'hubspot';
# [PASSWORD_DOTS]
SELECT * FROM crm_configurations where id = 834; # 882 - AnyVan , portalId: 5468262
SELECT * FROM contacts WHERE crm_configuration_id = 834 and updated_at > '2026-03-30 00:00:00' order by updated_at desc;
SELECT * FROM opportunities WHERE crm_configuration_id = 834 and updated_at > '2026-03-04 08:00:00' order by updated_at desc;
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 = 882 and sa.provider = 'hubspot';
select * from crm_layouts where crm_configuration_id = 834;
select * from crm_layout_entities where crm_layout_id = 2780;
select * from crm_fields where id IN (321153,321192,321193,321194);
SELECT * FROM opportunities WHERE crm_configuration_id = 834 and id = 10993426;
# [PASSWORD_DOTS]
SELECT * FROM crm_configurations where id = 988; # 1057 - Teya (543ce4f4-168c-4571-91ea-5b35c253f06f) , portalId: 26651871
SELECT * FROM opportunities WHERE team_id = 1057 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;
SELECT * FROM opportunities WHERE team_id = 1057 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;
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 = 1057 and sa.provider = 'hubspot';
SELECT * FROM crm_configurations where id = 533; # 559 - Connectd , portalId: 6710988
SELECT * FROM opportunities WHERE team_id = 559 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;
SELECT * FROM opportunities WHERE team_id = 559 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;
SELECT * FROM crm_configurations where id = 801; # 852 - Rise Vision , portalId: 2700250
SELECT * FROM opportunities WHERE team_id = 852 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;
SELECT * FROM opportunities WHERE team_id = 852 and updated_at > '2026-02-04 00:00:00' order by updated_at desc; # 6th last
SELECT * FROM crm_configurations where id = 962; # 1034 - evergrowth.io , portalId: 143180990
SELECT * FROM opportunities WHERE team_id = 1034 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;
SELECT * FROM opportunities WHERE team_id = 1034 and updated_at > '2026-02-04 00:00:00' order by updated_at desc;
# [PASSWORD_DOTS]
SELECT * FROM crm_configurations where id = 1037; # 1102 - Jibble , portalId: 6649755
SELECT * FROM opportunities WHERE team_id = 1102 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;
SELECT * FROM opportunities WHERE team_id = 1102 and updated_at > '2026-02-04 12:30:00' order by updated_at desc; # 8
SELECT * FROM crm_configurations where id = 1015; # 1049 - Travefy , portalId: 48904401
SELECT * FROM opportunities WHERE team_id = 1049 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;
SELECT * FROM opportunities WHERE team_id = 1049 and updated_at > '2026-02-04 12:30:00' order by updated_at desc; # 20
SELECT * FROM crm_configurations where id = 64; # 70 - SalaryFinance , portalId: 3404115
SELECT * FROM opportunities WHERE team_id = 70 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;
SELECT * FROM opportunities WHERE team_id = 70 and updated_at > '2026-02-04 12:30:00' order by updated_at desc; # 6th last
SELECT * FROM crm_configurations where id = 802; # 853 - Street Group , portalId: 7658438
SELECT * FROM opportunities WHERE team_id = 853 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;
SELECT * FROM opportunities WHERE team_id = 853 and updated_at > '2026-02-04 12:30:00' order by updated_at desc; # 10
SELECT * FROM crm_configurations where id = 872; # 921 - In Professional Development , portalId: 9238273
SELECT * FROM opportunities WHERE team_id = 921 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;
SELECT * FROM opportunities WHERE team_id = 921 and updated_at > '2026-02-04 12:30:00' order by updated_at desc; # 2
# [PASSWORD_DOTS]
SELECT * FROM crm_configurations where id = 550; # 576 - SeedLegals , portalId: 3028661
SELECT * FROM opportunities WHERE team_id = 576 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;
SELECT * FROM opportunities WHERE team_id = 576 and updated_at > '2026-02-05 14:00:00' order by updated_at desc;
SELECT * FROM crm_configurations where id = 989; # 1058 - rtaoutdoor.com , portalId: 22371204
SELECT * FROM opportunities WHERE team_id = 1058 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;
SELECT * FROM opportunities WHERE team_id = 1058 and updated_at > '2026-02-05 14:00:00' order by updated_at desc;
SELECT * FROM crm_configurations where id = 896; # 946 - Mintago , portalId: 6621281
SELECT * FROM opportunities WHERE team_id = 946 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;
SELECT * FROM opportunities WHERE team_id = 946 and updated_at > '2026-02-05 14:00:00' order by updated_at desc;
SELECT * FROM crm_configurations where id = 617; # 641 - PCS , portalId: 5244937
SELECT * FROM opportunities WHERE team_id = 641 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;
SELECT * FROM opportunities WHERE team_id = 641 and updated_at > '2026-02-05 14:00:00' order by updated_at desc; # 7th
# [PASSWORD_DOTS]
SELECT * FROM crm_configurations where id = 649; # 670 - Eventeny , portalId: 4492849
SELECT * FROM opportunities WHERE team_id = 670 and updated_at > '2026-02-18 00:00:00' order by updated_at desc;
SELECT * FROM opportunities WHERE team_id = 670 and updated_at > '2026-02-09 08:00:00' order by updated_at desc; #
SELECT * FROM crm_configurations where id = 48; # 51 - CleanCloud , portalId: 4373137
SELECT * FROM opportunities WHERE team_id = 51 and updated_at > '2026-03-04 00:00:00' order by updated_at desc;
SELECT * FROM opportunities WHERE team_id = 51 and updated_at > '2026-02-09 08:00:00' order by updated_at desc;
select * from users where team_id = 51; # 7783
SELECT * FROM groups WHERE uuid_to_bin('8a8d2cb6-8b55-4fa3-8b5c-5f0e3d8de59a') = uuid; # 1130
select * from activity_searches where user_id = 7783;
select * from activity_search_filters where activity_search_id IN (32291, 32292);
SELECT asf.activity_search_id, asf.id, asf.value
FROM activity_search_filters asf
WHERE asf.filter = 'group_id'
AND asf.value IN (
SELECT CONCAT(
HEX(SUBSTR(uuid, 5, 4)), '-',
HEX(SUBSTR(uuid, 3, 2)), '-',
HEX(SUBSTR(uuid, 1, 2)), '-',
HEX(SUBSTR(uuid, 9, 2)), '-',
HEX(SUBSTR(uuid, 11))
)
FROM groups
WHERE deleted_at IS NOT NULL
);
SELECT * FROM crm_configurations where id = 272; # 290 - Bonham & Brook , portalId: 5705856
SELECT * FROM opportunities WHERE team_id = 290 and updated_at > '2026-02-05 00:00:00' order by updated_at desc;
SELECT * FROM opportunities WHERE team_id = 290 and updated_at > '2026-02-09 08:00:00' order by updated_at desc; # 6th
# [PASSWORD_DOTS]
SELECT * FROM crm_configurations where provider = 'hubspot';
SELECT * FROM crm_configurations where id = 1056; # 1119 - Chromatic , portalId: 45602133
SELECT * FROM opportunities WHERE team_id = 1119 and remotely_created_at > '2026-02-01 00:00:00' order by updated_at desc;
SELECT * FROM opportunities WHERE team_id = 1119 and updated_at > '2026-02-09 09:00:00' order by updated_at desc; # null
# [PASSWORD_DOTS]
select * from contacts where crm_provider_id = '003Uu00000ojD4NIAU';
select
cp.*
# DISTINCT t.id
# cp.id, cp.user_id, t.id, cp.crm_configuration_id, cp.contact_fields
FROM crm_profiles cp
JOIN crm_configurations crm on crm.id = cp.crm_configuration_id
JOIN users u on u.id = cp.user_id
JOIN teams t ON t.id = crm.team_id
WHERE crm.provider = 'salesforce' and t.status = 'active'
and cp.archived_at IS NULL and u.deleted_at IS NULL
and t.id NOT IN (1093)
and t.id = 2
and cp.contact_fields IS NULL;
# and c.crm_provider_id = '003Uu00000ojD4NIAU';
SELECT * FROM users WHERE id = 26484;
SELECT * FROM crm_profiles WHERE user_id = 26484;
SELECT * FROM social_accounts WHERE sociable_id = 26484;
SELECT * FROM crm_configurations where provider = 'salesforce';
select * from users where id IN (10022, 10403);
select * from users where team_id IN (526);
select * from teams where id IN (526, 532);
select * from crm_configurations where id IN (500, 516);
select * from crm_profiles where crm_configuration_id IN (500, 516) and user_id IN (10022, 10403);
select * from contacts where crm_configuration_id IN (500, 516) and crm_provider_id = '003Uu00000ojD4NIAU';
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 = 526 and sa.provider = 'salesforce';
select * from team_settings where team_id IN (526, 532);
select * from users where id IN (22824);
select * from crm_profiles where crm_configuration_id IN (1026);
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 = 1093 and sa.provider = 'salesforce';
select * from teams where id = 1099;
select * from users where id = 29643
select * from activity_processing_states;
SELECT * FROM teams where name LIKE '%Fare%'; # 233
SELECT * FROM opportunities where crm_configuration_id = 215
# and crm_provider_id = 'oppo_ogESZf2P50nDrd1nGPvKDXeA6sSaTN5v51Lp4ayVzKR'
;
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 = 1088 and sa.provider = 'hubspot';
SELECT * FROM teams order by updated_at DESC
SELECT * FROM crm_configurations WHERE id = 1019; # SimpleConsign 1088 - no social account
select * from crm_configurations where provider = 'pipedrive';
select * from teams where id = 957;
select * from crm_configurations where id = 957;
SELECT * FROM teams WHERE name LIKE '%Prolific%'; # 544, 518, 10743
SELECT * FROM opportunities where crm_configuration_id = 518 order by id desc;
select * from users where team_id = 1; # 26726 - Gabriela Dureva
SELECT * FROM opportunities where user_id = 26726; # 16834447 - Prolific
select * from activities where user_id = 26726 order by id desc;
select * from contacts where crm_configuration_id = 1
and email IN ('[EMAIL]', '[EMAIL]'); # 2094416, 2093620
SELECT * FROM contacts WHERE id = 6284931;
SELECT p.* FROM activities a JOIN participants p ON a.id = p.activity_id
WHERE a.user_id = 26726 and p.lead_id IN (2094416, 2093620) and a.created_at > '2026-01-01 00:00:00' order by p.email;
select * from activities where id IN (75509259,75509261,75509261,75511034,75026464,75517602,75517605);
select * from crm_configurations where id = 1;
43801692-1aeb-32ce-acba-5b80a479701a
44c3c9cf-6f5e-75f3-8179-bc9f75dd2b1b
405975c0-b3d0-7aaa-821f-09d59cae6dd1
4caf848d-4bed-2299-b248-7788d41f9fca
49bedc3f-f196-eef3-89c3-dea6a3b4aa63
43420989-a09d-b8f8-9806-c8bbf7a02aac
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 = 1 and sa.provider = 'salesforce';
SELECT * FROM activities WHERE id = 75461988;
SELECT * FROM activities WHERE uuid_to_bin('d6c5052e-e972-49e9-8912-26f2f7d6c5f6') = uuid;
select * from contacts where id = 17900517;
select * from contact_roles cr join crm_configurations crm on cr.crm_configuration_id = crm.id
where crm.provider != 'salesforce';
select * from users where id = 21047;
SELECT * FROM crm_configurations WHERE id = 892;
SELECT * FROM teams WHERE id = 942;
select * from opportunities where team_id = 942 order by updated_at desc;
select * from contacts where team_id = 942 order by updated_at desc;
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 = 942 and sa.provider = 'hubspot';
SELECT * FROM opportunities where team_id = 1 and crm_provider_id IN ('006Pq00000NeH6XIAV', '006Pq000007z8kdIAA'); # 10697889, 6621430
SELECT * FROM crm_configurations WHERE id = 1;
SELECT * FROM teams WHERE crm_id = 1;
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 = 1 and sa.provider = 'salesforce';
select id, user_id, opportunity_fields from crm_profiles where crm_configuration_id = 1
SELECT * FROM opportunities where team_id = 1 order by updated_at desc; # 10697889, 6621430
select * from teams where id = 852;
select * from groups where id = 2286;
select * from sidekick_settings where team_id = 852;
select * from default_activity_types where team_id = 852;
SELECT cc.provider, cc.id, p.id, u.*
FROM users u
LEFT JOIN crm_profiles p ON u.id = p.user_id AND p.id IS NULL -- no profile
INNER JOIN teams t ON u.team_id = t.id AND t.status = 'active' -- team is active
INNER JOIN crm_configurations cc ON t.crm_id = cc.id
WHERE u.status = 1 AND u.deleted_at IS NULL
AND u.crm_required = 1
AND u.team_id = 1
ORDER BY u.team_id;
SELECT * FROM crm_profiles cp where cp.crm_configuration_id = 1 and cp.user_id IN (
18481
);
SELECT cc.provider, cc.id, p.id, u.*
FROM users u
LEFT JOIN crm_profiles p ON u.id = p.user_id
INNER JOIN teams t ON u.team_id = t.id AND t.status = 'active'
INNER JOIN crm_configurations cc ON t.crm_id = cc.id
WHERE u.status = 1
AND u.deleted_at IS NULL
AND u.crm_required = 1
# AND u.team_id = 1
AND p.id IS NULL -- Move this condition to WHERE clause
ORDER BY u.team_id;
SELECT * FROM opportunities WHERE id = 20002609;
select * from teams where id = 1122; # Velatir, 29953 - [EMAIL]
select * from crm_configurations where id = 1060;
select * from crm_layouts where crm_configuration_id = 1060;
SELECT * FROM crm_layout_entities WHERE crm_layout_id = 3596;
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 = 1122 and sa.provider = 'hubspot';
select * from opportunities where team_id = 1122 order by updated_at desc;
select * from crm_field_data where object_type = 'contact';
SELECT * FROM activities WHERE uuid_to_bin('374fc8ed-3315-4c9f-9b25-318b7fd2928f') = uuid; # 76584262
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 = 248 and sa.provider = 'salesforce';
SELECT * FROM crm_profiles where user_id = 24115; # 005QF000002CswMYAS
SELECT * FROM users where id = 24115;
SELECT * FROM accounts where id = 4002896;
SELECT * FROM teams WHERE name LIKE '%adswerve%';
SELECT * FROM opportunities where crm_configuration_id = 230 AND crm_provider_id IN ("0069N000003GIQ9QAO","0061r000019yGP9AAM","0066900001S2KWlAAN","0066900001TDpj2AAD","0066900001b8uEwAAI","0069N000001rQi0QAE","006QF00000KD40mYAD","006QF00000LzpRJYAZ","0069N000002uomtQAA","0069N000002xlMLQAY","0066900001NV6ubAAD","0061r00001HJp45AAD","006QF00000uTlUoYAK","006QF00000v0bZqYAI");
SELECT * FROM opportunities WHERE crm_configuration_id = 230 AND crm_provider_id = '0069N000003GIQ9QAO'; # 6272203
SELECT u.id, u.email, ac.name, a.* FROM activities a
JOIN users u ON a.user_id = u.id
JOIN accounts ac ON a.account_id = ac.id
WHERE
uuid_to_bin('e3269598-b562-44fb-b5e9-9d2694dc63e0') = a.uuid or
uuid_to_bin('66ddc3ab-4e15-45aa-af0c-248c1eece593') = a.uuid or
uuid_to_bin('826bd328-e1cc-4213-b8d8-572454cacc07') = a.uuid;
select * from users where id = 5825;
SELECT * FROM activities WHERE uuid_to_bin('e56aa2e8-231a-421b-ab1f-cb38ed2bf573') = uuid;
select * from activities where uuid_to_bin('91e13b2f-2d1b-45f8-b1fd-1141b6563782') = uuid;
19594, 862
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 = 862 and sa.provider = 'salesforce';
select * from automated_reports where id = 36;
select ar.frequency, r.*, ar.* from automated_report_results r
join automated_reports ar on r.report_id = ar.id
where ar.frequency != 'one_off';
select s.* from activity_searches s join users u ON s.user_id = u.id where u.team_id = 882;
select * from nudges n where n.activity_search_id
select * from teams where created_at > '2026-03-09';
SELECT * FROM crm_layouts WHERE crm_configuration_id = 1065; # 1065
SELECT * FROM crm_layout_entities WHERE crm_layout_id = 3617;
select * from users where team_id = 1 and name like '%Lukas%'; # 7160
SELECT * FROM teams WHERE id = 575;
select * from opportunities where team_id = 575;
SELECT * FROM teams WHERE name LIKE '%Integrum ESG%'; # 1126, 1065,
select * from opportunities where team_id = 1126;
SELECT * FROM teams WHERE name LIKE '%Base%'; # 1125, 1063,
select * from opportunities where team_id = 1125;
select * from contacts c
where c.team_id = 882;
SELECT * FROM activities WHERE id = 76822967;
SELECT * FROM crm_profiles WHERE user_id = 15440;
SELECT * FROM crm_profiles WHERE crm_configuration_id = 555;
SELECT * FROM crm_configurations WHERE id = 555;
SELECT * FROM users WHERE id = 15440; # team. 581, gr. 15440, pl. 3911, act. field 162182
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 = 581 and sa.provider = 'salesforce';
SELECT * FROM automated_report_results order by id desc;
select * from features;
select * from team_features where feature_id = 40;
select * from teams where id = 556;
select * from automated_reports;
where id = 54; # 4fdd41f6-dcf0-30d0-b339-7345381b6044 , ["pdf","podcast"]
SELECT * FROM automated_report_results WHERE uuid_to_bin('822fa41b-afd3-43a9-a248-86b0e36f3131') = uuid;
select * from automated_report_results order by id desc;
SELECT * FROM automated_report_results WHERE id = 1919;
select * from automated_report_results WHERE report_id = 54;
select * from opportunities where id = 7594349;
SELECT * FROM teams WHERE name LIKE '%Les%'; # 711, 692, 16067 - [EMAIL]
select * from playbooks where team_id = 711; # event 226147
SELECT * FROM playbook_categories WHERE playbook_id = 5515;
SELECT * FROM crm_fields WHERE crm_configuration_id = 692 and object_type = 'event';
SELECT * FROM crm_fields WHERE id = 226147;
SELECT * FROM crm_field_values WHERE crm_field_id = 226147;
SELECT * FROM crm_configurations WHERE id = 692;
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 = 711 and sa.provider = 'salesforce';
SELECT * FROM crm_profiles cp JOIN users u on u.id = cp.user_id WHERE u.team_id = 711;
select * from leads;
select * from calendars;
SELECT
t.id AS team_id,
t.name,
LOWER(SUBSTRING_INDEX(c.calendar_provider_id, '@', -1)) AS calendar_domain
FROM teams t
JOIN users u ON u.team_id = t.id
JOIN calendars c ON c.user_id = u.id AND c.status = 'active' AND c.calendar_provider_id LIKE '%@%'
LEFT JOIN team_domains td
ON td.team_id = t.id
AND td.deleted_at IS NULL
AND td.domain = LOWER(SUBSTRING_INDEX(c.calendar_provider_id, '@', -1))
GROUP BY t.id, t.name, calendar_domain
ORDER BY t.name, calendar_domain;
select * from users u join calendars c on c.user_id = u.id
where u.team_id = 882;
select * from activities where id = 74049485; # team 563 crm 537
select * from activities where id = 73272382; # team 563 crm 537
select * from activities where id = 64400389; # team 563 crm 537
select * from activities where id = 58081273; # team 563 crm 537
select * from activities where id = 54520297; # team 563 crm 537
select * from participants where activity_id = 58081273;
select * from activities where crm_configuration_id = 537 and provider = 'aircall'
and account_id = 19003658 order by updated_at desc;
select * from contacts where crm_configuration_id = 537 and id = 35957759;
select * from accounts where crm_configuration_id = 537 and id = 19003658;
select * from automated_report_results where id = 1976;
select * from automated_reports where id = 583;
select * from activity_searches where id = 87714;
select * from activity_search_filters where activity_search_id = 87714;
SELECT * FROM activities WHERE uuid_to_bin('8827f672-202d-4162-9d04-73ff5f0566a9') = uuid
or uuid_to_bin('47842446-af51-4bcb-854f-cc6560290101') = uuid;
SELECT * FROM crm_configurations WHERE provider = 'hubspot';
select * from rate_limits;
select * from automated_report_results where media_type = 'pdf' and status = 2
and id IN (18, 1872);
select * from automated_reports where id = 54;
SELECT * FROM users WHERE id IN (24623,29443,29613);
SELECT * FROM automated_report_results WHERE uuid_to_bin('822fa41b-afd3-43a9-a248-86b0e36f3131') = uuid;
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide
app ~/jiminny/app, folder
.circleci, folder
.cursor, folder
.github
.sonarlint, folder
.vscode, folder
.windsurf, folder
app, sources root
Actions
InviteUserToTeamAction.php, class
MarkUserAsOnboardableAction.php, class
SyncRecordingFlagsAction.php, class
UpdateTeamMemberAction.php, class
UpdateUserRolesAction.php, class
Component
Acl
ActionItems
Activity
ActivityAnalytics
ActivitySearch
AiActivityType
AiAutomation
AiCallScoring
AskAnything
Dtos
Events
AskAnythingPromptService.php, class
HistoryService.php, class
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, folder
MobileSettings, folder
Model, folder...
|
32899
|
NULL
|
NULL
|
NULL
|
|
45403
|
1626
|
25
|
2026-05-14T14:34:55.998531+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-14/1778 /Users/lukas/.screenpipe/data/data/2026-05-14/1778769295998_m2.jpg...
|
PhpStorm
|
faVsco.js – IntegrationAppTrait.php
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Jiminny... ~ActivityFilesLater@ jiminny-x-integrat Jiminny... ~ActivityFilesLater@ jiminny-x-integrati• plattorm-inner-teamE Channels# ai-chapter# alertsi backend# bugscontusion-cllnia# curiosity lab# engineering# general#jiminny-bgac nlattorm-nckets# product launches# random# releases# sofia-officed sunport# thank-yous# the people of iimi... Direct messages• 8la 62% Galya Dimitrovavasil VasilevM Stefka StovanovaSg: Todor StamatovMario GeorgievNiudlay lanay. James Graham "* Stoyan Tanevo Stelivan Georgiev( Petko Kashinski*. Lukas Kovali...::: AnnsToastS lira Gloud6d Huddle with Aneliva Angelova* Aneliya Angelova &• Messagest Add canvasur FilesAneliya Angelova 2:30 PMЛукаш, само при Сейлсфорс и Хубспот се синкваха активити типовете, когато се направи плейбук,нали?пои останалите скМі тоябва оъчно ла се въвелат.Lukas Kovalik 2:47 PMтряова да се за всички, някъде не се ли попьлвапри зохо май беше hardcoded но май и там си връщаха две категорииAneliya Angelova 4:00 PMЛукаш имаш ли време да се чуем за тестването на https://jiminny.atlassian.net/browse/JY-20725X Preuiew in sact[HubSpotl Optimise CRM rematct(7 OpenRosdy for OA- MediumAA Aneliya AngelovaAs of today at 4:00 PM RetreshOpen in Jira* SummariseLukas Kovalik 4:02 PMzean-iurwiniareelYou joined the huddle (LIVE 4:06 PMAneliva Angelova is here toolAneliva Angelova 4:44 PN11512582Lukas Kovalik M 5.16 PNcurl --location "httns:ani.hubani.com/crm/v3/obiects/contacts/search--header 'Content-vne' annlication/ison'--header "Authorization: BearerC|Kvma?iMx7OINOM8kOFwrAowAcAkUAhIR24?A05D?xiVrIYMILuP6SA01Kwcmhr=n.v2 hytorDniMvDalYck-CMalovolNOM9kOFwrAUAcrkcaws-ThwRARIRAOF-ATFSAOFRAO-ROIEBAQUBEggBAQEBAYICFIr7Au8O2Nwal9YW2CbCCxYvwngmSgNldTFSAFoAYABoAHAAeAA'\--data "{ "limit", 13'Message Aneliva Angelova+ AaIđ 0Pmv Q SearchDate ModifiedYesterday at 13.3Yesterday at 13:36Yesterday at 13:36Yesterday at 13.30Yesterdav at 13:35Yesterday at 13:34Yesterday at 13:34Yesterdav at 13:3kYesterday at 13:33Yesterday at 13.32Yesterdav at 13:31resterday at 15:30Yesterdav at 13:30Yesterday at 13:29Yesterday at 13:29Yesterday at 13:28Yecterdav at 12:28resterday at 13-21Yesterdav at 13:26Yesterday at 13:26Yesterday at 13:25Yesterday at 13:25Voctorday at 12:01Yesterday at 13.23Yesterdav at 13:22resterady al 15.clYesterday at 13:20Yesterday at 13.19Yecterdav at 12:19Yesterdav at 13:18Yesterday at 13-1/Yesterdav at 13:17Yesterday at 13:16Yesterday at 13:15Yecterdav at 12:15Yesterday at 13.14Yecterdav at 13:10Yesterday at 13:13Yesterday at 13:12Yoctorday at 12:11Yesterday at 13.10Yecterdav at 12:10Yesterdav at 13:09Yesterdav at 13:08v Size23 KB9 KB13 Kb16 KE17 KB29 KB16 K:12 KB9 KEIKBn8 KBI37 KB10 KB7 KE8 KB9 KB8 KB172 KR14 KB13 KB9 KE18 KB12 KB10 KBI16 KB6 KB6KB12 KE23 KB8 KB16 K:11 KB20 KP34 KB10 KB7 K:5 KB11 KB26 KBMPEG-4 movieMPEG-4 movieMPEG-4 movieMPEG-4 movieMPE0"4 movieMDSG-A movieMP2G-4 movieMPEG-4 movieMPEG"4 movieMPEG-4 movieMoEeh movioMPEG-4 movieMPEG-1 movieMPEG-4 movieMPEG-4 movieMPEG-4 movieMPEG-4 movieMDEG.A movicMPEG-4 movieMPEG-4 movieMPEG-4 movieMPEG-4 movieMDEC A movidMPEG-4 movieMDEG-A movieMPEG-4 movieMPEG-4 movieMDEC.A moviaMPEG-4 movie111 KC102 KB88 KBMDEG-A moviaMPEG-4 movie59 KB1MPEG-A movie98 KB MPEG-4 movie97 KB66 K3MPEG-4 movieMDEG.A movioAAKP93 KB/8 KBMPEG-4 movie50 KгMDEG-A movid58 KBMPEG-4 movie27 KB7KBMPEG-4 movieAl Notes: OffLeave• • CFavourites• jiminny• Recents* ApplicationsiCloud• iCloud Drive992 Svnc tolde0 DXP4800PLUS-B5F49 Networl• CRMI• Orange• Red|• Yellow• Green• Purple•) All lags..IhlDownloadsNameLoom.pkgAlfred copv.alfredoreterences=KeychronAssist-1.0.2 (1).dmeKeychronAssist-1.0.2.dmgmazanoke-images-yWJo.zioPhotos-3-001.zip• Transcript.pd→mage U.loge1 Orioninstaller.dma_image.jpg- image (2).1pc• ПO-22221726037035-004-001_ORGES.pdf%D0%9F%D0%9E-22221726037035-004-001 archive.zipПO-22221726037035-004-001_archive (1).zip• repon 4).XmAltred copy2.altredoreterencesСE 060209С О000000026571172 CWICT 0Р70501260015900 ndt= 27022026_0000000026574472_ SWIFT_ [IBAN].pdf= 03042026 [CREDIT_CARD] SWIFT [CREDIT_CARD].001reportxmmi=pdt.odiB pdf-1.pdfD pdf-2.pdf-pdf-5.pd1= ndf-1 ndipdf-3.pdfKoválik Family Tree.gedbitwarden export 20251031122528.isonlKoválik Family Tree.zip*macOS Storage_Cleanup.mdal favicon icofirst aid_notes_complete.docxrenortl2).esv1 config.vmlIteration run Search HS.postman_collection.jsonm licence bettertouchtoalMariusHosting Config.isonnokc.901a6502.6667.A62h-062 ccu•AlfredwPmazanoko.imnaoc.YWIfана Ковалик.jpg•искане даниел Ковалик..pg• Фактура Март Даниел Ковалик.jрс• Фактура Април Даниел Ковалик iро• Dhotac 2.001Q SearchKind00,4 MD55.9 MBinstdlle..dckageAlfred...ferences10,1 MB10,1 MBIL MBDisk ImageDisk ImageLiP archive6.6 MBZIp archive2,5 MB PDF Document2,5 MBJreo lmage2.2 MBDisk Image2,2 MB PDF Document2 MBJPEG image1,9 MBJPEG imaqe192 KBPDE Document140 KbZIP archive148 KВ148 KB122 KBZIP archivelZIP archiveXML document111 KBAlfred...ferences94 KBDDE Documont92 KBPDr DocumentK:PDF Document91 KB91 KBXML document30 KBn0kpDDE Nocumont28 KBPDF Document28 KRPDE Document28 KB27 KBDocument14 KB11 KB6 KB6KBJSONINCV NacumontZIP archiveMarkdo…..ument5KRWindo...n image4 KB3 KBword ..cumentCSV Document2 KBVAMI dosumon1 KB029 buteccSV Documenthttlicence183 bytesZero butesJSONAlfrod foronso!Zero bytesFolde1.9 MB1,8 MB17 MB1,7 MBColdorJPEG imageJPEG ImageIPEG imadeJPEG imageColdo1 of 58 selected, 8.47 GB availabld• Inu 14 May 1/•34:02Date AddedIs Mdl ZUzo dl 19:4530 Jan 2026 at 12:3617 Mar 2026 at 20:2717 Mar 2026 at 20:26Z3 Aor 2020 al 13:0229 ,Jan 2026 at 15:2019 Dec 2025 at 10:1619 Dec 2025 at 12:238 Aor 2026 at 20:3519 Dec 2025 at 10:2919 Dec 2025 at 12:1819 Dec 2025 at 12:4026 Mar 2026 at 11:2410 May 2026 at 13:5326 Mar 2026 at 11:2426 Mar 2026 at 11:2426 Mar 2026 at 11:2310 May 2026 at 14:3730 Jan 2026 at 12:3712 Goh 2006 9t 11:5 A1Z3 Apr 2026 at 13.0823 Aor 2026 at 13:0810 May 2026 at 13:5410 May 2026 at 14:3710 May 2026 at 13:4910 May 2026 at 13:5010 May 2026 at 13:5110 Mav 2026 at 12:51110 May 2026 at 13:5019 Dec 2025 at 11:3431 Oct 2025 at 12:2525 Nau 2025 г+ 17:506 Mar 2026 at 11.2224 Anr 2026 at 16:5220 Oct 2025 at 11:0218 Mar 2026 at 15:29• Mav 2026 at 11:09129 Oct 2025 at 19:329 May 2026 at 10:0419 Mar 2026 at 11:55|10 May 2026 at 13:5712 Jun 2025 at 19:0430 Jan 2026 at 12:362616 Oct 2025 aт 16:0122 Aar 2026 at 12:0223 Apr 2026 at 13:0223 Apr 2026 at 13:0222 Anr 2026 at 12:0223 Apr 2026 at 13:0229 Jan 2026 at 15:20...
|
NULL
|
8033363151644175702
|
NULL
|
click
|
ocr
|
NULL
|
Jiminny... ~ActivityFilesLater@ jiminny-x-integrat Jiminny... ~ActivityFilesLater@ jiminny-x-integrati• plattorm-inner-teamE Channels# ai-chapter# alertsi backend# bugscontusion-cllnia# curiosity lab# engineering# general#jiminny-bgac nlattorm-nckets# product launches# random# releases# sofia-officed sunport# thank-yous# the people of iimi... Direct messages• 8la 62% Galya Dimitrovavasil VasilevM Stefka StovanovaSg: Todor StamatovMario GeorgievNiudlay lanay. James Graham "* Stoyan Tanevo Stelivan Georgiev( Petko Kashinski*. Lukas Kovali...::: AnnsToastS lira Gloud6d Huddle with Aneliva Angelova* Aneliya Angelova &• Messagest Add canvasur FilesAneliya Angelova 2:30 PMЛукаш, само при Сейлсфорс и Хубспот се синкваха активити типовете, когато се направи плейбук,нали?пои останалите скМі тоябва оъчно ла се въвелат.Lukas Kovalik 2:47 PMтряова да се за всички, някъде не се ли попьлвапри зохо май беше hardcoded но май и там си връщаха две категорииAneliya Angelova 4:00 PMЛукаш имаш ли време да се чуем за тестването на https://jiminny.atlassian.net/browse/JY-20725X Preuiew in sact[HubSpotl Optimise CRM rematct(7 OpenRosdy for OA- MediumAA Aneliya AngelovaAs of today at 4:00 PM RetreshOpen in Jira* SummariseLukas Kovalik 4:02 PMzean-iurwiniareelYou joined the huddle (LIVE 4:06 PMAneliva Angelova is here toolAneliva Angelova 4:44 PN11512582Lukas Kovalik M 5.16 PNcurl --location "httns:ani.hubani.com/crm/v3/obiects/contacts/search--header 'Content-vne' annlication/ison'--header "Authorization: BearerC|Kvma?iMx7OINOM8kOFwrAowAcAkUAhIR24?A05D?xiVrIYMILuP6SA01Kwcmhr=n.v2 hytorDniMvDalYck-CMalovolNOM9kOFwrAUAcrkcaws-ThwRARIRAOF-ATFSAOFRAO-ROIEBAQUBEggBAQEBAYICFIr7Au8O2Nwal9YW2CbCCxYvwngmSgNldTFSAFoAYABoAHAAeAA'\--data "{ "limit", 13'Message Aneliva Angelova+ AaIđ 0Pmv Q SearchDate ModifiedYesterday at 13.3Yesterday at 13:36Yesterday at 13:36Yesterday at 13.30Yesterdav at 13:35Yesterday at 13:34Yesterday at 13:34Yesterdav at 13:3kYesterday at 13:33Yesterday at 13.32Yesterdav at 13:31resterday at 15:30Yesterdav at 13:30Yesterday at 13:29Yesterday at 13:29Yesterday at 13:28Yecterdav at 12:28resterday at 13-21Yesterdav at 13:26Yesterday at 13:26Yesterday at 13:25Yesterday at 13:25Voctorday at 12:01Yesterday at 13.23Yesterdav at 13:22resterady al 15.clYesterday at 13:20Yesterday at 13.19Yecterdav at 12:19Yesterdav at 13:18Yesterday at 13-1/Yesterdav at 13:17Yesterday at 13:16Yesterday at 13:15Yecterdav at 12:15Yesterday at 13.14Yecterdav at 13:10Yesterday at 13:13Yesterday at 13:12Yoctorday at 12:11Yesterday at 13.10Yecterdav at 12:10Yesterdav at 13:09Yesterdav at 13:08v Size23 KB9 KB13 Kb16 KE17 KB29 KB16 K:12 KB9 KEIKBn8 KBI37 KB10 KB7 KE8 KB9 KB8 KB172 KR14 KB13 KB9 KE18 KB12 KB10 KBI16 KB6 KB6KB12 KE23 KB8 KB16 K:11 KB20 KP34 KB10 KB7 K:5 KB11 KB26 KBMPEG-4 movieMPEG-4 movieMPEG-4 movieMPEG-4 movieMPE0"4 movieMDSG-A movieMP2G-4 movieMPEG-4 movieMPEG"4 movieMPEG-4 movieMoEeh movioMPEG-4 movieMPEG-1 movieMPEG-4 movieMPEG-4 movieMPEG-4 movieMPEG-4 movieMDEG.A movicMPEG-4 movieMPEG-4 movieMPEG-4 movieMPEG-4 movieMDEC A movidMPEG-4 movieMDEG-A movieMPEG-4 movieMPEG-4 movieMDEC.A moviaMPEG-4 movie111 KC102 KB88 KBMDEG-A moviaMPEG-4 movie59 KB1MPEG-A movie98 KB MPEG-4 movie97 KB66 K3MPEG-4 movieMDEG.A movioAAKP93 KB/8 KBMPEG-4 movie50 KгMDEG-A movid58 KBMPEG-4 movie27 KB7KBMPEG-4 movieAl Notes: OffLeave• • CFavourites• jiminny• Recents* ApplicationsiCloud• iCloud Drive992 Svnc tolde0 DXP4800PLUS-B5F49 Networl• CRMI• Orange• Red|• Yellow• Green• Purple•) All lags..IhlDownloadsNameLoom.pkgAlfred copv.alfredoreterences=KeychronAssist-1.0.2 (1).dmeKeychronAssist-1.0.2.dmgmazanoke-images-yWJo.zioPhotos-3-001.zip• Transcript.pd→mage U.loge1 Orioninstaller.dma_image.jpg- image (2).1pc• ПO-22221726037035-004-001_ORGES.pdf%D0%9F%D0%9E-22221726037035-004-001 archive.zipПO-22221726037035-004-001_archive (1).zip• repon 4).XmAltred copy2.altredoreterencesСE 060209С О000000026571172 CWICT 0Р70501260015900 ndt= 27022026_0000000026574472_ SWIFT_ [IBAN].pdf= 03042026 [CREDIT_CARD] SWIFT [CREDIT_CARD].001reportxmmi=pdt.odiB pdf-1.pdfD pdf-2.pdf-pdf-5.pd1= ndf-1 ndipdf-3.pdfKoválik Family Tree.gedbitwarden export 20251031122528.isonlKoválik Family Tree.zip*macOS Storage_Cleanup.mdal favicon icofirst aid_notes_complete.docxrenortl2).esv1 config.vmlIteration run Search HS.postman_collection.jsonm licence bettertouchtoalMariusHosting Config.isonnokc.901a6502.6667.A62h-062 ccu•AlfredwPmazanoko.imnaoc.YWIfана Ковалик.jpg•искане даниел Ковалик..pg• Фактура Март Даниел Ковалик.jрс• Фактура Април Даниел Ковалик iро• Dhotac 2.001Q SearchKind00,4 MD55.9 MBinstdlle..dckageAlfred...ferences10,1 MB10,1 MBIL MBDisk ImageDisk ImageLiP archive6.6 MBZIp archive2,5 MB PDF Document2,5 MBJreo lmage2.2 MBDisk Image2,2 MB PDF Document2 MBJPEG image1,9 MBJPEG imaqe192 KBPDE Document140 KbZIP archive148 KВ148 KB122 KBZIP archivelZIP archiveXML document111 KBAlfred...ferences94 KBDDE Documont92 KBPDr DocumentK:PDF Document91 KB91 KBXML document30 KBn0kpDDE Nocumont28 KBPDF Document28 KRPDE Document28 KB27 KBDocument14 KB11 KB6 KB6KBJSONINCV NacumontZIP archiveMarkdo…..ument5KRWindo...n image4 KB3 KBword ..cumentCSV Document2 KBVAMI dosumon1 KB029 buteccSV Documenthttlicence183 bytesZero butesJSONAlfrod foronso!Zero bytesFolde1.9 MB1,8 MB17 MB1,7 MBColdorJPEG imageJPEG ImageIPEG imadeJPEG imageColdo1 of 58 selected, 8.47 GB availabld• Inu 14 May 1/•34:02Date AddedIs Mdl ZUzo dl 19:4530 Jan 2026 at 12:3617 Mar 2026 at 20:2717 Mar 2026 at 20:26Z3 Aor 2020 al 13:0229 ,Jan 2026 at 15:2019 Dec 2025 at 10:1619 Dec 2025 at 12:238 Aor 2026 at 20:3519 Dec 2025 at 10:2919 Dec 2025 at 12:1819 Dec 2025 at 12:4026 Mar 2026 at 11:2410 May 2026 at 13:5326 Mar 2026 at 11:2426 Mar 2026 at 11:2426 Mar 2026 at 11:2310 May 2026 at 14:3730 Jan 2026 at 12:3712 Goh 2006 9t 11:5 A1Z3 Apr 2026 at 13.0823 Aor 2026 at 13:0810 May 2026 at 13:5410 May 2026 at 14:3710 May 2026 at 13:4910 May 2026 at 13:5010 May 2026 at 13:5110 Mav 2026 at 12:51110 May 2026 at 13:5019 Dec 2025 at 11:3431 Oct 2025 at 12:2525 Nau 2025 г+ 17:506 Mar 2026 at 11.2224 Anr 2026 at 16:5220 Oct 2025 at 11:0218 Mar 2026 at 15:29• Mav 2026 at 11:09129 Oct 2025 at 19:329 May 2026 at 10:0419 Mar 2026 at 11:55|10 May 2026 at 13:5712 Jun 2025 at 19:0430 Jan 2026 at 12:362616 Oct 2025 aт 16:0122 Aar 2026 at 12:0223 Apr 2026 at 13:0223 Apr 2026 at 13:0222 Anr 2026 at 12:0223 Apr 2026 at 13:0229 Jan 2026 at 15:20...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
45402
|
1625
|
44
|
2026-05-14T14:34:55.979914+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-14/1778 /Users/lukas/.screenpipe/data/data/2026-05-14/1778769295979_m1.jpg...
|
PhpStorm
|
faVsco.js – IntegrationAppTrait.php
|
1
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
PhpStormFileEditViewNavigateCodeLaravelRefactorRun PhpStormFileEditViewNavigateCodeLaravelRefactorRunToolsGitWindowHelplhl100% CFV faVsco.jsv* #12066 on JY-20725-handle-HS-search-rate-limit K vHandleHubspotRateLimitTest* :8• Thu 14 May 17:34:55QProjectv.х:-© AutomatedReportGenerated.phpTrackAutomatedReportGeneratedEvent.php© UserAutomatedReportsController.php:=custom.log> D TelephonyPlanhatService.php© AutomatedReportResult.phpSendReportJob.phpDeleteCrmEntityTrait.phpDeleteAccountJob.php=laravel.log• D Webhook› D Hubspot© ImportActivityTypes.phpT WriteCrmTrait.php© DecorateActivity.php© Salesforce/Service.phpT LogActivityTrait.phpSF [jiminny@localhost]v D IntegrationAppSubscriptions© Pipedrive/Service.phpClose/Service.phpCopper/Service.php© AccountController.phpBullhornService.php© PlainTextDecorateActivity.phpA HS_local [jiminny@localho:W18© ContactController.php© ActivityPlaybookTrait.phpCrmHelperRepository.php© AccountController.phpT IntegrationAppTrait.php X= .env.staging4 console [QAI PROD] XT IntegrationAppTrait.phpE.env© DetachActivityObject.phpRematchActivityOnCrmObjectDetach.phpMatchActivityCrmData.phpClient.php4 console [PROD]© LeadController.php© HubspotPaginationService.php© HandleHubspotRateLimit.phpA console (EU]© OpportunityController.ph© ProfileController.php13trait IntegrationAppTraitA7D68 jiminny91© SystemController.phpprotected function handleBulkDeletion(string StargetKey, string $fallbackKey, string SeventName): JsonResp084143 ×4 лT TokenDataTrait.php109215•m_layout_id =© ActivityProviderController.pt 1102162,1661,66799,66© ActivityTranscriptionControl 111217© BaseController.php112if (empty(StargetIds)) {218© CalendarController.php113$this->logger->warning('No target IDs found alter fallback for ' . $eventName);219.id = 33;© ReportController.php114220© SoftphoneWebhookControlle 115return new JsonResponse([], status: JsonResponse::HTTP_BAD_REQUEST);221© AbstractController.php116-222• CommentContextinterface.php117—223© ConferencesOptinOutControllel118foreach ($targetIds as $targetId) {224id THEN '(own© Controller.php119Sthis-›deleteTarget(team: Steam, targetid: (string) $targetId);225© ExportController.php120226© FrontendController.php121-227T FrontendControllerTrait.php122return new JsonResponse([],status: JsonResponse: :HTTP_0K);228© GeocodingController.php123229© HealthCheckController.php124230hubspot':-© LiveCoachController.phpno usages231© MissingTeamController.php125 @abstract protected function deleteTarget(Team $team, string $targetId): void;232© MobileController.php126233V= 11512582;© NotificationController.php127234© NotificationProviderController.p© PlaybackController.php© PlaylistController.php© PusherController.php© SlackController.phpWorkspace associated with branch 'JY-20725-handle-HS-search-rate-limit' has been restored // Rollback // Configure... (today 16:17)W Windsurf Teams124:1UTF-8Ca 4 spaces...
|
NULL
|
-7430928778279164914
|
NULL
|
click
|
ocr
|
NULL
|
PhpStormFileEditViewNavigateCodeLaravelRefactorRun PhpStormFileEditViewNavigateCodeLaravelRefactorRunToolsGitWindowHelplhl100% CFV faVsco.jsv* #12066 on JY-20725-handle-HS-search-rate-limit K vHandleHubspotRateLimitTest* :8• Thu 14 May 17:34:55QProjectv.х:-© AutomatedReportGenerated.phpTrackAutomatedReportGeneratedEvent.php© UserAutomatedReportsController.php:=custom.log> D TelephonyPlanhatService.php© AutomatedReportResult.phpSendReportJob.phpDeleteCrmEntityTrait.phpDeleteAccountJob.php=laravel.log• D Webhook› D Hubspot© ImportActivityTypes.phpT WriteCrmTrait.php© DecorateActivity.php© Salesforce/Service.phpT LogActivityTrait.phpSF [jiminny@localhost]v D IntegrationAppSubscriptions© Pipedrive/Service.phpClose/Service.phpCopper/Service.php© AccountController.phpBullhornService.php© PlainTextDecorateActivity.phpA HS_local [jiminny@localho:W18© ContactController.php© ActivityPlaybookTrait.phpCrmHelperRepository.php© AccountController.phpT IntegrationAppTrait.php X= .env.staging4 console [QAI PROD] XT IntegrationAppTrait.phpE.env© DetachActivityObject.phpRematchActivityOnCrmObjectDetach.phpMatchActivityCrmData.phpClient.php4 console [PROD]© LeadController.php© HubspotPaginationService.php© HandleHubspotRateLimit.phpA console (EU]© OpportunityController.ph© ProfileController.php13trait IntegrationAppTraitA7D68 jiminny91© SystemController.phpprotected function handleBulkDeletion(string StargetKey, string $fallbackKey, string SeventName): JsonResp084143 ×4 лT TokenDataTrait.php109215•m_layout_id =© ActivityProviderController.pt 1102162,1661,66799,66© ActivityTranscriptionControl 111217© BaseController.php112if (empty(StargetIds)) {218© CalendarController.php113$this->logger->warning('No target IDs found alter fallback for ' . $eventName);219.id = 33;© ReportController.php114220© SoftphoneWebhookControlle 115return new JsonResponse([], status: JsonResponse::HTTP_BAD_REQUEST);221© AbstractController.php116-222• CommentContextinterface.php117—223© ConferencesOptinOutControllel118foreach ($targetIds as $targetId) {224id THEN '(own© Controller.php119Sthis-›deleteTarget(team: Steam, targetid: (string) $targetId);225© ExportController.php120226© FrontendController.php121-227T FrontendControllerTrait.php122return new JsonResponse([],status: JsonResponse: :HTTP_0K);228© GeocodingController.php123229© HealthCheckController.php124230hubspot':-© LiveCoachController.phpno usages231© MissingTeamController.php125 @abstract protected function deleteTarget(Team $team, string $targetId): void;232© MobileController.php126233V= 11512582;© NotificationController.php127234© NotificationProviderController.p© PlaybackController.php© PlaylistController.php© PusherController.php© SlackController.phpWorkspace associated with branch 'JY-20725-handle-HS-search-rate-limit' has been restored // Rollback // Configure... (today 16:17)W Windsurf Teams124:1UTF-8Ca 4 spaces...
|
45401
|
NULL
|
NULL
|
NULL
|
|
44541
|
1609
|
61
|
2026-05-14T13:53:12.027523+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-14/1778 /Users/lukas/.screenpipe/data/data/2026-05-14/1778766792027_m1.jpg...
|
PhpStorm
|
faVsco.js – IntegrationAppTrait.php
|
1
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
#12066 on JY-20725-handle Project: faVsco.js, menu
#12066 on JY-20725-handle-HS-search-rate-limit, menu
Start Listening for PHP Debug Connections
HandleHubspotRateLimitTest
Run 'HandleHubspotRateLimitTest'
Debug 'HandleHubspotRateLimitTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
7
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Http\Controllers\Webhook\IntegrationAppSubscriptions;
use Illuminate\Http\JsonResponse;
use Jiminny\Contracts\Crm\Providers;
use Jiminny\Models\Team;
use Jiminny\Services\Crm\IntegrationApp\Service;
use Jiminny\Services\Crm\ProviderRegistry;
trait IntegrationAppTrait
{
abstract protected function getTeamFromRequest(): ?Team;
abstract protected function extractPayload(): array;
private function getPayload(): array
{
$payload = $this->extractPayload();
$this->logger->info('[integration-app] Event received', [
'payload' => $payload,
]);
return $payload;
}
private function extractTargetIdFromPayload(string $targetId): ?string
{
$payload = $this->getPayload();
return $payload[$targetId] ?? null;
}
private function extractTargetObjectIdsFromPayload(string $targetKey): array
{
$payload = $this->getPayload();
$objects = $payload[$targetKey] ?? [];
if (! is_array($objects) || empty($objects)) {
return [];
}
return array_values(array_filter(array_map(
static fn ($object) => is_array($object) ? ($object['id'] ?? null) : null,
$objects
)));
}
private function bootstrapIntegrationApp(Team $team): ?Service
{
$crmProvider = app(ProviderRegistry::class);
$providerName = $team->getCrmConfiguration()->getProviderName();
if (! Providers::isIntegrationAppProvider($providerName)) {
return null;
}
/** @var Service $integrationApp */
$integrationApp = $crmProvider->get($providerName);
$integrationApp->setUser($team->getOwner());
return $integrationApp;
}
private function getTargetCrmProviderId(string $targetKey, string $eventName): ?string
{
$targetId = $this->extractTargetIdFromPayload($targetKey);
$this->logger->info("[integration-app] Event: {$eventName}", [
'targetId' => $targetId,
'targetKey' => $targetKey,
]);
return $targetId;
}
private function getTargetCrmProviderObjectsIds(string $targetKey, string $eventName): array
{
$targetIds = $this->extractTargetObjectIdsFromPayload($targetKey);
$this->logger->info("[integration-app] Event: $eventName", [
'targetIds' => $targetIds,
'targetKey' => $targetKey,
'count' => count($targetIds),
]);
return $targetIds;
}
protected function handleBulkDeletion(string $targetKey, string $fallbackKey, string $eventName): JsonResponse
{
$team = $this->getTeamFromRequest();
if ($team === null) {
return new JsonResponse([], JsonResponse::HTTP_NO_CONTENT);
}
$targetIds = $this->getTargetCrmProviderObjectsIds(targetKey: $targetKey, eventName: $eventName);
if (empty($targetIds)) {
$this->logger->warning('No target IDs found for ' . $eventName);
// fallback to single target ID
$targetId = $this->getTargetCrmProviderId(targetKey: $fallbackKey, eventName: $eventName);
if ($targetId !== null) {
$targetIds[] = $targetId;
}
}
if (empty($targetIds)) {
$this->logger->warning('No target IDs found alter fallback for ' . $eventName);
return new JsonResponse([], JsonResponse::HTTP_BAD_REQUEST);
}
foreach ($targetIds as $targetId) {
$this->deleteTarget(team: $team, targetId: (string) $targetId);
}
return new JsonResponse([], JsonResponse::HTTP_OK);
}
abstract protected function deleteTarget(Team $team, string $targetId): void;
}
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
8
1
3
4
Previous Highlighted Error
Next Highlighted Error
SELECT
# DISTINCT
opp.id as opp_id, opp.uuid, opp.name,
# COUNT(dr.id) AS deal_risk_count,
# dr.id,
# cfd.value,
usr.name AS owner_name,
opp.value, opp.currency_code, opp.close_date, opp.remotely_created_at, opp.is_closed, opp.is_won,
usr.uuid as owner_uuid,
usr.photo_path as owner_photo,
usr.id AS owner_id,
jt.name as owner_job,
opp.stage_id, opp.stage_updated_at,
acc.name AS acc_name, opp.stage_updated_at, acc.crm_provider_id AS acc_provider_id, opp.crm_provider_id AS opp_provider_id,
rt.business_process_id AS pipeline_id
FROM opportunities opp
LEFT JOIN record_types rt ON opp.record_type_id = rt.id
LEFT JOIN users usr ON opp.user_id = usr.id
LEFT JOIN accounts acc ON opp.account_id = acc.id
LEFT JOIN job_titles jt ON usr.job_title_id = jt.id
# LEFT JOIN group_deal_risk_types gdrt ON gdrt.group_id = usr.group_id
# LEFT JOIN deal_risks dr ON dr.opportunity_id = opp.id AND dr.group_deal_risk_type_id = gdrt.id
LEFT JOIN crm_field_data cfd ON (cfd.object_id = opp.id and cfd.crm_field_id = 66814)
WHERE opp.user_id IS NOT NULL
AND opp.deleted_at IS NULL
AND opp.is_closed = 1
AND opp.is_won = 0
AND opp.close_date >= '2024-01-01 00:00:00'
AND opp.close_date <= '2024-12-31 23:59:59'
AND usr.team_id = 1
# and opp.id = 4823179
GROUP BY opp.id, cfd.value
ORDER BY
# cfd.value
CAST(cfd.value AS UNSIGNED)
# owner_name
# (SELECT COUNT(dr.id)
# FROM deal_risks dr
# JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id
# WHERE dr.opportunity_id = opp.id
# AND dr.is_active = 1
# AND gdrt.is_enabled = 1)
DESC
LIMIT 25
# OFFSET 0
;
select * from crm_fields where crm_configuration_id = 1 and object_type = 'opportunity';
select * from crm_layout_entities where crm_layout_id = 1493;
SELECT * FROM opportunities WHERE id = 4584045;
SELECT * FROM crm_field_data WHERE object_id = 4584045;
SELECT * FROM opportunities where team_id = 1 and crm_provider_id = '0061K00000lfb9IQAQ'
SELECT
opp.id as opportunity_id,
opp.name,
COUNT(dr.id) as risk_count
FROM opportunities opp
LEFT JOIN deal_risks dr ON dr.opportunity_id = opp.id
WHERE opp.id IN (
6069574,8900938,9507638,9524799,9660490,9662824,9705675,9749758,4158460,4391812,6450439,4448422,5118945,5590675,4584045,7228149,9002408,9165534,9446720,9641778,9665149,9703344,9709280,5747948,4158491,6182565,6263970,5798120,5111315,4536978,6062352,6548383,6072095,6548225,4480986,5011422,6548381,8760540,8917554,9509986,9514392,9569009,9569011,9578490,9713604,5784397,7276612,7288405,8994421,9118219,9608148,9818911,4510535,6479693,5958049,6271674,6550448,4158331,4158483,6126571,6171615,6540943,4897466,5190896,5796182,5932762,8572433,8723698,8892697,9711001,9789264,4549188,6100831,6170064,6260799,6263653,6449936,6530871,6538978,7777651,8059269,8319918,8787049,8901150,9263153,9453207,9514738,9696700,9791062,5752018,6421452,7439134,7878923,9354763,9369285,9514396,9582506,9889949,9890216,4094311,4158495,4158496,6098128,5585661,3872564,6442149,5891604,6164746,6199593,6583474,6519684,9018490,9809006,4496897,5041324,5829430,6198319,6253504,6555763,7242914,7931055,8024125,8797814,8058559,8673347,8892695,8994420,9616219,9714970,9722004,9809439,9818918,6523177,8134147,9002915,9711422,9892713,9901719,9954210,9978435,5800810,6243518,6416114,6222251,6411974,6512456,5791953,6545606,9914780,5805540,6238986,6463838,6547680,9767049,9809437,9810885,9890855,6673493,9902036,4335521,6379871,6503799,6546077,8018765,9907556,9958433,9905855,9916179,9946741,9957877,5563344,6271838,6450815,7641128,7762567,7780592,8684810,8685786,8685787,8685788
)
GROUP BY opp.id;
SELECT COUNT(dr.id)
FROM deal_risks dr
JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id
WHERE dr.opportunity_id = 5563344
# AND gdrt.group_id = usr.group_id
EXPLAIN SELECT
opp.id as opp_id, opp.uuid, opp.name,
cfd.value,
cfv.sequence,
cfv.value,
# MAX(cfd.value) AS max_cfd_value,
usr.name AS owner_name,
opp.value, opp.currency_code, opp.close_date, opp.remotely_created_at, opp.is_closed, opp.is_won,
usr.uuid as owner_uuid,
usr.photo_path as owner_photo,
usr.id AS owner_id,
jt.name as owner_job,
opp.stage_id, opp.stage_updated_at,
acc.name AS acc_name, opp.stage_updated_at, acc.crm_provider_id AS acc_provider_id, opp.crm_provider_id AS opp_provider_id,
rt.business_process_id AS pipeline_id
FROM opportunities opp
LEFT JOIN record_types rt ON opp.record_type_id = rt.id
LEFT JOIN users usr ON opp.user_id = usr.id
LEFT JOIN accounts acc ON opp.account_id = acc.id
LEFT JOIN job_titles jt ON usr.job_title_id = jt.id
LEFT JOIN crm_field_data cfd ON cfd.id = (SELECT sub_cfd.id
FROM crm_field_data sub_cfd
WHERE sub_cfd.object_id = opp.id
AND sub_cfd.crm_field_id = 66810
ORDER BY sub_cfd.updated_at DESC
LIMIT 1)
LEFT JOIN crm_field_values cfv ON cfv.crm_field_id = 66810 AND cfv.value = cfd.value
WHERE opp.user_id IS NOT NULL
AND opp.deleted_at IS NULL
AND opp.is_closed = 0
# AND opp.is_closed = 1
# AND opp.is_won = 0
AND opp.close_date >= '2024-01-01 00:00:00'
AND opp.close_date <= '2024-12-31 23:59:59'
AND usr.team_id = 1
# and opp.id = 4823179
# GROUP BY opp.id
ORDER BY
cfv.sequence DESC,
# opp.name
# owner_name
cfd.value
# CAST(cfd.value AS UNSIGNED)
# CAST(MAX(cfd.value) AS UNSIGNED)
# (SELECT COUNT(dr.id)
# FROM deal_risks dr
# JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id
# WHERE dr.opportunity_id = opp.id
# AND dr.is_active = 1 AND gdrt.is_enabled = 1)
DESC
# LIMIT 75, 25
;
SELECT * FROM crm_field_values WHERE crm_field_id = 66810;
SELECT f.id, f.crm_provider_id AS field_name, f.label, fd.object_id AS dealId, fd.value, fd.updated_at, fd.id, fd.created_at
FROM crm_fields f
INNER JOIN crm_field_data fd ON fd.crm_field_id = f.id
WHERE (f.crm_configuration_id = 1)
AND (f.object_type = 'opportunity')
# AND (fd.object_id IN (4158331,4158483,4158495,4158496,6069574,6263970,6171615,6540943,6545606,5829430,6198319,6263653,6548381,7242914,8797814,7228149,7439134,7878923,8134147,9002915,9118219,9165534,9354763,9369285,9446720))
AND (fd.object_id IN (4158460))
AND (f.crm_provider_id IN ('ForecastCategoryName'))
ORDER BY fd.object_id ASC, fd.updated_at DESC;
select * from crm_layouts where crm_configuration_id = 1;
select cf.* from crm_fields cf
join crm_layout_entities cle on cf.id = cle.crm_field_id
where crm_layout_id = 1493;
SELECT * FROM opportunities WHERE id = 4158460;
SELECT * FROM crm_field_data WHERE object_id = 4158460;
select * from users where team_id = 1;
SELECT * FROM users WHERE id = 7160;
select * from role_user where user_id = 3248;
select * from crm_field_values where crm_field_id = 66824;
SELECT * FROM users WHERE id = 23470;
select * from crm_configurations;
# [PASSWORD_DOTS]
select * from teams where id = 1038; # 23521, 966
select * from users where team_id = 1038;
select * from crm_configurations where id = 966;
SELECT * FROM activities WHERE uuid_to_bin('e8dc7c34-31f6-4430-bd81-2d9d8f00dd07') = uuid; # 54965762
SELECT * FROM activities WHERE uuid_to_bin('4b5727c0-69d1-428f-b8d9-b649055166e2') = uuid; # 54965764
SELECT * FROM participants WHERE activity_id = 54965764;
SELECT id, uuid, title, recording_state FROM activities WHERE uuid_to_bin('355f105d-5606-4379-b0c5-d91daf59f4ce') = uuid; # 54964075
SELECT * FROM participants WHERE activity_id = 54964075;
select f.id, slug, title, tf.team_id from team_features tf JOIN features f on tf.feature_id = f.id
where tf.team_id = 1038;
# [PASSWORD_DOTS] PD [PASSWORD_DOTS]
select * from teams where id = 1029;
SELECT * FROM crm_configurations WHERE id = 957;
SELECT * FROM activities WHERE uuid_to_bin('581a33cb-4343-44bd-ac0c-4a5cee71c5ec') = uuid; # 54963423
SELECT * FROM activities WHERE uuid_to_bin('07238011-25fa-418e-838b-fb21e82b9ea2') = uuid; # 54963433
SELECT * FROM activities WHERE uuid_to_bin('8b6bb2f7-e7a7-4aec-8806-fbfea7093ccd') = uuid; # 54963421
# [PASSWORD_DOTS] Close [PASSWORD_DOTS]
select * from teams where id = 1031;
SELECT * FROM crm_configurations WHERE id = 959;
SELECT * FROM activities WHERE uuid_to_bin('59c517e0-96c9-4dad-bfeb-b7bef72f8725') = uuid; # 54963517
SELECT * FROM activities WHERE uuid_to_bin('07238011-25fa-418e-838b-fb21e82b9ea2') = uuid; # 54963433
SELECT * FROM activities WHERE uuid_to_bin('d68311e3-ac34-49bd-bf04-88323a7e5352') = uuid; # 54966009
# [PASSWORD_DOTS] SF [PASSWORD_DOTS]
SELECT * FROM activities WHERE uuid_to_bin('2bd4cfa3-4eb5-4c77-84a7-9ed46a21c988') = uuid;
select * from roles;
select * from permissions;
select * from permission_role where permission_id = 136;
select * from migrations order by id desc;
select * from teams where id IN (1, 1037);
select * from crm_layouts where crm_configuration_id = 1;
SELECT * FROM crm_layout_entities WHERE crm_layout_id = 1493;
SELECT * FROM crm_fields WHERE id IN (1652,1661,66799,66814,66821,66836,66843,66846,66864,84752,182306,323580,380378);
select * from features;
select * from team_features where feature_id = 33;
select * from opportunities;
select * from teams;
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 = 1052 and sa.provider = 'hubspot';
SELECT * FROM accounts where id = 11512582;
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.054166667,"top":0.027777778,"width":0.08055556,"height":0.035555556},"on_screen":true,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"#12066 on JY-20725-handle-HS-search-rate-limit, menu","depth":5,"bounds":{"left":0.13472222,"top":0.027777778,"width":0.25555557,"height":0.035555556},"on_screen":true,"help_text":"Pull request #12066 exists for current branch JY-20725-handle-HS-search-rate-limit, but local branch is out of sync with remote","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"bounds":{"left":0.6326389,"top":0.027777778,"width":0.023611112,"height":0.035555556},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"HandleHubspotRateLimitTest","depth":6,"bounds":{"left":0.6645833,"top":0.027777778,"width":0.15902779,"height":0.035555556},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run 'HandleHubspotRateLimitTest'","depth":6,"bounds":{"left":0.82361114,"top":0.027777778,"width":0.023611112,"height":0.035555556},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'HandleHubspotRateLimitTest'","depth":6,"bounds":{"left":0.8472222,"top":0.027777778,"width":0.023611112,"height":0.035555556},"on_screen":true,"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.87083334,"top":0.027777778,"width":0.023611112,"height":0.035555556},"on_screen":true,"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.9291667,"top":0.027777778,"width":0.023611112,"height":0.035555556},"on_screen":true,"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.9527778,"top":0.027777778,"width":0.023611112,"height":0.035555556},"on_screen":true,"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.9763889,"top":0.027777778,"width":0.023611112,"height":0.035555556},"on_screen":true,"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},"on_screen":false,"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},"on_screen":false,"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},"on_screen":false,"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},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"7","depth":4,"bounds":{"left":0.6701389,"top":0.3122222,"width":0.015972223,"height":0.02111111},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.68958336,"top":0.31,"width":0.015277778,"height":0.025555555},"on_screen":true,"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.7048611,"top":0.31,"width":0.014583333,"height":0.025555555},"on_screen":true,"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\\Webhook\\IntegrationAppSubscriptions;\n\nuse Illuminate\\Http\\JsonResponse;\nuse Jiminny\\Contracts\\Crm\\Providers;\nuse Jiminny\\Models\\Team;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\Service;\nuse Jiminny\\Services\\Crm\\ProviderRegistry;\n\ntrait IntegrationAppTrait\n{\n abstract protected function getTeamFromRequest(): ?Team;\n\n abstract protected function extractPayload(): array;\n\n private function getPayload(): array\n {\n $payload = $this->extractPayload();\n $this->logger->info('[integration-app] Event received', [\n 'payload' => $payload,\n ]);\n\n return $payload;\n }\n\n private function extractTargetIdFromPayload(string $targetId): ?string\n {\n $payload = $this->getPayload();\n\n return $payload[$targetId] ?? null;\n }\n\n private function extractTargetObjectIdsFromPayload(string $targetKey): array\n {\n $payload = $this->getPayload();\n\n $objects = $payload[$targetKey] ?? [];\n\n if (! is_array($objects) || empty($objects)) {\n return [];\n }\n\n return array_values(array_filter(array_map(\n static fn ($object) => is_array($object) ? ($object['id'] ?? null) : null,\n $objects\n )));\n }\n\n private function bootstrapIntegrationApp(Team $team): ?Service\n {\n $crmProvider = app(ProviderRegistry::class);\n\n $providerName = $team->getCrmConfiguration()->getProviderName();\n if (! Providers::isIntegrationAppProvider($providerName)) {\n return null;\n }\n\n /** @var Service $integrationApp */\n $integrationApp = $crmProvider->get($providerName);\n $integrationApp->setUser($team->getOwner());\n\n return $integrationApp;\n }\n\n private function getTargetCrmProviderId(string $targetKey, string $eventName): ?string\n {\n $targetId = $this->extractTargetIdFromPayload($targetKey);\n $this->logger->info(\"[integration-app] Event: {$eventName}\", [\n 'targetId' => $targetId,\n 'targetKey' => $targetKey,\n ]);\n\n return $targetId;\n }\n\n private function getTargetCrmProviderObjectsIds(string $targetKey, string $eventName): array\n {\n $targetIds = $this->extractTargetObjectIdsFromPayload($targetKey);\n $this->logger->info(\"[integration-app] Event: $eventName\", [\n 'targetIds' => $targetIds,\n 'targetKey' => $targetKey,\n 'count' => count($targetIds),\n ]);\n\n return $targetIds;\n }\n\n protected function handleBulkDeletion(string $targetKey, string $fallbackKey, string $eventName): JsonResponse\n {\n $team = $this->getTeamFromRequest();\n\n if ($team === null) {\n return new JsonResponse([], JsonResponse::HTTP_NO_CONTENT);\n }\n\n $targetIds = $this->getTargetCrmProviderObjectsIds(targetKey: $targetKey, eventName: $eventName);\n\n if (empty($targetIds)) {\n $this->logger->warning('No target IDs found for ' . $eventName);\n\n // fallback to single target ID\n $targetId = $this->getTargetCrmProviderId(targetKey: $fallbackKey, eventName: $eventName);\n\n if ($targetId !== null) {\n $targetIds[] = $targetId;\n }\n }\n\n if (empty($targetIds)) {\n $this->logger->warning('No target IDs found alter fallback for ' . $eventName);\n\n return new JsonResponse([], JsonResponse::HTTP_BAD_REQUEST);\n }\n\n foreach ($targetIds as $targetId) {\n $this->deleteTarget(team: $team, targetId: (string) $targetId);\n }\n\n return new JsonResponse([], JsonResponse::HTTP_OK);\n }\n\n abstract protected function deleteTarget(Team $team, string $targetId): void;\n}","depth":4,"on_screen":true,"value":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Http\\Controllers\\Webhook\\IntegrationAppSubscriptions;\n\nuse Illuminate\\Http\\JsonResponse;\nuse Jiminny\\Contracts\\Crm\\Providers;\nuse Jiminny\\Models\\Team;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\Service;\nuse Jiminny\\Services\\Crm\\ProviderRegistry;\n\ntrait IntegrationAppTrait\n{\n abstract protected function getTeamFromRequest(): ?Team;\n\n abstract protected function extractPayload(): array;\n\n private function getPayload(): array\n {\n $payload = $this->extractPayload();\n $this->logger->info('[integration-app] Event received', [\n 'payload' => $payload,\n ]);\n\n return $payload;\n }\n\n private function extractTargetIdFromPayload(string $targetId): ?string\n {\n $payload = $this->getPayload();\n\n return $payload[$targetId] ?? null;\n }\n\n private function extractTargetObjectIdsFromPayload(string $targetKey): array\n {\n $payload = $this->getPayload();\n\n $objects = $payload[$targetKey] ?? [];\n\n if (! is_array($objects) || empty($objects)) {\n return [];\n }\n\n return array_values(array_filter(array_map(\n static fn ($object) => is_array($object) ? ($object['id'] ?? null) : null,\n $objects\n )));\n }\n\n private function bootstrapIntegrationApp(Team $team): ?Service\n {\n $crmProvider = app(ProviderRegistry::class);\n\n $providerName = $team->getCrmConfiguration()->getProviderName();\n if (! Providers::isIntegrationAppProvider($providerName)) {\n return null;\n }\n\n /** @var Service $integrationApp */\n $integrationApp = $crmProvider->get($providerName);\n $integrationApp->setUser($team->getOwner());\n\n return $integrationApp;\n }\n\n private function getTargetCrmProviderId(string $targetKey, string $eventName): ?string\n {\n $targetId = $this->extractTargetIdFromPayload($targetKey);\n $this->logger->info(\"[integration-app] Event: {$eventName}\", [\n 'targetId' => $targetId,\n 'targetKey' => $targetKey,\n ]);\n\n return $targetId;\n }\n\n private function getTargetCrmProviderObjectsIds(string $targetKey, string $eventName): array\n {\n $targetIds = $this->extractTargetObjectIdsFromPayload($targetKey);\n $this->logger->info(\"[integration-app] Event: $eventName\", [\n 'targetIds' => $targetIds,\n 'targetKey' => $targetKey,\n 'count' => count($targetIds),\n ]);\n\n return $targetIds;\n }\n\n protected function handleBulkDeletion(string $targetKey, string $fallbackKey, string $eventName): JsonResponse\n {\n $team = $this->getTeamFromRequest();\n\n if ($team === null) {\n return new JsonResponse([], JsonResponse::HTTP_NO_CONTENT);\n }\n\n $targetIds = $this->getTargetCrmProviderObjectsIds(targetKey: $targetKey, eventName: $eventName);\n\n if (empty($targetIds)) {\n $this->logger->warning('No target IDs found for ' . $eventName);\n\n // fallback to single target ID\n $targetId = $this->getTargetCrmProviderId(targetKey: $fallbackKey, eventName: $eventName);\n\n if ($targetId !== null) {\n $targetIds[] = $targetId;\n }\n }\n\n if (empty($targetIds)) {\n $this->logger->warning('No target IDs found alter fallback for ' . $eventName);\n\n return new JsonResponse([], JsonResponse::HTTP_BAD_REQUEST);\n }\n\n foreach ($targetIds as $targetId) {\n $this->deleteTarget(team: $team, targetId: (string) $targetId);\n }\n\n return new JsonResponse([], JsonResponse::HTTP_OK);\n }\n\n abstract protected function deleteTarget(Team $team, string $targetId): void;\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.72291666,"top":0.24111111,"width":0.018055556,"height":0.026666667},"on_screen":true,"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.7409722,"top":0.24111111,"width":0.018055556,"height":0.026666667},"on_screen":true,"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.7638889,"top":0.24111111,"width":0.018055556,"height":0.026666667},"on_screen":true,"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.78194445,"top":0.24111111,"width":0.018055556,"height":0.026666667},"on_screen":true,"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.8,"top":0.24111111,"width":0.018055556,"height":0.026666667},"on_screen":true,"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.8229167,"top":0.24111111,"width":0.018055556,"height":0.026666667},"on_screen":true,"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.84583336,"top":0.24111111,"width":0.050694443,"height":0.026666667},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Cancel Running Statements","depth":4,"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Playground","depth":4,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"jiminny","depth":4,"bounds":{"left":0.9138889,"top":0.24111111,"width":0.059027776,"height":0.026666667},"on_screen":true,"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},"on_screen":false,"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},"on_screen":false,"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},"on_screen":false,"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},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"8","depth":4,"bounds":{"left":0.8645833,"top":0.27555555,"width":0.016666668,"height":0.02111111},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"1","depth":4,"bounds":{"left":0.8854167,"top":0.27555555,"width":0.015277778,"height":0.02111111},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"3","depth":4,"bounds":{"left":0.9048611,"top":0.27555555,"width":0.016666668,"height":0.02111111},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"4","depth":4,"bounds":{"left":0.92569447,"top":0.27555555,"width":0.016666668,"height":0.02111111},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.9458333,"top":0.27333334,"width":0.015277778,"height":0.025555555},"on_screen":true,"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.9611111,"top":0.27333334,"width":0.014583333,"height":0.025555555},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"SELECT\n# DISTINCT\nopp.id as opp_id, opp.uuid, opp.name,\n# COUNT(dr.id) AS deal_risk_count,\n\n# dr.id,\n# cfd.value,\nusr.name AS owner_name,\nopp.value, opp.currency_code, opp.close_date, opp.remotely_created_at, opp.is_closed, opp.is_won,\nusr.uuid as owner_uuid,\nusr.photo_path as owner_photo,\nusr.id AS owner_id,\njt.name as owner_job,\nopp.stage_id, opp.stage_updated_at,\nacc.name AS acc_name, opp.stage_updated_at, acc.crm_provider_id AS acc_provider_id, opp.crm_provider_id AS opp_provider_id,\nrt.business_process_id AS pipeline_id\nFROM opportunities opp\nLEFT JOIN record_types rt ON opp.record_type_id = rt.id\nLEFT JOIN users usr ON opp.user_id = usr.id\nLEFT JOIN accounts acc ON opp.account_id = acc.id\nLEFT JOIN job_titles jt ON usr.job_title_id = jt.id\n\n# LEFT JOIN group_deal_risk_types gdrt ON gdrt.group_id = usr.group_id\n# LEFT JOIN deal_risks dr ON dr.opportunity_id = opp.id AND dr.group_deal_risk_type_id = gdrt.id\n\nLEFT JOIN crm_field_data cfd ON (cfd.object_id = opp.id and cfd.crm_field_id = 66814)\n\nWHERE opp.user_id IS NOT NULL\nAND opp.deleted_at IS NULL\nAND opp.is_closed = 1\nAND opp.is_won = 0\nAND opp.close_date >= '2024-01-01 00:00:00'\nAND opp.close_date <= '2024-12-31 23:59:59'\nAND usr.team_id = 1\n\n# and opp.id = 4823179\n\nGROUP BY opp.id, cfd.value\nORDER BY\n# cfd.value\n CAST(cfd.value AS UNSIGNED)\n# owner_name\n# (SELECT COUNT(dr.id)\n# FROM deal_risks dr\n# JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id\n# WHERE dr.opportunity_id = opp.id\n# AND dr.is_active = 1\n# AND gdrt.is_enabled = 1)\nDESC\nLIMIT 25\n# OFFSET 0\n;\n\nselect * from crm_fields where crm_configuration_id = 1 and object_type = 'opportunity';\nselect * from crm_layout_entities where crm_layout_id = 1493;\n\nSELECT * FROM opportunities WHERE id = 4584045;\nSELECT * FROM crm_field_data WHERE object_id = 4584045;\n\nSELECT * FROM opportunities where team_id = 1 and crm_provider_id = '0061K00000lfb9IQAQ'\n\nSELECT\n opp.id as opportunity_id,\n opp.name,\n COUNT(dr.id) as risk_count\nFROM opportunities opp\nLEFT JOIN deal_risks dr ON dr.opportunity_id = opp.id\nWHERE opp.id IN (\n 6069574,8900938,9507638,9524799,9660490,9662824,9705675,9749758,4158460,4391812,6450439,4448422,5118945,5590675,4584045,7228149,9002408,9165534,9446720,9641778,9665149,9703344,9709280,5747948,4158491,6182565,6263970,5798120,5111315,4536978,6062352,6548383,6072095,6548225,4480986,5011422,6548381,8760540,8917554,9509986,9514392,9569009,9569011,9578490,9713604,5784397,7276612,7288405,8994421,9118219,9608148,9818911,4510535,6479693,5958049,6271674,6550448,4158331,4158483,6126571,6171615,6540943,4897466,5190896,5796182,5932762,8572433,8723698,8892697,9711001,9789264,4549188,6100831,6170064,6260799,6263653,6449936,6530871,6538978,7777651,8059269,8319918,8787049,8901150,9263153,9453207,9514738,9696700,9791062,5752018,6421452,7439134,7878923,9354763,9369285,9514396,9582506,9889949,9890216,4094311,4158495,4158496,6098128,5585661,3872564,6442149,5891604,6164746,6199593,6583474,6519684,9018490,9809006,4496897,5041324,5829430,6198319,6253504,6555763,7242914,7931055,8024125,8797814,8058559,8673347,8892695,8994420,9616219,9714970,9722004,9809439,9818918,6523177,8134147,9002915,9711422,9892713,9901719,9954210,9978435,5800810,6243518,6416114,6222251,6411974,6512456,5791953,6545606,9914780,5805540,6238986,6463838,6547680,9767049,9809437,9810885,9890855,6673493,9902036,4335521,6379871,6503799,6546077,8018765,9907556,9958433,9905855,9916179,9946741,9957877,5563344,6271838,6450815,7641128,7762567,7780592,8684810,8685786,8685787,8685788\n)\nGROUP BY opp.id;\n\nSELECT COUNT(dr.id)\n FROM deal_risks dr\n JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id\n WHERE dr.opportunity_id = 5563344\n# AND gdrt.group_id = usr.group_id\n\n\n\nEXPLAIN SELECT\n opp.id as opp_id, opp.uuid, opp.name,\n\ncfd.value,\ncfv.sequence,\ncfv.value,\n# MAX(cfd.value) AS max_cfd_value,\nusr.name AS owner_name,\nopp.value, opp.currency_code, opp.close_date, opp.remotely_created_at, opp.is_closed, opp.is_won,\nusr.uuid as owner_uuid,\nusr.photo_path as owner_photo,\nusr.id AS owner_id,\njt.name as owner_job,\nopp.stage_id, opp.stage_updated_at,\nacc.name AS acc_name, opp.stage_updated_at, acc.crm_provider_id AS acc_provider_id, opp.crm_provider_id AS opp_provider_id,\nrt.business_process_id AS pipeline_id\nFROM opportunities opp\n\nLEFT JOIN record_types rt ON opp.record_type_id = rt.id\nLEFT JOIN users usr ON opp.user_id = usr.id\nLEFT JOIN accounts acc ON opp.account_id = acc.id\nLEFT JOIN job_titles jt ON usr.job_title_id = jt.id\n\nLEFT JOIN crm_field_data cfd ON cfd.id = (SELECT sub_cfd.id\n FROM crm_field_data sub_cfd\n WHERE sub_cfd.object_id = opp.id\n AND sub_cfd.crm_field_id = 66810\n ORDER BY sub_cfd.updated_at DESC\n LIMIT 1)\n\nLEFT JOIN crm_field_values cfv ON cfv.crm_field_id = 66810 AND cfv.value = cfd.value\n\nWHERE opp.user_id IS NOT NULL\nAND opp.deleted_at IS NULL\nAND opp.is_closed = 0\n# AND opp.is_closed = 1\n# AND opp.is_won = 0\nAND opp.close_date >= '2024-01-01 00:00:00'\nAND opp.close_date <= '2024-12-31 23:59:59'\nAND usr.team_id = 1\n\n# and opp.id = 4823179\n\n# GROUP BY opp.id\nORDER BY\n cfv.sequence DESC,\n# opp.name\n# owner_name\n cfd.value\n# CAST(cfd.value AS UNSIGNED)\n# CAST(MAX(cfd.value) AS UNSIGNED)\n# (SELECT COUNT(dr.id)\n# FROM deal_risks dr\n# JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id\n# WHERE dr.opportunity_id = opp.id\n# AND dr.is_active = 1 AND gdrt.is_enabled = 1)\nDESC\n# LIMIT 75, 25\n;\n\n\n\nSELECT * FROM crm_field_values WHERE crm_field_id = 66810;\n\nSELECT f.id, f.crm_provider_id AS field_name, f.label, fd.object_id AS dealId, fd.value, fd.updated_at, fd.id, fd.created_at\nFROM crm_fields f\nINNER JOIN crm_field_data fd ON fd.crm_field_id = f.id\n WHERE (f.crm_configuration_id = 1)\n AND (f.object_type = 'opportunity')\n# AND (fd.object_id IN (4158331,4158483,4158495,4158496,6069574,6263970,6171615,6540943,6545606,5829430,6198319,6263653,6548381,7242914,8797814,7228149,7439134,7878923,8134147,9002915,9118219,9165534,9354763,9369285,9446720))\n AND (fd.object_id IN (4158460))\n AND (f.crm_provider_id IN ('ForecastCategoryName'))\n ORDER BY fd.object_id ASC, fd.updated_at DESC;\n\nselect * from crm_layouts where crm_configuration_id = 1;\nselect cf.* from crm_fields cf\njoin crm_layout_entities cle on cf.id = cle.crm_field_id\nwhere crm_layout_id = 1493;\n\nSELECT * FROM opportunities WHERE id = 4158460;\nSELECT * FROM crm_field_data WHERE object_id = 4158460;\n\nselect * from users where team_id = 1;\nSELECT * FROM users WHERE id = 7160;\nselect * from role_user where user_id = 3248;\n\nselect * from crm_field_values where crm_field_id = 66824;\n\nSELECT * FROM users WHERE id = 23470;\nselect * from crm_configurations;\n\n# ******************************************\nselect * from teams where id = 1038; # 23521, 966\nselect * from users where team_id = 1038;\nselect * from crm_configurations where id = 966;\nSELECT * FROM activities WHERE uuid_to_bin('e8dc7c34-31f6-4430-bd81-2d9d8f00dd07') = uuid; # 54965762\nSELECT * FROM activities WHERE uuid_to_bin('4b5727c0-69d1-428f-b8d9-b649055166e2') = uuid; # 54965764\nSELECT * FROM participants WHERE activity_id = 54965764;\n\nSELECT id, uuid, title, recording_state FROM activities WHERE uuid_to_bin('355f105d-5606-4379-b0c5-d91daf59f4ce') = uuid; # 54964075\nSELECT * FROM participants WHERE activity_id = 54964075;\nselect f.id, slug, title, tf.team_id from team_features tf JOIN features f on tf.feature_id = f.id\n where tf.team_id = 1038;\n\n\n# ****************************************** PD *************************\nselect * from teams where id = 1029;\nSELECT * FROM crm_configurations WHERE id = 957;\nSELECT * FROM activities WHERE uuid_to_bin('581a33cb-4343-44bd-ac0c-4a5cee71c5ec') = uuid; # 54963423\nSELECT * FROM activities WHERE uuid_to_bin('07238011-25fa-418e-838b-fb21e82b9ea2') = uuid; # 54963433\n\nSELECT * FROM activities WHERE uuid_to_bin('8b6bb2f7-e7a7-4aec-8806-fbfea7093ccd') = uuid; # 54963421\n\n# ****************************************** Close *************************\nselect * from teams where id = 1031;\nSELECT * FROM crm_configurations WHERE id = 959;\nSELECT * FROM activities WHERE uuid_to_bin('59c517e0-96c9-4dad-bfeb-b7bef72f8725') = uuid; # 54963517\n\n\nSELECT * FROM activities WHERE uuid_to_bin('07238011-25fa-418e-838b-fb21e82b9ea2') = uuid; # 54963433\n\nSELECT * FROM activities WHERE uuid_to_bin('d68311e3-ac34-49bd-bf04-88323a7e5352') = uuid; # 54966009\n\n# ****************************************** SF *************************\nSELECT * FROM activities WHERE uuid_to_bin('2bd4cfa3-4eb5-4c77-84a7-9ed46a21c988') = uuid;\n\nselect * from roles;\nselect * from permissions;\nselect * from permission_role where permission_id = 136;\n\nselect * from migrations order by id desc;\n\nselect * from teams where id IN (1, 1037);\nselect * from crm_layouts where crm_configuration_id = 1;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1493;\nSELECT * FROM crm_fields WHERE id IN (1652,1661,66799,66814,66821,66836,66843,66846,66864,84752,182306,323580,380378);\n\nselect * from features;\nselect * from team_features where feature_id = 33;\nselect * from opportunities;\n\nselect * from teams;\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 = 1052 and sa.provider = 'hubspot';\n\nSELECT * FROM accounts where id = 11512582;","depth":4,"on_screen":true,"value":"SELECT\n# DISTINCT\nopp.id as opp_id, opp.uuid, opp.name,\n# COUNT(dr.id) AS deal_risk_count,\n\n# dr.id,\n# cfd.value,\nusr.name AS owner_name,\nopp.value, opp.currency_code, opp.close_date, opp.remotely_created_at, opp.is_closed, opp.is_won,\nusr.uuid as owner_uuid,\nusr.photo_path as owner_photo,\nusr.id AS owner_id,\njt.name as owner_job,\nopp.stage_id, opp.stage_updated_at,\nacc.name AS acc_name, opp.stage_updated_at, acc.crm_provider_id AS acc_provider_id, opp.crm_provider_id AS opp_provider_id,\nrt.business_process_id AS pipeline_id\nFROM opportunities opp\nLEFT JOIN record_types rt ON opp.record_type_id = rt.id\nLEFT JOIN users usr ON opp.user_id = usr.id\nLEFT JOIN accounts acc ON opp.account_id = acc.id\nLEFT JOIN job_titles jt ON usr.job_title_id = jt.id\n\n# LEFT JOIN group_deal_risk_types gdrt ON gdrt.group_id = usr.group_id\n# LEFT JOIN deal_risks dr ON dr.opportunity_id = opp.id AND dr.group_deal_risk_type_id = gdrt.id\n\nLEFT JOIN crm_field_data cfd ON (cfd.object_id = opp.id and cfd.crm_field_id = 66814)\n\nWHERE opp.user_id IS NOT NULL\nAND opp.deleted_at IS NULL\nAND opp.is_closed = 1\nAND opp.is_won = 0\nAND opp.close_date >= '2024-01-01 00:00:00'\nAND opp.close_date <= '2024-12-31 23:59:59'\nAND usr.team_id = 1\n\n# and opp.id = 4823179\n\nGROUP BY opp.id, cfd.value\nORDER BY\n# cfd.value\n CAST(cfd.value AS UNSIGNED)\n# owner_name\n# (SELECT COUNT(dr.id)\n# FROM deal_risks dr\n# JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id\n# WHERE dr.opportunity_id = opp.id\n# AND dr.is_active = 1\n# AND gdrt.is_enabled = 1)\nDESC\nLIMIT 25\n# OFFSET 0\n;\n\nselect * from crm_fields where crm_configuration_id = 1 and object_type = 'opportunity';\nselect * from crm_layout_entities where crm_layout_id = 1493;\n\nSELECT * FROM opportunities WHERE id = 4584045;\nSELECT * FROM crm_field_data WHERE object_id = 4584045;\n\nSELECT * FROM opportunities where team_id = 1 and crm_provider_id = '0061K00000lfb9IQAQ'\n\nSELECT\n opp.id as opportunity_id,\n opp.name,\n COUNT(dr.id) as risk_count\nFROM opportunities opp\nLEFT JOIN deal_risks dr ON dr.opportunity_id = opp.id\nWHERE opp.id IN (\n 6069574,8900938,9507638,9524799,9660490,9662824,9705675,9749758,4158460,4391812,6450439,4448422,5118945,5590675,4584045,7228149,9002408,9165534,9446720,9641778,9665149,9703344,9709280,5747948,4158491,6182565,6263970,5798120,5111315,4536978,6062352,6548383,6072095,6548225,4480986,5011422,6548381,8760540,8917554,9509986,9514392,9569009,9569011,9578490,9713604,5784397,7276612,7288405,8994421,9118219,9608148,9818911,4510535,6479693,5958049,6271674,6550448,4158331,4158483,6126571,6171615,6540943,4897466,5190896,5796182,5932762,8572433,8723698,8892697,9711001,9789264,4549188,6100831,6170064,6260799,6263653,6449936,6530871,6538978,7777651,8059269,8319918,8787049,8901150,9263153,9453207,9514738,9696700,9791062,5752018,6421452,7439134,7878923,9354763,9369285,9514396,9582506,9889949,9890216,4094311,4158495,4158496,6098128,5585661,3872564,6442149,5891604,6164746,6199593,6583474,6519684,9018490,9809006,4496897,5041324,5829430,6198319,6253504,6555763,7242914,7931055,8024125,8797814,8058559,8673347,8892695,8994420,9616219,9714970,9722004,9809439,9818918,6523177,8134147,9002915,9711422,9892713,9901719,9954210,9978435,5800810,6243518,6416114,6222251,6411974,6512456,5791953,6545606,9914780,5805540,6238986,6463838,6547680,9767049,9809437,9810885,9890855,6673493,9902036,4335521,6379871,6503799,6546077,8018765,9907556,9958433,9905855,9916179,9946741,9957877,5563344,6271838,6450815,7641128,7762567,7780592,8684810,8685786,8685787,8685788\n)\nGROUP BY opp.id;\n\nSELECT COUNT(dr.id)\n FROM deal_risks dr\n JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id\n WHERE dr.opportunity_id = 5563344\n# AND gdrt.group_id = usr.group_id\n\n\n\nEXPLAIN SELECT\n opp.id as opp_id, opp.uuid, opp.name,\n\ncfd.value,\ncfv.sequence,\ncfv.value,\n# MAX(cfd.value) AS max_cfd_value,\nusr.name AS owner_name,\nopp.value, opp.currency_code, opp.close_date, opp.remotely_created_at, opp.is_closed, opp.is_won,\nusr.uuid as owner_uuid,\nusr.photo_path as owner_photo,\nusr.id AS owner_id,\njt.name as owner_job,\nopp.stage_id, opp.stage_updated_at,\nacc.name AS acc_name, opp.stage_updated_at, acc.crm_provider_id AS acc_provider_id, opp.crm_provider_id AS opp_provider_id,\nrt.business_process_id AS pipeline_id\nFROM opportunities opp\n\nLEFT JOIN record_types rt ON opp.record_type_id = rt.id\nLEFT JOIN users usr ON opp.user_id = usr.id\nLEFT JOIN accounts acc ON opp.account_id = acc.id\nLEFT JOIN job_titles jt ON usr.job_title_id = jt.id\n\nLEFT JOIN crm_field_data cfd ON cfd.id = (SELECT sub_cfd.id\n FROM crm_field_data sub_cfd\n WHERE sub_cfd.object_id = opp.id\n AND sub_cfd.crm_field_id = 66810\n ORDER BY sub_cfd.updated_at DESC\n LIMIT 1)\n\nLEFT JOIN crm_field_values cfv ON cfv.crm_field_id = 66810 AND cfv.value = cfd.value\n\nWHERE opp.user_id IS NOT NULL\nAND opp.deleted_at IS NULL\nAND opp.is_closed = 0\n# AND opp.is_closed = 1\n# AND opp.is_won = 0\nAND opp.close_date >= '2024-01-01 00:00:00'\nAND opp.close_date <= '2024-12-31 23:59:59'\nAND usr.team_id = 1\n\n# and opp.id = 4823179\n\n# GROUP BY opp.id\nORDER BY\n cfv.sequence DESC,\n# opp.name\n# owner_name\n cfd.value\n# CAST(cfd.value AS UNSIGNED)\n# CAST(MAX(cfd.value) AS UNSIGNED)\n# (SELECT COUNT(dr.id)\n# FROM deal_risks dr\n# JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id\n# WHERE dr.opportunity_id = opp.id\n# AND dr.is_active = 1 AND gdrt.is_enabled = 1)\nDESC\n# LIMIT 75, 25\n;\n\n\n\nSELECT * FROM crm_field_values WHERE crm_field_id = 66810;\n\nSELECT f.id, f.crm_provider_id AS field_name, f.label, fd.object_id AS dealId, fd.value, fd.updated_at, fd.id, fd.created_at\nFROM crm_fields f\nINNER JOIN crm_field_data fd ON fd.crm_field_id = f.id\n WHERE (f.crm_configuration_id = 1)\n AND (f.object_type = 'opportunity')\n# AND (fd.object_id IN (4158331,4158483,4158495,4158496,6069574,6263970,6171615,6540943,6545606,5829430,6198319,6263653,6548381,7242914,8797814,7228149,7439134,7878923,8134147,9002915,9118219,9165534,9354763,9369285,9446720))\n AND (fd.object_id IN (4158460))\n AND (f.crm_provider_id IN ('ForecastCategoryName'))\n ORDER BY fd.object_id ASC, fd.updated_at DESC;\n\nselect * from crm_layouts where crm_configuration_id = 1;\nselect cf.* from crm_fields cf\njoin crm_layout_entities cle on cf.id = cle.crm_field_id\nwhere crm_layout_id = 1493;\n\nSELECT * FROM opportunities WHERE id = 4158460;\nSELECT * FROM crm_field_data WHERE object_id = 4158460;\n\nselect * from users where team_id = 1;\nSELECT * FROM users WHERE id = 7160;\nselect * from role_user where user_id = 3248;\n\nselect * from crm_field_values where crm_field_id = 66824;\n\nSELECT * FROM users WHERE id = 23470;\nselect * from crm_configurations;\n\n# ******************************************\nselect * from teams where id = 1038; # 23521, 966\nselect * from users where team_id = 1038;\nselect * from crm_configurations where id = 966;\nSELECT * FROM activities WHERE uuid_to_bin('e8dc7c34-31f6-4430-bd81-2d9d8f00dd07') = uuid; # 54965762\nSELECT * FROM activities WHERE uuid_to_bin('4b5727c0-69d1-428f-b8d9-b649055166e2') = uuid; # 54965764\nSELECT * FROM participants WHERE activity_id = 54965764;\n\nSELECT id, uuid, title, recording_state FROM activities WHERE uuid_to_bin('355f105d-5606-4379-b0c5-d91daf59f4ce') = uuid; # 54964075\nSELECT * FROM participants WHERE activity_id = 54964075;\nselect f.id, slug, title, tf.team_id from team_features tf JOIN features f on tf.feature_id = f.id\n where tf.team_id = 1038;\n\n\n# ****************************************** PD *************************\nselect * from teams where id = 1029;\nSELECT * FROM crm_configurations WHERE id = 957;\nSELECT * FROM activities WHERE uuid_to_bin('581a33cb-4343-44bd-ac0c-4a5cee71c5ec') = uuid; # 54963423\nSELECT * FROM activities WHERE uuid_to_bin('07238011-25fa-418e-838b-fb21e82b9ea2') = uuid; # 54963433\n\nSELECT * FROM activities WHERE uuid_to_bin('8b6bb2f7-e7a7-4aec-8806-fbfea7093ccd') = uuid; # 54963421\n\n# ****************************************** Close *************************\nselect * from teams where id = 1031;\nSELECT * FROM crm_configurations WHERE id = 959;\nSELECT * FROM activities WHERE uuid_to_bin('59c517e0-96c9-4dad-bfeb-b7bef72f8725') = uuid; # 54963517\n\n\nSELECT * FROM activities WHERE uuid_to_bin('07238011-25fa-418e-838b-fb21e82b9ea2') = uuid; # 54963433\n\nSELECT * FROM activities WHERE uuid_to_bin('d68311e3-ac34-49bd-bf04-88323a7e5352') = uuid; # 54966009\n\n# ****************************************** SF *************************\nSELECT * FROM activities WHERE uuid_to_bin('2bd4cfa3-4eb5-4c77-84a7-9ed46a21c988') = uuid;\n\nselect * from roles;\nselect * from permissions;\nselect * from permission_role where permission_id = 136;\n\nselect * from migrations order by id desc;\n\nselect * from teams where id IN (1, 1037);\nselect * from crm_layouts where crm_configuration_id = 1;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1493;\nSELECT * FROM crm_fields WHERE id IN (1652,1661,66799,66814,66821,66836,66843,66846,66864,84752,182306,323580,380378);\n\nselect * from features;\nselect * from team_features where feature_id = 33;\nselect * from opportunities;\n\nselect * from teams;\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 = 1052 and sa.provider = 'hubspot';\n\nSELECT * FROM accounts where id = 11512582;","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Project","depth":3,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Project","depth":3,"bounds":{"left":0.025,"top":0.06666667,"width":0.050694443,"height":0.034444444},"on_screen":true,"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},"on_screen":false,"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},"on_screen":false,"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},"on_screen":false,"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},"on_screen":false,"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},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
-3428666155218272246
|
6398094028691354589
|
click
|
accessibility
|
NULL
|
Project: faVsco.js, menu
#12066 on JY-20725-handle Project: faVsco.js, menu
#12066 on JY-20725-handle-HS-search-rate-limit, menu
Start Listening for PHP Debug Connections
HandleHubspotRateLimitTest
Run 'HandleHubspotRateLimitTest'
Debug 'HandleHubspotRateLimitTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
7
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Http\Controllers\Webhook\IntegrationAppSubscriptions;
use Illuminate\Http\JsonResponse;
use Jiminny\Contracts\Crm\Providers;
use Jiminny\Models\Team;
use Jiminny\Services\Crm\IntegrationApp\Service;
use Jiminny\Services\Crm\ProviderRegistry;
trait IntegrationAppTrait
{
abstract protected function getTeamFromRequest(): ?Team;
abstract protected function extractPayload(): array;
private function getPayload(): array
{
$payload = $this->extractPayload();
$this->logger->info('[integration-app] Event received', [
'payload' => $payload,
]);
return $payload;
}
private function extractTargetIdFromPayload(string $targetId): ?string
{
$payload = $this->getPayload();
return $payload[$targetId] ?? null;
}
private function extractTargetObjectIdsFromPayload(string $targetKey): array
{
$payload = $this->getPayload();
$objects = $payload[$targetKey] ?? [];
if (! is_array($objects) || empty($objects)) {
return [];
}
return array_values(array_filter(array_map(
static fn ($object) => is_array($object) ? ($object['id'] ?? null) : null,
$objects
)));
}
private function bootstrapIntegrationApp(Team $team): ?Service
{
$crmProvider = app(ProviderRegistry::class);
$providerName = $team->getCrmConfiguration()->getProviderName();
if (! Providers::isIntegrationAppProvider($providerName)) {
return null;
}
/** @var Service $integrationApp */
$integrationApp = $crmProvider->get($providerName);
$integrationApp->setUser($team->getOwner());
return $integrationApp;
}
private function getTargetCrmProviderId(string $targetKey, string $eventName): ?string
{
$targetId = $this->extractTargetIdFromPayload($targetKey);
$this->logger->info("[integration-app] Event: {$eventName}", [
'targetId' => $targetId,
'targetKey' => $targetKey,
]);
return $targetId;
}
private function getTargetCrmProviderObjectsIds(string $targetKey, string $eventName): array
{
$targetIds = $this->extractTargetObjectIdsFromPayload($targetKey);
$this->logger->info("[integration-app] Event: $eventName", [
'targetIds' => $targetIds,
'targetKey' => $targetKey,
'count' => count($targetIds),
]);
return $targetIds;
}
protected function handleBulkDeletion(string $targetKey, string $fallbackKey, string $eventName): JsonResponse
{
$team = $this->getTeamFromRequest();
if ($team === null) {
return new JsonResponse([], JsonResponse::HTTP_NO_CONTENT);
}
$targetIds = $this->getTargetCrmProviderObjectsIds(targetKey: $targetKey, eventName: $eventName);
if (empty($targetIds)) {
$this->logger->warning('No target IDs found for ' . $eventName);
// fallback to single target ID
$targetId = $this->getTargetCrmProviderId(targetKey: $fallbackKey, eventName: $eventName);
if ($targetId !== null) {
$targetIds[] = $targetId;
}
}
if (empty($targetIds)) {
$this->logger->warning('No target IDs found alter fallback for ' . $eventName);
return new JsonResponse([], JsonResponse::HTTP_BAD_REQUEST);
}
foreach ($targetIds as $targetId) {
$this->deleteTarget(team: $team, targetId: (string) $targetId);
}
return new JsonResponse([], JsonResponse::HTTP_OK);
}
abstract protected function deleteTarget(Team $team, string $targetId): void;
}
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
8
1
3
4
Previous Highlighted Error
Next Highlighted Error
SELECT
# DISTINCT
opp.id as opp_id, opp.uuid, opp.name,
# COUNT(dr.id) AS deal_risk_count,
# dr.id,
# cfd.value,
usr.name AS owner_name,
opp.value, opp.currency_code, opp.close_date, opp.remotely_created_at, opp.is_closed, opp.is_won,
usr.uuid as owner_uuid,
usr.photo_path as owner_photo,
usr.id AS owner_id,
jt.name as owner_job,
opp.stage_id, opp.stage_updated_at,
acc.name AS acc_name, opp.stage_updated_at, acc.crm_provider_id AS acc_provider_id, opp.crm_provider_id AS opp_provider_id,
rt.business_process_id AS pipeline_id
FROM opportunities opp
LEFT JOIN record_types rt ON opp.record_type_id = rt.id
LEFT JOIN users usr ON opp.user_id = usr.id
LEFT JOIN accounts acc ON opp.account_id = acc.id
LEFT JOIN job_titles jt ON usr.job_title_id = jt.id
# LEFT JOIN group_deal_risk_types gdrt ON gdrt.group_id = usr.group_id
# LEFT JOIN deal_risks dr ON dr.opportunity_id = opp.id AND dr.group_deal_risk_type_id = gdrt.id
LEFT JOIN crm_field_data cfd ON (cfd.object_id = opp.id and cfd.crm_field_id = 66814)
WHERE opp.user_id IS NOT NULL
AND opp.deleted_at IS NULL
AND opp.is_closed = 1
AND opp.is_won = 0
AND opp.close_date >= '2024-01-01 00:00:00'
AND opp.close_date <= '2024-12-31 23:59:59'
AND usr.team_id = 1
# and opp.id = 4823179
GROUP BY opp.id, cfd.value
ORDER BY
# cfd.value
CAST(cfd.value AS UNSIGNED)
# owner_name
# (SELECT COUNT(dr.id)
# FROM deal_risks dr
# JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id
# WHERE dr.opportunity_id = opp.id
# AND dr.is_active = 1
# AND gdrt.is_enabled = 1)
DESC
LIMIT 25
# OFFSET 0
;
select * from crm_fields where crm_configuration_id = 1 and object_type = 'opportunity';
select * from crm_layout_entities where crm_layout_id = 1493;
SELECT * FROM opportunities WHERE id = 4584045;
SELECT * FROM crm_field_data WHERE object_id = 4584045;
SELECT * FROM opportunities where team_id = 1 and crm_provider_id = '0061K00000lfb9IQAQ'
SELECT
opp.id as opportunity_id,
opp.name,
COUNT(dr.id) as risk_count
FROM opportunities opp
LEFT JOIN deal_risks dr ON dr.opportunity_id = opp.id
WHERE opp.id IN (
6069574,8900938,9507638,9524799,9660490,9662824,9705675,9749758,4158460,4391812,6450439,4448422,5118945,5590675,4584045,7228149,9002408,9165534,9446720,9641778,9665149,9703344,9709280,5747948,4158491,6182565,6263970,5798120,5111315,4536978,6062352,6548383,6072095,6548225,4480986,5011422,6548381,8760540,8917554,9509986,9514392,9569009,9569011,9578490,9713604,5784397,7276612,7288405,8994421,9118219,9608148,9818911,4510535,6479693,5958049,6271674,6550448,4158331,4158483,6126571,6171615,6540943,4897466,5190896,5796182,5932762,8572433,8723698,8892697,9711001,9789264,4549188,6100831,6170064,6260799,6263653,6449936,6530871,6538978,7777651,8059269,8319918,8787049,8901150,9263153,9453207,9514738,9696700,9791062,5752018,6421452,7439134,7878923,9354763,9369285,9514396,9582506,9889949,9890216,4094311,4158495,4158496,6098128,5585661,3872564,6442149,5891604,6164746,6199593,6583474,6519684,9018490,9809006,4496897,5041324,5829430,6198319,6253504,6555763,7242914,7931055,8024125,8797814,8058559,8673347,8892695,8994420,9616219,9714970,9722004,9809439,9818918,6523177,8134147,9002915,9711422,9892713,9901719,9954210,9978435,5800810,6243518,6416114,6222251,6411974,6512456,5791953,6545606,9914780,5805540,6238986,6463838,6547680,9767049,9809437,9810885,9890855,6673493,9902036,4335521,6379871,6503799,6546077,8018765,9907556,9958433,9905855,9916179,9946741,9957877,5563344,6271838,6450815,7641128,7762567,7780592,8684810,8685786,8685787,8685788
)
GROUP BY opp.id;
SELECT COUNT(dr.id)
FROM deal_risks dr
JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id
WHERE dr.opportunity_id = 5563344
# AND gdrt.group_id = usr.group_id
EXPLAIN SELECT
opp.id as opp_id, opp.uuid, opp.name,
cfd.value,
cfv.sequence,
cfv.value,
# MAX(cfd.value) AS max_cfd_value,
usr.name AS owner_name,
opp.value, opp.currency_code, opp.close_date, opp.remotely_created_at, opp.is_closed, opp.is_won,
usr.uuid as owner_uuid,
usr.photo_path as owner_photo,
usr.id AS owner_id,
jt.name as owner_job,
opp.stage_id, opp.stage_updated_at,
acc.name AS acc_name, opp.stage_updated_at, acc.crm_provider_id AS acc_provider_id, opp.crm_provider_id AS opp_provider_id,
rt.business_process_id AS pipeline_id
FROM opportunities opp
LEFT JOIN record_types rt ON opp.record_type_id = rt.id
LEFT JOIN users usr ON opp.user_id = usr.id
LEFT JOIN accounts acc ON opp.account_id = acc.id
LEFT JOIN job_titles jt ON usr.job_title_id = jt.id
LEFT JOIN crm_field_data cfd ON cfd.id = (SELECT sub_cfd.id
FROM crm_field_data sub_cfd
WHERE sub_cfd.object_id = opp.id
AND sub_cfd.crm_field_id = 66810
ORDER BY sub_cfd.updated_at DESC
LIMIT 1)
LEFT JOIN crm_field_values cfv ON cfv.crm_field_id = 66810 AND cfv.value = cfd.value
WHERE opp.user_id IS NOT NULL
AND opp.deleted_at IS NULL
AND opp.is_closed = 0
# AND opp.is_closed = 1
# AND opp.is_won = 0
AND opp.close_date >= '2024-01-01 00:00:00'
AND opp.close_date <= '2024-12-31 23:59:59'
AND usr.team_id = 1
# and opp.id = 4823179
# GROUP BY opp.id
ORDER BY
cfv.sequence DESC,
# opp.name
# owner_name
cfd.value
# CAST(cfd.value AS UNSIGNED)
# CAST(MAX(cfd.value) AS UNSIGNED)
# (SELECT COUNT(dr.id)
# FROM deal_risks dr
# JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id
# WHERE dr.opportunity_id = opp.id
# AND dr.is_active = 1 AND gdrt.is_enabled = 1)
DESC
# LIMIT 75, 25
;
SELECT * FROM crm_field_values WHERE crm_field_id = 66810;
SELECT f.id, f.crm_provider_id AS field_name, f.label, fd.object_id AS dealId, fd.value, fd.updated_at, fd.id, fd.created_at
FROM crm_fields f
INNER JOIN crm_field_data fd ON fd.crm_field_id = f.id
WHERE (f.crm_configuration_id = 1)
AND (f.object_type = 'opportunity')
# AND (fd.object_id IN (4158331,4158483,4158495,4158496,6069574,6263970,6171615,6540943,6545606,5829430,6198319,6263653,6548381,7242914,8797814,7228149,7439134,7878923,8134147,9002915,9118219,9165534,9354763,9369285,9446720))
AND (fd.object_id IN (4158460))
AND (f.crm_provider_id IN ('ForecastCategoryName'))
ORDER BY fd.object_id ASC, fd.updated_at DESC;
select * from crm_layouts where crm_configuration_id = 1;
select cf.* from crm_fields cf
join crm_layout_entities cle on cf.id = cle.crm_field_id
where crm_layout_id = 1493;
SELECT * FROM opportunities WHERE id = 4158460;
SELECT * FROM crm_field_data WHERE object_id = 4158460;
select * from users where team_id = 1;
SELECT * FROM users WHERE id = 7160;
select * from role_user where user_id = 3248;
select * from crm_field_values where crm_field_id = 66824;
SELECT * FROM users WHERE id = 23470;
select * from crm_configurations;
# [PASSWORD_DOTS]
select * from teams where id = 1038; # 23521, 966
select * from users where team_id = 1038;
select * from crm_configurations where id = 966;
SELECT * FROM activities WHERE uuid_to_bin('e8dc7c34-31f6-4430-bd81-2d9d8f00dd07') = uuid; # 54965762
SELECT * FROM activities WHERE uuid_to_bin('4b5727c0-69d1-428f-b8d9-b649055166e2') = uuid; # 54965764
SELECT * FROM participants WHERE activity_id = 54965764;
SELECT id, uuid, title, recording_state FROM activities WHERE uuid_to_bin('355f105d-5606-4379-b0c5-d91daf59f4ce') = uuid; # 54964075
SELECT * FROM participants WHERE activity_id = 54964075;
select f.id, slug, title, tf.team_id from team_features tf JOIN features f on tf.feature_id = f.id
where tf.team_id = 1038;
# [PASSWORD_DOTS] PD [PASSWORD_DOTS]
select * from teams where id = 1029;
SELECT * FROM crm_configurations WHERE id = 957;
SELECT * FROM activities WHERE uuid_to_bin('581a33cb-4343-44bd-ac0c-4a5cee71c5ec') = uuid; # 54963423
SELECT * FROM activities WHERE uuid_to_bin('07238011-25fa-418e-838b-fb21e82b9ea2') = uuid; # 54963433
SELECT * FROM activities WHERE uuid_to_bin('8b6bb2f7-e7a7-4aec-8806-fbfea7093ccd') = uuid; # 54963421
# [PASSWORD_DOTS] Close [PASSWORD_DOTS]
select * from teams where id = 1031;
SELECT * FROM crm_configurations WHERE id = 959;
SELECT * FROM activities WHERE uuid_to_bin('59c517e0-96c9-4dad-bfeb-b7bef72f8725') = uuid; # 54963517
SELECT * FROM activities WHERE uuid_to_bin('07238011-25fa-418e-838b-fb21e82b9ea2') = uuid; # 54963433
SELECT * FROM activities WHERE uuid_to_bin('d68311e3-ac34-49bd-bf04-88323a7e5352') = uuid; # 54966009
# [PASSWORD_DOTS] SF [PASSWORD_DOTS]
SELECT * FROM activities WHERE uuid_to_bin('2bd4cfa3-4eb5-4c77-84a7-9ed46a21c988') = uuid;
select * from roles;
select * from permissions;
select * from permission_role where permission_id = 136;
select * from migrations order by id desc;
select * from teams where id IN (1, 1037);
select * from crm_layouts where crm_configuration_id = 1;
SELECT * FROM crm_layout_entities WHERE crm_layout_id = 1493;
SELECT * FROM crm_fields WHERE id IN (1652,1661,66799,66814,66821,66836,66843,66846,66864,84752,182306,323580,380378);
select * from features;
select * from team_features where feature_id = 33;
select * from opportunities;
select * from teams;
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 = 1052 and sa.provider = 'hubspot';
SELECT * FROM accounts where id = 11512582;
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
44540
|
1610
|
39
|
2026-05-14T13:53:11.484463+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-14/1778 /Users/lukas/.screenpipe/data/data/2026-05-14/1778766791484_m2.jpg...
|
PhpStorm
|
faVsco.js – IntegrationAppTrait.php
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
#12066 on JY-20725-handle Project: faVsco.js, menu
#12066 on JY-20725-handle-HS-search-rate-limit, menu
Start Listening for PHP Debug Connections
HandleHubspotRateLimitTest
Run 'HandleHubspotRateLimitTest'
Debug 'HandleHubspotRateLimitTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
7
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Http\Controllers\Webhook\IntegrationAppSubscriptions;
use Illuminate\Http\JsonResponse;
use Jiminny\Contracts\Crm\Providers;
use Jiminny\Models\Team;
use Jiminny\Services\Crm\IntegrationApp\Service;
use Jiminny\Services\Crm\ProviderRegistry;
trait IntegrationAppTrait
{
abstract protected function getTeamFromRequest(): ?Team;
abstract protected function extractPayload(): array;
private function getPayload(): array
{
$payload = $this->extractPayload();
$this->logger->info('[integration-app] Event received', [
'payload' => $payload,
]);
return $payload;
}
private function extractTargetIdFromPayload(string $targetId): ?string
{
$payload = $this->getPayload();
return $payload[$targetId] ?? null;
}
private function extractTargetObjectIdsFromPayload(string $targetKey): array
{
$payload = $this->getPayload();
$objects = $payload[$targetKey] ?? [];
if (! is_array($objects) || empty($objects)) {
return [];
}
return array_values(array_filter(array_map(
static fn ($object) => is_array($object) ? ($object['id'] ?? null) : null,
$objects
)));
}
private function bootstrapIntegrationApp(Team $team): ?Service
{
$crmProvider = app(ProviderRegistry::class);
$providerName = $team->getCrmConfiguration()->getProviderName();
if (! Providers::isIntegrationAppProvider($providerName)) {
return null;
}
/** @var Service $integrationApp */
$integrationApp = $crmProvider->get($providerName);
$integrationApp->setUser($team->getOwner());
return $integrationApp;
}
private function getTargetCrmProviderId(string $targetKey, string $eventName): ?string
{
$targetId = $this->extractTargetIdFromPayload($targetKey);
$this->logger->info("[integration-app] Event: {$eventName}", [
'targetId' => $targetId,
'targetKey' => $targetKey,
]);
return $targetId;
}
private function getTargetCrmProviderObjectsIds(string $targetKey, string $eventName): array
{
$targetIds = $this->extractTargetObjectIdsFromPayload($targetKey);
$this->logger->info("[integration-app] Event: $eventName", [
'targetIds' => $targetIds,
'targetKey' => $targetKey,
'count' => count($targetIds),
]);
return $targetIds;
}
protected function handleBulkDeletion(string $targetKey, string $fallbackKey, string $eventName): JsonResponse
{
$team = $this->getTeamFromRequest();
if ($team === null) {
return new JsonResponse([], JsonResponse::HTTP_NO_CONTENT);
}
$targetIds = $this->getTargetCrmProviderObjectsIds(targetKey: $targetKey, eventName: $eventName);
if (empty($targetIds)) {
$this->logger->warning('No target IDs found for ' . $eventName);
// fallback to single target ID
$targetId = $this->getTargetCrmProviderId(targetKey: $fallbackKey, eventName: $eventName);
if ($targetId !== null) {
$targetIds[] = $targetId;
}
}
if (empty($targetIds)) {
$this->logger->warning('No target IDs found alter fallback for ' . $eventName);
return new JsonResponse([], JsonResponse::HTTP_BAD_REQUEST);
}
foreach ($targetIds as $targetId) {
$this->deleteTarget(team: $team, targetId: (string) $targetId);
}
return new JsonResponse([], JsonResponse::HTTP_OK);
}
abstract protected function deleteTarget(Team $team, string $targetId): void;
}
Execute
Explain Plan
Browse Query History
View Parameters
Open Query Execution Settings…
In-Editor Results
Tx: Auto...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"bounds":{"left":0.2962101,"top":1.0,"width":0.03856383,"height":-0.019952059},"on_screen":true,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"#12066 on JY-20725-handle-HS-search-rate-limit, menu","depth":5,"bounds":{"left":0.33477393,"top":1.0,"width":0.122340426,"height":-0.019952059},"on_screen":true,"help_text":"Pull request #12066 exists for current branch JY-20725-handle-HS-search-rate-limit, but local branch is out of sync with remote","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"bounds":{"left":0.5731383,"top":1.0,"width":0.011303191,"height":-0.019952059},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"HandleHubspotRateLimitTest","depth":6,"bounds":{"left":0.5884308,"top":1.0,"width":0.076130316,"height":-0.019952059},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run 'HandleHubspotRateLimitTest'","depth":6,"bounds":{"left":0.66456115,"top":1.0,"width":0.011303191,"height":-0.019952059},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'HandleHubspotRateLimitTest'","depth":6,"bounds":{"left":0.67586434,"top":1.0,"width":0.011303191,"height":-0.019952059},"on_screen":true,"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.6871675,"top":1.0,"width":0.011303191,"height":-0.019952059},"on_screen":true,"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.7150931,"top":1.0,"width":0.011303191,"height":-0.019952059},"on_screen":true,"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.72639626,"top":1.0,"width":0.011303191,"height":-0.019952059},"on_screen":true,"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.73769945,"top":1.0,"width":0.011303191,"height":-0.019952059},"on_screen":true,"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},"on_screen":false,"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},"on_screen":false,"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},"on_screen":false,"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},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"7","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"on_screen":true,"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\\Webhook\\IntegrationAppSubscriptions;\n\nuse Illuminate\\Http\\JsonResponse;\nuse Jiminny\\Contracts\\Crm\\Providers;\nuse Jiminny\\Models\\Team;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\Service;\nuse Jiminny\\Services\\Crm\\ProviderRegistry;\n\ntrait IntegrationAppTrait\n{\n abstract protected function getTeamFromRequest(): ?Team;\n\n abstract protected function extractPayload(): array;\n\n private function getPayload(): array\n {\n $payload = $this->extractPayload();\n $this->logger->info('[integration-app] Event received', [\n 'payload' => $payload,\n ]);\n\n return $payload;\n }\n\n private function extractTargetIdFromPayload(string $targetId): ?string\n {\n $payload = $this->getPayload();\n\n return $payload[$targetId] ?? null;\n }\n\n private function extractTargetObjectIdsFromPayload(string $targetKey): array\n {\n $payload = $this->getPayload();\n\n $objects = $payload[$targetKey] ?? [];\n\n if (! is_array($objects) || empty($objects)) {\n return [];\n }\n\n return array_values(array_filter(array_map(\n static fn ($object) => is_array($object) ? ($object['id'] ?? null) : null,\n $objects\n )));\n }\n\n private function bootstrapIntegrationApp(Team $team): ?Service\n {\n $crmProvider = app(ProviderRegistry::class);\n\n $providerName = $team->getCrmConfiguration()->getProviderName();\n if (! Providers::isIntegrationAppProvider($providerName)) {\n return null;\n }\n\n /** @var Service $integrationApp */\n $integrationApp = $crmProvider->get($providerName);\n $integrationApp->setUser($team->getOwner());\n\n return $integrationApp;\n }\n\n private function getTargetCrmProviderId(string $targetKey, string $eventName): ?string\n {\n $targetId = $this->extractTargetIdFromPayload($targetKey);\n $this->logger->info(\"[integration-app] Event: {$eventName}\", [\n 'targetId' => $targetId,\n 'targetKey' => $targetKey,\n ]);\n\n return $targetId;\n }\n\n private function getTargetCrmProviderObjectsIds(string $targetKey, string $eventName): array\n {\n $targetIds = $this->extractTargetObjectIdsFromPayload($targetKey);\n $this->logger->info(\"[integration-app] Event: $eventName\", [\n 'targetIds' => $targetIds,\n 'targetKey' => $targetKey,\n 'count' => count($targetIds),\n ]);\n\n return $targetIds;\n }\n\n protected function handleBulkDeletion(string $targetKey, string $fallbackKey, string $eventName): JsonResponse\n {\n $team = $this->getTeamFromRequest();\n\n if ($team === null) {\n return new JsonResponse([], JsonResponse::HTTP_NO_CONTENT);\n }\n\n $targetIds = $this->getTargetCrmProviderObjectsIds(targetKey: $targetKey, eventName: $eventName);\n\n if (empty($targetIds)) {\n $this->logger->warning('No target IDs found for ' . $eventName);\n\n // fallback to single target ID\n $targetId = $this->getTargetCrmProviderId(targetKey: $fallbackKey, eventName: $eventName);\n\n if ($targetId !== null) {\n $targetIds[] = $targetId;\n }\n }\n\n if (empty($targetIds)) {\n $this->logger->warning('No target IDs found alter fallback for ' . $eventName);\n\n return new JsonResponse([], JsonResponse::HTTP_BAD_REQUEST);\n }\n\n foreach ($targetIds as $targetId) {\n $this->deleteTarget(team: $team, targetId: (string) $targetId);\n }\n\n return new JsonResponse([], JsonResponse::HTTP_OK);\n }\n\n abstract protected function deleteTarget(Team $team, string $targetId): void;\n}","depth":4,"bounds":{"left":0.39261967,"top":0.3463687,"width":0.30319148,"height":0.6536313},"on_screen":true,"value":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Http\\Controllers\\Webhook\\IntegrationAppSubscriptions;\n\nuse Illuminate\\Http\\JsonResponse;\nuse Jiminny\\Contracts\\Crm\\Providers;\nuse Jiminny\\Models\\Team;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\Service;\nuse Jiminny\\Services\\Crm\\ProviderRegistry;\n\ntrait IntegrationAppTrait\n{\n abstract protected function getTeamFromRequest(): ?Team;\n\n abstract protected function extractPayload(): array;\n\n private function getPayload(): array\n {\n $payload = $this->extractPayload();\n $this->logger->info('[integration-app] Event received', [\n 'payload' => $payload,\n ]);\n\n return $payload;\n }\n\n private function extractTargetIdFromPayload(string $targetId): ?string\n {\n $payload = $this->getPayload();\n\n return $payload[$targetId] ?? null;\n }\n\n private function extractTargetObjectIdsFromPayload(string $targetKey): array\n {\n $payload = $this->getPayload();\n\n $objects = $payload[$targetKey] ?? [];\n\n if (! is_array($objects) || empty($objects)) {\n return [];\n }\n\n return array_values(array_filter(array_map(\n static fn ($object) => is_array($object) ? ($object['id'] ?? null) : null,\n $objects\n )));\n }\n\n private function bootstrapIntegrationApp(Team $team): ?Service\n {\n $crmProvider = app(ProviderRegistry::class);\n\n $providerName = $team->getCrmConfiguration()->getProviderName();\n if (! Providers::isIntegrationAppProvider($providerName)) {\n return null;\n }\n\n /** @var Service $integrationApp */\n $integrationApp = $crmProvider->get($providerName);\n $integrationApp->setUser($team->getOwner());\n\n return $integrationApp;\n }\n\n private function getTargetCrmProviderId(string $targetKey, string $eventName): ?string\n {\n $targetId = $this->extractTargetIdFromPayload($targetKey);\n $this->logger->info(\"[integration-app] Event: {$eventName}\", [\n 'targetId' => $targetId,\n 'targetKey' => $targetKey,\n ]);\n\n return $targetId;\n }\n\n private function getTargetCrmProviderObjectsIds(string $targetKey, string $eventName): array\n {\n $targetIds = $this->extractTargetObjectIdsFromPayload($targetKey);\n $this->logger->info(\"[integration-app] Event: $eventName\", [\n 'targetIds' => $targetIds,\n 'targetKey' => $targetKey,\n 'count' => count($targetIds),\n ]);\n\n return $targetIds;\n }\n\n protected function handleBulkDeletion(string $targetKey, string $fallbackKey, string $eventName): JsonResponse\n {\n $team = $this->getTeamFromRequest();\n\n if ($team === null) {\n return new JsonResponse([], JsonResponse::HTTP_NO_CONTENT);\n }\n\n $targetIds = $this->getTargetCrmProviderObjectsIds(targetKey: $targetKey, eventName: $eventName);\n\n if (empty($targetIds)) {\n $this->logger->warning('No target IDs found for ' . $eventName);\n\n // fallback to single target ID\n $targetId = $this->getTargetCrmProviderId(targetKey: $fallbackKey, eventName: $eventName);\n\n if ($targetId !== null) {\n $targetIds[] = $targetId;\n }\n }\n\n if (empty($targetIds)) {\n $this->logger->warning('No target IDs found alter fallback for ' . $eventName);\n\n return new JsonResponse([], JsonResponse::HTTP_BAD_REQUEST);\n }\n\n foreach ($targetIds as $targetId) {\n $this->deleteTarget(team: $team, targetId: (string) $targetId);\n }\n\n return new JsonResponse([], JsonResponse::HTTP_OK);\n }\n\n abstract protected function deleteTarget(Team $team, string $targetId): void;\n}","role_description":"text entry area","is_enabled":true,"is_focused":true,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Execute","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Explain Plan","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Browse Query History","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"View Parameters","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Open Query Execution Settings…","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"In-Editor Results","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Tx: Auto","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
-6800857405830661483
|
-8598277101076242022
|
click
|
accessibility
|
NULL
|
Project: faVsco.js, menu
#12066 on JY-20725-handle Project: faVsco.js, menu
#12066 on JY-20725-handle-HS-search-rate-limit, menu
Start Listening for PHP Debug Connections
HandleHubspotRateLimitTest
Run 'HandleHubspotRateLimitTest'
Debug 'HandleHubspotRateLimitTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
7
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Http\Controllers\Webhook\IntegrationAppSubscriptions;
use Illuminate\Http\JsonResponse;
use Jiminny\Contracts\Crm\Providers;
use Jiminny\Models\Team;
use Jiminny\Services\Crm\IntegrationApp\Service;
use Jiminny\Services\Crm\ProviderRegistry;
trait IntegrationAppTrait
{
abstract protected function getTeamFromRequest(): ?Team;
abstract protected function extractPayload(): array;
private function getPayload(): array
{
$payload = $this->extractPayload();
$this->logger->info('[integration-app] Event received', [
'payload' => $payload,
]);
return $payload;
}
private function extractTargetIdFromPayload(string $targetId): ?string
{
$payload = $this->getPayload();
return $payload[$targetId] ?? null;
}
private function extractTargetObjectIdsFromPayload(string $targetKey): array
{
$payload = $this->getPayload();
$objects = $payload[$targetKey] ?? [];
if (! is_array($objects) || empty($objects)) {
return [];
}
return array_values(array_filter(array_map(
static fn ($object) => is_array($object) ? ($object['id'] ?? null) : null,
$objects
)));
}
private function bootstrapIntegrationApp(Team $team): ?Service
{
$crmProvider = app(ProviderRegistry::class);
$providerName = $team->getCrmConfiguration()->getProviderName();
if (! Providers::isIntegrationAppProvider($providerName)) {
return null;
}
/** @var Service $integrationApp */
$integrationApp = $crmProvider->get($providerName);
$integrationApp->setUser($team->getOwner());
return $integrationApp;
}
private function getTargetCrmProviderId(string $targetKey, string $eventName): ?string
{
$targetId = $this->extractTargetIdFromPayload($targetKey);
$this->logger->info("[integration-app] Event: {$eventName}", [
'targetId' => $targetId,
'targetKey' => $targetKey,
]);
return $targetId;
}
private function getTargetCrmProviderObjectsIds(string $targetKey, string $eventName): array
{
$targetIds = $this->extractTargetObjectIdsFromPayload($targetKey);
$this->logger->info("[integration-app] Event: $eventName", [
'targetIds' => $targetIds,
'targetKey' => $targetKey,
'count' => count($targetIds),
]);
return $targetIds;
}
protected function handleBulkDeletion(string $targetKey, string $fallbackKey, string $eventName): JsonResponse
{
$team = $this->getTeamFromRequest();
if ($team === null) {
return new JsonResponse([], JsonResponse::HTTP_NO_CONTENT);
}
$targetIds = $this->getTargetCrmProviderObjectsIds(targetKey: $targetKey, eventName: $eventName);
if (empty($targetIds)) {
$this->logger->warning('No target IDs found for ' . $eventName);
// fallback to single target ID
$targetId = $this->getTargetCrmProviderId(targetKey: $fallbackKey, eventName: $eventName);
if ($targetId !== null) {
$targetIds[] = $targetId;
}
}
if (empty($targetIds)) {
$this->logger->warning('No target IDs found alter fallback for ' . $eventName);
return new JsonResponse([], JsonResponse::HTTP_BAD_REQUEST);
}
foreach ($targetIds as $targetId) {
$this->deleteTarget(team: $team, targetId: (string) $targetId);
}
return new JsonResponse([], JsonResponse::HTTP_OK);
}
abstract protected function deleteTarget(Team $team, string $targetId): void;
}
Execute
Explain Plan
Browse Query History
View Parameters
Open Query Execution Settings…
In-Editor Results
Tx: Auto...
|
44538
|
NULL
|
NULL
|
NULL
|
|
44508
|
1610
|
26
|
2026-05-14T13:52:09.501280+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-14/1778 /Users/lukas/.screenpipe/data/data/2026-05-14/1778766729501_m2.jpg...
|
PhpStorm
|
faVsco.js – IntegrationAppTrait.php
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Jiminny...vActivityFilesLater@ jiminny-x-integrati Jiminny...vActivityFilesLater@ jiminny-x-integrati….• plattorm-inner-teamE Channels# ai-chapter# alertsi backend# bugscontusion-cllnia# curiosity lab# engineering# general#jiminny-bgac nlattorm-nckets# product launches# random# releases# sofia-officed sunport# thank-yous# the people of iimi... Direct messages• e 02P. Galya Dimitrovavasil VasilevStefka StoyanovaSg: Todor StamatovMario GeorgieyNiudlay lanay. James Graham "* Stoyan Tanevad Stelivan Georgiev( Petko Kashinski*. Lukas Kovali...::: AnnsToastS lira Gloud6d Huddle with Aneliva AngelovaQ Describe what you are looking for* Aneliya Angelova &• MessagesAdd canvasur FilesTuesdav. April 28thvMonday, May 11thAneliva Angelova 1:24 PMIЛукаш за Huюsлог за синковете вече се изполава тази команла нали?Lukas Kovalik 1:32 PMла коон я пуска поез 5 минAneliya Angelova v 2:30 PMЛукаш, само при Сейлсфорс и Хубспот се синкваха активити типовете, когато се направи плейбук,Hanи?при останалите CRMi трябва рьчно да се въведатLukas Kovalik M 2:47 PNзлрастиами не знам по принцип се вика при всичкитрябва да се за всички, някъле не се ли полълвапри зохо маи оеше nагасоdеа но маи и там си връшаха две категодииAneliya Angelova 4:00 PMЛукаш имаш ли време да се чуем за тестването на https://iiminny.atlassian.net/browse/JY-20725Jira CloudX Busb5-20125 in im locRHubsoot Oonmise CRM rematching on delete nubsoot ac...StatusReady for OA= MediumAA Aneliva AngelovaAs of today at 4:00 PMIOpen in JiraSummariseLukas Kovalik 4:02 PMVou idined the huddle (LIVE 4.04 DMAneliya Angelova is here tooAneliya Angelova 4:44 PM11512582Message Aneliva Angelova+ AaIAl Notes: OffLeavev u searchDate ModifiedYesterday at 13.45Yesterday at 13:24resterday at 13.23Yesterdav at 13:22resterady al lo.dYesterday at 13:20Yesterday at 13:20Yesterday at 13.19Yesterdav at 13:18Yesterday at 13:18resterday at 15-1/Yesterdav at 13:17Yesterday at 13:16Yesterday at 13:15Yesterdav at 13:15resterday al 15-14Yesterdav at 13:13Yesterday at 13:13Yesterday at 13:12Yocterdav at 12:11Yesterday at 13.10Yesterdav at 13:10Yesterday at 13:09Yesterday at 13:08Voctordav at 12:09Yesterday at 13:07Yecterdav at 13:06Yesterday at 13:06Yesterday at 13:05Yesterday at 13:05Yactordau at 12:0/lYesterday at 13:03Yecterdav at 12:02Yesterdav at 13:0Yesterday at 13:02Yesterday at 13:01Yesterday at 13:00Yecterdav at 12:00Yesterdav at 12:59Yesterday at 12:59Yesterdav at 12:58Yesterday at 12:58Yesterdav at 12:5710 K.MPEG-4 movie16 KRI6 KBokbMPFG-1 movieMPEG-4 movie12 KBIMPEG-4 movie23 KBMPEG-4 movie8 KBMPEG-4 movie6 K:6 KRIMPEG-A movie11 KBMPEG-4 movie20 KB34 KB10 KB7 K:MPEG-4 movieMPE0"4 movie5 KB11 KB26 KBMDECA movieMPEG-4 movie111 KBIMPEG-4 movie102 KBMPEG-4 movie88 KBMPEG-4 movie59 K:98 KB97 KB66 K8MDECA movicMPEG-4 movieAAKRMDEG-A movid/8 KbMPEG-4 movie50 K:MPEG-4 movie58 KBMDEC.A movid27 KB7 KB1MPEG-4 movie12 KRI32 KB17 KBMDSG-A movidMPEG-4 movie19 K:MPEG-A movid32 KBMPEG-4 movie10 KE24 K:25 kp49 KB27 KBMPEG-4 movieMDEG.A movildMPEG-4 movie65 KPMDEG-A movie67 KBMPEG-4 movie51 KBMPEG-4 movie17 K:MPEG-4 movie22 KBMPEG-4 movie18 KB170 KB107 KPMPEG-4 movieMDSG-A movie199 KB MPEG-4 movie202 KE196 K:MPEG-4 movid100 kpMDEC.A movid191 K8MPEG-4 movieL Lukás Koválik's No.n Home• No upcoming eventsView allNew pageWork= Hubspot APl calls8 Hubsnot8 CRM• Work KnowledgeE DSK Report 2025EB DSK Report 202414 Report 2023(9 YEAR 2026ã) App replacemen2 Read later# LOGSã Report 20241 VideosTodo2 TestDailyAgents+ New agent* Quick Note- WorkKnowledgeIdeas4 Finance hubE=. Home viewe2 Integration-app*New chat x0Work• Jira ticket / New page'timestamp": 1773305812311, # 2026-03-12 08:56:52"sourced, "w ertd: 76091797",0d Huddle with Aneliva Ancelova*= Al Notes: Off vLukas KovalikScreen share"namp"l "dealstadoll"timestamp": 1751881632388, # ts 2025-07-07 09:47:12100% • Inu 14 May 10:02:0%Edited 5h agoah Share v a* ..•Leave...
|
NULL
|
-1621556880828312941
|
NULL
|
app_switch
|
ocr
|
NULL
|
Jiminny...vActivityFilesLater@ jiminny-x-integrati Jiminny...vActivityFilesLater@ jiminny-x-integrati….• plattorm-inner-teamE Channels# ai-chapter# alertsi backend# bugscontusion-cllnia# curiosity lab# engineering# general#jiminny-bgac nlattorm-nckets# product launches# random# releases# sofia-officed sunport# thank-yous# the people of iimi... Direct messages• e 02P. Galya Dimitrovavasil VasilevStefka StoyanovaSg: Todor StamatovMario GeorgieyNiudlay lanay. James Graham "* Stoyan Tanevad Stelivan Georgiev( Petko Kashinski*. Lukas Kovali...::: AnnsToastS lira Gloud6d Huddle with Aneliva AngelovaQ Describe what you are looking for* Aneliya Angelova &• MessagesAdd canvasur FilesTuesdav. April 28thvMonday, May 11thAneliva Angelova 1:24 PMIЛукаш за Huюsлог за синковете вече се изполава тази команла нали?Lukas Kovalik 1:32 PMла коон я пуска поез 5 минAneliya Angelova v 2:30 PMЛукаш, само при Сейлсфорс и Хубспот се синкваха активити типовете, когато се направи плейбук,Hanи?при останалите CRMi трябва рьчно да се въведатLukas Kovalik M 2:47 PNзлрастиами не знам по принцип се вика при всичкитрябва да се за всички, някъле не се ли полълвапри зохо маи оеше nагасоdеа но маи и там си връшаха две категодииAneliya Angelova 4:00 PMЛукаш имаш ли време да се чуем за тестването на https://iiminny.atlassian.net/browse/JY-20725Jira CloudX Busb5-20125 in im locRHubsoot Oonmise CRM rematching on delete nubsoot ac...StatusReady for OA= MediumAA Aneliva AngelovaAs of today at 4:00 PMIOpen in JiraSummariseLukas Kovalik 4:02 PMVou idined the huddle (LIVE 4.04 DMAneliya Angelova is here tooAneliya Angelova 4:44 PM11512582Message Aneliva Angelova+ AaIAl Notes: OffLeavev u searchDate ModifiedYesterday at 13.45Yesterday at 13:24resterday at 13.23Yesterdav at 13:22resterady al lo.dYesterday at 13:20Yesterday at 13:20Yesterday at 13.19Yesterdav at 13:18Yesterday at 13:18resterday at 15-1/Yesterdav at 13:17Yesterday at 13:16Yesterday at 13:15Yesterdav at 13:15resterday al 15-14Yesterdav at 13:13Yesterday at 13:13Yesterday at 13:12Yocterdav at 12:11Yesterday at 13.10Yesterdav at 13:10Yesterday at 13:09Yesterday at 13:08Voctordav at 12:09Yesterday at 13:07Yecterdav at 13:06Yesterday at 13:06Yesterday at 13:05Yesterday at 13:05Yactordau at 12:0/lYesterday at 13:03Yecterdav at 12:02Yesterdav at 13:0Yesterday at 13:02Yesterday at 13:01Yesterday at 13:00Yecterdav at 12:00Yesterdav at 12:59Yesterday at 12:59Yesterdav at 12:58Yesterday at 12:58Yesterdav at 12:5710 K.MPEG-4 movie16 KRI6 KBokbMPFG-1 movieMPEG-4 movie12 KBIMPEG-4 movie23 KBMPEG-4 movie8 KBMPEG-4 movie6 K:6 KRIMPEG-A movie11 KBMPEG-4 movie20 KB34 KB10 KB7 K:MPEG-4 movieMPE0"4 movie5 KB11 KB26 KBMDECA movieMPEG-4 movie111 KBIMPEG-4 movie102 KBMPEG-4 movie88 KBMPEG-4 movie59 K:98 KB97 KB66 K8MDECA movicMPEG-4 movieAAKRMDEG-A movid/8 KbMPEG-4 movie50 K:MPEG-4 movie58 KBMDEC.A movid27 KB7 KB1MPEG-4 movie12 KRI32 KB17 KBMDSG-A movidMPEG-4 movie19 K:MPEG-A movid32 KBMPEG-4 movie10 KE24 K:25 kp49 KB27 KBMPEG-4 movieMDEG.A movildMPEG-4 movie65 KPMDEG-A movie67 KBMPEG-4 movie51 KBMPEG-4 movie17 K:MPEG-4 movie22 KBMPEG-4 movie18 KB170 KB107 KPMPEG-4 movieMDSG-A movie199 KB MPEG-4 movie202 KE196 K:MPEG-4 movid100 kpMDEC.A movid191 K8MPEG-4 movieL Lukás Koválik's No.n Home• No upcoming eventsView allNew pageWork= Hubspot APl calls8 Hubsnot8 CRM• Work KnowledgeE DSK Report 2025EB DSK Report 202414 Report 2023(9 YEAR 2026ã) App replacemen2 Read later# LOGSã Report 20241 VideosTodo2 TestDailyAgents+ New agent* Quick Note- WorkKnowledgeIdeas4 Finance hubE=. Home viewe2 Integration-app*New chat x0Work• Jira ticket / New page'timestamp": 1773305812311, # 2026-03-12 08:56:52"sourced, "w ertd: 76091797",0d Huddle with Aneliva Ancelova*= Al Notes: Off vLukas KovalikScreen share"namp"l "dealstadoll"timestamp": 1751881632388, # ts 2025-07-07 09:47:12100% • Inu 14 May 10:02:0%Edited 5h agoah Share v a* ..•Leave...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
44475
|
1610
|
14
|
2026-05-14T13:51:07.161989+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-14/1778 /Users/lukas/.screenpipe/data/data/2026-05-14/1778766667161_m2.jpg...
|
PhpStorm
|
faVsco.js – IntegrationAppTrait.php
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
#12066 on JY-20725-handle Project: faVsco.js, menu
#12066 on JY-20725-handle-HS-search-rate-limit, menu
Start Listening for PHP Debug Connections
HandleHubspotRateLimitTest
Run 'HandleHubspotRateLimitTest'
Debug 'HandleHubspotRateLimitTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
7
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Http\Controllers\Webhook\IntegrationAppSubscriptions;
use Illuminate\Http\JsonResponse;
use Jiminny\Contracts\Crm\Providers;
use Jiminny\Models\Team;
use Jiminny\Services\Crm\IntegrationApp\Service;
use Jiminny\Services\Crm\ProviderRegistry;
trait IntegrationAppTrait
{
abstract protected function getTeamFromRequest(): ?Team;
abstract protected function extractPayload(): array;
private function getPayload(): array
{
$payload = $this->extractPayload();
$this->logger->info('[integration-app] Event received', [
'payload' => $payload,
]);
return $payload;
}
private function extractTargetIdFromPayload(string $targetId): ?string
{
$payload = $this->getPayload();
return $payload[$targetId] ?? null;
}
private function extractTargetObjectIdsFromPayload(string $targetKey): array
{
$payload = $this->getPayload();
$objects = $payload[$targetKey] ?? [];
if (! is_array($objects) || empty($objects)) {
return [];
}
return array_values(array_filter(array_map(
static fn ($object) => is_array($object) ? ($object['id'] ?? null) : null,
$objects
)));
}
private function bootstrapIntegrationApp(Team $team): ?Service
{
$crmProvider = app(ProviderRegistry::class);
$providerName = $team->getCrmConfiguration()->getProviderName();
if (! Providers::isIntegrationAppProvider($providerName)) {
return null;
}
/** @var Service $integrationApp */
$integrationApp = $crmProvider->get($providerName);
$integrationApp->setUser($team->getOwner());
return $integrationApp;
}
private function getTargetCrmProviderId(string $targetKey, string $eventName): ?string
{
$targetId = $this->extractTargetIdFromPayload($targetKey);
$this->logger->info("[integration-app] Event: {$eventName}", [
'targetId' => $targetId,
'targetKey' => $targetKey,
]);
return $targetId;
}
private function getTargetCrmProviderObjectsIds(string $targetKey, string $eventName): array
{
$targetIds = $this->extractTargetObjectIdsFromPayload($targetKey);
$this->logger->info("[integration-app] Event: $eventName", [
'targetIds' => $targetIds,
'targetKey' => $targetKey,
'count' => count($targetIds),
]);
return $targetIds;
}
protected function handleBulkDeletion(string $targetKey, string $fallbackKey, string $eventName): JsonResponse
{
$team = $this->getTeamFromRequest();
if ($team === null) {
return new JsonResponse([], JsonResponse::HTTP_NO_CONTENT);
}
$targetIds = $this->getTargetCrmProviderObjectsIds(targetKey: $targetKey, eventName: $eventName);
if (empty($targetIds)) {
$this->logger->warning('No target IDs found for ' . $eventName);
// fallback to single target ID
$targetId = $this->getTargetCrmProviderId(targetKey: $fallbackKey, eventName: $eventName);
if ($targetId !== null) {
$targetIds[] = $targetId;
}
}
if (empty($targetIds)) {
$this->logger->warning('No target IDs found alter fallback for ' . $eventName);
return new JsonResponse([], JsonResponse::HTTP_BAD_REQUEST);
}
foreach ($targetIds as $targetId) {
$this->deleteTarget(team: $team, targetId: (string) $targetId);
}
return new JsonResponse([], JsonResponse::HTTP_OK);
}
abstract protected function deleteTarget(Team $team, string $targetId): void;
}
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
8
1
3
4
Previous Highlighted Error
Next Highlighted Error
SELECT
# DISTINCT
opp.id as opp_id, opp.uuid, opp.name,
# COUNT(dr.id) AS deal_risk_count,
# dr.id,
# cfd.value,
usr.name AS owner_name,
opp.value, opp.currency_code, opp.close_date, opp.remotely_created_at, opp.is_closed, opp.is_won,
usr.uuid as owner_uuid,
usr.photo_path as owner_photo,
usr.id AS owner_id,
jt.name as owner_job,
opp.stage_id, opp.stage_updated_at,
acc.name AS acc_name, opp.stage_updated_at, acc.crm_provider_id AS acc_provider_id, opp.crm_provider_id AS opp_provider_id,
rt.business_process_id AS pipeline_id
FROM opportunities opp
LEFT JOIN record_types rt ON opp.record_type_id = rt.id
LEFT JOIN users usr ON opp.user_id = usr.id
LEFT JOIN accounts acc ON opp.account_id = acc.id
LEFT JOIN job_titles jt ON usr.job_title_id = jt.id
# LEFT JOIN group_deal_risk_types gdrt ON gdrt.group_id = usr.group_id
# LEFT JOIN deal_risks dr ON dr.opportunity_id = opp.id AND dr.group_deal_risk_type_id = gdrt.id
LEFT JOIN crm_field_data cfd ON (cfd.object_id = opp.id and cfd.crm_field_id = 66814)
WHERE opp.user_id IS NOT NULL
AND opp.deleted_at IS NULL
AND opp.is_closed = 1
AND opp.is_won = 0
AND opp.close_date >= '2024-01-01 00:00:00'
AND opp.close_date <= '2024-12-31 23:59:59'
AND usr.team_id = 1
# and opp.id = 4823179
GROUP BY opp.id, cfd.value
ORDER BY
# cfd.value
CAST(cfd.value AS UNSIGNED)
# owner_name
# (SELECT COUNT(dr.id)
# FROM deal_risks dr
# JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id
# WHERE dr.opportunity_id = opp.id
# AND dr.is_active = 1
# AND gdrt.is_enabled = 1)
DESC
LIMIT 25
# OFFSET 0
;
select * from crm_fields where crm_configuration_id = 1 and object_type = 'opportunity';
select * from crm_layout_entities where crm_layout_id = 1493;
SELECT * FROM opportunities WHERE id = 4584045;
SELECT * FROM crm_field_data WHERE object_id = 4584045;
SELECT * FROM opportunities where team_id = 1 and crm_provider_id = '0061K00000lfb9IQAQ'
SELECT
opp.id as opportunity_id,
opp.name,
COUNT(dr.id) as risk_count
FROM opportunities opp
LEFT JOIN deal_risks dr ON dr.opportunity_id = opp.id
WHERE opp.id IN (
6069574,8900938,9507638,9524799,9660490,9662824,9705675,9749758,4158460,4391812,6450439,4448422,5118945,5590675,4584045,7228149,9002408,9165534,9446720,9641778,9665149,9703344,9709280,5747948,4158491,6182565,6263970,5798120,5111315,4536978,6062352,6548383,6072095,6548225,4480986,5011422,6548381,8760540,8917554,9509986,9514392,9569009,9569011,9578490,9713604,5784397,7276612,7288405,8994421,9118219,9608148,9818911,4510535,6479693,5958049,6271674,6550448,4158331,4158483,6126571,6171615,6540943,4897466,5190896,5796182,5932762,8572433,8723698,8892697,9711001,9789264,4549188,6100831,6170064,6260799,6263653,6449936,6530871,6538978,7777651,8059269,8319918,8787049,8901150,9263153,9453207,9514738,9696700,9791062,5752018,6421452,7439134,7878923,9354763,9369285,9514396,9582506,9889949,9890216,4094311,4158495,4158496,6098128,5585661,3872564,6442149,5891604,6164746,6199593,6583474,6519684,9018490,9809006,4496897,5041324,5829430,6198319,6253504,6555763,7242914,7931055,8024125,8797814,8058559,8673347,8892695,8994420,9616219,9714970,9722004,9809439,9818918,6523177,8134147,9002915,9711422,9892713,9901719,9954210,9978435,5800810,6243518,6416114,6222251,6411974,6512456,5791953,6545606,9914780,5805540,6238986,6463838,6547680,9767049,9809437,9810885,9890855,6673493,9902036,4335521,6379871,6503799,6546077,8018765,9907556,9958433,9905855,9916179,9946741,9957877,5563344,6271838,6450815,7641128,7762567,7780592,8684810,8685786,8685787,8685788
)
GROUP BY opp.id;
SELECT COUNT(dr.id)
FROM deal_risks dr
JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id
WHERE dr.opportunity_id = 5563344
# AND gdrt.group_id = usr.group_id
EXPLAIN SELECT
opp.id as opp_id, opp.uuid, opp.name,
cfd.value,
cfv.sequence,
cfv.value,
# MAX(cfd.value) AS max_cfd_value,
usr.name AS owner_name,
opp.value, opp.currency_code, opp.close_date, opp.remotely_created_at, opp.is_closed, opp.is_won,
usr.uuid as owner_uuid,
usr.photo_path as owner_photo,
usr.id AS owner_id,
jt.name as owner_job,
opp.stage_id, opp.stage_updated_at,
acc.name AS acc_name, opp.stage_updated_at, acc.crm_provider_id AS acc_provider_id, opp.crm_provider_id AS opp_provider_id,
rt.business_process_id AS pipeline_id
FROM opportunities opp
LEFT JOIN record_types rt ON opp.record_type_id = rt.id
LEFT JOIN users usr ON opp.user_id = usr.id
LEFT JOIN accounts acc ON opp.account_id = acc.id
LEFT JOIN job_titles jt ON usr.job_title_id = jt.id
LEFT JOIN crm_field_data cfd ON cfd.id = (SELECT sub_cfd.id
FROM crm_field_data sub_cfd
WHERE sub_cfd.object_id = opp.id
AND sub_cfd.crm_field_id = 66810
ORDER BY sub_cfd.updated_at DESC
LIMIT 1)
LEFT JOIN crm_field_values cfv ON cfv.crm_field_id = 66810 AND cfv.value = cfd.value
WHERE opp.user_id IS NOT NULL
AND opp.deleted_at IS NULL
AND opp.is_closed = 0
# AND opp.is_closed = 1
# AND opp.is_won = 0
AND opp.close_date >= '2024-01-01 00:00:00'
AND opp.close_date <= '2024-12-31 23:59:59'
AND usr.team_id = 1
# and opp.id = 4823179
# GROUP BY opp.id
ORDER BY
cfv.sequence DESC,
# opp.name
# owner_name
cfd.value
# CAST(cfd.value AS UNSIGNED)
# CAST(MAX(cfd.value) AS UNSIGNED)
# (SELECT COUNT(dr.id)
# FROM deal_risks dr
# JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id
# WHERE dr.opportunity_id = opp.id
# AND dr.is_active = 1 AND gdrt.is_enabled = 1)
DESC
# LIMIT 75, 25
;
SELECT * FROM crm_field_values WHERE crm_field_id = 66810;
SELECT f.id, f.crm_provider_id AS field_name, f.label, fd.object_id AS dealId, fd.value, fd.updated_at, fd.id, fd.created_at
FROM crm_fields f
INNER JOIN crm_field_data fd ON fd.crm_field_id = f.id
WHERE (f.crm_configuration_id = 1)
AND (f.object_type = 'opportunity')
# AND (fd.object_id IN (4158331,4158483,4158495,4158496,6069574,6263970,6171615,6540943,6545606,5829430,6198319,6263653,6548381,7242914,8797814,7228149,7439134,7878923,8134147,9002915,9118219,9165534,9354763,9369285,9446720))
AND (fd.object_id IN (4158460))
AND (f.crm_provider_id IN ('ForecastCategoryName'))
ORDER BY fd.object_id ASC, fd.updated_at DESC;
select * from crm_layouts where crm_configuration_id = 1;
select cf.* from crm_fields cf
join crm_layout_entities cle on cf.id = cle.crm_field_id
where crm_layout_id = 1493;
SELECT * FROM opportunities WHERE id = 4158460;
SELECT * FROM crm_field_data WHERE object_id = 4158460;
select * from users where team_id = 1;
SELECT * FROM users WHERE id = 7160;
select * from role_user where user_id = 3248;
select * from crm_field_values where crm_field_id = 66824;
SELECT * FROM users WHERE id = 23470;
select * from crm_configurations;
# [PASSWORD_DOTS]
select * from teams where id = 1038; # 23521, 966
select * from users where team_id = 1038;
select * from crm_configurations where id = 966;
SELECT * FROM activities WHERE uuid_to_bin('e8dc7c34-31f6-4430-bd81-2d9d8f00dd07') = uuid; # 54965762
SELECT * FROM activities WHERE uuid_to_bin('4b5727c0-69d1-428f-b8d9-b649055166e2') = uuid; # 54965764
SELECT * FROM participants WHERE activity_id = 54965764;
SELECT id, uuid, title, recording_state FROM activities WHERE uuid_to_bin('355f105d-5606-4379-b0c5-d91daf59f4ce') = uuid; # 54964075
SELECT * FROM participants WHERE activity_id = 54964075;
select f.id, slug, title, tf.team_id from team_features tf JOIN features f on tf.feature_id = f.id
where tf.team_id = 1038;
# [PASSWORD_DOTS] PD [PASSWORD_DOTS]
select * from teams where id = 1029;
SELECT * FROM crm_configurations WHERE id = 957;
SELECT * FROM activities WHERE uuid_to_bin('581a33cb-4343-44bd-ac0c-4a5cee71c5ec') = uuid; # 54963423
SELECT * FROM activities WHERE uuid_to_bin('07238011-25fa-418e-838b-fb21e82b9ea2') = uuid; # 54963433
SELECT * FROM activities WHERE uuid_to_bin('8b6bb2f7-e7a7-4aec-8806-fbfea7093ccd') = uuid; # 54963421
# [PASSWORD_DOTS] Close [PASSWORD_DOTS]
select * from teams where id = 1031;
SELECT * FROM crm_configurations WHERE id = 959;
SELECT * FROM activities WHERE uuid_to_bin('59c517e0-96c9-4dad-bfeb-b7bef72f8725') = uuid; # 54963517
SELECT * FROM activities WHERE uuid_to_bin('07238011-25fa-418e-838b-fb21e82b9ea2') = uuid; # 54963433
SELECT * FROM activities WHERE uuid_to_bin('d68311e3-ac34-49bd-bf04-88323a7e5352') = uuid; # 54966009
# [PASSWORD_DOTS] SF [PASSWORD_DOTS]
SELECT * FROM activities WHERE uuid_to_bin('2bd4cfa3-4eb5-4c77-84a7-9ed46a21c988') = uuid;
select * from roles;
select * from permissions;
select * from permission_role where permission_id = 136;
select * from migrations order by id desc;
select * from teams where id IN (1, 1037);
select * from crm_layouts where crm_configuration_id = 1;
SELECT * FROM crm_layout_entities WHERE crm_layout_id = 1493;
SELECT * FROM crm_fields WHERE id IN (1652,1661,66799,66814,66821,66836,66843,66846,66864,84752,182306,323580,380378);
select * from features;
select * from team_features where feature_id = 33;
select * from opportunities;
select * from teams;
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 = 1052 and sa.provider = 'hubspot';
SELECT * FROM accounts where id = 11512582;
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.2962101,"top":1.0,"width":0.03856383,"height":-0.019952059},"on_screen":true,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"#12066 on JY-20725-handle-HS-search-rate-limit, menu","depth":5,"bounds":{"left":0.33477393,"top":1.0,"width":0.122340426,"height":-0.019952059},"on_screen":true,"help_text":"Pull request #12066 exists for current branch JY-20725-handle-HS-search-rate-limit, but local branch is out of sync with remote","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"bounds":{"left":0.5731383,"top":1.0,"width":0.011303191,"height":-0.019952059},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"HandleHubspotRateLimitTest","depth":6,"bounds":{"left":0.5884308,"top":1.0,"width":0.076130316,"height":-0.019952059},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run 'HandleHubspotRateLimitTest'","depth":6,"bounds":{"left":0.66456115,"top":1.0,"width":0.011303191,"height":-0.019952059},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'HandleHubspotRateLimitTest'","depth":6,"bounds":{"left":0.67586434,"top":1.0,"width":0.011303191,"height":-0.019952059},"on_screen":true,"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.6871675,"top":1.0,"width":0.011303191,"height":-0.019952059},"on_screen":true,"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.7150931,"top":1.0,"width":0.011303191,"height":-0.019952059},"on_screen":true,"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.72639626,"top":1.0,"width":0.011303191,"height":-0.019952059},"on_screen":true,"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.73769945,"top":1.0,"width":0.011303191,"height":-0.019952059},"on_screen":true,"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},"on_screen":false,"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},"on_screen":false,"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},"on_screen":false,"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},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"7","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"on_screen":true,"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\\Webhook\\IntegrationAppSubscriptions;\n\nuse Illuminate\\Http\\JsonResponse;\nuse Jiminny\\Contracts\\Crm\\Providers;\nuse Jiminny\\Models\\Team;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\Service;\nuse Jiminny\\Services\\Crm\\ProviderRegistry;\n\ntrait IntegrationAppTrait\n{\n abstract protected function getTeamFromRequest(): ?Team;\n\n abstract protected function extractPayload(): array;\n\n private function getPayload(): array\n {\n $payload = $this->extractPayload();\n $this->logger->info('[integration-app] Event received', [\n 'payload' => $payload,\n ]);\n\n return $payload;\n }\n\n private function extractTargetIdFromPayload(string $targetId): ?string\n {\n $payload = $this->getPayload();\n\n return $payload[$targetId] ?? null;\n }\n\n private function extractTargetObjectIdsFromPayload(string $targetKey): array\n {\n $payload = $this->getPayload();\n\n $objects = $payload[$targetKey] ?? [];\n\n if (! is_array($objects) || empty($objects)) {\n return [];\n }\n\n return array_values(array_filter(array_map(\n static fn ($object) => is_array($object) ? ($object['id'] ?? null) : null,\n $objects\n )));\n }\n\n private function bootstrapIntegrationApp(Team $team): ?Service\n {\n $crmProvider = app(ProviderRegistry::class);\n\n $providerName = $team->getCrmConfiguration()->getProviderName();\n if (! Providers::isIntegrationAppProvider($providerName)) {\n return null;\n }\n\n /** @var Service $integrationApp */\n $integrationApp = $crmProvider->get($providerName);\n $integrationApp->setUser($team->getOwner());\n\n return $integrationApp;\n }\n\n private function getTargetCrmProviderId(string $targetKey, string $eventName): ?string\n {\n $targetId = $this->extractTargetIdFromPayload($targetKey);\n $this->logger->info(\"[integration-app] Event: {$eventName}\", [\n 'targetId' => $targetId,\n 'targetKey' => $targetKey,\n ]);\n\n return $targetId;\n }\n\n private function getTargetCrmProviderObjectsIds(string $targetKey, string $eventName): array\n {\n $targetIds = $this->extractTargetObjectIdsFromPayload($targetKey);\n $this->logger->info(\"[integration-app] Event: $eventName\", [\n 'targetIds' => $targetIds,\n 'targetKey' => $targetKey,\n 'count' => count($targetIds),\n ]);\n\n return $targetIds;\n }\n\n protected function handleBulkDeletion(string $targetKey, string $fallbackKey, string $eventName): JsonResponse\n {\n $team = $this->getTeamFromRequest();\n\n if ($team === null) {\n return new JsonResponse([], JsonResponse::HTTP_NO_CONTENT);\n }\n\n $targetIds = $this->getTargetCrmProviderObjectsIds(targetKey: $targetKey, eventName: $eventName);\n\n if (empty($targetIds)) {\n $this->logger->warning('No target IDs found for ' . $eventName);\n\n // fallback to single target ID\n $targetId = $this->getTargetCrmProviderId(targetKey: $fallbackKey, eventName: $eventName);\n\n if ($targetId !== null) {\n $targetIds[] = $targetId;\n }\n }\n\n if (empty($targetIds)) {\n $this->logger->warning('No target IDs found alter fallback for ' . $eventName);\n\n return new JsonResponse([], JsonResponse::HTTP_BAD_REQUEST);\n }\n\n foreach ($targetIds as $targetId) {\n $this->deleteTarget(team: $team, targetId: (string) $targetId);\n }\n\n return new JsonResponse([], JsonResponse::HTTP_OK);\n }\n\n abstract protected function deleteTarget(Team $team, string $targetId): void;\n}","depth":4,"bounds":{"left":0.39261967,"top":0.5738228,"width":0.30319148,"height":0.4261772},"on_screen":true,"value":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Http\\Controllers\\Webhook\\IntegrationAppSubscriptions;\n\nuse Illuminate\\Http\\JsonResponse;\nuse Jiminny\\Contracts\\Crm\\Providers;\nuse Jiminny\\Models\\Team;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\Service;\nuse Jiminny\\Services\\Crm\\ProviderRegistry;\n\ntrait IntegrationAppTrait\n{\n abstract protected function getTeamFromRequest(): ?Team;\n\n abstract protected function extractPayload(): array;\n\n private function getPayload(): array\n {\n $payload = $this->extractPayload();\n $this->logger->info('[integration-app] Event received', [\n 'payload' => $payload,\n ]);\n\n return $payload;\n }\n\n private function extractTargetIdFromPayload(string $targetId): ?string\n {\n $payload = $this->getPayload();\n\n return $payload[$targetId] ?? null;\n }\n\n private function extractTargetObjectIdsFromPayload(string $targetKey): array\n {\n $payload = $this->getPayload();\n\n $objects = $payload[$targetKey] ?? [];\n\n if (! is_array($objects) || empty($objects)) {\n return [];\n }\n\n return array_values(array_filter(array_map(\n static fn ($object) => is_array($object) ? ($object['id'] ?? null) : null,\n $objects\n )));\n }\n\n private function bootstrapIntegrationApp(Team $team): ?Service\n {\n $crmProvider = app(ProviderRegistry::class);\n\n $providerName = $team->getCrmConfiguration()->getProviderName();\n if (! Providers::isIntegrationAppProvider($providerName)) {\n return null;\n }\n\n /** @var Service $integrationApp */\n $integrationApp = $crmProvider->get($providerName);\n $integrationApp->setUser($team->getOwner());\n\n return $integrationApp;\n }\n\n private function getTargetCrmProviderId(string $targetKey, string $eventName): ?string\n {\n $targetId = $this->extractTargetIdFromPayload($targetKey);\n $this->logger->info(\"[integration-app] Event: {$eventName}\", [\n 'targetId' => $targetId,\n 'targetKey' => $targetKey,\n ]);\n\n return $targetId;\n }\n\n private function getTargetCrmProviderObjectsIds(string $targetKey, string $eventName): array\n {\n $targetIds = $this->extractTargetObjectIdsFromPayload($targetKey);\n $this->logger->info(\"[integration-app] Event: $eventName\", [\n 'targetIds' => $targetIds,\n 'targetKey' => $targetKey,\n 'count' => count($targetIds),\n ]);\n\n return $targetIds;\n }\n\n protected function handleBulkDeletion(string $targetKey, string $fallbackKey, string $eventName): JsonResponse\n {\n $team = $this->getTeamFromRequest();\n\n if ($team === null) {\n return new JsonResponse([], JsonResponse::HTTP_NO_CONTENT);\n }\n\n $targetIds = $this->getTargetCrmProviderObjectsIds(targetKey: $targetKey, eventName: $eventName);\n\n if (empty($targetIds)) {\n $this->logger->warning('No target IDs found for ' . $eventName);\n\n // fallback to single target ID\n $targetId = $this->getTargetCrmProviderId(targetKey: $fallbackKey, eventName: $eventName);\n\n if ($targetId !== null) {\n $targetIds[] = $targetId;\n }\n }\n\n if (empty($targetIds)) {\n $this->logger->warning('No target IDs found alter fallback for ' . $eventName);\n\n return new JsonResponse([], JsonResponse::HTTP_BAD_REQUEST);\n }\n\n foreach ($targetIds as $targetId) {\n $this->deleteTarget(team: $team, targetId: (string) $targetId);\n }\n\n return new JsonResponse([], JsonResponse::HTTP_OK);\n }\n\n abstract protected function deleteTarget(Team $team, string $targetId): void;\n}","role_description":"text entry area","is_enabled":true,"is_focused":true,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Execute","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Explain Plan","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Browse Query History","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"View Parameters","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Open Query Execution Settings…","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"In-Editor Results","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Tx: Auto","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Cancel Running Statements","depth":4,"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Playground","depth":4,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"jiminny","depth":4,"on_screen":true,"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},"on_screen":false,"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},"on_screen":false,"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},"on_screen":false,"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},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"8","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"1","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"3","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"4","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"SELECT\n# DISTINCT\nopp.id as opp_id, opp.uuid, opp.name,\n# COUNT(dr.id) AS deal_risk_count,\n\n# dr.id,\n# cfd.value,\nusr.name AS owner_name,\nopp.value, opp.currency_code, opp.close_date, opp.remotely_created_at, opp.is_closed, opp.is_won,\nusr.uuid as owner_uuid,\nusr.photo_path as owner_photo,\nusr.id AS owner_id,\njt.name as owner_job,\nopp.stage_id, opp.stage_updated_at,\nacc.name AS acc_name, opp.stage_updated_at, acc.crm_provider_id AS acc_provider_id, opp.crm_provider_id AS opp_provider_id,\nrt.business_process_id AS pipeline_id\nFROM opportunities opp\nLEFT JOIN record_types rt ON opp.record_type_id = rt.id\nLEFT JOIN users usr ON opp.user_id = usr.id\nLEFT JOIN accounts acc ON opp.account_id = acc.id\nLEFT JOIN job_titles jt ON usr.job_title_id = jt.id\n\n# LEFT JOIN group_deal_risk_types gdrt ON gdrt.group_id = usr.group_id\n# LEFT JOIN deal_risks dr ON dr.opportunity_id = opp.id AND dr.group_deal_risk_type_id = gdrt.id\n\nLEFT JOIN crm_field_data cfd ON (cfd.object_id = opp.id and cfd.crm_field_id = 66814)\n\nWHERE opp.user_id IS NOT NULL\nAND opp.deleted_at IS NULL\nAND opp.is_closed = 1\nAND opp.is_won = 0\nAND opp.close_date >= '2024-01-01 00:00:00'\nAND opp.close_date <= '2024-12-31 23:59:59'\nAND usr.team_id = 1\n\n# and opp.id = 4823179\n\nGROUP BY opp.id, cfd.value\nORDER BY\n# cfd.value\n CAST(cfd.value AS UNSIGNED)\n# owner_name\n# (SELECT COUNT(dr.id)\n# FROM deal_risks dr\n# JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id\n# WHERE dr.opportunity_id = opp.id\n# AND dr.is_active = 1\n# AND gdrt.is_enabled = 1)\nDESC\nLIMIT 25\n# OFFSET 0\n;\n\nselect * from crm_fields where crm_configuration_id = 1 and object_type = 'opportunity';\nselect * from crm_layout_entities where crm_layout_id = 1493;\n\nSELECT * FROM opportunities WHERE id = 4584045;\nSELECT * FROM crm_field_data WHERE object_id = 4584045;\n\nSELECT * FROM opportunities where team_id = 1 and crm_provider_id = '0061K00000lfb9IQAQ'\n\nSELECT\n opp.id as opportunity_id,\n opp.name,\n COUNT(dr.id) as risk_count\nFROM opportunities opp\nLEFT JOIN deal_risks dr ON dr.opportunity_id = opp.id\nWHERE opp.id IN (\n 6069574,8900938,9507638,9524799,9660490,9662824,9705675,9749758,4158460,4391812,6450439,4448422,5118945,5590675,4584045,7228149,9002408,9165534,9446720,9641778,9665149,9703344,9709280,5747948,4158491,6182565,6263970,5798120,5111315,4536978,6062352,6548383,6072095,6548225,4480986,5011422,6548381,8760540,8917554,9509986,9514392,9569009,9569011,9578490,9713604,5784397,7276612,7288405,8994421,9118219,9608148,9818911,4510535,6479693,5958049,6271674,6550448,4158331,4158483,6126571,6171615,6540943,4897466,5190896,5796182,5932762,8572433,8723698,8892697,9711001,9789264,4549188,6100831,6170064,6260799,6263653,6449936,6530871,6538978,7777651,8059269,8319918,8787049,8901150,9263153,9453207,9514738,9696700,9791062,5752018,6421452,7439134,7878923,9354763,9369285,9514396,9582506,9889949,9890216,4094311,4158495,4158496,6098128,5585661,3872564,6442149,5891604,6164746,6199593,6583474,6519684,9018490,9809006,4496897,5041324,5829430,6198319,6253504,6555763,7242914,7931055,8024125,8797814,8058559,8673347,8892695,8994420,9616219,9714970,9722004,9809439,9818918,6523177,8134147,9002915,9711422,9892713,9901719,9954210,9978435,5800810,6243518,6416114,6222251,6411974,6512456,5791953,6545606,9914780,5805540,6238986,6463838,6547680,9767049,9809437,9810885,9890855,6673493,9902036,4335521,6379871,6503799,6546077,8018765,9907556,9958433,9905855,9916179,9946741,9957877,5563344,6271838,6450815,7641128,7762567,7780592,8684810,8685786,8685787,8685788\n)\nGROUP BY opp.id;\n\nSELECT COUNT(dr.id)\n FROM deal_risks dr\n JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id\n WHERE dr.opportunity_id = 5563344\n# AND gdrt.group_id = usr.group_id\n\n\n\nEXPLAIN SELECT\n opp.id as opp_id, opp.uuid, opp.name,\n\ncfd.value,\ncfv.sequence,\ncfv.value,\n# MAX(cfd.value) AS max_cfd_value,\nusr.name AS owner_name,\nopp.value, opp.currency_code, opp.close_date, opp.remotely_created_at, opp.is_closed, opp.is_won,\nusr.uuid as owner_uuid,\nusr.photo_path as owner_photo,\nusr.id AS owner_id,\njt.name as owner_job,\nopp.stage_id, opp.stage_updated_at,\nacc.name AS acc_name, opp.stage_updated_at, acc.crm_provider_id AS acc_provider_id, opp.crm_provider_id AS opp_provider_id,\nrt.business_process_id AS pipeline_id\nFROM opportunities opp\n\nLEFT JOIN record_types rt ON opp.record_type_id = rt.id\nLEFT JOIN users usr ON opp.user_id = usr.id\nLEFT JOIN accounts acc ON opp.account_id = acc.id\nLEFT JOIN job_titles jt ON usr.job_title_id = jt.id\n\nLEFT JOIN crm_field_data cfd ON cfd.id = (SELECT sub_cfd.id\n FROM crm_field_data sub_cfd\n WHERE sub_cfd.object_id = opp.id\n AND sub_cfd.crm_field_id = 66810\n ORDER BY sub_cfd.updated_at DESC\n LIMIT 1)\n\nLEFT JOIN crm_field_values cfv ON cfv.crm_field_id = 66810 AND cfv.value = cfd.value\n\nWHERE opp.user_id IS NOT NULL\nAND opp.deleted_at IS NULL\nAND opp.is_closed = 0\n# AND opp.is_closed = 1\n# AND opp.is_won = 0\nAND opp.close_date >= '2024-01-01 00:00:00'\nAND opp.close_date <= '2024-12-31 23:59:59'\nAND usr.team_id = 1\n\n# and opp.id = 4823179\n\n# GROUP BY opp.id\nORDER BY\n cfv.sequence DESC,\n# opp.name\n# owner_name\n cfd.value\n# CAST(cfd.value AS UNSIGNED)\n# CAST(MAX(cfd.value) AS UNSIGNED)\n# (SELECT COUNT(dr.id)\n# FROM deal_risks dr\n# JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id\n# WHERE dr.opportunity_id = opp.id\n# AND dr.is_active = 1 AND gdrt.is_enabled = 1)\nDESC\n# LIMIT 75, 25\n;\n\n\n\nSELECT * FROM crm_field_values WHERE crm_field_id = 66810;\n\nSELECT f.id, f.crm_provider_id AS field_name, f.label, fd.object_id AS dealId, fd.value, fd.updated_at, fd.id, fd.created_at\nFROM crm_fields f\nINNER JOIN crm_field_data fd ON fd.crm_field_id = f.id\n WHERE (f.crm_configuration_id = 1)\n AND (f.object_type = 'opportunity')\n# AND (fd.object_id IN (4158331,4158483,4158495,4158496,6069574,6263970,6171615,6540943,6545606,5829430,6198319,6263653,6548381,7242914,8797814,7228149,7439134,7878923,8134147,9002915,9118219,9165534,9354763,9369285,9446720))\n AND (fd.object_id IN (4158460))\n AND (f.crm_provider_id IN ('ForecastCategoryName'))\n ORDER BY fd.object_id ASC, fd.updated_at DESC;\n\nselect * from crm_layouts where crm_configuration_id = 1;\nselect cf.* from crm_fields cf\njoin crm_layout_entities cle on cf.id = cle.crm_field_id\nwhere crm_layout_id = 1493;\n\nSELECT * FROM opportunities WHERE id = 4158460;\nSELECT * FROM crm_field_data WHERE object_id = 4158460;\n\nselect * from users where team_id = 1;\nSELECT * FROM users WHERE id = 7160;\nselect * from role_user where user_id = 3248;\n\nselect * from crm_field_values where crm_field_id = 66824;\n\nSELECT * FROM users WHERE id = 23470;\nselect * from crm_configurations;\n\n# ******************************************\nselect * from teams where id = 1038; # 23521, 966\nselect * from users where team_id = 1038;\nselect * from crm_configurations where id = 966;\nSELECT * FROM activities WHERE uuid_to_bin('e8dc7c34-31f6-4430-bd81-2d9d8f00dd07') = uuid; # 54965762\nSELECT * FROM activities WHERE uuid_to_bin('4b5727c0-69d1-428f-b8d9-b649055166e2') = uuid; # 54965764\nSELECT * FROM participants WHERE activity_id = 54965764;\n\nSELECT id, uuid, title, recording_state FROM activities WHERE uuid_to_bin('355f105d-5606-4379-b0c5-d91daf59f4ce') = uuid; # 54964075\nSELECT * FROM participants WHERE activity_id = 54964075;\nselect f.id, slug, title, tf.team_id from team_features tf JOIN features f on tf.feature_id = f.id\n where tf.team_id = 1038;\n\n\n# ****************************************** PD *************************\nselect * from teams where id = 1029;\nSELECT * FROM crm_configurations WHERE id = 957;\nSELECT * FROM activities WHERE uuid_to_bin('581a33cb-4343-44bd-ac0c-4a5cee71c5ec') = uuid; # 54963423\nSELECT * FROM activities WHERE uuid_to_bin('07238011-25fa-418e-838b-fb21e82b9ea2') = uuid; # 54963433\n\nSELECT * FROM activities WHERE uuid_to_bin('8b6bb2f7-e7a7-4aec-8806-fbfea7093ccd') = uuid; # 54963421\n\n# ****************************************** Close *************************\nselect * from teams where id = 1031;\nSELECT * FROM crm_configurations WHERE id = 959;\nSELECT * FROM activities WHERE uuid_to_bin('59c517e0-96c9-4dad-bfeb-b7bef72f8725') = uuid; # 54963517\n\n\nSELECT * FROM activities WHERE uuid_to_bin('07238011-25fa-418e-838b-fb21e82b9ea2') = uuid; # 54963433\n\nSELECT * FROM activities WHERE uuid_to_bin('d68311e3-ac34-49bd-bf04-88323a7e5352') = uuid; # 54966009\n\n# ****************************************** SF *************************\nSELECT * FROM activities WHERE uuid_to_bin('2bd4cfa3-4eb5-4c77-84a7-9ed46a21c988') = uuid;\n\nselect * from roles;\nselect * from permissions;\nselect * from permission_role where permission_id = 136;\n\nselect * from migrations order by id desc;\n\nselect * from teams where id IN (1, 1037);\nselect * from crm_layouts where crm_configuration_id = 1;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1493;\nSELECT * FROM crm_fields WHERE id IN (1652,1661,66799,66814,66821,66836,66843,66846,66864,84752,182306,323580,380378);\n\nselect * from features;\nselect * from team_features where feature_id = 33;\nselect * from opportunities;\n\nselect * from teams;\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 = 1052 and sa.provider = 'hubspot';\n\nSELECT * FROM accounts where id = 11512582;","depth":4,"on_screen":true,"value":"SELECT\n# DISTINCT\nopp.id as opp_id, opp.uuid, opp.name,\n# COUNT(dr.id) AS deal_risk_count,\n\n# dr.id,\n# cfd.value,\nusr.name AS owner_name,\nopp.value, opp.currency_code, opp.close_date, opp.remotely_created_at, opp.is_closed, opp.is_won,\nusr.uuid as owner_uuid,\nusr.photo_path as owner_photo,\nusr.id AS owner_id,\njt.name as owner_job,\nopp.stage_id, opp.stage_updated_at,\nacc.name AS acc_name, opp.stage_updated_at, acc.crm_provider_id AS acc_provider_id, opp.crm_provider_id AS opp_provider_id,\nrt.business_process_id AS pipeline_id\nFROM opportunities opp\nLEFT JOIN record_types rt ON opp.record_type_id = rt.id\nLEFT JOIN users usr ON opp.user_id = usr.id\nLEFT JOIN accounts acc ON opp.account_id = acc.id\nLEFT JOIN job_titles jt ON usr.job_title_id = jt.id\n\n# LEFT JOIN group_deal_risk_types gdrt ON gdrt.group_id = usr.group_id\n# LEFT JOIN deal_risks dr ON dr.opportunity_id = opp.id AND dr.group_deal_risk_type_id = gdrt.id\n\nLEFT JOIN crm_field_data cfd ON (cfd.object_id = opp.id and cfd.crm_field_id = 66814)\n\nWHERE opp.user_id IS NOT NULL\nAND opp.deleted_at IS NULL\nAND opp.is_closed = 1\nAND opp.is_won = 0\nAND opp.close_date >= '2024-01-01 00:00:00'\nAND opp.close_date <= '2024-12-31 23:59:59'\nAND usr.team_id = 1\n\n# and opp.id = 4823179\n\nGROUP BY opp.id, cfd.value\nORDER BY\n# cfd.value\n CAST(cfd.value AS UNSIGNED)\n# owner_name\n# (SELECT COUNT(dr.id)\n# FROM deal_risks dr\n# JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id\n# WHERE dr.opportunity_id = opp.id\n# AND dr.is_active = 1\n# AND gdrt.is_enabled = 1)\nDESC\nLIMIT 25\n# OFFSET 0\n;\n\nselect * from crm_fields where crm_configuration_id = 1 and object_type = 'opportunity';\nselect * from crm_layout_entities where crm_layout_id = 1493;\n\nSELECT * FROM opportunities WHERE id = 4584045;\nSELECT * FROM crm_field_data WHERE object_id = 4584045;\n\nSELECT * FROM opportunities where team_id = 1 and crm_provider_id = '0061K00000lfb9IQAQ'\n\nSELECT\n opp.id as opportunity_id,\n opp.name,\n COUNT(dr.id) as risk_count\nFROM opportunities opp\nLEFT JOIN deal_risks dr ON dr.opportunity_id = opp.id\nWHERE opp.id IN (\n 6069574,8900938,9507638,9524799,9660490,9662824,9705675,9749758,4158460,4391812,6450439,4448422,5118945,5590675,4584045,7228149,9002408,9165534,9446720,9641778,9665149,9703344,9709280,5747948,4158491,6182565,6263970,5798120,5111315,4536978,6062352,6548383,6072095,6548225,4480986,5011422,6548381,8760540,8917554,9509986,9514392,9569009,9569011,9578490,9713604,5784397,7276612,7288405,8994421,9118219,9608148,9818911,4510535,6479693,5958049,6271674,6550448,4158331,4158483,6126571,6171615,6540943,4897466,5190896,5796182,5932762,8572433,8723698,8892697,9711001,9789264,4549188,6100831,6170064,6260799,6263653,6449936,6530871,6538978,7777651,8059269,8319918,8787049,8901150,9263153,9453207,9514738,9696700,9791062,5752018,6421452,7439134,7878923,9354763,9369285,9514396,9582506,9889949,9890216,4094311,4158495,4158496,6098128,5585661,3872564,6442149,5891604,6164746,6199593,6583474,6519684,9018490,9809006,4496897,5041324,5829430,6198319,6253504,6555763,7242914,7931055,8024125,8797814,8058559,8673347,8892695,8994420,9616219,9714970,9722004,9809439,9818918,6523177,8134147,9002915,9711422,9892713,9901719,9954210,9978435,5800810,6243518,6416114,6222251,6411974,6512456,5791953,6545606,9914780,5805540,6238986,6463838,6547680,9767049,9809437,9810885,9890855,6673493,9902036,4335521,6379871,6503799,6546077,8018765,9907556,9958433,9905855,9916179,9946741,9957877,5563344,6271838,6450815,7641128,7762567,7780592,8684810,8685786,8685787,8685788\n)\nGROUP BY opp.id;\n\nSELECT COUNT(dr.id)\n FROM deal_risks dr\n JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id\n WHERE dr.opportunity_id = 5563344\n# AND gdrt.group_id = usr.group_id\n\n\n\nEXPLAIN SELECT\n opp.id as opp_id, opp.uuid, opp.name,\n\ncfd.value,\ncfv.sequence,\ncfv.value,\n# MAX(cfd.value) AS max_cfd_value,\nusr.name AS owner_name,\nopp.value, opp.currency_code, opp.close_date, opp.remotely_created_at, opp.is_closed, opp.is_won,\nusr.uuid as owner_uuid,\nusr.photo_path as owner_photo,\nusr.id AS owner_id,\njt.name as owner_job,\nopp.stage_id, opp.stage_updated_at,\nacc.name AS acc_name, opp.stage_updated_at, acc.crm_provider_id AS acc_provider_id, opp.crm_provider_id AS opp_provider_id,\nrt.business_process_id AS pipeline_id\nFROM opportunities opp\n\nLEFT JOIN record_types rt ON opp.record_type_id = rt.id\nLEFT JOIN users usr ON opp.user_id = usr.id\nLEFT JOIN accounts acc ON opp.account_id = acc.id\nLEFT JOIN job_titles jt ON usr.job_title_id = jt.id\n\nLEFT JOIN crm_field_data cfd ON cfd.id = (SELECT sub_cfd.id\n FROM crm_field_data sub_cfd\n WHERE sub_cfd.object_id = opp.id\n AND sub_cfd.crm_field_id = 66810\n ORDER BY sub_cfd.updated_at DESC\n LIMIT 1)\n\nLEFT JOIN crm_field_values cfv ON cfv.crm_field_id = 66810 AND cfv.value = cfd.value\n\nWHERE opp.user_id IS NOT NULL\nAND opp.deleted_at IS NULL\nAND opp.is_closed = 0\n# AND opp.is_closed = 1\n# AND opp.is_won = 0\nAND opp.close_date >= '2024-01-01 00:00:00'\nAND opp.close_date <= '2024-12-31 23:59:59'\nAND usr.team_id = 1\n\n# and opp.id = 4823179\n\n# GROUP BY opp.id\nORDER BY\n cfv.sequence DESC,\n# opp.name\n# owner_name\n cfd.value\n# CAST(cfd.value AS UNSIGNED)\n# CAST(MAX(cfd.value) AS UNSIGNED)\n# (SELECT COUNT(dr.id)\n# FROM deal_risks dr\n# JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id\n# WHERE dr.opportunity_id = opp.id\n# AND dr.is_active = 1 AND gdrt.is_enabled = 1)\nDESC\n# LIMIT 75, 25\n;\n\n\n\nSELECT * FROM crm_field_values WHERE crm_field_id = 66810;\n\nSELECT f.id, f.crm_provider_id AS field_name, f.label, fd.object_id AS dealId, fd.value, fd.updated_at, fd.id, fd.created_at\nFROM crm_fields f\nINNER JOIN crm_field_data fd ON fd.crm_field_id = f.id\n WHERE (f.crm_configuration_id = 1)\n AND (f.object_type = 'opportunity')\n# AND (fd.object_id IN (4158331,4158483,4158495,4158496,6069574,6263970,6171615,6540943,6545606,5829430,6198319,6263653,6548381,7242914,8797814,7228149,7439134,7878923,8134147,9002915,9118219,9165534,9354763,9369285,9446720))\n AND (fd.object_id IN (4158460))\n AND (f.crm_provider_id IN ('ForecastCategoryName'))\n ORDER BY fd.object_id ASC, fd.updated_at DESC;\n\nselect * from crm_layouts where crm_configuration_id = 1;\nselect cf.* from crm_fields cf\njoin crm_layout_entities cle on cf.id = cle.crm_field_id\nwhere crm_layout_id = 1493;\n\nSELECT * FROM opportunities WHERE id = 4158460;\nSELECT * FROM crm_field_data WHERE object_id = 4158460;\n\nselect * from users where team_id = 1;\nSELECT * FROM users WHERE id = 7160;\nselect * from role_user where user_id = 3248;\n\nselect * from crm_field_values where crm_field_id = 66824;\n\nSELECT * FROM users WHERE id = 23470;\nselect * from crm_configurations;\n\n# ******************************************\nselect * from teams where id = 1038; # 23521, 966\nselect * from users where team_id = 1038;\nselect * from crm_configurations where id = 966;\nSELECT * FROM activities WHERE uuid_to_bin('e8dc7c34-31f6-4430-bd81-2d9d8f00dd07') = uuid; # 54965762\nSELECT * FROM activities WHERE uuid_to_bin('4b5727c0-69d1-428f-b8d9-b649055166e2') = uuid; # 54965764\nSELECT * FROM participants WHERE activity_id = 54965764;\n\nSELECT id, uuid, title, recording_state FROM activities WHERE uuid_to_bin('355f105d-5606-4379-b0c5-d91daf59f4ce') = uuid; # 54964075\nSELECT * FROM participants WHERE activity_id = 54964075;\nselect f.id, slug, title, tf.team_id from team_features tf JOIN features f on tf.feature_id = f.id\n where tf.team_id = 1038;\n\n\n# ****************************************** PD *************************\nselect * from teams where id = 1029;\nSELECT * FROM crm_configurations WHERE id = 957;\nSELECT * FROM activities WHERE uuid_to_bin('581a33cb-4343-44bd-ac0c-4a5cee71c5ec') = uuid; # 54963423\nSELECT * FROM activities WHERE uuid_to_bin('07238011-25fa-418e-838b-fb21e82b9ea2') = uuid; # 54963433\n\nSELECT * FROM activities WHERE uuid_to_bin('8b6bb2f7-e7a7-4aec-8806-fbfea7093ccd') = uuid; # 54963421\n\n# ****************************************** Close *************************\nselect * from teams where id = 1031;\nSELECT * FROM crm_configurations WHERE id = 959;\nSELECT * FROM activities WHERE uuid_to_bin('59c517e0-96c9-4dad-bfeb-b7bef72f8725') = uuid; # 54963517\n\n\nSELECT * FROM activities WHERE uuid_to_bin('07238011-25fa-418e-838b-fb21e82b9ea2') = uuid; # 54963433\n\nSELECT * FROM activities WHERE uuid_to_bin('d68311e3-ac34-49bd-bf04-88323a7e5352') = uuid; # 54966009\n\n# ****************************************** SF *************************\nSELECT * FROM activities WHERE uuid_to_bin('2bd4cfa3-4eb5-4c77-84a7-9ed46a21c988') = uuid;\n\nselect * from roles;\nselect * from permissions;\nselect * from permission_role where permission_id = 136;\n\nselect * from migrations order by id desc;\n\nselect * from teams where id IN (1, 1037);\nselect * from crm_layouts where crm_configuration_id = 1;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1493;\nSELECT * FROM crm_fields WHERE id IN (1652,1661,66799,66814,66821,66836,66843,66846,66864,84752,182306,323580,380378);\n\nselect * from features;\nselect * from team_features where feature_id = 33;\nselect * from opportunities;\n\nselect * from teams;\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 = 1052 and sa.provider = 'hubspot';\n\nSELECT * FROM accounts where id = 11512582;","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Project","depth":3,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Project","depth":3,"bounds":{"left":0.28224733,"top":1.0,"width":0.024268618,"height":-0.04788506},"on_screen":true,"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},"on_screen":false,"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},"on_screen":false,"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},"on_screen":false,"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},"on_screen":false,"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},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
-3428666155218272246
|
6398094028691354589
|
visual_change
|
accessibility
|
NULL
|
Project: faVsco.js, menu
#12066 on JY-20725-handle Project: faVsco.js, menu
#12066 on JY-20725-handle-HS-search-rate-limit, menu
Start Listening for PHP Debug Connections
HandleHubspotRateLimitTest
Run 'HandleHubspotRateLimitTest'
Debug 'HandleHubspotRateLimitTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
7
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Http\Controllers\Webhook\IntegrationAppSubscriptions;
use Illuminate\Http\JsonResponse;
use Jiminny\Contracts\Crm\Providers;
use Jiminny\Models\Team;
use Jiminny\Services\Crm\IntegrationApp\Service;
use Jiminny\Services\Crm\ProviderRegistry;
trait IntegrationAppTrait
{
abstract protected function getTeamFromRequest(): ?Team;
abstract protected function extractPayload(): array;
private function getPayload(): array
{
$payload = $this->extractPayload();
$this->logger->info('[integration-app] Event received', [
'payload' => $payload,
]);
return $payload;
}
private function extractTargetIdFromPayload(string $targetId): ?string
{
$payload = $this->getPayload();
return $payload[$targetId] ?? null;
}
private function extractTargetObjectIdsFromPayload(string $targetKey): array
{
$payload = $this->getPayload();
$objects = $payload[$targetKey] ?? [];
if (! is_array($objects) || empty($objects)) {
return [];
}
return array_values(array_filter(array_map(
static fn ($object) => is_array($object) ? ($object['id'] ?? null) : null,
$objects
)));
}
private function bootstrapIntegrationApp(Team $team): ?Service
{
$crmProvider = app(ProviderRegistry::class);
$providerName = $team->getCrmConfiguration()->getProviderName();
if (! Providers::isIntegrationAppProvider($providerName)) {
return null;
}
/** @var Service $integrationApp */
$integrationApp = $crmProvider->get($providerName);
$integrationApp->setUser($team->getOwner());
return $integrationApp;
}
private function getTargetCrmProviderId(string $targetKey, string $eventName): ?string
{
$targetId = $this->extractTargetIdFromPayload($targetKey);
$this->logger->info("[integration-app] Event: {$eventName}", [
'targetId' => $targetId,
'targetKey' => $targetKey,
]);
return $targetId;
}
private function getTargetCrmProviderObjectsIds(string $targetKey, string $eventName): array
{
$targetIds = $this->extractTargetObjectIdsFromPayload($targetKey);
$this->logger->info("[integration-app] Event: $eventName", [
'targetIds' => $targetIds,
'targetKey' => $targetKey,
'count' => count($targetIds),
]);
return $targetIds;
}
protected function handleBulkDeletion(string $targetKey, string $fallbackKey, string $eventName): JsonResponse
{
$team = $this->getTeamFromRequest();
if ($team === null) {
return new JsonResponse([], JsonResponse::HTTP_NO_CONTENT);
}
$targetIds = $this->getTargetCrmProviderObjectsIds(targetKey: $targetKey, eventName: $eventName);
if (empty($targetIds)) {
$this->logger->warning('No target IDs found for ' . $eventName);
// fallback to single target ID
$targetId = $this->getTargetCrmProviderId(targetKey: $fallbackKey, eventName: $eventName);
if ($targetId !== null) {
$targetIds[] = $targetId;
}
}
if (empty($targetIds)) {
$this->logger->warning('No target IDs found alter fallback for ' . $eventName);
return new JsonResponse([], JsonResponse::HTTP_BAD_REQUEST);
}
foreach ($targetIds as $targetId) {
$this->deleteTarget(team: $team, targetId: (string) $targetId);
}
return new JsonResponse([], JsonResponse::HTTP_OK);
}
abstract protected function deleteTarget(Team $team, string $targetId): void;
}
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
8
1
3
4
Previous Highlighted Error
Next Highlighted Error
SELECT
# DISTINCT
opp.id as opp_id, opp.uuid, opp.name,
# COUNT(dr.id) AS deal_risk_count,
# dr.id,
# cfd.value,
usr.name AS owner_name,
opp.value, opp.currency_code, opp.close_date, opp.remotely_created_at, opp.is_closed, opp.is_won,
usr.uuid as owner_uuid,
usr.photo_path as owner_photo,
usr.id AS owner_id,
jt.name as owner_job,
opp.stage_id, opp.stage_updated_at,
acc.name AS acc_name, opp.stage_updated_at, acc.crm_provider_id AS acc_provider_id, opp.crm_provider_id AS opp_provider_id,
rt.business_process_id AS pipeline_id
FROM opportunities opp
LEFT JOIN record_types rt ON opp.record_type_id = rt.id
LEFT JOIN users usr ON opp.user_id = usr.id
LEFT JOIN accounts acc ON opp.account_id = acc.id
LEFT JOIN job_titles jt ON usr.job_title_id = jt.id
# LEFT JOIN group_deal_risk_types gdrt ON gdrt.group_id = usr.group_id
# LEFT JOIN deal_risks dr ON dr.opportunity_id = opp.id AND dr.group_deal_risk_type_id = gdrt.id
LEFT JOIN crm_field_data cfd ON (cfd.object_id = opp.id and cfd.crm_field_id = 66814)
WHERE opp.user_id IS NOT NULL
AND opp.deleted_at IS NULL
AND opp.is_closed = 1
AND opp.is_won = 0
AND opp.close_date >= '2024-01-01 00:00:00'
AND opp.close_date <= '2024-12-31 23:59:59'
AND usr.team_id = 1
# and opp.id = 4823179
GROUP BY opp.id, cfd.value
ORDER BY
# cfd.value
CAST(cfd.value AS UNSIGNED)
# owner_name
# (SELECT COUNT(dr.id)
# FROM deal_risks dr
# JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id
# WHERE dr.opportunity_id = opp.id
# AND dr.is_active = 1
# AND gdrt.is_enabled = 1)
DESC
LIMIT 25
# OFFSET 0
;
select * from crm_fields where crm_configuration_id = 1 and object_type = 'opportunity';
select * from crm_layout_entities where crm_layout_id = 1493;
SELECT * FROM opportunities WHERE id = 4584045;
SELECT * FROM crm_field_data WHERE object_id = 4584045;
SELECT * FROM opportunities where team_id = 1 and crm_provider_id = '0061K00000lfb9IQAQ'
SELECT
opp.id as opportunity_id,
opp.name,
COUNT(dr.id) as risk_count
FROM opportunities opp
LEFT JOIN deal_risks dr ON dr.opportunity_id = opp.id
WHERE opp.id IN (
6069574,8900938,9507638,9524799,9660490,9662824,9705675,9749758,4158460,4391812,6450439,4448422,5118945,5590675,4584045,7228149,9002408,9165534,9446720,9641778,9665149,9703344,9709280,5747948,4158491,6182565,6263970,5798120,5111315,4536978,6062352,6548383,6072095,6548225,4480986,5011422,6548381,8760540,8917554,9509986,9514392,9569009,9569011,9578490,9713604,5784397,7276612,7288405,8994421,9118219,9608148,9818911,4510535,6479693,5958049,6271674,6550448,4158331,4158483,6126571,6171615,6540943,4897466,5190896,5796182,5932762,8572433,8723698,8892697,9711001,9789264,4549188,6100831,6170064,6260799,6263653,6449936,6530871,6538978,7777651,8059269,8319918,8787049,8901150,9263153,9453207,9514738,9696700,9791062,5752018,6421452,7439134,7878923,9354763,9369285,9514396,9582506,9889949,9890216,4094311,4158495,4158496,6098128,5585661,3872564,6442149,5891604,6164746,6199593,6583474,6519684,9018490,9809006,4496897,5041324,5829430,6198319,6253504,6555763,7242914,7931055,8024125,8797814,8058559,8673347,8892695,8994420,9616219,9714970,9722004,9809439,9818918,6523177,8134147,9002915,9711422,9892713,9901719,9954210,9978435,5800810,6243518,6416114,6222251,6411974,6512456,5791953,6545606,9914780,5805540,6238986,6463838,6547680,9767049,9809437,9810885,9890855,6673493,9902036,4335521,6379871,6503799,6546077,8018765,9907556,9958433,9905855,9916179,9946741,9957877,5563344,6271838,6450815,7641128,7762567,7780592,8684810,8685786,8685787,8685788
)
GROUP BY opp.id;
SELECT COUNT(dr.id)
FROM deal_risks dr
JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id
WHERE dr.opportunity_id = 5563344
# AND gdrt.group_id = usr.group_id
EXPLAIN SELECT
opp.id as opp_id, opp.uuid, opp.name,
cfd.value,
cfv.sequence,
cfv.value,
# MAX(cfd.value) AS max_cfd_value,
usr.name AS owner_name,
opp.value, opp.currency_code, opp.close_date, opp.remotely_created_at, opp.is_closed, opp.is_won,
usr.uuid as owner_uuid,
usr.photo_path as owner_photo,
usr.id AS owner_id,
jt.name as owner_job,
opp.stage_id, opp.stage_updated_at,
acc.name AS acc_name, opp.stage_updated_at, acc.crm_provider_id AS acc_provider_id, opp.crm_provider_id AS opp_provider_id,
rt.business_process_id AS pipeline_id
FROM opportunities opp
LEFT JOIN record_types rt ON opp.record_type_id = rt.id
LEFT JOIN users usr ON opp.user_id = usr.id
LEFT JOIN accounts acc ON opp.account_id = acc.id
LEFT JOIN job_titles jt ON usr.job_title_id = jt.id
LEFT JOIN crm_field_data cfd ON cfd.id = (SELECT sub_cfd.id
FROM crm_field_data sub_cfd
WHERE sub_cfd.object_id = opp.id
AND sub_cfd.crm_field_id = 66810
ORDER BY sub_cfd.updated_at DESC
LIMIT 1)
LEFT JOIN crm_field_values cfv ON cfv.crm_field_id = 66810 AND cfv.value = cfd.value
WHERE opp.user_id IS NOT NULL
AND opp.deleted_at IS NULL
AND opp.is_closed = 0
# AND opp.is_closed = 1
# AND opp.is_won = 0
AND opp.close_date >= '2024-01-01 00:00:00'
AND opp.close_date <= '2024-12-31 23:59:59'
AND usr.team_id = 1
# and opp.id = 4823179
# GROUP BY opp.id
ORDER BY
cfv.sequence DESC,
# opp.name
# owner_name
cfd.value
# CAST(cfd.value AS UNSIGNED)
# CAST(MAX(cfd.value) AS UNSIGNED)
# (SELECT COUNT(dr.id)
# FROM deal_risks dr
# JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id
# WHERE dr.opportunity_id = opp.id
# AND dr.is_active = 1 AND gdrt.is_enabled = 1)
DESC
# LIMIT 75, 25
;
SELECT * FROM crm_field_values WHERE crm_field_id = 66810;
SELECT f.id, f.crm_provider_id AS field_name, f.label, fd.object_id AS dealId, fd.value, fd.updated_at, fd.id, fd.created_at
FROM crm_fields f
INNER JOIN crm_field_data fd ON fd.crm_field_id = f.id
WHERE (f.crm_configuration_id = 1)
AND (f.object_type = 'opportunity')
# AND (fd.object_id IN (4158331,4158483,4158495,4158496,6069574,6263970,6171615,6540943,6545606,5829430,6198319,6263653,6548381,7242914,8797814,7228149,7439134,7878923,8134147,9002915,9118219,9165534,9354763,9369285,9446720))
AND (fd.object_id IN (4158460))
AND (f.crm_provider_id IN ('ForecastCategoryName'))
ORDER BY fd.object_id ASC, fd.updated_at DESC;
select * from crm_layouts where crm_configuration_id = 1;
select cf.* from crm_fields cf
join crm_layout_entities cle on cf.id = cle.crm_field_id
where crm_layout_id = 1493;
SELECT * FROM opportunities WHERE id = 4158460;
SELECT * FROM crm_field_data WHERE object_id = 4158460;
select * from users where team_id = 1;
SELECT * FROM users WHERE id = 7160;
select * from role_user where user_id = 3248;
select * from crm_field_values where crm_field_id = 66824;
SELECT * FROM users WHERE id = 23470;
select * from crm_configurations;
# [PASSWORD_DOTS]
select * from teams where id = 1038; # 23521, 966
select * from users where team_id = 1038;
select * from crm_configurations where id = 966;
SELECT * FROM activities WHERE uuid_to_bin('e8dc7c34-31f6-4430-bd81-2d9d8f00dd07') = uuid; # 54965762
SELECT * FROM activities WHERE uuid_to_bin('4b5727c0-69d1-428f-b8d9-b649055166e2') = uuid; # 54965764
SELECT * FROM participants WHERE activity_id = 54965764;
SELECT id, uuid, title, recording_state FROM activities WHERE uuid_to_bin('355f105d-5606-4379-b0c5-d91daf59f4ce') = uuid; # 54964075
SELECT * FROM participants WHERE activity_id = 54964075;
select f.id, slug, title, tf.team_id from team_features tf JOIN features f on tf.feature_id = f.id
where tf.team_id = 1038;
# [PASSWORD_DOTS] PD [PASSWORD_DOTS]
select * from teams where id = 1029;
SELECT * FROM crm_configurations WHERE id = 957;
SELECT * FROM activities WHERE uuid_to_bin('581a33cb-4343-44bd-ac0c-4a5cee71c5ec') = uuid; # 54963423
SELECT * FROM activities WHERE uuid_to_bin('07238011-25fa-418e-838b-fb21e82b9ea2') = uuid; # 54963433
SELECT * FROM activities WHERE uuid_to_bin('8b6bb2f7-e7a7-4aec-8806-fbfea7093ccd') = uuid; # 54963421
# [PASSWORD_DOTS] Close [PASSWORD_DOTS]
select * from teams where id = 1031;
SELECT * FROM crm_configurations WHERE id = 959;
SELECT * FROM activities WHERE uuid_to_bin('59c517e0-96c9-4dad-bfeb-b7bef72f8725') = uuid; # 54963517
SELECT * FROM activities WHERE uuid_to_bin('07238011-25fa-418e-838b-fb21e82b9ea2') = uuid; # 54963433
SELECT * FROM activities WHERE uuid_to_bin('d68311e3-ac34-49bd-bf04-88323a7e5352') = uuid; # 54966009
# [PASSWORD_DOTS] SF [PASSWORD_DOTS]
SELECT * FROM activities WHERE uuid_to_bin('2bd4cfa3-4eb5-4c77-84a7-9ed46a21c988') = uuid;
select * from roles;
select * from permissions;
select * from permission_role where permission_id = 136;
select * from migrations order by id desc;
select * from teams where id IN (1, 1037);
select * from crm_layouts where crm_configuration_id = 1;
SELECT * FROM crm_layout_entities WHERE crm_layout_id = 1493;
SELECT * FROM crm_fields WHERE id IN (1652,1661,66799,66814,66821,66836,66843,66846,66864,84752,182306,323580,380378);
select * from features;
select * from team_features where feature_id = 33;
select * from opportunities;
select * from teams;
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 = 1052 and sa.provider = 'hubspot';
SELECT * FROM accounts where id = 11512582;
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide...
|
44474
|
NULL
|
NULL
|
NULL
|
|
44474
|
1610
|
13
|
2026-05-14T13:51:04.152311+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-14/1778 /Users/lukas/.screenpipe/data/data/2026-05-14/1778766664152_m2.jpg...
|
PhpStorm
|
faVsco.js – IntegrationAppTrait.php
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
#12066 on JY-20725-handle Project: faVsco.js, menu
#12066 on JY-20725-handle-HS-search-rate-limit, menu
Start Listening for PHP Debug Connections
HandleHubspotRateLimitTest
Run 'HandleHubspotRateLimitTest'
Debug 'HandleHubspotRateLimitTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"bounds":{"left":0.2962101,"top":1.0,"width":0.03856383,"height":-0.019952059},"on_screen":true,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"#12066 on JY-20725-handle-HS-search-rate-limit, menu","depth":5,"bounds":{"left":0.33477393,"top":1.0,"width":0.122340426,"height":-0.019952059},"on_screen":true,"help_text":"Pull request #12066 exists for current branch JY-20725-handle-HS-search-rate-limit, but local branch is out of sync with remote","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"bounds":{"left":0.5731383,"top":1.0,"width":0.011303191,"height":-0.019952059},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"HandleHubspotRateLimitTest","depth":6,"bounds":{"left":0.5884308,"top":1.0,"width":0.076130316,"height":-0.019952059},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run 'HandleHubspotRateLimitTest'","depth":6,"bounds":{"left":0.66456115,"top":1.0,"width":0.011303191,"height":-0.019952059},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'HandleHubspotRateLimitTest'","depth":6,"bounds":{"left":0.67586434,"top":1.0,"width":0.011303191,"height":-0.019952059},"on_screen":true,"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.6871675,"top":1.0,"width":0.011303191,"height":-0.019952059},"on_screen":true,"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.7150931,"top":1.0,"width":0.011303191,"height":-0.019952059},"on_screen":true,"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.72639626,"top":1.0,"width":0.011303191,"height":-0.019952059},"on_screen":true,"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.73769945,"top":1.0,"width":0.011303191,"height":-0.019952059},"on_screen":true,"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},"on_screen":false,"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},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
2538551741070126236
|
-6979379262290539573
|
app_switch
|
hybrid
|
NULL
|
Project: faVsco.js, menu
#12066 on JY-20725-handle Project: faVsco.js, menu
#12066 on JY-20725-handle-HS-search-rate-limit, menu
Start Listening for PHP Debug Connections
HandleHubspotRateLimitTest
Run 'HandleHubspotRateLimitTest'
Debug 'HandleHubspotRateLimitTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Jiminny...vActivityFilesLater@ jiminny-x-integrati….• plattorm-inner-teamE Channels# ai-chapter# alertsi backend# bugscontusion-cllnia# curiosity lab# engineering# general#jiminny-bgac nlattorm-nckets# product launches# random# releases# sofia-officed sunport# thank-yous# the people of iimi... Direct messages• e 02P. Galya Dimitrovavasil VasilevStefka StoyanovaSg: Todor StamatovMario GeorgieyNiudlay lanay. James Graham "* Stoyan Tanevad Stelivan Georgiev( Petko Kashinski*. Lukas Kovali...::: AnnsToastS lira Gloud6d Huddle with Aneliva AngelovaQ Describe what you are looking for* Aneliya Angelova &• MessagesAdd canvasur FilesTuesdav. April 28thvMonday, May 11thAneliva Angelova 1:24 PMIЛукаш за Huюsлог за синковете вече се изполава тази команла нали?Lukas Kovalik 1:32 PMла коон я пуска поез 5 минAneliya Angelova v 2:30 PMЛукаш, само при Сейлсфорс и Хубспот се синкваха активити типовете, когато се направи плейбук,Hanи?при останалите CRMi трябва рьчно да се въведатLukas Kovalik M 2:47 PNзлрастиами не знам по принцип се вика при всичкитрябва да се за всички. някьле не се ли попълвапри зохо маи оеше nагасоdеа но маи и там си връшаха две категодииAneliya Angelova 4:00 PMЛукаш имаш ли време да се чуем за тестването на [URL_WITH_CREDENTIALS] ...Leave...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
44473
|
1609
|
20
|
2026-05-14T13:51:06.428543+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-14/1778 /Users/lukas/.screenpipe/data/data/2026-05-14/1778766666428_m1.jpg...
|
PhpStorm
|
faVsco.js – IntegrationAppTrait.php
|
1
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
#12066 on JY-20725-handle Project: faVsco.js, menu
#12066 on JY-20725-handle-HS-search-rate-limit, menu
Start Listening for PHP Debug Connections
HandleHubspotRateLimitTest
Run 'HandleHubspotRateLimitTest'
Debug 'HandleHubspotRateLimitTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
7
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Http\Controllers\Webhook\IntegrationAppSubscriptions;
use Illuminate\Http\JsonResponse;
use Jiminny\Contracts\Crm\Providers;
use Jiminny\Models\Team;
use Jiminny\Services\Crm\IntegrationApp\Service;
use Jiminny\Services\Crm\ProviderRegistry;
trait IntegrationAppTrait
{
abstract protected function getTeamFromRequest(): ?Team;
abstract protected function extractPayload(): array;
private function getPayload(): array
{
$payload = $this->extractPayload();
$this->logger->info('[integration-app] Event received', [
'payload' => $payload,
]);
return $payload;
}
private function extractTargetIdFromPayload(string $targetId): ?string
{
$payload = $this->getPayload();
return $payload[$targetId] ?? null;
}
private function extractTargetObjectIdsFromPayload(string $targetKey): array
{
$payload = $this->getPayload();
$objects = $payload[$targetKey] ?? [];
if (! is_array($objects) || empty($objects)) {
return [];
}
return array_values(array_filter(array_map(
static fn ($object) => is_array($object) ? ($object['id'] ?? null) : null,
$objects
)));
}
private function bootstrapIntegrationApp(Team $team): ?Service
{
$crmProvider = app(ProviderRegistry::class);
$providerName = $team->getCrmConfiguration()->getProviderName();
if (! Providers::isIntegrationAppProvider($providerName)) {
return null;
}
/** @var Service $integrationApp */
$integrationApp = $crmProvider->get($providerName);
$integrationApp->setUser($team->getOwner());
return $integrationApp;
}
private function getTargetCrmProviderId(string $targetKey, string $eventName): ?string
{
$targetId = $this->extractTargetIdFromPayload($targetKey);
$this->logger->info("[integration-app] Event: {$eventName}", [
'targetId' => $targetId,
'targetKey' => $targetKey,
]);
return $targetId;
}
private function getTargetCrmProviderObjectsIds(string $targetKey, string $eventName): array
{
$targetIds = $this->extractTargetObjectIdsFromPayload($targetKey);
$this->logger->info("[integration-app] Event: $eventName", [
'targetIds' => $targetIds,
'targetKey' => $targetKey,
'count' => count($targetIds),
]);
return $targetIds;
}
protected function handleBulkDeletion(string $targetKey, string $fallbackKey, string $eventName): JsonResponse
{
$team = $this->getTeamFromRequest();
if ($team === null) {
return new JsonResponse([], JsonResponse::HTTP_NO_CONTENT);
}
$targetIds = $this->getTargetCrmProviderObjectsIds(targetKey: $targetKey, eventName: $eventName);
if (empty($targetIds)) {
$this->logger->warning('No target IDs found for ' . $eventName);
// fallback to single target ID
$targetId = $this->getTargetCrmProviderId(targetKey: $fallbackKey, eventName: $eventName);
if ($targetId !== null) {
$targetIds[] = $targetId;
}
}
if (empty($targetIds)) {
$this->logger->warning('No target IDs found alter fallback for ' . $eventName);
return new JsonResponse([], JsonResponse::HTTP_BAD_REQUEST);
}
foreach ($targetIds as $targetId) {
$this->deleteTarget(team: $team, targetId: (string) $targetId);
}
return new JsonResponse([], JsonResponse::HTTP_OK);
}
abstract protected function deleteTarget(Team $team, string $targetId): void;
}
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
8
1
3
4
Previous Highlighted Error
Next Highlighted Error
SELECT
# DISTINCT
opp.id as opp_id, opp.uuid, opp.name,
# COUNT(dr.id) AS deal_risk_count,
# dr.id,
# cfd.value,
usr.name AS owner_name,
opp.value, opp.currency_code, opp.close_date, opp.remotely_created_at, opp.is_closed, opp.is_won,
usr.uuid as owner_uuid,
usr.photo_path as owner_photo,
usr.id AS owner_id,
jt.name as owner_job,
opp.stage_id, opp.stage_updated_at,
acc.name AS acc_name, opp.stage_updated_at, acc.crm_provider_id AS acc_provider_id, opp.crm_provider_id AS opp_provider_id,
rt.business_process_id AS pipeline_id
FROM opportunities opp
LEFT JOIN record_types rt ON opp.record_type_id = rt.id
LEFT JOIN users usr ON opp.user_id = usr.id
LEFT JOIN accounts acc ON opp.account_id = acc.id
LEFT JOIN job_titles jt ON usr.job_title_id = jt.id
# LEFT JOIN group_deal_risk_types gdrt ON gdrt.group_id = usr.group_id
# LEFT JOIN deal_risks dr ON dr.opportunity_id = opp.id AND dr.group_deal_risk_type_id = gdrt.id
LEFT JOIN crm_field_data cfd ON (cfd.object_id = opp.id and cfd.crm_field_id = 66814)
WHERE opp.user_id IS NOT NULL
AND opp.deleted_at IS NULL
AND opp.is_closed = 1
AND opp.is_won = 0
AND opp.close_date >= '2024-01-01 00:00:00'
AND opp.close_date <= '2024-12-31 23:59:59'
AND usr.team_id = 1
# and opp.id = 4823179
GROUP BY opp.id, cfd.value
ORDER BY
# cfd.value
CAST(cfd.value AS UNSIGNED)
# owner_name
# (SELECT COUNT(dr.id)
# FROM deal_risks dr
# JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id
# WHERE dr.opportunity_id = opp.id
# AND dr.is_active = 1
# AND gdrt.is_enabled = 1)
DESC
LIMIT 25
# OFFSET 0
;
select * from crm_fields where crm_configuration_id = 1 and object_type = 'opportunity';
select * from crm_layout_entities where crm_layout_id = 1493;
SELECT * FROM opportunities WHERE id = 4584045;
SELECT * FROM crm_field_data WHERE object_id = 4584045;
SELECT * FROM opportunities where team_id = 1 and crm_provider_id = '0061K00000lfb9IQAQ'
SELECT
opp.id as opportunity_id,
opp.name,
COUNT(dr.id) as risk_count
FROM opportunities opp
LEFT JOIN deal_risks dr ON dr.opportunity_id = opp.id
WHERE opp.id IN (
6069574,8900938,9507638,9524799,9660490,9662824,9705675,9749758,4158460,4391812,6450439,4448422,5118945,5590675,4584045,7228149,9002408,9165534,9446720,9641778,9665149,9703344,9709280,5747948,4158491,6182565,6263970,5798120,5111315,4536978,6062352,6548383,6072095,6548225,4480986,5011422,6548381,8760540,8917554,9509986,9514392,9569009,9569011,9578490,9713604,5784397,7276612,7288405,8994421,9118219,9608148,9818911,4510535,6479693,5958049,6271674,6550448,4158331,4158483,6126571,6171615,6540943,4897466,5190896,5796182,5932762,8572433,8723698,8892697,9711001,9789264,4549188,6100831,6170064,6260799,6263653,6449936,6530871,6538978,7777651,8059269,8319918,8787049,8901150,9263153,9453207,9514738,9696700,9791062,5752018,6421452,7439134,7878923,9354763,9369285,9514396,9582506,9889949,9890216,4094311,4158495,4158496,6098128,5585661,3872564,6442149,5891604,6164746,6199593,6583474,6519684,9018490,9809006,4496897,5041324,5829430,6198319,6253504,6555763,7242914,7931055,8024125,8797814,8058559,8673347,8892695,8994420,9616219,9714970,9722004,9809439,9818918,6523177,8134147,9002915,9711422,9892713,9901719,9954210,9978435,5800810,6243518,6416114,6222251,6411974,6512456,5791953,6545606,9914780,5805540,6238986,6463838,6547680,9767049,9809437,9810885,9890855,6673493,9902036,4335521,6379871,6503799,6546077,8018765,9907556,9958433,9905855,9916179,9946741,9957877,5563344,6271838,6450815,7641128,7762567,7780592,8684810,8685786,8685787,8685788
)
GROUP BY opp.id;
SELECT COUNT(dr.id)
FROM deal_risks dr
JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id
WHERE dr.opportunity_id = 5563344
# AND gdrt.group_id = usr.group_id
EXPLAIN SELECT
opp.id as opp_id, opp.uuid, opp.name,
cfd.value,
cfv.sequence,
cfv.value,
# MAX(cfd.value) AS max_cfd_value,
usr.name AS owner_name,
opp.value, opp.currency_code, opp.close_date, opp.remotely_created_at, opp.is_closed, opp.is_won,
usr.uuid as owner_uuid,
usr.photo_path as owner_photo,
usr.id AS owner_id,
jt.name as owner_job,
opp.stage_id, opp.stage_updated_at,
acc.name AS acc_name, opp.stage_updated_at, acc.crm_provider_id AS acc_provider_id, opp.crm_provider_id AS opp_provider_id,
rt.business_process_id AS pipeline_id
FROM opportunities opp
LEFT JOIN record_types rt ON opp.record_type_id = rt.id
LEFT JOIN users usr ON opp.user_id = usr.id
LEFT JOIN accounts acc ON opp.account_id = acc.id
LEFT JOIN job_titles jt ON usr.job_title_id = jt.id
LEFT JOIN crm_field_data cfd ON cfd.id = (SELECT sub_cfd.id
FROM crm_field_data sub_cfd
WHERE sub_cfd.object_id = opp.id
AND sub_cfd.crm_field_id = 66810
ORDER BY sub_cfd.updated_at DESC
LIMIT 1)
LEFT JOIN crm_field_values cfv ON cfv.crm_field_id = 66810 AND cfv.value = cfd.value
WHERE opp.user_id IS NOT NULL
AND opp.deleted_at IS NULL
AND opp.is_closed = 0
# AND opp.is_closed = 1
# AND opp.is_won = 0
AND opp.close_date >= '2024-01-01 00:00:00'
AND opp.close_date <= '2024-12-31 23:59:59'
AND usr.team_id = 1
# and opp.id = 4823179
# GROUP BY opp.id
ORDER BY
cfv.sequence DESC,
# opp.name
# owner_name
cfd.value
# CAST(cfd.value AS UNSIGNED)
# CAST(MAX(cfd.value) AS UNSIGNED)
# (SELECT COUNT(dr.id)
# FROM deal_risks dr
# JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id
# WHERE dr.opportunity_id = opp.id
# AND dr.is_active = 1 AND gdrt.is_enabled = 1)
DESC
# LIMIT 75, 25
;
SELECT * FROM crm_field_values WHERE crm_field_id = 66810;
SELECT f.id, f.crm_provider_id AS field_name, f.label, fd.object_id AS dealId, fd.value, fd.updated_at, fd.id, fd.created_at
FROM crm_fields f
INNER JOIN crm_field_data fd ON fd.crm_field_id = f.id
WHERE (f.crm_configuration_id = 1)
AND (f.object_type = 'opportunity')
# AND (fd.object_id IN (4158331,4158483,4158495,4158496,6069574,6263970,6171615,6540943,6545606,5829430,6198319,6263653,6548381,7242914,8797814,7228149,7439134,7878923,8134147,9002915,9118219,9165534,9354763,9369285,9446720))
AND (fd.object_id IN (4158460))
AND (f.crm_provider_id IN ('ForecastCategoryName'))
ORDER BY fd.object_id ASC, fd.updated_at DESC;
select * from crm_layouts where crm_configuration_id = 1;
select cf.* from crm_fields cf
join crm_layout_entities cle on cf.id = cle.crm_field_id
where crm_layout_id = 1493;
SELECT * FROM opportunities WHERE id = 4158460;
SELECT * FROM crm_field_data WHERE object_id = 4158460;
select * from users where team_id = 1;
SELECT * FROM users WHERE id = 7160;
select * from role_user where user_id = 3248;
select * from crm_field_values where crm_field_id = 66824;
SELECT * FROM users WHERE id = 23470;
select * from crm_configurations;
# [PASSWORD_DOTS]
select * from teams where id = 1038; # 23521, 966
select * from users where team_id = 1038;
select * from crm_configurations where id = 966;
SELECT * FROM activities WHERE uuid_to_bin('e8dc7c34-31f6-4430-bd81-2d9d8f00dd07') = uuid; # 54965762
SELECT * FROM activities WHERE uuid_to_bin('4b5727c0-69d1-428f-b8d9-b649055166e2') = uuid; # 54965764
SELECT * FROM participants WHERE activity_id = 54965764;
SELECT id, uuid, title, recording_state FROM activities WHERE uuid_to_bin('355f105d-5606-4379-b0c5-d91daf59f4ce') = uuid; # 54964075
SELECT * FROM participants WHERE activity_id = 54964075;
select f.id, slug, title, tf.team_id from team_features tf JOIN features f on tf.feature_id = f.id
where tf.team_id = 1038;
# [PASSWORD_DOTS] PD [PASSWORD_DOTS]
select * from teams where id = 1029;
SELECT * FROM crm_configurations WHERE id = 957;
SELECT * FROM activities WHERE uuid_to_bin('581a33cb-4343-44bd-ac0c-4a5cee71c5ec') = uuid; # 54963423
SELECT * FROM activities WHERE uuid_to_bin('07238011-25fa-418e-838b-fb21e82b9ea2') = uuid; # 54963433
SELECT * FROM activities WHERE uuid_to_bin('8b6bb2f7-e7a7-4aec-8806-fbfea7093ccd') = uuid; # 54963421
# [PASSWORD_DOTS] Close [PASSWORD_DOTS]
select * from teams where id = 1031;
SELECT * FROM crm_configurations WHERE id = 959;
SELECT * FROM activities WHERE uuid_to_bin('59c517e0-96c9-4dad-bfeb-b7bef72f8725') = uuid; # 54963517
SELECT * FROM activities WHERE uuid_to_bin('07238011-25fa-418e-838b-fb21e82b9ea2') = uuid; # 54963433
SELECT * FROM activities WHERE uuid_to_bin('d68311e3-ac34-49bd-bf04-88323a7e5352') = uuid; # 54966009
# [PASSWORD_DOTS] SF [PASSWORD_DOTS]
SELECT * FROM activities WHERE uuid_to_bin('2bd4cfa3-4eb5-4c77-84a7-9ed46a21c988') = uuid;
select * from roles;
select * from permissions;
select * from permission_role where permission_id = 136;
select * from migrations order by id desc;
select * from teams where id IN (1, 1037);
select * from crm_layouts where crm_configuration_id = 1;
SELECT * FROM crm_layout_entities WHERE crm_layout_id = 1493;
SELECT * FROM crm_fields WHERE id IN (1652,1661,66799,66814,66821,66836,66843,66846,66864,84752,182306,323580,380378);
select * from features;
select * from team_features where feature_id = 33;
select * from opportunities;
select * from teams;
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 = 1052 and sa.provider = 'hubspot';
SELECT * FROM accounts where id = 11512582;
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.054166667,"top":0.027777778,"width":0.08055556,"height":0.035555556},"on_screen":true,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"#12066 on JY-20725-handle-HS-search-rate-limit, menu","depth":5,"bounds":{"left":0.13472222,"top":0.027777778,"width":0.25555557,"height":0.035555556},"on_screen":true,"help_text":"Pull request #12066 exists for current branch JY-20725-handle-HS-search-rate-limit, but local branch is out of sync with remote","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"bounds":{"left":0.6326389,"top":0.027777778,"width":0.023611112,"height":0.035555556},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"HandleHubspotRateLimitTest","depth":6,"bounds":{"left":0.6645833,"top":0.027777778,"width":0.15902779,"height":0.035555556},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run 'HandleHubspotRateLimitTest'","depth":6,"bounds":{"left":0.82361114,"top":0.027777778,"width":0.023611112,"height":0.035555556},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'HandleHubspotRateLimitTest'","depth":6,"bounds":{"left":0.8472222,"top":0.027777778,"width":0.023611112,"height":0.035555556},"on_screen":true,"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.87083334,"top":0.027777778,"width":0.023611112,"height":0.035555556},"on_screen":true,"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.9291667,"top":0.027777778,"width":0.023611112,"height":0.035555556},"on_screen":true,"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.9527778,"top":0.027777778,"width":0.023611112,"height":0.035555556},"on_screen":true,"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.9763889,"top":0.027777778,"width":0.023611112,"height":0.035555556},"on_screen":true,"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},"on_screen":false,"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},"on_screen":false,"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},"on_screen":false,"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},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"7","depth":4,"bounds":{"left":0.6701389,"top":0.3122222,"width":0.015972223,"height":0.02111111},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.68958336,"top":0.31,"width":0.015277778,"height":0.025555555},"on_screen":true,"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.7048611,"top":0.31,"width":0.014583333,"height":0.025555555},"on_screen":true,"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\\Webhook\\IntegrationAppSubscriptions;\n\nuse Illuminate\\Http\\JsonResponse;\nuse Jiminny\\Contracts\\Crm\\Providers;\nuse Jiminny\\Models\\Team;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\Service;\nuse Jiminny\\Services\\Crm\\ProviderRegistry;\n\ntrait IntegrationAppTrait\n{\n abstract protected function getTeamFromRequest(): ?Team;\n\n abstract protected function extractPayload(): array;\n\n private function getPayload(): array\n {\n $payload = $this->extractPayload();\n $this->logger->info('[integration-app] Event received', [\n 'payload' => $payload,\n ]);\n\n return $payload;\n }\n\n private function extractTargetIdFromPayload(string $targetId): ?string\n {\n $payload = $this->getPayload();\n\n return $payload[$targetId] ?? null;\n }\n\n private function extractTargetObjectIdsFromPayload(string $targetKey): array\n {\n $payload = $this->getPayload();\n\n $objects = $payload[$targetKey] ?? [];\n\n if (! is_array($objects) || empty($objects)) {\n return [];\n }\n\n return array_values(array_filter(array_map(\n static fn ($object) => is_array($object) ? ($object['id'] ?? null) : null,\n $objects\n )));\n }\n\n private function bootstrapIntegrationApp(Team $team): ?Service\n {\n $crmProvider = app(ProviderRegistry::class);\n\n $providerName = $team->getCrmConfiguration()->getProviderName();\n if (! Providers::isIntegrationAppProvider($providerName)) {\n return null;\n }\n\n /** @var Service $integrationApp */\n $integrationApp = $crmProvider->get($providerName);\n $integrationApp->setUser($team->getOwner());\n\n return $integrationApp;\n }\n\n private function getTargetCrmProviderId(string $targetKey, string $eventName): ?string\n {\n $targetId = $this->extractTargetIdFromPayload($targetKey);\n $this->logger->info(\"[integration-app] Event: {$eventName}\", [\n 'targetId' => $targetId,\n 'targetKey' => $targetKey,\n ]);\n\n return $targetId;\n }\n\n private function getTargetCrmProviderObjectsIds(string $targetKey, string $eventName): array\n {\n $targetIds = $this->extractTargetObjectIdsFromPayload($targetKey);\n $this->logger->info(\"[integration-app] Event: $eventName\", [\n 'targetIds' => $targetIds,\n 'targetKey' => $targetKey,\n 'count' => count($targetIds),\n ]);\n\n return $targetIds;\n }\n\n protected function handleBulkDeletion(string $targetKey, string $fallbackKey, string $eventName): JsonResponse\n {\n $team = $this->getTeamFromRequest();\n\n if ($team === null) {\n return new JsonResponse([], JsonResponse::HTTP_NO_CONTENT);\n }\n\n $targetIds = $this->getTargetCrmProviderObjectsIds(targetKey: $targetKey, eventName: $eventName);\n\n if (empty($targetIds)) {\n $this->logger->warning('No target IDs found for ' . $eventName);\n\n // fallback to single target ID\n $targetId = $this->getTargetCrmProviderId(targetKey: $fallbackKey, eventName: $eventName);\n\n if ($targetId !== null) {\n $targetIds[] = $targetId;\n }\n }\n\n if (empty($targetIds)) {\n $this->logger->warning('No target IDs found alter fallback for ' . $eventName);\n\n return new JsonResponse([], JsonResponse::HTTP_BAD_REQUEST);\n }\n\n foreach ($targetIds as $targetId) {\n $this->deleteTarget(team: $team, targetId: (string) $targetId);\n }\n\n return new JsonResponse([], JsonResponse::HTTP_OK);\n }\n\n abstract protected function deleteTarget(Team $team, string $targetId): void;\n}","depth":4,"on_screen":true,"value":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Http\\Controllers\\Webhook\\IntegrationAppSubscriptions;\n\nuse Illuminate\\Http\\JsonResponse;\nuse Jiminny\\Contracts\\Crm\\Providers;\nuse Jiminny\\Models\\Team;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\Service;\nuse Jiminny\\Services\\Crm\\ProviderRegistry;\n\ntrait IntegrationAppTrait\n{\n abstract protected function getTeamFromRequest(): ?Team;\n\n abstract protected function extractPayload(): array;\n\n private function getPayload(): array\n {\n $payload = $this->extractPayload();\n $this->logger->info('[integration-app] Event received', [\n 'payload' => $payload,\n ]);\n\n return $payload;\n }\n\n private function extractTargetIdFromPayload(string $targetId): ?string\n {\n $payload = $this->getPayload();\n\n return $payload[$targetId] ?? null;\n }\n\n private function extractTargetObjectIdsFromPayload(string $targetKey): array\n {\n $payload = $this->getPayload();\n\n $objects = $payload[$targetKey] ?? [];\n\n if (! is_array($objects) || empty($objects)) {\n return [];\n }\n\n return array_values(array_filter(array_map(\n static fn ($object) => is_array($object) ? ($object['id'] ?? null) : null,\n $objects\n )));\n }\n\n private function bootstrapIntegrationApp(Team $team): ?Service\n {\n $crmProvider = app(ProviderRegistry::class);\n\n $providerName = $team->getCrmConfiguration()->getProviderName();\n if (! Providers::isIntegrationAppProvider($providerName)) {\n return null;\n }\n\n /** @var Service $integrationApp */\n $integrationApp = $crmProvider->get($providerName);\n $integrationApp->setUser($team->getOwner());\n\n return $integrationApp;\n }\n\n private function getTargetCrmProviderId(string $targetKey, string $eventName): ?string\n {\n $targetId = $this->extractTargetIdFromPayload($targetKey);\n $this->logger->info(\"[integration-app] Event: {$eventName}\", [\n 'targetId' => $targetId,\n 'targetKey' => $targetKey,\n ]);\n\n return $targetId;\n }\n\n private function getTargetCrmProviderObjectsIds(string $targetKey, string $eventName): array\n {\n $targetIds = $this->extractTargetObjectIdsFromPayload($targetKey);\n $this->logger->info(\"[integration-app] Event: $eventName\", [\n 'targetIds' => $targetIds,\n 'targetKey' => $targetKey,\n 'count' => count($targetIds),\n ]);\n\n return $targetIds;\n }\n\n protected function handleBulkDeletion(string $targetKey, string $fallbackKey, string $eventName): JsonResponse\n {\n $team = $this->getTeamFromRequest();\n\n if ($team === null) {\n return new JsonResponse([], JsonResponse::HTTP_NO_CONTENT);\n }\n\n $targetIds = $this->getTargetCrmProviderObjectsIds(targetKey: $targetKey, eventName: $eventName);\n\n if (empty($targetIds)) {\n $this->logger->warning('No target IDs found for ' . $eventName);\n\n // fallback to single target ID\n $targetId = $this->getTargetCrmProviderId(targetKey: $fallbackKey, eventName: $eventName);\n\n if ($targetId !== null) {\n $targetIds[] = $targetId;\n }\n }\n\n if (empty($targetIds)) {\n $this->logger->warning('No target IDs found alter fallback for ' . $eventName);\n\n return new JsonResponse([], JsonResponse::HTTP_BAD_REQUEST);\n }\n\n foreach ($targetIds as $targetId) {\n $this->deleteTarget(team: $team, targetId: (string) $targetId);\n }\n\n return new JsonResponse([], JsonResponse::HTTP_OK);\n }\n\n abstract protected function deleteTarget(Team $team, string $targetId): void;\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.72291666,"top":0.24111111,"width":0.018055556,"height":0.026666667},"on_screen":true,"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.7409722,"top":0.24111111,"width":0.018055556,"height":0.026666667},"on_screen":true,"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.7638889,"top":0.24111111,"width":0.018055556,"height":0.026666667},"on_screen":true,"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.78194445,"top":0.24111111,"width":0.018055556,"height":0.026666667},"on_screen":true,"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.8,"top":0.24111111,"width":0.018055556,"height":0.026666667},"on_screen":true,"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.8229167,"top":0.24111111,"width":0.018055556,"height":0.026666667},"on_screen":true,"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.84583336,"top":0.24111111,"width":0.050694443,"height":0.026666667},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Cancel Running Statements","depth":4,"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Playground","depth":4,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"jiminny","depth":4,"bounds":{"left":0.9138889,"top":0.24111111,"width":0.059027776,"height":0.026666667},"on_screen":true,"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},"on_screen":false,"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},"on_screen":false,"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},"on_screen":false,"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},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"8","depth":4,"bounds":{"left":0.8645833,"top":0.27555555,"width":0.016666668,"height":0.02111111},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"1","depth":4,"bounds":{"left":0.8854167,"top":0.27555555,"width":0.015277778,"height":0.02111111},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"3","depth":4,"bounds":{"left":0.9048611,"top":0.27555555,"width":0.016666668,"height":0.02111111},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"4","depth":4,"bounds":{"left":0.92569447,"top":0.27555555,"width":0.016666668,"height":0.02111111},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.9458333,"top":0.27333334,"width":0.015277778,"height":0.025555555},"on_screen":true,"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.9611111,"top":0.27333334,"width":0.014583333,"height":0.025555555},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"SELECT\n# DISTINCT\nopp.id as opp_id, opp.uuid, opp.name,\n# COUNT(dr.id) AS deal_risk_count,\n\n# dr.id,\n# cfd.value,\nusr.name AS owner_name,\nopp.value, opp.currency_code, opp.close_date, opp.remotely_created_at, opp.is_closed, opp.is_won,\nusr.uuid as owner_uuid,\nusr.photo_path as owner_photo,\nusr.id AS owner_id,\njt.name as owner_job,\nopp.stage_id, opp.stage_updated_at,\nacc.name AS acc_name, opp.stage_updated_at, acc.crm_provider_id AS acc_provider_id, opp.crm_provider_id AS opp_provider_id,\nrt.business_process_id AS pipeline_id\nFROM opportunities opp\nLEFT JOIN record_types rt ON opp.record_type_id = rt.id\nLEFT JOIN users usr ON opp.user_id = usr.id\nLEFT JOIN accounts acc ON opp.account_id = acc.id\nLEFT JOIN job_titles jt ON usr.job_title_id = jt.id\n\n# LEFT JOIN group_deal_risk_types gdrt ON gdrt.group_id = usr.group_id\n# LEFT JOIN deal_risks dr ON dr.opportunity_id = opp.id AND dr.group_deal_risk_type_id = gdrt.id\n\nLEFT JOIN crm_field_data cfd ON (cfd.object_id = opp.id and cfd.crm_field_id = 66814)\n\nWHERE opp.user_id IS NOT NULL\nAND opp.deleted_at IS NULL\nAND opp.is_closed = 1\nAND opp.is_won = 0\nAND opp.close_date >= '2024-01-01 00:00:00'\nAND opp.close_date <= '2024-12-31 23:59:59'\nAND usr.team_id = 1\n\n# and opp.id = 4823179\n\nGROUP BY opp.id, cfd.value\nORDER BY\n# cfd.value\n CAST(cfd.value AS UNSIGNED)\n# owner_name\n# (SELECT COUNT(dr.id)\n# FROM deal_risks dr\n# JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id\n# WHERE dr.opportunity_id = opp.id\n# AND dr.is_active = 1\n# AND gdrt.is_enabled = 1)\nDESC\nLIMIT 25\n# OFFSET 0\n;\n\nselect * from crm_fields where crm_configuration_id = 1 and object_type = 'opportunity';\nselect * from crm_layout_entities where crm_layout_id = 1493;\n\nSELECT * FROM opportunities WHERE id = 4584045;\nSELECT * FROM crm_field_data WHERE object_id = 4584045;\n\nSELECT * FROM opportunities where team_id = 1 and crm_provider_id = '0061K00000lfb9IQAQ'\n\nSELECT\n opp.id as opportunity_id,\n opp.name,\n COUNT(dr.id) as risk_count\nFROM opportunities opp\nLEFT JOIN deal_risks dr ON dr.opportunity_id = opp.id\nWHERE opp.id IN (\n 6069574,8900938,9507638,9524799,9660490,9662824,9705675,9749758,4158460,4391812,6450439,4448422,5118945,5590675,4584045,7228149,9002408,9165534,9446720,9641778,9665149,9703344,9709280,5747948,4158491,6182565,6263970,5798120,5111315,4536978,6062352,6548383,6072095,6548225,4480986,5011422,6548381,8760540,8917554,9509986,9514392,9569009,9569011,9578490,9713604,5784397,7276612,7288405,8994421,9118219,9608148,9818911,4510535,6479693,5958049,6271674,6550448,4158331,4158483,6126571,6171615,6540943,4897466,5190896,5796182,5932762,8572433,8723698,8892697,9711001,9789264,4549188,6100831,6170064,6260799,6263653,6449936,6530871,6538978,7777651,8059269,8319918,8787049,8901150,9263153,9453207,9514738,9696700,9791062,5752018,6421452,7439134,7878923,9354763,9369285,9514396,9582506,9889949,9890216,4094311,4158495,4158496,6098128,5585661,3872564,6442149,5891604,6164746,6199593,6583474,6519684,9018490,9809006,4496897,5041324,5829430,6198319,6253504,6555763,7242914,7931055,8024125,8797814,8058559,8673347,8892695,8994420,9616219,9714970,9722004,9809439,9818918,6523177,8134147,9002915,9711422,9892713,9901719,9954210,9978435,5800810,6243518,6416114,6222251,6411974,6512456,5791953,6545606,9914780,5805540,6238986,6463838,6547680,9767049,9809437,9810885,9890855,6673493,9902036,4335521,6379871,6503799,6546077,8018765,9907556,9958433,9905855,9916179,9946741,9957877,5563344,6271838,6450815,7641128,7762567,7780592,8684810,8685786,8685787,8685788\n)\nGROUP BY opp.id;\n\nSELECT COUNT(dr.id)\n FROM deal_risks dr\n JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id\n WHERE dr.opportunity_id = 5563344\n# AND gdrt.group_id = usr.group_id\n\n\n\nEXPLAIN SELECT\n opp.id as opp_id, opp.uuid, opp.name,\n\ncfd.value,\ncfv.sequence,\ncfv.value,\n# MAX(cfd.value) AS max_cfd_value,\nusr.name AS owner_name,\nopp.value, opp.currency_code, opp.close_date, opp.remotely_created_at, opp.is_closed, opp.is_won,\nusr.uuid as owner_uuid,\nusr.photo_path as owner_photo,\nusr.id AS owner_id,\njt.name as owner_job,\nopp.stage_id, opp.stage_updated_at,\nacc.name AS acc_name, opp.stage_updated_at, acc.crm_provider_id AS acc_provider_id, opp.crm_provider_id AS opp_provider_id,\nrt.business_process_id AS pipeline_id\nFROM opportunities opp\n\nLEFT JOIN record_types rt ON opp.record_type_id = rt.id\nLEFT JOIN users usr ON opp.user_id = usr.id\nLEFT JOIN accounts acc ON opp.account_id = acc.id\nLEFT JOIN job_titles jt ON usr.job_title_id = jt.id\n\nLEFT JOIN crm_field_data cfd ON cfd.id = (SELECT sub_cfd.id\n FROM crm_field_data sub_cfd\n WHERE sub_cfd.object_id = opp.id\n AND sub_cfd.crm_field_id = 66810\n ORDER BY sub_cfd.updated_at DESC\n LIMIT 1)\n\nLEFT JOIN crm_field_values cfv ON cfv.crm_field_id = 66810 AND cfv.value = cfd.value\n\nWHERE opp.user_id IS NOT NULL\nAND opp.deleted_at IS NULL\nAND opp.is_closed = 0\n# AND opp.is_closed = 1\n# AND opp.is_won = 0\nAND opp.close_date >= '2024-01-01 00:00:00'\nAND opp.close_date <= '2024-12-31 23:59:59'\nAND usr.team_id = 1\n\n# and opp.id = 4823179\n\n# GROUP BY opp.id\nORDER BY\n cfv.sequence DESC,\n# opp.name\n# owner_name\n cfd.value\n# CAST(cfd.value AS UNSIGNED)\n# CAST(MAX(cfd.value) AS UNSIGNED)\n# (SELECT COUNT(dr.id)\n# FROM deal_risks dr\n# JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id\n# WHERE dr.opportunity_id = opp.id\n# AND dr.is_active = 1 AND gdrt.is_enabled = 1)\nDESC\n# LIMIT 75, 25\n;\n\n\n\nSELECT * FROM crm_field_values WHERE crm_field_id = 66810;\n\nSELECT f.id, f.crm_provider_id AS field_name, f.label, fd.object_id AS dealId, fd.value, fd.updated_at, fd.id, fd.created_at\nFROM crm_fields f\nINNER JOIN crm_field_data fd ON fd.crm_field_id = f.id\n WHERE (f.crm_configuration_id = 1)\n AND (f.object_type = 'opportunity')\n# AND (fd.object_id IN (4158331,4158483,4158495,4158496,6069574,6263970,6171615,6540943,6545606,5829430,6198319,6263653,6548381,7242914,8797814,7228149,7439134,7878923,8134147,9002915,9118219,9165534,9354763,9369285,9446720))\n AND (fd.object_id IN (4158460))\n AND (f.crm_provider_id IN ('ForecastCategoryName'))\n ORDER BY fd.object_id ASC, fd.updated_at DESC;\n\nselect * from crm_layouts where crm_configuration_id = 1;\nselect cf.* from crm_fields cf\njoin crm_layout_entities cle on cf.id = cle.crm_field_id\nwhere crm_layout_id = 1493;\n\nSELECT * FROM opportunities WHERE id = 4158460;\nSELECT * FROM crm_field_data WHERE object_id = 4158460;\n\nselect * from users where team_id = 1;\nSELECT * FROM users WHERE id = 7160;\nselect * from role_user where user_id = 3248;\n\nselect * from crm_field_values where crm_field_id = 66824;\n\nSELECT * FROM users WHERE id = 23470;\nselect * from crm_configurations;\n\n# ******************************************\nselect * from teams where id = 1038; # 23521, 966\nselect * from users where team_id = 1038;\nselect * from crm_configurations where id = 966;\nSELECT * FROM activities WHERE uuid_to_bin('e8dc7c34-31f6-4430-bd81-2d9d8f00dd07') = uuid; # 54965762\nSELECT * FROM activities WHERE uuid_to_bin('4b5727c0-69d1-428f-b8d9-b649055166e2') = uuid; # 54965764\nSELECT * FROM participants WHERE activity_id = 54965764;\n\nSELECT id, uuid, title, recording_state FROM activities WHERE uuid_to_bin('355f105d-5606-4379-b0c5-d91daf59f4ce') = uuid; # 54964075\nSELECT * FROM participants WHERE activity_id = 54964075;\nselect f.id, slug, title, tf.team_id from team_features tf JOIN features f on tf.feature_id = f.id\n where tf.team_id = 1038;\n\n\n# ****************************************** PD *************************\nselect * from teams where id = 1029;\nSELECT * FROM crm_configurations WHERE id = 957;\nSELECT * FROM activities WHERE uuid_to_bin('581a33cb-4343-44bd-ac0c-4a5cee71c5ec') = uuid; # 54963423\nSELECT * FROM activities WHERE uuid_to_bin('07238011-25fa-418e-838b-fb21e82b9ea2') = uuid; # 54963433\n\nSELECT * FROM activities WHERE uuid_to_bin('8b6bb2f7-e7a7-4aec-8806-fbfea7093ccd') = uuid; # 54963421\n\n# ****************************************** Close *************************\nselect * from teams where id = 1031;\nSELECT * FROM crm_configurations WHERE id = 959;\nSELECT * FROM activities WHERE uuid_to_bin('59c517e0-96c9-4dad-bfeb-b7bef72f8725') = uuid; # 54963517\n\n\nSELECT * FROM activities WHERE uuid_to_bin('07238011-25fa-418e-838b-fb21e82b9ea2') = uuid; # 54963433\n\nSELECT * FROM activities WHERE uuid_to_bin('d68311e3-ac34-49bd-bf04-88323a7e5352') = uuid; # 54966009\n\n# ****************************************** SF *************************\nSELECT * FROM activities WHERE uuid_to_bin('2bd4cfa3-4eb5-4c77-84a7-9ed46a21c988') = uuid;\n\nselect * from roles;\nselect * from permissions;\nselect * from permission_role where permission_id = 136;\n\nselect * from migrations order by id desc;\n\nselect * from teams where id IN (1, 1037);\nselect * from crm_layouts where crm_configuration_id = 1;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1493;\nSELECT * FROM crm_fields WHERE id IN (1652,1661,66799,66814,66821,66836,66843,66846,66864,84752,182306,323580,380378);\n\nselect * from features;\nselect * from team_features where feature_id = 33;\nselect * from opportunities;\n\nselect * from teams;\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 = 1052 and sa.provider = 'hubspot';\n\nSELECT * FROM accounts where id = 11512582;","depth":4,"on_screen":true,"value":"SELECT\n# DISTINCT\nopp.id as opp_id, opp.uuid, opp.name,\n# COUNT(dr.id) AS deal_risk_count,\n\n# dr.id,\n# cfd.value,\nusr.name AS owner_name,\nopp.value, opp.currency_code, opp.close_date, opp.remotely_created_at, opp.is_closed, opp.is_won,\nusr.uuid as owner_uuid,\nusr.photo_path as owner_photo,\nusr.id AS owner_id,\njt.name as owner_job,\nopp.stage_id, opp.stage_updated_at,\nacc.name AS acc_name, opp.stage_updated_at, acc.crm_provider_id AS acc_provider_id, opp.crm_provider_id AS opp_provider_id,\nrt.business_process_id AS pipeline_id\nFROM opportunities opp\nLEFT JOIN record_types rt ON opp.record_type_id = rt.id\nLEFT JOIN users usr ON opp.user_id = usr.id\nLEFT JOIN accounts acc ON opp.account_id = acc.id\nLEFT JOIN job_titles jt ON usr.job_title_id = jt.id\n\n# LEFT JOIN group_deal_risk_types gdrt ON gdrt.group_id = usr.group_id\n# LEFT JOIN deal_risks dr ON dr.opportunity_id = opp.id AND dr.group_deal_risk_type_id = gdrt.id\n\nLEFT JOIN crm_field_data cfd ON (cfd.object_id = opp.id and cfd.crm_field_id = 66814)\n\nWHERE opp.user_id IS NOT NULL\nAND opp.deleted_at IS NULL\nAND opp.is_closed = 1\nAND opp.is_won = 0\nAND opp.close_date >= '2024-01-01 00:00:00'\nAND opp.close_date <= '2024-12-31 23:59:59'\nAND usr.team_id = 1\n\n# and opp.id = 4823179\n\nGROUP BY opp.id, cfd.value\nORDER BY\n# cfd.value\n CAST(cfd.value AS UNSIGNED)\n# owner_name\n# (SELECT COUNT(dr.id)\n# FROM deal_risks dr\n# JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id\n# WHERE dr.opportunity_id = opp.id\n# AND dr.is_active = 1\n# AND gdrt.is_enabled = 1)\nDESC\nLIMIT 25\n# OFFSET 0\n;\n\nselect * from crm_fields where crm_configuration_id = 1 and object_type = 'opportunity';\nselect * from crm_layout_entities where crm_layout_id = 1493;\n\nSELECT * FROM opportunities WHERE id = 4584045;\nSELECT * FROM crm_field_data WHERE object_id = 4584045;\n\nSELECT * FROM opportunities where team_id = 1 and crm_provider_id = '0061K00000lfb9IQAQ'\n\nSELECT\n opp.id as opportunity_id,\n opp.name,\n COUNT(dr.id) as risk_count\nFROM opportunities opp\nLEFT JOIN deal_risks dr ON dr.opportunity_id = opp.id\nWHERE opp.id IN (\n 6069574,8900938,9507638,9524799,9660490,9662824,9705675,9749758,4158460,4391812,6450439,4448422,5118945,5590675,4584045,7228149,9002408,9165534,9446720,9641778,9665149,9703344,9709280,5747948,4158491,6182565,6263970,5798120,5111315,4536978,6062352,6548383,6072095,6548225,4480986,5011422,6548381,8760540,8917554,9509986,9514392,9569009,9569011,9578490,9713604,5784397,7276612,7288405,8994421,9118219,9608148,9818911,4510535,6479693,5958049,6271674,6550448,4158331,4158483,6126571,6171615,6540943,4897466,5190896,5796182,5932762,8572433,8723698,8892697,9711001,9789264,4549188,6100831,6170064,6260799,6263653,6449936,6530871,6538978,7777651,8059269,8319918,8787049,8901150,9263153,9453207,9514738,9696700,9791062,5752018,6421452,7439134,7878923,9354763,9369285,9514396,9582506,9889949,9890216,4094311,4158495,4158496,6098128,5585661,3872564,6442149,5891604,6164746,6199593,6583474,6519684,9018490,9809006,4496897,5041324,5829430,6198319,6253504,6555763,7242914,7931055,8024125,8797814,8058559,8673347,8892695,8994420,9616219,9714970,9722004,9809439,9818918,6523177,8134147,9002915,9711422,9892713,9901719,9954210,9978435,5800810,6243518,6416114,6222251,6411974,6512456,5791953,6545606,9914780,5805540,6238986,6463838,6547680,9767049,9809437,9810885,9890855,6673493,9902036,4335521,6379871,6503799,6546077,8018765,9907556,9958433,9905855,9916179,9946741,9957877,5563344,6271838,6450815,7641128,7762567,7780592,8684810,8685786,8685787,8685788\n)\nGROUP BY opp.id;\n\nSELECT COUNT(dr.id)\n FROM deal_risks dr\n JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id\n WHERE dr.opportunity_id = 5563344\n# AND gdrt.group_id = usr.group_id\n\n\n\nEXPLAIN SELECT\n opp.id as opp_id, opp.uuid, opp.name,\n\ncfd.value,\ncfv.sequence,\ncfv.value,\n# MAX(cfd.value) AS max_cfd_value,\nusr.name AS owner_name,\nopp.value, opp.currency_code, opp.close_date, opp.remotely_created_at, opp.is_closed, opp.is_won,\nusr.uuid as owner_uuid,\nusr.photo_path as owner_photo,\nusr.id AS owner_id,\njt.name as owner_job,\nopp.stage_id, opp.stage_updated_at,\nacc.name AS acc_name, opp.stage_updated_at, acc.crm_provider_id AS acc_provider_id, opp.crm_provider_id AS opp_provider_id,\nrt.business_process_id AS pipeline_id\nFROM opportunities opp\n\nLEFT JOIN record_types rt ON opp.record_type_id = rt.id\nLEFT JOIN users usr ON opp.user_id = usr.id\nLEFT JOIN accounts acc ON opp.account_id = acc.id\nLEFT JOIN job_titles jt ON usr.job_title_id = jt.id\n\nLEFT JOIN crm_field_data cfd ON cfd.id = (SELECT sub_cfd.id\n FROM crm_field_data sub_cfd\n WHERE sub_cfd.object_id = opp.id\n AND sub_cfd.crm_field_id = 66810\n ORDER BY sub_cfd.updated_at DESC\n LIMIT 1)\n\nLEFT JOIN crm_field_values cfv ON cfv.crm_field_id = 66810 AND cfv.value = cfd.value\n\nWHERE opp.user_id IS NOT NULL\nAND opp.deleted_at IS NULL\nAND opp.is_closed = 0\n# AND opp.is_closed = 1\n# AND opp.is_won = 0\nAND opp.close_date >= '2024-01-01 00:00:00'\nAND opp.close_date <= '2024-12-31 23:59:59'\nAND usr.team_id = 1\n\n# and opp.id = 4823179\n\n# GROUP BY opp.id\nORDER BY\n cfv.sequence DESC,\n# opp.name\n# owner_name\n cfd.value\n# CAST(cfd.value AS UNSIGNED)\n# CAST(MAX(cfd.value) AS UNSIGNED)\n# (SELECT COUNT(dr.id)\n# FROM deal_risks dr\n# JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id\n# WHERE dr.opportunity_id = opp.id\n# AND dr.is_active = 1 AND gdrt.is_enabled = 1)\nDESC\n# LIMIT 75, 25\n;\n\n\n\nSELECT * FROM crm_field_values WHERE crm_field_id = 66810;\n\nSELECT f.id, f.crm_provider_id AS field_name, f.label, fd.object_id AS dealId, fd.value, fd.updated_at, fd.id, fd.created_at\nFROM crm_fields f\nINNER JOIN crm_field_data fd ON fd.crm_field_id = f.id\n WHERE (f.crm_configuration_id = 1)\n AND (f.object_type = 'opportunity')\n# AND (fd.object_id IN (4158331,4158483,4158495,4158496,6069574,6263970,6171615,6540943,6545606,5829430,6198319,6263653,6548381,7242914,8797814,7228149,7439134,7878923,8134147,9002915,9118219,9165534,9354763,9369285,9446720))\n AND (fd.object_id IN (4158460))\n AND (f.crm_provider_id IN ('ForecastCategoryName'))\n ORDER BY fd.object_id ASC, fd.updated_at DESC;\n\nselect * from crm_layouts where crm_configuration_id = 1;\nselect cf.* from crm_fields cf\njoin crm_layout_entities cle on cf.id = cle.crm_field_id\nwhere crm_layout_id = 1493;\n\nSELECT * FROM opportunities WHERE id = 4158460;\nSELECT * FROM crm_field_data WHERE object_id = 4158460;\n\nselect * from users where team_id = 1;\nSELECT * FROM users WHERE id = 7160;\nselect * from role_user where user_id = 3248;\n\nselect * from crm_field_values where crm_field_id = 66824;\n\nSELECT * FROM users WHERE id = 23470;\nselect * from crm_configurations;\n\n# ******************************************\nselect * from teams where id = 1038; # 23521, 966\nselect * from users where team_id = 1038;\nselect * from crm_configurations where id = 966;\nSELECT * FROM activities WHERE uuid_to_bin('e8dc7c34-31f6-4430-bd81-2d9d8f00dd07') = uuid; # 54965762\nSELECT * FROM activities WHERE uuid_to_bin('4b5727c0-69d1-428f-b8d9-b649055166e2') = uuid; # 54965764\nSELECT * FROM participants WHERE activity_id = 54965764;\n\nSELECT id, uuid, title, recording_state FROM activities WHERE uuid_to_bin('355f105d-5606-4379-b0c5-d91daf59f4ce') = uuid; # 54964075\nSELECT * FROM participants WHERE activity_id = 54964075;\nselect f.id, slug, title, tf.team_id from team_features tf JOIN features f on tf.feature_id = f.id\n where tf.team_id = 1038;\n\n\n# ****************************************** PD *************************\nselect * from teams where id = 1029;\nSELECT * FROM crm_configurations WHERE id = 957;\nSELECT * FROM activities WHERE uuid_to_bin('581a33cb-4343-44bd-ac0c-4a5cee71c5ec') = uuid; # 54963423\nSELECT * FROM activities WHERE uuid_to_bin('07238011-25fa-418e-838b-fb21e82b9ea2') = uuid; # 54963433\n\nSELECT * FROM activities WHERE uuid_to_bin('8b6bb2f7-e7a7-4aec-8806-fbfea7093ccd') = uuid; # 54963421\n\n# ****************************************** Close *************************\nselect * from teams where id = 1031;\nSELECT * FROM crm_configurations WHERE id = 959;\nSELECT * FROM activities WHERE uuid_to_bin('59c517e0-96c9-4dad-bfeb-b7bef72f8725') = uuid; # 54963517\n\n\nSELECT * FROM activities WHERE uuid_to_bin('07238011-25fa-418e-838b-fb21e82b9ea2') = uuid; # 54963433\n\nSELECT * FROM activities WHERE uuid_to_bin('d68311e3-ac34-49bd-bf04-88323a7e5352') = uuid; # 54966009\n\n# ****************************************** SF *************************\nSELECT * FROM activities WHERE uuid_to_bin('2bd4cfa3-4eb5-4c77-84a7-9ed46a21c988') = uuid;\n\nselect * from roles;\nselect * from permissions;\nselect * from permission_role where permission_id = 136;\n\nselect * from migrations order by id desc;\n\nselect * from teams where id IN (1, 1037);\nselect * from crm_layouts where crm_configuration_id = 1;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1493;\nSELECT * FROM crm_fields WHERE id IN (1652,1661,66799,66814,66821,66836,66843,66846,66864,84752,182306,323580,380378);\n\nselect * from features;\nselect * from team_features where feature_id = 33;\nselect * from opportunities;\n\nselect * from teams;\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 = 1052 and sa.provider = 'hubspot';\n\nSELECT * FROM accounts where id = 11512582;","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Project","depth":3,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Project","depth":3,"bounds":{"left":0.025,"top":0.06666667,"width":0.050694443,"height":0.034444444},"on_screen":true,"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},"on_screen":false,"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},"on_screen":false,"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},"on_screen":false,"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},"on_screen":false,"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},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
-3428666155218272246
|
6398094028691354589
|
visual_change
|
accessibility
|
NULL
|
Project: faVsco.js, menu
#12066 on JY-20725-handle Project: faVsco.js, menu
#12066 on JY-20725-handle-HS-search-rate-limit, menu
Start Listening for PHP Debug Connections
HandleHubspotRateLimitTest
Run 'HandleHubspotRateLimitTest'
Debug 'HandleHubspotRateLimitTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
7
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Http\Controllers\Webhook\IntegrationAppSubscriptions;
use Illuminate\Http\JsonResponse;
use Jiminny\Contracts\Crm\Providers;
use Jiminny\Models\Team;
use Jiminny\Services\Crm\IntegrationApp\Service;
use Jiminny\Services\Crm\ProviderRegistry;
trait IntegrationAppTrait
{
abstract protected function getTeamFromRequest(): ?Team;
abstract protected function extractPayload(): array;
private function getPayload(): array
{
$payload = $this->extractPayload();
$this->logger->info('[integration-app] Event received', [
'payload' => $payload,
]);
return $payload;
}
private function extractTargetIdFromPayload(string $targetId): ?string
{
$payload = $this->getPayload();
return $payload[$targetId] ?? null;
}
private function extractTargetObjectIdsFromPayload(string $targetKey): array
{
$payload = $this->getPayload();
$objects = $payload[$targetKey] ?? [];
if (! is_array($objects) || empty($objects)) {
return [];
}
return array_values(array_filter(array_map(
static fn ($object) => is_array($object) ? ($object['id'] ?? null) : null,
$objects
)));
}
private function bootstrapIntegrationApp(Team $team): ?Service
{
$crmProvider = app(ProviderRegistry::class);
$providerName = $team->getCrmConfiguration()->getProviderName();
if (! Providers::isIntegrationAppProvider($providerName)) {
return null;
}
/** @var Service $integrationApp */
$integrationApp = $crmProvider->get($providerName);
$integrationApp->setUser($team->getOwner());
return $integrationApp;
}
private function getTargetCrmProviderId(string $targetKey, string $eventName): ?string
{
$targetId = $this->extractTargetIdFromPayload($targetKey);
$this->logger->info("[integration-app] Event: {$eventName}", [
'targetId' => $targetId,
'targetKey' => $targetKey,
]);
return $targetId;
}
private function getTargetCrmProviderObjectsIds(string $targetKey, string $eventName): array
{
$targetIds = $this->extractTargetObjectIdsFromPayload($targetKey);
$this->logger->info("[integration-app] Event: $eventName", [
'targetIds' => $targetIds,
'targetKey' => $targetKey,
'count' => count($targetIds),
]);
return $targetIds;
}
protected function handleBulkDeletion(string $targetKey, string $fallbackKey, string $eventName): JsonResponse
{
$team = $this->getTeamFromRequest();
if ($team === null) {
return new JsonResponse([], JsonResponse::HTTP_NO_CONTENT);
}
$targetIds = $this->getTargetCrmProviderObjectsIds(targetKey: $targetKey, eventName: $eventName);
if (empty($targetIds)) {
$this->logger->warning('No target IDs found for ' . $eventName);
// fallback to single target ID
$targetId = $this->getTargetCrmProviderId(targetKey: $fallbackKey, eventName: $eventName);
if ($targetId !== null) {
$targetIds[] = $targetId;
}
}
if (empty($targetIds)) {
$this->logger->warning('No target IDs found alter fallback for ' . $eventName);
return new JsonResponse([], JsonResponse::HTTP_BAD_REQUEST);
}
foreach ($targetIds as $targetId) {
$this->deleteTarget(team: $team, targetId: (string) $targetId);
}
return new JsonResponse([], JsonResponse::HTTP_OK);
}
abstract protected function deleteTarget(Team $team, string $targetId): void;
}
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
8
1
3
4
Previous Highlighted Error
Next Highlighted Error
SELECT
# DISTINCT
opp.id as opp_id, opp.uuid, opp.name,
# COUNT(dr.id) AS deal_risk_count,
# dr.id,
# cfd.value,
usr.name AS owner_name,
opp.value, opp.currency_code, opp.close_date, opp.remotely_created_at, opp.is_closed, opp.is_won,
usr.uuid as owner_uuid,
usr.photo_path as owner_photo,
usr.id AS owner_id,
jt.name as owner_job,
opp.stage_id, opp.stage_updated_at,
acc.name AS acc_name, opp.stage_updated_at, acc.crm_provider_id AS acc_provider_id, opp.crm_provider_id AS opp_provider_id,
rt.business_process_id AS pipeline_id
FROM opportunities opp
LEFT JOIN record_types rt ON opp.record_type_id = rt.id
LEFT JOIN users usr ON opp.user_id = usr.id
LEFT JOIN accounts acc ON opp.account_id = acc.id
LEFT JOIN job_titles jt ON usr.job_title_id = jt.id
# LEFT JOIN group_deal_risk_types gdrt ON gdrt.group_id = usr.group_id
# LEFT JOIN deal_risks dr ON dr.opportunity_id = opp.id AND dr.group_deal_risk_type_id = gdrt.id
LEFT JOIN crm_field_data cfd ON (cfd.object_id = opp.id and cfd.crm_field_id = 66814)
WHERE opp.user_id IS NOT NULL
AND opp.deleted_at IS NULL
AND opp.is_closed = 1
AND opp.is_won = 0
AND opp.close_date >= '2024-01-01 00:00:00'
AND opp.close_date <= '2024-12-31 23:59:59'
AND usr.team_id = 1
# and opp.id = 4823179
GROUP BY opp.id, cfd.value
ORDER BY
# cfd.value
CAST(cfd.value AS UNSIGNED)
# owner_name
# (SELECT COUNT(dr.id)
# FROM deal_risks dr
# JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id
# WHERE dr.opportunity_id = opp.id
# AND dr.is_active = 1
# AND gdrt.is_enabled = 1)
DESC
LIMIT 25
# OFFSET 0
;
select * from crm_fields where crm_configuration_id = 1 and object_type = 'opportunity';
select * from crm_layout_entities where crm_layout_id = 1493;
SELECT * FROM opportunities WHERE id = 4584045;
SELECT * FROM crm_field_data WHERE object_id = 4584045;
SELECT * FROM opportunities where team_id = 1 and crm_provider_id = '0061K00000lfb9IQAQ'
SELECT
opp.id as opportunity_id,
opp.name,
COUNT(dr.id) as risk_count
FROM opportunities opp
LEFT JOIN deal_risks dr ON dr.opportunity_id = opp.id
WHERE opp.id IN (
6069574,8900938,9507638,9524799,9660490,9662824,9705675,9749758,4158460,4391812,6450439,4448422,5118945,5590675,4584045,7228149,9002408,9165534,9446720,9641778,9665149,9703344,9709280,5747948,4158491,6182565,6263970,5798120,5111315,4536978,6062352,6548383,6072095,6548225,4480986,5011422,6548381,8760540,8917554,9509986,9514392,9569009,9569011,9578490,9713604,5784397,7276612,7288405,8994421,9118219,9608148,9818911,4510535,6479693,5958049,6271674,6550448,4158331,4158483,6126571,6171615,6540943,4897466,5190896,5796182,5932762,8572433,8723698,8892697,9711001,9789264,4549188,6100831,6170064,6260799,6263653,6449936,6530871,6538978,7777651,8059269,8319918,8787049,8901150,9263153,9453207,9514738,9696700,9791062,5752018,6421452,7439134,7878923,9354763,9369285,9514396,9582506,9889949,9890216,4094311,4158495,4158496,6098128,5585661,3872564,6442149,5891604,6164746,6199593,6583474,6519684,9018490,9809006,4496897,5041324,5829430,6198319,6253504,6555763,7242914,7931055,8024125,8797814,8058559,8673347,8892695,8994420,9616219,9714970,9722004,9809439,9818918,6523177,8134147,9002915,9711422,9892713,9901719,9954210,9978435,5800810,6243518,6416114,6222251,6411974,6512456,5791953,6545606,9914780,5805540,6238986,6463838,6547680,9767049,9809437,9810885,9890855,6673493,9902036,4335521,6379871,6503799,6546077,8018765,9907556,9958433,9905855,9916179,9946741,9957877,5563344,6271838,6450815,7641128,7762567,7780592,8684810,8685786,8685787,8685788
)
GROUP BY opp.id;
SELECT COUNT(dr.id)
FROM deal_risks dr
JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id
WHERE dr.opportunity_id = 5563344
# AND gdrt.group_id = usr.group_id
EXPLAIN SELECT
opp.id as opp_id, opp.uuid, opp.name,
cfd.value,
cfv.sequence,
cfv.value,
# MAX(cfd.value) AS max_cfd_value,
usr.name AS owner_name,
opp.value, opp.currency_code, opp.close_date, opp.remotely_created_at, opp.is_closed, opp.is_won,
usr.uuid as owner_uuid,
usr.photo_path as owner_photo,
usr.id AS owner_id,
jt.name as owner_job,
opp.stage_id, opp.stage_updated_at,
acc.name AS acc_name, opp.stage_updated_at, acc.crm_provider_id AS acc_provider_id, opp.crm_provider_id AS opp_provider_id,
rt.business_process_id AS pipeline_id
FROM opportunities opp
LEFT JOIN record_types rt ON opp.record_type_id = rt.id
LEFT JOIN users usr ON opp.user_id = usr.id
LEFT JOIN accounts acc ON opp.account_id = acc.id
LEFT JOIN job_titles jt ON usr.job_title_id = jt.id
LEFT JOIN crm_field_data cfd ON cfd.id = (SELECT sub_cfd.id
FROM crm_field_data sub_cfd
WHERE sub_cfd.object_id = opp.id
AND sub_cfd.crm_field_id = 66810
ORDER BY sub_cfd.updated_at DESC
LIMIT 1)
LEFT JOIN crm_field_values cfv ON cfv.crm_field_id = 66810 AND cfv.value = cfd.value
WHERE opp.user_id IS NOT NULL
AND opp.deleted_at IS NULL
AND opp.is_closed = 0
# AND opp.is_closed = 1
# AND opp.is_won = 0
AND opp.close_date >= '2024-01-01 00:00:00'
AND opp.close_date <= '2024-12-31 23:59:59'
AND usr.team_id = 1
# and opp.id = 4823179
# GROUP BY opp.id
ORDER BY
cfv.sequence DESC,
# opp.name
# owner_name
cfd.value
# CAST(cfd.value AS UNSIGNED)
# CAST(MAX(cfd.value) AS UNSIGNED)
# (SELECT COUNT(dr.id)
# FROM deal_risks dr
# JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id
# WHERE dr.opportunity_id = opp.id
# AND dr.is_active = 1 AND gdrt.is_enabled = 1)
DESC
# LIMIT 75, 25
;
SELECT * FROM crm_field_values WHERE crm_field_id = 66810;
SELECT f.id, f.crm_provider_id AS field_name, f.label, fd.object_id AS dealId, fd.value, fd.updated_at, fd.id, fd.created_at
FROM crm_fields f
INNER JOIN crm_field_data fd ON fd.crm_field_id = f.id
WHERE (f.crm_configuration_id = 1)
AND (f.object_type = 'opportunity')
# AND (fd.object_id IN (4158331,4158483,4158495,4158496,6069574,6263970,6171615,6540943,6545606,5829430,6198319,6263653,6548381,7242914,8797814,7228149,7439134,7878923,8134147,9002915,9118219,9165534,9354763,9369285,9446720))
AND (fd.object_id IN (4158460))
AND (f.crm_provider_id IN ('ForecastCategoryName'))
ORDER BY fd.object_id ASC, fd.updated_at DESC;
select * from crm_layouts where crm_configuration_id = 1;
select cf.* from crm_fields cf
join crm_layout_entities cle on cf.id = cle.crm_field_id
where crm_layout_id = 1493;
SELECT * FROM opportunities WHERE id = 4158460;
SELECT * FROM crm_field_data WHERE object_id = 4158460;
select * from users where team_id = 1;
SELECT * FROM users WHERE id = 7160;
select * from role_user where user_id = 3248;
select * from crm_field_values where crm_field_id = 66824;
SELECT * FROM users WHERE id = 23470;
select * from crm_configurations;
# [PASSWORD_DOTS]
select * from teams where id = 1038; # 23521, 966
select * from users where team_id = 1038;
select * from crm_configurations where id = 966;
SELECT * FROM activities WHERE uuid_to_bin('e8dc7c34-31f6-4430-bd81-2d9d8f00dd07') = uuid; # 54965762
SELECT * FROM activities WHERE uuid_to_bin('4b5727c0-69d1-428f-b8d9-b649055166e2') = uuid; # 54965764
SELECT * FROM participants WHERE activity_id = 54965764;
SELECT id, uuid, title, recording_state FROM activities WHERE uuid_to_bin('355f105d-5606-4379-b0c5-d91daf59f4ce') = uuid; # 54964075
SELECT * FROM participants WHERE activity_id = 54964075;
select f.id, slug, title, tf.team_id from team_features tf JOIN features f on tf.feature_id = f.id
where tf.team_id = 1038;
# [PASSWORD_DOTS] PD [PASSWORD_DOTS]
select * from teams where id = 1029;
SELECT * FROM crm_configurations WHERE id = 957;
SELECT * FROM activities WHERE uuid_to_bin('581a33cb-4343-44bd-ac0c-4a5cee71c5ec') = uuid; # 54963423
SELECT * FROM activities WHERE uuid_to_bin('07238011-25fa-418e-838b-fb21e82b9ea2') = uuid; # 54963433
SELECT * FROM activities WHERE uuid_to_bin('8b6bb2f7-e7a7-4aec-8806-fbfea7093ccd') = uuid; # 54963421
# [PASSWORD_DOTS] Close [PASSWORD_DOTS]
select * from teams where id = 1031;
SELECT * FROM crm_configurations WHERE id = 959;
SELECT * FROM activities WHERE uuid_to_bin('59c517e0-96c9-4dad-bfeb-b7bef72f8725') = uuid; # 54963517
SELECT * FROM activities WHERE uuid_to_bin('07238011-25fa-418e-838b-fb21e82b9ea2') = uuid; # 54963433
SELECT * FROM activities WHERE uuid_to_bin('d68311e3-ac34-49bd-bf04-88323a7e5352') = uuid; # 54966009
# [PASSWORD_DOTS] SF [PASSWORD_DOTS]
SELECT * FROM activities WHERE uuid_to_bin('2bd4cfa3-4eb5-4c77-84a7-9ed46a21c988') = uuid;
select * from roles;
select * from permissions;
select * from permission_role where permission_id = 136;
select * from migrations order by id desc;
select * from teams where id IN (1, 1037);
select * from crm_layouts where crm_configuration_id = 1;
SELECT * FROM crm_layout_entities WHERE crm_layout_id = 1493;
SELECT * FROM crm_fields WHERE id IN (1652,1661,66799,66814,66821,66836,66843,66846,66864,84752,182306,323580,380378);
select * from features;
select * from team_features where feature_id = 33;
select * from opportunities;
select * from teams;
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 = 1052 and sa.provider = 'hubspot';
SELECT * FROM accounts where id = 11512582;
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide...
|
44472
|
NULL
|
NULL
|
NULL
|
|
44472
|
1609
|
19
|
2026-05-14T13:51:04.152518+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-14/1778 /Users/lukas/.screenpipe/data/data/2026-05-14/1778766664152_m1.jpg...
|
PhpStorm
|
faVsco.js – IntegrationAppTrait.php
|
1
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
#12066 on JY-20725-handle Project: faVsco.js, menu
#12066 on JY-20725-handle-HS-search-rate-limit, menu
Start Listening for PHP Debug Connections
HandleHubspotRateLimitTest
Run 'HandleHubspotRateLimitTest'
Debug 'HandleHubspotRateLimitTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"bounds":{"left":0.054166667,"top":0.027777778,"width":0.08055556,"height":0.035555556},"on_screen":true,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"#12066 on JY-20725-handle-HS-search-rate-limit, menu","depth":5,"bounds":{"left":0.13472222,"top":0.027777778,"width":0.25555557,"height":0.035555556},"on_screen":true,"help_text":"Pull request #12066 exists for current branch JY-20725-handle-HS-search-rate-limit, but local branch is out of sync with remote","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"bounds":{"left":0.6326389,"top":0.027777778,"width":0.023611112,"height":0.035555556},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"HandleHubspotRateLimitTest","depth":6,"bounds":{"left":0.6645833,"top":0.027777778,"width":0.15902779,"height":0.035555556},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run 'HandleHubspotRateLimitTest'","depth":6,"bounds":{"left":0.82361114,"top":0.027777778,"width":0.023611112,"height":0.035555556},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'HandleHubspotRateLimitTest'","depth":6,"bounds":{"left":0.8472222,"top":0.027777778,"width":0.023611112,"height":0.035555556},"on_screen":true,"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.87083334,"top":0.027777778,"width":0.023611112,"height":0.035555556},"on_screen":true,"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.9291667,"top":0.027777778,"width":0.023611112,"height":0.035555556},"on_screen":true,"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.9527778,"top":0.027777778,"width":0.023611112,"height":0.035555556},"on_screen":true,"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.9763889,"top":0.027777778,"width":0.023611112,"height":0.035555556},"on_screen":true,"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},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
-3772723929611228661
|
-6979379262459376693
|
app_switch
|
hybrid
|
NULL
|
Project: faVsco.js, menu
#12066 on JY-20725-handle Project: faVsco.js, menu
#12066 on JY-20725-handle-HS-search-rate-limit, menu
Start Listening for PHP Debug Connections
HandleHubspotRateLimitTest
Run 'HandleHubspotRateLimitTest'
Debug 'HandleHubspotRateLimitTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Ca+FirefoxFileEditViewHistoryBookmarksProfilesToolsWindowHelp100% ( 8• Thu 14 May 16:51:03→app.hubspot.com/developer/2752939/application/38483/monitoring/webhooks?startTime=1778385600000&enc #QFind or AskKool++‹ Back to all appsJiminny (Staging)Created by Jiminny (Staging) #34Basic infoContact & supportMonitoringPS-Tim PhpStormSWebhooksApp settingsMore featuresAPI callsWebhooksApp settingsFilter by: Object type -company.deletion X0garch$1PTIC503company.deletion503company.deletion503company.deletion503company.deletion503company.deletion503company.deletionUpgraUl extensions EStatus -N898c9913-8c6e-40b3aa28d-8006-1fd5bb71-5493-4Oca808a2-7045-436ad27aa-eOb2-4873cf174-fced-4a< Prev1Next >Log detailsbd009t9t-d5c3-411f-9504-9114d/f/d84tcopy log IDBatch ID873cf174-fced-4a23-b70e-e6b662822a3eCopy batch IDAccount4392066Copy account IDAttempt detailsBSCRIPTION IDEVENT IDATTEMPT #31$72May 14, 2026 9:41 AM EDTTriggering eventCompany deleted at May 14, 2026 9:41 AM EDT.Payload"subscriptionld": 4588137,"portalId": 4392066,"appId": 38483,"occurredAt": 1778766075525,"subscriptionType": "company.deletion","attemptNumber.": 0,"objectId": 45865500569,"changeFlag": "DELETED","changeSource": "CRM_UI","sourceId": "userId:61285657"...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
44375
|
1607
|
50
|
2026-05-14T13:47:20.119417+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-14/1778 /Users/lukas/.screenpipe/data/data/2026-05-14/1778766440119_m1.jpg...
|
PhpStorm
|
faVsco.js – IntegrationAppTrait.php
|
1
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
PhpStormFileEditViewNavigateCodeLaravelRefactorRun PhpStormFileEditViewNavigateCodeLaravelRefactorRunToolsGitWindowHelpabl19100% (C478• Thu 14 May 16:47:20•FV faVsco.jsv* #12066 on JY-20725-handle-HS-search-rate-limit k vU HandleHubspotRateLimitTest ~QProject v© ReportController.php© AutomatedReportGenerated.phpE custom.log= laravel.log› • Hubspot© TrackAutomatedReportGeneratedEvent.phpPlaybackController.phpv D IntegrationAppSub:© AccountControll© UserAutomatedReportsController.phpPlanhatService.php© AutomatedReportResult.php© ContactControlleSendReportJob.php© DeleteCrmEntityTrait.php© DeleteAccountJob.php© AccountController.php( IntegrationAppTT IntegrationAppTrait.php X© DetachActivityObject.phpRematchActivityOnCrmObjectDetach.php18© LeadController.F© OpportunityContMatchActivityCrmData.phpClient.phpHubspotPaginationService.php© ProfileController© SystemControlleT TokenDataTrait.© HandleHubspotRateLimit.phptrait IntegrationAppTraitprivate function bootstrapIntegrationApp(Team $team): ?Servicet...}© ActivityProviderCor© ActivityTranscriptio135267A7 ^1 usage© BaseController.php• CalendarController.6878© ReportController.ph1 usageSoftphoneWebhoolC AbstractController.php7990D210211212213214215private function getTargetCrmProviderId(stringStargetKey, string $eventName):?st216217218private function getTargetCrmProvider0bjectsIds(string $targetKey, string $eventNa219220• CommentContextinter© ConferencesOptinOut(91arotected function hantreBulkDeletionstring Stangetkey, string sfallbackkey, sto© Controller.phpExportController.php9293$team = Sthis->getTeamFromRequest();© FrontendController.ph|T FrontendControllerTra9495GeocodingController.p96if ($team === null) {return new JsonResponse(M,status: JsonResponse::HTTP_N0_CONTENT);© HealthCheckController97LiveCoachController.p98223224225226227228© MissingTeamControlle99StargetIds = Sthis->getTargetCrnProviderObjectsIds(tangetKey: Stangetkey, ever 229© MobileController.php100© NotificationController.f101© NotificationProviderCc102if (empty($targetIds)) {$this->logger-›warning('No target IDs found for ' • $eventName);© PlaybackController.ph| 103231-232_233© PlaylistController.php104© PusherController.php105// fallback to single target IDStargetId = Sthis->getTargetCrmProviderId(targetKey: $fallbackKey, eventNa© SlackController.php106© SupportController.php107if (StargetId !== null) {A TaomCotunCantrallor.Workspace associated with branch "JY-20725-handle-HS-search-rate-limit' has been restored // Rollback I/ Configure... ( 29 mihutes ago)4 SF jiminny@localhost]« HS_local [jiminny@localhost]console [QAI PROD] X& console [PROD]console [EU]Tx: Auto v >68 jiminny08 41 43 ×4 ^ Vesc;37):nfiguration_id = 1;E crm_layout_id = 1493;1652,1661,66799,66814,66821,66836,66843ure_id = 33;ner_id THEN ' (owner)' ELSE "' END) AS-_id='hubspot':2582;W Windsurf Teams119:27UTF-8Co 4 spaces...
|
NULL
|
-5905437251994101432
|
NULL
|
click
|
ocr
|
NULL
|
PhpStormFileEditViewNavigateCodeLaravelRefactorRun PhpStormFileEditViewNavigateCodeLaravelRefactorRunToolsGitWindowHelpabl19100% (C478• Thu 14 May 16:47:20•FV faVsco.jsv* #12066 on JY-20725-handle-HS-search-rate-limit k vU HandleHubspotRateLimitTest ~QProject v© ReportController.php© AutomatedReportGenerated.phpE custom.log= laravel.log› • Hubspot© TrackAutomatedReportGeneratedEvent.phpPlaybackController.phpv D IntegrationAppSub:© AccountControll© UserAutomatedReportsController.phpPlanhatService.php© AutomatedReportResult.php© ContactControlleSendReportJob.php© DeleteCrmEntityTrait.php© DeleteAccountJob.php© AccountController.php( IntegrationAppTT IntegrationAppTrait.php X© DetachActivityObject.phpRematchActivityOnCrmObjectDetach.php18© LeadController.F© OpportunityContMatchActivityCrmData.phpClient.phpHubspotPaginationService.php© ProfileController© SystemControlleT TokenDataTrait.© HandleHubspotRateLimit.phptrait IntegrationAppTraitprivate function bootstrapIntegrationApp(Team $team): ?Servicet...}© ActivityProviderCor© ActivityTranscriptio135267A7 ^1 usage© BaseController.php• CalendarController.6878© ReportController.ph1 usageSoftphoneWebhoolC AbstractController.php7990D210211212213214215private function getTargetCrmProviderId(stringStargetKey, string $eventName):?st216217218private function getTargetCrmProvider0bjectsIds(string $targetKey, string $eventNa219220• CommentContextinter© ConferencesOptinOut(91arotected function hantreBulkDeletionstring Stangetkey, string sfallbackkey, sto© Controller.phpExportController.php9293$team = Sthis->getTeamFromRequest();© FrontendController.ph|T FrontendControllerTra9495GeocodingController.p96if ($team === null) {return new JsonResponse(M,status: JsonResponse::HTTP_N0_CONTENT);© HealthCheckController97LiveCoachController.p98223224225226227228© MissingTeamControlle99StargetIds = Sthis->getTargetCrnProviderObjectsIds(tangetKey: Stangetkey, ever 229© MobileController.php100© NotificationController.f101© NotificationProviderCc102if (empty($targetIds)) {$this->logger-›warning('No target IDs found for ' • $eventName);© PlaybackController.ph| 103231-232_233© PlaylistController.php104© PusherController.php105// fallback to single target IDStargetId = Sthis->getTargetCrmProviderId(targetKey: $fallbackKey, eventNa© SlackController.php106© SupportController.php107if (StargetId !== null) {A TaomCotunCantrallor.Workspace associated with branch "JY-20725-handle-HS-search-rate-limit' has been restored // Rollback I/ Configure... ( 29 mihutes ago)4 SF jiminny@localhost]« HS_local [jiminny@localhost]console [QAI PROD] X& console [PROD]console [EU]Tx: Auto v >68 jiminny08 41 43 ×4 ^ Vesc;37):nfiguration_id = 1;E crm_layout_id = 1493;1652,1661,66799,66814,66821,66836,66843ure_id = 33;ner_id THEN ' (owner)' ELSE "' END) AS-_id='hubspot':2582;W Windsurf Teams119:27UTF-8Co 4 spaces...
|
44373
|
NULL
|
NULL
|
NULL
|
|
44374
|
1608
|
31
|
2026-05-14T13:47:15.992052+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-14/1778 /Users/lukas/.screenpipe/data/data/2026-05-14/1778766435992_m2.jpg...
|
PhpStorm
|
faVsco.js – IntegrationAppTrait.php
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Jiminny...vActivityFilesLater@ jiminny-x-integrati Jiminny...vActivityFilesLater@ jiminny-x-integrati….• plattorm-inner-teamE Channels# ai-chapter# alertsi backend# bugscontusion-cllnia# curiosity lab# engineering# general#jiminny-bgac nlattorm-nckets# product launches# random# releases# sofia-officed sunport# thank-yous# the people of iimi... Direct messages• e 02P. Galya Dimitrovavasil VasilevStefka StoyanovaSg: Todor StamatovMario GeorgieyNiudlay lanay. James Graham "* Stoyan Tanevad Stelivan Georgiev( Petko Kashinski*. Lukas Kovali...::: AnnsToastS lira Gloud6d Huddle with Aneliva AngelovaQ Describe what you are looking for* Aneliya Angelova &• MessagesAdd canvasur FilesTuesdav. April 28thvMonday, May 11thAneliva Angelova 1:24 PMIЛукаш за Huюsлог за синковете вече се изполава тази команла нали?Lukas Kovalik 1:32 PMла коон я пуска поез 5 минAneliya Angelova v 2:30 PMЛукаш, само при Сейлсфорс и Хубспот се синкваха активити типовете, когато се направи плейбук,Hanи?при останалите CRMi трябва рьчно да се въведатLukas Kovalik M 2:47 PNзлрастиами не знам по принцип се вика при всичкитрябва да се за всички, някъле не се ли полълвапри зохо маи оеше nагасоdеа но маи и там си връшаха две категодииAneliya Angelova 4:00 PMЛукаш имаш ли време да се чуем за тестването на https://iiminny.atlassian.net/browse/JY-20725Jira CloudX Busb5-20125 in im locRHubsoot Oonmise CRM rematching on delete nubsoot ac...StatusReady for OA= MediumAA Aneliva AngelovaAs of today at 4:00 PMIOpen in JiraSummariseLukas Kovalik 4:02 PMVou idined the huddle (LIVE 4.02 pMAneliya Angelova is here tooAneliya Angelova 4:44 PM11512582Message Aneliva Angelova+ AaIAl Notes: OffLeavev u searchDate ModifiedYesterday at 13.23Yesterday at 13:22resterday at 13.2lYesterdav at 13:20Yesterday at 13:20resterady dl lo.1sYesterday at 13:19Yesterday at 13:18Yesterday at 13:1/Yesterdav at 13:17Yesterday at 13:16resterday at 15.1oYesterday at 13:15Yesterday at 13:14Yesterdav at 13:13resterday at 15-14Yesterday at 13:10Yocterdav at 12:10Yesterdav at 13:09Yesterday at 13.09Yesterdav at 13:08Yesterday at 13:08Yesterday at 13:07Vocterdav at 12:06Yesterday at 13:06Yesterday at 13.0bYecterdav at 12:0%Yesterday at 13:04Yesterday at 13:03Yactordau at 12:02Yesterday at 13:02Yecterdav at 12:01Yesterday at 13:00Yesterdav at 13:00Yesterday at 13:00Yesterday at 12:59Yocterdav at 12:59Yesterdav at 12:58Yesterday at 12:57Yesterdav at 12:57Yesterday at 12:56Yesterdav at 12:55MPEG-4 movie12 KBMPFG-4 movie23 KB8 KEMPEG-4 movie6KEMPEG-4 movie6KBMPEG-4 movie11 KBMPEG-4 movie11 K:20 KR34 KB10 KbMPFG-A movieMPEG-4 movie7 KBI5 KB11 KB26 K:MPEG-4 movieMPE0"4 movie111 KB102 KB88 KBMDEC.A movicMPEG-4 movie59 KBMPEG-4 movie98 KBMPEG-4 movie97 KBMPEG-4 movie66 K:44 KB93 KB78 KBMDECA movicMPEG-4 movieKOKR58 KB2/ KbMDEG-A movicMPEG-4 movie7 K:12 KBMDEC.A movid32 KE17 K8MPEG-4 movie10KRI32 KB10 KBMDSG-A movidMPEG-4 movieMPEG-4 movie24K:MPSG-A movid25 KBMPEG-4 movie49 KB27 K:55 KR67 KB51 KBMPEG-4 movieMDEG.A movidMPEG-4 movie17 KPMDEG-A movie22 KB MPEG-4 movie18 KBMPEG-4 movie170 KMPEG-4 movie197 KBMPEG-4 movie199 KB202 KB106 KPMPEG-4 movieMDSG-A movie198 KB MPEG-4 movie193 KEMPEG-4 movie191 K:MPEG-4 movid107 KD MDEC.A movid200 KВMPEG-4 movieL Lukás Koválik's No..n Home• No upcoming events7 View alliNew pageWork= Hubspot APl calls8 Hubsnot8 CRM• Work KnowledgeE DSK Report 2025EB DSK Report 202414 Report 2023(9 YEAR 2026ã) App replacemen2 Read later# LOGSã Report 20241 Videos4 Todo2 TestDailyAgents+ New agent* Quick Note- WorkKnowledgeIdeas4 Finance hubE=. Home viewe2 Integration-app*New chat x0Work• Jira ticket / New page'timestamp": 1773305812311, # 2026-03-12 08:56:52"sourced, "w ertd: 76091797",0d Huddle with Aneliva Ancelova*= Al Notes: Off vLukas KovalikScreen share"namp"l "dealstadoll"timestamp": 1751881632388, # ts 2025-07-07 09:47:12100% .• Inu 14 May 10.4/:10Edited 5h agoah Share v a* ..•Leave...
|
NULL
|
-1619412649288045270
|
NULL
|
click
|
ocr
|
NULL
|
Jiminny...vActivityFilesLater@ jiminny-x-integrati Jiminny...vActivityFilesLater@ jiminny-x-integrati….• plattorm-inner-teamE Channels# ai-chapter# alertsi backend# bugscontusion-cllnia# curiosity lab# engineering# general#jiminny-bgac nlattorm-nckets# product launches# random# releases# sofia-officed sunport# thank-yous# the people of iimi... Direct messages• e 02P. Galya Dimitrovavasil VasilevStefka StoyanovaSg: Todor StamatovMario GeorgieyNiudlay lanay. James Graham "* Stoyan Tanevad Stelivan Georgiev( Petko Kashinski*. Lukas Kovali...::: AnnsToastS lira Gloud6d Huddle with Aneliva AngelovaQ Describe what you are looking for* Aneliya Angelova &• MessagesAdd canvasur FilesTuesdav. April 28thvMonday, May 11thAneliva Angelova 1:24 PMIЛукаш за Huюsлог за синковете вече се изполава тази команла нали?Lukas Kovalik 1:32 PMла коон я пуска поез 5 минAneliya Angelova v 2:30 PMЛукаш, само при Сейлсфорс и Хубспот се синкваха активити типовете, когато се направи плейбук,Hanи?при останалите CRMi трябва рьчно да се въведатLukas Kovalik M 2:47 PNзлрастиами не знам по принцип се вика при всичкитрябва да се за всички, някъле не се ли полълвапри зохо маи оеше nагасоdеа но маи и там си връшаха две категодииAneliya Angelova 4:00 PMЛукаш имаш ли време да се чуем за тестването на https://iiminny.atlassian.net/browse/JY-20725Jira CloudX Busb5-20125 in im locRHubsoot Oonmise CRM rematching on delete nubsoot ac...StatusReady for OA= MediumAA Aneliva AngelovaAs of today at 4:00 PMIOpen in JiraSummariseLukas Kovalik 4:02 PMVou idined the huddle (LIVE 4.02 pMAneliya Angelova is here tooAneliya Angelova 4:44 PM11512582Message Aneliva Angelova+ AaIAl Notes: OffLeavev u searchDate ModifiedYesterday at 13.23Yesterday at 13:22resterday at 13.2lYesterdav at 13:20Yesterday at 13:20resterady dl lo.1sYesterday at 13:19Yesterday at 13:18Yesterday at 13:1/Yesterdav at 13:17Yesterday at 13:16resterday at 15.1oYesterday at 13:15Yesterday at 13:14Yesterdav at 13:13resterday at 15-14Yesterday at 13:10Yocterdav at 12:10Yesterdav at 13:09Yesterday at 13.09Yesterdav at 13:08Yesterday at 13:08Yesterday at 13:07Vocterdav at 12:06Yesterday at 13:06Yesterday at 13.0bYecterdav at 12:0%Yesterday at 13:04Yesterday at 13:03Yactordau at 12:02Yesterday at 13:02Yecterdav at 12:01Yesterday at 13:00Yesterdav at 13:00Yesterday at 13:00Yesterday at 12:59Yocterdav at 12:59Yesterdav at 12:58Yesterday at 12:57Yesterdav at 12:57Yesterday at 12:56Yesterdav at 12:55MPEG-4 movie12 KBMPFG-4 movie23 KB8 KEMPEG-4 movie6KEMPEG-4 movie6KBMPEG-4 movie11 KBMPEG-4 movie11 K:20 KR34 KB10 KbMPFG-A movieMPEG-4 movie7 KBI5 KB11 KB26 K:MPEG-4 movieMPE0"4 movie111 KB102 KB88 KBMDEC.A movicMPEG-4 movie59 KBMPEG-4 movie98 KBMPEG-4 movie97 KBMPEG-4 movie66 K:44 KB93 KB78 KBMDECA movicMPEG-4 movieKOKR58 KB2/ KbMDEG-A movicMPEG-4 movie7 K:12 KBMDEC.A movid32 KE17 K8MPEG-4 movie10KRI32 KB10 KBMDSG-A movidMPEG-4 movieMPEG-4 movie24K:MPSG-A movid25 KBMPEG-4 movie49 KB27 K:55 KR67 KB51 KBMPEG-4 movieMDEG.A movidMPEG-4 movie17 KPMDEG-A movie22 KB MPEG-4 movie18 KBMPEG-4 movie170 KMPEG-4 movie197 KBMPEG-4 movie199 KB202 KB106 KPMPEG-4 movieMDSG-A movie198 KB MPEG-4 movie193 KEMPEG-4 movie191 K:MPEG-4 movid107 KD MDEC.A movid200 KВMPEG-4 movieL Lukás Koválik's No..n Home• No upcoming events7 View alliNew pageWork= Hubspot APl calls8 Hubsnot8 CRM• Work KnowledgeE DSK Report 2025EB DSK Report 202414 Report 2023(9 YEAR 2026ã) App replacemen2 Read later# LOGSã Report 20241 Videos4 Todo2 TestDailyAgents+ New agent* Quick Note- WorkKnowledgeIdeas4 Finance hubE=. Home viewe2 Integration-app*New chat x0Work• Jira ticket / New page'timestamp": 1773305812311, # 2026-03-12 08:56:52"sourced, "w ertd: 76091797",0d Huddle with Aneliva Ancelova*= Al Notes: Off vLukas KovalikScreen share"namp"l "dealstadoll"timestamp": 1751881632388, # ts 2025-07-07 09:47:12100% .• Inu 14 May 10.4/:10Edited 5h agoah Share v a* ..•Leave...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
44373
|
1607
|
49
|
2026-05-14T13:47:16.025603+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-14/1778 /Users/lukas/.screenpipe/data/data/2026-05-14/1778766436025_m1.jpg...
|
PhpStorm
|
faVsco.js – IntegrationAppTrait.php
|
1
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
PhpStormFileEditViewNavigateCodeLaravelRefactorRun PhpStormFileEditViewNavigateCodeLaravelRefactorRunToolsGitWindowHelpabl19100% C8• Thu 14 May 16:47:15•FV faVsco.js* #12066 on JY-20725-handle-HS-search-rate-limit K vU HandleHubspotRateLimitTest ~QProject v© ReportController.php© AutomatedReportGenerated.phpE custom.log= laravel.log> • Hubspot© TrackAutomatedReportGeneratedEvent.phpPlaybackController.phpv D IntegrationAppSub:© AccountControll© UserAutomatedReportsController.phpPlanhatService.phpAutomatedReportResult.php© ContactControlleSendReportJob.php• DeleteCrmEntityTrait.php© DeleteAccountJob.php© AccountController.php( IntegrationAppTT IntegrationAppTrait.php x© DetachActivityObject.phpC RematchActivityOnCrmObjectDetach.php18© LeadController.F© OpportunityCont© MatchActivityCrmData.phpClient.phpHubspotPaginationService.php© ProfileController210© HandleHubspotRateLimit.php211© SystemControlle13trait IntegrationAppTraitA7T TokenDataTrait.21291protected function handleBulkDeletion(string $targetKey, string $fallbackKey,stri 213© ActivityProviderCor© ActivityTranscriptio103214© BaseController.php104// fallback to single target ID215• CalendarController.105$targetId = $this->getTargetCrmProviderId(targetKey: $fallbackKey,eventNe216© ReportController.ph106217SoftphoneWebhool107if (StargetId |== null) {218C AbstractController.php108$targetIds[] = $targetId;219109• CommentContextinter220© ConferencesOptinOut(110-221111© Controller.php—222112if (empty(StargetIds)) {ExportController.php223113Sthis->logger->warning('No target IDs found alter fallback for ' • $eventl 224© FrontendController.ph|T FrontendControllerTra114225115return new JsonResponse([], status: JsonResponse: :HTTP_BAD_REQUEST):© GeocodingController.p226© HealthCheckController116227117LiveCoachController.pl228© MissingTeamControlle118foreach ($targetIds as $targetId) {229119Sthis->deleteTarget(team: $team, targetid: (string) $targetid);© MobileController.php230© NotificationController.f120231121© NotificationProviderCc-232122return new JsonResponse([], status: JsonResponse: :HTTP_OK) ;PlaybackController.ph|233123© PlaylistController.php© PusherController.php124no usages© SlackController.php125 @abstract protected function deleteTarget(Team $team, string $targetid): void;© SupportController.php.26A TaomCotunCantrallar.Workspace associated with branch 'JY-20725-handle-HS-search-rate-limit' has been restored // Rollback // Configure... (29 minutes ago)4 SF jiminny@localhost]« HS_local ([jiminny@localhost]console [QAI PROD] X& console [PROD]« console [EU]Tx: Auto v >68 jiminny08 41 43 ×4 ^ Vesc;37):nfiguration_id = 1;E crm_layout_id = 1493;1652,1661,66799,66814,66821, 66836,66843ure_id = 33;ner_id THEN ' (owner)' ELSE "' END) AS-_id= 'hubspot':2582;W Windsurf Teams91:24UTF-8Co 4 spaces...
|
NULL
|
3997407333230471184
|
NULL
|
click
|
ocr
|
NULL
|
PhpStormFileEditViewNavigateCodeLaravelRefactorRun PhpStormFileEditViewNavigateCodeLaravelRefactorRunToolsGitWindowHelpabl19100% C8• Thu 14 May 16:47:15•FV faVsco.js* #12066 on JY-20725-handle-HS-search-rate-limit K vU HandleHubspotRateLimitTest ~QProject v© ReportController.php© AutomatedReportGenerated.phpE custom.log= laravel.log> • Hubspot© TrackAutomatedReportGeneratedEvent.phpPlaybackController.phpv D IntegrationAppSub:© AccountControll© UserAutomatedReportsController.phpPlanhatService.phpAutomatedReportResult.php© ContactControlleSendReportJob.php• DeleteCrmEntityTrait.php© DeleteAccountJob.php© AccountController.php( IntegrationAppTT IntegrationAppTrait.php x© DetachActivityObject.phpC RematchActivityOnCrmObjectDetach.php18© LeadController.F© OpportunityCont© MatchActivityCrmData.phpClient.phpHubspotPaginationService.php© ProfileController210© HandleHubspotRateLimit.php211© SystemControlle13trait IntegrationAppTraitA7T TokenDataTrait.21291protected function handleBulkDeletion(string $targetKey, string $fallbackKey,stri 213© ActivityProviderCor© ActivityTranscriptio103214© BaseController.php104// fallback to single target ID215• CalendarController.105$targetId = $this->getTargetCrmProviderId(targetKey: $fallbackKey,eventNe216© ReportController.ph106217SoftphoneWebhool107if (StargetId |== null) {218C AbstractController.php108$targetIds[] = $targetId;219109• CommentContextinter220© ConferencesOptinOut(110-221111© Controller.php—222112if (empty(StargetIds)) {ExportController.php223113Sthis->logger->warning('No target IDs found alter fallback for ' • $eventl 224© FrontendController.ph|T FrontendControllerTra114225115return new JsonResponse([], status: JsonResponse: :HTTP_BAD_REQUEST):© GeocodingController.p226© HealthCheckController116227117LiveCoachController.pl228© MissingTeamControlle118foreach ($targetIds as $targetId) {229119Sthis->deleteTarget(team: $team, targetid: (string) $targetid);© MobileController.php230© NotificationController.f120231121© NotificationProviderCc-232122return new JsonResponse([], status: JsonResponse: :HTTP_OK) ;PlaybackController.ph|233123© PlaylistController.php© PusherController.php124no usages© SlackController.php125 @abstract protected function deleteTarget(Team $team, string $targetid): void;© SupportController.php.26A TaomCotunCantrallar.Workspace associated with branch 'JY-20725-handle-HS-search-rate-limit' has been restored // Rollback // Configure... (29 minutes ago)4 SF jiminny@localhost]« HS_local ([jiminny@localhost]console [QAI PROD] X& console [PROD]« console [EU]Tx: Auto v >68 jiminny08 41 43 ×4 ^ Vesc;37):nfiguration_id = 1;E crm_layout_id = 1493;1652,1661,66799,66814,66821, 66836,66843ure_id = 33;ner_id THEN ' (owner)' ELSE "' END) AS-_id= 'hubspot':2582;W Windsurf Teams91:24UTF-8Co 4 spaces...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
44372
|
1607
|
48
|
2026-05-14T13:47:13.944063+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-14/1778 /Users/lukas/.screenpipe/data/data/2026-05-14/1778766433944_m1.jpg...
|
PhpStorm
|
faVsco.js – IntegrationAppTrait.php
|
1
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
#12066 on JY-20725-handle Project: faVsco.js, menu
#12066 on JY-20725-handle-HS-search-rate-limit, menu
Start Listening for PHP Debug Connections
HandleHubspotRateLimitTest
Run 'HandleHubspotRateLimitTest'
Debug 'HandleHubspotRateLimitTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
7
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Http\Controllers\Webhook\IntegrationAppSubscriptions;
use Illuminate\Http\JsonResponse;
use Jiminny\Contracts\Crm\Providers;
use Jiminny\Models\Team;
use Jiminny\Services\Crm\IntegrationApp\Service;
use Jiminny\Services\Crm\ProviderRegistry;
trait IntegrationAppTrait
{
abstract protected function getTeamFromRequest(): ?Team;
abstract protected function extractPayload(): array;
private function getPayload(): array
{
$payload = $this->extractPayload();
$this->logger->info('[integration-app] Event received', [
'payload' => $payload,
]);
return $payload;
}
private function extractTargetIdFromPayload(string $targetId): ?string
{
$payload = $this->getPayload();
return $payload[$targetId] ?? null;
}
private function extractTargetObjectIdsFromPayload(string $targetKey): array
{
$payload = $this->getPayload();
$objects = $payload[$targetKey] ?? [];
if (! is_array($objects) || empty($objects)) {
return [];
}
return array_values(array_filter(array_map(
static fn ($object) => is_array($object) ? ($object['id'] ?? null) : null,
$objects
)));
}
private function bootstrapIntegrationApp(Team $team): ?Service
{
$crmProvider = app(ProviderRegistry::class);
$providerName = $team->getCrmConfiguration()->getProviderName();
if (! Providers::isIntegrationAppProvider($providerName)) {
return null;
}
/** @var Service $integrationApp */
$integrationApp = $crmProvider->get($providerName);
$integrationApp->setUser($team->getOwner());
return $integrationApp;
}
private function getTargetCrmProviderId(string $targetKey, string $eventName): ?string
{
$targetId = $this->extractTargetIdFromPayload($targetKey);
$this->logger->info("[integration-app] Event: {$eventName}", [
'targetId' => $targetId,
'targetKey' => $targetKey,
]);
return $targetId;
}
private function getTargetCrmProviderObjectsIds(string $targetKey, string $eventName): array
{
$targetIds = $this->extractTargetObjectIdsFromPayload($targetKey);
$this->logger->info("[integration-app] Event: $eventName", [
'targetIds' => $targetIds,
'targetKey' => $targetKey,
'count' => count($targetIds),
]);
return $targetIds;
}
protected function handleBulkDeletion(string $targetKey, string $fallbackKey, string $eventName): JsonResponse
{
$team = $this->getTeamFromRequest();
if ($team === null) {
return new JsonResponse([], JsonResponse::HTTP_NO_CONTENT);
}
$targetIds = $this->getTargetCrmProviderObjectsIds(targetKey: $targetKey, eventName: $eventName);
if (empty($targetIds)) {
$this->logger->warning('No target IDs found for ' . $eventName);
// fallback to single target ID
$targetId = $this->getTargetCrmProviderId(targetKey: $fallbackKey, eventName: $eventName);
if ($targetId !== null) {
$targetIds[] = $targetId;
}
}
if (empty($targetIds)) {
$this->logger->warning('No target IDs found alter fallback for ' . $eventName);
return new JsonResponse([], JsonResponse::HTTP_BAD_REQUEST);
}
foreach ($targetIds as $targetId) {
$this->deleteTarget(team: $team, targetId: (string) $targetId);
}
return new JsonResponse([], JsonResponse::HTTP_OK);
}
abstract protected function deleteTarget(Team $team, string $targetId): void;
}
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
8
1
3
4
Previous Highlighted Error
Next Highlighted Error
SELECT
# DISTINCT
opp.id as opp_id, opp.uuid, opp.name,
# COUNT(dr.id) AS deal_risk_count,
# dr.id,
# cfd.value,
usr.name AS owner_name,
opp.value, opp.currency_code, opp.close_date, opp.remotely_created_at, opp.is_closed, opp.is_won,
usr.uuid as owner_uuid,
usr.photo_path as owner_photo,
usr.id AS owner_id,
jt.name as owner_job,
opp.stage_id, opp.stage_updated_at,
acc.name AS acc_name, opp.stage_updated_at, acc.crm_provider_id AS acc_provider_id, opp.crm_provider_id AS opp_provider_id,
rt.business_process_id AS pipeline_id
FROM opportunities opp
LEFT JOIN record_types rt ON opp.record_type_id = rt.id
LEFT JOIN users usr ON opp.user_id = usr.id
LEFT JOIN accounts acc ON opp.account_id = acc.id
LEFT JOIN job_titles jt ON usr.job_title_id = jt.id
# LEFT JOIN group_deal_risk_types gdrt ON gdrt.group_id = usr.group_id
# LEFT JOIN deal_risks dr ON dr.opportunity_id = opp.id AND dr.group_deal_risk_type_id = gdrt.id
LEFT JOIN crm_field_data cfd ON (cfd.object_id = opp.id and cfd.crm_field_id = 66814)
WHERE opp.user_id IS NOT NULL
AND opp.deleted_at IS NULL
AND opp.is_closed = 1
AND opp.is_won = 0
AND opp.close_date >= '2024-01-01 00:00:00'
AND opp.close_date <= '2024-12-31 23:59:59'
AND usr.team_id = 1
# and opp.id = 4823179
GROUP BY opp.id, cfd.value
ORDER BY
# cfd.value
CAST(cfd.value AS UNSIGNED)
# owner_name
# (SELECT COUNT(dr.id)
# FROM deal_risks dr
# JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id
# WHERE dr.opportunity_id = opp.id
# AND dr.is_active = 1
# AND gdrt.is_enabled = 1)
DESC
LIMIT 25
# OFFSET 0
;
select * from crm_fields where crm_configuration_id = 1 and object_type = 'opportunity';
select * from crm_layout_entities where crm_layout_id = 1493;
SELECT * FROM opportunities WHERE id = 4584045;
SELECT * FROM crm_field_data WHERE object_id = 4584045;
SELECT * FROM opportunities where team_id = 1 and crm_provider_id = '0061K00000lfb9IQAQ'
SELECT
opp.id as opportunity_id,
opp.name,
COUNT(dr.id) as risk_count
FROM opportunities opp
LEFT JOIN deal_risks dr ON dr.opportunity_id = opp.id
WHERE opp.id IN (
6069574,8900938,9507638,9524799,9660490,9662824,9705675,9749758,4158460,4391812,6450439,4448422,5118945,5590675,4584045,7228149,9002408,9165534,9446720,9641778,9665149,9703344,9709280,5747948,4158491,6182565,6263970,5798120,5111315,4536978,6062352,6548383,6072095,6548225,4480986,5011422,6548381,8760540,8917554,9509986,9514392,9569009,9569011,9578490,9713604,5784397,7276612,7288405,8994421,9118219,9608148,9818911,4510535,6479693,5958049,6271674,6550448,4158331,4158483,6126571,6171615,6540943,4897466,5190896,5796182,5932762,8572433,8723698,8892697,9711001,9789264,4549188,6100831,6170064,6260799,6263653,6449936,6530871,6538978,7777651,8059269,8319918,8787049,8901150,9263153,9453207,9514738,9696700,9791062,5752018,6421452,7439134,7878923,9354763,9369285,9514396,9582506,9889949,9890216,4094311,4158495,4158496,6098128,5585661,3872564,6442149,5891604,6164746,6199593,6583474,6519684,9018490,9809006,4496897,5041324,5829430,6198319,6253504,6555763,7242914,7931055,8024125,8797814,8058559,8673347,8892695,8994420,9616219,9714970,9722004,9809439,9818918,6523177,8134147,9002915,9711422,9892713,9901719,9954210,9978435,5800810,6243518,6416114,6222251,6411974,6512456,5791953,6545606,9914780,5805540,6238986,6463838,6547680,9767049,9809437,9810885,9890855,6673493,9902036,4335521,6379871,6503799,6546077,8018765,9907556,9958433,9905855,9916179,9946741,9957877,5563344,6271838,6450815,7641128,7762567,7780592,8684810,8685786,8685787,8685788
)
GROUP BY opp.id;
SELECT COUNT(dr.id)
FROM deal_risks dr
JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id
WHERE dr.opportunity_id = 5563344
# AND gdrt.group_id = usr.group_id
EXPLAIN SELECT
opp.id as opp_id, opp.uuid, opp.name,
cfd.value,
cfv.sequence,
cfv.value,
# MAX(cfd.value) AS max_cfd_value,
usr.name AS owner_name,
opp.value, opp.currency_code, opp.close_date, opp.remotely_created_at, opp.is_closed, opp.is_won,
usr.uuid as owner_uuid,
usr.photo_path as owner_photo,
usr.id AS owner_id,
jt.name as owner_job,
opp.stage_id, opp.stage_updated_at,
acc.name AS acc_name, opp.stage_updated_at, acc.crm_provider_id AS acc_provider_id, opp.crm_provider_id AS opp_provider_id,
rt.business_process_id AS pipeline_id
FROM opportunities opp
LEFT JOIN record_types rt ON opp.record_type_id = rt.id
LEFT JOIN users usr ON opp.user_id = usr.id
LEFT JOIN accounts acc ON opp.account_id = acc.id
LEFT JOIN job_titles jt ON usr.job_title_id = jt.id
LEFT JOIN crm_field_data cfd ON cfd.id = (SELECT sub_cfd.id
FROM crm_field_data sub_cfd
WHERE sub_cfd.object_id = opp.id
AND sub_cfd.crm_field_id = 66810
ORDER BY sub_cfd.updated_at DESC
LIMIT 1)
LEFT JOIN crm_field_values cfv ON cfv.crm_field_id = 66810 AND cfv.value = cfd.value
WHERE opp.user_id IS NOT NULL
AND opp.deleted_at IS NULL
AND opp.is_closed = 0
# AND opp.is_closed = 1
# AND opp.is_won = 0
AND opp.close_date >= '2024-01-01 00:00:00'
AND opp.close_date <= '2024-12-31 23:59:59'
AND usr.team_id = 1
# and opp.id = 4823179
# GROUP BY opp.id
ORDER BY
cfv.sequence DESC,
# opp.name
# owner_name
cfd.value
# CAST(cfd.value AS UNSIGNED)
# CAST(MAX(cfd.value) AS UNSIGNED)
# (SELECT COUNT(dr.id)
# FROM deal_risks dr
# JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id
# WHERE dr.opportunity_id = opp.id
# AND dr.is_active = 1 AND gdrt.is_enabled = 1)
DESC
# LIMIT 75, 25
;
SELECT * FROM crm_field_values WHERE crm_field_id = 66810;
SELECT f.id, f.crm_provider_id AS field_name, f.label, fd.object_id AS dealId, fd.value, fd.updated_at, fd.id, fd.created_at
FROM crm_fields f
INNER JOIN crm_field_data fd ON fd.crm_field_id = f.id
WHERE (f.crm_configuration_id = 1)
AND (f.object_type = 'opportunity')
# AND (fd.object_id IN (4158331,4158483,4158495,4158496,6069574,6263970,6171615,6540943,6545606,5829430,6198319,6263653,6548381,7242914,8797814,7228149,7439134,7878923,8134147,9002915,9118219,9165534,9354763,9369285,9446720))
AND (fd.object_id IN (4158460))
AND (f.crm_provider_id IN ('ForecastCategoryName'))
ORDER BY fd.object_id ASC, fd.updated_at DESC;
select * from crm_layouts where crm_configuration_id = 1;
select cf.* from crm_fields cf
join crm_layout_entities cle on cf.id = cle.crm_field_id
where crm_layout_id = 1493;
SELECT * FROM opportunities WHERE id = 4158460;
SELECT * FROM crm_field_data WHERE object_id = 4158460;
select * from users where team_id = 1;
SELECT * FROM users WHERE id = 7160;
select * from role_user where user_id = 3248;
select * from crm_field_values where crm_field_id = 66824;
SELECT * FROM users WHERE id = 23470;
select * from crm_configurations;
# [PASSWORD_DOTS]
select * from teams where id = 1038; # 23521, 966
select * from users where team_id = 1038;
select * from crm_configurations where id = 966;
SELECT * FROM activities WHERE uuid_to_bin('e8dc7c34-31f6-4430-bd81-2d9d8f00dd07') = uuid; # 54965762
SELECT * FROM activities WHERE uuid_to_bin('4b5727c0-69d1-428f-b8d9-b649055166e2') = uuid; # 54965764
SELECT * FROM participants WHERE activity_id = 54965764;
SELECT id, uuid, title, recording_state FROM activities WHERE uuid_to_bin('355f105d-5606-4379-b0c5-d91daf59f4ce') = uuid; # 54964075
SELECT * FROM participants WHERE activity_id = 54964075;
select f.id, slug, title, tf.team_id from team_features tf JOIN features f on tf.feature_id = f.id
where tf.team_id = 1038;
# [PASSWORD_DOTS] PD [PASSWORD_DOTS]
select * from teams where id = 1029;
SELECT * FROM crm_configurations WHERE id = 957;
SELECT * FROM activities WHERE uuid_to_bin('581a33cb-4343-44bd-ac0c-4a5cee71c5ec') = uuid; # 54963423
SELECT * FROM activities WHERE uuid_to_bin('07238011-25fa-418e-838b-fb21e82b9ea2') = uuid; # 54963433
SELECT * FROM activities WHERE uuid_to_bin('8b6bb2f7-e7a7-4aec-8806-fbfea7093ccd') = uuid; # 54963421
# [PASSWORD_DOTS] Close [PASSWORD_DOTS]
select * from teams where id = 1031;
SELECT * FROM crm_configurations WHERE id = 959;
SELECT * FROM activities WHERE uuid_to_bin('59c517e0-96c9-4dad-bfeb-b7bef72f8725') = uuid; # 54963517
SELECT * FROM activities WHERE uuid_to_bin('07238011-25fa-418e-838b-fb21e82b9ea2') = uuid; # 54963433
SELECT * FROM activities WHERE uuid_to_bin('d68311e3-ac34-49bd-bf04-88323a7e5352') = uuid; # 54966009
# [PASSWORD_DOTS] SF [PASSWORD_DOTS]
SELECT * FROM activities WHERE uuid_to_bin('2bd4cfa3-4eb5-4c77-84a7-9ed46a21c988') = uuid;
select * from roles;
select * from permissions;
select * from permission_role where permission_id = 136;
select * from migrations order by id desc;
select * from teams where id IN (1, 1037);
select * from crm_layouts where crm_configuration_id = 1;
SELECT * FROM crm_layout_entities WHERE crm_layout_id = 1493;
SELECT * FROM crm_fields WHERE id IN (1652,1661,66799,66814,66821,66836,66843,66846,66864,84752,182306,323580,380378);
select * from features;
select * from team_features where feature_id = 33;
select * from opportunities;
select * from teams;
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 = 1052 and sa.provider = 'hubspot';
SELECT * FROM accounts where id = 11512582;
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.054166667,"top":0.027777778,"width":0.08055556,"height":0.035555556},"on_screen":true,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"#12066 on JY-20725-handle-HS-search-rate-limit, menu","depth":5,"bounds":{"left":0.13472222,"top":0.027777778,"width":0.25555557,"height":0.035555556},"on_screen":true,"help_text":"Pull request #12066 exists for current branch JY-20725-handle-HS-search-rate-limit, but local branch is out of sync with remote","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"bounds":{"left":0.6326389,"top":0.027777778,"width":0.023611112,"height":0.035555556},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"HandleHubspotRateLimitTest","depth":6,"bounds":{"left":0.6645833,"top":0.027777778,"width":0.15902779,"height":0.035555556},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run 'HandleHubspotRateLimitTest'","depth":6,"bounds":{"left":0.82361114,"top":0.027777778,"width":0.023611112,"height":0.035555556},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'HandleHubspotRateLimitTest'","depth":6,"bounds":{"left":0.8472222,"top":0.027777778,"width":0.023611112,"height":0.035555556},"on_screen":true,"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.87083334,"top":0.027777778,"width":0.023611112,"height":0.035555556},"on_screen":true,"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.9291667,"top":0.027777778,"width":0.023611112,"height":0.035555556},"on_screen":true,"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.9527778,"top":0.027777778,"width":0.023611112,"height":0.035555556},"on_screen":true,"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.9763889,"top":0.027777778,"width":0.023611112,"height":0.035555556},"on_screen":true,"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},"on_screen":false,"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},"on_screen":false,"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},"on_screen":false,"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},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"7","depth":4,"bounds":{"left":0.6701389,"top":0.3122222,"width":0.015972223,"height":0.02111111},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.68958336,"top":0.31,"width":0.015277778,"height":0.025555555},"on_screen":true,"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.7048611,"top":0.31,"width":0.014583333,"height":0.025555555},"on_screen":true,"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\\Webhook\\IntegrationAppSubscriptions;\n\nuse Illuminate\\Http\\JsonResponse;\nuse Jiminny\\Contracts\\Crm\\Providers;\nuse Jiminny\\Models\\Team;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\Service;\nuse Jiminny\\Services\\Crm\\ProviderRegistry;\n\ntrait IntegrationAppTrait\n{\n abstract protected function getTeamFromRequest(): ?Team;\n\n abstract protected function extractPayload(): array;\n\n private function getPayload(): array\n {\n $payload = $this->extractPayload();\n $this->logger->info('[integration-app] Event received', [\n 'payload' => $payload,\n ]);\n\n return $payload;\n }\n\n private function extractTargetIdFromPayload(string $targetId): ?string\n {\n $payload = $this->getPayload();\n\n return $payload[$targetId] ?? null;\n }\n\n private function extractTargetObjectIdsFromPayload(string $targetKey): array\n {\n $payload = $this->getPayload();\n\n $objects = $payload[$targetKey] ?? [];\n\n if (! is_array($objects) || empty($objects)) {\n return [];\n }\n\n return array_values(array_filter(array_map(\n static fn ($object) => is_array($object) ? ($object['id'] ?? null) : null,\n $objects\n )));\n }\n\n private function bootstrapIntegrationApp(Team $team): ?Service\n {\n $crmProvider = app(ProviderRegistry::class);\n\n $providerName = $team->getCrmConfiguration()->getProviderName();\n if (! Providers::isIntegrationAppProvider($providerName)) {\n return null;\n }\n\n /** @var Service $integrationApp */\n $integrationApp = $crmProvider->get($providerName);\n $integrationApp->setUser($team->getOwner());\n\n return $integrationApp;\n }\n\n private function getTargetCrmProviderId(string $targetKey, string $eventName): ?string\n {\n $targetId = $this->extractTargetIdFromPayload($targetKey);\n $this->logger->info(\"[integration-app] Event: {$eventName}\", [\n 'targetId' => $targetId,\n 'targetKey' => $targetKey,\n ]);\n\n return $targetId;\n }\n\n private function getTargetCrmProviderObjectsIds(string $targetKey, string $eventName): array\n {\n $targetIds = $this->extractTargetObjectIdsFromPayload($targetKey);\n $this->logger->info(\"[integration-app] Event: $eventName\", [\n 'targetIds' => $targetIds,\n 'targetKey' => $targetKey,\n 'count' => count($targetIds),\n ]);\n\n return $targetIds;\n }\n\n protected function handleBulkDeletion(string $targetKey, string $fallbackKey, string $eventName): JsonResponse\n {\n $team = $this->getTeamFromRequest();\n\n if ($team === null) {\n return new JsonResponse([], JsonResponse::HTTP_NO_CONTENT);\n }\n\n $targetIds = $this->getTargetCrmProviderObjectsIds(targetKey: $targetKey, eventName: $eventName);\n\n if (empty($targetIds)) {\n $this->logger->warning('No target IDs found for ' . $eventName);\n\n // fallback to single target ID\n $targetId = $this->getTargetCrmProviderId(targetKey: $fallbackKey, eventName: $eventName);\n\n if ($targetId !== null) {\n $targetIds[] = $targetId;\n }\n }\n\n if (empty($targetIds)) {\n $this->logger->warning('No target IDs found alter fallback for ' . $eventName);\n\n return new JsonResponse([], JsonResponse::HTTP_BAD_REQUEST);\n }\n\n foreach ($targetIds as $targetId) {\n $this->deleteTarget(team: $team, targetId: (string) $targetId);\n }\n\n return new JsonResponse([], JsonResponse::HTTP_OK);\n }\n\n abstract protected function deleteTarget(Team $team, string $targetId): void;\n}","depth":4,"on_screen":true,"value":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Http\\Controllers\\Webhook\\IntegrationAppSubscriptions;\n\nuse Illuminate\\Http\\JsonResponse;\nuse Jiminny\\Contracts\\Crm\\Providers;\nuse Jiminny\\Models\\Team;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\Service;\nuse Jiminny\\Services\\Crm\\ProviderRegistry;\n\ntrait IntegrationAppTrait\n{\n abstract protected function getTeamFromRequest(): ?Team;\n\n abstract protected function extractPayload(): array;\n\n private function getPayload(): array\n {\n $payload = $this->extractPayload();\n $this->logger->info('[integration-app] Event received', [\n 'payload' => $payload,\n ]);\n\n return $payload;\n }\n\n private function extractTargetIdFromPayload(string $targetId): ?string\n {\n $payload = $this->getPayload();\n\n return $payload[$targetId] ?? null;\n }\n\n private function extractTargetObjectIdsFromPayload(string $targetKey): array\n {\n $payload = $this->getPayload();\n\n $objects = $payload[$targetKey] ?? [];\n\n if (! is_array($objects) || empty($objects)) {\n return [];\n }\n\n return array_values(array_filter(array_map(\n static fn ($object) => is_array($object) ? ($object['id'] ?? null) : null,\n $objects\n )));\n }\n\n private function bootstrapIntegrationApp(Team $team): ?Service\n {\n $crmProvider = app(ProviderRegistry::class);\n\n $providerName = $team->getCrmConfiguration()->getProviderName();\n if (! Providers::isIntegrationAppProvider($providerName)) {\n return null;\n }\n\n /** @var Service $integrationApp */\n $integrationApp = $crmProvider->get($providerName);\n $integrationApp->setUser($team->getOwner());\n\n return $integrationApp;\n }\n\n private function getTargetCrmProviderId(string $targetKey, string $eventName): ?string\n {\n $targetId = $this->extractTargetIdFromPayload($targetKey);\n $this->logger->info(\"[integration-app] Event: {$eventName}\", [\n 'targetId' => $targetId,\n 'targetKey' => $targetKey,\n ]);\n\n return $targetId;\n }\n\n private function getTargetCrmProviderObjectsIds(string $targetKey, string $eventName): array\n {\n $targetIds = $this->extractTargetObjectIdsFromPayload($targetKey);\n $this->logger->info(\"[integration-app] Event: $eventName\", [\n 'targetIds' => $targetIds,\n 'targetKey' => $targetKey,\n 'count' => count($targetIds),\n ]);\n\n return $targetIds;\n }\n\n protected function handleBulkDeletion(string $targetKey, string $fallbackKey, string $eventName): JsonResponse\n {\n $team = $this->getTeamFromRequest();\n\n if ($team === null) {\n return new JsonResponse([], JsonResponse::HTTP_NO_CONTENT);\n }\n\n $targetIds = $this->getTargetCrmProviderObjectsIds(targetKey: $targetKey, eventName: $eventName);\n\n if (empty($targetIds)) {\n $this->logger->warning('No target IDs found for ' . $eventName);\n\n // fallback to single target ID\n $targetId = $this->getTargetCrmProviderId(targetKey: $fallbackKey, eventName: $eventName);\n\n if ($targetId !== null) {\n $targetIds[] = $targetId;\n }\n }\n\n if (empty($targetIds)) {\n $this->logger->warning('No target IDs found alter fallback for ' . $eventName);\n\n return new JsonResponse([], JsonResponse::HTTP_BAD_REQUEST);\n }\n\n foreach ($targetIds as $targetId) {\n $this->deleteTarget(team: $team, targetId: (string) $targetId);\n }\n\n return new JsonResponse([], JsonResponse::HTTP_OK);\n }\n\n abstract protected function deleteTarget(Team $team, string $targetId): void;\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.72291666,"top":0.24111111,"width":0.018055556,"height":0.026666667},"on_screen":true,"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.7409722,"top":0.24111111,"width":0.018055556,"height":0.026666667},"on_screen":true,"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.7638889,"top":0.24111111,"width":0.018055556,"height":0.026666667},"on_screen":true,"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.78194445,"top":0.24111111,"width":0.018055556,"height":0.026666667},"on_screen":true,"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.8,"top":0.24111111,"width":0.018055556,"height":0.026666667},"on_screen":true,"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.8229167,"top":0.24111111,"width":0.018055556,"height":0.026666667},"on_screen":true,"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.84583336,"top":0.24111111,"width":0.050694443,"height":0.026666667},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Cancel Running Statements","depth":4,"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Playground","depth":4,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"jiminny","depth":4,"bounds":{"left":0.9138889,"top":0.24111111,"width":0.059027776,"height":0.026666667},"on_screen":true,"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},"on_screen":false,"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},"on_screen":false,"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},"on_screen":false,"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},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"8","depth":4,"bounds":{"left":0.8645833,"top":0.27555555,"width":0.016666668,"height":0.02111111},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"1","depth":4,"bounds":{"left":0.8854167,"top":0.27555555,"width":0.015277778,"height":0.02111111},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"3","depth":4,"bounds":{"left":0.9048611,"top":0.27555555,"width":0.016666668,"height":0.02111111},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"4","depth":4,"bounds":{"left":0.92569447,"top":0.27555555,"width":0.016666668,"height":0.02111111},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.9458333,"top":0.27333334,"width":0.015277778,"height":0.025555555},"on_screen":true,"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.9611111,"top":0.27333334,"width":0.014583333,"height":0.025555555},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"SELECT\n# DISTINCT\nopp.id as opp_id, opp.uuid, opp.name,\n# COUNT(dr.id) AS deal_risk_count,\n\n# dr.id,\n# cfd.value,\nusr.name AS owner_name,\nopp.value, opp.currency_code, opp.close_date, opp.remotely_created_at, opp.is_closed, opp.is_won,\nusr.uuid as owner_uuid,\nusr.photo_path as owner_photo,\nusr.id AS owner_id,\njt.name as owner_job,\nopp.stage_id, opp.stage_updated_at,\nacc.name AS acc_name, opp.stage_updated_at, acc.crm_provider_id AS acc_provider_id, opp.crm_provider_id AS opp_provider_id,\nrt.business_process_id AS pipeline_id\nFROM opportunities opp\nLEFT JOIN record_types rt ON opp.record_type_id = rt.id\nLEFT JOIN users usr ON opp.user_id = usr.id\nLEFT JOIN accounts acc ON opp.account_id = acc.id\nLEFT JOIN job_titles jt ON usr.job_title_id = jt.id\n\n# LEFT JOIN group_deal_risk_types gdrt ON gdrt.group_id = usr.group_id\n# LEFT JOIN deal_risks dr ON dr.opportunity_id = opp.id AND dr.group_deal_risk_type_id = gdrt.id\n\nLEFT JOIN crm_field_data cfd ON (cfd.object_id = opp.id and cfd.crm_field_id = 66814)\n\nWHERE opp.user_id IS NOT NULL\nAND opp.deleted_at IS NULL\nAND opp.is_closed = 1\nAND opp.is_won = 0\nAND opp.close_date >= '2024-01-01 00:00:00'\nAND opp.close_date <= '2024-12-31 23:59:59'\nAND usr.team_id = 1\n\n# and opp.id = 4823179\n\nGROUP BY opp.id, cfd.value\nORDER BY\n# cfd.value\n CAST(cfd.value AS UNSIGNED)\n# owner_name\n# (SELECT COUNT(dr.id)\n# FROM deal_risks dr\n# JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id\n# WHERE dr.opportunity_id = opp.id\n# AND dr.is_active = 1\n# AND gdrt.is_enabled = 1)\nDESC\nLIMIT 25\n# OFFSET 0\n;\n\nselect * from crm_fields where crm_configuration_id = 1 and object_type = 'opportunity';\nselect * from crm_layout_entities where crm_layout_id = 1493;\n\nSELECT * FROM opportunities WHERE id = 4584045;\nSELECT * FROM crm_field_data WHERE object_id = 4584045;\n\nSELECT * FROM opportunities where team_id = 1 and crm_provider_id = '0061K00000lfb9IQAQ'\n\nSELECT\n opp.id as opportunity_id,\n opp.name,\n COUNT(dr.id) as risk_count\nFROM opportunities opp\nLEFT JOIN deal_risks dr ON dr.opportunity_id = opp.id\nWHERE opp.id IN (\n 6069574,8900938,9507638,9524799,9660490,9662824,9705675,9749758,4158460,4391812,6450439,4448422,5118945,5590675,4584045,7228149,9002408,9165534,9446720,9641778,9665149,9703344,9709280,5747948,4158491,6182565,6263970,5798120,5111315,4536978,6062352,6548383,6072095,6548225,4480986,5011422,6548381,8760540,8917554,9509986,9514392,9569009,9569011,9578490,9713604,5784397,7276612,7288405,8994421,9118219,9608148,9818911,4510535,6479693,5958049,6271674,6550448,4158331,4158483,6126571,6171615,6540943,4897466,5190896,5796182,5932762,8572433,8723698,8892697,9711001,9789264,4549188,6100831,6170064,6260799,6263653,6449936,6530871,6538978,7777651,8059269,8319918,8787049,8901150,9263153,9453207,9514738,9696700,9791062,5752018,6421452,7439134,7878923,9354763,9369285,9514396,9582506,9889949,9890216,4094311,4158495,4158496,6098128,5585661,3872564,6442149,5891604,6164746,6199593,6583474,6519684,9018490,9809006,4496897,5041324,5829430,6198319,6253504,6555763,7242914,7931055,8024125,8797814,8058559,8673347,8892695,8994420,9616219,9714970,9722004,9809439,9818918,6523177,8134147,9002915,9711422,9892713,9901719,9954210,9978435,5800810,6243518,6416114,6222251,6411974,6512456,5791953,6545606,9914780,5805540,6238986,6463838,6547680,9767049,9809437,9810885,9890855,6673493,9902036,4335521,6379871,6503799,6546077,8018765,9907556,9958433,9905855,9916179,9946741,9957877,5563344,6271838,6450815,7641128,7762567,7780592,8684810,8685786,8685787,8685788\n)\nGROUP BY opp.id;\n\nSELECT COUNT(dr.id)\n FROM deal_risks dr\n JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id\n WHERE dr.opportunity_id = 5563344\n# AND gdrt.group_id = usr.group_id\n\n\n\nEXPLAIN SELECT\n opp.id as opp_id, opp.uuid, opp.name,\n\ncfd.value,\ncfv.sequence,\ncfv.value,\n# MAX(cfd.value) AS max_cfd_value,\nusr.name AS owner_name,\nopp.value, opp.currency_code, opp.close_date, opp.remotely_created_at, opp.is_closed, opp.is_won,\nusr.uuid as owner_uuid,\nusr.photo_path as owner_photo,\nusr.id AS owner_id,\njt.name as owner_job,\nopp.stage_id, opp.stage_updated_at,\nacc.name AS acc_name, opp.stage_updated_at, acc.crm_provider_id AS acc_provider_id, opp.crm_provider_id AS opp_provider_id,\nrt.business_process_id AS pipeline_id\nFROM opportunities opp\n\nLEFT JOIN record_types rt ON opp.record_type_id = rt.id\nLEFT JOIN users usr ON opp.user_id = usr.id\nLEFT JOIN accounts acc ON opp.account_id = acc.id\nLEFT JOIN job_titles jt ON usr.job_title_id = jt.id\n\nLEFT JOIN crm_field_data cfd ON cfd.id = (SELECT sub_cfd.id\n FROM crm_field_data sub_cfd\n WHERE sub_cfd.object_id = opp.id\n AND sub_cfd.crm_field_id = 66810\n ORDER BY sub_cfd.updated_at DESC\n LIMIT 1)\n\nLEFT JOIN crm_field_values cfv ON cfv.crm_field_id = 66810 AND cfv.value = cfd.value\n\nWHERE opp.user_id IS NOT NULL\nAND opp.deleted_at IS NULL\nAND opp.is_closed = 0\n# AND opp.is_closed = 1\n# AND opp.is_won = 0\nAND opp.close_date >= '2024-01-01 00:00:00'\nAND opp.close_date <= '2024-12-31 23:59:59'\nAND usr.team_id = 1\n\n# and opp.id = 4823179\n\n# GROUP BY opp.id\nORDER BY\n cfv.sequence DESC,\n# opp.name\n# owner_name\n cfd.value\n# CAST(cfd.value AS UNSIGNED)\n# CAST(MAX(cfd.value) AS UNSIGNED)\n# (SELECT COUNT(dr.id)\n# FROM deal_risks dr\n# JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id\n# WHERE dr.opportunity_id = opp.id\n# AND dr.is_active = 1 AND gdrt.is_enabled = 1)\nDESC\n# LIMIT 75, 25\n;\n\n\n\nSELECT * FROM crm_field_values WHERE crm_field_id = 66810;\n\nSELECT f.id, f.crm_provider_id AS field_name, f.label, fd.object_id AS dealId, fd.value, fd.updated_at, fd.id, fd.created_at\nFROM crm_fields f\nINNER JOIN crm_field_data fd ON fd.crm_field_id = f.id\n WHERE (f.crm_configuration_id = 1)\n AND (f.object_type = 'opportunity')\n# AND (fd.object_id IN (4158331,4158483,4158495,4158496,6069574,6263970,6171615,6540943,6545606,5829430,6198319,6263653,6548381,7242914,8797814,7228149,7439134,7878923,8134147,9002915,9118219,9165534,9354763,9369285,9446720))\n AND (fd.object_id IN (4158460))\n AND (f.crm_provider_id IN ('ForecastCategoryName'))\n ORDER BY fd.object_id ASC, fd.updated_at DESC;\n\nselect * from crm_layouts where crm_configuration_id = 1;\nselect cf.* from crm_fields cf\njoin crm_layout_entities cle on cf.id = cle.crm_field_id\nwhere crm_layout_id = 1493;\n\nSELECT * FROM opportunities WHERE id = 4158460;\nSELECT * FROM crm_field_data WHERE object_id = 4158460;\n\nselect * from users where team_id = 1;\nSELECT * FROM users WHERE id = 7160;\nselect * from role_user where user_id = 3248;\n\nselect * from crm_field_values where crm_field_id = 66824;\n\nSELECT * FROM users WHERE id = 23470;\nselect * from crm_configurations;\n\n# ******************************************\nselect * from teams where id = 1038; # 23521, 966\nselect * from users where team_id = 1038;\nselect * from crm_configurations where id = 966;\nSELECT * FROM activities WHERE uuid_to_bin('e8dc7c34-31f6-4430-bd81-2d9d8f00dd07') = uuid; # 54965762\nSELECT * FROM activities WHERE uuid_to_bin('4b5727c0-69d1-428f-b8d9-b649055166e2') = uuid; # 54965764\nSELECT * FROM participants WHERE activity_id = 54965764;\n\nSELECT id, uuid, title, recording_state FROM activities WHERE uuid_to_bin('355f105d-5606-4379-b0c5-d91daf59f4ce') = uuid; # 54964075\nSELECT * FROM participants WHERE activity_id = 54964075;\nselect f.id, slug, title, tf.team_id from team_features tf JOIN features f on tf.feature_id = f.id\n where tf.team_id = 1038;\n\n\n# ****************************************** PD *************************\nselect * from teams where id = 1029;\nSELECT * FROM crm_configurations WHERE id = 957;\nSELECT * FROM activities WHERE uuid_to_bin('581a33cb-4343-44bd-ac0c-4a5cee71c5ec') = uuid; # 54963423\nSELECT * FROM activities WHERE uuid_to_bin('07238011-25fa-418e-838b-fb21e82b9ea2') = uuid; # 54963433\n\nSELECT * FROM activities WHERE uuid_to_bin('8b6bb2f7-e7a7-4aec-8806-fbfea7093ccd') = uuid; # 54963421\n\n# ****************************************** Close *************************\nselect * from teams where id = 1031;\nSELECT * FROM crm_configurations WHERE id = 959;\nSELECT * FROM activities WHERE uuid_to_bin('59c517e0-96c9-4dad-bfeb-b7bef72f8725') = uuid; # 54963517\n\n\nSELECT * FROM activities WHERE uuid_to_bin('07238011-25fa-418e-838b-fb21e82b9ea2') = uuid; # 54963433\n\nSELECT * FROM activities WHERE uuid_to_bin('d68311e3-ac34-49bd-bf04-88323a7e5352') = uuid; # 54966009\n\n# ****************************************** SF *************************\nSELECT * FROM activities WHERE uuid_to_bin('2bd4cfa3-4eb5-4c77-84a7-9ed46a21c988') = uuid;\n\nselect * from roles;\nselect * from permissions;\nselect * from permission_role where permission_id = 136;\n\nselect * from migrations order by id desc;\n\nselect * from teams where id IN (1, 1037);\nselect * from crm_layouts where crm_configuration_id = 1;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1493;\nSELECT * FROM crm_fields WHERE id IN (1652,1661,66799,66814,66821,66836,66843,66846,66864,84752,182306,323580,380378);\n\nselect * from features;\nselect * from team_features where feature_id = 33;\nselect * from opportunities;\n\nselect * from teams;\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 = 1052 and sa.provider = 'hubspot';\n\nSELECT * FROM accounts where id = 11512582;","depth":4,"on_screen":true,"value":"SELECT\n# DISTINCT\nopp.id as opp_id, opp.uuid, opp.name,\n# COUNT(dr.id) AS deal_risk_count,\n\n# dr.id,\n# cfd.value,\nusr.name AS owner_name,\nopp.value, opp.currency_code, opp.close_date, opp.remotely_created_at, opp.is_closed, opp.is_won,\nusr.uuid as owner_uuid,\nusr.photo_path as owner_photo,\nusr.id AS owner_id,\njt.name as owner_job,\nopp.stage_id, opp.stage_updated_at,\nacc.name AS acc_name, opp.stage_updated_at, acc.crm_provider_id AS acc_provider_id, opp.crm_provider_id AS opp_provider_id,\nrt.business_process_id AS pipeline_id\nFROM opportunities opp\nLEFT JOIN record_types rt ON opp.record_type_id = rt.id\nLEFT JOIN users usr ON opp.user_id = usr.id\nLEFT JOIN accounts acc ON opp.account_id = acc.id\nLEFT JOIN job_titles jt ON usr.job_title_id = jt.id\n\n# LEFT JOIN group_deal_risk_types gdrt ON gdrt.group_id = usr.group_id\n# LEFT JOIN deal_risks dr ON dr.opportunity_id = opp.id AND dr.group_deal_risk_type_id = gdrt.id\n\nLEFT JOIN crm_field_data cfd ON (cfd.object_id = opp.id and cfd.crm_field_id = 66814)\n\nWHERE opp.user_id IS NOT NULL\nAND opp.deleted_at IS NULL\nAND opp.is_closed = 1\nAND opp.is_won = 0\nAND opp.close_date >= '2024-01-01 00:00:00'\nAND opp.close_date <= '2024-12-31 23:59:59'\nAND usr.team_id = 1\n\n# and opp.id = 4823179\n\nGROUP BY opp.id, cfd.value\nORDER BY\n# cfd.value\n CAST(cfd.value AS UNSIGNED)\n# owner_name\n# (SELECT COUNT(dr.id)\n# FROM deal_risks dr\n# JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id\n# WHERE dr.opportunity_id = opp.id\n# AND dr.is_active = 1\n# AND gdrt.is_enabled = 1)\nDESC\nLIMIT 25\n# OFFSET 0\n;\n\nselect * from crm_fields where crm_configuration_id = 1 and object_type = 'opportunity';\nselect * from crm_layout_entities where crm_layout_id = 1493;\n\nSELECT * FROM opportunities WHERE id = 4584045;\nSELECT * FROM crm_field_data WHERE object_id = 4584045;\n\nSELECT * FROM opportunities where team_id = 1 and crm_provider_id = '0061K00000lfb9IQAQ'\n\nSELECT\n opp.id as opportunity_id,\n opp.name,\n COUNT(dr.id) as risk_count\nFROM opportunities opp\nLEFT JOIN deal_risks dr ON dr.opportunity_id = opp.id\nWHERE opp.id IN (\n 6069574,8900938,9507638,9524799,9660490,9662824,9705675,9749758,4158460,4391812,6450439,4448422,5118945,5590675,4584045,7228149,9002408,9165534,9446720,9641778,9665149,9703344,9709280,5747948,4158491,6182565,6263970,5798120,5111315,4536978,6062352,6548383,6072095,6548225,4480986,5011422,6548381,8760540,8917554,9509986,9514392,9569009,9569011,9578490,9713604,5784397,7276612,7288405,8994421,9118219,9608148,9818911,4510535,6479693,5958049,6271674,6550448,4158331,4158483,6126571,6171615,6540943,4897466,5190896,5796182,5932762,8572433,8723698,8892697,9711001,9789264,4549188,6100831,6170064,6260799,6263653,6449936,6530871,6538978,7777651,8059269,8319918,8787049,8901150,9263153,9453207,9514738,9696700,9791062,5752018,6421452,7439134,7878923,9354763,9369285,9514396,9582506,9889949,9890216,4094311,4158495,4158496,6098128,5585661,3872564,6442149,5891604,6164746,6199593,6583474,6519684,9018490,9809006,4496897,5041324,5829430,6198319,6253504,6555763,7242914,7931055,8024125,8797814,8058559,8673347,8892695,8994420,9616219,9714970,9722004,9809439,9818918,6523177,8134147,9002915,9711422,9892713,9901719,9954210,9978435,5800810,6243518,6416114,6222251,6411974,6512456,5791953,6545606,9914780,5805540,6238986,6463838,6547680,9767049,9809437,9810885,9890855,6673493,9902036,4335521,6379871,6503799,6546077,8018765,9907556,9958433,9905855,9916179,9946741,9957877,5563344,6271838,6450815,7641128,7762567,7780592,8684810,8685786,8685787,8685788\n)\nGROUP BY opp.id;\n\nSELECT COUNT(dr.id)\n FROM deal_risks dr\n JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id\n WHERE dr.opportunity_id = 5563344\n# AND gdrt.group_id = usr.group_id\n\n\n\nEXPLAIN SELECT\n opp.id as opp_id, opp.uuid, opp.name,\n\ncfd.value,\ncfv.sequence,\ncfv.value,\n# MAX(cfd.value) AS max_cfd_value,\nusr.name AS owner_name,\nopp.value, opp.currency_code, opp.close_date, opp.remotely_created_at, opp.is_closed, opp.is_won,\nusr.uuid as owner_uuid,\nusr.photo_path as owner_photo,\nusr.id AS owner_id,\njt.name as owner_job,\nopp.stage_id, opp.stage_updated_at,\nacc.name AS acc_name, opp.stage_updated_at, acc.crm_provider_id AS acc_provider_id, opp.crm_provider_id AS opp_provider_id,\nrt.business_process_id AS pipeline_id\nFROM opportunities opp\n\nLEFT JOIN record_types rt ON opp.record_type_id = rt.id\nLEFT JOIN users usr ON opp.user_id = usr.id\nLEFT JOIN accounts acc ON opp.account_id = acc.id\nLEFT JOIN job_titles jt ON usr.job_title_id = jt.id\n\nLEFT JOIN crm_field_data cfd ON cfd.id = (SELECT sub_cfd.id\n FROM crm_field_data sub_cfd\n WHERE sub_cfd.object_id = opp.id\n AND sub_cfd.crm_field_id = 66810\n ORDER BY sub_cfd.updated_at DESC\n LIMIT 1)\n\nLEFT JOIN crm_field_values cfv ON cfv.crm_field_id = 66810 AND cfv.value = cfd.value\n\nWHERE opp.user_id IS NOT NULL\nAND opp.deleted_at IS NULL\nAND opp.is_closed = 0\n# AND opp.is_closed = 1\n# AND opp.is_won = 0\nAND opp.close_date >= '2024-01-01 00:00:00'\nAND opp.close_date <= '2024-12-31 23:59:59'\nAND usr.team_id = 1\n\n# and opp.id = 4823179\n\n# GROUP BY opp.id\nORDER BY\n cfv.sequence DESC,\n# opp.name\n# owner_name\n cfd.value\n# CAST(cfd.value AS UNSIGNED)\n# CAST(MAX(cfd.value) AS UNSIGNED)\n# (SELECT COUNT(dr.id)\n# FROM deal_risks dr\n# JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id\n# WHERE dr.opportunity_id = opp.id\n# AND dr.is_active = 1 AND gdrt.is_enabled = 1)\nDESC\n# LIMIT 75, 25\n;\n\n\n\nSELECT * FROM crm_field_values WHERE crm_field_id = 66810;\n\nSELECT f.id, f.crm_provider_id AS field_name, f.label, fd.object_id AS dealId, fd.value, fd.updated_at, fd.id, fd.created_at\nFROM crm_fields f\nINNER JOIN crm_field_data fd ON fd.crm_field_id = f.id\n WHERE (f.crm_configuration_id = 1)\n AND (f.object_type = 'opportunity')\n# AND (fd.object_id IN (4158331,4158483,4158495,4158496,6069574,6263970,6171615,6540943,6545606,5829430,6198319,6263653,6548381,7242914,8797814,7228149,7439134,7878923,8134147,9002915,9118219,9165534,9354763,9369285,9446720))\n AND (fd.object_id IN (4158460))\n AND (f.crm_provider_id IN ('ForecastCategoryName'))\n ORDER BY fd.object_id ASC, fd.updated_at DESC;\n\nselect * from crm_layouts where crm_configuration_id = 1;\nselect cf.* from crm_fields cf\njoin crm_layout_entities cle on cf.id = cle.crm_field_id\nwhere crm_layout_id = 1493;\n\nSELECT * FROM opportunities WHERE id = 4158460;\nSELECT * FROM crm_field_data WHERE object_id = 4158460;\n\nselect * from users where team_id = 1;\nSELECT * FROM users WHERE id = 7160;\nselect * from role_user where user_id = 3248;\n\nselect * from crm_field_values where crm_field_id = 66824;\n\nSELECT * FROM users WHERE id = 23470;\nselect * from crm_configurations;\n\n# ******************************************\nselect * from teams where id = 1038; # 23521, 966\nselect * from users where team_id = 1038;\nselect * from crm_configurations where id = 966;\nSELECT * FROM activities WHERE uuid_to_bin('e8dc7c34-31f6-4430-bd81-2d9d8f00dd07') = uuid; # 54965762\nSELECT * FROM activities WHERE uuid_to_bin('4b5727c0-69d1-428f-b8d9-b649055166e2') = uuid; # 54965764\nSELECT * FROM participants WHERE activity_id = 54965764;\n\nSELECT id, uuid, title, recording_state FROM activities WHERE uuid_to_bin('355f105d-5606-4379-b0c5-d91daf59f4ce') = uuid; # 54964075\nSELECT * FROM participants WHERE activity_id = 54964075;\nselect f.id, slug, title, tf.team_id from team_features tf JOIN features f on tf.feature_id = f.id\n where tf.team_id = 1038;\n\n\n# ****************************************** PD *************************\nselect * from teams where id = 1029;\nSELECT * FROM crm_configurations WHERE id = 957;\nSELECT * FROM activities WHERE uuid_to_bin('581a33cb-4343-44bd-ac0c-4a5cee71c5ec') = uuid; # 54963423\nSELECT * FROM activities WHERE uuid_to_bin('07238011-25fa-418e-838b-fb21e82b9ea2') = uuid; # 54963433\n\nSELECT * FROM activities WHERE uuid_to_bin('8b6bb2f7-e7a7-4aec-8806-fbfea7093ccd') = uuid; # 54963421\n\n# ****************************************** Close *************************\nselect * from teams where id = 1031;\nSELECT * FROM crm_configurations WHERE id = 959;\nSELECT * FROM activities WHERE uuid_to_bin('59c517e0-96c9-4dad-bfeb-b7bef72f8725') = uuid; # 54963517\n\n\nSELECT * FROM activities WHERE uuid_to_bin('07238011-25fa-418e-838b-fb21e82b9ea2') = uuid; # 54963433\n\nSELECT * FROM activities WHERE uuid_to_bin('d68311e3-ac34-49bd-bf04-88323a7e5352') = uuid; # 54966009\n\n# ****************************************** SF *************************\nSELECT * FROM activities WHERE uuid_to_bin('2bd4cfa3-4eb5-4c77-84a7-9ed46a21c988') = uuid;\n\nselect * from roles;\nselect * from permissions;\nselect * from permission_role where permission_id = 136;\n\nselect * from migrations order by id desc;\n\nselect * from teams where id IN (1, 1037);\nselect * from crm_layouts where crm_configuration_id = 1;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1493;\nSELECT * FROM crm_fields WHERE id IN (1652,1661,66799,66814,66821,66836,66843,66846,66864,84752,182306,323580,380378);\n\nselect * from features;\nselect * from team_features where feature_id = 33;\nselect * from opportunities;\n\nselect * from teams;\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 = 1052 and sa.provider = 'hubspot';\n\nSELECT * FROM accounts where id = 11512582;","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Project","depth":3,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Project","depth":3,"bounds":{"left":0.025,"top":0.06666667,"width":0.050694443,"height":0.034444444},"on_screen":true,"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},"on_screen":false,"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},"on_screen":false,"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},"on_screen":false,"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},"on_screen":false,"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},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
-3428666155218272246
|
6398094028691354589
|
visual_change
|
accessibility
|
NULL
|
Project: faVsco.js, menu
#12066 on JY-20725-handle Project: faVsco.js, menu
#12066 on JY-20725-handle-HS-search-rate-limit, menu
Start Listening for PHP Debug Connections
HandleHubspotRateLimitTest
Run 'HandleHubspotRateLimitTest'
Debug 'HandleHubspotRateLimitTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
7
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Http\Controllers\Webhook\IntegrationAppSubscriptions;
use Illuminate\Http\JsonResponse;
use Jiminny\Contracts\Crm\Providers;
use Jiminny\Models\Team;
use Jiminny\Services\Crm\IntegrationApp\Service;
use Jiminny\Services\Crm\ProviderRegistry;
trait IntegrationAppTrait
{
abstract protected function getTeamFromRequest(): ?Team;
abstract protected function extractPayload(): array;
private function getPayload(): array
{
$payload = $this->extractPayload();
$this->logger->info('[integration-app] Event received', [
'payload' => $payload,
]);
return $payload;
}
private function extractTargetIdFromPayload(string $targetId): ?string
{
$payload = $this->getPayload();
return $payload[$targetId] ?? null;
}
private function extractTargetObjectIdsFromPayload(string $targetKey): array
{
$payload = $this->getPayload();
$objects = $payload[$targetKey] ?? [];
if (! is_array($objects) || empty($objects)) {
return [];
}
return array_values(array_filter(array_map(
static fn ($object) => is_array($object) ? ($object['id'] ?? null) : null,
$objects
)));
}
private function bootstrapIntegrationApp(Team $team): ?Service
{
$crmProvider = app(ProviderRegistry::class);
$providerName = $team->getCrmConfiguration()->getProviderName();
if (! Providers::isIntegrationAppProvider($providerName)) {
return null;
}
/** @var Service $integrationApp */
$integrationApp = $crmProvider->get($providerName);
$integrationApp->setUser($team->getOwner());
return $integrationApp;
}
private function getTargetCrmProviderId(string $targetKey, string $eventName): ?string
{
$targetId = $this->extractTargetIdFromPayload($targetKey);
$this->logger->info("[integration-app] Event: {$eventName}", [
'targetId' => $targetId,
'targetKey' => $targetKey,
]);
return $targetId;
}
private function getTargetCrmProviderObjectsIds(string $targetKey, string $eventName): array
{
$targetIds = $this->extractTargetObjectIdsFromPayload($targetKey);
$this->logger->info("[integration-app] Event: $eventName", [
'targetIds' => $targetIds,
'targetKey' => $targetKey,
'count' => count($targetIds),
]);
return $targetIds;
}
protected function handleBulkDeletion(string $targetKey, string $fallbackKey, string $eventName): JsonResponse
{
$team = $this->getTeamFromRequest();
if ($team === null) {
return new JsonResponse([], JsonResponse::HTTP_NO_CONTENT);
}
$targetIds = $this->getTargetCrmProviderObjectsIds(targetKey: $targetKey, eventName: $eventName);
if (empty($targetIds)) {
$this->logger->warning('No target IDs found for ' . $eventName);
// fallback to single target ID
$targetId = $this->getTargetCrmProviderId(targetKey: $fallbackKey, eventName: $eventName);
if ($targetId !== null) {
$targetIds[] = $targetId;
}
}
if (empty($targetIds)) {
$this->logger->warning('No target IDs found alter fallback for ' . $eventName);
return new JsonResponse([], JsonResponse::HTTP_BAD_REQUEST);
}
foreach ($targetIds as $targetId) {
$this->deleteTarget(team: $team, targetId: (string) $targetId);
}
return new JsonResponse([], JsonResponse::HTTP_OK);
}
abstract protected function deleteTarget(Team $team, string $targetId): void;
}
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
8
1
3
4
Previous Highlighted Error
Next Highlighted Error
SELECT
# DISTINCT
opp.id as opp_id, opp.uuid, opp.name,
# COUNT(dr.id) AS deal_risk_count,
# dr.id,
# cfd.value,
usr.name AS owner_name,
opp.value, opp.currency_code, opp.close_date, opp.remotely_created_at, opp.is_closed, opp.is_won,
usr.uuid as owner_uuid,
usr.photo_path as owner_photo,
usr.id AS owner_id,
jt.name as owner_job,
opp.stage_id, opp.stage_updated_at,
acc.name AS acc_name, opp.stage_updated_at, acc.crm_provider_id AS acc_provider_id, opp.crm_provider_id AS opp_provider_id,
rt.business_process_id AS pipeline_id
FROM opportunities opp
LEFT JOIN record_types rt ON opp.record_type_id = rt.id
LEFT JOIN users usr ON opp.user_id = usr.id
LEFT JOIN accounts acc ON opp.account_id = acc.id
LEFT JOIN job_titles jt ON usr.job_title_id = jt.id
# LEFT JOIN group_deal_risk_types gdrt ON gdrt.group_id = usr.group_id
# LEFT JOIN deal_risks dr ON dr.opportunity_id = opp.id AND dr.group_deal_risk_type_id = gdrt.id
LEFT JOIN crm_field_data cfd ON (cfd.object_id = opp.id and cfd.crm_field_id = 66814)
WHERE opp.user_id IS NOT NULL
AND opp.deleted_at IS NULL
AND opp.is_closed = 1
AND opp.is_won = 0
AND opp.close_date >= '2024-01-01 00:00:00'
AND opp.close_date <= '2024-12-31 23:59:59'
AND usr.team_id = 1
# and opp.id = 4823179
GROUP BY opp.id, cfd.value
ORDER BY
# cfd.value
CAST(cfd.value AS UNSIGNED)
# owner_name
# (SELECT COUNT(dr.id)
# FROM deal_risks dr
# JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id
# WHERE dr.opportunity_id = opp.id
# AND dr.is_active = 1
# AND gdrt.is_enabled = 1)
DESC
LIMIT 25
# OFFSET 0
;
select * from crm_fields where crm_configuration_id = 1 and object_type = 'opportunity';
select * from crm_layout_entities where crm_layout_id = 1493;
SELECT * FROM opportunities WHERE id = 4584045;
SELECT * FROM crm_field_data WHERE object_id = 4584045;
SELECT * FROM opportunities where team_id = 1 and crm_provider_id = '0061K00000lfb9IQAQ'
SELECT
opp.id as opportunity_id,
opp.name,
COUNT(dr.id) as risk_count
FROM opportunities opp
LEFT JOIN deal_risks dr ON dr.opportunity_id = opp.id
WHERE opp.id IN (
6069574,8900938,9507638,9524799,9660490,9662824,9705675,9749758,4158460,4391812,6450439,4448422,5118945,5590675,4584045,7228149,9002408,9165534,9446720,9641778,9665149,9703344,9709280,5747948,4158491,6182565,6263970,5798120,5111315,4536978,6062352,6548383,6072095,6548225,4480986,5011422,6548381,8760540,8917554,9509986,9514392,9569009,9569011,9578490,9713604,5784397,7276612,7288405,8994421,9118219,9608148,9818911,4510535,6479693,5958049,6271674,6550448,4158331,4158483,6126571,6171615,6540943,4897466,5190896,5796182,5932762,8572433,8723698,8892697,9711001,9789264,4549188,6100831,6170064,6260799,6263653,6449936,6530871,6538978,7777651,8059269,8319918,8787049,8901150,9263153,9453207,9514738,9696700,9791062,5752018,6421452,7439134,7878923,9354763,9369285,9514396,9582506,9889949,9890216,4094311,4158495,4158496,6098128,5585661,3872564,6442149,5891604,6164746,6199593,6583474,6519684,9018490,9809006,4496897,5041324,5829430,6198319,6253504,6555763,7242914,7931055,8024125,8797814,8058559,8673347,8892695,8994420,9616219,9714970,9722004,9809439,9818918,6523177,8134147,9002915,9711422,9892713,9901719,9954210,9978435,5800810,6243518,6416114,6222251,6411974,6512456,5791953,6545606,9914780,5805540,6238986,6463838,6547680,9767049,9809437,9810885,9890855,6673493,9902036,4335521,6379871,6503799,6546077,8018765,9907556,9958433,9905855,9916179,9946741,9957877,5563344,6271838,6450815,7641128,7762567,7780592,8684810,8685786,8685787,8685788
)
GROUP BY opp.id;
SELECT COUNT(dr.id)
FROM deal_risks dr
JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id
WHERE dr.opportunity_id = 5563344
# AND gdrt.group_id = usr.group_id
EXPLAIN SELECT
opp.id as opp_id, opp.uuid, opp.name,
cfd.value,
cfv.sequence,
cfv.value,
# MAX(cfd.value) AS max_cfd_value,
usr.name AS owner_name,
opp.value, opp.currency_code, opp.close_date, opp.remotely_created_at, opp.is_closed, opp.is_won,
usr.uuid as owner_uuid,
usr.photo_path as owner_photo,
usr.id AS owner_id,
jt.name as owner_job,
opp.stage_id, opp.stage_updated_at,
acc.name AS acc_name, opp.stage_updated_at, acc.crm_provider_id AS acc_provider_id, opp.crm_provider_id AS opp_provider_id,
rt.business_process_id AS pipeline_id
FROM opportunities opp
LEFT JOIN record_types rt ON opp.record_type_id = rt.id
LEFT JOIN users usr ON opp.user_id = usr.id
LEFT JOIN accounts acc ON opp.account_id = acc.id
LEFT JOIN job_titles jt ON usr.job_title_id = jt.id
LEFT JOIN crm_field_data cfd ON cfd.id = (SELECT sub_cfd.id
FROM crm_field_data sub_cfd
WHERE sub_cfd.object_id = opp.id
AND sub_cfd.crm_field_id = 66810
ORDER BY sub_cfd.updated_at DESC
LIMIT 1)
LEFT JOIN crm_field_values cfv ON cfv.crm_field_id = 66810 AND cfv.value = cfd.value
WHERE opp.user_id IS NOT NULL
AND opp.deleted_at IS NULL
AND opp.is_closed = 0
# AND opp.is_closed = 1
# AND opp.is_won = 0
AND opp.close_date >= '2024-01-01 00:00:00'
AND opp.close_date <= '2024-12-31 23:59:59'
AND usr.team_id = 1
# and opp.id = 4823179
# GROUP BY opp.id
ORDER BY
cfv.sequence DESC,
# opp.name
# owner_name
cfd.value
# CAST(cfd.value AS UNSIGNED)
# CAST(MAX(cfd.value) AS UNSIGNED)
# (SELECT COUNT(dr.id)
# FROM deal_risks dr
# JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id
# WHERE dr.opportunity_id = opp.id
# AND dr.is_active = 1 AND gdrt.is_enabled = 1)
DESC
# LIMIT 75, 25
;
SELECT * FROM crm_field_values WHERE crm_field_id = 66810;
SELECT f.id, f.crm_provider_id AS field_name, f.label, fd.object_id AS dealId, fd.value, fd.updated_at, fd.id, fd.created_at
FROM crm_fields f
INNER JOIN crm_field_data fd ON fd.crm_field_id = f.id
WHERE (f.crm_configuration_id = 1)
AND (f.object_type = 'opportunity')
# AND (fd.object_id IN (4158331,4158483,4158495,4158496,6069574,6263970,6171615,6540943,6545606,5829430,6198319,6263653,6548381,7242914,8797814,7228149,7439134,7878923,8134147,9002915,9118219,9165534,9354763,9369285,9446720))
AND (fd.object_id IN (4158460))
AND (f.crm_provider_id IN ('ForecastCategoryName'))
ORDER BY fd.object_id ASC, fd.updated_at DESC;
select * from crm_layouts where crm_configuration_id = 1;
select cf.* from crm_fields cf
join crm_layout_entities cle on cf.id = cle.crm_field_id
where crm_layout_id = 1493;
SELECT * FROM opportunities WHERE id = 4158460;
SELECT * FROM crm_field_data WHERE object_id = 4158460;
select * from users where team_id = 1;
SELECT * FROM users WHERE id = 7160;
select * from role_user where user_id = 3248;
select * from crm_field_values where crm_field_id = 66824;
SELECT * FROM users WHERE id = 23470;
select * from crm_configurations;
# [PASSWORD_DOTS]
select * from teams where id = 1038; # 23521, 966
select * from users where team_id = 1038;
select * from crm_configurations where id = 966;
SELECT * FROM activities WHERE uuid_to_bin('e8dc7c34-31f6-4430-bd81-2d9d8f00dd07') = uuid; # 54965762
SELECT * FROM activities WHERE uuid_to_bin('4b5727c0-69d1-428f-b8d9-b649055166e2') = uuid; # 54965764
SELECT * FROM participants WHERE activity_id = 54965764;
SELECT id, uuid, title, recording_state FROM activities WHERE uuid_to_bin('355f105d-5606-4379-b0c5-d91daf59f4ce') = uuid; # 54964075
SELECT * FROM participants WHERE activity_id = 54964075;
select f.id, slug, title, tf.team_id from team_features tf JOIN features f on tf.feature_id = f.id
where tf.team_id = 1038;
# [PASSWORD_DOTS] PD [PASSWORD_DOTS]
select * from teams where id = 1029;
SELECT * FROM crm_configurations WHERE id = 957;
SELECT * FROM activities WHERE uuid_to_bin('581a33cb-4343-44bd-ac0c-4a5cee71c5ec') = uuid; # 54963423
SELECT * FROM activities WHERE uuid_to_bin('07238011-25fa-418e-838b-fb21e82b9ea2') = uuid; # 54963433
SELECT * FROM activities WHERE uuid_to_bin('8b6bb2f7-e7a7-4aec-8806-fbfea7093ccd') = uuid; # 54963421
# [PASSWORD_DOTS] Close [PASSWORD_DOTS]
select * from teams where id = 1031;
SELECT * FROM crm_configurations WHERE id = 959;
SELECT * FROM activities WHERE uuid_to_bin('59c517e0-96c9-4dad-bfeb-b7bef72f8725') = uuid; # 54963517
SELECT * FROM activities WHERE uuid_to_bin('07238011-25fa-418e-838b-fb21e82b9ea2') = uuid; # 54963433
SELECT * FROM activities WHERE uuid_to_bin('d68311e3-ac34-49bd-bf04-88323a7e5352') = uuid; # 54966009
# [PASSWORD_DOTS] SF [PASSWORD_DOTS]
SELECT * FROM activities WHERE uuid_to_bin('2bd4cfa3-4eb5-4c77-84a7-9ed46a21c988') = uuid;
select * from roles;
select * from permissions;
select * from permission_role where permission_id = 136;
select * from migrations order by id desc;
select * from teams where id IN (1, 1037);
select * from crm_layouts where crm_configuration_id = 1;
SELECT * FROM crm_layout_entities WHERE crm_layout_id = 1493;
SELECT * FROM crm_fields WHERE id IN (1652,1661,66799,66814,66821,66836,66843,66846,66864,84752,182306,323580,380378);
select * from features;
select * from team_features where feature_id = 33;
select * from opportunities;
select * from teams;
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 = 1052 and sa.provider = 'hubspot';
SELECT * FROM accounts where id = 11512582;
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide...
|
44370
|
NULL
|
NULL
|
NULL
|
|
44370
|
1607
|
47
|
2026-05-14T13:47:10.920879+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-14/1778 /Users/lukas/.screenpipe/data/data/2026-05-14/1778766430920_m1.jpg...
|
PhpStorm
|
faVsco.js – IntegrationAppTrait.php
|
1
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
#12066 on JY-20725-handle Project: faVsco.js, menu
#12066 on JY-20725-handle-HS-search-rate-limit, menu
Start Listening for PHP Debug Connections
HandleHubspotRateLimitTest
Run 'HandleHubspotRateLimitTest'
Debug 'HandleHubspotRateLimitTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
<?php
declare(strict_types=1);
namespace Jiminny\Http\Controllers\Webhook\IntegrationAppSubscriptions;
use Illuminate\Http\JsonResponse;
use Jiminny\Contracts\Crm\Providers;
use Jiminny\Models\Team;
use Jiminny\Services\Crm\IntegrationApp\Service;
use Jiminny\Services\Crm\ProviderRegistry;
trait IntegrationAppTrait
{
abstract protected function getTeamFromRequest(): ?Team;
abstract protected function extractPayload(): array;
private function getPayload(): array
{
$payload = $this->extractPayload();
$this->logger->info('[integration-app] Event received', [
'payload' => $payload,
]);
return $payload;
}
private function extractTargetIdFromPayload(string $targetId): ?string
{
$payload = $this->getPayload();
return $payload[$targetId] ?? null;
}
private function extractTargetObjectIdsFromPayload(string $targetKey): array
{
$payload = $this->getPayload();
$objects = $payload[$targetKey] ?? [];
if (! is_array($objects) || empty($objects)) {
return [];
}
return array_values(array_filter(array_map(
static fn ($object) => is_array($object) ? ($object['id'] ?? null) : null,
$objects
)));
}
private function bootstrapIntegrationApp(Team $team): ?Service
{
$crmProvider = app(ProviderRegistry::class);
$providerName = $team->getCrmConfiguration()->getProviderName();
if (! Providers::isIntegrationAppProvider($providerName)) {
return null;
}
/** @var Service $integrationApp */
$integrationApp = $crmProvider->get($providerName);
$integrationApp->setUser($team->getOwner());
return $integrationApp;
}
private function getTargetCrmProviderId(string $targetKey, string $eventName): ?string
{
$targetId = $this->extractTargetIdFromPayload($targetKey);
$this->logger->info("[integration-app] Event: {$eventName}", [
'targetId' => $targetId,
'targetKey' => $targetKey,
]);
return $targetId;
}
private function getTargetCrmProviderObjectsIds(string $targetKey, string $eventName): array
{
$targetIds = $this->extractTargetObjectIdsFromPayload($targetKey);
$this->logger->info("[integration-app] Event: $eventName", [
'targetIds' => $targetIds,
'targetKey' => $targetKey,
'count' => count($targetIds),
]);
return $targetIds;
}
protected function handleBulkDeletion(string $targetKey, string $fallbackKey, string $eventName): JsonResponse
{
$team = $this->getTeamFromRequest();
if ($team === null) {
return new JsonResponse([], JsonResponse::HTTP_NO_CONTENT);
}
$targetIds = $this->getTargetCrmProviderObjectsIds(targetKey: $targetKey, eventName: $eventName);
if (empty($targetIds)) {
$this->logger->warning('No target IDs found for ' . $eventName);
// fallback to single target ID
$targetId = $this->getTargetCrmProviderId(targetKey: $fallbackKey, eventName: $eventName);
if ($targetId !== null) {
$targetIds[] = $targetId;
}
}
if (empty($targetIds)) {
$this->logger->warning('No target IDs found alter fallback for ' . $eventName);
return new JsonResponse([], JsonResponse::HTTP_BAD_REQUEST);
}
foreach ($targetIds as $targetId) {
$this->deleteTarget(team: $team, targetId: (string) $targetId);
}
return new JsonResponse([], JsonResponse::HTTP_OK);
}
abstract protected function deleteTarget(Team $team, string $targetId): void;
}
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
8
1
3
4
Previous Highlighted Error
Next Highlighted Error
SELECT
# DISTINCT
opp.id as opp_id, opp.uuid, opp.name,
# COUNT(dr.id) AS deal_risk_count,
# dr.id,
# cfd.value,
usr.name AS owner_name,
opp.value, opp.currency_code, opp.close_date, opp.remotely_created_at, opp.is_closed, opp.is_won,
usr.uuid as owner_uuid,
usr.photo_path as owner_photo,
usr.id AS owner_id,
jt.name as owner_job,
opp.stage_id, opp.stage_updated_at,
acc.name AS acc_name, opp.stage_updated_at, acc.crm_provider_id AS acc_provider_id, opp.crm_provider_id AS opp_provider_id,
rt.business_process_id AS pipeline_id
FROM opportunities opp
LEFT JOIN record_types rt ON opp.record_type_id = rt.id
LEFT JOIN users usr ON opp.user_id = usr.id
LEFT JOIN accounts acc ON opp.account_id = acc.id
LEFT JOIN job_titles jt ON usr.job_title_id = jt.id
# LEFT JOIN group_deal_risk_types gdrt ON gdrt.group_id = usr.group_id
# LEFT JOIN deal_risks dr ON dr.opportunity_id = opp.id AND dr.group_deal_risk_type_id = gdrt.id
LEFT JOIN crm_field_data cfd ON (cfd.object_id = opp.id and cfd.crm_field_id = 66814)
WHERE opp.user_id IS NOT NULL
AND opp.deleted_at IS NULL
AND opp.is_closed = 1
AND opp.is_won = 0
AND opp.close_date >= '2024-01-01 00:00:00'
AND opp.close_date <= '2024-12-31 23:59:59'
AND usr.team_id = 1
# and opp.id = 4823179
GROUP BY opp.id, cfd.value
ORDER BY
# cfd.value
CAST(cfd.value AS UNSIGNED)
# owner_name
# (SELECT COUNT(dr.id)
# FROM deal_risks dr
# JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id
# WHERE dr.opportunity_id = opp.id
# AND dr.is_active = 1
# AND gdrt.is_enabled = 1)
DESC
LIMIT 25
# OFFSET 0
;
select * from crm_fields where crm_configuration_id = 1 and object_type = 'opportunity';
select * from crm_layout_entities where crm_layout_id = 1493;
SELECT * FROM opportunities WHERE id = 4584045;
SELECT * FROM crm_field_data WHERE object_id = 4584045;
SELECT * FROM opportunities where team_id = 1 and crm_provider_id = '0061K00000lfb9IQAQ'
SELECT
opp.id as opportunity_id,
opp.name,
COUNT(dr.id) as risk_count
FROM opportunities opp
LEFT JOIN deal_risks dr ON dr.opportunity_id = opp.id
WHERE opp.id IN (
6069574,8900938,9507638,9524799,9660490,9662824,9705675,9749758,4158460,4391812,6450439,4448422,5118945,5590675,4584045,7228149,9002408,9165534,9446720,9641778,9665149,9703344,9709280,5747948,4158491,6182565,6263970,5798120,5111315,4536978,6062352,6548383,6072095,6548225,4480986,5011422,6548381,8760540,8917554,9509986,9514392,9569009,9569011,9578490,9713604,5784397,7276612,7288405,8994421,9118219,9608148,9818911,4510535,6479693,5958049,6271674,6550448,4158331,4158483,6126571,6171615,6540943,4897466,5190896,5796182,5932762,8572433,8723698,8892697,9711001,9789264,4549188,6100831,6170064,6260799,6263653,6449936,6530871,6538978,7777651,8059269,8319918,8787049,8901150,9263153,9453207,9514738,9696700,9791062,5752018,6421452,7439134,7878923,9354763,9369285,9514396,9582506,9889949,9890216,4094311,4158495,4158496,6098128,5585661,3872564,6442149,5891604,6164746,6199593,6583474,6519684,9018490,9809006,4496897,5041324,5829430,6198319,6253504,6555763,7242914,7931055,8024125,8797814,8058559,8673347,8892695,8994420,9616219,9714970,9722004,9809439,9818918,6523177,8134147,9002915,9711422,9892713,9901719,9954210,9978435,5800810,6243518,6416114,6222251,6411974,6512456,5791953,6545606,9914780,5805540,6238986,6463838,6547680,9767049,9809437,9810885,9890855,6673493,9902036,4335521,6379871,6503799,6546077,8018765,9907556,9958433,9905855,9916179,9946741,9957877,5563344,6271838,6450815,7641128,7762567,7780592,8684810,8685786,8685787,8685788
)
GROUP BY opp.id;
SELECT COUNT(dr.id)
FROM deal_risks dr
JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id
WHERE dr.opportunity_id = 5563344
# AND gdrt.group_id = usr.group_id
EXPLAIN SELECT
opp.id as opp_id, opp.uuid, opp.name,
cfd.value,
cfv.sequence,
cfv.value,
# MAX(cfd.value) AS max_cfd_value,
usr.name AS owner_name,
opp.value, opp.currency_code, opp.close_date, opp.remotely_created_at, opp.is_closed, opp.is_won,
usr.uuid as owner_uuid,
usr.photo_path as owner_photo,
usr.id AS owner_id,
jt.name as owner_job,
opp.stage_id, opp.stage_updated_at,
acc.name AS acc_name, opp.stage_updated_at, acc.crm_provider_id AS acc_provider_id, opp.crm_provider_id AS opp_provider_id,
rt.business_process_id AS pipeline_id
FROM opportunities opp
LEFT JOIN record_types rt ON opp.record_type_id = rt.id
LEFT JOIN users usr ON opp.user_id = usr.id
LEFT JOIN accounts acc ON opp.account_id = acc.id
LEFT JOIN job_titles jt ON usr.job_title_id = jt.id
LEFT JOIN crm_field_data cfd ON cfd.id = (SELECT sub_cfd.id
FROM crm_field_data sub_cfd
WHERE sub_cfd.object_id = opp.id
AND sub_cfd.crm_field_id = 66810
ORDER BY sub_cfd.updated_at DESC
LIMIT 1)
LEFT JOIN crm_field_values cfv ON cfv.crm_field_id = 66810 AND cfv.value = cfd.value
WHERE opp.user_id IS NOT NULL
AND opp.deleted_at IS NULL
AND opp.is_closed = 0
# AND opp.is_closed = 1
# AND opp.is_won = 0
AND opp.close_date >= '2024-01-01 00:00:00'
AND opp.close_date <= '2024-12-31 23:59:59'
AND usr.team_id = 1
# and opp.id = 4823179
# GROUP BY opp.id
ORDER BY
cfv.sequence DESC,
# opp.name
# owner_name
cfd.value
# CAST(cfd.value AS UNSIGNED)
# CAST(MAX(cfd.value) AS UNSIGNED)
# (SELECT COUNT(dr.id)
# FROM deal_risks dr
# JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id
# WHERE dr.opportunity_id = opp.id
# AND dr.is_active = 1 AND gdrt.is_enabled = 1)
DESC
# LIMIT 75, 25
;
SELECT * FROM crm_field_values WHERE crm_field_id = 66810;
SELECT f.id, f.crm_provider_id AS field_name, f.label, fd.object_id AS dealId, fd.value, fd.updated_at, fd.id, fd.created_at
FROM crm_fields f
INNER JOIN crm_field_data fd ON fd.crm_field_id = f.id
WHERE (f.crm_configuration_id = 1)
AND (f.object_type = 'opportunity')
# AND (fd.object_id IN (4158331,4158483,4158495,4158496,6069574,6263970,6171615,6540943,6545606,5829430,6198319,6263653,6548381,7242914,8797814,7228149,7439134,7878923,8134147,9002915,9118219,9165534,9354763,9369285,9446720))
AND (fd.object_id IN (4158460))
AND (f.crm_provider_id IN ('ForecastCategoryName'))
ORDER BY fd.object_id ASC, fd.updated_at DESC;
select * from crm_layouts where crm_configuration_id = 1;
select cf.* from crm_fields cf
join crm_layout_entities cle on cf.id = cle.crm_field_id
where crm_layout_id = 1493;
SELECT * FROM opportunities WHERE id = 4158460;
SELECT * FROM crm_field_data WHERE object_id = 4158460;
select * from users where team_id = 1;
SELECT * FROM users WHERE id = 7160;
select * from role_user where user_id = 3248;
select * from crm_field_values where crm_field_id = 66824;
SELECT * FROM users WHERE id = 23470;
select * from crm_configurations;
# [PASSWORD_DOTS]
select * from teams where id = 1038; # 23521, 966
select * from users where team_id = 1038;
select * from crm_configurations where id = 966;
SELECT * FROM activities WHERE uuid_to_bin('e8dc7c34-31f6-4430-bd81-2d9d8f00dd07') = uuid; # 54965762
SELECT * FROM activities WHERE uuid_to_bin('4b5727c0-69d1-428f-b8d9-b649055166e2') = uuid; # 54965764
SELECT * FROM participants WHERE activity_id = 54965764;
SELECT id, uuid, title, recording_state FROM activities WHERE uuid_to_bin('355f105d-5606-4379-b0c5-d91daf59f4ce') = uuid; # 54964075
SELECT * FROM participants WHERE activity_id = 54964075;
select f.id, slug, title, tf.team_id from team_features tf JOIN features f on tf.feature_id = f.id
where tf.team_id = 1038;
# [PASSWORD_DOTS] PD [PASSWORD_DOTS]
select * from teams where id = 1029;
SELECT * FROM crm_configurations WHERE id = 957;
SELECT * FROM activities WHERE uuid_to_bin('581a33cb-4343-44bd-ac0c-4a5cee71c5ec') = uuid; # 54963423
SELECT * FROM activities WHERE uuid_to_bin('07238011-25fa-418e-838b-fb21e82b9ea2') = uuid; # 54963433
SELECT * FROM activities WHERE uuid_to_bin('8b6bb2f7-e7a7-4aec-8806-fbfea7093ccd') = uuid; # 54963421
# [PASSWORD_DOTS] Close [PASSWORD_DOTS]
select * from teams where id = 1031;
SELECT * FROM crm_configurations WHERE id = 959;
SELECT * FROM activities WHERE uuid_to_bin('59c517e0-96c9-4dad-bfeb-b7bef72f8725') = uuid; # 54963517
SELECT * FROM activities WHERE uuid_to_bin('07238011-25fa-418e-838b-fb21e82b9ea2') = uuid; # 54963433
SELECT * FROM activities WHERE uuid_to_bin('d68311e3-ac34-49bd-bf04-88323a7e5352') = uuid; # 54966009
# [PASSWORD_DOTS] SF [PASSWORD_DOTS]
SELECT * FROM activities WHERE uuid_to_bin('2bd4cfa3-4eb5-4c77-84a7-9ed46a21c988') = uuid;
select * from roles;
select * from permissions;
select * from permission_role where permission_id = 136;
select * from migrations order by id desc;
select * from teams where id IN (1, 1037);
select * from crm_layouts where crm_configuration_id = 1;
SELECT * FROM crm_layout_entities WHERE crm_layout_id = 1493;
SELECT * FROM crm_fields WHERE id IN (1652,1661,66799,66814,66821,66836,66843,66846,66864,84752,182306,323580,380378);
select * from features;
select * from team_features where feature_id = 33;
select * from opportunities;
select * from teams;
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 = 1052 and sa.provider = 'hubspot';
SELECT * FROM accounts where id = 11512582;
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
ActionItems
Activity
ActivityAnalytics
ActivitySearch
AiActivityType
AiAutomation
AiCallScoring
AskAnything
Dtos, folder...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"bounds":{"left":0.054166667,"top":0.027777778,"width":0.08055556,"height":0.035555556},"on_screen":true,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"#12066 on JY-20725-handle-HS-search-rate-limit, menu","depth":5,"bounds":{"left":0.13472222,"top":0.027777778,"width":0.25555557,"height":0.035555556},"on_screen":true,"help_text":"Pull request #12066 exists for current branch JY-20725-handle-HS-search-rate-limit, but local branch is out of sync with remote","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"bounds":{"left":0.6326389,"top":0.027777778,"width":0.023611112,"height":0.035555556},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"HandleHubspotRateLimitTest","depth":6,"bounds":{"left":0.6645833,"top":0.027777778,"width":0.15902779,"height":0.035555556},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run 'HandleHubspotRateLimitTest'","depth":6,"bounds":{"left":0.82361114,"top":0.027777778,"width":0.023611112,"height":0.035555556},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'HandleHubspotRateLimitTest'","depth":6,"bounds":{"left":0.8472222,"top":0.027777778,"width":0.023611112,"height":0.035555556},"on_screen":true,"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.87083334,"top":0.027777778,"width":0.023611112,"height":0.035555556},"on_screen":true,"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.9291667,"top":0.027777778,"width":0.023611112,"height":0.035555556},"on_screen":true,"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.9527778,"top":0.027777778,"width":0.023611112,"height":0.035555556},"on_screen":true,"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.9763889,"top":0.027777778,"width":0.023611112,"height":0.035555556},"on_screen":true,"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},"on_screen":false,"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},"on_screen":false,"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},"on_screen":false,"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},"on_screen":false,"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\\Webhook\\IntegrationAppSubscriptions;\n\nuse Illuminate\\Http\\JsonResponse;\nuse Jiminny\\Contracts\\Crm\\Providers;\nuse Jiminny\\Models\\Team;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\Service;\nuse Jiminny\\Services\\Crm\\ProviderRegistry;\n\ntrait IntegrationAppTrait\n{\n abstract protected function getTeamFromRequest(): ?Team;\n\n abstract protected function extractPayload(): array;\n\n private function getPayload(): array\n {\n $payload = $this->extractPayload();\n $this->logger->info('[integration-app] Event received', [\n 'payload' => $payload,\n ]);\n\n return $payload;\n }\n\n private function extractTargetIdFromPayload(string $targetId): ?string\n {\n $payload = $this->getPayload();\n\n return $payload[$targetId] ?? null;\n }\n\n private function extractTargetObjectIdsFromPayload(string $targetKey): array\n {\n $payload = $this->getPayload();\n\n $objects = $payload[$targetKey] ?? [];\n\n if (! is_array($objects) || empty($objects)) {\n return [];\n }\n\n return array_values(array_filter(array_map(\n static fn ($object) => is_array($object) ? ($object['id'] ?? null) : null,\n $objects\n )));\n }\n\n private function bootstrapIntegrationApp(Team $team): ?Service\n {\n $crmProvider = app(ProviderRegistry::class);\n\n $providerName = $team->getCrmConfiguration()->getProviderName();\n if (! Providers::isIntegrationAppProvider($providerName)) {\n return null;\n }\n\n /** @var Service $integrationApp */\n $integrationApp = $crmProvider->get($providerName);\n $integrationApp->setUser($team->getOwner());\n\n return $integrationApp;\n }\n\n private function getTargetCrmProviderId(string $targetKey, string $eventName): ?string\n {\n $targetId = $this->extractTargetIdFromPayload($targetKey);\n $this->logger->info(\"[integration-app] Event: {$eventName}\", [\n 'targetId' => $targetId,\n 'targetKey' => $targetKey,\n ]);\n\n return $targetId;\n }\n\n private function getTargetCrmProviderObjectsIds(string $targetKey, string $eventName): array\n {\n $targetIds = $this->extractTargetObjectIdsFromPayload($targetKey);\n $this->logger->info(\"[integration-app] Event: $eventName\", [\n 'targetIds' => $targetIds,\n 'targetKey' => $targetKey,\n 'count' => count($targetIds),\n ]);\n\n return $targetIds;\n }\n\n protected function handleBulkDeletion(string $targetKey, string $fallbackKey, string $eventName): JsonResponse\n {\n $team = $this->getTeamFromRequest();\n\n if ($team === null) {\n return new JsonResponse([], JsonResponse::HTTP_NO_CONTENT);\n }\n\n $targetIds = $this->getTargetCrmProviderObjectsIds(targetKey: $targetKey, eventName: $eventName);\n\n if (empty($targetIds)) {\n $this->logger->warning('No target IDs found for ' . $eventName);\n\n // fallback to single target ID\n $targetId = $this->getTargetCrmProviderId(targetKey: $fallbackKey, eventName: $eventName);\n\n if ($targetId !== null) {\n $targetIds[] = $targetId;\n }\n }\n\n if (empty($targetIds)) {\n $this->logger->warning('No target IDs found alter fallback for ' . $eventName);\n\n return new JsonResponse([], JsonResponse::HTTP_BAD_REQUEST);\n }\n\n foreach ($targetIds as $targetId) {\n $this->deleteTarget(team: $team, targetId: (string) $targetId);\n }\n\n return new JsonResponse([], JsonResponse::HTTP_OK);\n }\n\n abstract protected function deleteTarget(Team $team, string $targetId): void;\n}","depth":4,"on_screen":true,"value":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Http\\Controllers\\Webhook\\IntegrationAppSubscriptions;\n\nuse Illuminate\\Http\\JsonResponse;\nuse Jiminny\\Contracts\\Crm\\Providers;\nuse Jiminny\\Models\\Team;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\Service;\nuse Jiminny\\Services\\Crm\\ProviderRegistry;\n\ntrait IntegrationAppTrait\n{\n abstract protected function getTeamFromRequest(): ?Team;\n\n abstract protected function extractPayload(): array;\n\n private function getPayload(): array\n {\n $payload = $this->extractPayload();\n $this->logger->info('[integration-app] Event received', [\n 'payload' => $payload,\n ]);\n\n return $payload;\n }\n\n private function extractTargetIdFromPayload(string $targetId): ?string\n {\n $payload = $this->getPayload();\n\n return $payload[$targetId] ?? null;\n }\n\n private function extractTargetObjectIdsFromPayload(string $targetKey): array\n {\n $payload = $this->getPayload();\n\n $objects = $payload[$targetKey] ?? [];\n\n if (! is_array($objects) || empty($objects)) {\n return [];\n }\n\n return array_values(array_filter(array_map(\n static fn ($object) => is_array($object) ? ($object['id'] ?? null) : null,\n $objects\n )));\n }\n\n private function bootstrapIntegrationApp(Team $team): ?Service\n {\n $crmProvider = app(ProviderRegistry::class);\n\n $providerName = $team->getCrmConfiguration()->getProviderName();\n if (! Providers::isIntegrationAppProvider($providerName)) {\n return null;\n }\n\n /** @var Service $integrationApp */\n $integrationApp = $crmProvider->get($providerName);\n $integrationApp->setUser($team->getOwner());\n\n return $integrationApp;\n }\n\n private function getTargetCrmProviderId(string $targetKey, string $eventName): ?string\n {\n $targetId = $this->extractTargetIdFromPayload($targetKey);\n $this->logger->info(\"[integration-app] Event: {$eventName}\", [\n 'targetId' => $targetId,\n 'targetKey' => $targetKey,\n ]);\n\n return $targetId;\n }\n\n private function getTargetCrmProviderObjectsIds(string $targetKey, string $eventName): array\n {\n $targetIds = $this->extractTargetObjectIdsFromPayload($targetKey);\n $this->logger->info(\"[integration-app] Event: $eventName\", [\n 'targetIds' => $targetIds,\n 'targetKey' => $targetKey,\n 'count' => count($targetIds),\n ]);\n\n return $targetIds;\n }\n\n protected function handleBulkDeletion(string $targetKey, string $fallbackKey, string $eventName): JsonResponse\n {\n $team = $this->getTeamFromRequest();\n\n if ($team === null) {\n return new JsonResponse([], JsonResponse::HTTP_NO_CONTENT);\n }\n\n $targetIds = $this->getTargetCrmProviderObjectsIds(targetKey: $targetKey, eventName: $eventName);\n\n if (empty($targetIds)) {\n $this->logger->warning('No target IDs found for ' . $eventName);\n\n // fallback to single target ID\n $targetId = $this->getTargetCrmProviderId(targetKey: $fallbackKey, eventName: $eventName);\n\n if ($targetId !== null) {\n $targetIds[] = $targetId;\n }\n }\n\n if (empty($targetIds)) {\n $this->logger->warning('No target IDs found alter fallback for ' . $eventName);\n\n return new JsonResponse([], JsonResponse::HTTP_BAD_REQUEST);\n }\n\n foreach ($targetIds as $targetId) {\n $this->deleteTarget(team: $team, targetId: (string) $targetId);\n }\n\n return new JsonResponse([], JsonResponse::HTTP_OK);\n }\n\n abstract protected function deleteTarget(Team $team, string $targetId): void;\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.72291666,"top":0.24111111,"width":0.018055556,"height":0.026666667},"on_screen":true,"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.7409722,"top":0.24111111,"width":0.018055556,"height":0.026666667},"on_screen":true,"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.7638889,"top":0.24111111,"width":0.018055556,"height":0.026666667},"on_screen":true,"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.78194445,"top":0.24111111,"width":0.018055556,"height":0.026666667},"on_screen":true,"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.8,"top":0.24111111,"width":0.018055556,"height":0.026666667},"on_screen":true,"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.8229167,"top":0.24111111,"width":0.018055556,"height":0.026666667},"on_screen":true,"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.84583336,"top":0.24111111,"width":0.050694443,"height":0.026666667},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Cancel Running Statements","depth":4,"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Playground","depth":4,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"jiminny","depth":4,"bounds":{"left":0.9138889,"top":0.24111111,"width":0.059027776,"height":0.026666667},"on_screen":true,"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},"on_screen":false,"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},"on_screen":false,"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},"on_screen":false,"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},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"8","depth":4,"bounds":{"left":0.8645833,"top":0.27555555,"width":0.016666668,"height":0.02111111},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"1","depth":4,"bounds":{"left":0.8854167,"top":0.27555555,"width":0.015277778,"height":0.02111111},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"3","depth":4,"bounds":{"left":0.9048611,"top":0.27555555,"width":0.016666668,"height":0.02111111},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"4","depth":4,"bounds":{"left":0.92569447,"top":0.27555555,"width":0.016666668,"height":0.02111111},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.9458333,"top":0.27333334,"width":0.015277778,"height":0.025555555},"on_screen":true,"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.9611111,"top":0.27333334,"width":0.014583333,"height":0.025555555},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"SELECT\n# DISTINCT\nopp.id as opp_id, opp.uuid, opp.name,\n# COUNT(dr.id) AS deal_risk_count,\n\n# dr.id,\n# cfd.value,\nusr.name AS owner_name,\nopp.value, opp.currency_code, opp.close_date, opp.remotely_created_at, opp.is_closed, opp.is_won,\nusr.uuid as owner_uuid,\nusr.photo_path as owner_photo,\nusr.id AS owner_id,\njt.name as owner_job,\nopp.stage_id, opp.stage_updated_at,\nacc.name AS acc_name, opp.stage_updated_at, acc.crm_provider_id AS acc_provider_id, opp.crm_provider_id AS opp_provider_id,\nrt.business_process_id AS pipeline_id\nFROM opportunities opp\nLEFT JOIN record_types rt ON opp.record_type_id = rt.id\nLEFT JOIN users usr ON opp.user_id = usr.id\nLEFT JOIN accounts acc ON opp.account_id = acc.id\nLEFT JOIN job_titles jt ON usr.job_title_id = jt.id\n\n# LEFT JOIN group_deal_risk_types gdrt ON gdrt.group_id = usr.group_id\n# LEFT JOIN deal_risks dr ON dr.opportunity_id = opp.id AND dr.group_deal_risk_type_id = gdrt.id\n\nLEFT JOIN crm_field_data cfd ON (cfd.object_id = opp.id and cfd.crm_field_id = 66814)\n\nWHERE opp.user_id IS NOT NULL\nAND opp.deleted_at IS NULL\nAND opp.is_closed = 1\nAND opp.is_won = 0\nAND opp.close_date >= '2024-01-01 00:00:00'\nAND opp.close_date <= '2024-12-31 23:59:59'\nAND usr.team_id = 1\n\n# and opp.id = 4823179\n\nGROUP BY opp.id, cfd.value\nORDER BY\n# cfd.value\n CAST(cfd.value AS UNSIGNED)\n# owner_name\n# (SELECT COUNT(dr.id)\n# FROM deal_risks dr\n# JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id\n# WHERE dr.opportunity_id = opp.id\n# AND dr.is_active = 1\n# AND gdrt.is_enabled = 1)\nDESC\nLIMIT 25\n# OFFSET 0\n;\n\nselect * from crm_fields where crm_configuration_id = 1 and object_type = 'opportunity';\nselect * from crm_layout_entities where crm_layout_id = 1493;\n\nSELECT * FROM opportunities WHERE id = 4584045;\nSELECT * FROM crm_field_data WHERE object_id = 4584045;\n\nSELECT * FROM opportunities where team_id = 1 and crm_provider_id = '0061K00000lfb9IQAQ'\n\nSELECT\n opp.id as opportunity_id,\n opp.name,\n COUNT(dr.id) as risk_count\nFROM opportunities opp\nLEFT JOIN deal_risks dr ON dr.opportunity_id = opp.id\nWHERE opp.id IN (\n 6069574,8900938,9507638,9524799,9660490,9662824,9705675,9749758,4158460,4391812,6450439,4448422,5118945,5590675,4584045,7228149,9002408,9165534,9446720,9641778,9665149,9703344,9709280,5747948,4158491,6182565,6263970,5798120,5111315,4536978,6062352,6548383,6072095,6548225,4480986,5011422,6548381,8760540,8917554,9509986,9514392,9569009,9569011,9578490,9713604,5784397,7276612,7288405,8994421,9118219,9608148,9818911,4510535,6479693,5958049,6271674,6550448,4158331,4158483,6126571,6171615,6540943,4897466,5190896,5796182,5932762,8572433,8723698,8892697,9711001,9789264,4549188,6100831,6170064,6260799,6263653,6449936,6530871,6538978,7777651,8059269,8319918,8787049,8901150,9263153,9453207,9514738,9696700,9791062,5752018,6421452,7439134,7878923,9354763,9369285,9514396,9582506,9889949,9890216,4094311,4158495,4158496,6098128,5585661,3872564,6442149,5891604,6164746,6199593,6583474,6519684,9018490,9809006,4496897,5041324,5829430,6198319,6253504,6555763,7242914,7931055,8024125,8797814,8058559,8673347,8892695,8994420,9616219,9714970,9722004,9809439,9818918,6523177,8134147,9002915,9711422,9892713,9901719,9954210,9978435,5800810,6243518,6416114,6222251,6411974,6512456,5791953,6545606,9914780,5805540,6238986,6463838,6547680,9767049,9809437,9810885,9890855,6673493,9902036,4335521,6379871,6503799,6546077,8018765,9907556,9958433,9905855,9916179,9946741,9957877,5563344,6271838,6450815,7641128,7762567,7780592,8684810,8685786,8685787,8685788\n)\nGROUP BY opp.id;\n\nSELECT COUNT(dr.id)\n FROM deal_risks dr\n JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id\n WHERE dr.opportunity_id = 5563344\n# AND gdrt.group_id = usr.group_id\n\n\n\nEXPLAIN SELECT\n opp.id as opp_id, opp.uuid, opp.name,\n\ncfd.value,\ncfv.sequence,\ncfv.value,\n# MAX(cfd.value) AS max_cfd_value,\nusr.name AS owner_name,\nopp.value, opp.currency_code, opp.close_date, opp.remotely_created_at, opp.is_closed, opp.is_won,\nusr.uuid as owner_uuid,\nusr.photo_path as owner_photo,\nusr.id AS owner_id,\njt.name as owner_job,\nopp.stage_id, opp.stage_updated_at,\nacc.name AS acc_name, opp.stage_updated_at, acc.crm_provider_id AS acc_provider_id, opp.crm_provider_id AS opp_provider_id,\nrt.business_process_id AS pipeline_id\nFROM opportunities opp\n\nLEFT JOIN record_types rt ON opp.record_type_id = rt.id\nLEFT JOIN users usr ON opp.user_id = usr.id\nLEFT JOIN accounts acc ON opp.account_id = acc.id\nLEFT JOIN job_titles jt ON usr.job_title_id = jt.id\n\nLEFT JOIN crm_field_data cfd ON cfd.id = (SELECT sub_cfd.id\n FROM crm_field_data sub_cfd\n WHERE sub_cfd.object_id = opp.id\n AND sub_cfd.crm_field_id = 66810\n ORDER BY sub_cfd.updated_at DESC\n LIMIT 1)\n\nLEFT JOIN crm_field_values cfv ON cfv.crm_field_id = 66810 AND cfv.value = cfd.value\n\nWHERE opp.user_id IS NOT NULL\nAND opp.deleted_at IS NULL\nAND opp.is_closed = 0\n# AND opp.is_closed = 1\n# AND opp.is_won = 0\nAND opp.close_date >= '2024-01-01 00:00:00'\nAND opp.close_date <= '2024-12-31 23:59:59'\nAND usr.team_id = 1\n\n# and opp.id = 4823179\n\n# GROUP BY opp.id\nORDER BY\n cfv.sequence DESC,\n# opp.name\n# owner_name\n cfd.value\n# CAST(cfd.value AS UNSIGNED)\n# CAST(MAX(cfd.value) AS UNSIGNED)\n# (SELECT COUNT(dr.id)\n# FROM deal_risks dr\n# JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id\n# WHERE dr.opportunity_id = opp.id\n# AND dr.is_active = 1 AND gdrt.is_enabled = 1)\nDESC\n# LIMIT 75, 25\n;\n\n\n\nSELECT * FROM crm_field_values WHERE crm_field_id = 66810;\n\nSELECT f.id, f.crm_provider_id AS field_name, f.label, fd.object_id AS dealId, fd.value, fd.updated_at, fd.id, fd.created_at\nFROM crm_fields f\nINNER JOIN crm_field_data fd ON fd.crm_field_id = f.id\n WHERE (f.crm_configuration_id = 1)\n AND (f.object_type = 'opportunity')\n# AND (fd.object_id IN (4158331,4158483,4158495,4158496,6069574,6263970,6171615,6540943,6545606,5829430,6198319,6263653,6548381,7242914,8797814,7228149,7439134,7878923,8134147,9002915,9118219,9165534,9354763,9369285,9446720))\n AND (fd.object_id IN (4158460))\n AND (f.crm_provider_id IN ('ForecastCategoryName'))\n ORDER BY fd.object_id ASC, fd.updated_at DESC;\n\nselect * from crm_layouts where crm_configuration_id = 1;\nselect cf.* from crm_fields cf\njoin crm_layout_entities cle on cf.id = cle.crm_field_id\nwhere crm_layout_id = 1493;\n\nSELECT * FROM opportunities WHERE id = 4158460;\nSELECT * FROM crm_field_data WHERE object_id = 4158460;\n\nselect * from users where team_id = 1;\nSELECT * FROM users WHERE id = 7160;\nselect * from role_user where user_id = 3248;\n\nselect * from crm_field_values where crm_field_id = 66824;\n\nSELECT * FROM users WHERE id = 23470;\nselect * from crm_configurations;\n\n# ******************************************\nselect * from teams where id = 1038; # 23521, 966\nselect * from users where team_id = 1038;\nselect * from crm_configurations where id = 966;\nSELECT * FROM activities WHERE uuid_to_bin('e8dc7c34-31f6-4430-bd81-2d9d8f00dd07') = uuid; # 54965762\nSELECT * FROM activities WHERE uuid_to_bin('4b5727c0-69d1-428f-b8d9-b649055166e2') = uuid; # 54965764\nSELECT * FROM participants WHERE activity_id = 54965764;\n\nSELECT id, uuid, title, recording_state FROM activities WHERE uuid_to_bin('355f105d-5606-4379-b0c5-d91daf59f4ce') = uuid; # 54964075\nSELECT * FROM participants WHERE activity_id = 54964075;\nselect f.id, slug, title, tf.team_id from team_features tf JOIN features f on tf.feature_id = f.id\n where tf.team_id = 1038;\n\n\n# ****************************************** PD *************************\nselect * from teams where id = 1029;\nSELECT * FROM crm_configurations WHERE id = 957;\nSELECT * FROM activities WHERE uuid_to_bin('581a33cb-4343-44bd-ac0c-4a5cee71c5ec') = uuid; # 54963423\nSELECT * FROM activities WHERE uuid_to_bin('07238011-25fa-418e-838b-fb21e82b9ea2') = uuid; # 54963433\n\nSELECT * FROM activities WHERE uuid_to_bin('8b6bb2f7-e7a7-4aec-8806-fbfea7093ccd') = uuid; # 54963421\n\n# ****************************************** Close *************************\nselect * from teams where id = 1031;\nSELECT * FROM crm_configurations WHERE id = 959;\nSELECT * FROM activities WHERE uuid_to_bin('59c517e0-96c9-4dad-bfeb-b7bef72f8725') = uuid; # 54963517\n\n\nSELECT * FROM activities WHERE uuid_to_bin('07238011-25fa-418e-838b-fb21e82b9ea2') = uuid; # 54963433\n\nSELECT * FROM activities WHERE uuid_to_bin('d68311e3-ac34-49bd-bf04-88323a7e5352') = uuid; # 54966009\n\n# ****************************************** SF *************************\nSELECT * FROM activities WHERE uuid_to_bin('2bd4cfa3-4eb5-4c77-84a7-9ed46a21c988') = uuid;\n\nselect * from roles;\nselect * from permissions;\nselect * from permission_role where permission_id = 136;\n\nselect * from migrations order by id desc;\n\nselect * from teams where id IN (1, 1037);\nselect * from crm_layouts where crm_configuration_id = 1;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1493;\nSELECT * FROM crm_fields WHERE id IN (1652,1661,66799,66814,66821,66836,66843,66846,66864,84752,182306,323580,380378);\n\nselect * from features;\nselect * from team_features where feature_id = 33;\nselect * from opportunities;\n\nselect * from teams;\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 = 1052 and sa.provider = 'hubspot';\n\nSELECT * FROM accounts where id = 11512582;","depth":4,"on_screen":true,"value":"SELECT\n# DISTINCT\nopp.id as opp_id, opp.uuid, opp.name,\n# COUNT(dr.id) AS deal_risk_count,\n\n# dr.id,\n# cfd.value,\nusr.name AS owner_name,\nopp.value, opp.currency_code, opp.close_date, opp.remotely_created_at, opp.is_closed, opp.is_won,\nusr.uuid as owner_uuid,\nusr.photo_path as owner_photo,\nusr.id AS owner_id,\njt.name as owner_job,\nopp.stage_id, opp.stage_updated_at,\nacc.name AS acc_name, opp.stage_updated_at, acc.crm_provider_id AS acc_provider_id, opp.crm_provider_id AS opp_provider_id,\nrt.business_process_id AS pipeline_id\nFROM opportunities opp\nLEFT JOIN record_types rt ON opp.record_type_id = rt.id\nLEFT JOIN users usr ON opp.user_id = usr.id\nLEFT JOIN accounts acc ON opp.account_id = acc.id\nLEFT JOIN job_titles jt ON usr.job_title_id = jt.id\n\n# LEFT JOIN group_deal_risk_types gdrt ON gdrt.group_id = usr.group_id\n# LEFT JOIN deal_risks dr ON dr.opportunity_id = opp.id AND dr.group_deal_risk_type_id = gdrt.id\n\nLEFT JOIN crm_field_data cfd ON (cfd.object_id = opp.id and cfd.crm_field_id = 66814)\n\nWHERE opp.user_id IS NOT NULL\nAND opp.deleted_at IS NULL\nAND opp.is_closed = 1\nAND opp.is_won = 0\nAND opp.close_date >= '2024-01-01 00:00:00'\nAND opp.close_date <= '2024-12-31 23:59:59'\nAND usr.team_id = 1\n\n# and opp.id = 4823179\n\nGROUP BY opp.id, cfd.value\nORDER BY\n# cfd.value\n CAST(cfd.value AS UNSIGNED)\n# owner_name\n# (SELECT COUNT(dr.id)\n# FROM deal_risks dr\n# JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id\n# WHERE dr.opportunity_id = opp.id\n# AND dr.is_active = 1\n# AND gdrt.is_enabled = 1)\nDESC\nLIMIT 25\n# OFFSET 0\n;\n\nselect * from crm_fields where crm_configuration_id = 1 and object_type = 'opportunity';\nselect * from crm_layout_entities where crm_layout_id = 1493;\n\nSELECT * FROM opportunities WHERE id = 4584045;\nSELECT * FROM crm_field_data WHERE object_id = 4584045;\n\nSELECT * FROM opportunities where team_id = 1 and crm_provider_id = '0061K00000lfb9IQAQ'\n\nSELECT\n opp.id as opportunity_id,\n opp.name,\n COUNT(dr.id) as risk_count\nFROM opportunities opp\nLEFT JOIN deal_risks dr ON dr.opportunity_id = opp.id\nWHERE opp.id IN (\n 6069574,8900938,9507638,9524799,9660490,9662824,9705675,9749758,4158460,4391812,6450439,4448422,5118945,5590675,4584045,7228149,9002408,9165534,9446720,9641778,9665149,9703344,9709280,5747948,4158491,6182565,6263970,5798120,5111315,4536978,6062352,6548383,6072095,6548225,4480986,5011422,6548381,8760540,8917554,9509986,9514392,9569009,9569011,9578490,9713604,5784397,7276612,7288405,8994421,9118219,9608148,9818911,4510535,6479693,5958049,6271674,6550448,4158331,4158483,6126571,6171615,6540943,4897466,5190896,5796182,5932762,8572433,8723698,8892697,9711001,9789264,4549188,6100831,6170064,6260799,6263653,6449936,6530871,6538978,7777651,8059269,8319918,8787049,8901150,9263153,9453207,9514738,9696700,9791062,5752018,6421452,7439134,7878923,9354763,9369285,9514396,9582506,9889949,9890216,4094311,4158495,4158496,6098128,5585661,3872564,6442149,5891604,6164746,6199593,6583474,6519684,9018490,9809006,4496897,5041324,5829430,6198319,6253504,6555763,7242914,7931055,8024125,8797814,8058559,8673347,8892695,8994420,9616219,9714970,9722004,9809439,9818918,6523177,8134147,9002915,9711422,9892713,9901719,9954210,9978435,5800810,6243518,6416114,6222251,6411974,6512456,5791953,6545606,9914780,5805540,6238986,6463838,6547680,9767049,9809437,9810885,9890855,6673493,9902036,4335521,6379871,6503799,6546077,8018765,9907556,9958433,9905855,9916179,9946741,9957877,5563344,6271838,6450815,7641128,7762567,7780592,8684810,8685786,8685787,8685788\n)\nGROUP BY opp.id;\n\nSELECT COUNT(dr.id)\n FROM deal_risks dr\n JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id\n WHERE dr.opportunity_id = 5563344\n# AND gdrt.group_id = usr.group_id\n\n\n\nEXPLAIN SELECT\n opp.id as opp_id, opp.uuid, opp.name,\n\ncfd.value,\ncfv.sequence,\ncfv.value,\n# MAX(cfd.value) AS max_cfd_value,\nusr.name AS owner_name,\nopp.value, opp.currency_code, opp.close_date, opp.remotely_created_at, opp.is_closed, opp.is_won,\nusr.uuid as owner_uuid,\nusr.photo_path as owner_photo,\nusr.id AS owner_id,\njt.name as owner_job,\nopp.stage_id, opp.stage_updated_at,\nacc.name AS acc_name, opp.stage_updated_at, acc.crm_provider_id AS acc_provider_id, opp.crm_provider_id AS opp_provider_id,\nrt.business_process_id AS pipeline_id\nFROM opportunities opp\n\nLEFT JOIN record_types rt ON opp.record_type_id = rt.id\nLEFT JOIN users usr ON opp.user_id = usr.id\nLEFT JOIN accounts acc ON opp.account_id = acc.id\nLEFT JOIN job_titles jt ON usr.job_title_id = jt.id\n\nLEFT JOIN crm_field_data cfd ON cfd.id = (SELECT sub_cfd.id\n FROM crm_field_data sub_cfd\n WHERE sub_cfd.object_id = opp.id\n AND sub_cfd.crm_field_id = 66810\n ORDER BY sub_cfd.updated_at DESC\n LIMIT 1)\n\nLEFT JOIN crm_field_values cfv ON cfv.crm_field_id = 66810 AND cfv.value = cfd.value\n\nWHERE opp.user_id IS NOT NULL\nAND opp.deleted_at IS NULL\nAND opp.is_closed = 0\n# AND opp.is_closed = 1\n# AND opp.is_won = 0\nAND opp.close_date >= '2024-01-01 00:00:00'\nAND opp.close_date <= '2024-12-31 23:59:59'\nAND usr.team_id = 1\n\n# and opp.id = 4823179\n\n# GROUP BY opp.id\nORDER BY\n cfv.sequence DESC,\n# opp.name\n# owner_name\n cfd.value\n# CAST(cfd.value AS UNSIGNED)\n# CAST(MAX(cfd.value) AS UNSIGNED)\n# (SELECT COUNT(dr.id)\n# FROM deal_risks dr\n# JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id\n# WHERE dr.opportunity_id = opp.id\n# AND dr.is_active = 1 AND gdrt.is_enabled = 1)\nDESC\n# LIMIT 75, 25\n;\n\n\n\nSELECT * FROM crm_field_values WHERE crm_field_id = 66810;\n\nSELECT f.id, f.crm_provider_id AS field_name, f.label, fd.object_id AS dealId, fd.value, fd.updated_at, fd.id, fd.created_at\nFROM crm_fields f\nINNER JOIN crm_field_data fd ON fd.crm_field_id = f.id\n WHERE (f.crm_configuration_id = 1)\n AND (f.object_type = 'opportunity')\n# AND (fd.object_id IN (4158331,4158483,4158495,4158496,6069574,6263970,6171615,6540943,6545606,5829430,6198319,6263653,6548381,7242914,8797814,7228149,7439134,7878923,8134147,9002915,9118219,9165534,9354763,9369285,9446720))\n AND (fd.object_id IN (4158460))\n AND (f.crm_provider_id IN ('ForecastCategoryName'))\n ORDER BY fd.object_id ASC, fd.updated_at DESC;\n\nselect * from crm_layouts where crm_configuration_id = 1;\nselect cf.* from crm_fields cf\njoin crm_layout_entities cle on cf.id = cle.crm_field_id\nwhere crm_layout_id = 1493;\n\nSELECT * FROM opportunities WHERE id = 4158460;\nSELECT * FROM crm_field_data WHERE object_id = 4158460;\n\nselect * from users where team_id = 1;\nSELECT * FROM users WHERE id = 7160;\nselect * from role_user where user_id = 3248;\n\nselect * from crm_field_values where crm_field_id = 66824;\n\nSELECT * FROM users WHERE id = 23470;\nselect * from crm_configurations;\n\n# ******************************************\nselect * from teams where id = 1038; # 23521, 966\nselect * from users where team_id = 1038;\nselect * from crm_configurations where id = 966;\nSELECT * FROM activities WHERE uuid_to_bin('e8dc7c34-31f6-4430-bd81-2d9d8f00dd07') = uuid; # 54965762\nSELECT * FROM activities WHERE uuid_to_bin('4b5727c0-69d1-428f-b8d9-b649055166e2') = uuid; # 54965764\nSELECT * FROM participants WHERE activity_id = 54965764;\n\nSELECT id, uuid, title, recording_state FROM activities WHERE uuid_to_bin('355f105d-5606-4379-b0c5-d91daf59f4ce') = uuid; # 54964075\nSELECT * FROM participants WHERE activity_id = 54964075;\nselect f.id, slug, title, tf.team_id from team_features tf JOIN features f on tf.feature_id = f.id\n where tf.team_id = 1038;\n\n\n# ****************************************** PD *************************\nselect * from teams where id = 1029;\nSELECT * FROM crm_configurations WHERE id = 957;\nSELECT * FROM activities WHERE uuid_to_bin('581a33cb-4343-44bd-ac0c-4a5cee71c5ec') = uuid; # 54963423\nSELECT * FROM activities WHERE uuid_to_bin('07238011-25fa-418e-838b-fb21e82b9ea2') = uuid; # 54963433\n\nSELECT * FROM activities WHERE uuid_to_bin('8b6bb2f7-e7a7-4aec-8806-fbfea7093ccd') = uuid; # 54963421\n\n# ****************************************** Close *************************\nselect * from teams where id = 1031;\nSELECT * FROM crm_configurations WHERE id = 959;\nSELECT * FROM activities WHERE uuid_to_bin('59c517e0-96c9-4dad-bfeb-b7bef72f8725') = uuid; # 54963517\n\n\nSELECT * FROM activities WHERE uuid_to_bin('07238011-25fa-418e-838b-fb21e82b9ea2') = uuid; # 54963433\n\nSELECT * FROM activities WHERE uuid_to_bin('d68311e3-ac34-49bd-bf04-88323a7e5352') = uuid; # 54966009\n\n# ****************************************** SF *************************\nSELECT * FROM activities WHERE uuid_to_bin('2bd4cfa3-4eb5-4c77-84a7-9ed46a21c988') = uuid;\n\nselect * from roles;\nselect * from permissions;\nselect * from permission_role where permission_id = 136;\n\nselect * from migrations order by id desc;\n\nselect * from teams where id IN (1, 1037);\nselect * from crm_layouts where crm_configuration_id = 1;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1493;\nSELECT * FROM crm_fields WHERE id IN (1652,1661,66799,66814,66821,66836,66843,66846,66864,84752,182306,323580,380378);\n\nselect * from features;\nselect * from team_features where feature_id = 33;\nselect * from opportunities;\n\nselect * from teams;\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 = 1052 and sa.provider = 'hubspot';\n\nSELECT * FROM accounts where id = 11512582;","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Project","depth":3,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Project","depth":3,"bounds":{"left":0.025,"top":0.06666667,"width":0.050694443,"height":0.034444444},"on_screen":true,"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},"on_screen":false,"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},"on_screen":false,"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},"on_screen":false,"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},"on_screen":false,"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},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"app ~/jiminny/app","depth":6,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":".circleci","depth":7,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":".cursor","depth":7,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":".github","depth":7,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":".sonarlint","depth":7,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":".vscode","depth":7,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":".windsurf","depth":7,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"app, sources root","depth":7,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Actions","depth":8,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Component","depth":8,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Acl","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"ActionItems","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Activity","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"ActivityAnalytics","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"ActivitySearch","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"AiActivityType","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"AiAutomation","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"AiCallScoring","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"AskAnything","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Dtos, folder","depth":10,"on_screen":false,"role_description":"text"}]...
|
-7380505845835966861
|
2074638386415670109
|
visual_change
|
accessibility
|
NULL
|
Project: faVsco.js, menu
#12066 on JY-20725-handle Project: faVsco.js, menu
#12066 on JY-20725-handle-HS-search-rate-limit, menu
Start Listening for PHP Debug Connections
HandleHubspotRateLimitTest
Run 'HandleHubspotRateLimitTest'
Debug 'HandleHubspotRateLimitTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
<?php
declare(strict_types=1);
namespace Jiminny\Http\Controllers\Webhook\IntegrationAppSubscriptions;
use Illuminate\Http\JsonResponse;
use Jiminny\Contracts\Crm\Providers;
use Jiminny\Models\Team;
use Jiminny\Services\Crm\IntegrationApp\Service;
use Jiminny\Services\Crm\ProviderRegistry;
trait IntegrationAppTrait
{
abstract protected function getTeamFromRequest(): ?Team;
abstract protected function extractPayload(): array;
private function getPayload(): array
{
$payload = $this->extractPayload();
$this->logger->info('[integration-app] Event received', [
'payload' => $payload,
]);
return $payload;
}
private function extractTargetIdFromPayload(string $targetId): ?string
{
$payload = $this->getPayload();
return $payload[$targetId] ?? null;
}
private function extractTargetObjectIdsFromPayload(string $targetKey): array
{
$payload = $this->getPayload();
$objects = $payload[$targetKey] ?? [];
if (! is_array($objects) || empty($objects)) {
return [];
}
return array_values(array_filter(array_map(
static fn ($object) => is_array($object) ? ($object['id'] ?? null) : null,
$objects
)));
}
private function bootstrapIntegrationApp(Team $team): ?Service
{
$crmProvider = app(ProviderRegistry::class);
$providerName = $team->getCrmConfiguration()->getProviderName();
if (! Providers::isIntegrationAppProvider($providerName)) {
return null;
}
/** @var Service $integrationApp */
$integrationApp = $crmProvider->get($providerName);
$integrationApp->setUser($team->getOwner());
return $integrationApp;
}
private function getTargetCrmProviderId(string $targetKey, string $eventName): ?string
{
$targetId = $this->extractTargetIdFromPayload($targetKey);
$this->logger->info("[integration-app] Event: {$eventName}", [
'targetId' => $targetId,
'targetKey' => $targetKey,
]);
return $targetId;
}
private function getTargetCrmProviderObjectsIds(string $targetKey, string $eventName): array
{
$targetIds = $this->extractTargetObjectIdsFromPayload($targetKey);
$this->logger->info("[integration-app] Event: $eventName", [
'targetIds' => $targetIds,
'targetKey' => $targetKey,
'count' => count($targetIds),
]);
return $targetIds;
}
protected function handleBulkDeletion(string $targetKey, string $fallbackKey, string $eventName): JsonResponse
{
$team = $this->getTeamFromRequest();
if ($team === null) {
return new JsonResponse([], JsonResponse::HTTP_NO_CONTENT);
}
$targetIds = $this->getTargetCrmProviderObjectsIds(targetKey: $targetKey, eventName: $eventName);
if (empty($targetIds)) {
$this->logger->warning('No target IDs found for ' . $eventName);
// fallback to single target ID
$targetId = $this->getTargetCrmProviderId(targetKey: $fallbackKey, eventName: $eventName);
if ($targetId !== null) {
$targetIds[] = $targetId;
}
}
if (empty($targetIds)) {
$this->logger->warning('No target IDs found alter fallback for ' . $eventName);
return new JsonResponse([], JsonResponse::HTTP_BAD_REQUEST);
}
foreach ($targetIds as $targetId) {
$this->deleteTarget(team: $team, targetId: (string) $targetId);
}
return new JsonResponse([], JsonResponse::HTTP_OK);
}
abstract protected function deleteTarget(Team $team, string $targetId): void;
}
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
8
1
3
4
Previous Highlighted Error
Next Highlighted Error
SELECT
# DISTINCT
opp.id as opp_id, opp.uuid, opp.name,
# COUNT(dr.id) AS deal_risk_count,
# dr.id,
# cfd.value,
usr.name AS owner_name,
opp.value, opp.currency_code, opp.close_date, opp.remotely_created_at, opp.is_closed, opp.is_won,
usr.uuid as owner_uuid,
usr.photo_path as owner_photo,
usr.id AS owner_id,
jt.name as owner_job,
opp.stage_id, opp.stage_updated_at,
acc.name AS acc_name, opp.stage_updated_at, acc.crm_provider_id AS acc_provider_id, opp.crm_provider_id AS opp_provider_id,
rt.business_process_id AS pipeline_id
FROM opportunities opp
LEFT JOIN record_types rt ON opp.record_type_id = rt.id
LEFT JOIN users usr ON opp.user_id = usr.id
LEFT JOIN accounts acc ON opp.account_id = acc.id
LEFT JOIN job_titles jt ON usr.job_title_id = jt.id
# LEFT JOIN group_deal_risk_types gdrt ON gdrt.group_id = usr.group_id
# LEFT JOIN deal_risks dr ON dr.opportunity_id = opp.id AND dr.group_deal_risk_type_id = gdrt.id
LEFT JOIN crm_field_data cfd ON (cfd.object_id = opp.id and cfd.crm_field_id = 66814)
WHERE opp.user_id IS NOT NULL
AND opp.deleted_at IS NULL
AND opp.is_closed = 1
AND opp.is_won = 0
AND opp.close_date >= '2024-01-01 00:00:00'
AND opp.close_date <= '2024-12-31 23:59:59'
AND usr.team_id = 1
# and opp.id = 4823179
GROUP BY opp.id, cfd.value
ORDER BY
# cfd.value
CAST(cfd.value AS UNSIGNED)
# owner_name
# (SELECT COUNT(dr.id)
# FROM deal_risks dr
# JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id
# WHERE dr.opportunity_id = opp.id
# AND dr.is_active = 1
# AND gdrt.is_enabled = 1)
DESC
LIMIT 25
# OFFSET 0
;
select * from crm_fields where crm_configuration_id = 1 and object_type = 'opportunity';
select * from crm_layout_entities where crm_layout_id = 1493;
SELECT * FROM opportunities WHERE id = 4584045;
SELECT * FROM crm_field_data WHERE object_id = 4584045;
SELECT * FROM opportunities where team_id = 1 and crm_provider_id = '0061K00000lfb9IQAQ'
SELECT
opp.id as opportunity_id,
opp.name,
COUNT(dr.id) as risk_count
FROM opportunities opp
LEFT JOIN deal_risks dr ON dr.opportunity_id = opp.id
WHERE opp.id IN (
6069574,8900938,9507638,9524799,9660490,9662824,9705675,9749758,4158460,4391812,6450439,4448422,5118945,5590675,4584045,7228149,9002408,9165534,9446720,9641778,9665149,9703344,9709280,5747948,4158491,6182565,6263970,5798120,5111315,4536978,6062352,6548383,6072095,6548225,4480986,5011422,6548381,8760540,8917554,9509986,9514392,9569009,9569011,9578490,9713604,5784397,7276612,7288405,8994421,9118219,9608148,9818911,4510535,6479693,5958049,6271674,6550448,4158331,4158483,6126571,6171615,6540943,4897466,5190896,5796182,5932762,8572433,8723698,8892697,9711001,9789264,4549188,6100831,6170064,6260799,6263653,6449936,6530871,6538978,7777651,8059269,8319918,8787049,8901150,9263153,9453207,9514738,9696700,9791062,5752018,6421452,7439134,7878923,9354763,9369285,9514396,9582506,9889949,9890216,4094311,4158495,4158496,6098128,5585661,3872564,6442149,5891604,6164746,6199593,6583474,6519684,9018490,9809006,4496897,5041324,5829430,6198319,6253504,6555763,7242914,7931055,8024125,8797814,8058559,8673347,8892695,8994420,9616219,9714970,9722004,9809439,9818918,6523177,8134147,9002915,9711422,9892713,9901719,9954210,9978435,5800810,6243518,6416114,6222251,6411974,6512456,5791953,6545606,9914780,5805540,6238986,6463838,6547680,9767049,9809437,9810885,9890855,6673493,9902036,4335521,6379871,6503799,6546077,8018765,9907556,9958433,9905855,9916179,9946741,9957877,5563344,6271838,6450815,7641128,7762567,7780592,8684810,8685786,8685787,8685788
)
GROUP BY opp.id;
SELECT COUNT(dr.id)
FROM deal_risks dr
JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id
WHERE dr.opportunity_id = 5563344
# AND gdrt.group_id = usr.group_id
EXPLAIN SELECT
opp.id as opp_id, opp.uuid, opp.name,
cfd.value,
cfv.sequence,
cfv.value,
# MAX(cfd.value) AS max_cfd_value,
usr.name AS owner_name,
opp.value, opp.currency_code, opp.close_date, opp.remotely_created_at, opp.is_closed, opp.is_won,
usr.uuid as owner_uuid,
usr.photo_path as owner_photo,
usr.id AS owner_id,
jt.name as owner_job,
opp.stage_id, opp.stage_updated_at,
acc.name AS acc_name, opp.stage_updated_at, acc.crm_provider_id AS acc_provider_id, opp.crm_provider_id AS opp_provider_id,
rt.business_process_id AS pipeline_id
FROM opportunities opp
LEFT JOIN record_types rt ON opp.record_type_id = rt.id
LEFT JOIN users usr ON opp.user_id = usr.id
LEFT JOIN accounts acc ON opp.account_id = acc.id
LEFT JOIN job_titles jt ON usr.job_title_id = jt.id
LEFT JOIN crm_field_data cfd ON cfd.id = (SELECT sub_cfd.id
FROM crm_field_data sub_cfd
WHERE sub_cfd.object_id = opp.id
AND sub_cfd.crm_field_id = 66810
ORDER BY sub_cfd.updated_at DESC
LIMIT 1)
LEFT JOIN crm_field_values cfv ON cfv.crm_field_id = 66810 AND cfv.value = cfd.value
WHERE opp.user_id IS NOT NULL
AND opp.deleted_at IS NULL
AND opp.is_closed = 0
# AND opp.is_closed = 1
# AND opp.is_won = 0
AND opp.close_date >= '2024-01-01 00:00:00'
AND opp.close_date <= '2024-12-31 23:59:59'
AND usr.team_id = 1
# and opp.id = 4823179
# GROUP BY opp.id
ORDER BY
cfv.sequence DESC,
# opp.name
# owner_name
cfd.value
# CAST(cfd.value AS UNSIGNED)
# CAST(MAX(cfd.value) AS UNSIGNED)
# (SELECT COUNT(dr.id)
# FROM deal_risks dr
# JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id
# WHERE dr.opportunity_id = opp.id
# AND dr.is_active = 1 AND gdrt.is_enabled = 1)
DESC
# LIMIT 75, 25
;
SELECT * FROM crm_field_values WHERE crm_field_id = 66810;
SELECT f.id, f.crm_provider_id AS field_name, f.label, fd.object_id AS dealId, fd.value, fd.updated_at, fd.id, fd.created_at
FROM crm_fields f
INNER JOIN crm_field_data fd ON fd.crm_field_id = f.id
WHERE (f.crm_configuration_id = 1)
AND (f.object_type = 'opportunity')
# AND (fd.object_id IN (4158331,4158483,4158495,4158496,6069574,6263970,6171615,6540943,6545606,5829430,6198319,6263653,6548381,7242914,8797814,7228149,7439134,7878923,8134147,9002915,9118219,9165534,9354763,9369285,9446720))
AND (fd.object_id IN (4158460))
AND (f.crm_provider_id IN ('ForecastCategoryName'))
ORDER BY fd.object_id ASC, fd.updated_at DESC;
select * from crm_layouts where crm_configuration_id = 1;
select cf.* from crm_fields cf
join crm_layout_entities cle on cf.id = cle.crm_field_id
where crm_layout_id = 1493;
SELECT * FROM opportunities WHERE id = 4158460;
SELECT * FROM crm_field_data WHERE object_id = 4158460;
select * from users where team_id = 1;
SELECT * FROM users WHERE id = 7160;
select * from role_user where user_id = 3248;
select * from crm_field_values where crm_field_id = 66824;
SELECT * FROM users WHERE id = 23470;
select * from crm_configurations;
# [PASSWORD_DOTS]
select * from teams where id = 1038; # 23521, 966
select * from users where team_id = 1038;
select * from crm_configurations where id = 966;
SELECT * FROM activities WHERE uuid_to_bin('e8dc7c34-31f6-4430-bd81-2d9d8f00dd07') = uuid; # 54965762
SELECT * FROM activities WHERE uuid_to_bin('4b5727c0-69d1-428f-b8d9-b649055166e2') = uuid; # 54965764
SELECT * FROM participants WHERE activity_id = 54965764;
SELECT id, uuid, title, recording_state FROM activities WHERE uuid_to_bin('355f105d-5606-4379-b0c5-d91daf59f4ce') = uuid; # 54964075
SELECT * FROM participants WHERE activity_id = 54964075;
select f.id, slug, title, tf.team_id from team_features tf JOIN features f on tf.feature_id = f.id
where tf.team_id = 1038;
# [PASSWORD_DOTS] PD [PASSWORD_DOTS]
select * from teams where id = 1029;
SELECT * FROM crm_configurations WHERE id = 957;
SELECT * FROM activities WHERE uuid_to_bin('581a33cb-4343-44bd-ac0c-4a5cee71c5ec') = uuid; # 54963423
SELECT * FROM activities WHERE uuid_to_bin('07238011-25fa-418e-838b-fb21e82b9ea2') = uuid; # 54963433
SELECT * FROM activities WHERE uuid_to_bin('8b6bb2f7-e7a7-4aec-8806-fbfea7093ccd') = uuid; # 54963421
# [PASSWORD_DOTS] Close [PASSWORD_DOTS]
select * from teams where id = 1031;
SELECT * FROM crm_configurations WHERE id = 959;
SELECT * FROM activities WHERE uuid_to_bin('59c517e0-96c9-4dad-bfeb-b7bef72f8725') = uuid; # 54963517
SELECT * FROM activities WHERE uuid_to_bin('07238011-25fa-418e-838b-fb21e82b9ea2') = uuid; # 54963433
SELECT * FROM activities WHERE uuid_to_bin('d68311e3-ac34-49bd-bf04-88323a7e5352') = uuid; # 54966009
# [PASSWORD_DOTS] SF [PASSWORD_DOTS]
SELECT * FROM activities WHERE uuid_to_bin('2bd4cfa3-4eb5-4c77-84a7-9ed46a21c988') = uuid;
select * from roles;
select * from permissions;
select * from permission_role where permission_id = 136;
select * from migrations order by id desc;
select * from teams where id IN (1, 1037);
select * from crm_layouts where crm_configuration_id = 1;
SELECT * FROM crm_layout_entities WHERE crm_layout_id = 1493;
SELECT * FROM crm_fields WHERE id IN (1652,1661,66799,66814,66821,66836,66843,66846,66864,84752,182306,323580,380378);
select * from features;
select * from team_features where feature_id = 33;
select * from opportunities;
select * from teams;
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 = 1052 and sa.provider = 'hubspot';
SELECT * FROM accounts where id = 11512582;
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
ActionItems
Activity
ActivityAnalytics
ActivitySearch
AiActivityType
AiAutomation
AiCallScoring
AskAnything
Dtos, folder...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
45494
|
1627
|
27
|
2026-05-14T14:40:06.493807+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-14/1778 /Users/lukas/.screenpipe/data/data/2026-05-14/1778769606493_m1.jpg...
|
PhpStorm
|
faVsco.js – IntegrationAppServiceTrait.php
|
1
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
PhpStormFileEditViewNavigateCodeLaravelRefactorRun PhpStormFileEditViewNavigateCodeLaravelRefactorRunToolsGitWindowHelplhl100% СFV faVsco.jsv#12066 on JY-20725-handle-HS-search-rate-limit k vHandleHubspotRateLimitTestv8• Thu 14 May 17:40:06* :QProject v© TrackAutomatedReportGeneratedEvent.php© SendReportJob.php=custom.logAutomatedReportResult.phpDeleteCrmEntityTrait.php18.••+ OpportunitySyncTrait.phpO SyncCrmEntitiesTrait.phpSyncFieldsTrait.php© WriteCrmTrait.phpD Utils0 Webhook© BatchSyncCollector.php© BatchSyncRedisService.php© Client.php© ClosedDealStagesService.phpC DealFieldsService.php© DecorateActivity.php© FieldDefinitions.php© FieldTypeConverter.php• HubspotClientinterface.php© HubspotTokenManager.php16© PayloadBuilder.php17 @© RemoteCrmObjectManipulatol18ResponseNormalize.php19© Service.php20© SyncFieldAction.php21© SyncRelatedActivityManager.|© WebhookSyncBatchProcessolv C IntegrationAppD AccessorsDeleteAccountJob.phpImportActivitylypes.phpT WriteCrmTrait.phpDecorateActivity.phpT IntegrationAppService Trait.php X= laravel.log© IntegrationApp/Service.php© Activity.php© Salesforce/Service.phpT LogActivityTrait.php© Playbook.phpSF [jiminny@localhost]© Pipedrive/Service.phpClose/Service.phpCopper/Service.php© BullhornService.phpPlainTextDecorateActivity.phpA HS_local [jiminny@localho:© ActivityPlaybookTrait.phpCrmHelperRepository.php© AccountController.php=.env.staging=.env4 console [QAI PROD] X© DetachActivityObject.phpRematchActivityOnCrmObjectDetach.phpMatchActivityCrmData.phpClient.php4 console [PROD]© HubspotPaginationService.phpk?php© HandleHubspotRateLimit.phpA console (EU]A2DGo jiminnydeclare(strict_types=1);084143 ×4 л215•m_layout_id =2162,1661, 66799,66namespace Jiminny (Services\Crm\IntegrationApp\Jobs;217218USe219id = 33;220trait IntegrationAppServiceTrait221222/***/no usages223* @throws ApplicationException224id THEN •(own22522622private function getTeam(TeamRepository $teamRepository): Team{...}2273122832/**22933* @throws CrmException230D Confighubspot':-34*/231DDTOD Filtersno usages23235D Jobsprivate function getPreparedCrmService(Team $team, ProviderRegistry SproviderRegistry): IntegrationAppInter 233 v= 11512582;53}© CrmEntitiesFullSyncJob.ph23454© DeleteRemoteTeamJob.phT IntegrationAppService Trait© SubscribeForEventsJob.ph© TeamInitialSyncJob.php@ UIncuhccriheForFvents.InhWorkspace associated with branch 'JY-20725-handle-HS-search-rate-limit' has been restored // Rollback // Configure... (today 16:17)W Windsurf Teams1:1UTF-8Ca 4 spaces...
|
NULL
|
-1683085803490131581
|
NULL
|
click
|
ocr
|
NULL
|
PhpStormFileEditViewNavigateCodeLaravelRefactorRun PhpStormFileEditViewNavigateCodeLaravelRefactorRunToolsGitWindowHelplhl100% СFV faVsco.jsv#12066 on JY-20725-handle-HS-search-rate-limit k vHandleHubspotRateLimitTestv8• Thu 14 May 17:40:06* :QProject v© TrackAutomatedReportGeneratedEvent.php© SendReportJob.php=custom.logAutomatedReportResult.phpDeleteCrmEntityTrait.php18.••+ OpportunitySyncTrait.phpO SyncCrmEntitiesTrait.phpSyncFieldsTrait.php© WriteCrmTrait.phpD Utils0 Webhook© BatchSyncCollector.php© BatchSyncRedisService.php© Client.php© ClosedDealStagesService.phpC DealFieldsService.php© DecorateActivity.php© FieldDefinitions.php© FieldTypeConverter.php• HubspotClientinterface.php© HubspotTokenManager.php16© PayloadBuilder.php17 @© RemoteCrmObjectManipulatol18ResponseNormalize.php19© Service.php20© SyncFieldAction.php21© SyncRelatedActivityManager.|© WebhookSyncBatchProcessolv C IntegrationAppD AccessorsDeleteAccountJob.phpImportActivitylypes.phpT WriteCrmTrait.phpDecorateActivity.phpT IntegrationAppService Trait.php X= laravel.log© IntegrationApp/Service.php© Activity.php© Salesforce/Service.phpT LogActivityTrait.php© Playbook.phpSF [jiminny@localhost]© Pipedrive/Service.phpClose/Service.phpCopper/Service.php© BullhornService.phpPlainTextDecorateActivity.phpA HS_local [jiminny@localho:© ActivityPlaybookTrait.phpCrmHelperRepository.php© AccountController.php=.env.staging=.env4 console [QAI PROD] X© DetachActivityObject.phpRematchActivityOnCrmObjectDetach.phpMatchActivityCrmData.phpClient.php4 console [PROD]© HubspotPaginationService.phpk?php© HandleHubspotRateLimit.phpA console (EU]A2DGo jiminnydeclare(strict_types=1);084143 ×4 л215•m_layout_id =2162,1661, 66799,66namespace Jiminny (Services\Crm\IntegrationApp\Jobs;217218USe219id = 33;220trait IntegrationAppServiceTrait221222/***/no usages223* @throws ApplicationException224id THEN •(own22522622private function getTeam(TeamRepository $teamRepository): Team{...}2273122832/**22933* @throws CrmException230D Confighubspot':-34*/231DDTOD Filtersno usages23235D Jobsprivate function getPreparedCrmService(Team $team, ProviderRegistry SproviderRegistry): IntegrationAppInter 233 v= 11512582;53}© CrmEntitiesFullSyncJob.ph23454© DeleteRemoteTeamJob.phT IntegrationAppService Trait© SubscribeForEventsJob.ph© TeamInitialSyncJob.php@ UIncuhccriheForFvents.InhWorkspace associated with branch 'JY-20725-handle-HS-search-rate-limit' has been restored // Rollback // Configure... (today 16:17)W Windsurf Teams1:1UTF-8Ca 4 spaces...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
45493
|
1628
|
22
|
2026-05-14T14:40:04.650394+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-14/1778 /Users/lukas/.screenpipe/data/data/2026-05-14/1778769604650_m2.jpg...
|
PhpStorm
|
faVsco.js – IntegrationAppServiceTrait.php
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
#12066 on JY-20725-handle Project: faVsco.js, menu
#12066 on JY-20725-handle-HS-search-rate-limit, menu...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"bounds":{"left":0.2962101,"top":1.0,"width":0.03856383,"height":-0.019952059},"on_screen":true,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"#12066 on JY-20725-handle-HS-search-rate-limit, menu","depth":5,"bounds":{"left":0.33477393,"top":1.0,"width":0.122340426,"height":-0.019952059},"on_screen":true,"help_text":"Pull request #12066 exists for current branch JY-20725-handle-HS-search-rate-limit, but local branch is out of sync with remote","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
7293744273990285589
|
-6961648536715800593
|
click
|
hybrid
|
NULL
|
Project: faVsco.js, menu
#12066 on JY-20725-handle Project: faVsco.js, menu
#12066 on JY-20725-handle-HS-search-rate-limit, menu
Jiminny... ~ActivityFilesLater@ jiminny-x-integrati• plattorm-inner-teamE Channels# ai-chapter# alertsi backend# bugscontusion-cllnia# curiosity lab# engineering# general#jiminny-bgac nlattorm-nckets# product launches# random# releases# sofia-officed sunport# thank-yous# the people of iimi... Direct messages• 8la 62% Galya Dimitrovavasil VasilevM Stefka StovanovaSg: Todor StamatovMario GeorgievNiudlay lanay. James Graham "* Stoyan Tanevo Stelivan Georgiev( Petko Kashinski*. Lukas Kovali...::: AnnsToastS lira Gloud6d Huddle with Aneliva Angelova* Aneliya Angelova &• Messagest Add canvasur FilesAneliya Angelova 2:30 PMЛукаш, само при Сейлсфорс и Хубспот се синкваха активити типовете, когато се направи плейбук,нали?пои останалите скМі тоябва оъчно ла се въвелат.Lukas Kovalik 2:47 PMтряова да се за всички, някъде не се ли попьлвапри зохо май беше hardcoded но май и там си връщаха две категорииAneliya Angelova 4:00 PMЛукаш имаш ли време да се чуем за тестването на https://jiminny.atlassian.net/browse/JY-20725X Preuiew in sact[HubSpotl Optimise CRM rematct(7 OpenRosdy for OA- MediumAA Aneliya AngelovaAs of today at 4:00 PM RetreshOpen in Jira* SummariseLukas Kovalik 4:02 PMzean-iurwiniareelYou joined the huddle (LIVE 4:06 PMAneliva Angelova is here toolAneliva Angelova 4:44 PN11512582Lukas Kovalik M 5.16 PNcurl --location "httns:ani.hubani.com/crm/v3/obiects/contacts/search--header 'Content-vne' annlication/ison'--header "Authorization: BearerC|Kvma?iMx7OINOM8kOFwrAowAcAkUAhIR24?A05D?xiVrIYMILuP6SA01Kwcmhr=n.v2 hytorDniMvDalYck-CMalovolNOM9kOFwrAUAcrkcaws-ThwRARIRAOF-ATFSAOFRAO-ROIEBAQUBEggBAQEBAYICFIr7Au8O2Nwal9YW2CbCCxYvwngmSgNldTFSAFoAYABoAHAAeAA'\--data "{ "limit", 13'Message Aneliva Angelova+ AaIđ 0Pmv Q SearchDate ModifiedYesterday at 13.3Yesterday at 13:36Yesterday at 13:36Yesterday at 13.30Yesterdav at 13:35Yesterday at 13:34Yesterday at 13:34Yesterdav at 13:3kYesterday at 13:33Yesterday at 13.32Yesterdav at 13:31resterday at 15:30Yesterdav at 13:30Yesterday at 13:29Yesterday at 13:29Yesterday at 13:28Yecterdav at 12:28resterday at 13-21Yesterdav at 13:26Yesterday at 13:26Yesterday at 13:25Yesterday at 13:25Voctorday at 12:01Yesterday at 13.23Yesterdav at 13:22resterady al 15.clYesterday at 13:20Yesterday at 13.19Yecterdav at 12:19Yesterdav at 13:18Yesterday at 13-1/Yesterdav at 13:17Yesterday at 13:16Yesterday at 13:15Yecterdav at 12:15Yesterday at 13.14Yecterdav at 13:10Yesterday at 13:13Yesterday at 13:12Yoctorday at 12:11Yesterday at 13.10Yecterdav at 12:10Yesterdav at 13:09Yesterdav at 13:08v Size23 KB9 KB13 Kb16 KE17 KB29 KB16 K:12 KB9 KEIKBn8 KBI37 KB10 KB7 KE8 KB9 KB8 KB172 KR14 KB13 KB9 KE18 KB12 KB10 KBI16 KB6 KB6KB12 KE23 KB8 KB16 K:11 KB20 KP34 KB10 KB7 K:5 KB11 KB26 KBMPEG-4 movieMPEG-4 movieMPEG-4 movieMPEG-4 movieMPE0"4 movieMDSG-A movieMP2G-4 movieMPEG-4 movieMPEG"4 movieMPEG-4 movieMoEeh movioMPEG-4 movieMPEG-1 movieMPEG-4 movieMPEG-4 movieMPEG-4 movieMPEG-4 movieMDEG.A movicMPEG-4 movieMPEG-4 movieMPEG-4 movieMPEG-4 movieMDEC A movidMPEG-4 movieMDEG-A movieMPEG-4 movieMPEG-4 movieMDEC.A moviaMPEG-4 movie111 KC102 KB88 KBMDEG-A moviaMPEG-4 movie59 KB1MPEG-A movie98 KB MPEG-4 movie97 KB66 K3MPEG-4 movieMDEG.A movioAAKP93 KB/8 KbMPEG-4 movie50 KгMDEG-A movid58 KBMPEG-4 movie27 KB7KBMPEG-4 movieAl Notes: OffLeave• • CFavourites• jiminny• Recents* ApplicationsiCloud• iCloud Drive992 Svnc toldeLocations0 DXP4800PLUS-B5F49 Networl• CRMI• Orange• Red|• Yellow• Green• Purple•) All lags..IhlDownloadsNameLoom.pkgAlfred copv.alfredoreterences=KeychronAssist-1.0.2 (1).dmeKeychronAssist-1.0.2.dmgmazanoke-images-yWJo.zioPhotos-3-001.zip• Transcript.pd→mage U.loge1 Orioninstaller.dma_image.jpg- image (2).1pc• ПO-22221726037035-004-001_ORGES.pdf%D0%9F%D0%9E-22221726037035-004-001 archive.zipПO-22221726037035-004-001_archive (1).zip• repon 4).XmAltred copy2.altredoreterencesСE 060209С О000000026571172 CWICT 0Р70501260015900 ndt= 27022026_0000000026574472_ SWIFT_ [IBAN].pdf= 03042026 [CREDIT_CARD] SWIFT [CREDIT_CARD].001reportxmmi=pdt.odiB pdf-1.pdfD pdf-2.pdf-pdf-5.pd1= ndf-1 ndipdf-3.pdfKoválik Family Tree.gedbitwarden export 20251031122528.isonlKoválik Family Tree.zip*macOS Storage_Cleanup.mdal favicon icofirst aid_notes_complete.docxrenortl2).esv1 config.vmlIteration run Search HS.postman_collection.jsonm licence bettertouchtoalMariusHosting Config.isonnokc.901a6502.6667.A62h-062 ccu•AlfredwPmazanoko.imnaoc.YWIfана Ковалик.jpg•искане даниел Ковалик..pg• Фактура Март Даниел Ковалик.jрс• Фактура Април Даниел Ковалик iро• Dhotac 2.001Q SearchKind00,4 MD55.9 MBinstdlle..dckageAlfred...ferences10,1 MB10,1 MBIL MBDisk ImageDisk ImageLiP archive6.6 MBZIp archive2,5 MB PDF Document2,5 MBJreo lmage2.2 MBDisk Image2,2 MB PDF Document2 MBJPEG image1,9 MBJPEG imaqe192 KBPDE Document140 KbZIP archive148 KВ148 KB122 KBZIP archivelZIP archiveXML document111 KBAlfred...ferences94 KBDDE Documont92 KBPDr DocumentK:PDF Document91 KB91 KBXML document30 KBn0kpDDE Nocumont28 KBPDF Document28 KRPDE Document28 KB27 KBDocument14 KB11 KB6 KB6KBJSONINCV NacumontZIP archiveMarkdo…..ument5KRWindo...n image4 KB3 KBword ..cumentCSV Document2 KBVAMI dosumon1 KB029 buteccSV Documenthttlicence183 bytesZero butesJSONAlfrod foronso!Zero bytesFolde1.9 MB1,8 MB17 MB1,7 MBColdorJPEG imageJPEG ImageIPEG imadeJPEG imageColdo1 of 58 selected, 8.44 GB availabld• Inu 14 Mау 1/.40*04Date AddedIs Mdl ZUzo dl 19:4530 Jan 2026 at 12:3617 Mar 2026 at 20:2717 Mar 2026 at 20:26Z3 Aor 2020 al 13:0229 ,Jan 2026 at 15:2019 Dec 2025 at 10:1619 Dec 2025 at 12:238 Aor 2026 at 20:3519 Dec 2025 at 10:2919 Dec 2025 at 12:1819 Dec 2025 at 12:4026 Mar 2026 at 11:2410 May 2026 at 13:5326 Mar 2026 at 11:2426 Mar 2026 at 11:2426 Mar 2026 at 11:2310 May 2026 at 14:3730 Jan 2026 at 12:3712 Goh 2006 9t 11:5 A1Z3 Apr 2026 at 13.0823 Aor 2026 at 13:0810 May 2026 at 13:5410 May 2026 at 14:3710 May 2026 at 13:4910 May 2026 at 13:5010 May 2026 at 13:5110 Mav 2026 at 12:51110 May 2026 at 13:5019 Dec 2025 at 11:3431 Oct 2025 at 12:2525 Nau 2025 г+ 17:506 Mar 2026 at 11.2224 Anr 2026 at 16:5220 Oct 2025 at 11:0218 Mar 2026 at 15:29• Mav 2026 at 11:09129 Oct 2025 at 19:329 May 2026 at 10:0419 Mar 2026 at 11:55|10 May 2026 at 13:5712 Jun 2025 at 19:0430 Jan 2026 at 12:362616 Oct 2025 aт 16:0122 Aar 2026 at 12:0223 Apr 2026 at 13:0223 Apr 2026 at 13:0222 Anr 2026 at 12:0223 Apr 2026 at 13:0229 Jan 2026 at 15:20...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
45492
|
1627
|
26
|
2026-05-14T14:40:04.650436+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-14/1778 /Users/lukas/.screenpipe/data/data/2026-05-14/1778769604650_m1.jpg...
|
PhpStorm
|
faVsco.js – IntegrationAppServiceTrait.php
|
1
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
PhpStormFileEditViewNavigateCodeLaravelRefactorRun PhpStormFileEditViewNavigateCodeLaravelRefactorRunToolsGitWindowHelplhl100% CFV faVsco.jsv* #12066 on JY-20725-handle-HS-search-rate-limit k vHandleHubspotRateLimitTest8• Thu 14 May 17:40:04* :QProject vTrackAutomatedReportGeneratedEvent.phpAutomatedReportResult.phpSendReportJob.phpDeleteCrmEntityTrait.php=custom.log© BullhornLoginHandlerInterfaceDeleteAccountJob.phpImportActivitylypes.phpWriteCrmTrait.phpDecorateActivity.phpT IntegrationAppService Trait.php X= laravel.log© BullhornService.php© BullhornSessionDecorator.php© IntegrationApp/Service.php© Activity.phpSalesforce/Service.phpT LogActivityTrait.php© Playbook.phpSF [jiminny@localhost]© BullhornSessionManager.php© Pipedrive/Service.phpClose/Service.phpCopper/Service.php XBullhornService.phpPlainTextDecorateActivity.phpA HS_local [jiminny@localho:W© BullhornSessionManagerinteriT ActivityPlaybookTrait.phpCrmHelperRepository.php© AccountController.php=.env.staging=.env4 console [QAI PROD] X18© FieldDefinitions.phpv Close•DetachActivityObject.phpRematchActivityOnCrmObjectDetach.phpMatchActivityCrmData.phpClient.php4 console [PROD]> D OpportunitySyncStrategyD Processor© HubspotPaginationService.php© HandleHubspotRateLimit.phpA console (EU]52class Service extends BaseService implements0 ProspectSearchStrategy811 472 M1 ×4DGo jiminny1664Translatorprivate function buildCallPayload(Activity Sactivity): Activity084143 ×4 л© Client.php16791);215•m_layout_id =© CloseException.php1680} else {2162,1661, 66799,66© FieldDefinitions.php1681ifu(Sthis-zgetcrattype(S.ncategory2miaulin217© FieldValueConverter.php1682Smessage = sprintf( format:© Service.php1683'[Copper] Invalid CRM Activity Type: %s', Sactivity->category=.218219=id = 33;© StandardFieldMetadata.php1684throw new CrmException($message,code: 400):220v [ Copper|1685221=> D Api1686=222> D Exception1687if ($this->getCrmType($activity->category)->value === null) 1E223> OpportunitySyncStrategy1688Smessage = sprintf( format:'[Copper] Invalid CRM Activity Type: %s value', $activity->cate 224id THEN •(own> C ProspectSearchStrategy1689225)> D Traits1690throw new CrmException(Smessage,code: 400):=226© FieldDefinitions.php1691= 227© FieldValueConverter.php1692// Just create an activity.228© Service.php1693$cpActivity = $this->copperClient-›activities()->create([= 229> D CrmObjects1694'user_id' => $this->profile->crm_provider_id,= 230hubspot':v @ DecorateActivity1695'activity_date' => $activity->scheduled_start_time->timestamp,— 231|-© BaseDecorateActivity.php1696'parent' => $this->convertActivityAssoCiations($activity),© PlainTextDecorateActivity.php 1697'type' => $this->convertActivityType(Sactivity->category),F 233 v= 11512582;› @ Dummy1698'details' => Sthis->generateActivityDescription(Sactivity),=234v Helpers16991):T ActivityPlaybookTrait.php1700© Arraylterator.php1701Sactivity->crm_provider_id = $cpActivity['id'];• ConnectionStateTrait.php1702Sactivity->saveO;@ CrmHelnerRenncitorv nhn1703=Duplicated code fragment (11 lines long)W Windsurf Teams1681:34UTF-8Ca 4 spaces...
|
NULL
|
2843264272946408747
|
NULL
|
click
|
ocr
|
NULL
|
PhpStormFileEditViewNavigateCodeLaravelRefactorRun PhpStormFileEditViewNavigateCodeLaravelRefactorRunToolsGitWindowHelplhl100% CFV faVsco.jsv* #12066 on JY-20725-handle-HS-search-rate-limit k vHandleHubspotRateLimitTest8• Thu 14 May 17:40:04* :QProject vTrackAutomatedReportGeneratedEvent.phpAutomatedReportResult.phpSendReportJob.phpDeleteCrmEntityTrait.php=custom.log© BullhornLoginHandlerInterfaceDeleteAccountJob.phpImportActivitylypes.phpWriteCrmTrait.phpDecorateActivity.phpT IntegrationAppService Trait.php X= laravel.log© BullhornService.php© BullhornSessionDecorator.php© IntegrationApp/Service.php© Activity.phpSalesforce/Service.phpT LogActivityTrait.php© Playbook.phpSF [jiminny@localhost]© BullhornSessionManager.php© Pipedrive/Service.phpClose/Service.phpCopper/Service.php XBullhornService.phpPlainTextDecorateActivity.phpA HS_local [jiminny@localho:W© BullhornSessionManagerinteriT ActivityPlaybookTrait.phpCrmHelperRepository.php© AccountController.php=.env.staging=.env4 console [QAI PROD] X18© FieldDefinitions.phpv Close•DetachActivityObject.phpRematchActivityOnCrmObjectDetach.phpMatchActivityCrmData.phpClient.php4 console [PROD]> D OpportunitySyncStrategyD Processor© HubspotPaginationService.php© HandleHubspotRateLimit.phpA console (EU]52class Service extends BaseService implements0 ProspectSearchStrategy811 472 M1 ×4DGo jiminny1664Translatorprivate function buildCallPayload(Activity Sactivity): Activity084143 ×4 л© Client.php16791);215•m_layout_id =© CloseException.php1680} else {2162,1661, 66799,66© FieldDefinitions.php1681ifu(Sthis-zgetcrattype(S.ncategory2miaulin217© FieldValueConverter.php1682Smessage = sprintf( format:© Service.php1683'[Copper] Invalid CRM Activity Type: %s', Sactivity->category=.218219=id = 33;© StandardFieldMetadata.php1684throw new CrmException($message,code: 400):220v [ Copper|1685221=> D Api1686=222> D Exception1687if ($this->getCrmType($activity->category)->value === null) 1E223> OpportunitySyncStrategy1688Smessage = sprintf( format:'[Copper] Invalid CRM Activity Type: %s value', $activity->cate 224id THEN •(own> C ProspectSearchStrategy1689225)> D Traits1690throw new CrmException(Smessage,code: 400):=226© FieldDefinitions.php1691= 227© FieldValueConverter.php1692// Just create an activity.228© Service.php1693$cpActivity = $this->copperClient-›activities()->create([= 229> D CrmObjects1694'user_id' => $this->profile->crm_provider_id,= 230hubspot':v @ DecorateActivity1695'activity_date' => $activity->scheduled_start_time->timestamp,— 231|-© BaseDecorateActivity.php1696'parent' => $this->convertActivityAssoCiations($activity),© PlainTextDecorateActivity.php 1697'type' => $this->convertActivityType(Sactivity->category),F 233 v= 11512582;› @ Dummy1698'details' => Sthis->generateActivityDescription(Sactivity),=234v Helpers16991):T ActivityPlaybookTrait.php1700© Arraylterator.php1701Sactivity->crm_provider_id = $cpActivity['id'];• ConnectionStateTrait.php1702Sactivity->saveO;@ CrmHelnerRenncitorv nhn1703=Duplicated code fragment (11 lines long)W Windsurf Teams1681:34UTF-8Ca 4 spaces...
|
45490
|
NULL
|
NULL
|
NULL
|
|
45472
|
1628
|
12
|
2026-05-14T14:39:04.081382+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-14/1778 /Users/lukas/.screenpipe/data/data/2026-05-14/1778769544081_m2.jpg...
|
PhpStorm
|
faVsco.js – IntegrationAppServiceTrait.php
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
#12066 on JY-20725-handle Project: faVsco.js, menu
#12066 on JY-20725-handle-HS-search-rate-limit, menu
Start Listening for PHP Debug Connections
HandleHubspotRateLimitTest
Run 'HandleHubspotRateLimitTest'
Debug 'HandleHubspotRateLimitTest'
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
declare(strict_types=1);
namespace Jiminny\Services\Crm\IntegrationApp\Jobs;
use Jiminny\Contracts\Crm\Providers;
use Jiminny\Contracts\Repositories\TeamRepository;
use Jiminny\Contracts\Services\Crm\Provider\IntegrationAppInterface;
use Jiminny\Exceptions\ApplicationException;
use Jiminny\Exceptions\CrmException;
use Jiminny\Exceptions\RuntimeException;
use Jiminny\Models\Crm\Configuration;
use Jiminny\Models\Team;
use Jiminny\Services\Crm\ProviderRegistry;
trait IntegrationAppServiceTrait
{
/**
* @throws ApplicationException
*/
private function getTeam(TeamRepository $teamRepository): Team
{
$team = $teamRepository->find($this->teamId);
if (! $team instanceof Team) {
throw new ApplicationException("Team not found: {$this->teamId}");
}
return $team;
}
/**
* @throws CrmException
*/
private function getPreparedCrmService(Team $team, ProviderRegistry $providerRegistry): IntegrationAppInterface
{
$configuration = $team->getCrmConfiguration();
if (! Providers::isIntegrationAppProvider($configuration->getProviderName())) {
// This is unlikely to happen, but better safe than sorry
throw new CrmException('Trying to bootstrap a non IntegrationApp team');
}
/** @var IntegrationAppInterface $crmService */
$crmService = $providerRegistry->get(Configuration::PROVIDER_INTEGRATION_APP);
$owner = $team->getOwner();
if ($owner === null) {
throw new RuntimeException('Owner not found');
}
$crmService->setUser($owner);
return $crmService;
}
}
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
8
1
3
4
Previous Highlighted Error
Next Highlighted Error
SELECT
# DISTINCT
opp.id as opp_id, opp.uuid, opp.name,
# COUNT(dr.id) AS deal_risk_count,
# dr.id,
# cfd.value,
usr.name AS owner_name,
opp.value, opp.currency_code, opp.close_date, opp.remotely_created_at, opp.is_closed, opp.is_won,
usr.uuid as owner_uuid,
usr.photo_path as owner_photo,
usr.id AS owner_id,
jt.name as owner_job,
opp.stage_id, opp.stage_updated_at,
acc.name AS acc_name, opp.stage_updated_at, acc.crm_provider_id AS acc_provider_id, opp.crm_provider_id AS opp_provider_id,
rt.business_process_id AS pipeline_id
FROM opportunities opp
LEFT JOIN record_types rt ON opp.record_type_id = rt.id
LEFT JOIN users usr ON opp.user_id = usr.id
LEFT JOIN accounts acc ON opp.account_id = acc.id
LEFT JOIN job_titles jt ON usr.job_title_id = jt.id
# LEFT JOIN group_deal_risk_types gdrt ON gdrt.group_id = usr.group_id
# LEFT JOIN deal_risks dr ON dr.opportunity_id = opp.id AND dr.group_deal_risk_type_id = gdrt.id
LEFT JOIN crm_field_data cfd ON (cfd.object_id = opp.id and cfd.crm_field_id = 66814)
WHERE opp.user_id IS NOT NULL
AND opp.deleted_at IS NULL
AND opp.is_closed = 1
AND opp.is_won = 0
AND opp.close_date >= '2024-01-01 00:00:00'
AND opp.close_date <= '2024-12-31 23:59:59'
AND usr.team_id = 1
# and opp.id = 4823179
GROUP BY opp.id, cfd.value
ORDER BY
# cfd.value
CAST(cfd.value AS UNSIGNED)
# owner_name
# (SELECT COUNT(dr.id)
# FROM deal_risks dr
# JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id
# WHERE dr.opportunity_id = opp.id
# AND dr.is_active = 1
# AND gdrt.is_enabled = 1)
DESC
LIMIT 25
# OFFSET 0
;
select * from crm_fields where crm_configuration_id = 1 and object_type = 'opportunity';
select * from crm_layout_entities where crm_layout_id = 1493;
SELECT * FROM opportunities WHERE id = 4584045;
SELECT * FROM crm_field_data WHERE object_id = 4584045;
SELECT * FROM opportunities where team_id = 1 and crm_provider_id = '0061K00000lfb9IQAQ'
SELECT
opp.id as opportunity_id,
opp.name,
COUNT(dr.id) as risk_count
FROM opportunities opp
LEFT JOIN deal_risks dr ON dr.opportunity_id = opp.id
WHERE opp.id IN (
6069574,8900938,9507638,9524799,9660490,9662824,9705675,9749758,4158460,4391812,6450439,4448422,5118945,5590675,4584045,7228149,9002408,9165534,9446720,9641778,9665149,9703344,9709280,5747948,4158491,6182565,6263970,5798120,5111315,4536978,6062352,6548383,6072095,6548225,4480986,5011422,6548381,8760540,8917554,9509986,9514392,9569009,9569011,9578490,9713604,5784397,7276612,7288405,8994421,9118219,9608148,9818911,4510535,6479693,5958049,6271674,6550448,4158331,4158483,6126571,6171615,6540943,4897466,5190896,5796182,5932762,8572433,8723698,8892697,9711001,9789264,4549188,6100831,6170064,6260799,6263653,6449936,6530871,6538978,7777651,8059269,8319918,8787049,8901150,9263153,9453207,9514738,9696700,9791062,5752018,6421452,7439134,7878923,9354763,9369285,9514396,9582506,9889949,9890216,4094311,4158495,4158496,6098128,5585661,3872564,6442149,5891604,6164746,6199593,6583474,6519684,9018490,9809006,4496897,5041324,5829430,6198319,6253504,6555763,7242914,7931055,8024125,8797814,8058559,8673347,8892695,8994420,9616219,9714970,9722004,9809439,9818918,6523177,8134147,9002915,9711422,9892713,9901719,9954210,9978435,5800810,6243518,6416114,6222251,6411974,6512456,5791953,6545606,9914780,5805540,6238986,6463838,6547680,9767049,9809437,9810885,9890855,6673493,9902036,4335521,6379871,6503799,6546077,8018765,9907556,9958433,9905855,9916179,9946741,9957877,5563344,6271838,6450815,7641128,7762567,7780592,8684810,8685786,8685787,8685788
)
GROUP BY opp.id;
SELECT COUNT(dr.id)
FROM deal_risks dr
JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id
WHERE dr.opportunity_id = 5563344
# AND gdrt.group_id = usr.group_id
EXPLAIN SELECT
opp.id as opp_id, opp.uuid, opp.name,
cfd.value,
cfv.sequence,
cfv.value,
# MAX(cfd.value) AS max_cfd_value,
usr.name AS owner_name,
opp.value, opp.currency_code, opp.close_date, opp.remotely_created_at, opp.is_closed, opp.is_won,
usr.uuid as owner_uuid,
usr.photo_path as owner_photo,
usr.id AS owner_id,
jt.name as owner_job,
opp.stage_id, opp.stage_updated_at,
acc.name AS acc_name, opp.stage_updated_at, acc.crm_provider_id AS acc_provider_id, opp.crm_provider_id AS opp_provider_id,
rt.business_process_id AS pipeline_id
FROM opportunities opp
LEFT JOIN record_types rt ON opp.record_type_id = rt.id
LEFT JOIN users usr ON opp.user_id = usr.id
LEFT JOIN accounts acc ON opp.account_id = acc.id
LEFT JOIN job_titles jt ON usr.job_title_id = jt.id
LEFT JOIN crm_field_data cfd ON cfd.id = (SELECT sub_cfd.id
FROM crm_field_data sub_cfd
WHERE sub_cfd.object_id = opp.id
AND sub_cfd.crm_field_id = 66810
ORDER BY sub_cfd.updated_at DESC
LIMIT 1)
LEFT JOIN crm_field_values cfv ON cfv.crm_field_id = 66810 AND cfv.value = cfd.value
WHERE opp.user_id IS NOT NULL
AND opp.deleted_at IS NULL
AND opp.is_closed = 0
# AND opp.is_closed = 1
# AND opp.is_won = 0
AND opp.close_date >= '2024-01-01 00:00:00'
AND opp.close_date <= '2024-12-31 23:59:59'
AND usr.team_id = 1
# and opp.id = 4823179
# GROUP BY opp.id
ORDER BY
cfv.sequence DESC,
# opp.name
# owner_name
cfd.value
# CAST(cfd.value AS UNSIGNED)
# CAST(MAX(cfd.value) AS UNSIGNED)
# (SELECT COUNT(dr.id)
# FROM deal_risks dr
# JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id
# WHERE dr.opportunity_id = opp.id
# AND dr.is_active = 1 AND gdrt.is_enabled = 1)
DESC
# LIMIT 75, 25
;
SELECT * FROM crm_field_values WHERE crm_field_id = 66810;
SELECT f.id, f.crm_provider_id AS field_name, f.label, fd.object_id AS dealId, fd.value, fd.updated_at, fd.id, fd.created_at
FROM crm_fields f
INNER JOIN crm_field_data fd ON fd.crm_field_id = f.id
WHERE (f.crm_configuration_id = 1)
AND (f.object_type = 'opportunity')
# AND (fd.object_id IN (4158331,4158483,4158495,4158496,6069574,6263970,6171615,6540943,6545606,5829430,6198319,6263653,6548381,7242914,8797814,7228149,7439134,7878923,8134147,9002915,9118219,9165534,9354763,9369285,9446720))
AND (fd.object_id IN (4158460))
AND (f.crm_provider_id IN ('ForecastCategoryName'))
ORDER BY fd.object_id ASC, fd.updated_at DESC;
select * from crm_layouts where crm_configuration_id = 1;
select cf.* from crm_fields cf
join crm_layout_entities cle on cf.id = cle.crm_field_id
where crm_layout_id = 1493;
SELECT * FROM opportunities WHERE id = 4158460;
SELECT * FROM crm_field_data WHERE object_id = 4158460;
select * from users where team_id = 1;
SELECT * FROM users WHERE id = 7160;
select * from role_user where user_id = 3248;
select * from crm_field_values where crm_field_id = 66824;
SELECT * FROM users WHERE id = 23470;
select * from crm_configurations;
# [PASSWORD_DOTS]
select * from teams where id = 1038; # 23521, 966
select * from users where team_id = 1038;
select * from crm_configurations where id = 966;
SELECT * FROM activities WHERE uuid_to_bin('e8dc7c34-31f6-4430-bd81-2d9d8f00dd07') = uuid; # 54965762
SELECT * FROM activities WHERE uuid_to_bin('4b5727c0-69d1-428f-b8d9-b649055166e2') = uuid; # 54965764
SELECT * FROM participants WHERE activity_id = 54965764;
SELECT id, uuid, title, recording_state FROM activities WHERE uuid_to_bin('355f105d-5606-4379-b0c5-d91daf59f4ce') = uuid; # 54964075
SELECT * FROM participants WHERE activity_id = 54964075;
select f.id, slug, title, tf.team_id from team_features tf JOIN features f on tf.feature_id = f.id
where tf.team_id = 1038;
# [PASSWORD_DOTS] PD [PASSWORD_DOTS]
select * from teams where id = 1029;
SELECT * FROM crm_configurations WHERE id = 957;
SELECT * FROM activities WHERE uuid_to_bin('581a33cb-4343-44bd-ac0c-4a5cee71c5ec') = uuid; # 54963423
SELECT * FROM activities WHERE uuid_to_bin('07238011-25fa-418e-838b-fb21e82b9ea2') = uuid; # 54963433
SELECT * FROM activities WHERE uuid_to_bin('8b6bb2f7-e7a7-4aec-8806-fbfea7093ccd') = uuid; # 54963421
# [PASSWORD_DOTS] Close [PASSWORD_DOTS]
select * from teams where id = 1031;
SELECT * FROM crm_configurations WHERE id = 959;
SELECT * FROM activities WHERE uuid_to_bin('59c517e0-96c9-4dad-bfeb-b7bef72f8725') = uuid; # 54963517
SELECT * FROM activities WHERE uuid_to_bin('07238011-25fa-418e-838b-fb21e82b9ea2') = uuid; # 54963433
SELECT * FROM activities WHERE uuid_to_bin('d68311e3-ac34-49bd-bf04-88323a7e5352') = uuid; # 54966009
# [PASSWORD_DOTS] SF [PASSWORD_DOTS]
SELECT * FROM activities WHERE uuid_to_bin('2bd4cfa3-4eb5-4c77-84a7-9ed46a21c988') = uuid;
select * from roles;
select * from permissions;
select * from permission_role where permission_id = 136;
select * from migrations order by id desc;
select * from teams where id IN (1, 1037);
select * from crm_layouts where crm_configuration_id = 1;
SELECT * FROM crm_layout_entities WHERE crm_layout_id = 1493;
SELECT * FROM crm_fields WHERE id IN (1652,1661,66799,66814,66821,66836,66843,66846,66864,84752,182306,323580,380378);
select * from features;
select * from team_features where feature_id = 33;
select * from opportunities;
select * from teams;
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 = 1052 and sa.provider = 'hubspot';
SELECT * FROM accounts where id = 11512582;
select * from activities where account_id = 11512582;
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide
app ~/jiminny/app
.circleci...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"bounds":{"left":0.2962101,"top":1.0,"width":0.03856383,"height":-0.019952059},"on_screen":true,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"#12066 on JY-20725-handle-HS-search-rate-limit, menu","depth":5,"bounds":{"left":0.33477393,"top":1.0,"width":0.122340426,"height":-0.019952059},"on_screen":true,"help_text":"Pull request #12066 exists for current branch JY-20725-handle-HS-search-rate-limit, but local branch is out of sync with remote","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"bounds":{"left":0.5731383,"top":1.0,"width":0.011303191,"height":-0.019952059},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"HandleHubspotRateLimitTest","depth":6,"bounds":{"left":0.5884308,"top":1.0,"width":0.076130316,"height":-0.019952059},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run 'HandleHubspotRateLimitTest'","depth":6,"bounds":{"left":0.66456115,"top":1.0,"width":0.011303191,"height":-0.019952059},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'HandleHubspotRateLimitTest'","depth":6,"bounds":{"left":0.67586434,"top":1.0,"width":0.011303191,"height":-0.019952059},"on_screen":true,"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.6871675,"top":1.0,"width":0.011303191,"height":-0.019952059},"on_screen":true,"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.7150931,"top":1.0,"width":0.011303191,"height":-0.019952059},"on_screen":true,"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.72639626,"top":1.0,"width":0.011303191,"height":-0.019952059},"on_screen":true,"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.73769945,"top":1.0,"width":0.011303191,"height":-0.019952059},"on_screen":true,"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},"on_screen":false,"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},"on_screen":false,"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},"on_screen":false,"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},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"2","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"on_screen":true,"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\\IntegrationApp\\Jobs;\n\nuse Jiminny\\Contracts\\Crm\\Providers;\nuse Jiminny\\Contracts\\Repositories\\TeamRepository;\nuse Jiminny\\Contracts\\Services\\Crm\\Provider\\IntegrationAppInterface;\nuse Jiminny\\Exceptions\\ApplicationException;\nuse Jiminny\\Exceptions\\CrmException;\nuse Jiminny\\Exceptions\\RuntimeException;\nuse Jiminny\\Models\\Crm\\Configuration;\nuse Jiminny\\Models\\Team;\nuse Jiminny\\Services\\Crm\\ProviderRegistry;\n\ntrait IntegrationAppServiceTrait\n{\n /**\n * @throws ApplicationException\n */\n private function getTeam(TeamRepository $teamRepository): Team\n {\n $team = $teamRepository->find($this->teamId);\n if (! $team instanceof Team) {\n throw new ApplicationException(\"Team not found: {$this->teamId}\");\n }\n\n return $team;\n }\n\n /**\n * @throws CrmException\n */\n private function getPreparedCrmService(Team $team, ProviderRegistry $providerRegistry): IntegrationAppInterface\n {\n $configuration = $team->getCrmConfiguration();\n if (! Providers::isIntegrationAppProvider($configuration->getProviderName())) {\n // This is unlikely to happen, but better safe than sorry\n throw new CrmException('Trying to bootstrap a non IntegrationApp team');\n }\n\n /** @var IntegrationAppInterface $crmService */\n $crmService = $providerRegistry->get(Configuration::PROVIDER_INTEGRATION_APP);\n $owner = $team->getOwner();\n if ($owner === null) {\n throw new RuntimeException('Owner not found');\n }\n $crmService->setUser($owner);\n\n return $crmService;\n }\n}","depth":4,"on_screen":true,"value":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Services\\Crm\\IntegrationApp\\Jobs;\n\nuse Jiminny\\Contracts\\Crm\\Providers;\nuse Jiminny\\Contracts\\Repositories\\TeamRepository;\nuse Jiminny\\Contracts\\Services\\Crm\\Provider\\IntegrationAppInterface;\nuse Jiminny\\Exceptions\\ApplicationException;\nuse Jiminny\\Exceptions\\CrmException;\nuse Jiminny\\Exceptions\\RuntimeException;\nuse Jiminny\\Models\\Crm\\Configuration;\nuse Jiminny\\Models\\Team;\nuse Jiminny\\Services\\Crm\\ProviderRegistry;\n\ntrait IntegrationAppServiceTrait\n{\n /**\n * @throws ApplicationException\n */\n private function getTeam(TeamRepository $teamRepository): Team\n {\n $team = $teamRepository->find($this->teamId);\n if (! $team instanceof Team) {\n throw new ApplicationException(\"Team not found: {$this->teamId}\");\n }\n\n return $team;\n }\n\n /**\n * @throws CrmException\n */\n private function getPreparedCrmService(Team $team, ProviderRegistry $providerRegistry): IntegrationAppInterface\n {\n $configuration = $team->getCrmConfiguration();\n if (! Providers::isIntegrationAppProvider($configuration->getProviderName())) {\n // This is unlikely to happen, but better safe than sorry\n throw new CrmException('Trying to bootstrap a non IntegrationApp team');\n }\n\n /** @var IntegrationAppInterface $crmService */\n $crmService = $providerRegistry->get(Configuration::PROVIDER_INTEGRATION_APP);\n $owner = $team->getOwner();\n if ($owner === null) {\n throw new RuntimeException('Owner not found');\n }\n $crmService->setUser($owner);\n\n return $crmService;\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,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Explain Plan","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Browse Query History","depth":4,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"View Parameters","depth":4,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Open Query Execution Settings…","depth":4,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"In-Editor Results","depth":4,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Tx: Auto","depth":4,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Cancel Running Statements","depth":4,"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Playground","depth":4,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"jiminny","depth":4,"on_screen":true,"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},"on_screen":false,"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},"on_screen":false,"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},"on_screen":false,"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},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"8","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"1","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"3","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"4","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"SELECT\n# DISTINCT\nopp.id as opp_id, opp.uuid, opp.name,\n# COUNT(dr.id) AS deal_risk_count,\n\n# dr.id,\n# cfd.value,\nusr.name AS owner_name,\nopp.value, opp.currency_code, opp.close_date, opp.remotely_created_at, opp.is_closed, opp.is_won,\nusr.uuid as owner_uuid,\nusr.photo_path as owner_photo,\nusr.id AS owner_id,\njt.name as owner_job,\nopp.stage_id, opp.stage_updated_at,\nacc.name AS acc_name, opp.stage_updated_at, acc.crm_provider_id AS acc_provider_id, opp.crm_provider_id AS opp_provider_id,\nrt.business_process_id AS pipeline_id\nFROM opportunities opp\nLEFT JOIN record_types rt ON opp.record_type_id = rt.id\nLEFT JOIN users usr ON opp.user_id = usr.id\nLEFT JOIN accounts acc ON opp.account_id = acc.id\nLEFT JOIN job_titles jt ON usr.job_title_id = jt.id\n\n# LEFT JOIN group_deal_risk_types gdrt ON gdrt.group_id = usr.group_id\n# LEFT JOIN deal_risks dr ON dr.opportunity_id = opp.id AND dr.group_deal_risk_type_id = gdrt.id\n\nLEFT JOIN crm_field_data cfd ON (cfd.object_id = opp.id and cfd.crm_field_id = 66814)\n\nWHERE opp.user_id IS NOT NULL\nAND opp.deleted_at IS NULL\nAND opp.is_closed = 1\nAND opp.is_won = 0\nAND opp.close_date >= '2024-01-01 00:00:00'\nAND opp.close_date <= '2024-12-31 23:59:59'\nAND usr.team_id = 1\n\n# and opp.id = 4823179\n\nGROUP BY opp.id, cfd.value\nORDER BY\n# cfd.value\n CAST(cfd.value AS UNSIGNED)\n# owner_name\n# (SELECT COUNT(dr.id)\n# FROM deal_risks dr\n# JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id\n# WHERE dr.opportunity_id = opp.id\n# AND dr.is_active = 1\n# AND gdrt.is_enabled = 1)\nDESC\nLIMIT 25\n# OFFSET 0\n;\n\nselect * from crm_fields where crm_configuration_id = 1 and object_type = 'opportunity';\nselect * from crm_layout_entities where crm_layout_id = 1493;\n\nSELECT * FROM opportunities WHERE id = 4584045;\nSELECT * FROM crm_field_data WHERE object_id = 4584045;\n\nSELECT * FROM opportunities where team_id = 1 and crm_provider_id = '0061K00000lfb9IQAQ'\n\nSELECT\n opp.id as opportunity_id,\n opp.name,\n COUNT(dr.id) as risk_count\nFROM opportunities opp\nLEFT JOIN deal_risks dr ON dr.opportunity_id = opp.id\nWHERE opp.id IN (\n 6069574,8900938,9507638,9524799,9660490,9662824,9705675,9749758,4158460,4391812,6450439,4448422,5118945,5590675,4584045,7228149,9002408,9165534,9446720,9641778,9665149,9703344,9709280,5747948,4158491,6182565,6263970,5798120,5111315,4536978,6062352,6548383,6072095,6548225,4480986,5011422,6548381,8760540,8917554,9509986,9514392,9569009,9569011,9578490,9713604,5784397,7276612,7288405,8994421,9118219,9608148,9818911,4510535,6479693,5958049,6271674,6550448,4158331,4158483,6126571,6171615,6540943,4897466,5190896,5796182,5932762,8572433,8723698,8892697,9711001,9789264,4549188,6100831,6170064,6260799,6263653,6449936,6530871,6538978,7777651,8059269,8319918,8787049,8901150,9263153,9453207,9514738,9696700,9791062,5752018,6421452,7439134,7878923,9354763,9369285,9514396,9582506,9889949,9890216,4094311,4158495,4158496,6098128,5585661,3872564,6442149,5891604,6164746,6199593,6583474,6519684,9018490,9809006,4496897,5041324,5829430,6198319,6253504,6555763,7242914,7931055,8024125,8797814,8058559,8673347,8892695,8994420,9616219,9714970,9722004,9809439,9818918,6523177,8134147,9002915,9711422,9892713,9901719,9954210,9978435,5800810,6243518,6416114,6222251,6411974,6512456,5791953,6545606,9914780,5805540,6238986,6463838,6547680,9767049,9809437,9810885,9890855,6673493,9902036,4335521,6379871,6503799,6546077,8018765,9907556,9958433,9905855,9916179,9946741,9957877,5563344,6271838,6450815,7641128,7762567,7780592,8684810,8685786,8685787,8685788\n)\nGROUP BY opp.id;\n\nSELECT COUNT(dr.id)\n FROM deal_risks dr\n JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id\n WHERE dr.opportunity_id = 5563344\n# AND gdrt.group_id = usr.group_id\n\n\n\nEXPLAIN SELECT\n opp.id as opp_id, opp.uuid, opp.name,\n\ncfd.value,\ncfv.sequence,\ncfv.value,\n# MAX(cfd.value) AS max_cfd_value,\nusr.name AS owner_name,\nopp.value, opp.currency_code, opp.close_date, opp.remotely_created_at, opp.is_closed, opp.is_won,\nusr.uuid as owner_uuid,\nusr.photo_path as owner_photo,\nusr.id AS owner_id,\njt.name as owner_job,\nopp.stage_id, opp.stage_updated_at,\nacc.name AS acc_name, opp.stage_updated_at, acc.crm_provider_id AS acc_provider_id, opp.crm_provider_id AS opp_provider_id,\nrt.business_process_id AS pipeline_id\nFROM opportunities opp\n\nLEFT JOIN record_types rt ON opp.record_type_id = rt.id\nLEFT JOIN users usr ON opp.user_id = usr.id\nLEFT JOIN accounts acc ON opp.account_id = acc.id\nLEFT JOIN job_titles jt ON usr.job_title_id = jt.id\n\nLEFT JOIN crm_field_data cfd ON cfd.id = (SELECT sub_cfd.id\n FROM crm_field_data sub_cfd\n WHERE sub_cfd.object_id = opp.id\n AND sub_cfd.crm_field_id = 66810\n ORDER BY sub_cfd.updated_at DESC\n LIMIT 1)\n\nLEFT JOIN crm_field_values cfv ON cfv.crm_field_id = 66810 AND cfv.value = cfd.value\n\nWHERE opp.user_id IS NOT NULL\nAND opp.deleted_at IS NULL\nAND opp.is_closed = 0\n# AND opp.is_closed = 1\n# AND opp.is_won = 0\nAND opp.close_date >= '2024-01-01 00:00:00'\nAND opp.close_date <= '2024-12-31 23:59:59'\nAND usr.team_id = 1\n\n# and opp.id = 4823179\n\n# GROUP BY opp.id\nORDER BY\n cfv.sequence DESC,\n# opp.name\n# owner_name\n cfd.value\n# CAST(cfd.value AS UNSIGNED)\n# CAST(MAX(cfd.value) AS UNSIGNED)\n# (SELECT COUNT(dr.id)\n# FROM deal_risks dr\n# JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id\n# WHERE dr.opportunity_id = opp.id\n# AND dr.is_active = 1 AND gdrt.is_enabled = 1)\nDESC\n# LIMIT 75, 25\n;\n\n\n\nSELECT * FROM crm_field_values WHERE crm_field_id = 66810;\n\nSELECT f.id, f.crm_provider_id AS field_name, f.label, fd.object_id AS dealId, fd.value, fd.updated_at, fd.id, fd.created_at\nFROM crm_fields f\nINNER JOIN crm_field_data fd ON fd.crm_field_id = f.id\n WHERE (f.crm_configuration_id = 1)\n AND (f.object_type = 'opportunity')\n# AND (fd.object_id IN (4158331,4158483,4158495,4158496,6069574,6263970,6171615,6540943,6545606,5829430,6198319,6263653,6548381,7242914,8797814,7228149,7439134,7878923,8134147,9002915,9118219,9165534,9354763,9369285,9446720))\n AND (fd.object_id IN (4158460))\n AND (f.crm_provider_id IN ('ForecastCategoryName'))\n ORDER BY fd.object_id ASC, fd.updated_at DESC;\n\nselect * from crm_layouts where crm_configuration_id = 1;\nselect cf.* from crm_fields cf\njoin crm_layout_entities cle on cf.id = cle.crm_field_id\nwhere crm_layout_id = 1493;\n\nSELECT * FROM opportunities WHERE id = 4158460;\nSELECT * FROM crm_field_data WHERE object_id = 4158460;\n\nselect * from users where team_id = 1;\nSELECT * FROM users WHERE id = 7160;\nselect * from role_user where user_id = 3248;\n\nselect * from crm_field_values where crm_field_id = 66824;\n\nSELECT * FROM users WHERE id = 23470;\nselect * from crm_configurations;\n\n# ******************************************\nselect * from teams where id = 1038; # 23521, 966\nselect * from users where team_id = 1038;\nselect * from crm_configurations where id = 966;\nSELECT * FROM activities WHERE uuid_to_bin('e8dc7c34-31f6-4430-bd81-2d9d8f00dd07') = uuid; # 54965762\nSELECT * FROM activities WHERE uuid_to_bin('4b5727c0-69d1-428f-b8d9-b649055166e2') = uuid; # 54965764\nSELECT * FROM participants WHERE activity_id = 54965764;\n\nSELECT id, uuid, title, recording_state FROM activities WHERE uuid_to_bin('355f105d-5606-4379-b0c5-d91daf59f4ce') = uuid; # 54964075\nSELECT * FROM participants WHERE activity_id = 54964075;\nselect f.id, slug, title, tf.team_id from team_features tf JOIN features f on tf.feature_id = f.id\n where tf.team_id = 1038;\n\n\n# ****************************************** PD *************************\nselect * from teams where id = 1029;\nSELECT * FROM crm_configurations WHERE id = 957;\nSELECT * FROM activities WHERE uuid_to_bin('581a33cb-4343-44bd-ac0c-4a5cee71c5ec') = uuid; # 54963423\nSELECT * FROM activities WHERE uuid_to_bin('07238011-25fa-418e-838b-fb21e82b9ea2') = uuid; # 54963433\n\nSELECT * FROM activities WHERE uuid_to_bin('8b6bb2f7-e7a7-4aec-8806-fbfea7093ccd') = uuid; # 54963421\n\n# ****************************************** Close *************************\nselect * from teams where id = 1031;\nSELECT * FROM crm_configurations WHERE id = 959;\nSELECT * FROM activities WHERE uuid_to_bin('59c517e0-96c9-4dad-bfeb-b7bef72f8725') = uuid; # 54963517\n\n\nSELECT * FROM activities WHERE uuid_to_bin('07238011-25fa-418e-838b-fb21e82b9ea2') = uuid; # 54963433\n\nSELECT * FROM activities WHERE uuid_to_bin('d68311e3-ac34-49bd-bf04-88323a7e5352') = uuid; # 54966009\n\n# ****************************************** SF *************************\nSELECT * FROM activities WHERE uuid_to_bin('2bd4cfa3-4eb5-4c77-84a7-9ed46a21c988') = uuid;\n\nselect * from roles;\nselect * from permissions;\nselect * from permission_role where permission_id = 136;\n\nselect * from migrations order by id desc;\n\nselect * from teams where id IN (1, 1037);\nselect * from crm_layouts where crm_configuration_id = 1;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1493;\nSELECT * FROM crm_fields WHERE id IN (1652,1661,66799,66814,66821,66836,66843,66846,66864,84752,182306,323580,380378);\n\nselect * from features;\nselect * from team_features where feature_id = 33;\nselect * from opportunities;\n\nselect * from teams;\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 = 1052 and sa.provider = 'hubspot';\n\nSELECT * FROM accounts where id = 11512582;\nselect * from activities where account_id = 11512582;","depth":4,"on_screen":true,"value":"SELECT\n# DISTINCT\nopp.id as opp_id, opp.uuid, opp.name,\n# COUNT(dr.id) AS deal_risk_count,\n\n# dr.id,\n# cfd.value,\nusr.name AS owner_name,\nopp.value, opp.currency_code, opp.close_date, opp.remotely_created_at, opp.is_closed, opp.is_won,\nusr.uuid as owner_uuid,\nusr.photo_path as owner_photo,\nusr.id AS owner_id,\njt.name as owner_job,\nopp.stage_id, opp.stage_updated_at,\nacc.name AS acc_name, opp.stage_updated_at, acc.crm_provider_id AS acc_provider_id, opp.crm_provider_id AS opp_provider_id,\nrt.business_process_id AS pipeline_id\nFROM opportunities opp\nLEFT JOIN record_types rt ON opp.record_type_id = rt.id\nLEFT JOIN users usr ON opp.user_id = usr.id\nLEFT JOIN accounts acc ON opp.account_id = acc.id\nLEFT JOIN job_titles jt ON usr.job_title_id = jt.id\n\n# LEFT JOIN group_deal_risk_types gdrt ON gdrt.group_id = usr.group_id\n# LEFT JOIN deal_risks dr ON dr.opportunity_id = opp.id AND dr.group_deal_risk_type_id = gdrt.id\n\nLEFT JOIN crm_field_data cfd ON (cfd.object_id = opp.id and cfd.crm_field_id = 66814)\n\nWHERE opp.user_id IS NOT NULL\nAND opp.deleted_at IS NULL\nAND opp.is_closed = 1\nAND opp.is_won = 0\nAND opp.close_date >= '2024-01-01 00:00:00'\nAND opp.close_date <= '2024-12-31 23:59:59'\nAND usr.team_id = 1\n\n# and opp.id = 4823179\n\nGROUP BY opp.id, cfd.value\nORDER BY\n# cfd.value\n CAST(cfd.value AS UNSIGNED)\n# owner_name\n# (SELECT COUNT(dr.id)\n# FROM deal_risks dr\n# JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id\n# WHERE dr.opportunity_id = opp.id\n# AND dr.is_active = 1\n# AND gdrt.is_enabled = 1)\nDESC\nLIMIT 25\n# OFFSET 0\n;\n\nselect * from crm_fields where crm_configuration_id = 1 and object_type = 'opportunity';\nselect * from crm_layout_entities where crm_layout_id = 1493;\n\nSELECT * FROM opportunities WHERE id = 4584045;\nSELECT * FROM crm_field_data WHERE object_id = 4584045;\n\nSELECT * FROM opportunities where team_id = 1 and crm_provider_id = '0061K00000lfb9IQAQ'\n\nSELECT\n opp.id as opportunity_id,\n opp.name,\n COUNT(dr.id) as risk_count\nFROM opportunities opp\nLEFT JOIN deal_risks dr ON dr.opportunity_id = opp.id\nWHERE opp.id IN (\n 6069574,8900938,9507638,9524799,9660490,9662824,9705675,9749758,4158460,4391812,6450439,4448422,5118945,5590675,4584045,7228149,9002408,9165534,9446720,9641778,9665149,9703344,9709280,5747948,4158491,6182565,6263970,5798120,5111315,4536978,6062352,6548383,6072095,6548225,4480986,5011422,6548381,8760540,8917554,9509986,9514392,9569009,9569011,9578490,9713604,5784397,7276612,7288405,8994421,9118219,9608148,9818911,4510535,6479693,5958049,6271674,6550448,4158331,4158483,6126571,6171615,6540943,4897466,5190896,5796182,5932762,8572433,8723698,8892697,9711001,9789264,4549188,6100831,6170064,6260799,6263653,6449936,6530871,6538978,7777651,8059269,8319918,8787049,8901150,9263153,9453207,9514738,9696700,9791062,5752018,6421452,7439134,7878923,9354763,9369285,9514396,9582506,9889949,9890216,4094311,4158495,4158496,6098128,5585661,3872564,6442149,5891604,6164746,6199593,6583474,6519684,9018490,9809006,4496897,5041324,5829430,6198319,6253504,6555763,7242914,7931055,8024125,8797814,8058559,8673347,8892695,8994420,9616219,9714970,9722004,9809439,9818918,6523177,8134147,9002915,9711422,9892713,9901719,9954210,9978435,5800810,6243518,6416114,6222251,6411974,6512456,5791953,6545606,9914780,5805540,6238986,6463838,6547680,9767049,9809437,9810885,9890855,6673493,9902036,4335521,6379871,6503799,6546077,8018765,9907556,9958433,9905855,9916179,9946741,9957877,5563344,6271838,6450815,7641128,7762567,7780592,8684810,8685786,8685787,8685788\n)\nGROUP BY opp.id;\n\nSELECT COUNT(dr.id)\n FROM deal_risks dr\n JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id\n WHERE dr.opportunity_id = 5563344\n# AND gdrt.group_id = usr.group_id\n\n\n\nEXPLAIN SELECT\n opp.id as opp_id, opp.uuid, opp.name,\n\ncfd.value,\ncfv.sequence,\ncfv.value,\n# MAX(cfd.value) AS max_cfd_value,\nusr.name AS owner_name,\nopp.value, opp.currency_code, opp.close_date, opp.remotely_created_at, opp.is_closed, opp.is_won,\nusr.uuid as owner_uuid,\nusr.photo_path as owner_photo,\nusr.id AS owner_id,\njt.name as owner_job,\nopp.stage_id, opp.stage_updated_at,\nacc.name AS acc_name, opp.stage_updated_at, acc.crm_provider_id AS acc_provider_id, opp.crm_provider_id AS opp_provider_id,\nrt.business_process_id AS pipeline_id\nFROM opportunities opp\n\nLEFT JOIN record_types rt ON opp.record_type_id = rt.id\nLEFT JOIN users usr ON opp.user_id = usr.id\nLEFT JOIN accounts acc ON opp.account_id = acc.id\nLEFT JOIN job_titles jt ON usr.job_title_id = jt.id\n\nLEFT JOIN crm_field_data cfd ON cfd.id = (SELECT sub_cfd.id\n FROM crm_field_data sub_cfd\n WHERE sub_cfd.object_id = opp.id\n AND sub_cfd.crm_field_id = 66810\n ORDER BY sub_cfd.updated_at DESC\n LIMIT 1)\n\nLEFT JOIN crm_field_values cfv ON cfv.crm_field_id = 66810 AND cfv.value = cfd.value\n\nWHERE opp.user_id IS NOT NULL\nAND opp.deleted_at IS NULL\nAND opp.is_closed = 0\n# AND opp.is_closed = 1\n# AND opp.is_won = 0\nAND opp.close_date >= '2024-01-01 00:00:00'\nAND opp.close_date <= '2024-12-31 23:59:59'\nAND usr.team_id = 1\n\n# and opp.id = 4823179\n\n# GROUP BY opp.id\nORDER BY\n cfv.sequence DESC,\n# opp.name\n# owner_name\n cfd.value\n# CAST(cfd.value AS UNSIGNED)\n# CAST(MAX(cfd.value) AS UNSIGNED)\n# (SELECT COUNT(dr.id)\n# FROM deal_risks dr\n# JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id\n# WHERE dr.opportunity_id = opp.id\n# AND dr.is_active = 1 AND gdrt.is_enabled = 1)\nDESC\n# LIMIT 75, 25\n;\n\n\n\nSELECT * FROM crm_field_values WHERE crm_field_id = 66810;\n\nSELECT f.id, f.crm_provider_id AS field_name, f.label, fd.object_id AS dealId, fd.value, fd.updated_at, fd.id, fd.created_at\nFROM crm_fields f\nINNER JOIN crm_field_data fd ON fd.crm_field_id = f.id\n WHERE (f.crm_configuration_id = 1)\n AND (f.object_type = 'opportunity')\n# AND (fd.object_id IN (4158331,4158483,4158495,4158496,6069574,6263970,6171615,6540943,6545606,5829430,6198319,6263653,6548381,7242914,8797814,7228149,7439134,7878923,8134147,9002915,9118219,9165534,9354763,9369285,9446720))\n AND (fd.object_id IN (4158460))\n AND (f.crm_provider_id IN ('ForecastCategoryName'))\n ORDER BY fd.object_id ASC, fd.updated_at DESC;\n\nselect * from crm_layouts where crm_configuration_id = 1;\nselect cf.* from crm_fields cf\njoin crm_layout_entities cle on cf.id = cle.crm_field_id\nwhere crm_layout_id = 1493;\n\nSELECT * FROM opportunities WHERE id = 4158460;\nSELECT * FROM crm_field_data WHERE object_id = 4158460;\n\nselect * from users where team_id = 1;\nSELECT * FROM users WHERE id = 7160;\nselect * from role_user where user_id = 3248;\n\nselect * from crm_field_values where crm_field_id = 66824;\n\nSELECT * FROM users WHERE id = 23470;\nselect * from crm_configurations;\n\n# ******************************************\nselect * from teams where id = 1038; # 23521, 966\nselect * from users where team_id = 1038;\nselect * from crm_configurations where id = 966;\nSELECT * FROM activities WHERE uuid_to_bin('e8dc7c34-31f6-4430-bd81-2d9d8f00dd07') = uuid; # 54965762\nSELECT * FROM activities WHERE uuid_to_bin('4b5727c0-69d1-428f-b8d9-b649055166e2') = uuid; # 54965764\nSELECT * FROM participants WHERE activity_id = 54965764;\n\nSELECT id, uuid, title, recording_state FROM activities WHERE uuid_to_bin('355f105d-5606-4379-b0c5-d91daf59f4ce') = uuid; # 54964075\nSELECT * FROM participants WHERE activity_id = 54964075;\nselect f.id, slug, title, tf.team_id from team_features tf JOIN features f on tf.feature_id = f.id\n where tf.team_id = 1038;\n\n\n# ****************************************** PD *************************\nselect * from teams where id = 1029;\nSELECT * FROM crm_configurations WHERE id = 957;\nSELECT * FROM activities WHERE uuid_to_bin('581a33cb-4343-44bd-ac0c-4a5cee71c5ec') = uuid; # 54963423\nSELECT * FROM activities WHERE uuid_to_bin('07238011-25fa-418e-838b-fb21e82b9ea2') = uuid; # 54963433\n\nSELECT * FROM activities WHERE uuid_to_bin('8b6bb2f7-e7a7-4aec-8806-fbfea7093ccd') = uuid; # 54963421\n\n# ****************************************** Close *************************\nselect * from teams where id = 1031;\nSELECT * FROM crm_configurations WHERE id = 959;\nSELECT * FROM activities WHERE uuid_to_bin('59c517e0-96c9-4dad-bfeb-b7bef72f8725') = uuid; # 54963517\n\n\nSELECT * FROM activities WHERE uuid_to_bin('07238011-25fa-418e-838b-fb21e82b9ea2') = uuid; # 54963433\n\nSELECT * FROM activities WHERE uuid_to_bin('d68311e3-ac34-49bd-bf04-88323a7e5352') = uuid; # 54966009\n\n# ****************************************** SF *************************\nSELECT * FROM activities WHERE uuid_to_bin('2bd4cfa3-4eb5-4c77-84a7-9ed46a21c988') = uuid;\n\nselect * from roles;\nselect * from permissions;\nselect * from permission_role where permission_id = 136;\n\nselect * from migrations order by id desc;\n\nselect * from teams where id IN (1, 1037);\nselect * from crm_layouts where crm_configuration_id = 1;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1493;\nSELECT * FROM crm_fields WHERE id IN (1652,1661,66799,66814,66821,66836,66843,66846,66864,84752,182306,323580,380378);\n\nselect * from features;\nselect * from team_features where feature_id = 33;\nselect * from opportunities;\n\nselect * from teams;\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 = 1052 and sa.provider = 'hubspot';\n\nSELECT * FROM accounts where id = 11512582;\nselect * from activities where account_id = 11512582;","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Project","depth":3,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Project","depth":3,"bounds":{"left":0.28224733,"top":1.0,"width":0.024268618,"height":-0.04788506},"on_screen":true,"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.32114363,"top":1.0,"width":0.008643617,"height":-0.05027938},"on_screen":true,"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.33211437,"top":1.0,"width":0.008643617,"height":-0.05027938},"on_screen":true,"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.34075797,"top":1.0,"width":0.008643617,"height":-0.05027938},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Options","depth":4,"bounds":{"left":0.3494016,"top":1.0,"width":0.008643617,"height":-0.05027938},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.35804522,"top":1.0,"width":0.008643617,"height":-0.05027938},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"app ~/jiminny/app","depth":6,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":".circleci","depth":7}]...
|
4781501936229251464
|
6398098426737865309
|
click
|
accessibility
|
NULL
|
Project: faVsco.js, menu
#12066 on JY-20725-handle Project: faVsco.js, menu
#12066 on JY-20725-handle-HS-search-rate-limit, menu
Start Listening for PHP Debug Connections
HandleHubspotRateLimitTest
Run 'HandleHubspotRateLimitTest'
Debug 'HandleHubspotRateLimitTest'
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
declare(strict_types=1);
namespace Jiminny\Services\Crm\IntegrationApp\Jobs;
use Jiminny\Contracts\Crm\Providers;
use Jiminny\Contracts\Repositories\TeamRepository;
use Jiminny\Contracts\Services\Crm\Provider\IntegrationAppInterface;
use Jiminny\Exceptions\ApplicationException;
use Jiminny\Exceptions\CrmException;
use Jiminny\Exceptions\RuntimeException;
use Jiminny\Models\Crm\Configuration;
use Jiminny\Models\Team;
use Jiminny\Services\Crm\ProviderRegistry;
trait IntegrationAppServiceTrait
{
/**
* @throws ApplicationException
*/
private function getTeam(TeamRepository $teamRepository): Team
{
$team = $teamRepository->find($this->teamId);
if (! $team instanceof Team) {
throw new ApplicationException("Team not found: {$this->teamId}");
}
return $team;
}
/**
* @throws CrmException
*/
private function getPreparedCrmService(Team $team, ProviderRegistry $providerRegistry): IntegrationAppInterface
{
$configuration = $team->getCrmConfiguration();
if (! Providers::isIntegrationAppProvider($configuration->getProviderName())) {
// This is unlikely to happen, but better safe than sorry
throw new CrmException('Trying to bootstrap a non IntegrationApp team');
}
/** @var IntegrationAppInterface $crmService */
$crmService = $providerRegistry->get(Configuration::PROVIDER_INTEGRATION_APP);
$owner = $team->getOwner();
if ($owner === null) {
throw new RuntimeException('Owner not found');
}
$crmService->setUser($owner);
return $crmService;
}
}
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
8
1
3
4
Previous Highlighted Error
Next Highlighted Error
SELECT
# DISTINCT
opp.id as opp_id, opp.uuid, opp.name,
# COUNT(dr.id) AS deal_risk_count,
# dr.id,
# cfd.value,
usr.name AS owner_name,
opp.value, opp.currency_code, opp.close_date, opp.remotely_created_at, opp.is_closed, opp.is_won,
usr.uuid as owner_uuid,
usr.photo_path as owner_photo,
usr.id AS owner_id,
jt.name as owner_job,
opp.stage_id, opp.stage_updated_at,
acc.name AS acc_name, opp.stage_updated_at, acc.crm_provider_id AS acc_provider_id, opp.crm_provider_id AS opp_provider_id,
rt.business_process_id AS pipeline_id
FROM opportunities opp
LEFT JOIN record_types rt ON opp.record_type_id = rt.id
LEFT JOIN users usr ON opp.user_id = usr.id
LEFT JOIN accounts acc ON opp.account_id = acc.id
LEFT JOIN job_titles jt ON usr.job_title_id = jt.id
# LEFT JOIN group_deal_risk_types gdrt ON gdrt.group_id = usr.group_id
# LEFT JOIN deal_risks dr ON dr.opportunity_id = opp.id AND dr.group_deal_risk_type_id = gdrt.id
LEFT JOIN crm_field_data cfd ON (cfd.object_id = opp.id and cfd.crm_field_id = 66814)
WHERE opp.user_id IS NOT NULL
AND opp.deleted_at IS NULL
AND opp.is_closed = 1
AND opp.is_won = 0
AND opp.close_date >= '2024-01-01 00:00:00'
AND opp.close_date <= '2024-12-31 23:59:59'
AND usr.team_id = 1
# and opp.id = 4823179
GROUP BY opp.id, cfd.value
ORDER BY
# cfd.value
CAST(cfd.value AS UNSIGNED)
# owner_name
# (SELECT COUNT(dr.id)
# FROM deal_risks dr
# JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id
# WHERE dr.opportunity_id = opp.id
# AND dr.is_active = 1
# AND gdrt.is_enabled = 1)
DESC
LIMIT 25
# OFFSET 0
;
select * from crm_fields where crm_configuration_id = 1 and object_type = 'opportunity';
select * from crm_layout_entities where crm_layout_id = 1493;
SELECT * FROM opportunities WHERE id = 4584045;
SELECT * FROM crm_field_data WHERE object_id = 4584045;
SELECT * FROM opportunities where team_id = 1 and crm_provider_id = '0061K00000lfb9IQAQ'
SELECT
opp.id as opportunity_id,
opp.name,
COUNT(dr.id) as risk_count
FROM opportunities opp
LEFT JOIN deal_risks dr ON dr.opportunity_id = opp.id
WHERE opp.id IN (
6069574,8900938,9507638,9524799,9660490,9662824,9705675,9749758,4158460,4391812,6450439,4448422,5118945,5590675,4584045,7228149,9002408,9165534,9446720,9641778,9665149,9703344,9709280,5747948,4158491,6182565,6263970,5798120,5111315,4536978,6062352,6548383,6072095,6548225,4480986,5011422,6548381,8760540,8917554,9509986,9514392,9569009,9569011,9578490,9713604,5784397,7276612,7288405,8994421,9118219,9608148,9818911,4510535,6479693,5958049,6271674,6550448,4158331,4158483,6126571,6171615,6540943,4897466,5190896,5796182,5932762,8572433,8723698,8892697,9711001,9789264,4549188,6100831,6170064,6260799,6263653,6449936,6530871,6538978,7777651,8059269,8319918,8787049,8901150,9263153,9453207,9514738,9696700,9791062,5752018,6421452,7439134,7878923,9354763,9369285,9514396,9582506,9889949,9890216,4094311,4158495,4158496,6098128,5585661,3872564,6442149,5891604,6164746,6199593,6583474,6519684,9018490,9809006,4496897,5041324,5829430,6198319,6253504,6555763,7242914,7931055,8024125,8797814,8058559,8673347,8892695,8994420,9616219,9714970,9722004,9809439,9818918,6523177,8134147,9002915,9711422,9892713,9901719,9954210,9978435,5800810,6243518,6416114,6222251,6411974,6512456,5791953,6545606,9914780,5805540,6238986,6463838,6547680,9767049,9809437,9810885,9890855,6673493,9902036,4335521,6379871,6503799,6546077,8018765,9907556,9958433,9905855,9916179,9946741,9957877,5563344,6271838,6450815,7641128,7762567,7780592,8684810,8685786,8685787,8685788
)
GROUP BY opp.id;
SELECT COUNT(dr.id)
FROM deal_risks dr
JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id
WHERE dr.opportunity_id = 5563344
# AND gdrt.group_id = usr.group_id
EXPLAIN SELECT
opp.id as opp_id, opp.uuid, opp.name,
cfd.value,
cfv.sequence,
cfv.value,
# MAX(cfd.value) AS max_cfd_value,
usr.name AS owner_name,
opp.value, opp.currency_code, opp.close_date, opp.remotely_created_at, opp.is_closed, opp.is_won,
usr.uuid as owner_uuid,
usr.photo_path as owner_photo,
usr.id AS owner_id,
jt.name as owner_job,
opp.stage_id, opp.stage_updated_at,
acc.name AS acc_name, opp.stage_updated_at, acc.crm_provider_id AS acc_provider_id, opp.crm_provider_id AS opp_provider_id,
rt.business_process_id AS pipeline_id
FROM opportunities opp
LEFT JOIN record_types rt ON opp.record_type_id = rt.id
LEFT JOIN users usr ON opp.user_id = usr.id
LEFT JOIN accounts acc ON opp.account_id = acc.id
LEFT JOIN job_titles jt ON usr.job_title_id = jt.id
LEFT JOIN crm_field_data cfd ON cfd.id = (SELECT sub_cfd.id
FROM crm_field_data sub_cfd
WHERE sub_cfd.object_id = opp.id
AND sub_cfd.crm_field_id = 66810
ORDER BY sub_cfd.updated_at DESC
LIMIT 1)
LEFT JOIN crm_field_values cfv ON cfv.crm_field_id = 66810 AND cfv.value = cfd.value
WHERE opp.user_id IS NOT NULL
AND opp.deleted_at IS NULL
AND opp.is_closed = 0
# AND opp.is_closed = 1
# AND opp.is_won = 0
AND opp.close_date >= '2024-01-01 00:00:00'
AND opp.close_date <= '2024-12-31 23:59:59'
AND usr.team_id = 1
# and opp.id = 4823179
# GROUP BY opp.id
ORDER BY
cfv.sequence DESC,
# opp.name
# owner_name
cfd.value
# CAST(cfd.value AS UNSIGNED)
# CAST(MAX(cfd.value) AS UNSIGNED)
# (SELECT COUNT(dr.id)
# FROM deal_risks dr
# JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id
# WHERE dr.opportunity_id = opp.id
# AND dr.is_active = 1 AND gdrt.is_enabled = 1)
DESC
# LIMIT 75, 25
;
SELECT * FROM crm_field_values WHERE crm_field_id = 66810;
SELECT f.id, f.crm_provider_id AS field_name, f.label, fd.object_id AS dealId, fd.value, fd.updated_at, fd.id, fd.created_at
FROM crm_fields f
INNER JOIN crm_field_data fd ON fd.crm_field_id = f.id
WHERE (f.crm_configuration_id = 1)
AND (f.object_type = 'opportunity')
# AND (fd.object_id IN (4158331,4158483,4158495,4158496,6069574,6263970,6171615,6540943,6545606,5829430,6198319,6263653,6548381,7242914,8797814,7228149,7439134,7878923,8134147,9002915,9118219,9165534,9354763,9369285,9446720))
AND (fd.object_id IN (4158460))
AND (f.crm_provider_id IN ('ForecastCategoryName'))
ORDER BY fd.object_id ASC, fd.updated_at DESC;
select * from crm_layouts where crm_configuration_id = 1;
select cf.* from crm_fields cf
join crm_layout_entities cle on cf.id = cle.crm_field_id
where crm_layout_id = 1493;
SELECT * FROM opportunities WHERE id = 4158460;
SELECT * FROM crm_field_data WHERE object_id = 4158460;
select * from users where team_id = 1;
SELECT * FROM users WHERE id = 7160;
select * from role_user where user_id = 3248;
select * from crm_field_values where crm_field_id = 66824;
SELECT * FROM users WHERE id = 23470;
select * from crm_configurations;
# [PASSWORD_DOTS]
select * from teams where id = 1038; # 23521, 966
select * from users where team_id = 1038;
select * from crm_configurations where id = 966;
SELECT * FROM activities WHERE uuid_to_bin('e8dc7c34-31f6-4430-bd81-2d9d8f00dd07') = uuid; # 54965762
SELECT * FROM activities WHERE uuid_to_bin('4b5727c0-69d1-428f-b8d9-b649055166e2') = uuid; # 54965764
SELECT * FROM participants WHERE activity_id = 54965764;
SELECT id, uuid, title, recording_state FROM activities WHERE uuid_to_bin('355f105d-5606-4379-b0c5-d91daf59f4ce') = uuid; # 54964075
SELECT * FROM participants WHERE activity_id = 54964075;
select f.id, slug, title, tf.team_id from team_features tf JOIN features f on tf.feature_id = f.id
where tf.team_id = 1038;
# [PASSWORD_DOTS] PD [PASSWORD_DOTS]
select * from teams where id = 1029;
SELECT * FROM crm_configurations WHERE id = 957;
SELECT * FROM activities WHERE uuid_to_bin('581a33cb-4343-44bd-ac0c-4a5cee71c5ec') = uuid; # 54963423
SELECT * FROM activities WHERE uuid_to_bin('07238011-25fa-418e-838b-fb21e82b9ea2') = uuid; # 54963433
SELECT * FROM activities WHERE uuid_to_bin('8b6bb2f7-e7a7-4aec-8806-fbfea7093ccd') = uuid; # 54963421
# [PASSWORD_DOTS] Close [PASSWORD_DOTS]
select * from teams where id = 1031;
SELECT * FROM crm_configurations WHERE id = 959;
SELECT * FROM activities WHERE uuid_to_bin('59c517e0-96c9-4dad-bfeb-b7bef72f8725') = uuid; # 54963517
SELECT * FROM activities WHERE uuid_to_bin('07238011-25fa-418e-838b-fb21e82b9ea2') = uuid; # 54963433
SELECT * FROM activities WHERE uuid_to_bin('d68311e3-ac34-49bd-bf04-88323a7e5352') = uuid; # 54966009
# [PASSWORD_DOTS] SF [PASSWORD_DOTS]
SELECT * FROM activities WHERE uuid_to_bin('2bd4cfa3-4eb5-4c77-84a7-9ed46a21c988') = uuid;
select * from roles;
select * from permissions;
select * from permission_role where permission_id = 136;
select * from migrations order by id desc;
select * from teams where id IN (1, 1037);
select * from crm_layouts where crm_configuration_id = 1;
SELECT * FROM crm_layout_entities WHERE crm_layout_id = 1493;
SELECT * FROM crm_fields WHERE id IN (1652,1661,66799,66814,66821,66836,66843,66846,66864,84752,182306,323580,380378);
select * from features;
select * from team_features where feature_id = 33;
select * from opportunities;
select * from teams;
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 = 1052 and sa.provider = 'hubspot';
SELECT * FROM accounts where id = 11512582;
select * from activities where account_id = 11512582;
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide
app ~/jiminny/app
.circleci...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
45471
|
1627
|
15
|
2026-05-14T14:39:04.081410+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-14/1778 /Users/lukas/.screenpipe/data/data/2026-05-14/1778769544081_m1.jpg...
|
PhpStorm
|
faVsco.js – IntegrationAppServiceTrait.php
|
1
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
#12066 on JY-20725-handle Project: faVsco.js, menu
#12066 on JY-20725-handle-HS-search-rate-limit, menu
Start Listening for PHP Debug Connections
HandleHubspotRateLimitTest
Run 'HandleHubspotRateLimitTest'
Debug 'HandleHubspotRateLimitTest'
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
declare(strict_types=1);
namespace Jiminny\Services\Crm\IntegrationApp\Jobs;
use Jiminny\Contracts\Crm\Providers;
use Jiminny\Contracts\Repositories\TeamRepository;
use Jiminny\Contracts\Services\Crm\Provider\IntegrationAppInterface;
use Jiminny\Exceptions\ApplicationException;
use Jiminny\Exceptions\CrmException;
use Jiminny\Exceptions\RuntimeException;
use Jiminny\Models\Crm\Configuration;
use Jiminny\Models\Team;
use Jiminny\Services\Crm\ProviderRegistry;
trait IntegrationAppServiceTrait
{
/**
* @throws ApplicationException
*/
private function getTeam(TeamRepository $teamRepository): Team
{
$team = $teamRepository->find($this->teamId);
if (! $team instanceof Team) {
throw new ApplicationException("Team not found: {$this->teamId}");
}
return $team;
}
/**
* @throws CrmException
*/
private function getPreparedCrmService(Team $team, ProviderRegistry $providerRegistry): IntegrationAppInterface
{
$configuration = $team->getCrmConfiguration();
if (! Providers::isIntegrationAppProvider($configuration->getProviderName())) {
// This is unlikely to happen, but better safe than sorry
throw new CrmException('Trying to bootstrap a non IntegrationApp team');
}
/** @var IntegrationAppInterface $crmService */
$crmService = $providerRegistry->get(Configuration::PROVIDER_INTEGRATION_APP);
$owner = $team->getOwner();
if ($owner === null) {
throw new RuntimeException('Owner not found');
}
$crmService->setUser($owner);
return $crmService;
}
}
Execute
Explain Plan
Browse Query History
View Parameters
Open Query Execution Settings…
In-Editor Results
Tx: Auto
Cancel Running Statements
Playground
jiminny...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"bounds":{"left":0.054166667,"top":0.027777778,"width":0.08055556,"height":0.035555556},"on_screen":true,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"#12066 on JY-20725-handle-HS-search-rate-limit, menu","depth":5,"bounds":{"left":0.13472222,"top":0.027777778,"width":0.25555557,"height":0.035555556},"on_screen":true,"help_text":"Pull request #12066 exists for current branch JY-20725-handle-HS-search-rate-limit, but local branch is out of sync with remote","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"bounds":{"left":0.6326389,"top":0.027777778,"width":0.023611112,"height":0.035555556},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"HandleHubspotRateLimitTest","depth":6,"bounds":{"left":0.6645833,"top":0.027777778,"width":0.15902779,"height":0.035555556},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run 'HandleHubspotRateLimitTest'","depth":6,"bounds":{"left":0.82361114,"top":0.027777778,"width":0.023611112,"height":0.035555556},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'HandleHubspotRateLimitTest'","depth":6,"bounds":{"left":0.8472222,"top":0.027777778,"width":0.023611112,"height":0.035555556},"on_screen":true,"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.87083334,"top":0.027777778,"width":0.023611112,"height":0.035555556},"on_screen":true,"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.9291667,"top":0.027777778,"width":0.023611112,"height":0.035555556},"on_screen":true,"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.9527778,"top":0.027777778,"width":0.023611112,"height":0.035555556},"on_screen":true,"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.9763889,"top":0.027777778,"width":0.023611112,"height":0.035555556},"on_screen":true,"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},"on_screen":false,"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},"on_screen":false,"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},"on_screen":false,"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},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"2","depth":4,"bounds":{"left":0.80138886,"top":0.3122222,"width":0.016666668,"height":0.02111111},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.8215278,"top":0.31,"width":0.015277778,"height":0.025555555},"on_screen":true,"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.8368056,"top":0.31,"width":0.014583333,"height":0.025555555},"on_screen":true,"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\\IntegrationApp\\Jobs;\n\nuse Jiminny\\Contracts\\Crm\\Providers;\nuse Jiminny\\Contracts\\Repositories\\TeamRepository;\nuse Jiminny\\Contracts\\Services\\Crm\\Provider\\IntegrationAppInterface;\nuse Jiminny\\Exceptions\\ApplicationException;\nuse Jiminny\\Exceptions\\CrmException;\nuse Jiminny\\Exceptions\\RuntimeException;\nuse Jiminny\\Models\\Crm\\Configuration;\nuse Jiminny\\Models\\Team;\nuse Jiminny\\Services\\Crm\\ProviderRegistry;\n\ntrait IntegrationAppServiceTrait\n{\n /**\n * @throws ApplicationException\n */\n private function getTeam(TeamRepository $teamRepository): Team\n {\n $team = $teamRepository->find($this->teamId);\n if (! $team instanceof Team) {\n throw new ApplicationException(\"Team not found: {$this->teamId}\");\n }\n\n return $team;\n }\n\n /**\n * @throws CrmException\n */\n private function getPreparedCrmService(Team $team, ProviderRegistry $providerRegistry): IntegrationAppInterface\n {\n $configuration = $team->getCrmConfiguration();\n if (! Providers::isIntegrationAppProvider($configuration->getProviderName())) {\n // This is unlikely to happen, but better safe than sorry\n throw new CrmException('Trying to bootstrap a non IntegrationApp team');\n }\n\n /** @var IntegrationAppInterface $crmService */\n $crmService = $providerRegistry->get(Configuration::PROVIDER_INTEGRATION_APP);\n $owner = $team->getOwner();\n if ($owner === null) {\n throw new RuntimeException('Owner not found');\n }\n $crmService->setUser($owner);\n\n return $crmService;\n }\n}","depth":4,"bounds":{"left":0.25,"top":0.3077778,"width":0.66597223,"height":0.6844444},"on_screen":true,"value":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Services\\Crm\\IntegrationApp\\Jobs;\n\nuse Jiminny\\Contracts\\Crm\\Providers;\nuse Jiminny\\Contracts\\Repositories\\TeamRepository;\nuse Jiminny\\Contracts\\Services\\Crm\\Provider\\IntegrationAppInterface;\nuse Jiminny\\Exceptions\\ApplicationException;\nuse Jiminny\\Exceptions\\CrmException;\nuse Jiminny\\Exceptions\\RuntimeException;\nuse Jiminny\\Models\\Crm\\Configuration;\nuse Jiminny\\Models\\Team;\nuse Jiminny\\Services\\Crm\\ProviderRegistry;\n\ntrait IntegrationAppServiceTrait\n{\n /**\n * @throws ApplicationException\n */\n private function getTeam(TeamRepository $teamRepository): Team\n {\n $team = $teamRepository->find($this->teamId);\n if (! $team instanceof Team) {\n throw new ApplicationException(\"Team not found: {$this->teamId}\");\n }\n\n return $team;\n }\n\n /**\n * @throws CrmException\n */\n private function getPreparedCrmService(Team $team, ProviderRegistry $providerRegistry): IntegrationAppInterface\n {\n $configuration = $team->getCrmConfiguration();\n if (! Providers::isIntegrationAppProvider($configuration->getProviderName())) {\n // This is unlikely to happen, but better safe than sorry\n throw new CrmException('Trying to bootstrap a non IntegrationApp team');\n }\n\n /** @var IntegrationAppInterface $crmService */\n $crmService = $providerRegistry->get(Configuration::PROVIDER_INTEGRATION_APP);\n $owner = $team->getOwner();\n if ($owner === null) {\n throw new RuntimeException('Owner not found');\n }\n $crmService->setUser($owner);\n\n return $crmService;\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.85486114,"top":0.31,"width":0.018055556,"height":0.026666667},"on_screen":true,"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.87291664,"top":0.31,"width":0.018055556,"height":0.026666667},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Browse Query History","depth":4,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"View Parameters","depth":4,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Open Query Execution Settings…","depth":4,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"In-Editor Results","depth":4,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Tx: Auto","depth":4,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Cancel Running Statements","depth":4,"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Playground","depth":4,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"jiminny","depth":4,"bounds":{"left":0.9138889,"top":0.31,"width":0.059027776,"height":0.026666667},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
7308277868902124094
|
-2670001233452600439
|
click
|
accessibility
|
NULL
|
Project: faVsco.js, menu
#12066 on JY-20725-handle Project: faVsco.js, menu
#12066 on JY-20725-handle-HS-search-rate-limit, menu
Start Listening for PHP Debug Connections
HandleHubspotRateLimitTest
Run 'HandleHubspotRateLimitTest'
Debug 'HandleHubspotRateLimitTest'
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
declare(strict_types=1);
namespace Jiminny\Services\Crm\IntegrationApp\Jobs;
use Jiminny\Contracts\Crm\Providers;
use Jiminny\Contracts\Repositories\TeamRepository;
use Jiminny\Contracts\Services\Crm\Provider\IntegrationAppInterface;
use Jiminny\Exceptions\ApplicationException;
use Jiminny\Exceptions\CrmException;
use Jiminny\Exceptions\RuntimeException;
use Jiminny\Models\Crm\Configuration;
use Jiminny\Models\Team;
use Jiminny\Services\Crm\ProviderRegistry;
trait IntegrationAppServiceTrait
{
/**
* @throws ApplicationException
*/
private function getTeam(TeamRepository $teamRepository): Team
{
$team = $teamRepository->find($this->teamId);
if (! $team instanceof Team) {
throw new ApplicationException("Team not found: {$this->teamId}");
}
return $team;
}
/**
* @throws CrmException
*/
private function getPreparedCrmService(Team $team, ProviderRegistry $providerRegistry): IntegrationAppInterface
{
$configuration = $team->getCrmConfiguration();
if (! Providers::isIntegrationAppProvider($configuration->getProviderName())) {
// This is unlikely to happen, but better safe than sorry
throw new CrmException('Trying to bootstrap a non IntegrationApp team');
}
/** @var IntegrationAppInterface $crmService */
$crmService = $providerRegistry->get(Configuration::PROVIDER_INTEGRATION_APP);
$owner = $team->getOwner();
if ($owner === null) {
throw new RuntimeException('Owner not found');
}
$crmService->setUser($owner);
return $crmService;
}
}
Execute
Explain Plan
Browse Query History
View Parameters
Open Query Execution Settings…
In-Editor Results
Tx: Auto
Cancel Running Statements
Playground
jiminny...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
45470
|
1628
|
11
|
2026-05-14T14:39:02.320521+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-14/1778 /Users/lukas/.screenpipe/data/data/2026-05-14/1778769542320_m2.jpg...
|
PhpStorm
|
faVsco.js – IntegrationAppServiceTrait.php
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
#12066 on JY-20725-handle Project: faVsco.js, menu
#12066 on JY-20725-handle-HS-search-rate-limit, menu
Start Listening for PHP Debug Connections
HandleHubspotRateLimitTest
Run 'HandleHubspotRateLimitTest'
Debug 'HandleHubspotRateLimitTest'
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
declare(strict_types=1);
namespace Jiminny\Services\Crm\IntegrationApp\Jobs;
use Jiminny\Contracts\Crm\Providers;
use Jiminny\Contracts\Repositories\TeamRepository;
use Jiminny\Contracts\Services\Crm\Provider\IntegrationAppInterface;
use Jiminny\Exceptions\ApplicationException;
use Jiminny\Exceptions\CrmException;
use Jiminny\Exceptions\RuntimeException;
use Jiminny\Models\Crm\Configuration;
use Jiminny\Models\Team;
use Jiminny\Services\Crm\ProviderRegistry;
trait IntegrationAppServiceTrait
{
/**
* @throws ApplicationException
*/
private function getTeam(TeamRepository $teamRepository): Team
{
$team = $teamRepository->find($this->teamId);
if (! $team instanceof Team) {
throw new ApplicationException("Team not found: {$this->teamId}");
}
return $team;
}
/**
* @throws CrmException
*/
private function getPreparedCrmService(Team $team, ProviderRegistry $providerRegistry): IntegrationAppInterface
{
$configuration = $team->getCrmConfiguration();
if (! Providers::isIntegrationAppProvider($configuration->getProviderName())) {
// This is unlikely to happen, but better safe than sorry
throw new CrmException('Trying to bootstrap a non IntegrationApp team');
}
/** @var IntegrationAppInterface $crmService */
$crmService = $providerRegistry->get(Configuration::PROVIDER_INTEGRATION_APP);
$owner = $team->getOwner();
if ($owner === null) {
throw new RuntimeException('Owner not found');
}
$crmService->setUser($owner);
return $crmService;
}
}
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
8
1
3
4
Previous Highlighted Error
Next Highlighted Error
SELECT
# DISTINCT
opp.id as opp_id, opp.uuid, opp.name,
# COUNT(dr.id) AS deal_risk_count,
# dr.id,
# cfd.value,
usr.name AS owner_name,
opp.value, opp.currency_code, opp.close_date, opp.remotely_created_at, opp.is_closed, opp.is_won,
usr.uuid as owner_uuid,
usr.photo_path as owner_photo,
usr.id AS owner_id,
jt.name as owner_job,
opp.stage_id, opp.stage_updated_at,
acc.name AS acc_name, opp.stage_updated_at, acc.crm_provider_id AS acc_provider_id, opp.crm_provider_id AS opp_provider_id,
rt.business_process_id AS pipeline_id
FROM opportunities opp
LEFT JOIN record_types rt ON opp.record_type_id = rt.id
LEFT JOIN users usr ON opp.user_id = usr.id
LEFT JOIN accounts acc ON opp.account_id = acc.id
LEFT JOIN job_titles jt ON usr.job_title_id = jt.id
# LEFT JOIN group_deal_risk_types gdrt ON gdrt.group_id = usr.group_id
# LEFT JOIN deal_risks dr ON dr.opportunity_id = opp.id AND dr.group_deal_risk_type_id = gdrt.id
LEFT JOIN crm_field_data cfd ON (cfd.object_id = opp.id and cfd.crm_field_id = 66814)
WHERE opp.user_id IS NOT NULL
AND opp.deleted_at IS NULL
AND opp.is_closed = 1
AND opp.is_won = 0
AND opp.close_date >= '2024-01-01 00:00:00'
AND opp.close_date <= '2024-12-31 23:59:59'
AND usr.team_id = 1
# and opp.id = 4823179
GROUP BY opp.id, cfd.value
ORDER BY
# cfd.value
CAST(cfd.value AS UNSIGNED)
# owner_name
# (SELECT COUNT(dr.id)
# FROM deal_risks dr
# JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id
# WHERE dr.opportunity_id = opp.id
# AND dr.is_active = 1
# AND gdrt.is_enabled = 1)
DESC
LIMIT 25
# OFFSET 0
;
select * from crm_fields where crm_configuration_id = 1 and object_type = 'opportunity';
select * from crm_layout_entities where crm_layout_id = 1493;
SELECT * FROM opportunities WHERE id = 4584045;
SELECT * FROM crm_field_data WHERE object_id = 4584045;
SELECT * FROM opportunities where team_id = 1 and crm_provider_id = '0061K00000lfb9IQAQ'
SELECT
opp.id as opportunity_id,
opp.name,
COUNT(dr.id) as risk_count
FROM opportunities opp
LEFT JOIN deal_risks dr ON dr.opportunity_id = opp.id
WHERE opp.id IN (
6069574,8900938,9507638,9524799,9660490,9662824,9705675,9749758,4158460,4391812,6450439,4448422,5118945,5590675,4584045,7228149,9002408,9165534,9446720,9641778,9665149,9703344,9709280,5747948,4158491,6182565,6263970,5798120,5111315,4536978,6062352,6548383,6072095,6548225,4480986,5011422,6548381,8760540,8917554,9509986,9514392,9569009,9569011,9578490,9713604,5784397,7276612,7288405,8994421,9118219,9608148,9818911,4510535,6479693,5958049,6271674,6550448,4158331,4158483,6126571,6171615,6540943,4897466,5190896,5796182,5932762,8572433,8723698,8892697,9711001,9789264,4549188,6100831,6170064,6260799,6263653,6449936,6530871,6538978,7777651,8059269,8319918,8787049,8901150,9263153,9453207,9514738,9696700,9791062,5752018,6421452,7439134,7878923,9354763,9369285,9514396,9582506,9889949,9890216,4094311,4158495,4158496,6098128,5585661,3872564,6442149,5891604,6164746,6199593,6583474,6519684,9018490,9809006,4496897,5041324,5829430,6198319,6253504,6555763,7242914,7931055,8024125,8797814,8058559,8673347,8892695,8994420,9616219,9714970,9722004,9809439,9818918,6523177,8134147,9002915,9711422,9892713,9901719,9954210,9978435,5800810,6243518,6416114,6222251,6411974,6512456,5791953,6545606,9914780,5805540,6238986,6463838,6547680,9767049,9809437,9810885,9890855,6673493,9902036,4335521,6379871,6503799,6546077,8018765,9907556,9958433,9905855,9916179,9946741,9957877,5563344,6271838,6450815,7641128,7762567,7780592,8684810,8685786,8685787,8685788
)
GROUP BY opp.id;
SELECT COUNT(dr.id)
FROM deal_risks dr
JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id
WHERE dr.opportunity_id = 5563344
# AND gdrt.group_id = usr.group_id
EXPLAIN SELECT
opp.id as opp_id, opp.uuid, opp.name,
cfd.value,
cfv.sequence,
cfv.value,
# MAX(cfd.value) AS max_cfd_value,
usr.name AS owner_name,
opp.value, opp.currency_code, opp.close_date, opp.remotely_created_at, opp.is_closed, opp.is_won,
usr.uuid as owner_uuid,
usr.photo_path as owner_photo,
usr.id AS owner_id,
jt.name as owner_job,
opp.stage_id, opp.stage_updated_at,
acc.name AS acc_name, opp.stage_updated_at, acc.crm_provider_id AS acc_provider_id, opp.crm_provider_id AS opp_provider_id,
rt.business_process_id AS pipeline_id
FROM opportunities opp
LEFT JOIN record_types rt ON opp.record_type_id = rt.id
LEFT JOIN users usr ON opp.user_id = usr.id
LEFT JOIN accounts acc ON opp.account_id = acc.id
LEFT JOIN job_titles jt ON usr.job_title_id = jt.id
LEFT JOIN crm_field_data cfd ON cfd.id = (SELECT sub_cfd.id
FROM crm_field_data sub_cfd
WHERE sub_cfd.object_id = opp.id
AND sub_cfd.crm_field_id = 66810
ORDER BY sub_cfd.updated_at DESC
LIMIT 1)
LEFT JOIN crm_field_values cfv ON cfv.crm_field_id = 66810 AND cfv.value = cfd.value
WHERE opp.user_id IS NOT NULL
AND opp.deleted_at IS NULL
AND opp.is_closed = 0
# AND opp.is_closed = 1
# AND opp.is_won = 0
AND opp.close_date >= '2024-01-01 00:00:00'
AND opp.close_date <= '2024-12-31 23:59:59'
AND usr.team_id = 1
# and opp.id = 4823179
# GROUP BY opp.id
ORDER BY
cfv.sequence DESC,
# opp.name
# owner_name
cfd.value
# CAST(cfd.value AS UNSIGNED)
# CAST(MAX(cfd.value) AS UNSIGNED)
# (SELECT COUNT(dr.id)
# FROM deal_risks dr
# JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id
# WHERE dr.opportunity_id = opp.id
# AND dr.is_active = 1 AND gdrt.is_enabled = 1)
DESC
# LIMIT 75, 25
;
SELECT * FROM crm_field_values WHERE crm_field_id = 66810;
SELECT f.id, f.crm_provider_id AS field_name, f.label, fd.object_id AS dealId, fd.value, fd.updated_at, fd.id, fd.created_at
FROM crm_fields f
INNER JOIN crm_field_data fd ON fd.crm_field_id = f.id
WHERE (f.crm_configuration_id = 1)
AND (f.object_type = 'opportunity')
# AND (fd.object_id IN (4158331,4158483,4158495,4158496,6069574,6263970,6171615,6540943,6545606,5829430,6198319,6263653,6548381,7242914,8797814,7228149,7439134,7878923,8134147,9002915,9118219,9165534,9354763,9369285,9446720))
AND (fd.object_id IN (4158460))
AND (f.crm_provider_id IN ('ForecastCategoryName'))
ORDER BY fd.object_id ASC, fd.updated_at DESC;
select * from crm_layouts where crm_configuration_id = 1;
select cf.* from crm_fields cf
join crm_layout_entities cle on cf.id = cle.crm_field_id
where crm_layout_id = 1493;
SELECT * FROM opportunities WHERE id = 4158460;
SELECT * FROM crm_field_data WHERE object_id = 4158460;
select * from users where team_id = 1;
SELECT * FROM users WHERE id = 7160;
select * from role_user where user_id = 3248;
select * from crm_field_values where crm_field_id = 66824;
SELECT * FROM users WHERE id = 23470;
select * from crm_configurations;
# [PASSWORD_DOTS]
select * from teams where id = 1038; # 23521, 966
select * from users where team_id = 1038;
select * from crm_configurations where id = 966;
SELECT * FROM activities WHERE uuid_to_bin('e8dc7c34-31f6-4430-bd81-2d9d8f00dd07') = uuid; # 54965762
SELECT * FROM activities WHERE uuid_to_bin('4b5727c0-69d1-428f-b8d9-b649055166e2') = uuid; # 54965764
SELECT * FROM participants WHERE activity_id = 54965764;
SELECT id, uuid, title, recording_state FROM activities WHERE uuid_to_bin('355f105d-5606-4379-b0c5-d91daf59f4ce') = uuid; # 54964075
SELECT * FROM participants WHERE activity_id = 54964075;
select f.id, slug, title, tf.team_id from team_features tf JOIN features f on tf.feature_id = f.id
where tf.team_id = 1038;
# [PASSWORD_DOTS] PD [PASSWORD_DOTS]
select * from teams where id = 1029;
SELECT * FROM crm_configurations WHERE id = 957;
SELECT * FROM activities WHERE uuid_to_bin('581a33cb-4343-44bd-ac0c-4a5cee71c5ec') = uuid; # 54963423
SELECT * FROM activities WHERE uuid_to_bin('07238011-25fa-418e-838b-fb21e82b9ea2') = uuid; # 54963433
SELECT * FROM activities WHERE uuid_to_bin('8b6bb2f7-e7a7-4aec-8806-fbfea7093ccd') = uuid; # 54963421
# [PASSWORD_DOTS] Close [PASSWORD_DOTS]
select * from teams where id = 1031;
SELECT * FROM crm_configurations WHERE id = 959;
SELECT * FROM activities WHERE uuid_to_bin('59c517e0-96c9-4dad-bfeb-b7bef72f8725') = uuid; # 54963517
SELECT * FROM activities WHERE uuid_to_bin('07238011-25fa-418e-838b-fb21e82b9ea2') = uuid; # 54963433
SELECT * FROM activities WHERE uuid_to_bin('d68311e3-ac34-49bd-bf04-88323a7e5352') = uuid; # 54966009
# [PASSWORD_DOTS] SF [PASSWORD_DOTS]
SELECT * FROM activities WHERE uuid_to_bin('2bd4cfa3-4eb5-4c77-84a7-9ed46a21c988') = uuid;
select * from roles;
select * from permissions;
select * from permission_role where permission_id = 136;
select * from migrations order by id desc;
select * from teams where id IN (1, 1037);
select * from crm_layouts where crm_configuration_id = 1;
SELECT * FROM crm_layout_entities WHERE crm_layout_id = 1493;
SELECT * FROM crm_fields WHERE id IN (1652,1661,66799,66814,66821,66836,66843,66846,66864,84752,182306,323580,380378);
select * from features;
select * from team_features where feature_id = 33;
select * from opportunities;
select * from teams;
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 = 1052 and sa.provider = 'hubspot';
SELECT * FROM accounts where id = 11512582;
select * from activities where account_id = 11512582;
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
ActionItems
Activity
ActivityAnalytics
ActivitySearch
AiActivityType
AiAutomation
AiCallScoring
AskAnything
Dtos, folder
Events, folder
AskAnythingPromptService.php
HistoryService.php, class
AskJiminnyAi
AWS
BillingManagement
Cache
CoachingFeedback
Country
CustomerApi
Database
Datadog
Client.php, class
Constants.php, final class
DateTime
DealInsights
DealRisks
ElasticSearch
Eloquent
Encoding
Events, folder
Exceptions, folder
Job, folder
Listeners, folder
Service
CreateM3U8VideoService.php, class
GenerateSpeechFromSilenceService.php, class
ParseSpeechFromSilenceService.php, class
ResetActivityTracksService.php, class
TrackDemuxer.php, class
UploadM3U8MediaToS3Service.php, class
EncodingServiceProvider.php, class
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, folder
Queue, folder
Router, folder
Saml2, folder
SCIM, folder
Seeder, folder
Sentry, folder
Serializer, folder
Settings, folder
Sidekick, folder
Slack, folder
TeamInsights, folder
TimeMemoryMapper, folder
Transcription, folder
TranscriptionSummary, folder...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"bounds":{"left":0.2962101,"top":1.0,"width":0.03856383,"height":-0.019952059},"on_screen":true,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"#12066 on JY-20725-handle-HS-search-rate-limit, menu","depth":5,"bounds":{"left":0.33477393,"top":1.0,"width":0.122340426,"height":-0.019952059},"on_screen":true,"help_text":"Pull request #12066 exists for current branch JY-20725-handle-HS-search-rate-limit, but local branch is out of sync with remote","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"bounds":{"left":0.5731383,"top":1.0,"width":0.011303191,"height":-0.019952059},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"HandleHubspotRateLimitTest","depth":6,"bounds":{"left":0.5884308,"top":1.0,"width":0.076130316,"height":-0.019952059},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run 'HandleHubspotRateLimitTest'","depth":6,"bounds":{"left":0.66456115,"top":1.0,"width":0.011303191,"height":-0.019952059},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'HandleHubspotRateLimitTest'","depth":6,"bounds":{"left":0.67586434,"top":1.0,"width":0.011303191,"height":-0.019952059},"on_screen":true,"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.6871675,"top":1.0,"width":0.011303191,"height":-0.019952059},"on_screen":true,"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.7150931,"top":1.0,"width":0.011303191,"height":-0.019952059},"on_screen":true,"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.72639626,"top":1.0,"width":0.011303191,"height":-0.019952059},"on_screen":true,"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.73769945,"top":1.0,"width":0.011303191,"height":-0.019952059},"on_screen":true,"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},"on_screen":false,"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},"on_screen":false,"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},"on_screen":false,"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},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"2","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"on_screen":true,"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\\IntegrationApp\\Jobs;\n\nuse Jiminny\\Contracts\\Crm\\Providers;\nuse Jiminny\\Contracts\\Repositories\\TeamRepository;\nuse Jiminny\\Contracts\\Services\\Crm\\Provider\\IntegrationAppInterface;\nuse Jiminny\\Exceptions\\ApplicationException;\nuse Jiminny\\Exceptions\\CrmException;\nuse Jiminny\\Exceptions\\RuntimeException;\nuse Jiminny\\Models\\Crm\\Configuration;\nuse Jiminny\\Models\\Team;\nuse Jiminny\\Services\\Crm\\ProviderRegistry;\n\ntrait IntegrationAppServiceTrait\n{\n /**\n * @throws ApplicationException\n */\n private function getTeam(TeamRepository $teamRepository): Team\n {\n $team = $teamRepository->find($this->teamId);\n if (! $team instanceof Team) {\n throw new ApplicationException(\"Team not found: {$this->teamId}\");\n }\n\n return $team;\n }\n\n /**\n * @throws CrmException\n */\n private function getPreparedCrmService(Team $team, ProviderRegistry $providerRegistry): IntegrationAppInterface\n {\n $configuration = $team->getCrmConfiguration();\n if (! Providers::isIntegrationAppProvider($configuration->getProviderName())) {\n // This is unlikely to happen, but better safe than sorry\n throw new CrmException('Trying to bootstrap a non IntegrationApp team');\n }\n\n /** @var IntegrationAppInterface $crmService */\n $crmService = $providerRegistry->get(Configuration::PROVIDER_INTEGRATION_APP);\n $owner = $team->getOwner();\n if ($owner === null) {\n throw new RuntimeException('Owner not found');\n }\n $crmService->setUser($owner);\n\n return $crmService;\n }\n}","depth":4,"on_screen":true,"value":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Services\\Crm\\IntegrationApp\\Jobs;\n\nuse Jiminny\\Contracts\\Crm\\Providers;\nuse Jiminny\\Contracts\\Repositories\\TeamRepository;\nuse Jiminny\\Contracts\\Services\\Crm\\Provider\\IntegrationAppInterface;\nuse Jiminny\\Exceptions\\ApplicationException;\nuse Jiminny\\Exceptions\\CrmException;\nuse Jiminny\\Exceptions\\RuntimeException;\nuse Jiminny\\Models\\Crm\\Configuration;\nuse Jiminny\\Models\\Team;\nuse Jiminny\\Services\\Crm\\ProviderRegistry;\n\ntrait IntegrationAppServiceTrait\n{\n /**\n * @throws ApplicationException\n */\n private function getTeam(TeamRepository $teamRepository): Team\n {\n $team = $teamRepository->find($this->teamId);\n if (! $team instanceof Team) {\n throw new ApplicationException(\"Team not found: {$this->teamId}\");\n }\n\n return $team;\n }\n\n /**\n * @throws CrmException\n */\n private function getPreparedCrmService(Team $team, ProviderRegistry $providerRegistry): IntegrationAppInterface\n {\n $configuration = $team->getCrmConfiguration();\n if (! Providers::isIntegrationAppProvider($configuration->getProviderName())) {\n // This is unlikely to happen, but better safe than sorry\n throw new CrmException('Trying to bootstrap a non IntegrationApp team');\n }\n\n /** @var IntegrationAppInterface $crmService */\n $crmService = $providerRegistry->get(Configuration::PROVIDER_INTEGRATION_APP);\n $owner = $team->getOwner();\n if ($owner === null) {\n throw new RuntimeException('Owner not found');\n }\n $crmService->setUser($owner);\n\n return $crmService;\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,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Explain Plan","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Browse Query History","depth":4,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"View Parameters","depth":4,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Open Query Execution Settings…","depth":4,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"In-Editor Results","depth":4,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Tx: Auto","depth":4,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Cancel Running Statements","depth":4,"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Playground","depth":4,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"jiminny","depth":4,"on_screen":true,"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},"on_screen":false,"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},"on_screen":false,"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},"on_screen":false,"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},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"8","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"1","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"3","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"4","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"SELECT\n# DISTINCT\nopp.id as opp_id, opp.uuid, opp.name,\n# COUNT(dr.id) AS deal_risk_count,\n\n# dr.id,\n# cfd.value,\nusr.name AS owner_name,\nopp.value, opp.currency_code, opp.close_date, opp.remotely_created_at, opp.is_closed, opp.is_won,\nusr.uuid as owner_uuid,\nusr.photo_path as owner_photo,\nusr.id AS owner_id,\njt.name as owner_job,\nopp.stage_id, opp.stage_updated_at,\nacc.name AS acc_name, opp.stage_updated_at, acc.crm_provider_id AS acc_provider_id, opp.crm_provider_id AS opp_provider_id,\nrt.business_process_id AS pipeline_id\nFROM opportunities opp\nLEFT JOIN record_types rt ON opp.record_type_id = rt.id\nLEFT JOIN users usr ON opp.user_id = usr.id\nLEFT JOIN accounts acc ON opp.account_id = acc.id\nLEFT JOIN job_titles jt ON usr.job_title_id = jt.id\n\n# LEFT JOIN group_deal_risk_types gdrt ON gdrt.group_id = usr.group_id\n# LEFT JOIN deal_risks dr ON dr.opportunity_id = opp.id AND dr.group_deal_risk_type_id = gdrt.id\n\nLEFT JOIN crm_field_data cfd ON (cfd.object_id = opp.id and cfd.crm_field_id = 66814)\n\nWHERE opp.user_id IS NOT NULL\nAND opp.deleted_at IS NULL\nAND opp.is_closed = 1\nAND opp.is_won = 0\nAND opp.close_date >= '2024-01-01 00:00:00'\nAND opp.close_date <= '2024-12-31 23:59:59'\nAND usr.team_id = 1\n\n# and opp.id = 4823179\n\nGROUP BY opp.id, cfd.value\nORDER BY\n# cfd.value\n CAST(cfd.value AS UNSIGNED)\n# owner_name\n# (SELECT COUNT(dr.id)\n# FROM deal_risks dr\n# JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id\n# WHERE dr.opportunity_id = opp.id\n# AND dr.is_active = 1\n# AND gdrt.is_enabled = 1)\nDESC\nLIMIT 25\n# OFFSET 0\n;\n\nselect * from crm_fields where crm_configuration_id = 1 and object_type = 'opportunity';\nselect * from crm_layout_entities where crm_layout_id = 1493;\n\nSELECT * FROM opportunities WHERE id = 4584045;\nSELECT * FROM crm_field_data WHERE object_id = 4584045;\n\nSELECT * FROM opportunities where team_id = 1 and crm_provider_id = '0061K00000lfb9IQAQ'\n\nSELECT\n opp.id as opportunity_id,\n opp.name,\n COUNT(dr.id) as risk_count\nFROM opportunities opp\nLEFT JOIN deal_risks dr ON dr.opportunity_id = opp.id\nWHERE opp.id IN (\n 6069574,8900938,9507638,9524799,9660490,9662824,9705675,9749758,4158460,4391812,6450439,4448422,5118945,5590675,4584045,7228149,9002408,9165534,9446720,9641778,9665149,9703344,9709280,5747948,4158491,6182565,6263970,5798120,5111315,4536978,6062352,6548383,6072095,6548225,4480986,5011422,6548381,8760540,8917554,9509986,9514392,9569009,9569011,9578490,9713604,5784397,7276612,7288405,8994421,9118219,9608148,9818911,4510535,6479693,5958049,6271674,6550448,4158331,4158483,6126571,6171615,6540943,4897466,5190896,5796182,5932762,8572433,8723698,8892697,9711001,9789264,4549188,6100831,6170064,6260799,6263653,6449936,6530871,6538978,7777651,8059269,8319918,8787049,8901150,9263153,9453207,9514738,9696700,9791062,5752018,6421452,7439134,7878923,9354763,9369285,9514396,9582506,9889949,9890216,4094311,4158495,4158496,6098128,5585661,3872564,6442149,5891604,6164746,6199593,6583474,6519684,9018490,9809006,4496897,5041324,5829430,6198319,6253504,6555763,7242914,7931055,8024125,8797814,8058559,8673347,8892695,8994420,9616219,9714970,9722004,9809439,9818918,6523177,8134147,9002915,9711422,9892713,9901719,9954210,9978435,5800810,6243518,6416114,6222251,6411974,6512456,5791953,6545606,9914780,5805540,6238986,6463838,6547680,9767049,9809437,9810885,9890855,6673493,9902036,4335521,6379871,6503799,6546077,8018765,9907556,9958433,9905855,9916179,9946741,9957877,5563344,6271838,6450815,7641128,7762567,7780592,8684810,8685786,8685787,8685788\n)\nGROUP BY opp.id;\n\nSELECT COUNT(dr.id)\n FROM deal_risks dr\n JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id\n WHERE dr.opportunity_id = 5563344\n# AND gdrt.group_id = usr.group_id\n\n\n\nEXPLAIN SELECT\n opp.id as opp_id, opp.uuid, opp.name,\n\ncfd.value,\ncfv.sequence,\ncfv.value,\n# MAX(cfd.value) AS max_cfd_value,\nusr.name AS owner_name,\nopp.value, opp.currency_code, opp.close_date, opp.remotely_created_at, opp.is_closed, opp.is_won,\nusr.uuid as owner_uuid,\nusr.photo_path as owner_photo,\nusr.id AS owner_id,\njt.name as owner_job,\nopp.stage_id, opp.stage_updated_at,\nacc.name AS acc_name, opp.stage_updated_at, acc.crm_provider_id AS acc_provider_id, opp.crm_provider_id AS opp_provider_id,\nrt.business_process_id AS pipeline_id\nFROM opportunities opp\n\nLEFT JOIN record_types rt ON opp.record_type_id = rt.id\nLEFT JOIN users usr ON opp.user_id = usr.id\nLEFT JOIN accounts acc ON opp.account_id = acc.id\nLEFT JOIN job_titles jt ON usr.job_title_id = jt.id\n\nLEFT JOIN crm_field_data cfd ON cfd.id = (SELECT sub_cfd.id\n FROM crm_field_data sub_cfd\n WHERE sub_cfd.object_id = opp.id\n AND sub_cfd.crm_field_id = 66810\n ORDER BY sub_cfd.updated_at DESC\n LIMIT 1)\n\nLEFT JOIN crm_field_values cfv ON cfv.crm_field_id = 66810 AND cfv.value = cfd.value\n\nWHERE opp.user_id IS NOT NULL\nAND opp.deleted_at IS NULL\nAND opp.is_closed = 0\n# AND opp.is_closed = 1\n# AND opp.is_won = 0\nAND opp.close_date >= '2024-01-01 00:00:00'\nAND opp.close_date <= '2024-12-31 23:59:59'\nAND usr.team_id = 1\n\n# and opp.id = 4823179\n\n# GROUP BY opp.id\nORDER BY\n cfv.sequence DESC,\n# opp.name\n# owner_name\n cfd.value\n# CAST(cfd.value AS UNSIGNED)\n# CAST(MAX(cfd.value) AS UNSIGNED)\n# (SELECT COUNT(dr.id)\n# FROM deal_risks dr\n# JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id\n# WHERE dr.opportunity_id = opp.id\n# AND dr.is_active = 1 AND gdrt.is_enabled = 1)\nDESC\n# LIMIT 75, 25\n;\n\n\n\nSELECT * FROM crm_field_values WHERE crm_field_id = 66810;\n\nSELECT f.id, f.crm_provider_id AS field_name, f.label, fd.object_id AS dealId, fd.value, fd.updated_at, fd.id, fd.created_at\nFROM crm_fields f\nINNER JOIN crm_field_data fd ON fd.crm_field_id = f.id\n WHERE (f.crm_configuration_id = 1)\n AND (f.object_type = 'opportunity')\n# AND (fd.object_id IN (4158331,4158483,4158495,4158496,6069574,6263970,6171615,6540943,6545606,5829430,6198319,6263653,6548381,7242914,8797814,7228149,7439134,7878923,8134147,9002915,9118219,9165534,9354763,9369285,9446720))\n AND (fd.object_id IN (4158460))\n AND (f.crm_provider_id IN ('ForecastCategoryName'))\n ORDER BY fd.object_id ASC, fd.updated_at DESC;\n\nselect * from crm_layouts where crm_configuration_id = 1;\nselect cf.* from crm_fields cf\njoin crm_layout_entities cle on cf.id = cle.crm_field_id\nwhere crm_layout_id = 1493;\n\nSELECT * FROM opportunities WHERE id = 4158460;\nSELECT * FROM crm_field_data WHERE object_id = 4158460;\n\nselect * from users where team_id = 1;\nSELECT * FROM users WHERE id = 7160;\nselect * from role_user where user_id = 3248;\n\nselect * from crm_field_values where crm_field_id = 66824;\n\nSELECT * FROM users WHERE id = 23470;\nselect * from crm_configurations;\n\n# ******************************************\nselect * from teams where id = 1038; # 23521, 966\nselect * from users where team_id = 1038;\nselect * from crm_configurations where id = 966;\nSELECT * FROM activities WHERE uuid_to_bin('e8dc7c34-31f6-4430-bd81-2d9d8f00dd07') = uuid; # 54965762\nSELECT * FROM activities WHERE uuid_to_bin('4b5727c0-69d1-428f-b8d9-b649055166e2') = uuid; # 54965764\nSELECT * FROM participants WHERE activity_id = 54965764;\n\nSELECT id, uuid, title, recording_state FROM activities WHERE uuid_to_bin('355f105d-5606-4379-b0c5-d91daf59f4ce') = uuid; # 54964075\nSELECT * FROM participants WHERE activity_id = 54964075;\nselect f.id, slug, title, tf.team_id from team_features tf JOIN features f on tf.feature_id = f.id\n where tf.team_id = 1038;\n\n\n# ****************************************** PD *************************\nselect * from teams where id = 1029;\nSELECT * FROM crm_configurations WHERE id = 957;\nSELECT * FROM activities WHERE uuid_to_bin('581a33cb-4343-44bd-ac0c-4a5cee71c5ec') = uuid; # 54963423\nSELECT * FROM activities WHERE uuid_to_bin('07238011-25fa-418e-838b-fb21e82b9ea2') = uuid; # 54963433\n\nSELECT * FROM activities WHERE uuid_to_bin('8b6bb2f7-e7a7-4aec-8806-fbfea7093ccd') = uuid; # 54963421\n\n# ****************************************** Close *************************\nselect * from teams where id = 1031;\nSELECT * FROM crm_configurations WHERE id = 959;\nSELECT * FROM activities WHERE uuid_to_bin('59c517e0-96c9-4dad-bfeb-b7bef72f8725') = uuid; # 54963517\n\n\nSELECT * FROM activities WHERE uuid_to_bin('07238011-25fa-418e-838b-fb21e82b9ea2') = uuid; # 54963433\n\nSELECT * FROM activities WHERE uuid_to_bin('d68311e3-ac34-49bd-bf04-88323a7e5352') = uuid; # 54966009\n\n# ****************************************** SF *************************\nSELECT * FROM activities WHERE uuid_to_bin('2bd4cfa3-4eb5-4c77-84a7-9ed46a21c988') = uuid;\n\nselect * from roles;\nselect * from permissions;\nselect * from permission_role where permission_id = 136;\n\nselect * from migrations order by id desc;\n\nselect * from teams where id IN (1, 1037);\nselect * from crm_layouts where crm_configuration_id = 1;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1493;\nSELECT * FROM crm_fields WHERE id IN (1652,1661,66799,66814,66821,66836,66843,66846,66864,84752,182306,323580,380378);\n\nselect * from features;\nselect * from team_features where feature_id = 33;\nselect * from opportunities;\n\nselect * from teams;\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 = 1052 and sa.provider = 'hubspot';\n\nSELECT * FROM accounts where id = 11512582;\nselect * from activities where account_id = 11512582;","depth":4,"on_screen":true,"value":"SELECT\n# DISTINCT\nopp.id as opp_id, opp.uuid, opp.name,\n# COUNT(dr.id) AS deal_risk_count,\n\n# dr.id,\n# cfd.value,\nusr.name AS owner_name,\nopp.value, opp.currency_code, opp.close_date, opp.remotely_created_at, opp.is_closed, opp.is_won,\nusr.uuid as owner_uuid,\nusr.photo_path as owner_photo,\nusr.id AS owner_id,\njt.name as owner_job,\nopp.stage_id, opp.stage_updated_at,\nacc.name AS acc_name, opp.stage_updated_at, acc.crm_provider_id AS acc_provider_id, opp.crm_provider_id AS opp_provider_id,\nrt.business_process_id AS pipeline_id\nFROM opportunities opp\nLEFT JOIN record_types rt ON opp.record_type_id = rt.id\nLEFT JOIN users usr ON opp.user_id = usr.id\nLEFT JOIN accounts acc ON opp.account_id = acc.id\nLEFT JOIN job_titles jt ON usr.job_title_id = jt.id\n\n# LEFT JOIN group_deal_risk_types gdrt ON gdrt.group_id = usr.group_id\n# LEFT JOIN deal_risks dr ON dr.opportunity_id = opp.id AND dr.group_deal_risk_type_id = gdrt.id\n\nLEFT JOIN crm_field_data cfd ON (cfd.object_id = opp.id and cfd.crm_field_id = 66814)\n\nWHERE opp.user_id IS NOT NULL\nAND opp.deleted_at IS NULL\nAND opp.is_closed = 1\nAND opp.is_won = 0\nAND opp.close_date >= '2024-01-01 00:00:00'\nAND opp.close_date <= '2024-12-31 23:59:59'\nAND usr.team_id = 1\n\n# and opp.id = 4823179\n\nGROUP BY opp.id, cfd.value\nORDER BY\n# cfd.value\n CAST(cfd.value AS UNSIGNED)\n# owner_name\n# (SELECT COUNT(dr.id)\n# FROM deal_risks dr\n# JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id\n# WHERE dr.opportunity_id = opp.id\n# AND dr.is_active = 1\n# AND gdrt.is_enabled = 1)\nDESC\nLIMIT 25\n# OFFSET 0\n;\n\nselect * from crm_fields where crm_configuration_id = 1 and object_type = 'opportunity';\nselect * from crm_layout_entities where crm_layout_id = 1493;\n\nSELECT * FROM opportunities WHERE id = 4584045;\nSELECT * FROM crm_field_data WHERE object_id = 4584045;\n\nSELECT * FROM opportunities where team_id = 1 and crm_provider_id = '0061K00000lfb9IQAQ'\n\nSELECT\n opp.id as opportunity_id,\n opp.name,\n COUNT(dr.id) as risk_count\nFROM opportunities opp\nLEFT JOIN deal_risks dr ON dr.opportunity_id = opp.id\nWHERE opp.id IN (\n 6069574,8900938,9507638,9524799,9660490,9662824,9705675,9749758,4158460,4391812,6450439,4448422,5118945,5590675,4584045,7228149,9002408,9165534,9446720,9641778,9665149,9703344,9709280,5747948,4158491,6182565,6263970,5798120,5111315,4536978,6062352,6548383,6072095,6548225,4480986,5011422,6548381,8760540,8917554,9509986,9514392,9569009,9569011,9578490,9713604,5784397,7276612,7288405,8994421,9118219,9608148,9818911,4510535,6479693,5958049,6271674,6550448,4158331,4158483,6126571,6171615,6540943,4897466,5190896,5796182,5932762,8572433,8723698,8892697,9711001,9789264,4549188,6100831,6170064,6260799,6263653,6449936,6530871,6538978,7777651,8059269,8319918,8787049,8901150,9263153,9453207,9514738,9696700,9791062,5752018,6421452,7439134,7878923,9354763,9369285,9514396,9582506,9889949,9890216,4094311,4158495,4158496,6098128,5585661,3872564,6442149,5891604,6164746,6199593,6583474,6519684,9018490,9809006,4496897,5041324,5829430,6198319,6253504,6555763,7242914,7931055,8024125,8797814,8058559,8673347,8892695,8994420,9616219,9714970,9722004,9809439,9818918,6523177,8134147,9002915,9711422,9892713,9901719,9954210,9978435,5800810,6243518,6416114,6222251,6411974,6512456,5791953,6545606,9914780,5805540,6238986,6463838,6547680,9767049,9809437,9810885,9890855,6673493,9902036,4335521,6379871,6503799,6546077,8018765,9907556,9958433,9905855,9916179,9946741,9957877,5563344,6271838,6450815,7641128,7762567,7780592,8684810,8685786,8685787,8685788\n)\nGROUP BY opp.id;\n\nSELECT COUNT(dr.id)\n FROM deal_risks dr\n JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id\n WHERE dr.opportunity_id = 5563344\n# AND gdrt.group_id = usr.group_id\n\n\n\nEXPLAIN SELECT\n opp.id as opp_id, opp.uuid, opp.name,\n\ncfd.value,\ncfv.sequence,\ncfv.value,\n# MAX(cfd.value) AS max_cfd_value,\nusr.name AS owner_name,\nopp.value, opp.currency_code, opp.close_date, opp.remotely_created_at, opp.is_closed, opp.is_won,\nusr.uuid as owner_uuid,\nusr.photo_path as owner_photo,\nusr.id AS owner_id,\njt.name as owner_job,\nopp.stage_id, opp.stage_updated_at,\nacc.name AS acc_name, opp.stage_updated_at, acc.crm_provider_id AS acc_provider_id, opp.crm_provider_id AS opp_provider_id,\nrt.business_process_id AS pipeline_id\nFROM opportunities opp\n\nLEFT JOIN record_types rt ON opp.record_type_id = rt.id\nLEFT JOIN users usr ON opp.user_id = usr.id\nLEFT JOIN accounts acc ON opp.account_id = acc.id\nLEFT JOIN job_titles jt ON usr.job_title_id = jt.id\n\nLEFT JOIN crm_field_data cfd ON cfd.id = (SELECT sub_cfd.id\n FROM crm_field_data sub_cfd\n WHERE sub_cfd.object_id = opp.id\n AND sub_cfd.crm_field_id = 66810\n ORDER BY sub_cfd.updated_at DESC\n LIMIT 1)\n\nLEFT JOIN crm_field_values cfv ON cfv.crm_field_id = 66810 AND cfv.value = cfd.value\n\nWHERE opp.user_id IS NOT NULL\nAND opp.deleted_at IS NULL\nAND opp.is_closed = 0\n# AND opp.is_closed = 1\n# AND opp.is_won = 0\nAND opp.close_date >= '2024-01-01 00:00:00'\nAND opp.close_date <= '2024-12-31 23:59:59'\nAND usr.team_id = 1\n\n# and opp.id = 4823179\n\n# GROUP BY opp.id\nORDER BY\n cfv.sequence DESC,\n# opp.name\n# owner_name\n cfd.value\n# CAST(cfd.value AS UNSIGNED)\n# CAST(MAX(cfd.value) AS UNSIGNED)\n# (SELECT COUNT(dr.id)\n# FROM deal_risks dr\n# JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id\n# WHERE dr.opportunity_id = opp.id\n# AND dr.is_active = 1 AND gdrt.is_enabled = 1)\nDESC\n# LIMIT 75, 25\n;\n\n\n\nSELECT * FROM crm_field_values WHERE crm_field_id = 66810;\n\nSELECT f.id, f.crm_provider_id AS field_name, f.label, fd.object_id AS dealId, fd.value, fd.updated_at, fd.id, fd.created_at\nFROM crm_fields f\nINNER JOIN crm_field_data fd ON fd.crm_field_id = f.id\n WHERE (f.crm_configuration_id = 1)\n AND (f.object_type = 'opportunity')\n# AND (fd.object_id IN (4158331,4158483,4158495,4158496,6069574,6263970,6171615,6540943,6545606,5829430,6198319,6263653,6548381,7242914,8797814,7228149,7439134,7878923,8134147,9002915,9118219,9165534,9354763,9369285,9446720))\n AND (fd.object_id IN (4158460))\n AND (f.crm_provider_id IN ('ForecastCategoryName'))\n ORDER BY fd.object_id ASC, fd.updated_at DESC;\n\nselect * from crm_layouts where crm_configuration_id = 1;\nselect cf.* from crm_fields cf\njoin crm_layout_entities cle on cf.id = cle.crm_field_id\nwhere crm_layout_id = 1493;\n\nSELECT * FROM opportunities WHERE id = 4158460;\nSELECT * FROM crm_field_data WHERE object_id = 4158460;\n\nselect * from users where team_id = 1;\nSELECT * FROM users WHERE id = 7160;\nselect * from role_user where user_id = 3248;\n\nselect * from crm_field_values where crm_field_id = 66824;\n\nSELECT * FROM users WHERE id = 23470;\nselect * from crm_configurations;\n\n# ******************************************\nselect * from teams where id = 1038; # 23521, 966\nselect * from users where team_id = 1038;\nselect * from crm_configurations where id = 966;\nSELECT * FROM activities WHERE uuid_to_bin('e8dc7c34-31f6-4430-bd81-2d9d8f00dd07') = uuid; # 54965762\nSELECT * FROM activities WHERE uuid_to_bin('4b5727c0-69d1-428f-b8d9-b649055166e2') = uuid; # 54965764\nSELECT * FROM participants WHERE activity_id = 54965764;\n\nSELECT id, uuid, title, recording_state FROM activities WHERE uuid_to_bin('355f105d-5606-4379-b0c5-d91daf59f4ce') = uuid; # 54964075\nSELECT * FROM participants WHERE activity_id = 54964075;\nselect f.id, slug, title, tf.team_id from team_features tf JOIN features f on tf.feature_id = f.id\n where tf.team_id = 1038;\n\n\n# ****************************************** PD *************************\nselect * from teams where id = 1029;\nSELECT * FROM crm_configurations WHERE id = 957;\nSELECT * FROM activities WHERE uuid_to_bin('581a33cb-4343-44bd-ac0c-4a5cee71c5ec') = uuid; # 54963423\nSELECT * FROM activities WHERE uuid_to_bin('07238011-25fa-418e-838b-fb21e82b9ea2') = uuid; # 54963433\n\nSELECT * FROM activities WHERE uuid_to_bin('8b6bb2f7-e7a7-4aec-8806-fbfea7093ccd') = uuid; # 54963421\n\n# ****************************************** Close *************************\nselect * from teams where id = 1031;\nSELECT * FROM crm_configurations WHERE id = 959;\nSELECT * FROM activities WHERE uuid_to_bin('59c517e0-96c9-4dad-bfeb-b7bef72f8725') = uuid; # 54963517\n\n\nSELECT * FROM activities WHERE uuid_to_bin('07238011-25fa-418e-838b-fb21e82b9ea2') = uuid; # 54963433\n\nSELECT * FROM activities WHERE uuid_to_bin('d68311e3-ac34-49bd-bf04-88323a7e5352') = uuid; # 54966009\n\n# ****************************************** SF *************************\nSELECT * FROM activities WHERE uuid_to_bin('2bd4cfa3-4eb5-4c77-84a7-9ed46a21c988') = uuid;\n\nselect * from roles;\nselect * from permissions;\nselect * from permission_role where permission_id = 136;\n\nselect * from migrations order by id desc;\n\nselect * from teams where id IN (1, 1037);\nselect * from crm_layouts where crm_configuration_id = 1;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1493;\nSELECT * FROM crm_fields WHERE id IN (1652,1661,66799,66814,66821,66836,66843,66846,66864,84752,182306,323580,380378);\n\nselect * from features;\nselect * from team_features where feature_id = 33;\nselect * from opportunities;\n\nselect * from teams;\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 = 1052 and sa.provider = 'hubspot';\n\nSELECT * FROM accounts where id = 11512582;\nselect * from activities where account_id = 11512582;","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Project","depth":3,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Project","depth":3,"bounds":{"left":0.28224733,"top":1.0,"width":0.024268618,"height":-0.04788506},"on_screen":true,"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.32114363,"top":1.0,"width":0.008643617,"height":-0.05027938},"on_screen":true,"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.33211437,"top":1.0,"width":0.008643617,"height":-0.05027938},"on_screen":true,"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.34075797,"top":1.0,"width":0.008643617,"height":-0.05027938},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Options","depth":4,"bounds":{"left":0.3494016,"top":1.0,"width":0.008643617,"height":-0.05027938},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.35804522,"top":1.0,"width":0.008643617,"height":-0.05027938},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"app ~/jiminny/app","depth":6,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":".circleci","depth":7,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":".cursor","depth":7,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":".github","depth":7,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":".sonarlint","depth":7,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":".vscode","depth":7,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":".windsurf","depth":7,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"app, sources root","depth":7,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Actions","depth":8,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Component","depth":8,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Acl","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"ActionItems","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Activity","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"ActivityAnalytics","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"ActivitySearch","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"AiActivityType","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"AiAutomation","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"AiCallScoring","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"AskAnything","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Dtos, folder","depth":10,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Events, folder","depth":10,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"AskAnythingPromptService.php","depth":10,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"HistoryService.php, class","depth":10,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"AskJiminnyAi","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"AWS","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"BillingManagement","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Cache","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"CoachingFeedback","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Country","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"CustomerApi","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Database","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Datadog","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Client.php, class","depth":10,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Constants.php, final class","depth":10,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"DateTime","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"DealInsights","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"DealRisks","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"ElasticSearch","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Eloquent","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Encoding","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Events, folder","depth":10,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Exceptions, folder","depth":10,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Job, folder","depth":10,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Listeners, folder","depth":10,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Service","depth":10,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"CreateM3U8VideoService.php, class","depth":11,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"GenerateSpeechFromSilenceService.php, class","depth":11,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"ParseSpeechFromSilenceService.php, class","depth":11,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"ResetActivityTracksService.php, class","depth":11,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"TrackDemuxer.php, class","depth":11,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"UploadM3U8MediaToS3Service.php, class","depth":11,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"EncodingServiceProvider.php, class","depth":10,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Encryption","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"ES","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Faker","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"FeatureFlags","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"FFMpeg","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"FileSystem","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Gecko","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Gong","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"GuzzleHttp","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"KeyPoints","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Kiosk","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"LanguageDetection","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"LiveFeed","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Locks","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Math","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"MediaPipeline","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"MeetingBot","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"MobileSettings","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Model","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Notification","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Nudge","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"ParagraphBreaker","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"ParticipantSpeech","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"PartitionedCookie","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"PlaybackPage","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Playlist","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Prophet","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"ProphetAi","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"ProsperWorks, folder","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Queue, folder","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Router, folder","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Saml2, folder","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"SCIM, folder","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Seeder, folder","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Sentry, folder","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Serializer, folder","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Settings, folder","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Sidekick, folder","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Slack, folder","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"TeamInsights, folder","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"TimeMemoryMapper, folder","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Transcription, folder","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"TranscriptionSummary, folder","depth":9,"on_screen":false,"role_description":"text"}]...
|
5732108575498720068
|
6686328802881245789
|
click
|
accessibility
|
NULL
|
Project: faVsco.js, menu
#12066 on JY-20725-handle Project: faVsco.js, menu
#12066 on JY-20725-handle-HS-search-rate-limit, menu
Start Listening for PHP Debug Connections
HandleHubspotRateLimitTest
Run 'HandleHubspotRateLimitTest'
Debug 'HandleHubspotRateLimitTest'
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
declare(strict_types=1);
namespace Jiminny\Services\Crm\IntegrationApp\Jobs;
use Jiminny\Contracts\Crm\Providers;
use Jiminny\Contracts\Repositories\TeamRepository;
use Jiminny\Contracts\Services\Crm\Provider\IntegrationAppInterface;
use Jiminny\Exceptions\ApplicationException;
use Jiminny\Exceptions\CrmException;
use Jiminny\Exceptions\RuntimeException;
use Jiminny\Models\Crm\Configuration;
use Jiminny\Models\Team;
use Jiminny\Services\Crm\ProviderRegistry;
trait IntegrationAppServiceTrait
{
/**
* @throws ApplicationException
*/
private function getTeam(TeamRepository $teamRepository): Team
{
$team = $teamRepository->find($this->teamId);
if (! $team instanceof Team) {
throw new ApplicationException("Team not found: {$this->teamId}");
}
return $team;
}
/**
* @throws CrmException
*/
private function getPreparedCrmService(Team $team, ProviderRegistry $providerRegistry): IntegrationAppInterface
{
$configuration = $team->getCrmConfiguration();
if (! Providers::isIntegrationAppProvider($configuration->getProviderName())) {
// This is unlikely to happen, but better safe than sorry
throw new CrmException('Trying to bootstrap a non IntegrationApp team');
}
/** @var IntegrationAppInterface $crmService */
$crmService = $providerRegistry->get(Configuration::PROVIDER_INTEGRATION_APP);
$owner = $team->getOwner();
if ($owner === null) {
throw new RuntimeException('Owner not found');
}
$crmService->setUser($owner);
return $crmService;
}
}
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
8
1
3
4
Previous Highlighted Error
Next Highlighted Error
SELECT
# DISTINCT
opp.id as opp_id, opp.uuid, opp.name,
# COUNT(dr.id) AS deal_risk_count,
# dr.id,
# cfd.value,
usr.name AS owner_name,
opp.value, opp.currency_code, opp.close_date, opp.remotely_created_at, opp.is_closed, opp.is_won,
usr.uuid as owner_uuid,
usr.photo_path as owner_photo,
usr.id AS owner_id,
jt.name as owner_job,
opp.stage_id, opp.stage_updated_at,
acc.name AS acc_name, opp.stage_updated_at, acc.crm_provider_id AS acc_provider_id, opp.crm_provider_id AS opp_provider_id,
rt.business_process_id AS pipeline_id
FROM opportunities opp
LEFT JOIN record_types rt ON opp.record_type_id = rt.id
LEFT JOIN users usr ON opp.user_id = usr.id
LEFT JOIN accounts acc ON opp.account_id = acc.id
LEFT JOIN job_titles jt ON usr.job_title_id = jt.id
# LEFT JOIN group_deal_risk_types gdrt ON gdrt.group_id = usr.group_id
# LEFT JOIN deal_risks dr ON dr.opportunity_id = opp.id AND dr.group_deal_risk_type_id = gdrt.id
LEFT JOIN crm_field_data cfd ON (cfd.object_id = opp.id and cfd.crm_field_id = 66814)
WHERE opp.user_id IS NOT NULL
AND opp.deleted_at IS NULL
AND opp.is_closed = 1
AND opp.is_won = 0
AND opp.close_date >= '2024-01-01 00:00:00'
AND opp.close_date <= '2024-12-31 23:59:59'
AND usr.team_id = 1
# and opp.id = 4823179
GROUP BY opp.id, cfd.value
ORDER BY
# cfd.value
CAST(cfd.value AS UNSIGNED)
# owner_name
# (SELECT COUNT(dr.id)
# FROM deal_risks dr
# JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id
# WHERE dr.opportunity_id = opp.id
# AND dr.is_active = 1
# AND gdrt.is_enabled = 1)
DESC
LIMIT 25
# OFFSET 0
;
select * from crm_fields where crm_configuration_id = 1 and object_type = 'opportunity';
select * from crm_layout_entities where crm_layout_id = 1493;
SELECT * FROM opportunities WHERE id = 4584045;
SELECT * FROM crm_field_data WHERE object_id = 4584045;
SELECT * FROM opportunities where team_id = 1 and crm_provider_id = '0061K00000lfb9IQAQ'
SELECT
opp.id as opportunity_id,
opp.name,
COUNT(dr.id) as risk_count
FROM opportunities opp
LEFT JOIN deal_risks dr ON dr.opportunity_id = opp.id
WHERE opp.id IN (
6069574,8900938,9507638,9524799,9660490,9662824,9705675,9749758,4158460,4391812,6450439,4448422,5118945,5590675,4584045,7228149,9002408,9165534,9446720,9641778,9665149,9703344,9709280,5747948,4158491,6182565,6263970,5798120,5111315,4536978,6062352,6548383,6072095,6548225,4480986,5011422,6548381,8760540,8917554,9509986,9514392,9569009,9569011,9578490,9713604,5784397,7276612,7288405,8994421,9118219,9608148,9818911,4510535,6479693,5958049,6271674,6550448,4158331,4158483,6126571,6171615,6540943,4897466,5190896,5796182,5932762,8572433,8723698,8892697,9711001,9789264,4549188,6100831,6170064,6260799,6263653,6449936,6530871,6538978,7777651,8059269,8319918,8787049,8901150,9263153,9453207,9514738,9696700,9791062,5752018,6421452,7439134,7878923,9354763,9369285,9514396,9582506,9889949,9890216,4094311,4158495,4158496,6098128,5585661,3872564,6442149,5891604,6164746,6199593,6583474,6519684,9018490,9809006,4496897,5041324,5829430,6198319,6253504,6555763,7242914,7931055,8024125,8797814,8058559,8673347,8892695,8994420,9616219,9714970,9722004,9809439,9818918,6523177,8134147,9002915,9711422,9892713,9901719,9954210,9978435,5800810,6243518,6416114,6222251,6411974,6512456,5791953,6545606,9914780,5805540,6238986,6463838,6547680,9767049,9809437,9810885,9890855,6673493,9902036,4335521,6379871,6503799,6546077,8018765,9907556,9958433,9905855,9916179,9946741,9957877,5563344,6271838,6450815,7641128,7762567,7780592,8684810,8685786,8685787,8685788
)
GROUP BY opp.id;
SELECT COUNT(dr.id)
FROM deal_risks dr
JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id
WHERE dr.opportunity_id = 5563344
# AND gdrt.group_id = usr.group_id
EXPLAIN SELECT
opp.id as opp_id, opp.uuid, opp.name,
cfd.value,
cfv.sequence,
cfv.value,
# MAX(cfd.value) AS max_cfd_value,
usr.name AS owner_name,
opp.value, opp.currency_code, opp.close_date, opp.remotely_created_at, opp.is_closed, opp.is_won,
usr.uuid as owner_uuid,
usr.photo_path as owner_photo,
usr.id AS owner_id,
jt.name as owner_job,
opp.stage_id, opp.stage_updated_at,
acc.name AS acc_name, opp.stage_updated_at, acc.crm_provider_id AS acc_provider_id, opp.crm_provider_id AS opp_provider_id,
rt.business_process_id AS pipeline_id
FROM opportunities opp
LEFT JOIN record_types rt ON opp.record_type_id = rt.id
LEFT JOIN users usr ON opp.user_id = usr.id
LEFT JOIN accounts acc ON opp.account_id = acc.id
LEFT JOIN job_titles jt ON usr.job_title_id = jt.id
LEFT JOIN crm_field_data cfd ON cfd.id = (SELECT sub_cfd.id
FROM crm_field_data sub_cfd
WHERE sub_cfd.object_id = opp.id
AND sub_cfd.crm_field_id = 66810
ORDER BY sub_cfd.updated_at DESC
LIMIT 1)
LEFT JOIN crm_field_values cfv ON cfv.crm_field_id = 66810 AND cfv.value = cfd.value
WHERE opp.user_id IS NOT NULL
AND opp.deleted_at IS NULL
AND opp.is_closed = 0
# AND opp.is_closed = 1
# AND opp.is_won = 0
AND opp.close_date >= '2024-01-01 00:00:00'
AND opp.close_date <= '2024-12-31 23:59:59'
AND usr.team_id = 1
# and opp.id = 4823179
# GROUP BY opp.id
ORDER BY
cfv.sequence DESC,
# opp.name
# owner_name
cfd.value
# CAST(cfd.value AS UNSIGNED)
# CAST(MAX(cfd.value) AS UNSIGNED)
# (SELECT COUNT(dr.id)
# FROM deal_risks dr
# JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id
# WHERE dr.opportunity_id = opp.id
# AND dr.is_active = 1 AND gdrt.is_enabled = 1)
DESC
# LIMIT 75, 25
;
SELECT * FROM crm_field_values WHERE crm_field_id = 66810;
SELECT f.id, f.crm_provider_id AS field_name, f.label, fd.object_id AS dealId, fd.value, fd.updated_at, fd.id, fd.created_at
FROM crm_fields f
INNER JOIN crm_field_data fd ON fd.crm_field_id = f.id
WHERE (f.crm_configuration_id = 1)
AND (f.object_type = 'opportunity')
# AND (fd.object_id IN (4158331,4158483,4158495,4158496,6069574,6263970,6171615,6540943,6545606,5829430,6198319,6263653,6548381,7242914,8797814,7228149,7439134,7878923,8134147,9002915,9118219,9165534,9354763,9369285,9446720))
AND (fd.object_id IN (4158460))
AND (f.crm_provider_id IN ('ForecastCategoryName'))
ORDER BY fd.object_id ASC, fd.updated_at DESC;
select * from crm_layouts where crm_configuration_id = 1;
select cf.* from crm_fields cf
join crm_layout_entities cle on cf.id = cle.crm_field_id
where crm_layout_id = 1493;
SELECT * FROM opportunities WHERE id = 4158460;
SELECT * FROM crm_field_data WHERE object_id = 4158460;
select * from users where team_id = 1;
SELECT * FROM users WHERE id = 7160;
select * from role_user where user_id = 3248;
select * from crm_field_values where crm_field_id = 66824;
SELECT * FROM users WHERE id = 23470;
select * from crm_configurations;
# [PASSWORD_DOTS]
select * from teams where id = 1038; # 23521, 966
select * from users where team_id = 1038;
select * from crm_configurations where id = 966;
SELECT * FROM activities WHERE uuid_to_bin('e8dc7c34-31f6-4430-bd81-2d9d8f00dd07') = uuid; # 54965762
SELECT * FROM activities WHERE uuid_to_bin('4b5727c0-69d1-428f-b8d9-b649055166e2') = uuid; # 54965764
SELECT * FROM participants WHERE activity_id = 54965764;
SELECT id, uuid, title, recording_state FROM activities WHERE uuid_to_bin('355f105d-5606-4379-b0c5-d91daf59f4ce') = uuid; # 54964075
SELECT * FROM participants WHERE activity_id = 54964075;
select f.id, slug, title, tf.team_id from team_features tf JOIN features f on tf.feature_id = f.id
where tf.team_id = 1038;
# [PASSWORD_DOTS] PD [PASSWORD_DOTS]
select * from teams where id = 1029;
SELECT * FROM crm_configurations WHERE id = 957;
SELECT * FROM activities WHERE uuid_to_bin('581a33cb-4343-44bd-ac0c-4a5cee71c5ec') = uuid; # 54963423
SELECT * FROM activities WHERE uuid_to_bin('07238011-25fa-418e-838b-fb21e82b9ea2') = uuid; # 54963433
SELECT * FROM activities WHERE uuid_to_bin('8b6bb2f7-e7a7-4aec-8806-fbfea7093ccd') = uuid; # 54963421
# [PASSWORD_DOTS] Close [PASSWORD_DOTS]
select * from teams where id = 1031;
SELECT * FROM crm_configurations WHERE id = 959;
SELECT * FROM activities WHERE uuid_to_bin('59c517e0-96c9-4dad-bfeb-b7bef72f8725') = uuid; # 54963517
SELECT * FROM activities WHERE uuid_to_bin('07238011-25fa-418e-838b-fb21e82b9ea2') = uuid; # 54963433
SELECT * FROM activities WHERE uuid_to_bin('d68311e3-ac34-49bd-bf04-88323a7e5352') = uuid; # 54966009
# [PASSWORD_DOTS] SF [PASSWORD_DOTS]
SELECT * FROM activities WHERE uuid_to_bin('2bd4cfa3-4eb5-4c77-84a7-9ed46a21c988') = uuid;
select * from roles;
select * from permissions;
select * from permission_role where permission_id = 136;
select * from migrations order by id desc;
select * from teams where id IN (1, 1037);
select * from crm_layouts where crm_configuration_id = 1;
SELECT * FROM crm_layout_entities WHERE crm_layout_id = 1493;
SELECT * FROM crm_fields WHERE id IN (1652,1661,66799,66814,66821,66836,66843,66846,66864,84752,182306,323580,380378);
select * from features;
select * from team_features where feature_id = 33;
select * from opportunities;
select * from teams;
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 = 1052 and sa.provider = 'hubspot';
SELECT * FROM accounts where id = 11512582;
select * from activities where account_id = 11512582;
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
ActionItems
Activity
ActivityAnalytics
ActivitySearch
AiActivityType
AiAutomation
AiCallScoring
AskAnything
Dtos, folder
Events, folder
AskAnythingPromptService.php
HistoryService.php, class
AskJiminnyAi
AWS
BillingManagement
Cache
CoachingFeedback
Country
CustomerApi
Database
Datadog
Client.php, class
Constants.php, final class
DateTime
DealInsights
DealRisks
ElasticSearch
Eloquent
Encoding
Events, folder
Exceptions, folder
Job, folder
Listeners, folder
Service
CreateM3U8VideoService.php, class
GenerateSpeechFromSilenceService.php, class
ParseSpeechFromSilenceService.php, class
ResetActivityTracksService.php, class
TrackDemuxer.php, class
UploadM3U8MediaToS3Service.php, class
EncodingServiceProvider.php, class
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, folder
Queue, folder
Router, folder
Saml2, folder
SCIM, folder
Seeder, folder
Sentry, folder
Serializer, folder
Settings, folder
Sidekick, folder
Slack, folder
TeamInsights, folder
TimeMemoryMapper, folder
Transcription, folder
TranscriptionSummary, folder...
|
45468
|
NULL
|
NULL
|
NULL
|
|
45469
|
1627
|
14
|
2026-05-14T14:39:02.278989+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-14/1778 /Users/lukas/.screenpipe/data/data/2026-05-14/1778769542278_m1.jpg...
|
PhpStorm
|
faVsco.js – IntegrationAppServiceTrait.php
|
1
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
#12066 on JY-20725-handle Project: faVsco.js, menu
#12066 on JY-20725-handle-HS-search-rate-limit, menu
Start Listening for PHP Debug Connections
HandleHubspotRateLimitTest
Run 'HandleHubspotRateLimitTest'
Debug 'HandleHubspotRateLimitTest'
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
declare(strict_types=1);
namespace Jiminny\Services\Crm\IntegrationApp\Jobs;
use Jiminny\Contracts\Crm\Providers;
use Jiminny\Contracts\Repositories\TeamRepository;
use Jiminny\Contracts\Services\Crm\Provider\IntegrationAppInterface;
use Jiminny\Exceptions\ApplicationException;
use Jiminny\Exceptions\CrmException;
use Jiminny\Exceptions\RuntimeException;
use Jiminny\Models\Crm\Configuration;
use Jiminny\Models\Team;
use Jiminny\Services\Crm\ProviderRegistry;
trait IntegrationAppServiceTrait
{
/**
* @throws ApplicationException
*/
private function getTeam(TeamRepository $teamRepository): Team
{
$team = $teamRepository->find($this->teamId);
if (! $team instanceof Team) {
throw new ApplicationException("Team not found: {$this->teamId}");
}
return $team;
}
/**
* @throws CrmException
*/
private function getPreparedCrmService(Team $team, ProviderRegistry $providerRegistry): IntegrationAppInterface
{
$configuration = $team->getCrmConfiguration();
if (! Providers::isIntegrationAppProvider($configuration->getProviderName())) {
// This is unlikely to happen, but better safe than sorry
throw new CrmException('Trying to bootstrap a non IntegrationApp team');
}
/** @var IntegrationAppInterface $crmService */
$crmService = $providerRegistry->get(Configuration::PROVIDER_INTEGRATION_APP);
$owner = $team->getOwner();
if ($owner === null) {
throw new RuntimeException('Owner not found');
}
$crmService->setUser($owner);
return $crmService;
}
}
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
8
1
3
4
Previous Highlighted Error
Next Highlighted Error
SELECT
# DISTINCT
opp.id as opp_id, opp.uuid, opp.name,
# COUNT(dr.id) AS deal_risk_count,
# dr.id,
# cfd.value,
usr.name AS owner_name,
opp.value, opp.currency_code, opp.close_date, opp.remotely_created_at, opp.is_closed, opp.is_won,
usr.uuid as owner_uuid,
usr.photo_path as owner_photo,
usr.id AS owner_id,
jt.name as owner_job,
opp.stage_id, opp.stage_updated_at,
acc.name AS acc_name, opp.stage_updated_at, acc.crm_provider_id AS acc_provider_id, opp.crm_provider_id AS opp_provider_id,
rt.business_process_id AS pipeline_id
FROM opportunities opp
LEFT JOIN record_types rt ON opp.record_type_id = rt.id
LEFT JOIN users usr ON opp.user_id = usr.id
LEFT JOIN accounts acc ON opp.account_id = acc.id
LEFT JOIN job_titles jt ON usr.job_title_id = jt.id
# LEFT JOIN group_deal_risk_types gdrt ON gdrt.group_id = usr.group_id
# LEFT JOIN deal_risks dr ON dr.opportunity_id = opp.id AND dr.group_deal_risk_type_id = gdrt.id
LEFT JOIN crm_field_data cfd ON (cfd.object_id = opp.id and cfd.crm_field_id = 66814)
WHERE opp.user_id IS NOT NULL
AND opp.deleted_at IS NULL
AND opp.is_closed = 1
AND opp.is_won = 0
AND opp.close_date >= '2024-01-01 00:00:00'
AND opp.close_date <= '2024-12-31 23:59:59'
AND usr.team_id = 1
# and opp.id = 4823179
GROUP BY opp.id, cfd.value
ORDER BY
# cfd.value
CAST(cfd.value AS UNSIGNED)
# owner_name
# (SELECT COUNT(dr.id)
# FROM deal_risks dr
# JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id
# WHERE dr.opportunity_id = opp.id
# AND dr.is_active = 1
# AND gdrt.is_enabled = 1)
DESC
LIMIT 25
# OFFSET 0
;
select * from crm_fields where crm_configuration_id = 1 and object_type = 'opportunity';
select * from crm_layout_entities where crm_layout_id = 1493;
SELECT * FROM opportunities WHERE id = 4584045;
SELECT * FROM crm_field_data WHERE object_id = 4584045;
SELECT * FROM opportunities where team_id = 1 and crm_provider_id = '0061K00000lfb9IQAQ'
SELECT
opp.id as opportunity_id,
opp.name,
COUNT(dr.id) as risk_count
FROM opportunities opp
LEFT JOIN deal_risks dr ON dr.opportunity_id = opp.id
WHERE opp.id IN (
6069574,8900938,9507638,9524799,9660490,9662824,9705675,9749758,4158460,4391812,6450439,4448422,5118945,5590675,4584045,7228149,9002408,9165534,9446720,9641778,9665149,9703344,9709280,5747948,4158491,6182565,6263970,5798120,5111315,4536978,6062352,6548383,6072095,6548225,4480986,5011422,6548381,8760540,8917554,9509986,9514392,9569009,9569011,9578490,9713604,5784397,7276612,7288405,8994421,9118219,9608148,9818911,4510535,6479693,5958049,6271674,6550448,4158331,4158483,6126571,6171615,6540943,4897466,5190896,5796182,5932762,8572433,8723698,8892697,9711001,9789264,4549188,6100831,6170064,6260799,6263653,6449936,6530871,6538978,7777651,8059269,8319918,8787049,8901150,9263153,9453207,9514738,9696700,9791062,5752018,6421452,7439134,7878923,9354763,9369285,9514396,9582506,9889949,9890216,4094311,4158495,4158496,6098128,5585661,3872564,6442149,5891604,6164746,6199593,6583474,6519684,9018490,9809006,4496897,5041324,5829430,6198319,6253504,6555763,7242914,7931055,8024125,8797814,8058559,8673347,8892695,8994420,9616219,9714970,9722004,9809439,9818918,6523177,8134147,9002915,9711422,9892713,9901719,9954210,9978435,5800810,6243518,6416114,6222251,6411974,6512456,5791953,6545606,9914780,5805540,6238986,6463838,6547680,9767049,9809437,9810885,9890855,6673493,9902036,4335521,6379871,6503799,6546077,8018765,9907556,9958433,9905855,9916179,9946741,9957877,5563344,6271838,6450815,7641128,7762567,7780592,8684810,8685786,8685787,8685788
)
GROUP BY opp.id;
SELECT COUNT(dr.id)
FROM deal_risks dr
JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id
WHERE dr.opportunity_id = 5563344
# AND gdrt.group_id = usr.group_id
EXPLAIN SELECT
opp.id as opp_id, opp.uuid, opp.name,
cfd.value,
cfv.sequence,
cfv.value,
# MAX(cfd.value) AS max_cfd_value,
usr.name AS owner_name,
opp.value, opp.currency_code, opp.close_date, opp.remotely_created_at, opp.is_closed, opp.is_won,
usr.uuid as owner_uuid,
usr.photo_path as owner_photo,
usr.id AS owner_id,
jt.name as owner_job,
opp.stage_id, opp.stage_updated_at,
acc.name AS acc_name, opp.stage_updated_at, acc.crm_provider_id AS acc_provider_id, opp.crm_provider_id AS opp_provider_id,
rt.business_process_id AS pipeline_id
FROM opportunities opp
LEFT JOIN record_types rt ON opp.record_type_id = rt.id
LEFT JOIN users usr ON opp.user_id = usr.id
LEFT JOIN accounts acc ON opp.account_id = acc.id
LEFT JOIN job_titles jt ON usr.job_title_id = jt.id
LEFT JOIN crm_field_data cfd ON cfd.id = (SELECT sub_cfd.id
FROM crm_field_data sub_cfd
WHERE sub_cfd.object_id = opp.id
AND sub_cfd.crm_field_id = 66810
ORDER BY sub_cfd.updated_at DESC
LIMIT 1)
LEFT JOIN crm_field_values cfv ON cfv.crm_field_id = 66810 AND cfv.value = cfd.value
WHERE opp.user_id IS NOT NULL
AND opp.deleted_at IS NULL
AND opp.is_closed = 0
# AND opp.is_closed = 1
# AND opp.is_won = 0
AND opp.close_date >= '2024-01-01 00:00:00'
AND opp.close_date <= '2024-12-31 23:59:59'
AND usr.team_id = 1
# and opp.id = 4823179
# GROUP BY opp.id
ORDER BY
cfv.sequence DESC,
# opp.name
# owner_name
cfd.value
# CAST(cfd.value AS UNSIGNED)
# CAST(MAX(cfd.value) AS UNSIGNED)
# (SELECT COUNT(dr.id)
# FROM deal_risks dr
# JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id
# WHERE dr.opportunity_id = opp.id
# AND dr.is_active = 1 AND gdrt.is_enabled = 1)
DESC
# LIMIT 75, 25
;
SELECT * FROM crm_field_values WHERE crm_field_id = 66810;
SELECT f.id, f.crm_provider_id AS field_name, f.label, fd.object_id AS dealId, fd.value, fd.updated_at, fd.id, fd.created_at
FROM crm_fields f
INNER JOIN crm_field_data fd ON fd.crm_field_id = f.id
WHERE (f.crm_configuration_id = 1)
AND (f.object_type = 'opportunity')
# AND (fd.object_id IN (4158331,4158483,4158495,4158496,6069574,6263970,6171615,6540943,6545606,5829430,6198319,6263653,6548381,7242914,8797814,7228149,7439134,7878923,8134147,9002915,9118219,9165534,9354763,9369285,9446720))
AND (fd.object_id IN (4158460))
AND (f.crm_provider_id IN ('ForecastCategoryName'))
ORDER BY fd.object_id ASC, fd.updated_at DESC;
select * from crm_layouts where crm_configuration_id = 1;
select cf.* from crm_fields cf
join crm_layout_entities cle on cf.id = cle.crm_field_id
where crm_layout_id = 1493;
SELECT * FROM opportunities WHERE id = 4158460;
SELECT * FROM crm_field_data WHERE object_id = 4158460;
select * from users where team_id = 1;
SELECT * FROM users WHERE id = 7160;
select * from role_user where user_id = 3248;
select * from crm_field_values where crm_field_id = 66824;
SELECT * FROM users WHERE id = 23470;
select * from crm_configurations;
# [PASSWORD_DOTS]
select * from teams where id = 1038; # 23521, 966
select * from users where team_id = 1038;
select * from crm_configurations where id = 966;
SELECT * FROM activities WHERE uuid_to_bin('e8dc7c34-31f6-4430-bd81-2d9d8f00dd07') = uuid; # 54965762
SELECT * FROM activities WHERE uuid_to_bin('4b5727c0-69d1-428f-b8d9-b649055166e2') = uuid; # 54965764
SELECT * FROM participants WHERE activity_id = 54965764;
SELECT id, uuid, title, recording_state FROM activities WHERE uuid_to_bin('355f105d-5606-4379-b0c5-d91daf59f4ce') = uuid; # 54964075
SELECT * FROM participants WHERE activity_id = 54964075;
select f.id, slug, title, tf.team_id from team_features tf JOIN features f on tf.feature_id = f.id
where tf.team_id = 1038;
# [PASSWORD_DOTS] PD [PASSWORD_DOTS]
select * from teams where id = 1029;
SELECT * FROM crm_configurations WHERE id = 957;
SELECT * FROM activities WHERE uuid_to_bin('581a33cb-4343-44bd-ac0c-4a5cee71c5ec') = uuid; # 54963423
SELECT * FROM activities WHERE uuid_to_bin('07238011-25fa-418e-838b-fb21e82b9ea2') = uuid; # 54963433
SELECT * FROM activities WHERE uuid_to_bin('8b6bb2f7-e7a7-4aec-8806-fbfea7093ccd') = uuid; # 54963421
# [PASSWORD_DOTS] Close [PASSWORD_DOTS]
select * from teams where id = 1031;
SELECT * FROM crm_configurations WHERE id = 959;
SELECT * FROM activities WHERE uuid_to_bin('59c517e0-96c9-4dad-bfeb-b7bef72f8725') = uuid; # 54963517
SELECT * FROM activities WHERE uuid_to_bin('07238011-25fa-418e-838b-fb21e82b9ea2') = uuid; # 54963433
SELECT * FROM activities WHERE uuid_to_bin('d68311e3-ac34-49bd-bf04-88323a7e5352') = uuid; # 54966009
# [PASSWORD_DOTS] SF [PASSWORD_DOTS]
SELECT * FROM activities WHERE uuid_to_bin('2bd4cfa3-4eb5-4c77-84a7-9ed46a21c988') = uuid;
select * from roles;
select * from permissions;
select * from permission_role where permission_id = 136;
select * from migrations order by id desc;
select * from teams where id IN (1, 1037);
select * from crm_layouts where crm_configuration_id = 1;
SELECT * FROM crm_layout_entities WHERE crm_layout_id = 1493;
SELECT * FROM crm_fields WHERE id IN (1652,1661,66799,66814,66821,66836,66843,66846,66864,84752,182306,323580,380378);
select * from features;
select * from team_features where feature_id = 33;
select * from opportunities;
select * from teams;
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 = 1052 and sa.provider = 'hubspot';
SELECT * FROM accounts where id = 11512582;
select * from activities where account_id = 11512582;
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...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"bounds":{"left":0.054166667,"top":0.027777778,"width":0.08055556,"height":0.035555556},"on_screen":true,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"#12066 on JY-20725-handle-HS-search-rate-limit, menu","depth":5,"bounds":{"left":0.13472222,"top":0.027777778,"width":0.25555557,"height":0.035555556},"on_screen":true,"help_text":"Pull request #12066 exists for current branch JY-20725-handle-HS-search-rate-limit, but local branch is out of sync with remote","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"bounds":{"left":0.6326389,"top":0.027777778,"width":0.023611112,"height":0.035555556},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"HandleHubspotRateLimitTest","depth":6,"bounds":{"left":0.6645833,"top":0.027777778,"width":0.15902779,"height":0.035555556},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run 'HandleHubspotRateLimitTest'","depth":6,"bounds":{"left":0.82361114,"top":0.027777778,"width":0.023611112,"height":0.035555556},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'HandleHubspotRateLimitTest'","depth":6,"bounds":{"left":0.8472222,"top":0.027777778,"width":0.023611112,"height":0.035555556},"on_screen":true,"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.87083334,"top":0.027777778,"width":0.023611112,"height":0.035555556},"on_screen":true,"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.9291667,"top":0.027777778,"width":0.023611112,"height":0.035555556},"on_screen":true,"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.9527778,"top":0.027777778,"width":0.023611112,"height":0.035555556},"on_screen":true,"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.9763889,"top":0.027777778,"width":0.023611112,"height":0.035555556},"on_screen":true,"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},"on_screen":false,"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},"on_screen":false,"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},"on_screen":false,"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},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"2","depth":4,"bounds":{"left":0.80138886,"top":0.3122222,"width":0.016666668,"height":0.02111111},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.8215278,"top":0.31,"width":0.015277778,"height":0.025555555},"on_screen":true,"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.8368056,"top":0.31,"width":0.014583333,"height":0.025555555},"on_screen":true,"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\\IntegrationApp\\Jobs;\n\nuse Jiminny\\Contracts\\Crm\\Providers;\nuse Jiminny\\Contracts\\Repositories\\TeamRepository;\nuse Jiminny\\Contracts\\Services\\Crm\\Provider\\IntegrationAppInterface;\nuse Jiminny\\Exceptions\\ApplicationException;\nuse Jiminny\\Exceptions\\CrmException;\nuse Jiminny\\Exceptions\\RuntimeException;\nuse Jiminny\\Models\\Crm\\Configuration;\nuse Jiminny\\Models\\Team;\nuse Jiminny\\Services\\Crm\\ProviderRegistry;\n\ntrait IntegrationAppServiceTrait\n{\n /**\n * @throws ApplicationException\n */\n private function getTeam(TeamRepository $teamRepository): Team\n {\n $team = $teamRepository->find($this->teamId);\n if (! $team instanceof Team) {\n throw new ApplicationException(\"Team not found: {$this->teamId}\");\n }\n\n return $team;\n }\n\n /**\n * @throws CrmException\n */\n private function getPreparedCrmService(Team $team, ProviderRegistry $providerRegistry): IntegrationAppInterface\n {\n $configuration = $team->getCrmConfiguration();\n if (! Providers::isIntegrationAppProvider($configuration->getProviderName())) {\n // This is unlikely to happen, but better safe than sorry\n throw new CrmException('Trying to bootstrap a non IntegrationApp team');\n }\n\n /** @var IntegrationAppInterface $crmService */\n $crmService = $providerRegistry->get(Configuration::PROVIDER_INTEGRATION_APP);\n $owner = $team->getOwner();\n if ($owner === null) {\n throw new RuntimeException('Owner not found');\n }\n $crmService->setUser($owner);\n\n return $crmService;\n }\n}","depth":4,"bounds":{"left":0.25,"top":0.3077778,"width":0.66597223,"height":0.6844444},"on_screen":true,"value":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Services\\Crm\\IntegrationApp\\Jobs;\n\nuse Jiminny\\Contracts\\Crm\\Providers;\nuse Jiminny\\Contracts\\Repositories\\TeamRepository;\nuse Jiminny\\Contracts\\Services\\Crm\\Provider\\IntegrationAppInterface;\nuse Jiminny\\Exceptions\\ApplicationException;\nuse Jiminny\\Exceptions\\CrmException;\nuse Jiminny\\Exceptions\\RuntimeException;\nuse Jiminny\\Models\\Crm\\Configuration;\nuse Jiminny\\Models\\Team;\nuse Jiminny\\Services\\Crm\\ProviderRegistry;\n\ntrait IntegrationAppServiceTrait\n{\n /**\n * @throws ApplicationException\n */\n private function getTeam(TeamRepository $teamRepository): Team\n {\n $team = $teamRepository->find($this->teamId);\n if (! $team instanceof Team) {\n throw new ApplicationException(\"Team not found: {$this->teamId}\");\n }\n\n return $team;\n }\n\n /**\n * @throws CrmException\n */\n private function getPreparedCrmService(Team $team, ProviderRegistry $providerRegistry): IntegrationAppInterface\n {\n $configuration = $team->getCrmConfiguration();\n if (! Providers::isIntegrationAppProvider($configuration->getProviderName())) {\n // This is unlikely to happen, but better safe than sorry\n throw new CrmException('Trying to bootstrap a non IntegrationApp team');\n }\n\n /** @var IntegrationAppInterface $crmService */\n $crmService = $providerRegistry->get(Configuration::PROVIDER_INTEGRATION_APP);\n $owner = $team->getOwner();\n if ($owner === null) {\n throw new RuntimeException('Owner not found');\n }\n $crmService->setUser($owner);\n\n return $crmService;\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.85486114,"top":0.31,"width":0.018055556,"height":0.026666667},"on_screen":true,"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.87291664,"top":0.31,"width":0.018055556,"height":0.026666667},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Browse Query History","depth":4,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"View Parameters","depth":4,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Open Query Execution Settings…","depth":4,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"In-Editor Results","depth":4,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Tx: Auto","depth":4,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Cancel Running Statements","depth":4,"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Playground","depth":4,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"jiminny","depth":4,"bounds":{"left":0.9138889,"top":0.31,"width":0.059027776,"height":0.026666667},"on_screen":true,"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},"on_screen":false,"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},"on_screen":false,"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},"on_screen":false,"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},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"8","depth":4,"bounds":{"left":0.8645833,"top":0.34444445,"width":0.016666668,"height":0.02111111},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"1","depth":4,"bounds":{"left":0.8854167,"top":0.34444445,"width":0.015277778,"height":0.02111111},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"3","depth":4,"bounds":{"left":0.9048611,"top":0.34444445,"width":0.016666668,"height":0.02111111},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"4","depth":4,"bounds":{"left":0.92569447,"top":0.34444445,"width":0.016666668,"height":0.02111111},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.9458333,"top":0.3422222,"width":0.015277778,"height":0.025555555},"on_screen":true,"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.9611111,"top":0.3422222,"width":0.014583333,"height":0.025555555},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"SELECT\n# DISTINCT\nopp.id as opp_id, opp.uuid, opp.name,\n# COUNT(dr.id) AS deal_risk_count,\n\n# dr.id,\n# cfd.value,\nusr.name AS owner_name,\nopp.value, opp.currency_code, opp.close_date, opp.remotely_created_at, opp.is_closed, opp.is_won,\nusr.uuid as owner_uuid,\nusr.photo_path as owner_photo,\nusr.id AS owner_id,\njt.name as owner_job,\nopp.stage_id, opp.stage_updated_at,\nacc.name AS acc_name, opp.stage_updated_at, acc.crm_provider_id AS acc_provider_id, opp.crm_provider_id AS opp_provider_id,\nrt.business_process_id AS pipeline_id\nFROM opportunities opp\nLEFT JOIN record_types rt ON opp.record_type_id = rt.id\nLEFT JOIN users usr ON opp.user_id = usr.id\nLEFT JOIN accounts acc ON opp.account_id = acc.id\nLEFT JOIN job_titles jt ON usr.job_title_id = jt.id\n\n# LEFT JOIN group_deal_risk_types gdrt ON gdrt.group_id = usr.group_id\n# LEFT JOIN deal_risks dr ON dr.opportunity_id = opp.id AND dr.group_deal_risk_type_id = gdrt.id\n\nLEFT JOIN crm_field_data cfd ON (cfd.object_id = opp.id and cfd.crm_field_id = 66814)\n\nWHERE opp.user_id IS NOT NULL\nAND opp.deleted_at IS NULL\nAND opp.is_closed = 1\nAND opp.is_won = 0\nAND opp.close_date >= '2024-01-01 00:00:00'\nAND opp.close_date <= '2024-12-31 23:59:59'\nAND usr.team_id = 1\n\n# and opp.id = 4823179\n\nGROUP BY opp.id, cfd.value\nORDER BY\n# cfd.value\n CAST(cfd.value AS UNSIGNED)\n# owner_name\n# (SELECT COUNT(dr.id)\n# FROM deal_risks dr\n# JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id\n# WHERE dr.opportunity_id = opp.id\n# AND dr.is_active = 1\n# AND gdrt.is_enabled = 1)\nDESC\nLIMIT 25\n# OFFSET 0\n;\n\nselect * from crm_fields where crm_configuration_id = 1 and object_type = 'opportunity';\nselect * from crm_layout_entities where crm_layout_id = 1493;\n\nSELECT * FROM opportunities WHERE id = 4584045;\nSELECT * FROM crm_field_data WHERE object_id = 4584045;\n\nSELECT * FROM opportunities where team_id = 1 and crm_provider_id = '0061K00000lfb9IQAQ'\n\nSELECT\n opp.id as opportunity_id,\n opp.name,\n COUNT(dr.id) as risk_count\nFROM opportunities opp\nLEFT JOIN deal_risks dr ON dr.opportunity_id = opp.id\nWHERE opp.id IN (\n 6069574,8900938,9507638,9524799,9660490,9662824,9705675,9749758,4158460,4391812,6450439,4448422,5118945,5590675,4584045,7228149,9002408,9165534,9446720,9641778,9665149,9703344,9709280,5747948,4158491,6182565,6263970,5798120,5111315,4536978,6062352,6548383,6072095,6548225,4480986,5011422,6548381,8760540,8917554,9509986,9514392,9569009,9569011,9578490,9713604,5784397,7276612,7288405,8994421,9118219,9608148,9818911,4510535,6479693,5958049,6271674,6550448,4158331,4158483,6126571,6171615,6540943,4897466,5190896,5796182,5932762,8572433,8723698,8892697,9711001,9789264,4549188,6100831,6170064,6260799,6263653,6449936,6530871,6538978,7777651,8059269,8319918,8787049,8901150,9263153,9453207,9514738,9696700,9791062,5752018,6421452,7439134,7878923,9354763,9369285,9514396,9582506,9889949,9890216,4094311,4158495,4158496,6098128,5585661,3872564,6442149,5891604,6164746,6199593,6583474,6519684,9018490,9809006,4496897,5041324,5829430,6198319,6253504,6555763,7242914,7931055,8024125,8797814,8058559,8673347,8892695,8994420,9616219,9714970,9722004,9809439,9818918,6523177,8134147,9002915,9711422,9892713,9901719,9954210,9978435,5800810,6243518,6416114,6222251,6411974,6512456,5791953,6545606,9914780,5805540,6238986,6463838,6547680,9767049,9809437,9810885,9890855,6673493,9902036,4335521,6379871,6503799,6546077,8018765,9907556,9958433,9905855,9916179,9946741,9957877,5563344,6271838,6450815,7641128,7762567,7780592,8684810,8685786,8685787,8685788\n)\nGROUP BY opp.id;\n\nSELECT COUNT(dr.id)\n FROM deal_risks dr\n JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id\n WHERE dr.opportunity_id = 5563344\n# AND gdrt.group_id = usr.group_id\n\n\n\nEXPLAIN SELECT\n opp.id as opp_id, opp.uuid, opp.name,\n\ncfd.value,\ncfv.sequence,\ncfv.value,\n# MAX(cfd.value) AS max_cfd_value,\nusr.name AS owner_name,\nopp.value, opp.currency_code, opp.close_date, opp.remotely_created_at, opp.is_closed, opp.is_won,\nusr.uuid as owner_uuid,\nusr.photo_path as owner_photo,\nusr.id AS owner_id,\njt.name as owner_job,\nopp.stage_id, opp.stage_updated_at,\nacc.name AS acc_name, opp.stage_updated_at, acc.crm_provider_id AS acc_provider_id, opp.crm_provider_id AS opp_provider_id,\nrt.business_process_id AS pipeline_id\nFROM opportunities opp\n\nLEFT JOIN record_types rt ON opp.record_type_id = rt.id\nLEFT JOIN users usr ON opp.user_id = usr.id\nLEFT JOIN accounts acc ON opp.account_id = acc.id\nLEFT JOIN job_titles jt ON usr.job_title_id = jt.id\n\nLEFT JOIN crm_field_data cfd ON cfd.id = (SELECT sub_cfd.id\n FROM crm_field_data sub_cfd\n WHERE sub_cfd.object_id = opp.id\n AND sub_cfd.crm_field_id = 66810\n ORDER BY sub_cfd.updated_at DESC\n LIMIT 1)\n\nLEFT JOIN crm_field_values cfv ON cfv.crm_field_id = 66810 AND cfv.value = cfd.value\n\nWHERE opp.user_id IS NOT NULL\nAND opp.deleted_at IS NULL\nAND opp.is_closed = 0\n# AND opp.is_closed = 1\n# AND opp.is_won = 0\nAND opp.close_date >= '2024-01-01 00:00:00'\nAND opp.close_date <= '2024-12-31 23:59:59'\nAND usr.team_id = 1\n\n# and opp.id = 4823179\n\n# GROUP BY opp.id\nORDER BY\n cfv.sequence DESC,\n# opp.name\n# owner_name\n cfd.value\n# CAST(cfd.value AS UNSIGNED)\n# CAST(MAX(cfd.value) AS UNSIGNED)\n# (SELECT COUNT(dr.id)\n# FROM deal_risks dr\n# JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id\n# WHERE dr.opportunity_id = opp.id\n# AND dr.is_active = 1 AND gdrt.is_enabled = 1)\nDESC\n# LIMIT 75, 25\n;\n\n\n\nSELECT * FROM crm_field_values WHERE crm_field_id = 66810;\n\nSELECT f.id, f.crm_provider_id AS field_name, f.label, fd.object_id AS dealId, fd.value, fd.updated_at, fd.id, fd.created_at\nFROM crm_fields f\nINNER JOIN crm_field_data fd ON fd.crm_field_id = f.id\n WHERE (f.crm_configuration_id = 1)\n AND (f.object_type = 'opportunity')\n# AND (fd.object_id IN (4158331,4158483,4158495,4158496,6069574,6263970,6171615,6540943,6545606,5829430,6198319,6263653,6548381,7242914,8797814,7228149,7439134,7878923,8134147,9002915,9118219,9165534,9354763,9369285,9446720))\n AND (fd.object_id IN (4158460))\n AND (f.crm_provider_id IN ('ForecastCategoryName'))\n ORDER BY fd.object_id ASC, fd.updated_at DESC;\n\nselect * from crm_layouts where crm_configuration_id = 1;\nselect cf.* from crm_fields cf\njoin crm_layout_entities cle on cf.id = cle.crm_field_id\nwhere crm_layout_id = 1493;\n\nSELECT * FROM opportunities WHERE id = 4158460;\nSELECT * FROM crm_field_data WHERE object_id = 4158460;\n\nselect * from users where team_id = 1;\nSELECT * FROM users WHERE id = 7160;\nselect * from role_user where user_id = 3248;\n\nselect * from crm_field_values where crm_field_id = 66824;\n\nSELECT * FROM users WHERE id = 23470;\nselect * from crm_configurations;\n\n# ******************************************\nselect * from teams where id = 1038; # 23521, 966\nselect * from users where team_id = 1038;\nselect * from crm_configurations where id = 966;\nSELECT * FROM activities WHERE uuid_to_bin('e8dc7c34-31f6-4430-bd81-2d9d8f00dd07') = uuid; # 54965762\nSELECT * FROM activities WHERE uuid_to_bin('4b5727c0-69d1-428f-b8d9-b649055166e2') = uuid; # 54965764\nSELECT * FROM participants WHERE activity_id = 54965764;\n\nSELECT id, uuid, title, recording_state FROM activities WHERE uuid_to_bin('355f105d-5606-4379-b0c5-d91daf59f4ce') = uuid; # 54964075\nSELECT * FROM participants WHERE activity_id = 54964075;\nselect f.id, slug, title, tf.team_id from team_features tf JOIN features f on tf.feature_id = f.id\n where tf.team_id = 1038;\n\n\n# ****************************************** PD *************************\nselect * from teams where id = 1029;\nSELECT * FROM crm_configurations WHERE id = 957;\nSELECT * FROM activities WHERE uuid_to_bin('581a33cb-4343-44bd-ac0c-4a5cee71c5ec') = uuid; # 54963423\nSELECT * FROM activities WHERE uuid_to_bin('07238011-25fa-418e-838b-fb21e82b9ea2') = uuid; # 54963433\n\nSELECT * FROM activities WHERE uuid_to_bin('8b6bb2f7-e7a7-4aec-8806-fbfea7093ccd') = uuid; # 54963421\n\n# ****************************************** Close *************************\nselect * from teams where id = 1031;\nSELECT * FROM crm_configurations WHERE id = 959;\nSELECT * FROM activities WHERE uuid_to_bin('59c517e0-96c9-4dad-bfeb-b7bef72f8725') = uuid; # 54963517\n\n\nSELECT * FROM activities WHERE uuid_to_bin('07238011-25fa-418e-838b-fb21e82b9ea2') = uuid; # 54963433\n\nSELECT * FROM activities WHERE uuid_to_bin('d68311e3-ac34-49bd-bf04-88323a7e5352') = uuid; # 54966009\n\n# ****************************************** SF *************************\nSELECT * FROM activities WHERE uuid_to_bin('2bd4cfa3-4eb5-4c77-84a7-9ed46a21c988') = uuid;\n\nselect * from roles;\nselect * from permissions;\nselect * from permission_role where permission_id = 136;\n\nselect * from migrations order by id desc;\n\nselect * from teams where id IN (1, 1037);\nselect * from crm_layouts where crm_configuration_id = 1;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1493;\nSELECT * FROM crm_fields WHERE id IN (1652,1661,66799,66814,66821,66836,66843,66846,66864,84752,182306,323580,380378);\n\nselect * from features;\nselect * from team_features where feature_id = 33;\nselect * from opportunities;\n\nselect * from teams;\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 = 1052 and sa.provider = 'hubspot';\n\nSELECT * FROM accounts where id = 11512582;\nselect * from activities where account_id = 11512582;","depth":4,"on_screen":true,"value":"SELECT\n# DISTINCT\nopp.id as opp_id, opp.uuid, opp.name,\n# COUNT(dr.id) AS deal_risk_count,\n\n# dr.id,\n# cfd.value,\nusr.name AS owner_name,\nopp.value, opp.currency_code, opp.close_date, opp.remotely_created_at, opp.is_closed, opp.is_won,\nusr.uuid as owner_uuid,\nusr.photo_path as owner_photo,\nusr.id AS owner_id,\njt.name as owner_job,\nopp.stage_id, opp.stage_updated_at,\nacc.name AS acc_name, opp.stage_updated_at, acc.crm_provider_id AS acc_provider_id, opp.crm_provider_id AS opp_provider_id,\nrt.business_process_id AS pipeline_id\nFROM opportunities opp\nLEFT JOIN record_types rt ON opp.record_type_id = rt.id\nLEFT JOIN users usr ON opp.user_id = usr.id\nLEFT JOIN accounts acc ON opp.account_id = acc.id\nLEFT JOIN job_titles jt ON usr.job_title_id = jt.id\n\n# LEFT JOIN group_deal_risk_types gdrt ON gdrt.group_id = usr.group_id\n# LEFT JOIN deal_risks dr ON dr.opportunity_id = opp.id AND dr.group_deal_risk_type_id = gdrt.id\n\nLEFT JOIN crm_field_data cfd ON (cfd.object_id = opp.id and cfd.crm_field_id = 66814)\n\nWHERE opp.user_id IS NOT NULL\nAND opp.deleted_at IS NULL\nAND opp.is_closed = 1\nAND opp.is_won = 0\nAND opp.close_date >= '2024-01-01 00:00:00'\nAND opp.close_date <= '2024-12-31 23:59:59'\nAND usr.team_id = 1\n\n# and opp.id = 4823179\n\nGROUP BY opp.id, cfd.value\nORDER BY\n# cfd.value\n CAST(cfd.value AS UNSIGNED)\n# owner_name\n# (SELECT COUNT(dr.id)\n# FROM deal_risks dr\n# JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id\n# WHERE dr.opportunity_id = opp.id\n# AND dr.is_active = 1\n# AND gdrt.is_enabled = 1)\nDESC\nLIMIT 25\n# OFFSET 0\n;\n\nselect * from crm_fields where crm_configuration_id = 1 and object_type = 'opportunity';\nselect * from crm_layout_entities where crm_layout_id = 1493;\n\nSELECT * FROM opportunities WHERE id = 4584045;\nSELECT * FROM crm_field_data WHERE object_id = 4584045;\n\nSELECT * FROM opportunities where team_id = 1 and crm_provider_id = '0061K00000lfb9IQAQ'\n\nSELECT\n opp.id as opportunity_id,\n opp.name,\n COUNT(dr.id) as risk_count\nFROM opportunities opp\nLEFT JOIN deal_risks dr ON dr.opportunity_id = opp.id\nWHERE opp.id IN (\n 6069574,8900938,9507638,9524799,9660490,9662824,9705675,9749758,4158460,4391812,6450439,4448422,5118945,5590675,4584045,7228149,9002408,9165534,9446720,9641778,9665149,9703344,9709280,5747948,4158491,6182565,6263970,5798120,5111315,4536978,6062352,6548383,6072095,6548225,4480986,5011422,6548381,8760540,8917554,9509986,9514392,9569009,9569011,9578490,9713604,5784397,7276612,7288405,8994421,9118219,9608148,9818911,4510535,6479693,5958049,6271674,6550448,4158331,4158483,6126571,6171615,6540943,4897466,5190896,5796182,5932762,8572433,8723698,8892697,9711001,9789264,4549188,6100831,6170064,6260799,6263653,6449936,6530871,6538978,7777651,8059269,8319918,8787049,8901150,9263153,9453207,9514738,9696700,9791062,5752018,6421452,7439134,7878923,9354763,9369285,9514396,9582506,9889949,9890216,4094311,4158495,4158496,6098128,5585661,3872564,6442149,5891604,6164746,6199593,6583474,6519684,9018490,9809006,4496897,5041324,5829430,6198319,6253504,6555763,7242914,7931055,8024125,8797814,8058559,8673347,8892695,8994420,9616219,9714970,9722004,9809439,9818918,6523177,8134147,9002915,9711422,9892713,9901719,9954210,9978435,5800810,6243518,6416114,6222251,6411974,6512456,5791953,6545606,9914780,5805540,6238986,6463838,6547680,9767049,9809437,9810885,9890855,6673493,9902036,4335521,6379871,6503799,6546077,8018765,9907556,9958433,9905855,9916179,9946741,9957877,5563344,6271838,6450815,7641128,7762567,7780592,8684810,8685786,8685787,8685788\n)\nGROUP BY opp.id;\n\nSELECT COUNT(dr.id)\n FROM deal_risks dr\n JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id\n WHERE dr.opportunity_id = 5563344\n# AND gdrt.group_id = usr.group_id\n\n\n\nEXPLAIN SELECT\n opp.id as opp_id, opp.uuid, opp.name,\n\ncfd.value,\ncfv.sequence,\ncfv.value,\n# MAX(cfd.value) AS max_cfd_value,\nusr.name AS owner_name,\nopp.value, opp.currency_code, opp.close_date, opp.remotely_created_at, opp.is_closed, opp.is_won,\nusr.uuid as owner_uuid,\nusr.photo_path as owner_photo,\nusr.id AS owner_id,\njt.name as owner_job,\nopp.stage_id, opp.stage_updated_at,\nacc.name AS acc_name, opp.stage_updated_at, acc.crm_provider_id AS acc_provider_id, opp.crm_provider_id AS opp_provider_id,\nrt.business_process_id AS pipeline_id\nFROM opportunities opp\n\nLEFT JOIN record_types rt ON opp.record_type_id = rt.id\nLEFT JOIN users usr ON opp.user_id = usr.id\nLEFT JOIN accounts acc ON opp.account_id = acc.id\nLEFT JOIN job_titles jt ON usr.job_title_id = jt.id\n\nLEFT JOIN crm_field_data cfd ON cfd.id = (SELECT sub_cfd.id\n FROM crm_field_data sub_cfd\n WHERE sub_cfd.object_id = opp.id\n AND sub_cfd.crm_field_id = 66810\n ORDER BY sub_cfd.updated_at DESC\n LIMIT 1)\n\nLEFT JOIN crm_field_values cfv ON cfv.crm_field_id = 66810 AND cfv.value = cfd.value\n\nWHERE opp.user_id IS NOT NULL\nAND opp.deleted_at IS NULL\nAND opp.is_closed = 0\n# AND opp.is_closed = 1\n# AND opp.is_won = 0\nAND opp.close_date >= '2024-01-01 00:00:00'\nAND opp.close_date <= '2024-12-31 23:59:59'\nAND usr.team_id = 1\n\n# and opp.id = 4823179\n\n# GROUP BY opp.id\nORDER BY\n cfv.sequence DESC,\n# opp.name\n# owner_name\n cfd.value\n# CAST(cfd.value AS UNSIGNED)\n# CAST(MAX(cfd.value) AS UNSIGNED)\n# (SELECT COUNT(dr.id)\n# FROM deal_risks dr\n# JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id\n# WHERE dr.opportunity_id = opp.id\n# AND dr.is_active = 1 AND gdrt.is_enabled = 1)\nDESC\n# LIMIT 75, 25\n;\n\n\n\nSELECT * FROM crm_field_values WHERE crm_field_id = 66810;\n\nSELECT f.id, f.crm_provider_id AS field_name, f.label, fd.object_id AS dealId, fd.value, fd.updated_at, fd.id, fd.created_at\nFROM crm_fields f\nINNER JOIN crm_field_data fd ON fd.crm_field_id = f.id\n WHERE (f.crm_configuration_id = 1)\n AND (f.object_type = 'opportunity')\n# AND (fd.object_id IN (4158331,4158483,4158495,4158496,6069574,6263970,6171615,6540943,6545606,5829430,6198319,6263653,6548381,7242914,8797814,7228149,7439134,7878923,8134147,9002915,9118219,9165534,9354763,9369285,9446720))\n AND (fd.object_id IN (4158460))\n AND (f.crm_provider_id IN ('ForecastCategoryName'))\n ORDER BY fd.object_id ASC, fd.updated_at DESC;\n\nselect * from crm_layouts where crm_configuration_id = 1;\nselect cf.* from crm_fields cf\njoin crm_layout_entities cle on cf.id = cle.crm_field_id\nwhere crm_layout_id = 1493;\n\nSELECT * FROM opportunities WHERE id = 4158460;\nSELECT * FROM crm_field_data WHERE object_id = 4158460;\n\nselect * from users where team_id = 1;\nSELECT * FROM users WHERE id = 7160;\nselect * from role_user where user_id = 3248;\n\nselect * from crm_field_values where crm_field_id = 66824;\n\nSELECT * FROM users WHERE id = 23470;\nselect * from crm_configurations;\n\n# ******************************************\nselect * from teams where id = 1038; # 23521, 966\nselect * from users where team_id = 1038;\nselect * from crm_configurations where id = 966;\nSELECT * FROM activities WHERE uuid_to_bin('e8dc7c34-31f6-4430-bd81-2d9d8f00dd07') = uuid; # 54965762\nSELECT * FROM activities WHERE uuid_to_bin('4b5727c0-69d1-428f-b8d9-b649055166e2') = uuid; # 54965764\nSELECT * FROM participants WHERE activity_id = 54965764;\n\nSELECT id, uuid, title, recording_state FROM activities WHERE uuid_to_bin('355f105d-5606-4379-b0c5-d91daf59f4ce') = uuid; # 54964075\nSELECT * FROM participants WHERE activity_id = 54964075;\nselect f.id, slug, title, tf.team_id from team_features tf JOIN features f on tf.feature_id = f.id\n where tf.team_id = 1038;\n\n\n# ****************************************** PD *************************\nselect * from teams where id = 1029;\nSELECT * FROM crm_configurations WHERE id = 957;\nSELECT * FROM activities WHERE uuid_to_bin('581a33cb-4343-44bd-ac0c-4a5cee71c5ec') = uuid; # 54963423\nSELECT * FROM activities WHERE uuid_to_bin('07238011-25fa-418e-838b-fb21e82b9ea2') = uuid; # 54963433\n\nSELECT * FROM activities WHERE uuid_to_bin('8b6bb2f7-e7a7-4aec-8806-fbfea7093ccd') = uuid; # 54963421\n\n# ****************************************** Close *************************\nselect * from teams where id = 1031;\nSELECT * FROM crm_configurations WHERE id = 959;\nSELECT * FROM activities WHERE uuid_to_bin('59c517e0-96c9-4dad-bfeb-b7bef72f8725') = uuid; # 54963517\n\n\nSELECT * FROM activities WHERE uuid_to_bin('07238011-25fa-418e-838b-fb21e82b9ea2') = uuid; # 54963433\n\nSELECT * FROM activities WHERE uuid_to_bin('d68311e3-ac34-49bd-bf04-88323a7e5352') = uuid; # 54966009\n\n# ****************************************** SF *************************\nSELECT * FROM activities WHERE uuid_to_bin('2bd4cfa3-4eb5-4c77-84a7-9ed46a21c988') = uuid;\n\nselect * from roles;\nselect * from permissions;\nselect * from permission_role where permission_id = 136;\n\nselect * from migrations order by id desc;\n\nselect * from teams where id IN (1, 1037);\nselect * from crm_layouts where crm_configuration_id = 1;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1493;\nSELECT * FROM crm_fields WHERE id IN (1652,1661,66799,66814,66821,66836,66843,66846,66864,84752,182306,323580,380378);\n\nselect * from features;\nselect * from team_features where feature_id = 33;\nselect * from opportunities;\n\nselect * from teams;\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 = 1052 and sa.provider = 'hubspot';\n\nSELECT * FROM accounts where id = 11512582;\nselect * from activities where account_id = 11512582;","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Project","depth":3,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Project","depth":3,"bounds":{"left":0.025,"top":0.06666667,"width":0.050694443,"height":0.034444444},"on_screen":true,"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.10625,"top":0.07,"width":0.018055556,"height":0.026666667},"on_screen":true,"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.12916666,"top":0.07,"width":0.018055556,"height":0.026666667},"on_screen":true,"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.14722222,"top":0.07,"width":0.018055556,"height":0.026666667},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Options","depth":4,"bounds":{"left":0.16527778,"top":0.07,"width":0.018055556,"height":0.026666667},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.18333334,"top":0.07,"width":0.018055556,"height":0.026666667},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"app ~/jiminny/app","depth":6,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":".circleci","depth":7,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":".cursor","depth":7,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":".github","depth":7,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":".sonarlint","depth":7,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":".vscode","depth":7,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":".windsurf","depth":7,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"app, sources root","depth":7,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Actions","depth":8,"on_screen":false,"role_description":"text"}]...
|
-5036976055473061001
|
6398098426737930845
|
click
|
accessibility
|
NULL
|
Project: faVsco.js, menu
#12066 on JY-20725-handle Project: faVsco.js, menu
#12066 on JY-20725-handle-HS-search-rate-limit, menu
Start Listening for PHP Debug Connections
HandleHubspotRateLimitTest
Run 'HandleHubspotRateLimitTest'
Debug 'HandleHubspotRateLimitTest'
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
declare(strict_types=1);
namespace Jiminny\Services\Crm\IntegrationApp\Jobs;
use Jiminny\Contracts\Crm\Providers;
use Jiminny\Contracts\Repositories\TeamRepository;
use Jiminny\Contracts\Services\Crm\Provider\IntegrationAppInterface;
use Jiminny\Exceptions\ApplicationException;
use Jiminny\Exceptions\CrmException;
use Jiminny\Exceptions\RuntimeException;
use Jiminny\Models\Crm\Configuration;
use Jiminny\Models\Team;
use Jiminny\Services\Crm\ProviderRegistry;
trait IntegrationAppServiceTrait
{
/**
* @throws ApplicationException
*/
private function getTeam(TeamRepository $teamRepository): Team
{
$team = $teamRepository->find($this->teamId);
if (! $team instanceof Team) {
throw new ApplicationException("Team not found: {$this->teamId}");
}
return $team;
}
/**
* @throws CrmException
*/
private function getPreparedCrmService(Team $team, ProviderRegistry $providerRegistry): IntegrationAppInterface
{
$configuration = $team->getCrmConfiguration();
if (! Providers::isIntegrationAppProvider($configuration->getProviderName())) {
// This is unlikely to happen, but better safe than sorry
throw new CrmException('Trying to bootstrap a non IntegrationApp team');
}
/** @var IntegrationAppInterface $crmService */
$crmService = $providerRegistry->get(Configuration::PROVIDER_INTEGRATION_APP);
$owner = $team->getOwner();
if ($owner === null) {
throw new RuntimeException('Owner not found');
}
$crmService->setUser($owner);
return $crmService;
}
}
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
8
1
3
4
Previous Highlighted Error
Next Highlighted Error
SELECT
# DISTINCT
opp.id as opp_id, opp.uuid, opp.name,
# COUNT(dr.id) AS deal_risk_count,
# dr.id,
# cfd.value,
usr.name AS owner_name,
opp.value, opp.currency_code, opp.close_date, opp.remotely_created_at, opp.is_closed, opp.is_won,
usr.uuid as owner_uuid,
usr.photo_path as owner_photo,
usr.id AS owner_id,
jt.name as owner_job,
opp.stage_id, opp.stage_updated_at,
acc.name AS acc_name, opp.stage_updated_at, acc.crm_provider_id AS acc_provider_id, opp.crm_provider_id AS opp_provider_id,
rt.business_process_id AS pipeline_id
FROM opportunities opp
LEFT JOIN record_types rt ON opp.record_type_id = rt.id
LEFT JOIN users usr ON opp.user_id = usr.id
LEFT JOIN accounts acc ON opp.account_id = acc.id
LEFT JOIN job_titles jt ON usr.job_title_id = jt.id
# LEFT JOIN group_deal_risk_types gdrt ON gdrt.group_id = usr.group_id
# LEFT JOIN deal_risks dr ON dr.opportunity_id = opp.id AND dr.group_deal_risk_type_id = gdrt.id
LEFT JOIN crm_field_data cfd ON (cfd.object_id = opp.id and cfd.crm_field_id = 66814)
WHERE opp.user_id IS NOT NULL
AND opp.deleted_at IS NULL
AND opp.is_closed = 1
AND opp.is_won = 0
AND opp.close_date >= '2024-01-01 00:00:00'
AND opp.close_date <= '2024-12-31 23:59:59'
AND usr.team_id = 1
# and opp.id = 4823179
GROUP BY opp.id, cfd.value
ORDER BY
# cfd.value
CAST(cfd.value AS UNSIGNED)
# owner_name
# (SELECT COUNT(dr.id)
# FROM deal_risks dr
# JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id
# WHERE dr.opportunity_id = opp.id
# AND dr.is_active = 1
# AND gdrt.is_enabled = 1)
DESC
LIMIT 25
# OFFSET 0
;
select * from crm_fields where crm_configuration_id = 1 and object_type = 'opportunity';
select * from crm_layout_entities where crm_layout_id = 1493;
SELECT * FROM opportunities WHERE id = 4584045;
SELECT * FROM crm_field_data WHERE object_id = 4584045;
SELECT * FROM opportunities where team_id = 1 and crm_provider_id = '0061K00000lfb9IQAQ'
SELECT
opp.id as opportunity_id,
opp.name,
COUNT(dr.id) as risk_count
FROM opportunities opp
LEFT JOIN deal_risks dr ON dr.opportunity_id = opp.id
WHERE opp.id IN (
6069574,8900938,9507638,9524799,9660490,9662824,9705675,9749758,4158460,4391812,6450439,4448422,5118945,5590675,4584045,7228149,9002408,9165534,9446720,9641778,9665149,9703344,9709280,5747948,4158491,6182565,6263970,5798120,5111315,4536978,6062352,6548383,6072095,6548225,4480986,5011422,6548381,8760540,8917554,9509986,9514392,9569009,9569011,9578490,9713604,5784397,7276612,7288405,8994421,9118219,9608148,9818911,4510535,6479693,5958049,6271674,6550448,4158331,4158483,6126571,6171615,6540943,4897466,5190896,5796182,5932762,8572433,8723698,8892697,9711001,9789264,4549188,6100831,6170064,6260799,6263653,6449936,6530871,6538978,7777651,8059269,8319918,8787049,8901150,9263153,9453207,9514738,9696700,9791062,5752018,6421452,7439134,7878923,9354763,9369285,9514396,9582506,9889949,9890216,4094311,4158495,4158496,6098128,5585661,3872564,6442149,5891604,6164746,6199593,6583474,6519684,9018490,9809006,4496897,5041324,5829430,6198319,6253504,6555763,7242914,7931055,8024125,8797814,8058559,8673347,8892695,8994420,9616219,9714970,9722004,9809439,9818918,6523177,8134147,9002915,9711422,9892713,9901719,9954210,9978435,5800810,6243518,6416114,6222251,6411974,6512456,5791953,6545606,9914780,5805540,6238986,6463838,6547680,9767049,9809437,9810885,9890855,6673493,9902036,4335521,6379871,6503799,6546077,8018765,9907556,9958433,9905855,9916179,9946741,9957877,5563344,6271838,6450815,7641128,7762567,7780592,8684810,8685786,8685787,8685788
)
GROUP BY opp.id;
SELECT COUNT(dr.id)
FROM deal_risks dr
JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id
WHERE dr.opportunity_id = 5563344
# AND gdrt.group_id = usr.group_id
EXPLAIN SELECT
opp.id as opp_id, opp.uuid, opp.name,
cfd.value,
cfv.sequence,
cfv.value,
# MAX(cfd.value) AS max_cfd_value,
usr.name AS owner_name,
opp.value, opp.currency_code, opp.close_date, opp.remotely_created_at, opp.is_closed, opp.is_won,
usr.uuid as owner_uuid,
usr.photo_path as owner_photo,
usr.id AS owner_id,
jt.name as owner_job,
opp.stage_id, opp.stage_updated_at,
acc.name AS acc_name, opp.stage_updated_at, acc.crm_provider_id AS acc_provider_id, opp.crm_provider_id AS opp_provider_id,
rt.business_process_id AS pipeline_id
FROM opportunities opp
LEFT JOIN record_types rt ON opp.record_type_id = rt.id
LEFT JOIN users usr ON opp.user_id = usr.id
LEFT JOIN accounts acc ON opp.account_id = acc.id
LEFT JOIN job_titles jt ON usr.job_title_id = jt.id
LEFT JOIN crm_field_data cfd ON cfd.id = (SELECT sub_cfd.id
FROM crm_field_data sub_cfd
WHERE sub_cfd.object_id = opp.id
AND sub_cfd.crm_field_id = 66810
ORDER BY sub_cfd.updated_at DESC
LIMIT 1)
LEFT JOIN crm_field_values cfv ON cfv.crm_field_id = 66810 AND cfv.value = cfd.value
WHERE opp.user_id IS NOT NULL
AND opp.deleted_at IS NULL
AND opp.is_closed = 0
# AND opp.is_closed = 1
# AND opp.is_won = 0
AND opp.close_date >= '2024-01-01 00:00:00'
AND opp.close_date <= '2024-12-31 23:59:59'
AND usr.team_id = 1
# and opp.id = 4823179
# GROUP BY opp.id
ORDER BY
cfv.sequence DESC,
# opp.name
# owner_name
cfd.value
# CAST(cfd.value AS UNSIGNED)
# CAST(MAX(cfd.value) AS UNSIGNED)
# (SELECT COUNT(dr.id)
# FROM deal_risks dr
# JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id
# WHERE dr.opportunity_id = opp.id
# AND dr.is_active = 1 AND gdrt.is_enabled = 1)
DESC
# LIMIT 75, 25
;
SELECT * FROM crm_field_values WHERE crm_field_id = 66810;
SELECT f.id, f.crm_provider_id AS field_name, f.label, fd.object_id AS dealId, fd.value, fd.updated_at, fd.id, fd.created_at
FROM crm_fields f
INNER JOIN crm_field_data fd ON fd.crm_field_id = f.id
WHERE (f.crm_configuration_id = 1)
AND (f.object_type = 'opportunity')
# AND (fd.object_id IN (4158331,4158483,4158495,4158496,6069574,6263970,6171615,6540943,6545606,5829430,6198319,6263653,6548381,7242914,8797814,7228149,7439134,7878923,8134147,9002915,9118219,9165534,9354763,9369285,9446720))
AND (fd.object_id IN (4158460))
AND (f.crm_provider_id IN ('ForecastCategoryName'))
ORDER BY fd.object_id ASC, fd.updated_at DESC;
select * from crm_layouts where crm_configuration_id = 1;
select cf.* from crm_fields cf
join crm_layout_entities cle on cf.id = cle.crm_field_id
where crm_layout_id = 1493;
SELECT * FROM opportunities WHERE id = 4158460;
SELECT * FROM crm_field_data WHERE object_id = 4158460;
select * from users where team_id = 1;
SELECT * FROM users WHERE id = 7160;
select * from role_user where user_id = 3248;
select * from crm_field_values where crm_field_id = 66824;
SELECT * FROM users WHERE id = 23470;
select * from crm_configurations;
# [PASSWORD_DOTS]
select * from teams where id = 1038; # 23521, 966
select * from users where team_id = 1038;
select * from crm_configurations where id = 966;
SELECT * FROM activities WHERE uuid_to_bin('e8dc7c34-31f6-4430-bd81-2d9d8f00dd07') = uuid; # 54965762
SELECT * FROM activities WHERE uuid_to_bin('4b5727c0-69d1-428f-b8d9-b649055166e2') = uuid; # 54965764
SELECT * FROM participants WHERE activity_id = 54965764;
SELECT id, uuid, title, recording_state FROM activities WHERE uuid_to_bin('355f105d-5606-4379-b0c5-d91daf59f4ce') = uuid; # 54964075
SELECT * FROM participants WHERE activity_id = 54964075;
select f.id, slug, title, tf.team_id from team_features tf JOIN features f on tf.feature_id = f.id
where tf.team_id = 1038;
# [PASSWORD_DOTS] PD [PASSWORD_DOTS]
select * from teams where id = 1029;
SELECT * FROM crm_configurations WHERE id = 957;
SELECT * FROM activities WHERE uuid_to_bin('581a33cb-4343-44bd-ac0c-4a5cee71c5ec') = uuid; # 54963423
SELECT * FROM activities WHERE uuid_to_bin('07238011-25fa-418e-838b-fb21e82b9ea2') = uuid; # 54963433
SELECT * FROM activities WHERE uuid_to_bin('8b6bb2f7-e7a7-4aec-8806-fbfea7093ccd') = uuid; # 54963421
# [PASSWORD_DOTS] Close [PASSWORD_DOTS]
select * from teams where id = 1031;
SELECT * FROM crm_configurations WHERE id = 959;
SELECT * FROM activities WHERE uuid_to_bin('59c517e0-96c9-4dad-bfeb-b7bef72f8725') = uuid; # 54963517
SELECT * FROM activities WHERE uuid_to_bin('07238011-25fa-418e-838b-fb21e82b9ea2') = uuid; # 54963433
SELECT * FROM activities WHERE uuid_to_bin('d68311e3-ac34-49bd-bf04-88323a7e5352') = uuid; # 54966009
# [PASSWORD_DOTS] SF [PASSWORD_DOTS]
SELECT * FROM activities WHERE uuid_to_bin('2bd4cfa3-4eb5-4c77-84a7-9ed46a21c988') = uuid;
select * from roles;
select * from permissions;
select * from permission_role where permission_id = 136;
select * from migrations order by id desc;
select * from teams where id IN (1, 1037);
select * from crm_layouts where crm_configuration_id = 1;
SELECT * FROM crm_layout_entities WHERE crm_layout_id = 1493;
SELECT * FROM crm_fields WHERE id IN (1652,1661,66799,66814,66821,66836,66843,66846,66864,84752,182306,323580,380378);
select * from features;
select * from team_features where feature_id = 33;
select * from opportunities;
select * from teams;
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 = 1052 and sa.provider = 'hubspot';
SELECT * FROM accounts where id = 11512582;
select * from activities where account_id = 11512582;
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...
|
45467
|
NULL
|
NULL
|
NULL
|
|
45468
|
1628
|
10
|
2026-05-14T14:38:57.809098+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-14/1778 /Users/lukas/.screenpipe/data/data/2026-05-14/1778769537809_m2.jpg...
|
PhpStorm
|
faVsco.js – IntegrationAppServiceTrait.php
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
#12066 on JY-20725-handle Project: faVsco.js, menu
#12066 on JY-20725-handle-HS-search-rate-limit, menu
Start Listening for PHP Debug Connections
HandleHubspotRateLimitTest
Run 'HandleHubspotRateLimitTest'
Debug 'HandleHubspotRateLimitTest'
More Actions
JetBrains AI...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"bounds":{"left":0.2962101,"top":1.0,"width":0.03856383,"height":-0.019952059},"on_screen":true,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"#12066 on JY-20725-handle-HS-search-rate-limit, menu","depth":5,"bounds":{"left":0.33477393,"top":1.0,"width":0.122340426,"height":-0.019952059},"on_screen":true,"help_text":"Pull request #12066 exists for current branch JY-20725-handle-HS-search-rate-limit, but local branch is out of sync with remote","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"bounds":{"left":0.5731383,"top":1.0,"width":0.011303191,"height":-0.019952059},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"HandleHubspotRateLimitTest","depth":6,"bounds":{"left":0.5884308,"top":1.0,"width":0.076130316,"height":-0.019952059},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run 'HandleHubspotRateLimitTest'","depth":6,"bounds":{"left":0.66456115,"top":1.0,"width":0.011303191,"height":-0.019952059},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'HandleHubspotRateLimitTest'","depth":6,"bounds":{"left":0.67586434,"top":1.0,"width":0.011303191,"height":-0.019952059},"on_screen":true,"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.6871675,"top":1.0,"width":0.011303191,"height":-0.019952059},"on_screen":true,"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.7150931,"top":1.0,"width":0.011303191,"height":-0.019952059},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
-5784594327568142026
|
-7196678489907033719
|
click
|
hybrid
|
NULL
|
Project: faVsco.js, menu
#12066 on JY-20725-handle Project: faVsco.js, menu
#12066 on JY-20725-handle-HS-search-rate-limit, menu
Start Listening for PHP Debug Connections
HandleHubspotRateLimitTest
Run 'HandleHubspotRateLimitTest'
Debug 'HandleHubspotRateLimitTest'
More Actions
JetBrains AI
Jiminny... ~ActivityFilesLater@ jiminny-x-integrati• plattorm-inner-teamE Channels# ai-chapter# alertsi backend# bugscontusion-cllnia# curiosity lab# engineering# general#jiminny-bgac nlattorm-nckets# product launches# random# releases# sofia-officed sunport# thank-yous# the people of iimi... Direct messages• 8la 62% Galya Dimitrovavasil VasilevM Stefka StovanovaSg: Todor StamatovMario GeorgievNiudlay lanay. James Graham "* Stoyan Tanevo Stelivan Georgiev( Petko Kashinski*. Lukas Kovali...::: AnnsToastS lira Gloud6d Huddle with Aneliva Angelova* Aneliya Angelova &• Messagest Add canvasur FilesAneliya Angelova 2:30 PMЛукаш, само при Сейлсфорс и Хубспот се синкваха активити типовете, когато се направи плейбук,нали?пои останалите скМі тоябва оъчно ла се въвелат.Lukas Kovalik 2:47 PMтряова да се за всички, някъде не се ли попьлвапри зохо май беше hardcoded но май и там си връщаха две категорииAneliya Angelova 4:00 PMЛукаш имаш ли време да се чуем за тестването на https://jiminny.atlassian.net/browse/JY-20725X Preuiew in sact[HubSpotl Optimise CRM rematct(7 OpenRosdy for OA- MediumAA Aneliya AngelovaAs of today at 4:00 PM RetreshOpen in Jira* SummariseLukas Kovalik 4:02 PMzean-iurwiniareelYou joined the huddle (LIVE 4:06 PMAneliva Angelova is here toolAneliva Angelova 4:44 PN11512582Lukas Kovalik M 5.16 PNcurl --location "httns:ani.hubani.com/crm/v3/obiects/contacts/search--header 'Content-vne' annlication/ison'--header "Authorization: BearerC|Kvma?iMx7OINOM8kOFwrAowAcAkUAhIR24?A05D?xiVrIYMILuP6SA01Kwcmhr=n.v2 hytorDniMvDalYck-CMalovolNOM9kOFwrAUAcrkcaws-ThwRARIRAOF-ATFSAOFRAO-ROIEBAQUBEggBAQEBAYICFIr7Au8O2Nwal9YW2CbCCxYvwngmSgNldTFSAFoAYABoAHAAeAA'\--data "{ "limit", 13'Message Aneliva Angelova+ AaIđ 0Pmv Q SearchDate ModifiedYesterdav at 13.3Yesterday at 13:37Yesterday at 13.30Yesterdav at 13:35resterday at 15.34Yesterdav at 13:34Yesterday at 13:33Yesterday at 13.32Yesterdav at 13:39resterday at 15.3Yesterdav at 13:30Yesterday at 13:30Yesterday at 13:29Yesterday at 13:29Yesterday at 13:28resterday at 13-21Yesterdav at 13:27Yesterday at 13:26Yesterday at 13:26Yesterday at 13:25Yesterday at 13.24Yesterdav at 13:22Yesterdav at 13:22resterady al 15.clYesterday at 13:20Yesterday at 13.19Yecterdav at 12:10Yesterdav at 13:18Yesterday at 13.10Yesterdav at 13:17Yesterday at 13:17Yesterday at 13:16Yacterdav at 12:15Yesterday at 13.14Yecterdav at 12:14Yesterday at 13:13Yesterday at 13:12Yoctorday at 12:19Yesterday at 13.11Yecterdav at 12:10Yesterdav at 13:10Yesterdav at 13:0962 K:MPEG-4 movie71 KB23 KBMPEG-4 movieMPEG-4 movieMPEG-4 movie13 KE16 KB17 KB29 K:MPE0"4 movie6 KB12 KBMDSG-A movieMP2G-4 movie7 KBI8 KB37 KB10 KВIMPEG-A movieMPEG"4 movieMPEG-4 movie7 KBMPEG-4 movie8 KB9 KB1MPEG-4 movie8 KR72 KB14 KBMPEG-1 movieMPEG-4 movie13 KEMPEG-4 movie9 KB MPEG-4 movie18 KB12 KB|MPEG-4 movie10 KB16 KB6KBMDEG.A movicMPEG-4 movie6KE12 KBMPEG-4 movieMPEG-4 movie23 KBMPEG-4 movie8 K:MPEG-4 movie6 KBMDECA movid11 KBMPEG-4 movie11 KPMDEG-A movie20 KB34 KB10 K:7 KB5 KB11 KBMPEG-4 movieMDEC.A moviaMPEG-4 movieD6KRMDEG-A movia111 KBMPEG-4 movie102 KEMPEG-4 movie88 KBMPEG-A movie59 KB MPEG-4 movie98 KB97 KBMPEG-4 movieMDEG.A movioGAKP44 KB93 KBMPEG-4 movie78 KPMDEG-A movid50 KBMPEG-4 movie58 KB17 KBMPEG-4 movieAl Notes: OffLeave• • CFavourites• jiminny• Recents* ApplicationsiCloud• iCloud Drive992 Svnc toldeLocations0 DXP4800PLUS-B5F49 Networl• CRMI• Orange• Red|• Yellow• Green• Purple•) All lags..IhlDownloadsNameLoom.pkgAlfred copv.alfredoreterences=KeychronAssist-1.0.2 (1).dmeKeychronAssist-1.0.2.dmgmazanoke-images-yWJo.zioPhotos-3-001.zip• Transcript.pd→mage U.loge1 Orioninstaller.dma_image.jpg- image (2).1pc• ПO-22221726037035-004-001_ORGES.pdf%D0%9F%D0%9E-22221726037035-004-001 archive.zipПO-22221726037035-004-001_archive (1).zip• repon 4).XmAltred copy2.altredoreterencesСE 060209С О000000026571172 CWICT 0Р70501260015900 ndt= 27022026_0000000026574472_ SWIFT_ [IBAN].pdf= 03042026 [CREDIT_CARD] SWIFT [CREDIT_CARD].001reportxmmi=pdt.odiB pdf-1.pdfD pdf-2.pdf-pdf-5.pd1= ndf-1 ndipdf-3.pdfKoválik Family Tree.gedbitwarden export 20251031122528.isonlKoválik Family Tree.zip*macOS Storage_Cleanup.mdal favicon icofirst aid_notes_complete.docxrenortl2).esv1 config.vmlIteration run Search HS.postman_collection.jsonm licence bettertouchtoalMariusHosting Config.isonnokc.901a6502.6667.A62h-062 ccu•AlfredwPmazanoko.imnaoc.YWIfана Ковалик.jpg•искане даниел Ковалик..pg• Фактура Март Даниел Ковалик.jрс• Фактура Април Даниел Ковалик iро• Dhotac 2.001Q SearchKind00,4 MD55.9 MBinstdlle..dckageAlfred...ferences10,1 MB10,1 MBIL MBDisk ImageDisk ImageLiP archive6.6 MBZIp archive2,5 MB PDF Document2,5 MBJreo lmage2.2 MBDisk Image2,2 MB PDF Document2 MBJPEG image1,9 MBJPEG imaqe192 KBPDE Document140 KbZIP archive148 KВ148 KB122 KBZIP archivelZIP archiveXML document111 KBAlfred...ferences94 KBDDE Documont92 KBPDr DocumentK:PDF Document91 KB91 KBXML document30 KBn0kpDDE Nocumont28 KBPDF Document28 KRPDE Document28 KB27 KBDocument14 KB11 KB6 KB6KBJSONINCV NacumontZIP archiveMarkdo…..ument5KRWindo...n image4 KB3 KBword ..cumentCSV Document2 KBVAMI dosumon1 KB029 buteccSV Documenthttlicence183 bytesZero butesJSONAlfrod foronso!Zero bytesFolde1.9 MB1,8 MB17 MB1,7 MBColdorJPEG imageJPEG ImageIPEG imadeJPEG imageColdo1 of 58 selected, 8.44 GB availabld• Inu 14 May 1/.30.01Date AddedIs Mdl ZUzo dl 19:4530 Jan 2026 at 12:3617 Mar 2026 at 20:2717 Mar 2026 at 20:26Z3 Aor 2020 al 13:0229 ,Jan 2026 at 15:2019 Dec 2025 at 10:1619 Dec 2025 at 12:238 Aor 2026 at 20:3519 Dec 2025 at 10:2919 Dec 2025 at 12:1819 Dec 2025 at 12:4026 Mar 2026 at 11:2410 May 2026 at 13:5326 Mar 2026 at 11:2426 Mar 2026 at 11:2426 Mar 2026 at 11:2310 May 2026 at 14:3730 Jan 2026 at 12:3712 Goh 2006 9t 11:5 A1Z3 Apr 2026 at 13.0823 Aor 2026 at 13:0810 May 2026 at 13:5410 May 2026 at 14:3710 May 2026 at 13:4910 May 2026 at 13:5010 May 2026 at 13:5110 Mav 2026 at 12:51110 May 2026 at 13:5019 Dec 2025 at 11:3431 Oct 2025 at 12:2525 Nau 2025 4+ 17:506 Mar 2026 at 11.2224 Anr 2026 at 16:5220 Oct 2025 at 11:0218 Mar 2026 at 15:29• Mav 2026 at 11:09129 Oct 2025 at 19:329 May 2026 at 10:0419 Mar 2026 at 11:55|10 May 2026 at 13:5712 Jun 2025 at 19:0430 Jan 2026 at 12:362616 Oct 2025 aт 16:0122 Aar 2026 at 12:0223 Apr 2026 at 13:0223 Apr 2026 at 13:0222 Anr 2026 at 12:0223 Apr 2026 at 13:0229 Jan 2026 at 15:20...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
45467
|
1627
|
13
|
2026-05-14T14:38:57.805196+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-14/1778 /Users/lukas/.screenpipe/data/data/2026-05-14/1778769537805_m1.jpg...
|
PhpStorm
|
faVsco.js – IntegrationAppServiceTrait.php
|
1
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"bounds":{"left":0.054166667,"top":0.027777778,"width":0.08055556,"height":0.035555556},"on_screen":true,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
8043719072324535154
|
-8628527368849355612
|
click
|
hybrid
|
NULL
|
Project: faVsco.js, menu
PhpStormFileEditViewNavig Project: faVsco.js, menu
PhpStormFileEditViewNavigateCodeLaravelRefactorRunToolsGitWindowHelpabl100% C•FV faVsco.js* #12066 on JY-20725-handle-HS-search-rate-limit k vHandleHubspotRateLimitTest v8• Thu 14 May 17:38:57* :QProject vTrackAutomatedReportGeneratedEvent.php© UserAutomatedReportsController.phpPlanhatService.php:=custom.log© Client.phpAutomatedReportResult.phpSendReportJob.phpDeleteCrmEntityTrait.phpDeleteAccountJob.php=laravel.log© ClosedDealStagesService.phpC DealFieldsService.php© ImportActivityTypes.phpT WriteCrmTrait.php© DecorateActivity.phpIntegrationAppServiceTrait.php x© Salesforce/Service.phpSF [jiminny@localhost]© DecorateActivity.phpT LogActivityTrait.php© Playbook.php© Pipedrive/Service.phpClose/Service.php© Copper/Service.phpA HS_local [jiminny@localho:W© FieldDefinitions.php© BullhornService.php© PlainTextDecorateActivity.phpT ActivityPlaybookTrait.php© CrmHelperRepository.php4 console [QAI PROD] X18© FieldTypeConverter.php• HubspotClientinterface.phpAccountController.php.env.stagingE.envDetachActivityObject.phpRematchActivityOnCrmObjectDetach.php4 console [PROD]© HubspotTokenManager.php© PayloadBuilder.php© MatchActivityCrmData.phpk?php© Client.php© HubspotPaginationService.php© HandleHubspotRateLimit.phpA console (EU]A2© RemoteCrmObjectManipulatoiResponseNormalize.phpdeclare(strict_types=1);© Service.php© SyncFieldAction.phpnamespace Jiminny (Services\Crm\IntegrationApp\Jobs;© SyncRelatedActivityManager.i© WebhookSyncBatchProcessolUSev D IntegrationApp> OJ Accessors|› D Api› D ConfigI DTOD Filters1617 @18192021trait IntegrationAppServiceTraitv D Jobs/***/no usages* @throws ApplicationException© CrmEntitiesFullSyncJob.ph22private function getTeam(TeamRepository $teamRepository): Team{...}© DeleteRemoteTeamJob.ph31T IntegrationAppService Trait32© SubscribeForEventsJob.ph33© TeamInitialSyncJob.php34© UnsubscribeForEventsJob./***/no usages* @throws CrmException© UpdateProfileRelatedEntiti35private function getPreparedCrmService(Team $team, ProviderRegistry SproviderRegistry): IntegrationAppInter 233 v© ValidateTeamActiveConne53DGo jiminny084143 ×4 л215•m_layout_id =2162,1661,66799,66217218219id = 33;220221222223224id THEN •(own225226227228229230hubspot':-231232= 11512582;234> C ProspectSearchStrategy54> D ServiceTraits© DataClient.php© DecorateActivity.php© LocalSearch.phpA lnralfaarchintarfara nhnWorkspace associated with branch 'JY-20725-handle-HS-search-rate-limit' has been restored // Rollback // Configure... (today 16:17)W Windsurf Teams1:1UTF-8Ca 4 spaces...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
45466
|
1627
|
12
|
2026-05-14T14:38:51.620433+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-14/1778 /Users/lukas/.screenpipe/data/data/2026-05-14/1778769531620_m1.jpg...
|
PhpStorm
|
faVsco.js – IntegrationAppServiceTrait.php
|
1
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
#12066 on JY-20725-handle Project: faVsco.js, menu
#12066 on JY-20725-handle-HS-search-rate-limit, menu
Start Listening for PHP Debug Connections
HandleHubspotRateLimitTest
Run 'HandleHubspotRateLimitTest'
Debug 'HandleHubspotRateLimitTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"bounds":{"left":0.054166667,"top":0.027777778,"width":0.08055556,"height":0.035555556},"on_screen":true,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"#12066 on JY-20725-handle-HS-search-rate-limit, menu","depth":5,"bounds":{"left":0.13472222,"top":0.027777778,"width":0.25555557,"height":0.035555556},"on_screen":true,"help_text":"Pull request #12066 exists for current branch JY-20725-handle-HS-search-rate-limit, but local branch is out of sync with remote","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"bounds":{"left":0.6326389,"top":0.027777778,"width":0.023611112,"height":0.035555556},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"HandleHubspotRateLimitTest","depth":6,"bounds":{"left":0.6645833,"top":0.027777778,"width":0.15902779,"height":0.035555556},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run 'HandleHubspotRateLimitTest'","depth":6,"bounds":{"left":0.82361114,"top":0.027777778,"width":0.023611112,"height":0.035555556},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'HandleHubspotRateLimitTest'","depth":6,"bounds":{"left":0.8472222,"top":0.027777778,"width":0.023611112,"height":0.035555556},"on_screen":true,"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.87083334,"top":0.027777778,"width":0.023611112,"height":0.035555556},"on_screen":true,"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.9291667,"top":0.027777778,"width":0.023611112,"height":0.035555556},"on_screen":true,"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.9527778,"top":0.027777778,"width":0.023611112,"height":0.035555556},"on_screen":true,"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.9763889,"top":0.027777778,"width":0.023611112,"height":0.035555556},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
2586234742233688171
|
-7051436856496256053
|
visual_change
|
hybrid
|
NULL
|
Project: faVsco.js, menu
#12066 on JY-20725-handle Project: faVsco.js, menu
#12066 on JY-20725-handle-HS-search-rate-limit, menu
Start Listening for PHP Debug Connections
HandleHubspotRateLimitTest
Run 'HandleHubspotRateLimitTest'
Debug 'HandleHubspotRateLimitTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
PhpStormFileEditViewNavigateCodeLaravelRefactorRunToolsGitWindowHelpabl100% C•FV faVsco.js* #12066 on JY-20725-handle-HS-search-rate-limit k vHandleHubspotRateLimitTest v8• Thu 14 May 17:38:51* :QProjectv+,*.:=TrackAutomatedReportGeneratedEvent.php© UserAutomatedReportsController.phpPlanhatService.php:+ SyncCrmEntitiesTrait.phpAutomatedReportResult.phpSendReportJob.phpDeleteCrmEntityTrait.phpDeleteAccountJob.phpT SyncFieldsTrait.php© ImportActivityTypes.php© WriteCrmTrait.php© DecorateActivity.phpIntegrationAppServiceTrait.php x© Salesforce/Service.phpT WriteCrmTrait.php> D UtilsT LogActivityTrait.php© Playbook.php© Pipedrive/Service.phpClose/Service.php© Copper/Service.php> D Webhook© BullhornService.php© PlainTextDecorateActivity.phpT ActivityPlaybookTrait.php© CrmHelperRepository.php18© BatchSyncCollector.php© BatchSyncRedisService.phpAccountController.php.env.stagingE.envDetachActivityObject.phpRematchActivityOnCrmObjectDetach.php© Client.php© ClosedDealStagesService.php© MatchActivityCrmData.phpk?php© Client.php© HubspotPaginationService.php© HandleHubspotRateLimit.phpA2C DealFieldsService.php© DecorateActivity.phpdeclare(strict_types=1);© FieldDefinitions.php© FieldTypeConverter.phpnamespace Jiminny (Services\Crm\IntegrationApp\Jobs;© HubspotClientinterface.php© HubspotTokenManager.phpUSe© PayloadBuilder.php© RemoteCrmObjectManipulatoi1617 @trait IntegrationAppServiceTrait© ResponseNormalize.php© Service.php1819© SyncFieldAction.php20© SyncRelatedActivityManager.i21© WebhookSyncBatchProcessol/***/no usages* @throws ApplicationExceptionv D IntegrationAppD Accessors• ApiD ConfigDDTO2231323334private function getTeam(TeamRepository $teamRepository): Team{...}D Filters/***/no usages* @throws CrmExceptionD Jobs35private function getPreparedCrmService(Team $team, ProviderRegistry SproviderRegistry): IntegrationAppInter 233 v© CrmEntitiesFullSyncJob.ph53}© DeleteRemoteTeamJob.ph54T IntegrationAppService Trait© SubscribeForEventsJob.ph© TeamInitialSyncJob.php© UnsubscribeForEventsJob.(AlnAotoDrnfiloDalotaNCnti+:Workspace associated with branch 'JY-20725-handle-HS-search-rate-limit' has been restored // Rollback // Configure... (today 16:17)=custom.log=laravel.logSF [jiminny@localhost]A HS_local [jiminny@localho:W4 console [QAI PROD] X4 console [PROD]A console (EU]DGo jiminny084143 ×4 л215•m_layout_id =2162,1661,66799,66217218219id = 33;220221222223224id THEN •(own225226227228229230hubspot':-231232= 11512582;234W Windsurf Teams1:1UTF-8Ca 4 spaces...
|
45464
|
NULL
|
NULL
|
NULL
|
|
3067
|
120
|
43
|
2026-05-07T11:58:57.975141+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-07/1778 /Users/lukas/.screenpipe/data/data/2026-05-07/1778155137975_m2.jpg...
|
PhpStorm
|
faVsco.js – IntegrationApp/…/SyncCrmEntitiesTrait. faVsco.js – IntegrationApp/…/SyncCrmEntitiesTrait.php...
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
master, menu
Start Listen Project: faVsco.js, menu
master, 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
Analyzing…
<?php
declare(strict_types=1);
namespace Jiminny\Services\Crm\IntegrationApp\ServiceTraits;
use Carbon\Carbon;
use GuzzleHttp\Exception\GuzzleException;
use GuzzleHttp\Exception\RequestException;
use Illuminate\Support\Str;
use Jiminny\Events\Activities\Crm\LeadConverted;
use Jiminny\Models\Contact;
use Jiminny\Models\Crm\Configuration;
use Jiminny\Models\Crm\Field;
use Jiminny\Models\Crm\LayoutEntity;
use Jiminny\Models\Lead;
use Jiminny\Models\Opportunity;
use Jiminny\Models\Stage;
use Jiminny\Models\Team;
use Jiminny\Models\Account;
use Jiminny\Jobs\Crm\MatchActivitiesToNewOpportunity;
use Jiminny\Repositories\Crm\CrmEntityRepository;
use Jiminny\Repositories\Crm\FieldDataRepository;
use Jiminny\Repositories\Crm\FieldRepository;
use Jiminny\Repositories\Crm\StageRepository;
use Jiminny\Services\Crm\IntegrationApp\Config\IntegrationConfigInterface as IntegrationConfig;
use Jiminny\Services\Crm\IntegrationApp\DTO;
use Jiminny\Services\Crm\IntegrationApp\DataClient;
use Jiminny\Services\Crm\OpportunitySyncStrategyResolver;
use Jiminny\Utils\CurrencyFormatter;
use Psr\Log\LoggerInterface;
/**
* This trait follows closely the contract SyncCrmEntitiesInterface
*/
trait SyncCrmEntitiesTrait
{
use ExternalMapsTrait;
private const int CHUNK_SIZE = 100;
public ?Team $team = null;
public ?Configuration $config;
public ?IntegrationConfig $editionConfig;
protected LoggerInterface $logger;
/**
* @var DataClient
*/
protected $client;
public function syncAllAccounts(): int
{
$count = 0;
foreach ($this->client->getAllAccounts() as $eachAccount) {
$this->importAccount($eachAccount);
$count++;
}
return $count;
}
public function syncAccounts(Carbon $since, ?Carbon $to = null): int
{
$count = 0;
$this->logger->info('[integration-app] Syncing accounts', [
'since' => $since,
'to' => $to,
'team_id' => $this->team?->getId(),
]);
$params = [
'since' => $since,
'to' => $to,
];
/** @var DTO\Account $eachAccount*/
foreach ($this->client->getFilteredAccounts($params) as $eachAccount) {
$this->importAccount($eachAccount);
$count++;
}
$this->logger->info('[integration-app] Syncing accounts finished successfully', [
'since' => $since,
'to' => $to,
'team_id' => $this->team?->getId(),
]);
return $count;
}
public function syncAccount(string $crmId): ?Account
{
try {
$accountDto = $this->client->getSingleAccount($crmId);
if ($accountDto === null) {
return null;
}
return $this->importAccount($accountDto);
} catch (RequestException) {
return null;
}
}
private function importAccount(DTO\Account $accountDto): Account
{
/** @var CrmEntityRepository $crmEntityRepo */
$crmEntityRepo = app(CrmEntityRepository::class);
$data = [
'crm_provider_id' => $accountDto->externalId,
'user_id' => $this->findMappedUserId($accountDto->ownerId),
'owner_id' => $accountDto->ownerId,
'name' => mb_substr($accountDto->name, 0, 191),
'phone' => $accountDto->phone !== null ? mb_substr($accountDto->phone, 0, 25) : null,
'industry' => $accountDto->industry !== null ? mb_substr($accountDto->industry, 0, 191) : null,
'domain' => $accountDto->websiteUrl !== null ? mb_substr($accountDto->websiteUrl, 0, 191) : null,
'country_code' => $accountDto->countryCode,
'remotely_created_at' => $accountDto->createdAt,
];
$this->logger->info('[integration-app] Importing account', [
'crm_provider_id' => $accountDto->externalId,
'team_id' => $this->team?->getId(),
]);
$account = $crmEntityRepo->importAccount($this->getConfiguration(), $data);
$this->mapExternalAccount($account);
return $account;
}
// Sync multiple records.
public function syncAllContacts(): int
{
$count = 0;
foreach ($this->client->getAllContacts() as $eachContact) {
// import contacts here
$this->importContact(contactDto: $eachContact);
$count++;
}
return $count;
}
public function syncContacts(Carbon $since, ?Carbon $to = null): int
{
$count = 0;
$this->logger->info('[integration-app] Syncing contacts', [
'since' => $since,
'to' => $to,
'team_id' => $this->team?->getId(),
]);
$params = [
'since' => $since,
'to' => $to,
];
foreach ($this->client->getFilteredContacts($params) as $eachContact) {
$this->importContact($eachContact);
$count++;
}
$this->logger->info('[integration-app] Syncing contacts finished successfully', [
'since' => $since,
'to' => $to,
'team_id' => $this->team?->getId(),
]);
return $count;
}
// Sync single records.
public function syncContact(string $crmId): ?Contact
{
try {
$contactRecord = $this->client->getSingleContact($crmId);
if ($contactRecord === null) {
return null;
}
return $this->importContact($contactRecord);
} catch (RequestException) {
return null;
}
}
private function importContact(DTO\Contact $contactDto): ?Contact
{
$createInternalAccount = false;
/** @var CrmEntityRepository $crmEntityRepo */
$crmEntityRepo = app(CrmEntityRepository::class);
$accountId = $this->findMappedAccountId(
pivotEntityId: $contactDto->externalId,
externalAccountId: $contactDto->accountId,
);
$userId = $this->findMappedUserId($contactDto->ownerId);
if ($accountId === null) {
$this->logger->info('[integration-app] Importing contact, but related account cannot be found', [
'crm_provider_id' => $contactDto->externalId,
'raw_account_id' => $contactDto->accountId,
'name' => $contactDto->fullName,
'user_id' => $userId,
]);
$createInternalAccount = true;
}
$data = [
'user_id' => $userId,
'account_id' => $accountId,
'crm_provider_id' => $contactDto->externalId,
'owner_id' => $contactDto->ownerId,
'name' => $contactDto->fullName !== null ? mb_substr($contactDto->fullName, 0, 100) : null,
'title' => $contactDto->title !== null ? mb_substr($contactDto->title, 0, 100) : null,
'email' => $contactDto->primaryEmail !== null ? mb_substr($contactDto->primaryEmail, 0, 191) : null,
'phone' => $contactDto->phone !== null ? mb_substr($contactDto->phone, 0, 25) : null,
'mobile_phone' => $contactDto->mobilePhone !== null ? mb_substr($contactDto->mobilePhone, 0, 25) : null,
'country_code' => $contactDto->countryCode !== null ? mb_substr($contactDto->countryCode, 0, 2) : null,
'remotely_created_at' => $contactDto->createdAt,
'photo_path' => '',
];
$this->logger->info('[integration-app] Importing contact', [
'crm_provider_id' => $contactDto->externalId,
'team_id' => $this->team?->getId(),
]);
$contact = $crmEntityRepo->importContact($this->getConfiguration(), $data);
$this->mapExternalContact($contact);
if ($createInternalAccount) {
$this->createInternalAccountFromContact($contact)->getId();
}
return $contact;
}
/**
* @param bool $matchFromOtherCrm - This parameter is intended to be manually used. It will help with
* matching older opportunities if the team is transitioning from one CRM provider to another.
*/
public function syncAllOpportunities(bool $matchFromOtherCrm = false): int
{
$count = 0;
foreach ($this->client->getAllOpportunities() as $eachDeal) {
$this->upsertOpportunity($eachDeal, $matchFromOtherCrm);
$count++;
}
return $count;
}
public function syncOpportunities(array $parameters, ?string $strategy = null): int
{
$parameters['strategy'] = $strategy ?? OpportunitySyncStrategyResolver::LAST_MODIFIED_SYNC_OPPORTUNITY_STRATEGY;
$count = 0;
$this->logger->info('[integration-app] Syncing opportunities', [
'parameters' => $parameters,
'team_id' => $this->team?->getId(),
]);
/** @var DTO\Opportunity[] $pageResultData */
foreach ($this->client->getFilteredOpportunities($parameters) as $pageResultData) {
$externalAccounts = [];
$externalContacts = [];
foreach ($pageResultData as $eachRecord) {
$externalAccounts[] = $eachRecord->accountId ?? null;
$externalContacts[] = $eachRecord->contactId ?? null;
}
// Import missing contacts and account as early as possible
$missingContacts = $this->identifyMissingContacts($externalContacts);
if (! empty($missingContacts)) {
$this->batchSyncContacts($missingContacts);
}
$missingAccounts = $this->identifyMissingAccounts($externalAccounts);
if (! empty($missingAccounts)) {
$this->batchSyncAccounts($missingAccounts);
}
foreach ($pageResultData as $eachRecord) {
$this->upsertOpportunity($eachRecord);
$count++;
}
}
$this->logger->info('[integration-app] Syncing opportunities finished successfully', [
'parameters' => $parameters,
'team_id' => $this->team?->getId(),
]);
return $count;
}
public function syncOpportunity(string $crmId): ?Opportunity
{
try {
$opportunityRecord = $this->client->getSingleOpportunity($crmId);
if ($opportunityRecord === null) {
return null;
}
return $this->upsertOpportunity($opportunityRecord);
} catch (RequestException) {
return null;
}
}
public function syncAllLeads(): int
{
if (isset($this->config->getSettings()['lead_sync_disabled'])) {
$this->logger->info('[integration-app] Syncing leads disabled for the client', [
'team_id' => $this->team?->getId(),
]);
return 0;
}
$count = 0;
foreach ($this->client->getAllLeads() as $eachLead) {
$this->importLead($eachLead);
$count++;
}
return $count;
}
public function syncLeads(Carbon $since, ?Carbon $to = null, ?string $crmProfileId = null): int
{
if (isset($this->config->getSettings()['lead_sync_disabled'])) {
$this->logger->info('[integration-app] Syncing leads disabled for the client', [
'team_id' => $this->team?->getId(),
'since' => $since,
'to' => $to,
'crm_profile_id' => $crmProfileId,
]);
return 0;
}
$count = 0;
$this->logger->info('[integration-app] Syncing leads', [
'since' => $since,
'to' => $to,
'crm_profile_id' => $crmProfileId,
'team_id' => $this->team?->getId(),
]);
$filterData = [
'since' => $since,
'to' => $to,
'crm_profile_id' => $crmProfileId,
'converted' => 'both',
];
foreach ($this->client->getFilteredLeads($filterData) as $eachLead) {
$this->importLead($eachLead);
$count++;
}
$this->logger->info('[integration-app] Syncing leads finished successfully', [
'since' => $since,
'to' => $to,
'team_id' => $this->team?->getId(),
]);
return $count;
}
public function syncLead(string $crmId): ?Lead
{
if (isset($this->config->getSettings()['lead_sync_disabled'])) {
$this->logger->info('[integration-app] Syncing leads disabled for the client', [
'team_id' => $this->team?->getId(),
'crm_id' => $crmId,
]);
return null;
}
try {
$leadRecord = $this->client->getSingleAndConvertLead($crmId);
if ($leadRecord === null) {
return null;
}
return $this->importLead($leadRecord);
} catch (RequestException) {
return null;
}
}
private function importLead(DTO\Lead $leadDto): ?Lead
{
/** @var CrmEntityRepository $crmEntityRepo */
$crmEntityRepo = app(CrmEntityRepository::class);
$userId = $this->findMappedUserId($leadDto->ownerId);
$stage = null;
if ($this->editionConfig->supportsStages()) {
// Get the current stage.
$stage = $crmEntityRepo->getStageForName(
configuration: $this->config,
name: $leadDto->status,
type: Stage::TYPE_LEAD
);
}
if ($stage === null && ! empty($leadDto->status)) {
// Try to sync and import the lead stage by name only
$stage = $this->syncStageByNameOnly($this->config, $leadDto->status, Stage::TYPE_LEAD);
}
$stageId = $stage?->id;
$leadData = [
'team_id' => $this->team->getId(),
'crm_configuration_id' => $this->config->getId(),
'crm_provider_id' => $leadDto->externalId,
'name' => $leadDto->fullName,
'company' => $leadDto->companyName,
'owner_id' => $leadDto->ownerId,
'user_id' => $userId,
'stage_id' => $stageId,
'email' => $leadDto->primaryEmail,
'phone' => $leadDto->primaryPhone,
'mobile_phone' => $leadDto->secondaryPhone,
'title' => $leadDto->jobTitle,
'remotely_created_at' => $leadDto->createdAt,
];
$convertedLeadData = $this->processConvertedLead($crmEntityRepo, $leadDto);
$leadData = array_merge($leadData, $convertedLeadData);
$this->logger->info('[integration-app] Importing lead', [
'crm_provider_id' => $leadDto->externalId,
'name' => $leadDto->primaryEmail,
'team_id' => $this->team?->getId(),
]);
$lead = $crmEntityRepo->importLead($this->config, $leadData);
$this->dispatchLeadConvertedEvent($lead);
return $lead;
}
private function processConvertedLead(CrmEntityRepository $crmEntityRepo, DTO\Lead $leadDto): array
{
if (! $leadDto->isConverted()) {
return [];
}
$leadData = [
'converted_at' => $leadDto->getConvertedAt(),
];
$this->decorateWithConvertedContact($crmEntityRepo, $leadDto, $leadData);
$this->decorateWithConvertedAccount($crmEntityRepo, $leadDto, $leadData);
$this->decorateWithConvertedOpportunity($crmEntityRepo, $leadDto, $leadData);
return $leadData;
}
private function dispatchLeadConvertedEvent(Lead $lead): void
{
if ($lead->wasChanged('converted_at') && $lead->getConvertedAt() !== null) {
event(new LeadConverted($lead));
}
}
private function decorateWithConvertedContact(
CrmEntityRepository $crmEntityRepo,
DTO\Lead $leadDto,
array &$leadData
): void {
if ($leadDto->getConvertedContactId() !== null) {
$convertedContact = $crmEntityRepo->findContactByExternalId(
$this->config,
$leadDto->getConvertedContactId()
);
if ($convertedContact === null) {
try {
$convertedContact = $this->syncContact($leadDto->getConvertedContactId());
} catch (\Exception $exception) {
$this->logger->error('[integration-app] Error syncing converted contact', [
'lead_id' => $leadDto->getExternalId(),
'crm_provider_id' => $leadDto->getConvertedContactId(),
'error' => $exception->getMessage(),
]);
}
}
$leadData['converted_contact_id'] = $convertedContact?->getId();
}
}
private function decorateWithConvertedAccount(
CrmEntityRepository $crmEntityRepo,
DTO\Lead $leadDto,
array &$leadData
): void {
if ($leadDto->getConvertedAccountId() !== null) {
$convertedAccount = $crmEntityRepo->findAccountByExternalId(
$this->config,
$leadDto->getConvertedAccountId()
);
if ($convertedAccount === null) {
try {
$convertedAccount = $this->syncAccount($leadDto->getConvertedAccountId());
} catch (\Exception $exception) {
$this->logger->error('[integration-app] Error syncing converted account', [
'lead_id' => $leadDto->getExternalId(),
'crm_provider_id' => $leadDto->getConvertedAccountId(),
'error' => $exception->getMessage(),
]);
}
}
$leadData['converted_account_id'] = $convertedAccount?->getId();
}
}
private function decorateWithConvertedOpportunity(
CrmEntityRepository $crmEntityRepo,
DTO\Lead $leadDto,
array &$leadData
): void {
if ($leadDto->getConvertedOpportunityId() !== null) {
$convertedOpportunity = $crmEntityRepo->findOpportunityByExternalId(
$this->config,
$leadDto->getConvertedOpportunityId()
);
if ($convertedOpportunity === null) {
try {
$convertedOpportunity = $this->syncOpportunity($leadDto->getConvertedOpportunityId());
} catch (\Exception $exception) {
$this->logger->error('[integration-app] Error syncing converted opportunity', [
'lead_id' => $leadDto->getExternalId(),
'crm_provider_id' => $leadDto->getConvertedOpportunityId(),
'error' => $exception->getMessage(),
]);
}
}
$leadData['converted_opportunity_id'] = $convertedOpportunity?->getId();
}
}
/**
* @throws GuzzleException
*/
public function importStages(?array $types = null, ?string $missingStageName = null): ?Stage
{
if (! $this->editionConfig->supportsStages()) {
return null;
}
$missingStage = null;
$stagesCollection = $this->client->getAllDealsStages();
foreach ($stagesCollection as $eachStage) {
$stage = $this->importStage($eachStage);
if ($stage->getName() === $missingStageName) {
$missingStage = $stage;
}
}
return $missingStage;
}
private function importStage(DTO\EntityStage $stageDto): Stage
{
/** @var CrmEntityRepository $crmEntityRepo */
$crmEntityRepo = app(CrmEntityRepository::class);
$objectType = $stageDto->type ?? Stage::TYPE_OPPORTUNITY;
$stageData = [
'crm_provider_id' => $stageDto->externalId,
'name' => mb_strimwidth($stageDto->apiName ?? $stageDto->name, 0, 50),
'label' => mb_strimwidth($stageDto->masterLabel ?? $stageDto->name, 0, 191),
'sequence' => $stageDto->sortOrder ?? 0,
'probability' => $stageDto->defaultProbability ?? null,
'is_selectable' => $stageDto->isActive ?? 0,
'type' => $objectType,
];
$this->logger->info('[integration-app] Importing stage', [
'crm_provider_id' => $stageDto->externalId,
'name' => $stageDto->name,
'team_id' => $this->team?->getId(),
]);
$stage = $crmEntityRepo->importStage($this->config, $objectType, $stageData);
// Include newly imported stages to the map
$this->mapExternalStage($stage);
return $stage;
}
/**
* Attach a stage to a default business process.
* This method is used only in Zoho implementation
* where both supportsPipelines and supportsPipelines are false
*/
public function syncBusinessProcessStages(int $stageId): void
{
/** @var StageRepository $stageRepository */
$stageRepository = app(StageRepository::class);
$processName = 'DefaultOpportunityProcess';
$data = [
'team_id' => $this->team->getId(),
'name' => $processName,
'type' => Stage::TYPE_OPPORTUNITY,
'is_selectable' => true,
];
$businessProcess = $stageRepository->findOrCreateBusinessProcess(
$this->config,
$processName,
$data
);
$businessProcess->stages()->attach($stageId);
}
/**
* bool $matchFromOtherCrm
* When inserting a deal match try to match it to an existing from other CRM within the same team.
* - This parameter is intended to be manually used only. It will help with
* matching older opportunities if the team is transitioning from one CRM provider to another.
*/
private function upsertOpportunity(DTO\Opportunity $opportunityDto, bool $matchFromOtherCrm = false): ?Opportunity
{
$this->logger->info('[integration-app] Importing opportunity', [
'crm_provider_id' => $opportunityDto->externalId,
'team_id' => $this->team->getId(),
]);
if ($this->config === null) {
$this->logger->warning('[integration-app] Opportunity missing config');
return null;
}
$stageId = $this->findOpportunityStageId(
externalStageId: $opportunityDto->stageId,
stageName: $opportunityDto->stageName
);
// temporary detect memory usage
$this->logger->info('[integration-app] Stage ID', [
'memory_usage' => memory_get_usage(),
'memory_real_usage' => memory_get_usage(true),
'crm_provider_id' => $opportunityDto->externalId,
'stage_id' => $stageId,
]);
$accountId = $this->findAccountId(
pivotEntityId: $opportunityDto->externalId,
externalAccountId: $opportunityDto->accountId,
externalContactId: $opportunityDto->contactId,
);
$this->logger->info('[integration-app] Account ID', [
'memory_usage' => memory_get_usage(),
'memory_real_usage' => memory_get_usage(true),
'crm_provider_id' => $opportunityDto->externalId,
'account_id' => $accountId,
]);
if ($stageId === null || $accountId === null) {
$this->logger->warning('[integration-app] Opportunity missing data', [
'stageId' => $stageId,
'accountId' => $accountId,
'externalId' => $opportunityDto->externalId,
]);
return null;
}
$userId = $this->findMappedUserId(externalUserId: $opportunityDto->ownerId);
$data = [
'crm_provider_id' => $opportunityDto->externalId,
'team_id' => $this->team->getId(),
'account_id' => $accountId,
'user_id' => $userId,
'owner_id' => $opportunityDto->ownerId,
'name' => mb_strimwidth($opportunityDto->name, 0, 128),
'value' => $opportunityDto->amount,
'currency_code' => CurrencyFormatter::formatCode($this->getCurrencyIso($opportunityDto)),
'close_date' => $opportunityDto->closeDate,
'is_closed' => $opportunityDto->closed,
'is_won' => $opportunityDto->won,
'stage_id' => $stageId,
'record_type_id' => null,
'remotely_created_at' => $opportunityDto->createdAt,
'probability' => $opportunityDto->probability,
];
/** @var CrmEntityRepository $crmEntityRepo */
$crmEntityRepo = app(CrmEntityRepository::class);
$opportunity = $crmEntityRepo->importOpportunity(
$this->config,
$data,
$matchFromOtherCrm,
$opportunityDto->name,
);
// Import external fields into crm_field_data if present
$crmFields = $this->getOpportunitySyncableFields();
$this->importOpportunityFieldData($opportunityDto, $crmFields, $opportunity->getId());
if ($opportunityDto->deleted === true) {
$opportunity->delete();
return $opportunity;
}
if ($opportunity->wasRecentlyCreated) {
MatchActivitiesToNewOpportunity::dispatch($opportunity->getId());
}
return $opportunity;
}
private function findOpportunityStageId(?string $externalStageId, ?string $stageName): ?int
{
$stageId = null;
if ($this->editionConfig->supportsStages()) {
$stageId = $this->findMappedStageId(externalStageId: $externalStageId, type: Stage::TYPE_OPPORTUNITY);
if ($stageId === null) {
$stageId = $this->importStages(types: [Stage::TYPE_OPPORTUNITY], missingStageName: $stageName)?->id;
}
}
if ($stageId === null && $stageName !== null) {
$stageId = $this->syncStageByNameOnly(
configuration: $this->config,
stageName: $stageName,
type: Stage::TYPE_OPPORTUNITY
)?->id;
}
return $stageId;
}
private function importOpportunityFieldData(
DTO\Opportunity $opportunityDto,
array $crmFields,
int $opportunityId
): void {
/** @var FieldRepository $fieldRepository */
$fieldRepository = app(FieldRepository::class);
/** @var FieldDataRepository $fieldDataRepository */
$fieldDataRepository = app(FieldDataRepository::class);
foreach ($crmFields as $crmField) {
if (! property_exists($opportunityDto, $crmField)) {
continue;
}
if ($opportunityDto->{$crmField} === null) {
continue;
}
$field = $fieldRepository->findFieldByCrmIdAndObjectType(
$this->config,
$crmField,
Field::OBJECT_OPPORTUNITY
);
if (! $field instanceof Field) {
$this->logger->info('Field not found', [
'field' => $crmField,
'config' => $this->config->getId(),
]);
continue;
}
$entities = $field->getEntities();
if ($entities->isEmpty()) {
$this->logger->info('Field has no entities', [
'field' => $crmField,
'config' => $this->config->getId(),
]);
continue;
}
if ($entities->count() > 1) {
$this->logger->info('Field has multiple entities', [
'field' => $crmField,
'config' => $this->config->getId(),
]);
continue;
}
/** @var LayoutEntity|null $entity */
$entity = $entities->first();
if (! $entity instanceof LayoutEntity) {
continue;
}
$value = (string) $opportunityDto->{$crmField};
$fieldDataRepository->updateOrCreateFieldData(
$entity,
$opportunityId,
$value,
);
}
}
private function getCurrencyIso(DTO\Opportunity $opportunityDto): ?string
{
if ($opportunityDto->currencyIso !== null) {
return $opportunityDto->currencyIso;
}
// Fallback to billing currency
return $this->config->getDefaultCurrency();
}
/**
* Some CRM providers do not support listing all stages.
* Additionally, they may not even supply us with a stage ID when the stage is supplied as a property of the deal.
* In that case, we will usually have only a stage name.
* In order to import such stages only once, we will slugify them and produce "external ID" on our own.
*/
private function syncStageByNameOnly(Configuration $configuration, string $stageName, ?string $type = null): ?Stage
{
// @TEMP For testing purposes only!!!
// Revert when we find suitable way to fetch the stage
/** @var CrmEntityRepository $crmEntityRepo */
$crmEntityRepo = app(CrmEntityRepository::class);
$stage = $crmEntityRepo->getStageForName($configuration, $stageName, $type);
if ($stage !== null) {
return $stage;
}
// if there is other legitimate way to fetch the stage skip.
if ($this->editionConfig->supportsPipelines() ||
$this->editionConfig->supportsStages()
) {
return null;
}
/** @var CrmEntityRepository $crmEntityRepo */
$crmEntityRepo = app(CrmEntityRepository::class);
$stage = $crmEntityRepo->getStageForName($configuration, $stageName, $type);
// Create the stage if it does not exist already
if ($stage === null) {
$stageDto = new DTO\EntityStage();
$stageDto->externalId = $stageName;
$stageDto->masterLabel = Str::slug($stageName);
$stageDto->name = $stageName;
$stageDto->type = $type;
$stage = $this->importStage($stageDto);
if ($type === Stage::TYPE_OPPORTUNITY) {
$this->syncBusinessProcessStages($stage->getId());
}
}
return $stage;
}
private function findAccountId(
string $pivotEntityId,
?string $externalAccountId = null,
?string $externalContactId = null,
bool $skipAccountSync = false,
): ?int {
$accountId = $this->findMappedAccountId(
pivotEntityId: $pivotEntityId,
externalAccountId: $externalAccountId,
skipAccountSync: $skipAccountSync,
);
if ($accountId !== null) {
return $accountId;
}
/**
* The deal probably does not have an Account assigned.
* In order to not break the existing import, we will try to find a contact
* and create an Account with the same data.
*/
if (! empty($externalContactId)) {
// In rare cases the contact's external id matches our account id, whe :(
$this->logger->info('[integration-app] fallback Account', ['contact_id' => $externalContactId]);
$accountId = $this->findMappedAccountId(
pivotEntityId: $pivotEntityId,
externalAccountId: $externalContactId,
skipAccountSync: true,
);
if ($accountId !== null) {
return $accountId;
}
$this->logger->info('[integration-app] create Account from Contact', ['contact_id' => $externalContactId]);
$crmEntityRepo = app(CrmEntityRepository::class);
$contact = $crmEntityRepo->findContactByExternalId($this->config, $externalContactId);
if ($contact !== null) {
return $this->createInternalAccountFromContact($contact)->getId();
}
}
return null;
}
private function createInternalAccountFromContact(Contact $contact): Account
{
$this->logger->info('[integration-app] Create internal account from contact', [
'team_id' => $this->team?->getId(),
'contact_id' => $contact->getId(),
'crm_provider_id' => $contact->getCrmProviderId(),
]);
$data = [
'crm_configuration_id' => $this->config->getId(),
'team_id' => $this->config->getTeamId(),
'crm_provider_id' => $contact->getCrmProviderId(),
'user_id' => $contact->getUserId(),
'owner_id' => $contact->getOwnerId(),
'name' => $contact->getName(),
'phone' => $contact->getPhone(),
'country_code' => $contact->getCountryCode(),
'remotely_created_at' => $contact->getRemotelyCreatedAt(),
'is_internal' => 1,
];
/** @var CrmEntityRepository $crmEntityRepo */
$crmEntityRepo = app(CrmEntityRepository::class);
$account = $crmEntityRepo->importAccount($this->config, $data);
if ($contact->account_id === null) {
$contact->account_id = $account->getId();
$contact->save();
}
$this->mapExternalAccount($account);
return $account;
}
private function batchSyncContacts(array $externalContactIds): void
{
$this->logger->info('[integration-app] Syncing batch contacts', [
'batch_contacts' => implode(',', $externalContactIds),
'team_id' => $this->team?->getId(),
]);
/** IntegrationApp allows up to 100 IDs passed as a batch. */
$chunkedContacts = array_chunk($externalContactIds, self::CHUNK_SIZE);
foreach ($chunkedContacts as $contactGroup) {
/** @var DTO\Contact[] $pageResultData */
foreach ($this->client->getBatchContactsById($contactGroup) as $pageResultData) {
$externalAccounts = [];
foreach ($pageResultData as $eachRecord) {
$externalAccounts[] = $eachRecord->accountId ?? null;
}
$missingAccounts = $this->identifyMissingAccounts($externalAccounts);
if (! empty($missingAccounts)) {
$this->batchSyncAccounts($missingAccounts);
}
foreach ($pageResultData as $eachRecord) {
$this->importContact($eachRecord);
}
}
}
}
private function batchSyncAccounts(array $externalAccountIds): void
{
$this->logger->info('[integration-app] Syncing batch accounts', [
'batch_contacts' => implode(',', $externalAccountIds),
'team_id' => $this->team?->getId(),
]);
/** IntegrationApp allows up to 100 IDs passed as a batch. */
$chunkedAccounts = array_chunk($externalAccountIds, self::CHUNK_SIZE);
foreach ($chunkedAccounts as $accountGroup) {
/** @var DTO\Account[] $pageResultData */
foreach ($this->client->getBatchAccountsById($accountGroup) as $pageResultData) {
foreach ($pageResultData as $eachRecord) {
$this->importAccount($eachRecord);
}
}
}
}
/**
* Identify all contacts Ids, that are not found in our database.
* Scoped to the current batch so memory and query cost scale with batch size,
* not with tenant size.
*
* @param array<?string> $contacts
*
* @return list<string>
*/
private function identifyMissingContacts(array $contacts): array
{
$wanted = array_values(array_unique(array_filter($contacts)));
if ($wanted === []) {
return [];
}
/** @var CrmEntityRepository $crmEntityRepo */
$crmEntityRepo = app(CrmEntityRepository::class);
$existing = $crmEntityRepo->getExistingContactCrmIds($this->config, $wanted);
return array_values(array_diff($wanted, $existing));
}
/**
* Identify all account Ids, that are not found in our database.
* Scoped to the current batch so memory and query cost scale with batch size,
* not with tenant size.
*
* @param array<?string> $accounts
*
* @return list<string>
*/
private function identifyMissingAccounts(array $accounts): array
{
$wanted = array_values(array_unique(array_filter($accounts)));
if ($wanted === []) {
return [];
}
/** @var CrmEntityRepository $crmEntityRepo */
$crmEntityRepo = app(CrmEntityRepository::class);
$existing = $crmEntityRepo->getExistingAccountCrmIds($this->config, $wanted);
return array_values(array_diff($wanted, $existing));
}
}
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide
app ~/jiminny/app
.circleci
.cursor
.github
.sonarlint
.vscode, folder
.windsurf
app, sources root
Actions
Component
Acl
ActionItems, folder
Activity, folder
ActivityAnalytics
ActivitySearch
AiActivityType, folder
AiAutomation, folder
AiCallScoring, folder
AskAnything
Dtos
Events
AskAnythingPromptService.php, class
HistoryService.php, class
AskJiminnyAi
AWS
BillingManagement
Cache
CoachingFeedback
Country, folder
CustomerApi, folder
Database, folder
Datadog, folder
DateTime, folder
DealInsights, folder
DealRisks
ElasticSearch
Eloquent
Encoding
Encryption
ES
Faker
FeatureFlags
FFMpeg
FileSystem
Gecko
Gong
GuzzleHttp
KeyPoints
Kiosk
LanguageDetection
LiveFeed
Locks
Math
MediaPipeline
MeetingBot
MobileSettings, folder
Model, folder
Notification, folder
Nudge
ParagraphBreaker
ParticipantSpeech
PartitionedCookie
PlaybackPage
Playlist
Prophet
ProphetAi, folder
ProsperWorks
Queue
Job
RateLimitAware.php, abstract class
RateLimitAwareWrapper.php, class
BotsQueueConstants.php
Constants.php
ProcessingQueueConstants.php
Router, folder
Saml2
SCIM
Seeder
Sentry
Serializer
Settings
Sidekick
Slack
TeamInsights, folder
TimeMemoryMapper, folder
Transcription
TranscriptionSummary
Twilio
Uploader
UrlGenerator
Utility
Exceptions
Service
BaseRateLimiter.php, class
EfficientJsonParser.php, class
ProviderRateLimiter.php, class
RateLimiterInstance.php, class
Uuid
Waveform
Webhooks
Workflow
Configuration
Console, folder
Commands
Activities
Analytics
Calendars
Crm
Hubspot
IntegrationApp
Traits
AddLayoutEntities.php, class
AutologDelayedCommand.php, class
BullhornCommandAbstract.php, abstract class
BullhornPingCommand.php, class
BullhornSearchCommand.php, class
BullhornSessionCommand.php, class
CheckActivityLoggableCommand.php, final class
CleanDuplicateFieldDataCommand.php, class
FullSyncOpportunityCommand.php, class
LogActivitiesCommand.php, final class
ManageSyncStrategyCommand.php, class
MatchCrmObjectsCommand.php, class
MatchOpportunityActivitiesCommand.php, class
MigrateProvider.php, class
ProcessHubspotObjectsSyncBatches.php, class
PurgeDeletedOpportunitiesCommand.php, class
ResetGovernorLimits.php, class
SendNotLogged.php, class
SetupActivityTypeForFollowUp.php, final class
SetupCloseCrm.php, class
SetupCopperCrm.php, class
SetupCrmCommand.php, abstract class
SetupLayouts.php, class
SyncAccount.php, class
SyncContact.php, class
SyncFieldMetadata.php, class
SyncHubspotActiveDeals.php, class
SyncHubspotObjects.php, class
SyncLead.php, class
SyncObjects.php, class
SyncOpportunitiesMissingFieldDataCommand.php, class
SyncOpportunity.php, class
SyncProfileMetadata.php, class
SyncTeamMetadata.php, class
UpdateOpportunitySpecifications.php, class
DealInsights
Dev
AddRateLimitCommand.php, class
FixHubSpotTokens.php, class
FixMissMatchedCrmActivitiesCommand.php, final class
ImportCallsCommand.php, class
MonitorSocialAccountsState.php, class
Dialers
DTOs
Elasticsearch
EngagementStats
GeckoExport
Livestream
Mailboxes
Migrate...
|
[{"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},"on_screen":true,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"master, menu","depth":5,"bounds":{"left":0.064494684,"top":0.019952115,"width":0.034242023,"height":0.025538707},"on_screen":true,"help_text":"Git Branch: master","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},"on_screen":true,"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},"on_screen":true,"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},"on_screen":true,"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},"on_screen":true,"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},"on_screen":true,"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},"on_screen":true,"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},"on_screen":true,"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},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"","depth":4,"bounds":{"left":0.52859044,"top":0.0726257,"width":0.45977393,"height":0.9066241},"on_screen":true,"value":"","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"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},"on_screen":false,"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},"on_screen":false,"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},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Analyzing…","depth":4,"bounds":{"left":0.5053192,"top":0.17478053,"width":0.019946808,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXTextArea","text":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Services\\Crm\\IntegrationApp\\ServiceTraits;\n\nuse Carbon\\Carbon;\nuse GuzzleHttp\\Exception\\GuzzleException;\nuse GuzzleHttp\\Exception\\RequestException;\nuse Illuminate\\Support\\Str;\nuse Jiminny\\Events\\Activities\\Crm\\LeadConverted;\nuse Jiminny\\Models\\Contact;\nuse Jiminny\\Models\\Crm\\Configuration;\nuse Jiminny\\Models\\Crm\\Field;\nuse Jiminny\\Models\\Crm\\LayoutEntity;\nuse Jiminny\\Models\\Lead;\nuse Jiminny\\Models\\Opportunity;\nuse Jiminny\\Models\\Stage;\nuse Jiminny\\Models\\Team;\nuse Jiminny\\Models\\Account;\nuse Jiminny\\Jobs\\Crm\\MatchActivitiesToNewOpportunity;\nuse Jiminny\\Repositories\\Crm\\CrmEntityRepository;\nuse Jiminny\\Repositories\\Crm\\FieldDataRepository;\nuse Jiminny\\Repositories\\Crm\\FieldRepository;\nuse Jiminny\\Repositories\\Crm\\StageRepository;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\Config\\IntegrationConfigInterface as IntegrationConfig;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\DTO;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\DataClient;\nuse Jiminny\\Services\\Crm\\OpportunitySyncStrategyResolver;\nuse Jiminny\\Utils\\CurrencyFormatter;\nuse Psr\\Log\\LoggerInterface;\n\n/**\n * This trait follows closely the contract SyncCrmEntitiesInterface\n */\ntrait SyncCrmEntitiesTrait\n{\n use ExternalMapsTrait;\n\n private const int CHUNK_SIZE = 100;\n\n public ?Team $team = null;\n public ?Configuration $config;\n public ?IntegrationConfig $editionConfig;\n protected LoggerInterface $logger;\n /**\n * @var DataClient\n */\n protected $client;\n\n public function syncAllAccounts(): int\n {\n $count = 0;\n foreach ($this->client->getAllAccounts() as $eachAccount) {\n $this->importAccount($eachAccount);\n $count++;\n }\n\n return $count;\n }\n\n public function syncAccounts(Carbon $since, ?Carbon $to = null): int\n {\n $count = 0;\n $this->logger->info('[integration-app] Syncing accounts', [\n 'since' => $since,\n 'to' => $to,\n 'team_id' => $this->team?->getId(),\n ]);\n\n $params = [\n 'since' => $since,\n 'to' => $to,\n ];\n\n /** @var DTO\\Account $eachAccount*/\n foreach ($this->client->getFilteredAccounts($params) as $eachAccount) {\n $this->importAccount($eachAccount);\n $count++;\n }\n\n $this->logger->info('[integration-app] Syncing accounts finished successfully', [\n 'since' => $since,\n 'to' => $to,\n 'team_id' => $this->team?->getId(),\n ]);\n\n return $count;\n }\n\n public function syncAccount(string $crmId): ?Account\n {\n try {\n $accountDto = $this->client->getSingleAccount($crmId);\n if ($accountDto === null) {\n return null;\n }\n\n return $this->importAccount($accountDto);\n } catch (RequestException) {\n return null;\n }\n }\n\n private function importAccount(DTO\\Account $accountDto): Account\n {\n /** @var CrmEntityRepository $crmEntityRepo */\n $crmEntityRepo = app(CrmEntityRepository::class);\n $data = [\n 'crm_provider_id' => $accountDto->externalId,\n 'user_id' => $this->findMappedUserId($accountDto->ownerId),\n 'owner_id' => $accountDto->ownerId,\n 'name' => mb_substr($accountDto->name, 0, 191),\n 'phone' => $accountDto->phone !== null ? mb_substr($accountDto->phone, 0, 25) : null,\n 'industry' => $accountDto->industry !== null ? mb_substr($accountDto->industry, 0, 191) : null,\n 'domain' => $accountDto->websiteUrl !== null ? mb_substr($accountDto->websiteUrl, 0, 191) : null,\n 'country_code' => $accountDto->countryCode,\n 'remotely_created_at' => $accountDto->createdAt,\n ];\n\n $this->logger->info('[integration-app] Importing account', [\n 'crm_provider_id' => $accountDto->externalId,\n 'team_id' => $this->team?->getId(),\n ]);\n\n $account = $crmEntityRepo->importAccount($this->getConfiguration(), $data);\n $this->mapExternalAccount($account);\n\n return $account;\n }\n\n // Sync multiple records.\n public function syncAllContacts(): int\n {\n $count = 0;\n foreach ($this->client->getAllContacts() as $eachContact) {\n // import contacts here\n $this->importContact(contactDto: $eachContact);\n $count++;\n }\n\n return $count;\n }\n\n public function syncContacts(Carbon $since, ?Carbon $to = null): int\n {\n $count = 0;\n $this->logger->info('[integration-app] Syncing contacts', [\n 'since' => $since,\n 'to' => $to,\n 'team_id' => $this->team?->getId(),\n ]);\n\n $params = [\n 'since' => $since,\n 'to' => $to,\n ];\n\n foreach ($this->client->getFilteredContacts($params) as $eachContact) {\n $this->importContact($eachContact);\n $count++;\n }\n\n $this->logger->info('[integration-app] Syncing contacts finished successfully', [\n 'since' => $since,\n 'to' => $to,\n 'team_id' => $this->team?->getId(),\n ]);\n\n return $count;\n }\n\n // Sync single records.\n public function syncContact(string $crmId): ?Contact\n {\n try {\n $contactRecord = $this->client->getSingleContact($crmId);\n if ($contactRecord === null) {\n return null;\n }\n\n return $this->importContact($contactRecord);\n } catch (RequestException) {\n return null;\n }\n }\n\n private function importContact(DTO\\Contact $contactDto): ?Contact\n {\n $createInternalAccount = false;\n\n /** @var CrmEntityRepository $crmEntityRepo */\n $crmEntityRepo = app(CrmEntityRepository::class);\n\n $accountId = $this->findMappedAccountId(\n pivotEntityId: $contactDto->externalId,\n externalAccountId: $contactDto->accountId,\n );\n $userId = $this->findMappedUserId($contactDto->ownerId);\n\n if ($accountId === null) {\n $this->logger->info('[integration-app] Importing contact, but related account cannot be found', [\n 'crm_provider_id' => $contactDto->externalId,\n 'raw_account_id' => $contactDto->accountId,\n 'name' => $contactDto->fullName,\n 'user_id' => $userId,\n ]);\n\n $createInternalAccount = true;\n }\n\n $data = [\n 'user_id' => $userId,\n 'account_id' => $accountId,\n 'crm_provider_id' => $contactDto->externalId,\n 'owner_id' => $contactDto->ownerId,\n 'name' => $contactDto->fullName !== null ? mb_substr($contactDto->fullName, 0, 100) : null,\n 'title' => $contactDto->title !== null ? mb_substr($contactDto->title, 0, 100) : null,\n 'email' => $contactDto->primaryEmail !== null ? mb_substr($contactDto->primaryEmail, 0, 191) : null,\n 'phone' => $contactDto->phone !== null ? mb_substr($contactDto->phone, 0, 25) : null,\n 'mobile_phone' => $contactDto->mobilePhone !== null ? mb_substr($contactDto->mobilePhone, 0, 25) : null,\n 'country_code' => $contactDto->countryCode !== null ? mb_substr($contactDto->countryCode, 0, 2) : null,\n 'remotely_created_at' => $contactDto->createdAt,\n 'photo_path' => '',\n ];\n\n $this->logger->info('[integration-app] Importing contact', [\n 'crm_provider_id' => $contactDto->externalId,\n 'team_id' => $this->team?->getId(),\n ]);\n\n $contact = $crmEntityRepo->importContact($this->getConfiguration(), $data);\n $this->mapExternalContact($contact);\n\n if ($createInternalAccount) {\n $this->createInternalAccountFromContact($contact)->getId();\n }\n\n return $contact;\n }\n\n /**\n * @param bool $matchFromOtherCrm - This parameter is intended to be manually used. It will help with\n * matching older opportunities if the team is transitioning from one CRM provider to another.\n */\n public function syncAllOpportunities(bool $matchFromOtherCrm = false): int\n {\n $count = 0;\n foreach ($this->client->getAllOpportunities() as $eachDeal) {\n $this->upsertOpportunity($eachDeal, $matchFromOtherCrm);\n $count++;\n }\n\n return $count;\n }\n\n public function syncOpportunities(array $parameters, ?string $strategy = null): int\n {\n $parameters['strategy'] = $strategy ?? OpportunitySyncStrategyResolver::LAST_MODIFIED_SYNC_OPPORTUNITY_STRATEGY;\n $count = 0;\n\n $this->logger->info('[integration-app] Syncing opportunities', [\n 'parameters' => $parameters,\n 'team_id' => $this->team?->getId(),\n ]);\n\n /** @var DTO\\Opportunity[] $pageResultData */\n foreach ($this->client->getFilteredOpportunities($parameters) as $pageResultData) {\n $externalAccounts = [];\n $externalContacts = [];\n\n foreach ($pageResultData as $eachRecord) {\n $externalAccounts[] = $eachRecord->accountId ?? null;\n $externalContacts[] = $eachRecord->contactId ?? null;\n }\n\n // Import missing contacts and account as early as possible\n $missingContacts = $this->identifyMissingContacts($externalContacts);\n if (! empty($missingContacts)) {\n $this->batchSyncContacts($missingContacts);\n }\n\n $missingAccounts = $this->identifyMissingAccounts($externalAccounts);\n if (! empty($missingAccounts)) {\n $this->batchSyncAccounts($missingAccounts);\n }\n\n foreach ($pageResultData as $eachRecord) {\n $this->upsertOpportunity($eachRecord);\n $count++;\n }\n }\n\n $this->logger->info('[integration-app] Syncing opportunities finished successfully', [\n 'parameters' => $parameters,\n 'team_id' => $this->team?->getId(),\n ]);\n\n return $count;\n }\n\n public function syncOpportunity(string $crmId): ?Opportunity\n {\n try {\n $opportunityRecord = $this->client->getSingleOpportunity($crmId);\n if ($opportunityRecord === null) {\n return null;\n }\n\n return $this->upsertOpportunity($opportunityRecord);\n } catch (RequestException) {\n return null;\n }\n }\n\n public function syncAllLeads(): int\n {\n if (isset($this->config->getSettings()['lead_sync_disabled'])) {\n $this->logger->info('[integration-app] Syncing leads disabled for the client', [\n 'team_id' => $this->team?->getId(),\n ]);\n\n return 0;\n }\n\n $count = 0;\n foreach ($this->client->getAllLeads() as $eachLead) {\n $this->importLead($eachLead);\n $count++;\n }\n\n return $count;\n }\n\n public function syncLeads(Carbon $since, ?Carbon $to = null, ?string $crmProfileId = null): int\n {\n if (isset($this->config->getSettings()['lead_sync_disabled'])) {\n $this->logger->info('[integration-app] Syncing leads disabled for the client', [\n 'team_id' => $this->team?->getId(),\n 'since' => $since,\n 'to' => $to,\n 'crm_profile_id' => $crmProfileId,\n ]);\n\n return 0;\n }\n\n $count = 0;\n $this->logger->info('[integration-app] Syncing leads', [\n 'since' => $since,\n 'to' => $to,\n 'crm_profile_id' => $crmProfileId,\n 'team_id' => $this->team?->getId(),\n ]);\n\n $filterData = [\n 'since' => $since,\n 'to' => $to,\n 'crm_profile_id' => $crmProfileId,\n 'converted' => 'both',\n ];\n\n foreach ($this->client->getFilteredLeads($filterData) as $eachLead) {\n $this->importLead($eachLead);\n $count++;\n }\n\n $this->logger->info('[integration-app] Syncing leads finished successfully', [\n 'since' => $since,\n 'to' => $to,\n 'team_id' => $this->team?->getId(),\n ]);\n\n return $count;\n }\n\n public function syncLead(string $crmId): ?Lead\n {\n if (isset($this->config->getSettings()['lead_sync_disabled'])) {\n $this->logger->info('[integration-app] Syncing leads disabled for the client', [\n 'team_id' => $this->team?->getId(),\n 'crm_id' => $crmId,\n ]);\n\n return null;\n }\n\n try {\n $leadRecord = $this->client->getSingleAndConvertLead($crmId);\n if ($leadRecord === null) {\n return null;\n }\n\n return $this->importLead($leadRecord);\n } catch (RequestException) {\n return null;\n }\n }\n\n private function importLead(DTO\\Lead $leadDto): ?Lead\n {\n /** @var CrmEntityRepository $crmEntityRepo */\n $crmEntityRepo = app(CrmEntityRepository::class);\n $userId = $this->findMappedUserId($leadDto->ownerId);\n\n $stage = null;\n if ($this->editionConfig->supportsStages()) {\n // Get the current stage.\n $stage = $crmEntityRepo->getStageForName(\n configuration: $this->config,\n name: $leadDto->status,\n type: Stage::TYPE_LEAD\n );\n }\n\n if ($stage === null && ! empty($leadDto->status)) {\n // Try to sync and import the lead stage by name only\n $stage = $this->syncStageByNameOnly($this->config, $leadDto->status, Stage::TYPE_LEAD);\n }\n\n $stageId = $stage?->id;\n\n $leadData = [\n 'team_id' => $this->team->getId(),\n 'crm_configuration_id' => $this->config->getId(),\n 'crm_provider_id' => $leadDto->externalId,\n 'name' => $leadDto->fullName,\n 'company' => $leadDto->companyName,\n 'owner_id' => $leadDto->ownerId,\n 'user_id' => $userId,\n 'stage_id' => $stageId,\n 'email' => $leadDto->primaryEmail,\n 'phone' => $leadDto->primaryPhone,\n 'mobile_phone' => $leadDto->secondaryPhone,\n 'title' => $leadDto->jobTitle,\n 'remotely_created_at' => $leadDto->createdAt,\n ];\n\n $convertedLeadData = $this->processConvertedLead($crmEntityRepo, $leadDto);\n $leadData = array_merge($leadData, $convertedLeadData);\n\n $this->logger->info('[integration-app] Importing lead', [\n 'crm_provider_id' => $leadDto->externalId,\n 'name' => $leadDto->primaryEmail,\n 'team_id' => $this->team?->getId(),\n ]);\n\n $lead = $crmEntityRepo->importLead($this->config, $leadData);\n\n $this->dispatchLeadConvertedEvent($lead);\n\n return $lead;\n }\n\n private function processConvertedLead(CrmEntityRepository $crmEntityRepo, DTO\\Lead $leadDto): array\n {\n if (! $leadDto->isConverted()) {\n return [];\n }\n\n $leadData = [\n 'converted_at' => $leadDto->getConvertedAt(),\n ];\n\n $this->decorateWithConvertedContact($crmEntityRepo, $leadDto, $leadData);\n $this->decorateWithConvertedAccount($crmEntityRepo, $leadDto, $leadData);\n $this->decorateWithConvertedOpportunity($crmEntityRepo, $leadDto, $leadData);\n\n return $leadData;\n }\n\n private function dispatchLeadConvertedEvent(Lead $lead): void\n {\n if ($lead->wasChanged('converted_at') && $lead->getConvertedAt() !== null) {\n event(new LeadConverted($lead));\n }\n }\n\n private function decorateWithConvertedContact(\n CrmEntityRepository $crmEntityRepo,\n DTO\\Lead $leadDto,\n array &$leadData\n ): void {\n if ($leadDto->getConvertedContactId() !== null) {\n $convertedContact = $crmEntityRepo->findContactByExternalId(\n $this->config,\n $leadDto->getConvertedContactId()\n );\n\n if ($convertedContact === null) {\n try {\n $convertedContact = $this->syncContact($leadDto->getConvertedContactId());\n } catch (\\Exception $exception) {\n $this->logger->error('[integration-app] Error syncing converted contact', [\n 'lead_id' => $leadDto->getExternalId(),\n 'crm_provider_id' => $leadDto->getConvertedContactId(),\n 'error' => $exception->getMessage(),\n ]);\n }\n }\n\n $leadData['converted_contact_id'] = $convertedContact?->getId();\n }\n }\n\n private function decorateWithConvertedAccount(\n CrmEntityRepository $crmEntityRepo,\n DTO\\Lead $leadDto,\n array &$leadData\n ): void {\n if ($leadDto->getConvertedAccountId() !== null) {\n $convertedAccount = $crmEntityRepo->findAccountByExternalId(\n $this->config,\n $leadDto->getConvertedAccountId()\n );\n\n if ($convertedAccount === null) {\n try {\n $convertedAccount = $this->syncAccount($leadDto->getConvertedAccountId());\n } catch (\\Exception $exception) {\n $this->logger->error('[integration-app] Error syncing converted account', [\n 'lead_id' => $leadDto->getExternalId(),\n 'crm_provider_id' => $leadDto->getConvertedAccountId(),\n 'error' => $exception->getMessage(),\n ]);\n }\n }\n\n $leadData['converted_account_id'] = $convertedAccount?->getId();\n }\n }\n\n private function decorateWithConvertedOpportunity(\n CrmEntityRepository $crmEntityRepo,\n DTO\\Lead $leadDto,\n array &$leadData\n ): void {\n if ($leadDto->getConvertedOpportunityId() !== null) {\n $convertedOpportunity = $crmEntityRepo->findOpportunityByExternalId(\n $this->config,\n $leadDto->getConvertedOpportunityId()\n );\n\n if ($convertedOpportunity === null) {\n try {\n $convertedOpportunity = $this->syncOpportunity($leadDto->getConvertedOpportunityId());\n } catch (\\Exception $exception) {\n $this->logger->error('[integration-app] Error syncing converted opportunity', [\n 'lead_id' => $leadDto->getExternalId(),\n 'crm_provider_id' => $leadDto->getConvertedOpportunityId(),\n 'error' => $exception->getMessage(),\n ]);\n }\n }\n\n $leadData['converted_opportunity_id'] = $convertedOpportunity?->getId();\n }\n }\n\n /**\n * @throws GuzzleException\n */\n public function importStages(?array $types = null, ?string $missingStageName = null): ?Stage\n {\n if (! $this->editionConfig->supportsStages()) {\n return null;\n }\n\n $missingStage = null;\n $stagesCollection = $this->client->getAllDealsStages();\n foreach ($stagesCollection as $eachStage) {\n $stage = $this->importStage($eachStage);\n\n if ($stage->getName() === $missingStageName) {\n $missingStage = $stage;\n }\n }\n\n return $missingStage;\n }\n\n private function importStage(DTO\\EntityStage $stageDto): Stage\n {\n /** @var CrmEntityRepository $crmEntityRepo */\n $crmEntityRepo = app(CrmEntityRepository::class);\n $objectType = $stageDto->type ?? Stage::TYPE_OPPORTUNITY;\n\n $stageData = [\n 'crm_provider_id' => $stageDto->externalId,\n 'name' => mb_strimwidth($stageDto->apiName ?? $stageDto->name, 0, 50),\n 'label' => mb_strimwidth($stageDto->masterLabel ?? $stageDto->name, 0, 191),\n 'sequence' => $stageDto->sortOrder ?? 0,\n 'probability' => $stageDto->defaultProbability ?? null,\n 'is_selectable' => $stageDto->isActive ?? 0,\n 'type' => $objectType,\n ];\n\n $this->logger->info('[integration-app] Importing stage', [\n 'crm_provider_id' => $stageDto->externalId,\n 'name' => $stageDto->name,\n 'team_id' => $this->team?->getId(),\n ]);\n\n $stage = $crmEntityRepo->importStage($this->config, $objectType, $stageData);\n\n // Include newly imported stages to the map\n $this->mapExternalStage($stage);\n\n return $stage;\n }\n\n /**\n * Attach a stage to a default business process.\n * This method is used only in Zoho implementation\n * where both supportsPipelines and supportsPipelines are false\n */\n public function syncBusinessProcessStages(int $stageId): void\n {\n /** @var StageRepository $stageRepository */\n $stageRepository = app(StageRepository::class);\n $processName = 'DefaultOpportunityProcess';\n $data = [\n 'team_id' => $this->team->getId(),\n 'name' => $processName,\n 'type' => Stage::TYPE_OPPORTUNITY,\n 'is_selectable' => true,\n ];\n\n $businessProcess = $stageRepository->findOrCreateBusinessProcess(\n $this->config,\n $processName,\n $data\n );\n\n $businessProcess->stages()->attach($stageId);\n }\n\n /**\n * bool $matchFromOtherCrm\n * When inserting a deal match try to match it to an existing from other CRM within the same team.\n * - This parameter is intended to be manually used only. It will help with\n * matching older opportunities if the team is transitioning from one CRM provider to another.\n */\n private function upsertOpportunity(DTO\\Opportunity $opportunityDto, bool $matchFromOtherCrm = false): ?Opportunity\n {\n $this->logger->info('[integration-app] Importing opportunity', [\n 'crm_provider_id' => $opportunityDto->externalId,\n 'team_id' => $this->team->getId(),\n ]);\n\n if ($this->config === null) {\n $this->logger->warning('[integration-app] Opportunity missing config');\n\n return null;\n }\n\n $stageId = $this->findOpportunityStageId(\n externalStageId: $opportunityDto->stageId,\n stageName: $opportunityDto->stageName\n );\n\n // temporary detect memory usage\n $this->logger->info('[integration-app] Stage ID', [\n 'memory_usage' => memory_get_usage(),\n 'memory_real_usage' => memory_get_usage(true),\n 'crm_provider_id' => $opportunityDto->externalId,\n 'stage_id' => $stageId,\n ]);\n\n $accountId = $this->findAccountId(\n pivotEntityId: $opportunityDto->externalId,\n externalAccountId: $opportunityDto->accountId,\n externalContactId: $opportunityDto->contactId,\n );\n\n $this->logger->info('[integration-app] Account ID', [\n 'memory_usage' => memory_get_usage(),\n 'memory_real_usage' => memory_get_usage(true),\n 'crm_provider_id' => $opportunityDto->externalId,\n 'account_id' => $accountId,\n ]);\n\n if ($stageId === null || $accountId === null) {\n $this->logger->warning('[integration-app] Opportunity missing data', [\n 'stageId' => $stageId,\n 'accountId' => $accountId,\n 'externalId' => $opportunityDto->externalId,\n ]);\n\n return null;\n }\n\n $userId = $this->findMappedUserId(externalUserId: $opportunityDto->ownerId);\n\n $data = [\n 'crm_provider_id' => $opportunityDto->externalId,\n 'team_id' => $this->team->getId(),\n 'account_id' => $accountId,\n 'user_id' => $userId,\n 'owner_id' => $opportunityDto->ownerId,\n 'name' => mb_strimwidth($opportunityDto->name, 0, 128),\n 'value' => $opportunityDto->amount,\n 'currency_code' => CurrencyFormatter::formatCode($this->getCurrencyIso($opportunityDto)),\n 'close_date' => $opportunityDto->closeDate,\n 'is_closed' => $opportunityDto->closed,\n 'is_won' => $opportunityDto->won,\n 'stage_id' => $stageId,\n 'record_type_id' => null,\n 'remotely_created_at' => $opportunityDto->createdAt,\n 'probability' => $opportunityDto->probability,\n ];\n\n /** @var CrmEntityRepository $crmEntityRepo */\n $crmEntityRepo = app(CrmEntityRepository::class);\n $opportunity = $crmEntityRepo->importOpportunity(\n $this->config,\n $data,\n $matchFromOtherCrm,\n $opportunityDto->name,\n );\n\n // Import external fields into crm_field_data if present\n $crmFields = $this->getOpportunitySyncableFields();\n $this->importOpportunityFieldData($opportunityDto, $crmFields, $opportunity->getId());\n\n if ($opportunityDto->deleted === true) {\n $opportunity->delete();\n\n return $opportunity;\n }\n\n if ($opportunity->wasRecentlyCreated) {\n MatchActivitiesToNewOpportunity::dispatch($opportunity->getId());\n }\n\n return $opportunity;\n }\n\n private function findOpportunityStageId(?string $externalStageId, ?string $stageName): ?int\n {\n $stageId = null;\n\n if ($this->editionConfig->supportsStages()) {\n $stageId = $this->findMappedStageId(externalStageId: $externalStageId, type: Stage::TYPE_OPPORTUNITY);\n\n if ($stageId === null) {\n $stageId = $this->importStages(types: [Stage::TYPE_OPPORTUNITY], missingStageName: $stageName)?->id;\n }\n }\n\n if ($stageId === null && $stageName !== null) {\n $stageId = $this->syncStageByNameOnly(\n configuration: $this->config,\n stageName: $stageName,\n type: Stage::TYPE_OPPORTUNITY\n )?->id;\n }\n\n return $stageId;\n }\n\n private function importOpportunityFieldData(\n DTO\\Opportunity $opportunityDto,\n array $crmFields,\n int $opportunityId\n ): void {\n /** @var FieldRepository $fieldRepository */\n $fieldRepository = app(FieldRepository::class);\n /** @var FieldDataRepository $fieldDataRepository */\n $fieldDataRepository = app(FieldDataRepository::class);\n\n foreach ($crmFields as $crmField) {\n if (! property_exists($opportunityDto, $crmField)) {\n continue;\n }\n\n if ($opportunityDto->{$crmField} === null) {\n continue;\n }\n\n $field = $fieldRepository->findFieldByCrmIdAndObjectType(\n $this->config,\n $crmField,\n Field::OBJECT_OPPORTUNITY\n );\n\n if (! $field instanceof Field) {\n $this->logger->info('Field not found', [\n 'field' => $crmField,\n 'config' => $this->config->getId(),\n ]);\n\n continue;\n }\n\n $entities = $field->getEntities();\n if ($entities->isEmpty()) {\n $this->logger->info('Field has no entities', [\n 'field' => $crmField,\n 'config' => $this->config->getId(),\n ]);\n\n continue;\n }\n\n if ($entities->count() > 1) {\n $this->logger->info('Field has multiple entities', [\n 'field' => $crmField,\n 'config' => $this->config->getId(),\n ]);\n\n continue;\n }\n\n /** @var LayoutEntity|null $entity */\n $entity = $entities->first();\n if (! $entity instanceof LayoutEntity) {\n continue;\n }\n\n $value = (string) $opportunityDto->{$crmField};\n\n $fieldDataRepository->updateOrCreateFieldData(\n $entity,\n $opportunityId,\n $value,\n );\n }\n }\n\n private function getCurrencyIso(DTO\\Opportunity $opportunityDto): ?string\n {\n if ($opportunityDto->currencyIso !== null) {\n return $opportunityDto->currencyIso;\n }\n\n // Fallback to billing currency\n return $this->config->getDefaultCurrency();\n }\n\n /**\n * Some CRM providers do not support listing all stages.\n * Additionally, they may not even supply us with a stage ID when the stage is supplied as a property of the deal.\n * In that case, we will usually have only a stage name.\n * In order to import such stages only once, we will slugify them and produce \"external ID\" on our own.\n */\n private function syncStageByNameOnly(Configuration $configuration, string $stageName, ?string $type = null): ?Stage\n {\n // @TEMP For testing purposes only!!!\n // Revert when we find suitable way to fetch the stage\n /** @var CrmEntityRepository $crmEntityRepo */\n $crmEntityRepo = app(CrmEntityRepository::class);\n $stage = $crmEntityRepo->getStageForName($configuration, $stageName, $type);\n if ($stage !== null) {\n return $stage;\n }\n\n // if there is other legitimate way to fetch the stage skip.\n if ($this->editionConfig->supportsPipelines() ||\n $this->editionConfig->supportsStages()\n ) {\n return null;\n }\n\n /** @var CrmEntityRepository $crmEntityRepo */\n $crmEntityRepo = app(CrmEntityRepository::class);\n $stage = $crmEntityRepo->getStageForName($configuration, $stageName, $type);\n\n // Create the stage if it does not exist already\n if ($stage === null) {\n $stageDto = new DTO\\EntityStage();\n $stageDto->externalId = $stageName;\n $stageDto->masterLabel = Str::slug($stageName);\n $stageDto->name = $stageName;\n\n $stageDto->type = $type;\n\n $stage = $this->importStage($stageDto);\n\n if ($type === Stage::TYPE_OPPORTUNITY) {\n $this->syncBusinessProcessStages($stage->getId());\n }\n }\n\n return $stage;\n }\n\n private function findAccountId(\n string $pivotEntityId,\n ?string $externalAccountId = null,\n ?string $externalContactId = null,\n bool $skipAccountSync = false,\n ): ?int {\n $accountId = $this->findMappedAccountId(\n pivotEntityId: $pivotEntityId,\n externalAccountId: $externalAccountId,\n skipAccountSync: $skipAccountSync,\n );\n\n if ($accountId !== null) {\n return $accountId;\n }\n\n /**\n * The deal probably does not have an Account assigned.\n * In order to not break the existing import, we will try to find a contact\n * and create an Account with the same data.\n */\n if (! empty($externalContactId)) {\n // In rare cases the contact's external id matches our account id, whe :(\n $this->logger->info('[integration-app] fallback Account', ['contact_id' => $externalContactId]);\n\n $accountId = $this->findMappedAccountId(\n pivotEntityId: $pivotEntityId,\n externalAccountId: $externalContactId,\n skipAccountSync: true,\n );\n\n if ($accountId !== null) {\n return $accountId;\n }\n\n $this->logger->info('[integration-app] create Account from Contact', ['contact_id' => $externalContactId]);\n $crmEntityRepo = app(CrmEntityRepository::class);\n\n $contact = $crmEntityRepo->findContactByExternalId($this->config, $externalContactId);\n if ($contact !== null) {\n return $this->createInternalAccountFromContact($contact)->getId();\n }\n }\n\n return null;\n }\n\n private function createInternalAccountFromContact(Contact $contact): Account\n {\n $this->logger->info('[integration-app] Create internal account from contact', [\n 'team_id' => $this->team?->getId(),\n 'contact_id' => $contact->getId(),\n 'crm_provider_id' => $contact->getCrmProviderId(),\n ]);\n\n $data = [\n 'crm_configuration_id' => $this->config->getId(),\n 'team_id' => $this->config->getTeamId(),\n 'crm_provider_id' => $contact->getCrmProviderId(),\n 'user_id' => $contact->getUserId(),\n 'owner_id' => $contact->getOwnerId(),\n 'name' => $contact->getName(),\n 'phone' => $contact->getPhone(),\n 'country_code' => $contact->getCountryCode(),\n 'remotely_created_at' => $contact->getRemotelyCreatedAt(),\n 'is_internal' => 1,\n ];\n\n /** @var CrmEntityRepository $crmEntityRepo */\n $crmEntityRepo = app(CrmEntityRepository::class);\n $account = $crmEntityRepo->importAccount($this->config, $data);\n\n if ($contact->account_id === null) {\n $contact->account_id = $account->getId();\n $contact->save();\n }\n\n $this->mapExternalAccount($account);\n\n return $account;\n }\n\n private function batchSyncContacts(array $externalContactIds): void\n {\n $this->logger->info('[integration-app] Syncing batch contacts', [\n 'batch_contacts' => implode(',', $externalContactIds),\n 'team_id' => $this->team?->getId(),\n ]);\n\n /** IntegrationApp allows up to 100 IDs passed as a batch. */\n $chunkedContacts = array_chunk($externalContactIds, self::CHUNK_SIZE);\n foreach ($chunkedContacts as $contactGroup) {\n /** @var DTO\\Contact[] $pageResultData */\n foreach ($this->client->getBatchContactsById($contactGroup) as $pageResultData) {\n $externalAccounts = [];\n foreach ($pageResultData as $eachRecord) {\n $externalAccounts[] = $eachRecord->accountId ?? null;\n }\n\n $missingAccounts = $this->identifyMissingAccounts($externalAccounts);\n if (! empty($missingAccounts)) {\n $this->batchSyncAccounts($missingAccounts);\n }\n\n foreach ($pageResultData as $eachRecord) {\n $this->importContact($eachRecord);\n }\n }\n }\n }\n\n private function batchSyncAccounts(array $externalAccountIds): void\n {\n $this->logger->info('[integration-app] Syncing batch accounts', [\n 'batch_contacts' => implode(',', $externalAccountIds),\n 'team_id' => $this->team?->getId(),\n ]);\n\n /** IntegrationApp allows up to 100 IDs passed as a batch. */\n $chunkedAccounts = array_chunk($externalAccountIds, self::CHUNK_SIZE);\n foreach ($chunkedAccounts as $accountGroup) {\n /** @var DTO\\Account[] $pageResultData */\n foreach ($this->client->getBatchAccountsById($accountGroup) as $pageResultData) {\n foreach ($pageResultData as $eachRecord) {\n $this->importAccount($eachRecord);\n }\n }\n }\n }\n\n /**\n * Identify all contacts Ids, that are not found in our database.\n * Scoped to the current batch so memory and query cost scale with batch size,\n * not with tenant size.\n *\n * @param array<?string> $contacts\n *\n * @return list<string>\n */\n private function identifyMissingContacts(array $contacts): array\n {\n $wanted = array_values(array_unique(array_filter($contacts)));\n if ($wanted === []) {\n return [];\n }\n\n /** @var CrmEntityRepository $crmEntityRepo */\n $crmEntityRepo = app(CrmEntityRepository::class);\n $existing = $crmEntityRepo->getExistingContactCrmIds($this->config, $wanted);\n\n return array_values(array_diff($wanted, $existing));\n }\n\n /**\n * Identify all account Ids, that are not found in our database.\n * Scoped to the current batch so memory and query cost scale with batch size,\n * not with tenant size.\n *\n * @param array<?string> $accounts\n *\n * @return list<string>\n */\n private function identifyMissingAccounts(array $accounts): array\n {\n $wanted = array_values(array_unique(array_filter($accounts)));\n if ($wanted === []) {\n return [];\n }\n\n /** @var CrmEntityRepository $crmEntityRepo */\n $crmEntityRepo = app(CrmEntityRepository::class);\n $existing = $crmEntityRepo->getExistingAccountCrmIds($this->config, $wanted);\n\n return array_values(array_diff($wanted, $existing));\n }\n}","depth":4,"on_screen":true,"value":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Services\\Crm\\IntegrationApp\\ServiceTraits;\n\nuse Carbon\\Carbon;\nuse GuzzleHttp\\Exception\\GuzzleException;\nuse GuzzleHttp\\Exception\\RequestException;\nuse Illuminate\\Support\\Str;\nuse Jiminny\\Events\\Activities\\Crm\\LeadConverted;\nuse Jiminny\\Models\\Contact;\nuse Jiminny\\Models\\Crm\\Configuration;\nuse Jiminny\\Models\\Crm\\Field;\nuse Jiminny\\Models\\Crm\\LayoutEntity;\nuse Jiminny\\Models\\Lead;\nuse Jiminny\\Models\\Opportunity;\nuse Jiminny\\Models\\Stage;\nuse Jiminny\\Models\\Team;\nuse Jiminny\\Models\\Account;\nuse Jiminny\\Jobs\\Crm\\MatchActivitiesToNewOpportunity;\nuse Jiminny\\Repositories\\Crm\\CrmEntityRepository;\nuse Jiminny\\Repositories\\Crm\\FieldDataRepository;\nuse Jiminny\\Repositories\\Crm\\FieldRepository;\nuse Jiminny\\Repositories\\Crm\\StageRepository;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\Config\\IntegrationConfigInterface as IntegrationConfig;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\DTO;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\DataClient;\nuse Jiminny\\Services\\Crm\\OpportunitySyncStrategyResolver;\nuse Jiminny\\Utils\\CurrencyFormatter;\nuse Psr\\Log\\LoggerInterface;\n\n/**\n * This trait follows closely the contract SyncCrmEntitiesInterface\n */\ntrait SyncCrmEntitiesTrait\n{\n use ExternalMapsTrait;\n\n private const int CHUNK_SIZE = 100;\n\n public ?Team $team = null;\n public ?Configuration $config;\n public ?IntegrationConfig $editionConfig;\n protected LoggerInterface $logger;\n /**\n * @var DataClient\n */\n protected $client;\n\n public function syncAllAccounts(): int\n {\n $count = 0;\n foreach ($this->client->getAllAccounts() as $eachAccount) {\n $this->importAccount($eachAccount);\n $count++;\n }\n\n return $count;\n }\n\n public function syncAccounts(Carbon $since, ?Carbon $to = null): int\n {\n $count = 0;\n $this->logger->info('[integration-app] Syncing accounts', [\n 'since' => $since,\n 'to' => $to,\n 'team_id' => $this->team?->getId(),\n ]);\n\n $params = [\n 'since' => $since,\n 'to' => $to,\n ];\n\n /** @var DTO\\Account $eachAccount*/\n foreach ($this->client->getFilteredAccounts($params) as $eachAccount) {\n $this->importAccount($eachAccount);\n $count++;\n }\n\n $this->logger->info('[integration-app] Syncing accounts finished successfully', [\n 'since' => $since,\n 'to' => $to,\n 'team_id' => $this->team?->getId(),\n ]);\n\n return $count;\n }\n\n public function syncAccount(string $crmId): ?Account\n {\n try {\n $accountDto = $this->client->getSingleAccount($crmId);\n if ($accountDto === null) {\n return null;\n }\n\n return $this->importAccount($accountDto);\n } catch (RequestException) {\n return null;\n }\n }\n\n private function importAccount(DTO\\Account $accountDto): Account\n {\n /** @var CrmEntityRepository $crmEntityRepo */\n $crmEntityRepo = app(CrmEntityRepository::class);\n $data = [\n 'crm_provider_id' => $accountDto->externalId,\n 'user_id' => $this->findMappedUserId($accountDto->ownerId),\n 'owner_id' => $accountDto->ownerId,\n 'name' => mb_substr($accountDto->name, 0, 191),\n 'phone' => $accountDto->phone !== null ? mb_substr($accountDto->phone, 0, 25) : null,\n 'industry' => $accountDto->industry !== null ? mb_substr($accountDto->industry, 0, 191) : null,\n 'domain' => $accountDto->websiteUrl !== null ? mb_substr($accountDto->websiteUrl, 0, 191) : null,\n 'country_code' => $accountDto->countryCode,\n 'remotely_created_at' => $accountDto->createdAt,\n ];\n\n $this->logger->info('[integration-app] Importing account', [\n 'crm_provider_id' => $accountDto->externalId,\n 'team_id' => $this->team?->getId(),\n ]);\n\n $account = $crmEntityRepo->importAccount($this->getConfiguration(), $data);\n $this->mapExternalAccount($account);\n\n return $account;\n }\n\n // Sync multiple records.\n public function syncAllContacts(): int\n {\n $count = 0;\n foreach ($this->client->getAllContacts() as $eachContact) {\n // import contacts here\n $this->importContact(contactDto: $eachContact);\n $count++;\n }\n\n return $count;\n }\n\n public function syncContacts(Carbon $since, ?Carbon $to = null): int\n {\n $count = 0;\n $this->logger->info('[integration-app] Syncing contacts', [\n 'since' => $since,\n 'to' => $to,\n 'team_id' => $this->team?->getId(),\n ]);\n\n $params = [\n 'since' => $since,\n 'to' => $to,\n ];\n\n foreach ($this->client->getFilteredContacts($params) as $eachContact) {\n $this->importContact($eachContact);\n $count++;\n }\n\n $this->logger->info('[integration-app] Syncing contacts finished successfully', [\n 'since' => $since,\n 'to' => $to,\n 'team_id' => $this->team?->getId(),\n ]);\n\n return $count;\n }\n\n // Sync single records.\n public function syncContact(string $crmId): ?Contact\n {\n try {\n $contactRecord = $this->client->getSingleContact($crmId);\n if ($contactRecord === null) {\n return null;\n }\n\n return $this->importContact($contactRecord);\n } catch (RequestException) {\n return null;\n }\n }\n\n private function importContact(DTO\\Contact $contactDto): ?Contact\n {\n $createInternalAccount = false;\n\n /** @var CrmEntityRepository $crmEntityRepo */\n $crmEntityRepo = app(CrmEntityRepository::class);\n\n $accountId = $this->findMappedAccountId(\n pivotEntityId: $contactDto->externalId,\n externalAccountId: $contactDto->accountId,\n );\n $userId = $this->findMappedUserId($contactDto->ownerId);\n\n if ($accountId === null) {\n $this->logger->info('[integration-app] Importing contact, but related account cannot be found', [\n 'crm_provider_id' => $contactDto->externalId,\n 'raw_account_id' => $contactDto->accountId,\n 'name' => $contactDto->fullName,\n 'user_id' => $userId,\n ]);\n\n $createInternalAccount = true;\n }\n\n $data = [\n 'user_id' => $userId,\n 'account_id' => $accountId,\n 'crm_provider_id' => $contactDto->externalId,\n 'owner_id' => $contactDto->ownerId,\n 'name' => $contactDto->fullName !== null ? mb_substr($contactDto->fullName, 0, 100) : null,\n 'title' => $contactDto->title !== null ? mb_substr($contactDto->title, 0, 100) : null,\n 'email' => $contactDto->primaryEmail !== null ? mb_substr($contactDto->primaryEmail, 0, 191) : null,\n 'phone' => $contactDto->phone !== null ? mb_substr($contactDto->phone, 0, 25) : null,\n 'mobile_phone' => $contactDto->mobilePhone !== null ? mb_substr($contactDto->mobilePhone, 0, 25) : null,\n 'country_code' => $contactDto->countryCode !== null ? mb_substr($contactDto->countryCode, 0, 2) : null,\n 'remotely_created_at' => $contactDto->createdAt,\n 'photo_path' => '',\n ];\n\n $this->logger->info('[integration-app] Importing contact', [\n 'crm_provider_id' => $contactDto->externalId,\n 'team_id' => $this->team?->getId(),\n ]);\n\n $contact = $crmEntityRepo->importContact($this->getConfiguration(), $data);\n $this->mapExternalContact($contact);\n\n if ($createInternalAccount) {\n $this->createInternalAccountFromContact($contact)->getId();\n }\n\n return $contact;\n }\n\n /**\n * @param bool $matchFromOtherCrm - This parameter is intended to be manually used. It will help with\n * matching older opportunities if the team is transitioning from one CRM provider to another.\n */\n public function syncAllOpportunities(bool $matchFromOtherCrm = false): int\n {\n $count = 0;\n foreach ($this->client->getAllOpportunities() as $eachDeal) {\n $this->upsertOpportunity($eachDeal, $matchFromOtherCrm);\n $count++;\n }\n\n return $count;\n }\n\n public function syncOpportunities(array $parameters, ?string $strategy = null): int\n {\n $parameters['strategy'] = $strategy ?? OpportunitySyncStrategyResolver::LAST_MODIFIED_SYNC_OPPORTUNITY_STRATEGY;\n $count = 0;\n\n $this->logger->info('[integration-app] Syncing opportunities', [\n 'parameters' => $parameters,\n 'team_id' => $this->team?->getId(),\n ]);\n\n /** @var DTO\\Opportunity[] $pageResultData */\n foreach ($this->client->getFilteredOpportunities($parameters) as $pageResultData) {\n $externalAccounts = [];\n $externalContacts = [];\n\n foreach ($pageResultData as $eachRecord) {\n $externalAccounts[] = $eachRecord->accountId ?? null;\n $externalContacts[] = $eachRecord->contactId ?? null;\n }\n\n // Import missing contacts and account as early as possible\n $missingContacts = $this->identifyMissingContacts($externalContacts);\n if (! empty($missingContacts)) {\n $this->batchSyncContacts($missingContacts);\n }\n\n $missingAccounts = $this->identifyMissingAccounts($externalAccounts);\n if (! empty($missingAccounts)) {\n $this->batchSyncAccounts($missingAccounts);\n }\n\n foreach ($pageResultData as $eachRecord) {\n $this->upsertOpportunity($eachRecord);\n $count++;\n }\n }\n\n $this->logger->info('[integration-app] Syncing opportunities finished successfully', [\n 'parameters' => $parameters,\n 'team_id' => $this->team?->getId(),\n ]);\n\n return $count;\n }\n\n public function syncOpportunity(string $crmId): ?Opportunity\n {\n try {\n $opportunityRecord = $this->client->getSingleOpportunity($crmId);\n if ($opportunityRecord === null) {\n return null;\n }\n\n return $this->upsertOpportunity($opportunityRecord);\n } catch (RequestException) {\n return null;\n }\n }\n\n public function syncAllLeads(): int\n {\n if (isset($this->config->getSettings()['lead_sync_disabled'])) {\n $this->logger->info('[integration-app] Syncing leads disabled for the client', [\n 'team_id' => $this->team?->getId(),\n ]);\n\n return 0;\n }\n\n $count = 0;\n foreach ($this->client->getAllLeads() as $eachLead) {\n $this->importLead($eachLead);\n $count++;\n }\n\n return $count;\n }\n\n public function syncLeads(Carbon $since, ?Carbon $to = null, ?string $crmProfileId = null): int\n {\n if (isset($this->config->getSettings()['lead_sync_disabled'])) {\n $this->logger->info('[integration-app] Syncing leads disabled for the client', [\n 'team_id' => $this->team?->getId(),\n 'since' => $since,\n 'to' => $to,\n 'crm_profile_id' => $crmProfileId,\n ]);\n\n return 0;\n }\n\n $count = 0;\n $this->logger->info('[integration-app] Syncing leads', [\n 'since' => $since,\n 'to' => $to,\n 'crm_profile_id' => $crmProfileId,\n 'team_id' => $this->team?->getId(),\n ]);\n\n $filterData = [\n 'since' => $since,\n 'to' => $to,\n 'crm_profile_id' => $crmProfileId,\n 'converted' => 'both',\n ];\n\n foreach ($this->client->getFilteredLeads($filterData) as $eachLead) {\n $this->importLead($eachLead);\n $count++;\n }\n\n $this->logger->info('[integration-app] Syncing leads finished successfully', [\n 'since' => $since,\n 'to' => $to,\n 'team_id' => $this->team?->getId(),\n ]);\n\n return $count;\n }\n\n public function syncLead(string $crmId): ?Lead\n {\n if (isset($this->config->getSettings()['lead_sync_disabled'])) {\n $this->logger->info('[integration-app] Syncing leads disabled for the client', [\n 'team_id' => $this->team?->getId(),\n 'crm_id' => $crmId,\n ]);\n\n return null;\n }\n\n try {\n $leadRecord = $this->client->getSingleAndConvertLead($crmId);\n if ($leadRecord === null) {\n return null;\n }\n\n return $this->importLead($leadRecord);\n } catch (RequestException) {\n return null;\n }\n }\n\n private function importLead(DTO\\Lead $leadDto): ?Lead\n {\n /** @var CrmEntityRepository $crmEntityRepo */\n $crmEntityRepo = app(CrmEntityRepository::class);\n $userId = $this->findMappedUserId($leadDto->ownerId);\n\n $stage = null;\n if ($this->editionConfig->supportsStages()) {\n // Get the current stage.\n $stage = $crmEntityRepo->getStageForName(\n configuration: $this->config,\n name: $leadDto->status,\n type: Stage::TYPE_LEAD\n );\n }\n\n if ($stage === null && ! empty($leadDto->status)) {\n // Try to sync and import the lead stage by name only\n $stage = $this->syncStageByNameOnly($this->config, $leadDto->status, Stage::TYPE_LEAD);\n }\n\n $stageId = $stage?->id;\n\n $leadData = [\n 'team_id' => $this->team->getId(),\n 'crm_configuration_id' => $this->config->getId(),\n 'crm_provider_id' => $leadDto->externalId,\n 'name' => $leadDto->fullName,\n 'company' => $leadDto->companyName,\n 'owner_id' => $leadDto->ownerId,\n 'user_id' => $userId,\n 'stage_id' => $stageId,\n 'email' => $leadDto->primaryEmail,\n 'phone' => $leadDto->primaryPhone,\n 'mobile_phone' => $leadDto->secondaryPhone,\n 'title' => $leadDto->jobTitle,\n 'remotely_created_at' => $leadDto->createdAt,\n ];\n\n $convertedLeadData = $this->processConvertedLead($crmEntityRepo, $leadDto);\n $leadData = array_merge($leadData, $convertedLeadData);\n\n $this->logger->info('[integration-app] Importing lead', [\n 'crm_provider_id' => $leadDto->externalId,\n 'name' => $leadDto->primaryEmail,\n 'team_id' => $this->team?->getId(),\n ]);\n\n $lead = $crmEntityRepo->importLead($this->config, $leadData);\n\n $this->dispatchLeadConvertedEvent($lead);\n\n return $lead;\n }\n\n private function processConvertedLead(CrmEntityRepository $crmEntityRepo, DTO\\Lead $leadDto): array\n {\n if (! $leadDto->isConverted()) {\n return [];\n }\n\n $leadData = [\n 'converted_at' => $leadDto->getConvertedAt(),\n ];\n\n $this->decorateWithConvertedContact($crmEntityRepo, $leadDto, $leadData);\n $this->decorateWithConvertedAccount($crmEntityRepo, $leadDto, $leadData);\n $this->decorateWithConvertedOpportunity($crmEntityRepo, $leadDto, $leadData);\n\n return $leadData;\n }\n\n private function dispatchLeadConvertedEvent(Lead $lead): void\n {\n if ($lead->wasChanged('converted_at') && $lead->getConvertedAt() !== null) {\n event(new LeadConverted($lead));\n }\n }\n\n private function decorateWithConvertedContact(\n CrmEntityRepository $crmEntityRepo,\n DTO\\Lead $leadDto,\n array &$leadData\n ): void {\n if ($leadDto->getConvertedContactId() !== null) {\n $convertedContact = $crmEntityRepo->findContactByExternalId(\n $this->config,\n $leadDto->getConvertedContactId()\n );\n\n if ($convertedContact === null) {\n try {\n $convertedContact = $this->syncContact($leadDto->getConvertedContactId());\n } catch (\\Exception $exception) {\n $this->logger->error('[integration-app] Error syncing converted contact', [\n 'lead_id' => $leadDto->getExternalId(),\n 'crm_provider_id' => $leadDto->getConvertedContactId(),\n 'error' => $exception->getMessage(),\n ]);\n }\n }\n\n $leadData['converted_contact_id'] = $convertedContact?->getId();\n }\n }\n\n private function decorateWithConvertedAccount(\n CrmEntityRepository $crmEntityRepo,\n DTO\\Lead $leadDto,\n array &$leadData\n ): void {\n if ($leadDto->getConvertedAccountId() !== null) {\n $convertedAccount = $crmEntityRepo->findAccountByExternalId(\n $this->config,\n $leadDto->getConvertedAccountId()\n );\n\n if ($convertedAccount === null) {\n try {\n $convertedAccount = $this->syncAccount($leadDto->getConvertedAccountId());\n } catch (\\Exception $exception) {\n $this->logger->error('[integration-app] Error syncing converted account', [\n 'lead_id' => $leadDto->getExternalId(),\n 'crm_provider_id' => $leadDto->getConvertedAccountId(),\n 'error' => $exception->getMessage(),\n ]);\n }\n }\n\n $leadData['converted_account_id'] = $convertedAccount?->getId();\n }\n }\n\n private function decorateWithConvertedOpportunity(\n CrmEntityRepository $crmEntityRepo,\n DTO\\Lead $leadDto,\n array &$leadData\n ): void {\n if ($leadDto->getConvertedOpportunityId() !== null) {\n $convertedOpportunity = $crmEntityRepo->findOpportunityByExternalId(\n $this->config,\n $leadDto->getConvertedOpportunityId()\n );\n\n if ($convertedOpportunity === null) {\n try {\n $convertedOpportunity = $this->syncOpportunity($leadDto->getConvertedOpportunityId());\n } catch (\\Exception $exception) {\n $this->logger->error('[integration-app] Error syncing converted opportunity', [\n 'lead_id' => $leadDto->getExternalId(),\n 'crm_provider_id' => $leadDto->getConvertedOpportunityId(),\n 'error' => $exception->getMessage(),\n ]);\n }\n }\n\n $leadData['converted_opportunity_id'] = $convertedOpportunity?->getId();\n }\n }\n\n /**\n * @throws GuzzleException\n */\n public function importStages(?array $types = null, ?string $missingStageName = null): ?Stage\n {\n if (! $this->editionConfig->supportsStages()) {\n return null;\n }\n\n $missingStage = null;\n $stagesCollection = $this->client->getAllDealsStages();\n foreach ($stagesCollection as $eachStage) {\n $stage = $this->importStage($eachStage);\n\n if ($stage->getName() === $missingStageName) {\n $missingStage = $stage;\n }\n }\n\n return $missingStage;\n }\n\n private function importStage(DTO\\EntityStage $stageDto): Stage\n {\n /** @var CrmEntityRepository $crmEntityRepo */\n $crmEntityRepo = app(CrmEntityRepository::class);\n $objectType = $stageDto->type ?? Stage::TYPE_OPPORTUNITY;\n\n $stageData = [\n 'crm_provider_id' => $stageDto->externalId,\n 'name' => mb_strimwidth($stageDto->apiName ?? $stageDto->name, 0, 50),\n 'label' => mb_strimwidth($stageDto->masterLabel ?? $stageDto->name, 0, 191),\n 'sequence' => $stageDto->sortOrder ?? 0,\n 'probability' => $stageDto->defaultProbability ?? null,\n 'is_selectable' => $stageDto->isActive ?? 0,\n 'type' => $objectType,\n ];\n\n $this->logger->info('[integration-app] Importing stage', [\n 'crm_provider_id' => $stageDto->externalId,\n 'name' => $stageDto->name,\n 'team_id' => $this->team?->getId(),\n ]);\n\n $stage = $crmEntityRepo->importStage($this->config, $objectType, $stageData);\n\n // Include newly imported stages to the map\n $this->mapExternalStage($stage);\n\n return $stage;\n }\n\n /**\n * Attach a stage to a default business process.\n * This method is used only in Zoho implementation\n * where both supportsPipelines and supportsPipelines are false\n */\n public function syncBusinessProcessStages(int $stageId): void\n {\n /** @var StageRepository $stageRepository */\n $stageRepository = app(StageRepository::class);\n $processName = 'DefaultOpportunityProcess';\n $data = [\n 'team_id' => $this->team->getId(),\n 'name' => $processName,\n 'type' => Stage::TYPE_OPPORTUNITY,\n 'is_selectable' => true,\n ];\n\n $businessProcess = $stageRepository->findOrCreateBusinessProcess(\n $this->config,\n $processName,\n $data\n );\n\n $businessProcess->stages()->attach($stageId);\n }\n\n /**\n * bool $matchFromOtherCrm\n * When inserting a deal match try to match it to an existing from other CRM within the same team.\n * - This parameter is intended to be manually used only. It will help with\n * matching older opportunities if the team is transitioning from one CRM provider to another.\n */\n private function upsertOpportunity(DTO\\Opportunity $opportunityDto, bool $matchFromOtherCrm = false): ?Opportunity\n {\n $this->logger->info('[integration-app] Importing opportunity', [\n 'crm_provider_id' => $opportunityDto->externalId,\n 'team_id' => $this->team->getId(),\n ]);\n\n if ($this->config === null) {\n $this->logger->warning('[integration-app] Opportunity missing config');\n\n return null;\n }\n\n $stageId = $this->findOpportunityStageId(\n externalStageId: $opportunityDto->stageId,\n stageName: $opportunityDto->stageName\n );\n\n // temporary detect memory usage\n $this->logger->info('[integration-app] Stage ID', [\n 'memory_usage' => memory_get_usage(),\n 'memory_real_usage' => memory_get_usage(true),\n 'crm_provider_id' => $opportunityDto->externalId,\n 'stage_id' => $stageId,\n ]);\n\n $accountId = $this->findAccountId(\n pivotEntityId: $opportunityDto->externalId,\n externalAccountId: $opportunityDto->accountId,\n externalContactId: $opportunityDto->contactId,\n );\n\n $this->logger->info('[integration-app] Account ID', [\n 'memory_usage' => memory_get_usage(),\n 'memory_real_usage' => memory_get_usage(true),\n 'crm_provider_id' => $opportunityDto->externalId,\n 'account_id' => $accountId,\n ]);\n\n if ($stageId === null || $accountId === null) {\n $this->logger->warning('[integration-app] Opportunity missing data', [\n 'stageId' => $stageId,\n 'accountId' => $accountId,\n 'externalId' => $opportunityDto->externalId,\n ]);\n\n return null;\n }\n\n $userId = $this->findMappedUserId(externalUserId: $opportunityDto->ownerId);\n\n $data = [\n 'crm_provider_id' => $opportunityDto->externalId,\n 'team_id' => $this->team->getId(),\n 'account_id' => $accountId,\n 'user_id' => $userId,\n 'owner_id' => $opportunityDto->ownerId,\n 'name' => mb_strimwidth($opportunityDto->name, 0, 128),\n 'value' => $opportunityDto->amount,\n 'currency_code' => CurrencyFormatter::formatCode($this->getCurrencyIso($opportunityDto)),\n 'close_date' => $opportunityDto->closeDate,\n 'is_closed' => $opportunityDto->closed,\n 'is_won' => $opportunityDto->won,\n 'stage_id' => $stageId,\n 'record_type_id' => null,\n 'remotely_created_at' => $opportunityDto->createdAt,\n 'probability' => $opportunityDto->probability,\n ];\n\n /** @var CrmEntityRepository $crmEntityRepo */\n $crmEntityRepo = app(CrmEntityRepository::class);\n $opportunity = $crmEntityRepo->importOpportunity(\n $this->config,\n $data,\n $matchFromOtherCrm,\n $opportunityDto->name,\n );\n\n // Import external fields into crm_field_data if present\n $crmFields = $this->getOpportunitySyncableFields();\n $this->importOpportunityFieldData($opportunityDto, $crmFields, $opportunity->getId());\n\n if ($opportunityDto->deleted === true) {\n $opportunity->delete();\n\n return $opportunity;\n }\n\n if ($opportunity->wasRecentlyCreated) {\n MatchActivitiesToNewOpportunity::dispatch($opportunity->getId());\n }\n\n return $opportunity;\n }\n\n private function findOpportunityStageId(?string $externalStageId, ?string $stageName): ?int\n {\n $stageId = null;\n\n if ($this->editionConfig->supportsStages()) {\n $stageId = $this->findMappedStageId(externalStageId: $externalStageId, type: Stage::TYPE_OPPORTUNITY);\n\n if ($stageId === null) {\n $stageId = $this->importStages(types: [Stage::TYPE_OPPORTUNITY], missingStageName: $stageName)?->id;\n }\n }\n\n if ($stageId === null && $stageName !== null) {\n $stageId = $this->syncStageByNameOnly(\n configuration: $this->config,\n stageName: $stageName,\n type: Stage::TYPE_OPPORTUNITY\n )?->id;\n }\n\n return $stageId;\n }\n\n private function importOpportunityFieldData(\n DTO\\Opportunity $opportunityDto,\n array $crmFields,\n int $opportunityId\n ): void {\n /** @var FieldRepository $fieldRepository */\n $fieldRepository = app(FieldRepository::class);\n /** @var FieldDataRepository $fieldDataRepository */\n $fieldDataRepository = app(FieldDataRepository::class);\n\n foreach ($crmFields as $crmField) {\n if (! property_exists($opportunityDto, $crmField)) {\n continue;\n }\n\n if ($opportunityDto->{$crmField} === null) {\n continue;\n }\n\n $field = $fieldRepository->findFieldByCrmIdAndObjectType(\n $this->config,\n $crmField,\n Field::OBJECT_OPPORTUNITY\n );\n\n if (! $field instanceof Field) {\n $this->logger->info('Field not found', [\n 'field' => $crmField,\n 'config' => $this->config->getId(),\n ]);\n\n continue;\n }\n\n $entities = $field->getEntities();\n if ($entities->isEmpty()) {\n $this->logger->info('Field has no entities', [\n 'field' => $crmField,\n 'config' => $this->config->getId(),\n ]);\n\n continue;\n }\n\n if ($entities->count() > 1) {\n $this->logger->info('Field has multiple entities', [\n 'field' => $crmField,\n 'config' => $this->config->getId(),\n ]);\n\n continue;\n }\n\n /** @var LayoutEntity|null $entity */\n $entity = $entities->first();\n if (! $entity instanceof LayoutEntity) {\n continue;\n }\n\n $value = (string) $opportunityDto->{$crmField};\n\n $fieldDataRepository->updateOrCreateFieldData(\n $entity,\n $opportunityId,\n $value,\n );\n }\n }\n\n private function getCurrencyIso(DTO\\Opportunity $opportunityDto): ?string\n {\n if ($opportunityDto->currencyIso !== null) {\n return $opportunityDto->currencyIso;\n }\n\n // Fallback to billing currency\n return $this->config->getDefaultCurrency();\n }\n\n /**\n * Some CRM providers do not support listing all stages.\n * Additionally, they may not even supply us with a stage ID when the stage is supplied as a property of the deal.\n * In that case, we will usually have only a stage name.\n * In order to import such stages only once, we will slugify them and produce \"external ID\" on our own.\n */\n private function syncStageByNameOnly(Configuration $configuration, string $stageName, ?string $type = null): ?Stage\n {\n // @TEMP For testing purposes only!!!\n // Revert when we find suitable way to fetch the stage\n /** @var CrmEntityRepository $crmEntityRepo */\n $crmEntityRepo = app(CrmEntityRepository::class);\n $stage = $crmEntityRepo->getStageForName($configuration, $stageName, $type);\n if ($stage !== null) {\n return $stage;\n }\n\n // if there is other legitimate way to fetch the stage skip.\n if ($this->editionConfig->supportsPipelines() ||\n $this->editionConfig->supportsStages()\n ) {\n return null;\n }\n\n /** @var CrmEntityRepository $crmEntityRepo */\n $crmEntityRepo = app(CrmEntityRepository::class);\n $stage = $crmEntityRepo->getStageForName($configuration, $stageName, $type);\n\n // Create the stage if it does not exist already\n if ($stage === null) {\n $stageDto = new DTO\\EntityStage();\n $stageDto->externalId = $stageName;\n $stageDto->masterLabel = Str::slug($stageName);\n $stageDto->name = $stageName;\n\n $stageDto->type = $type;\n\n $stage = $this->importStage($stageDto);\n\n if ($type === Stage::TYPE_OPPORTUNITY) {\n $this->syncBusinessProcessStages($stage->getId());\n }\n }\n\n return $stage;\n }\n\n private function findAccountId(\n string $pivotEntityId,\n ?string $externalAccountId = null,\n ?string $externalContactId = null,\n bool $skipAccountSync = false,\n ): ?int {\n $accountId = $this->findMappedAccountId(\n pivotEntityId: $pivotEntityId,\n externalAccountId: $externalAccountId,\n skipAccountSync: $skipAccountSync,\n );\n\n if ($accountId !== null) {\n return $accountId;\n }\n\n /**\n * The deal probably does not have an Account assigned.\n * In order to not break the existing import, we will try to find a contact\n * and create an Account with the same data.\n */\n if (! empty($externalContactId)) {\n // In rare cases the contact's external id matches our account id, whe :(\n $this->logger->info('[integration-app] fallback Account', ['contact_id' => $externalContactId]);\n\n $accountId = $this->findMappedAccountId(\n pivotEntityId: $pivotEntityId,\n externalAccountId: $externalContactId,\n skipAccountSync: true,\n );\n\n if ($accountId !== null) {\n return $accountId;\n }\n\n $this->logger->info('[integration-app] create Account from Contact', ['contact_id' => $externalContactId]);\n $crmEntityRepo = app(CrmEntityRepository::class);\n\n $contact = $crmEntityRepo->findContactByExternalId($this->config, $externalContactId);\n if ($contact !== null) {\n return $this->createInternalAccountFromContact($contact)->getId();\n }\n }\n\n return null;\n }\n\n private function createInternalAccountFromContact(Contact $contact): Account\n {\n $this->logger->info('[integration-app] Create internal account from contact', [\n 'team_id' => $this->team?->getId(),\n 'contact_id' => $contact->getId(),\n 'crm_provider_id' => $contact->getCrmProviderId(),\n ]);\n\n $data = [\n 'crm_configuration_id' => $this->config->getId(),\n 'team_id' => $this->config->getTeamId(),\n 'crm_provider_id' => $contact->getCrmProviderId(),\n 'user_id' => $contact->getUserId(),\n 'owner_id' => $contact->getOwnerId(),\n 'name' => $contact->getName(),\n 'phone' => $contact->getPhone(),\n 'country_code' => $contact->getCountryCode(),\n 'remotely_created_at' => $contact->getRemotelyCreatedAt(),\n 'is_internal' => 1,\n ];\n\n /** @var CrmEntityRepository $crmEntityRepo */\n $crmEntityRepo = app(CrmEntityRepository::class);\n $account = $crmEntityRepo->importAccount($this->config, $data);\n\n if ($contact->account_id === null) {\n $contact->account_id = $account->getId();\n $contact->save();\n }\n\n $this->mapExternalAccount($account);\n\n return $account;\n }\n\n private function batchSyncContacts(array $externalContactIds): void\n {\n $this->logger->info('[integration-app] Syncing batch contacts', [\n 'batch_contacts' => implode(',', $externalContactIds),\n 'team_id' => $this->team?->getId(),\n ]);\n\n /** IntegrationApp allows up to 100 IDs passed as a batch. */\n $chunkedContacts = array_chunk($externalContactIds, self::CHUNK_SIZE);\n foreach ($chunkedContacts as $contactGroup) {\n /** @var DTO\\Contact[] $pageResultData */\n foreach ($this->client->getBatchContactsById($contactGroup) as $pageResultData) {\n $externalAccounts = [];\n foreach ($pageResultData as $eachRecord) {\n $externalAccounts[] = $eachRecord->accountId ?? null;\n }\n\n $missingAccounts = $this->identifyMissingAccounts($externalAccounts);\n if (! empty($missingAccounts)) {\n $this->batchSyncAccounts($missingAccounts);\n }\n\n foreach ($pageResultData as $eachRecord) {\n $this->importContact($eachRecord);\n }\n }\n }\n }\n\n private function batchSyncAccounts(array $externalAccountIds): void\n {\n $this->logger->info('[integration-app] Syncing batch accounts', [\n 'batch_contacts' => implode(',', $externalAccountIds),\n 'team_id' => $this->team?->getId(),\n ]);\n\n /** IntegrationApp allows up to 100 IDs passed as a batch. */\n $chunkedAccounts = array_chunk($externalAccountIds, self::CHUNK_SIZE);\n foreach ($chunkedAccounts as $accountGroup) {\n /** @var DTO\\Account[] $pageResultData */\n foreach ($this->client->getBatchAccountsById($accountGroup) as $pageResultData) {\n foreach ($pageResultData as $eachRecord) {\n $this->importAccount($eachRecord);\n }\n }\n }\n }\n\n /**\n * Identify all contacts Ids, that are not found in our database.\n * Scoped to the current batch so memory and query cost scale with batch size,\n * not with tenant size.\n *\n * @param array<?string> $contacts\n *\n * @return list<string>\n */\n private function identifyMissingContacts(array $contacts): array\n {\n $wanted = array_values(array_unique(array_filter($contacts)));\n if ($wanted === []) {\n return [];\n }\n\n /** @var CrmEntityRepository $crmEntityRepo */\n $crmEntityRepo = app(CrmEntityRepository::class);\n $existing = $crmEntityRepo->getExistingContactCrmIds($this->config, $wanted);\n\n return array_values(array_diff($wanted, $existing));\n }\n\n /**\n * Identify all account Ids, that are not found in our database.\n * Scoped to the current batch so memory and query cost scale with batch size,\n * not with tenant size.\n *\n * @param array<?string> $accounts\n *\n * @return list<string>\n */\n private function identifyMissingAccounts(array $accounts): array\n {\n $wanted = array_values(array_unique(array_filter($accounts)));\n if ($wanted === []) {\n return [];\n }\n\n /** @var CrmEntityRepository $crmEntityRepo */\n $crmEntityRepo = app(CrmEntityRepository::class);\n $existing = $crmEntityRepo->getExistingAccountCrmIds($this->config, $wanted);\n\n return array_values(array_diff($wanted, $existing));\n }\n}","role_description":"text entry area","is_enabled":true,"is_focused":true,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Project","depth":3,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Project","depth":3,"bounds":{"left":0.011968086,"top":0.047885075,"width":0.024268618,"height":0.024740623},"on_screen":true,"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},"on_screen":false,"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},"on_screen":false,"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},"on_screen":false,"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},"on_screen":false,"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},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"app ~/jiminny/app","depth":6,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":".circleci","depth":7,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":".cursor","depth":7,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":".github","depth":7,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":".sonarlint","depth":7,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":".vscode, folder","depth":7,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":".windsurf","depth":7,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"app, sources root","depth":7,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Actions","depth":8,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Component","depth":8,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Acl","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"ActionItems, folder","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Activity, folder","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"ActivityAnalytics","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"ActivitySearch","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"AiActivityType, folder","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"AiAutomation, folder","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"AiCallScoring, folder","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"AskAnything","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Dtos","depth":10,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Events","depth":10,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"AskAnythingPromptService.php, class","depth":10,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"HistoryService.php, class","depth":10,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"AskJiminnyAi","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"AWS","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"BillingManagement","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Cache","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"CoachingFeedback","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Country, folder","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"CustomerApi, folder","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Database, folder","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Datadog, folder","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"DateTime, folder","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"DealInsights, folder","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"DealRisks","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"ElasticSearch","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Eloquent","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Encoding","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Encryption","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"ES","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Faker","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"FeatureFlags","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"FFMpeg","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"FileSystem","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Gecko","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Gong","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"GuzzleHttp","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"KeyPoints","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Kiosk","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"LanguageDetection","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"LiveFeed","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Locks","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Math","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"MediaPipeline","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"MeetingBot","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"MobileSettings, folder","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Model, folder","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Notification, folder","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Nudge","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"ParagraphBreaker","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"ParticipantSpeech","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"PartitionedCookie","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"PlaybackPage","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Playlist","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Prophet","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"ProphetAi, folder","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"ProsperWorks","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Queue","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Job","depth":10,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"RateLimitAware.php, abstract class","depth":11,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"RateLimitAwareWrapper.php, class","depth":11,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"BotsQueueConstants.php","depth":10,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Constants.php","depth":10,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"ProcessingQueueConstants.php","depth":10,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Router, folder","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Saml2","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"SCIM","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Seeder","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Sentry","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Serializer","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Settings","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Sidekick","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Slack","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"TeamInsights, folder","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"TimeMemoryMapper, folder","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Transcription","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"TranscriptionSummary","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Twilio","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Uploader","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"UrlGenerator","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Utility","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Exceptions","depth":10,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Service","depth":10,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"BaseRateLimiter.php, class","depth":11,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"EfficientJsonParser.php, class","depth":11,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"ProviderRateLimiter.php, class","depth":11,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"RateLimiterInstance.php, class","depth":11,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Uuid","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Waveform","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Webhooks","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Workflow","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Configuration","depth":8,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Console, folder","depth":8,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Commands","depth":9,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Activities","depth":10,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Analytics","depth":10,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Calendars","depth":10,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Crm","depth":10,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Hubspot","depth":11,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"IntegrationApp","depth":11,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Traits","depth":11,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"AddLayoutEntities.php, class","depth":11,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"AutologDelayedCommand.php, class","depth":11,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"BullhornCommandAbstract.php, abstract class","depth":11,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"BullhornPingCommand.php, class","depth":11,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"BullhornSearchCommand.php, class","depth":11,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"BullhornSessionCommand.php, class","depth":11,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"CheckActivityLoggableCommand.php, final class","depth":11,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"CleanDuplicateFieldDataCommand.php, class","depth":11,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"FullSyncOpportunityCommand.php, class","depth":11,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"LogActivitiesCommand.php, final class","depth":11,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"ManageSyncStrategyCommand.php, class","depth":11,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"MatchCrmObjectsCommand.php, class","depth":11,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"MatchOpportunityActivitiesCommand.php, class","depth":11,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"MigrateProvider.php, class","depth":11,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"ProcessHubspotObjectsSyncBatches.php, class","depth":11,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"PurgeDeletedOpportunitiesCommand.php, class","depth":11,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"ResetGovernorLimits.php, class","depth":11,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"SendNotLogged.php, class","depth":11,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"SetupActivityTypeForFollowUp.php, final class","depth":11,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"SetupCloseCrm.php, class","depth":11,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"SetupCopperCrm.php, class","depth":11,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"SetupCrmCommand.php, abstract class","depth":11,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"SetupLayouts.php, class","depth":11,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"SyncAccount.php, class","depth":11,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"SyncContact.php, class","depth":11,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"SyncFieldMetadata.php, class","depth":11,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"SyncHubspotActiveDeals.php, class","depth":11,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"SyncHubspotObjects.php, class","depth":11,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"SyncLead.php, class","depth":11,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"SyncObjects.php, class","depth":11,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"SyncOpportunitiesMissingFieldDataCommand.php, class","depth":11,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"SyncOpportunity.php, class","depth":11,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"SyncProfileMetadata.php, class","depth":11,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"SyncTeamMetadata.php, class","depth":11,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"UpdateOpportunitySpecifications.php, class","depth":11,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"DealInsights","depth":10,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Dev","depth":10,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"AddRateLimitCommand.php, class","depth":11,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"FixHubSpotTokens.php, class","depth":11,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"FixMissMatchedCrmActivitiesCommand.php, final class","depth":11,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"ImportCallsCommand.php, class","depth":11,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"MonitorSocialAccountsState.php, class","depth":11,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Dialers","depth":10,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"DTOs","depth":10,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Elasticsearch","depth":10,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"EngagementStats","depth":10,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"GeckoExport","depth":10,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Livestream","depth":10,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Mailboxes","depth":10,"on_screen":false,"role_description":"text"},{"role":"AXStaticText","text":"Migrate","depth":10,"on_screen":false,"role_description":"text"}]...
|
-8041922121792796695
|
4110884608029145632
|
visual_change
|
accessibility
|
NULL
|
Project: faVsco.js, menu
master, menu
Start Listen Project: faVsco.js, menu
master, 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
Analyzing…
<?php
declare(strict_types=1);
namespace Jiminny\Services\Crm\IntegrationApp\ServiceTraits;
use Carbon\Carbon;
use GuzzleHttp\Exception\GuzzleException;
use GuzzleHttp\Exception\RequestException;
use Illuminate\Support\Str;
use Jiminny\Events\Activities\Crm\LeadConverted;
use Jiminny\Models\Contact;
use Jiminny\Models\Crm\Configuration;
use Jiminny\Models\Crm\Field;
use Jiminny\Models\Crm\LayoutEntity;
use Jiminny\Models\Lead;
use Jiminny\Models\Opportunity;
use Jiminny\Models\Stage;
use Jiminny\Models\Team;
use Jiminny\Models\Account;
use Jiminny\Jobs\Crm\MatchActivitiesToNewOpportunity;
use Jiminny\Repositories\Crm\CrmEntityRepository;
use Jiminny\Repositories\Crm\FieldDataRepository;
use Jiminny\Repositories\Crm\FieldRepository;
use Jiminny\Repositories\Crm\StageRepository;
use Jiminny\Services\Crm\IntegrationApp\Config\IntegrationConfigInterface as IntegrationConfig;
use Jiminny\Services\Crm\IntegrationApp\DTO;
use Jiminny\Services\Crm\IntegrationApp\DataClient;
use Jiminny\Services\Crm\OpportunitySyncStrategyResolver;
use Jiminny\Utils\CurrencyFormatter;
use Psr\Log\LoggerInterface;
/**
* This trait follows closely the contract SyncCrmEntitiesInterface
*/
trait SyncCrmEntitiesTrait
{
use ExternalMapsTrait;
private const int CHUNK_SIZE = 100;
public ?Team $team = null;
public ?Configuration $config;
public ?IntegrationConfig $editionConfig;
protected LoggerInterface $logger;
/**
* @var DataClient
*/
protected $client;
public function syncAllAccounts(): int
{
$count = 0;
foreach ($this->client->getAllAccounts() as $eachAccount) {
$this->importAccount($eachAccount);
$count++;
}
return $count;
}
public function syncAccounts(Carbon $since, ?Carbon $to = null): int
{
$count = 0;
$this->logger->info('[integration-app] Syncing accounts', [
'since' => $since,
'to' => $to,
'team_id' => $this->team?->getId(),
]);
$params = [
'since' => $since,
'to' => $to,
];
/** @var DTO\Account $eachAccount*/
foreach ($this->client->getFilteredAccounts($params) as $eachAccount) {
$this->importAccount($eachAccount);
$count++;
}
$this->logger->info('[integration-app] Syncing accounts finished successfully', [
'since' => $since,
'to' => $to,
'team_id' => $this->team?->getId(),
]);
return $count;
}
public function syncAccount(string $crmId): ?Account
{
try {
$accountDto = $this->client->getSingleAccount($crmId);
if ($accountDto === null) {
return null;
}
return $this->importAccount($accountDto);
} catch (RequestException) {
return null;
}
}
private function importAccount(DTO\Account $accountDto): Account
{
/** @var CrmEntityRepository $crmEntityRepo */
$crmEntityRepo = app(CrmEntityRepository::class);
$data = [
'crm_provider_id' => $accountDto->externalId,
'user_id' => $this->findMappedUserId($accountDto->ownerId),
'owner_id' => $accountDto->ownerId,
'name' => mb_substr($accountDto->name, 0, 191),
'phone' => $accountDto->phone !== null ? mb_substr($accountDto->phone, 0, 25) : null,
'industry' => $accountDto->industry !== null ? mb_substr($accountDto->industry, 0, 191) : null,
'domain' => $accountDto->websiteUrl !== null ? mb_substr($accountDto->websiteUrl, 0, 191) : null,
'country_code' => $accountDto->countryCode,
'remotely_created_at' => $accountDto->createdAt,
];
$this->logger->info('[integration-app] Importing account', [
'crm_provider_id' => $accountDto->externalId,
'team_id' => $this->team?->getId(),
]);
$account = $crmEntityRepo->importAccount($this->getConfiguration(), $data);
$this->mapExternalAccount($account);
return $account;
}
// Sync multiple records.
public function syncAllContacts(): int
{
$count = 0;
foreach ($this->client->getAllContacts() as $eachContact) {
// import contacts here
$this->importContact(contactDto: $eachContact);
$count++;
}
return $count;
}
public function syncContacts(Carbon $since, ?Carbon $to = null): int
{
$count = 0;
$this->logger->info('[integration-app] Syncing contacts', [
'since' => $since,
'to' => $to,
'team_id' => $this->team?->getId(),
]);
$params = [
'since' => $since,
'to' => $to,
];
foreach ($this->client->getFilteredContacts($params) as $eachContact) {
$this->importContact($eachContact);
$count++;
}
$this->logger->info('[integration-app] Syncing contacts finished successfully', [
'since' => $since,
'to' => $to,
'team_id' => $this->team?->getId(),
]);
return $count;
}
// Sync single records.
public function syncContact(string $crmId): ?Contact
{
try {
$contactRecord = $this->client->getSingleContact($crmId);
if ($contactRecord === null) {
return null;
}
return $this->importContact($contactRecord);
} catch (RequestException) {
return null;
}
}
private function importContact(DTO\Contact $contactDto): ?Contact
{
$createInternalAccount = false;
/** @var CrmEntityRepository $crmEntityRepo */
$crmEntityRepo = app(CrmEntityRepository::class);
$accountId = $this->findMappedAccountId(
pivotEntityId: $contactDto->externalId,
externalAccountId: $contactDto->accountId,
);
$userId = $this->findMappedUserId($contactDto->ownerId);
if ($accountId === null) {
$this->logger->info('[integration-app] Importing contact, but related account cannot be found', [
'crm_provider_id' => $contactDto->externalId,
'raw_account_id' => $contactDto->accountId,
'name' => $contactDto->fullName,
'user_id' => $userId,
]);
$createInternalAccount = true;
}
$data = [
'user_id' => $userId,
'account_id' => $accountId,
'crm_provider_id' => $contactDto->externalId,
'owner_id' => $contactDto->ownerId,
'name' => $contactDto->fullName !== null ? mb_substr($contactDto->fullName, 0, 100) : null,
'title' => $contactDto->title !== null ? mb_substr($contactDto->title, 0, 100) : null,
'email' => $contactDto->primaryEmail !== null ? mb_substr($contactDto->primaryEmail, 0, 191) : null,
'phone' => $contactDto->phone !== null ? mb_substr($contactDto->phone, 0, 25) : null,
'mobile_phone' => $contactDto->mobilePhone !== null ? mb_substr($contactDto->mobilePhone, 0, 25) : null,
'country_code' => $contactDto->countryCode !== null ? mb_substr($contactDto->countryCode, 0, 2) : null,
'remotely_created_at' => $contactDto->createdAt,
'photo_path' => '',
];
$this->logger->info('[integration-app] Importing contact', [
'crm_provider_id' => $contactDto->externalId,
'team_id' => $this->team?->getId(),
]);
$contact = $crmEntityRepo->importContact($this->getConfiguration(), $data);
$this->mapExternalContact($contact);
if ($createInternalAccount) {
$this->createInternalAccountFromContact($contact)->getId();
}
return $contact;
}
/**
* @param bool $matchFromOtherCrm - This parameter is intended to be manually used. It will help with
* matching older opportunities if the team is transitioning from one CRM provider to another.
*/
public function syncAllOpportunities(bool $matchFromOtherCrm = false): int
{
$count = 0;
foreach ($this->client->getAllOpportunities() as $eachDeal) {
$this->upsertOpportunity($eachDeal, $matchFromOtherCrm);
$count++;
}
return $count;
}
public function syncOpportunities(array $parameters, ?string $strategy = null): int
{
$parameters['strategy'] = $strategy ?? OpportunitySyncStrategyResolver::LAST_MODIFIED_SYNC_OPPORTUNITY_STRATEGY;
$count = 0;
$this->logger->info('[integration-app] Syncing opportunities', [
'parameters' => $parameters,
'team_id' => $this->team?->getId(),
]);
/** @var DTO\Opportunity[] $pageResultData */
foreach ($this->client->getFilteredOpportunities($parameters) as $pageResultData) {
$externalAccounts = [];
$externalContacts = [];
foreach ($pageResultData as $eachRecord) {
$externalAccounts[] = $eachRecord->accountId ?? null;
$externalContacts[] = $eachRecord->contactId ?? null;
}
// Import missing contacts and account as early as possible
$missingContacts = $this->identifyMissingContacts($externalContacts);
if (! empty($missingContacts)) {
$this->batchSyncContacts($missingContacts);
}
$missingAccounts = $this->identifyMissingAccounts($externalAccounts);
if (! empty($missingAccounts)) {
$this->batchSyncAccounts($missingAccounts);
}
foreach ($pageResultData as $eachRecord) {
$this->upsertOpportunity($eachRecord);
$count++;
}
}
$this->logger->info('[integration-app] Syncing opportunities finished successfully', [
'parameters' => $parameters,
'team_id' => $this->team?->getId(),
]);
return $count;
}
public function syncOpportunity(string $crmId): ?Opportunity
{
try {
$opportunityRecord = $this->client->getSingleOpportunity($crmId);
if ($opportunityRecord === null) {
return null;
}
return $this->upsertOpportunity($opportunityRecord);
} catch (RequestException) {
return null;
}
}
public function syncAllLeads(): int
{
if (isset($this->config->getSettings()['lead_sync_disabled'])) {
$this->logger->info('[integration-app] Syncing leads disabled for the client', [
'team_id' => $this->team?->getId(),
]);
return 0;
}
$count = 0;
foreach ($this->client->getAllLeads() as $eachLead) {
$this->importLead($eachLead);
$count++;
}
return $count;
}
public function syncLeads(Carbon $since, ?Carbon $to = null, ?string $crmProfileId = null): int
{
if (isset($this->config->getSettings()['lead_sync_disabled'])) {
$this->logger->info('[integration-app] Syncing leads disabled for the client', [
'team_id' => $this->team?->getId(),
'since' => $since,
'to' => $to,
'crm_profile_id' => $crmProfileId,
]);
return 0;
}
$count = 0;
$this->logger->info('[integration-app] Syncing leads', [
'since' => $since,
'to' => $to,
'crm_profile_id' => $crmProfileId,
'team_id' => $this->team?->getId(),
]);
$filterData = [
'since' => $since,
'to' => $to,
'crm_profile_id' => $crmProfileId,
'converted' => 'both',
];
foreach ($this->client->getFilteredLeads($filterData) as $eachLead) {
$this->importLead($eachLead);
$count++;
}
$this->logger->info('[integration-app] Syncing leads finished successfully', [
'since' => $since,
'to' => $to,
'team_id' => $this->team?->getId(),
]);
return $count;
}
public function syncLead(string $crmId): ?Lead
{
if (isset($this->config->getSettings()['lead_sync_disabled'])) {
$this->logger->info('[integration-app] Syncing leads disabled for the client', [
'team_id' => $this->team?->getId(),
'crm_id' => $crmId,
]);
return null;
}
try {
$leadRecord = $this->client->getSingleAndConvertLead($crmId);
if ($leadRecord === null) {
return null;
}
return $this->importLead($leadRecord);
} catch (RequestException) {
return null;
}
}
private function importLead(DTO\Lead $leadDto): ?Lead
{
/** @var CrmEntityRepository $crmEntityRepo */
$crmEntityRepo = app(CrmEntityRepository::class);
$userId = $this->findMappedUserId($leadDto->ownerId);
$stage = null;
if ($this->editionConfig->supportsStages()) {
// Get the current stage.
$stage = $crmEntityRepo->getStageForName(
configuration: $this->config,
name: $leadDto->status,
type: Stage::TYPE_LEAD
);
}
if ($stage === null && ! empty($leadDto->status)) {
// Try to sync and import the lead stage by name only
$stage = $this->syncStageByNameOnly($this->config, $leadDto->status, Stage::TYPE_LEAD);
}
$stageId = $stage?->id;
$leadData = [
'team_id' => $this->team->getId(),
'crm_configuration_id' => $this->config->getId(),
'crm_provider_id' => $leadDto->externalId,
'name' => $leadDto->fullName,
'company' => $leadDto->companyName,
'owner_id' => $leadDto->ownerId,
'user_id' => $userId,
'stage_id' => $stageId,
'email' => $leadDto->primaryEmail,
'phone' => $leadDto->primaryPhone,
'mobile_phone' => $leadDto->secondaryPhone,
'title' => $leadDto->jobTitle,
'remotely_created_at' => $leadDto->createdAt,
];
$convertedLeadData = $this->processConvertedLead($crmEntityRepo, $leadDto);
$leadData = array_merge($leadData, $convertedLeadData);
$this->logger->info('[integration-app] Importing lead', [
'crm_provider_id' => $leadDto->externalId,
'name' => $leadDto->primaryEmail,
'team_id' => $this->team?->getId(),
]);
$lead = $crmEntityRepo->importLead($this->config, $leadData);
$this->dispatchLeadConvertedEvent($lead);
return $lead;
}
private function processConvertedLead(CrmEntityRepository $crmEntityRepo, DTO\Lead $leadDto): array
{
if (! $leadDto->isConverted()) {
return [];
}
$leadData = [
'converted_at' => $leadDto->getConvertedAt(),
];
$this->decorateWithConvertedContact($crmEntityRepo, $leadDto, $leadData);
$this->decorateWithConvertedAccount($crmEntityRepo, $leadDto, $leadData);
$this->decorateWithConvertedOpportunity($crmEntityRepo, $leadDto, $leadData);
return $leadData;
}
private function dispatchLeadConvertedEvent(Lead $lead): void
{
if ($lead->wasChanged('converted_at') && $lead->getConvertedAt() !== null) {
event(new LeadConverted($lead));
}
}
private function decorateWithConvertedContact(
CrmEntityRepository $crmEntityRepo,
DTO\Lead $leadDto,
array &$leadData
): void {
if ($leadDto->getConvertedContactId() !== null) {
$convertedContact = $crmEntityRepo->findContactByExternalId(
$this->config,
$leadDto->getConvertedContactId()
);
if ($convertedContact === null) {
try {
$convertedContact = $this->syncContact($leadDto->getConvertedContactId());
} catch (\Exception $exception) {
$this->logger->error('[integration-app] Error syncing converted contact', [
'lead_id' => $leadDto->getExternalId(),
'crm_provider_id' => $leadDto->getConvertedContactId(),
'error' => $exception->getMessage(),
]);
}
}
$leadData['converted_contact_id'] = $convertedContact?->getId();
}
}
private function decorateWithConvertedAccount(
CrmEntityRepository $crmEntityRepo,
DTO\Lead $leadDto,
array &$leadData
): void {
if ($leadDto->getConvertedAccountId() !== null) {
$convertedAccount = $crmEntityRepo->findAccountByExternalId(
$this->config,
$leadDto->getConvertedAccountId()
);
if ($convertedAccount === null) {
try {
$convertedAccount = $this->syncAccount($leadDto->getConvertedAccountId());
} catch (\Exception $exception) {
$this->logger->error('[integration-app] Error syncing converted account', [
'lead_id' => $leadDto->getExternalId(),
'crm_provider_id' => $leadDto->getConvertedAccountId(),
'error' => $exception->getMessage(),
]);
}
}
$leadData['converted_account_id'] = $convertedAccount?->getId();
}
}
private function decorateWithConvertedOpportunity(
CrmEntityRepository $crmEntityRepo,
DTO\Lead $leadDto,
array &$leadData
): void {
if ($leadDto->getConvertedOpportunityId() !== null) {
$convertedOpportunity = $crmEntityRepo->findOpportunityByExternalId(
$this->config,
$leadDto->getConvertedOpportunityId()
);
if ($convertedOpportunity === null) {
try {
$convertedOpportunity = $this->syncOpportunity($leadDto->getConvertedOpportunityId());
} catch (\Exception $exception) {
$this->logger->error('[integration-app] Error syncing converted opportunity', [
'lead_id' => $leadDto->getExternalId(),
'crm_provider_id' => $leadDto->getConvertedOpportunityId(),
'error' => $exception->getMessage(),
]);
}
}
$leadData['converted_opportunity_id'] = $convertedOpportunity?->getId();
}
}
/**
* @throws GuzzleException
*/
public function importStages(?array $types = null, ?string $missingStageName = null): ?Stage
{
if (! $this->editionConfig->supportsStages()) {
return null;
}
$missingStage = null;
$stagesCollection = $this->client->getAllDealsStages();
foreach ($stagesCollection as $eachStage) {
$stage = $this->importStage($eachStage);
if ($stage->getName() === $missingStageName) {
$missingStage = $stage;
}
}
return $missingStage;
}
private function importStage(DTO\EntityStage $stageDto): Stage
{
/** @var CrmEntityRepository $crmEntityRepo */
$crmEntityRepo = app(CrmEntityRepository::class);
$objectType = $stageDto->type ?? Stage::TYPE_OPPORTUNITY;
$stageData = [
'crm_provider_id' => $stageDto->externalId,
'name' => mb_strimwidth($stageDto->apiName ?? $stageDto->name, 0, 50),
'label' => mb_strimwidth($stageDto->masterLabel ?? $stageDto->name, 0, 191),
'sequence' => $stageDto->sortOrder ?? 0,
'probability' => $stageDto->defaultProbability ?? null,
'is_selectable' => $stageDto->isActive ?? 0,
'type' => $objectType,
];
$this->logger->info('[integration-app] Importing stage', [
'crm_provider_id' => $stageDto->externalId,
'name' => $stageDto->name,
'team_id' => $this->team?->getId(),
]);
$stage = $crmEntityRepo->importStage($this->config, $objectType, $stageData);
// Include newly imported stages to the map
$this->mapExternalStage($stage);
return $stage;
}
/**
* Attach a stage to a default business process.
* This method is used only in Zoho implementation
* where both supportsPipelines and supportsPipelines are false
*/
public function syncBusinessProcessStages(int $stageId): void
{
/** @var StageRepository $stageRepository */
$stageRepository = app(StageRepository::class);
$processName = 'DefaultOpportunityProcess';
$data = [
'team_id' => $this->team->getId(),
'name' => $processName,
'type' => Stage::TYPE_OPPORTUNITY,
'is_selectable' => true,
];
$businessProcess = $stageRepository->findOrCreateBusinessProcess(
$this->config,
$processName,
$data
);
$businessProcess->stages()->attach($stageId);
}
/**
* bool $matchFromOtherCrm
* When inserting a deal match try to match it to an existing from other CRM within the same team.
* - This parameter is intended to be manually used only. It will help with
* matching older opportunities if the team is transitioning from one CRM provider to another.
*/
private function upsertOpportunity(DTO\Opportunity $opportunityDto, bool $matchFromOtherCrm = false): ?Opportunity
{
$this->logger->info('[integration-app] Importing opportunity', [
'crm_provider_id' => $opportunityDto->externalId,
'team_id' => $this->team->getId(),
]);
if ($this->config === null) {
$this->logger->warning('[integration-app] Opportunity missing config');
return null;
}
$stageId = $this->findOpportunityStageId(
externalStageId: $opportunityDto->stageId,
stageName: $opportunityDto->stageName
);
// temporary detect memory usage
$this->logger->info('[integration-app] Stage ID', [
'memory_usage' => memory_get_usage(),
'memory_real_usage' => memory_get_usage(true),
'crm_provider_id' => $opportunityDto->externalId,
'stage_id' => $stageId,
]);
$accountId = $this->findAccountId(
pivotEntityId: $opportunityDto->externalId,
externalAccountId: $opportunityDto->accountId,
externalContactId: $opportunityDto->contactId,
);
$this->logger->info('[integration-app] Account ID', [
'memory_usage' => memory_get_usage(),
'memory_real_usage' => memory_get_usage(true),
'crm_provider_id' => $opportunityDto->externalId,
'account_id' => $accountId,
]);
if ($stageId === null || $accountId === null) {
$this->logger->warning('[integration-app] Opportunity missing data', [
'stageId' => $stageId,
'accountId' => $accountId,
'externalId' => $opportunityDto->externalId,
]);
return null;
}
$userId = $this->findMappedUserId(externalUserId: $opportunityDto->ownerId);
$data = [
'crm_provider_id' => $opportunityDto->externalId,
'team_id' => $this->team->getId(),
'account_id' => $accountId,
'user_id' => $userId,
'owner_id' => $opportunityDto->ownerId,
'name' => mb_strimwidth($opportunityDto->name, 0, 128),
'value' => $opportunityDto->amount,
'currency_code' => CurrencyFormatter::formatCode($this->getCurrencyIso($opportunityDto)),
'close_date' => $opportunityDto->closeDate,
'is_closed' => $opportunityDto->closed,
'is_won' => $opportunityDto->won,
'stage_id' => $stageId,
'record_type_id' => null,
'remotely_created_at' => $opportunityDto->createdAt,
'probability' => $opportunityDto->probability,
];
/** @var CrmEntityRepository $crmEntityRepo */
$crmEntityRepo = app(CrmEntityRepository::class);
$opportunity = $crmEntityRepo->importOpportunity(
$this->config,
$data,
$matchFromOtherCrm,
$opportunityDto->name,
);
// Import external fields into crm_field_data if present
$crmFields = $this->getOpportunitySyncableFields();
$this->importOpportunityFieldData($opportunityDto, $crmFields, $opportunity->getId());
if ($opportunityDto->deleted === true) {
$opportunity->delete();
return $opportunity;
}
if ($opportunity->wasRecentlyCreated) {
MatchActivitiesToNewOpportunity::dispatch($opportunity->getId());
}
return $opportunity;
}
private function findOpportunityStageId(?string $externalStageId, ?string $stageName): ?int
{
$stageId = null;
if ($this->editionConfig->supportsStages()) {
$stageId = $this->findMappedStageId(externalStageId: $externalStageId, type: Stage::TYPE_OPPORTUNITY);
if ($stageId === null) {
$stageId = $this->importStages(types: [Stage::TYPE_OPPORTUNITY], missingStageName: $stageName)?->id;
}
}
if ($stageId === null && $stageName !== null) {
$stageId = $this->syncStageByNameOnly(
configuration: $this->config,
stageName: $stageName,
type: Stage::TYPE_OPPORTUNITY
)?->id;
}
return $stageId;
}
private function importOpportunityFieldData(
DTO\Opportunity $opportunityDto,
array $crmFields,
int $opportunityId
): void {
/** @var FieldRepository $fieldRepository */
$fieldRepository = app(FieldRepository::class);
/** @var FieldDataRepository $fieldDataRepository */
$fieldDataRepository = app(FieldDataRepository::class);
foreach ($crmFields as $crmField) {
if (! property_exists($opportunityDto, $crmField)) {
continue;
}
if ($opportunityDto->{$crmField} === null) {
continue;
}
$field = $fieldRepository->findFieldByCrmIdAndObjectType(
$this->config,
$crmField,
Field::OBJECT_OPPORTUNITY
);
if (! $field instanceof Field) {
$this->logger->info('Field not found', [
'field' => $crmField,
'config' => $this->config->getId(),
]);
continue;
}
$entities = $field->getEntities();
if ($entities->isEmpty()) {
$this->logger->info('Field has no entities', [
'field' => $crmField,
'config' => $this->config->getId(),
]);
continue;
}
if ($entities->count() > 1) {
$this->logger->info('Field has multiple entities', [
'field' => $crmField,
'config' => $this->config->getId(),
]);
continue;
}
/** @var LayoutEntity|null $entity */
$entity = $entities->first();
if (! $entity instanceof LayoutEntity) {
continue;
}
$value = (string) $opportunityDto->{$crmField};
$fieldDataRepository->updateOrCreateFieldData(
$entity,
$opportunityId,
$value,
);
}
}
private function getCurrencyIso(DTO\Opportunity $opportunityDto): ?string
{
if ($opportunityDto->currencyIso !== null) {
return $opportunityDto->currencyIso;
}
// Fallback to billing currency
return $this->config->getDefaultCurrency();
}
/**
* Some CRM providers do not support listing all stages.
* Additionally, they may not even supply us with a stage ID when the stage is supplied as a property of the deal.
* In that case, we will usually have only a stage name.
* In order to import such stages only once, we will slugify them and produce "external ID" on our own.
*/
private function syncStageByNameOnly(Configuration $configuration, string $stageName, ?string $type = null): ?Stage
{
// @TEMP For testing purposes only!!!
// Revert when we find suitable way to fetch the stage
/** @var CrmEntityRepository $crmEntityRepo */
$crmEntityRepo = app(CrmEntityRepository::class);
$stage = $crmEntityRepo->getStageForName($configuration, $stageName, $type);
if ($stage !== null) {
return $stage;
}
// if there is other legitimate way to fetch the stage skip.
if ($this->editionConfig->supportsPipelines() ||
$this->editionConfig->supportsStages()
) {
return null;
}
/** @var CrmEntityRepository $crmEntityRepo */
$crmEntityRepo = app(CrmEntityRepository::class);
$stage = $crmEntityRepo->getStageForName($configuration, $stageName, $type);
// Create the stage if it does not exist already
if ($stage === null) {
$stageDto = new DTO\EntityStage();
$stageDto->externalId = $stageName;
$stageDto->masterLabel = Str::slug($stageName);
$stageDto->name = $stageName;
$stageDto->type = $type;
$stage = $this->importStage($stageDto);
if ($type === Stage::TYPE_OPPORTUNITY) {
$this->syncBusinessProcessStages($stage->getId());
}
}
return $stage;
}
private function findAccountId(
string $pivotEntityId,
?string $externalAccountId = null,
?string $externalContactId = null,
bool $skipAccountSync = false,
): ?int {
$accountId = $this->findMappedAccountId(
pivotEntityId: $pivotEntityId,
externalAccountId: $externalAccountId,
skipAccountSync: $skipAccountSync,
);
if ($accountId !== null) {
return $accountId;
}
/**
* The deal probably does not have an Account assigned.
* In order to not break the existing import, we will try to find a contact
* and create an Account with the same data.
*/
if (! empty($externalContactId)) {
// In rare cases the contact's external id matches our account id, whe :(
$this->logger->info('[integration-app] fallback Account', ['contact_id' => $externalContactId]);
$accountId = $this->findMappedAccountId(
pivotEntityId: $pivotEntityId,
externalAccountId: $externalContactId,
skipAccountSync: true,
);
if ($accountId !== null) {
return $accountId;
}
$this->logger->info('[integration-app] create Account from Contact', ['contact_id' => $externalContactId]);
$crmEntityRepo = app(CrmEntityRepository::class);
$contact = $crmEntityRepo->findContactByExternalId($this->config, $externalContactId);
if ($contact !== null) {
return $this->createInternalAccountFromContact($contact)->getId();
}
}
return null;
}
private function createInternalAccountFromContact(Contact $contact): Account
{
$this->logger->info('[integration-app] Create internal account from contact', [
'team_id' => $this->team?->getId(),
'contact_id' => $contact->getId(),
'crm_provider_id' => $contact->getCrmProviderId(),
]);
$data = [
'crm_configuration_id' => $this->config->getId(),
'team_id' => $this->config->getTeamId(),
'crm_provider_id' => $contact->getCrmProviderId(),
'user_id' => $contact->getUserId(),
'owner_id' => $contact->getOwnerId(),
'name' => $contact->getName(),
'phone' => $contact->getPhone(),
'country_code' => $contact->getCountryCode(),
'remotely_created_at' => $contact->getRemotelyCreatedAt(),
'is_internal' => 1,
];
/** @var CrmEntityRepository $crmEntityRepo */
$crmEntityRepo = app(CrmEntityRepository::class);
$account = $crmEntityRepo->importAccount($this->config, $data);
if ($contact->account_id === null) {
$contact->account_id = $account->getId();
$contact->save();
}
$this->mapExternalAccount($account);
return $account;
}
private function batchSyncContacts(array $externalContactIds): void
{
$this->logger->info('[integration-app] Syncing batch contacts', [
'batch_contacts' => implode(',', $externalContactIds),
'team_id' => $this->team?->getId(),
]);
/** IntegrationApp allows up to 100 IDs passed as a batch. */
$chunkedContacts = array_chunk($externalContactIds, self::CHUNK_SIZE);
foreach ($chunkedContacts as $contactGroup) {
/** @var DTO\Contact[] $pageResultData */
foreach ($this->client->getBatchContactsById($contactGroup) as $pageResultData) {
$externalAccounts = [];
foreach ($pageResultData as $eachRecord) {
$externalAccounts[] = $eachRecord->accountId ?? null;
}
$missingAccounts = $this->identifyMissingAccounts($externalAccounts);
if (! empty($missingAccounts)) {
$this->batchSyncAccounts($missingAccounts);
}
foreach ($pageResultData as $eachRecord) {
$this->importContact($eachRecord);
}
}
}
}
private function batchSyncAccounts(array $externalAccountIds): void
{
$this->logger->info('[integration-app] Syncing batch accounts', [
'batch_contacts' => implode(',', $externalAccountIds),
'team_id' => $this->team?->getId(),
]);
/** IntegrationApp allows up to 100 IDs passed as a batch. */
$chunkedAccounts = array_chunk($externalAccountIds, self::CHUNK_SIZE);
foreach ($chunkedAccounts as $accountGroup) {
/** @var DTO\Account[] $pageResultData */
foreach ($this->client->getBatchAccountsById($accountGroup) as $pageResultData) {
foreach ($pageResultData as $eachRecord) {
$this->importAccount($eachRecord);
}
}
}
}
/**
* Identify all contacts Ids, that are not found in our database.
* Scoped to the current batch so memory and query cost scale with batch size,
* not with tenant size.
*
* @param array<?string> $contacts
*
* @return list<string>
*/
private function identifyMissingContacts(array $contacts): array
{
$wanted = array_values(array_unique(array_filter($contacts)));
if ($wanted === []) {
return [];
}
/** @var CrmEntityRepository $crmEntityRepo */
$crmEntityRepo = app(CrmEntityRepository::class);
$existing = $crmEntityRepo->getExistingContactCrmIds($this->config, $wanted);
return array_values(array_diff($wanted, $existing));
}
/**
* Identify all account Ids, that are not found in our database.
* Scoped to the current batch so memory and query cost scale with batch size,
* not with tenant size.
*
* @param array<?string> $accounts
*
* @return list<string>
*/
private function identifyMissingAccounts(array $accounts): array
{
$wanted = array_values(array_unique(array_filter($accounts)));
if ($wanted === []) {
return [];
}
/** @var CrmEntityRepository $crmEntityRepo */
$crmEntityRepo = app(CrmEntityRepository::class);
$existing = $crmEntityRepo->getExistingAccountCrmIds($this->config, $wanted);
return array_values(array_diff($wanted, $existing));
}
}
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide
app ~/jiminny/app
.circleci
.cursor
.github
.sonarlint
.vscode, folder
.windsurf
app, sources root
Actions
Component
Acl
ActionItems, folder
Activity, folder
ActivityAnalytics
ActivitySearch
AiActivityType, folder
AiAutomation, folder
AiCallScoring, folder
AskAnything
Dtos
Events
AskAnythingPromptService.php, class
HistoryService.php, class
AskJiminnyAi
AWS
BillingManagement
Cache
CoachingFeedback
Country, folder
CustomerApi, folder
Database, folder
Datadog, folder
DateTime, folder
DealInsights, folder
DealRisks
ElasticSearch
Eloquent
Encoding
Encryption
ES
Faker
FeatureFlags
FFMpeg
FileSystem
Gecko
Gong
GuzzleHttp
KeyPoints
Kiosk
LanguageDetection
LiveFeed
Locks
Math
MediaPipeline
MeetingBot
MobileSettings, folder
Model, folder
Notification, folder
Nudge
ParagraphBreaker
ParticipantSpeech
PartitionedCookie
PlaybackPage
Playlist
Prophet
ProphetAi, folder
ProsperWorks
Queue
Job
RateLimitAware.php, abstract class
RateLimitAwareWrapper.php, class
BotsQueueConstants.php
Constants.php
ProcessingQueueConstants.php
Router, folder
Saml2
SCIM
Seeder
Sentry
Serializer
Settings
Sidekick
Slack
TeamInsights, folder
TimeMemoryMapper, folder
Transcription
TranscriptionSummary
Twilio
Uploader
UrlGenerator
Utility
Exceptions
Service
BaseRateLimiter.php, class
EfficientJsonParser.php, class
ProviderRateLimiter.php, class
RateLimiterInstance.php, class
Uuid
Waveform
Webhooks
Workflow
Configuration
Console, folder
Commands
Activities
Analytics
Calendars
Crm
Hubspot
IntegrationApp
Traits
AddLayoutEntities.php, class
AutologDelayedCommand.php, class
BullhornCommandAbstract.php, abstract class
BullhornPingCommand.php, class
BullhornSearchCommand.php, class
BullhornSessionCommand.php, class
CheckActivityLoggableCommand.php, final class
CleanDuplicateFieldDataCommand.php, class
FullSyncOpportunityCommand.php, class
LogActivitiesCommand.php, final class
ManageSyncStrategyCommand.php, class
MatchCrmObjectsCommand.php, class
MatchOpportunityActivitiesCommand.php, class
MigrateProvider.php, class
ProcessHubspotObjectsSyncBatches.php, class
PurgeDeletedOpportunitiesCommand.php, class
ResetGovernorLimits.php, class
SendNotLogged.php, class
SetupActivityTypeForFollowUp.php, final class
SetupCloseCrm.php, class
SetupCopperCrm.php, class
SetupCrmCommand.php, abstract class
SetupLayouts.php, class
SyncAccount.php, class
SyncContact.php, class
SyncFieldMetadata.php, class
SyncHubspotActiveDeals.php, class
SyncHubspotObjects.php, class
SyncLead.php, class
SyncObjects.php, class
SyncOpportunitiesMissingFieldDataCommand.php, class
SyncOpportunity.php, class
SyncProfileMetadata.php, class
SyncTeamMetadata.php, class
UpdateOpportunitySpecifications.php, class
DealInsights
Dev
AddRateLimitCommand.php, class
FixHubSpotTokens.php, class
FixMissMatchedCrmActivitiesCommand.php, final class
ImportCallsCommand.php, class
MonitorSocialAccountsState.php, class
Dialers
DTOs
Elasticsearch
EngagementStats
GeckoExport
Livestream
Mailboxes
Migrate...
|
3065
|
NULL
|
NULL
|
NULL
|
|
45554
|
1629
|
4
|
2026-05-14T14:42:21.764603+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-14/1778 /Users/lukas/.screenpipe/data/data/2026-05-14/1778769741764_m1.jpg...
|
PhpStorm
|
faVsco.js – IntegrationApp/Service.php
|
1
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
#12066 on JY-20725-handle Project: faVsco.js, menu
#12066 on JY-20725-handle-HS-search-rate-limit, menu
Start Listening for PHP Debug Connections
HandleHubspotRateLimitTest
Run 'HandleHubspotRateLimitTest'
Debug 'HandleHubspotRateLimitTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
16
2
Previous Highlighted Error
Next Highlighted Error...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"bounds":{"left":0.054166667,"top":0.027777778,"width":0.08055556,"height":0.035555556},"on_screen":true,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"#12066 on JY-20725-handle-HS-search-rate-limit, menu","depth":5,"bounds":{"left":0.13472222,"top":0.027777778,"width":0.25555557,"height":0.035555556},"on_screen":true,"help_text":"Pull request #12066 exists for current branch JY-20725-handle-HS-search-rate-limit, but local branch is out of sync with remote","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"bounds":{"left":0.6326389,"top":0.027777778,"width":0.023611112,"height":0.035555556},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"HandleHubspotRateLimitTest","depth":6,"bounds":{"left":0.6645833,"top":0.027777778,"width":0.15902779,"height":0.035555556},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run 'HandleHubspotRateLimitTest'","depth":6,"bounds":{"left":0.82361114,"top":0.027777778,"width":0.023611112,"height":0.035555556},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'HandleHubspotRateLimitTest'","depth":6,"bounds":{"left":0.8472222,"top":0.027777778,"width":0.023611112,"height":0.035555556},"on_screen":true,"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.87083334,"top":0.027777778,"width":0.023611112,"height":0.035555556},"on_screen":true,"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.9291667,"top":0.027777778,"width":0.023611112,"height":0.035555556},"on_screen":true,"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.9527778,"top":0.027777778,"width":0.023611112,"height":0.035555556},"on_screen":true,"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.9763889,"top":0.027777778,"width":0.023611112,"height":0.035555556},"on_screen":true,"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},"on_screen":false,"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},"on_screen":false,"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},"on_screen":false,"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},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"16","depth":4,"bounds":{"left":0.77708334,"top":0.3122222,"width":0.02013889,"height":0.02111111},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"2","depth":4,"bounds":{"left":0.80138886,"top":0.3122222,"width":0.016666668,"height":0.02111111},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.8215278,"top":0.31,"width":0.015277778,"height":0.025555555},"on_screen":true,"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.8368056,"top":0.31,"width":0.014583333,"height":0.025555555},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
-7903400416253054810
|
-8781927421094687800
|
click
|
hybrid
|
NULL
|
Project: faVsco.js, menu
#12066 on JY-20725-handle Project: faVsco.js, menu
#12066 on JY-20725-handle-HS-search-rate-limit, menu
Start Listening for PHP Debug Connections
HandleHubspotRateLimitTest
Run 'HandleHubspotRateLimitTest'
Debug 'HandleHubspotRateLimitTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
16
2
Previous Highlighted Error
Next Highlighted Error
PhpStormFileEditViewNavigateCodeLaravelRefactorRunToolsGitWindowHelp•FV faVsco.js* #12066 on JY-20725-handle-HS-search-rate-limit k vProjectvT DeleteCrmEntityTrait.phpDeleteAccountJob.php© ImportActivityTypes.php© WriteCrmTrait.phplhl100% <HandleHubspotRateLimitTestv8• Thu 14 May 17:42:21* :Q=custom.log> MetadataAccessors© Hubspot/DecorateActivity.phpIntegrationAppServiceTrait.phpIntegrationApp/Service.php x* RemoteWriteAccessor.phpT AccountAccessor.php© DataClient.php• BaseAccessor.php© IntegrationApp/DecorateActivity.php© Activity.phpSalesforce/Service.phpT LogActivityTrait.php• ContactAccessor.php© Playbook.php© Pipedrive/Service.phpClose/Service.phpCopper/Service.php© BullhornService.phpDealAccessor.phpPlainTextDecorateActivity.phpT ActivityPlaybookTrait.php© CrmHelperRepository.phpAccountController.php18.••© IntegrationAppAccessExce• LeadAccessor.phpE.env© DetachActivityObject.phpRematchActivityOnCrmObjectDetach.php© MatchActivityCrmData.phpClient.phpT MeetingAccessor.phpRegisterEventsAccessor.pt55• RemoteWriteAccessor.php413• SystemStateAccessor.php455T UserAccessor.php436© HubspotPaginationService.php© HandleHubspotRateLimit.phpclass Service extends BaseService implementspublic function saveMeeting(Activity $activity): arrayСтИДО= эстика,'payload'=> Spayload,> D Api|437D Config1):438O DTO439return $this->client->updateMeeting($crmId, $payload);> O Filters440v d Jobs441© CrmEntitiesFullSyncJob.ph 442$payload['Description'] = $decorateActivity->generateDescription(Sactivity);© DeleteRemoteTeamJob.ph 443T IntegrationAppService Trait444© SubscribeForEventsJob.ph445© TeamInitialSyncJob.php446$this-›logger-›info('[integration-app] CRM Log meeting', ['activity' => $activity->getUvid(),'payload' => $payload,© UnsubscribeForEventsJob.447© UpdateProfileRelatedEntiti1):448© ValidateTeamActiveConne449return $this->client->createMeeting($payload);> ProspectSearchStrategy450Service TraitsT RemoteWriteAccessor451© DataClient.php2 usages© DecorateActivity.php© LocalSearch.php4524911public function saveCall(Activity $acpublic function createMeetingarray $meetingPayload = []): array• LocalSearchlnterface.php1 usageParameters: array$meetingPayload© RemoteSearch.php© Service.php492500private function getCallType(ActivitySource:v • Listeners3 usagesC ConvertLeadActivities.php501private function attachToProspect(Act.../app/Services/Crm/IntegrationApp/Accessors/RemoteWriteAccessor.phf &:@ Purdel onkunCache nhnWorkspace associated with branch 'JY-20725-handle-HS-search-rate-limit' has been restored // Rollback // Configure... (today 16:17)=laravel.logSF [jiminny@localhost]A HS_local [jiminny@localho:W=.env.staging4 console [QAI PROD] X4 console [PROD]A console (EU]A 16 × 2DGojiminny v084143 ×4 л215•m_layout_id =2162,1661,66799,66217218219id = 33;_220— 221222_223224id THEN '(own=225_226227228229230hubspot':-231232-233 V= 11512582;234W Windsurf Teams439:42UTF-8Ca 4 spaces...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
45553
|
1630
|
3
|
2026-05-14T14:42:21.764566+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-14/1778 /Users/lukas/.screenpipe/data/data/2026-05-14/1778769741764_m2.jpg...
|
PhpStorm
|
faVsco.js – IntegrationApp/Service.php
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
#12066 on JY-20725-handle Project: faVsco.js, menu
#12066 on JY-20725-handle-HS-search-rate-limit, menu
Start Listening for PHP Debug Connections
HandleHubspotRateLimitTest
Run 'HandleHubspotRateLimitTest'
Debug 'HandleHubspotRateLimitTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
16
2
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Services\Crm\IntegrationApp;
use Carbon\Carbon;
use Jiminny\Contracts\Crm\Providers;
use Jiminny\Contracts\Services\Crm\ClientInterface;
use Jiminny\Contracts\Services\Crm\FetchRelatedActivityInterface;
use Jiminny\Contracts\Services\Crm\ImportsBusinessProcessesInterface;
use Jiminny\Contracts\Services\Crm\LayoutManagementInterface;
use Jiminny\Contracts\Services\Crm\MatchCrmEntitiesInterface;
use Jiminny\Contracts\Services\Crm\Provider\IntegrationAppInterface;
use Jiminny\Contracts\Services\Crm\RemoteEntityLookupInterface;
use Jiminny\Contracts\Services\Crm\RemoteEntityManipulationInterface;
use Jiminny\Contracts\Services\Crm\RemoteNoteEntityManipulationInterface;
use Jiminny\Contracts\Services\Crm\SendSummaryToCrmInterface;
use Jiminny\Contracts\Services\Crm\SettingsInterface;
use Jiminny\Contracts\Services\Crm\SyncCrmEntitiesInterface;
use Jiminny\Contracts\Services\Crm\SyncCrmMetadataInterface;
use Jiminny\Events\Activities\Crm\ActivityLeadConverted;
use Jiminny\Exceptions\CrmException;
use Jiminny\Exceptions\SocialAccountNotFoundException;
use Jiminny\Jobs\Crm\NoteObject;
use Jiminny\Models\Account;
use Jiminny\Models\Activity;
use Jiminny\Models\Contracts\ActivityContract;
use Jiminny\Models\Crm\Configuration;
use Jiminny\Models\Opportunity;
use Jiminny\Models\Stage;
use Jiminny\Models\User;
use Jiminny\Services\Crm\BaseService;
use Jiminny\Services\Crm\IntegrationApp\Config\IntegrationAppProviders;
use Jiminny\Services\Crm\IntegrationApp\Config\IntegrationConfigFactory;
use Jiminny\Services\Crm\IntegrationApp\DTO\Mappers\FieldMapperInterface;
use Jiminny\Services\Crm\IntegrationApp\DTO\Mappers\LeadFieldMapper;
use Jiminny\Services\Crm\IntegrationApp\DTO\Utils\GenerateProviderUrlInterface;
use Jiminny\Services\Crm\IntegrationApp\DTO\Utils\IntegrationAppCrmGeneratorFactory;
use Jiminny\Services\Crm\IntegrationApp\DTO\Utils\UrlGeneratorInterface;
use Jiminny\Services\Crm\IntegrationApp\ServiceTraits\SyncCrmFieldsTrait;
use Jiminny\Services\Crm\IntegrationApp\ServiceTraits\SystemStateTrait;
use Jiminny\Services\Crm\IntegrationApp\ServiceTraits\LayoutTrait;
use Jiminny\Services\Crm\IntegrationApp\ServiceTraits\MatchProspectsTrait;
use Jiminny\Services\Crm\IntegrationApp\ServiceTraits\NotSupportedTrait;
use Jiminny\Services\Crm\IntegrationApp\ServiceTraits\SyncCrmEntitiesTrait;
use Jiminny\Services\Crm\IntegrationApp\ServiceTraits\SyncCrmMetadataTrait;
use Psr\Log\LoggerInterface;
use Jiminny\Services\Crm\IntegrationApp\DTO\Mappers\OpportunityFieldMapper;
use Jiminny\Repositories\Crm\ProfileRepository;
use Jiminny\Repositories\Crm\OpportunityRepository;
use Jiminny\Models\Crm\Profile;
use Jiminny\Services\Crm\CrmObjects\CrmObjectsRepository;
class Service extends BaseService implements
IntegrationAppInterface,
SyncCrmEntitiesInterface,
SyncCrmMetadataInterface,
ImportsBusinessProcessesInterface,
RemoteEntityManipulationInterface,
LayoutManagementInterface,
SettingsInterface,
MatchCrmEntitiesInterface,
RemoteEntityLookupInterface,
RemoteNoteEntityManipulationInterface,
SendSummaryToCrmInterface,
UrlGeneratorInterface,
FetchRelatedActivityInterface
{
use SyncCrmMetadataTrait;
use SyncCrmEntitiesTrait;
use SystemStateTrait;
use LayoutTrait;
use NotSupportedTrait;
use MatchProspectsTrait;
use SyncCrmFieldsTrait;
public const string CALL_TYPE_MISSED = 'Missed';
public const string CALL_TYPE_INBOUND = 'Inbound';
public const string CALL_TYPE_OUTBOUND = 'Outbound';
public const string RELATIONSHIP_OPPORTUNITY = 'Deals';
public const string RELATIONSHIP_LEAD = 'Leads';
public const string RELATIONSHIP_ACCOUNT = 'Accounts';
/**
* @var ClientInterface&DataClient
*/
protected $client;
protected ?User $invokedUser = null;
protected ?GenerateProviderUrlInterface $crmUrlGenerator = null;
public function __construct(
DataClient $client,
LoggerInterface $logger,
) {
parent::__construct();
$this->client = $client;
$this->logger = $logger;
}
public function getDisplayName(): string
{
return Providers::getProviderDisplayName(
Providers::getCrmIntegrationSlug($this->config)
);
}
/**
* @throws \Exception
*/
public function setUser(User $user): void
{
$this->configureSentryScope($user);
$this->invokedUser = $user;
$this->team = $user->getTeam();
$teamOwner = $this->team->getOwner();
$this->setConfiguration($user->getTeam()->getCrmConfiguration());
$this->setEditionConfiguration(Providers::getCrmIntegrationSlug($this->config));
$this->setCrmUrlGenerator($this->config);
$this->client->setTeam($this->team);
$socialAccount = $teamOwner?->getSocialAccount('integration-app');
if ($socialAccount === null) {
$this->logger->info('[integration-app] Social account not found', [
'teamId' => $this->team->getId(),
'teamOwnerId' => $teamOwner?->getId(),
'userId' => $user->getId(),
]);
throw new SocialAccountNotFoundException('Social account not found!');
}
$this->client->setSocialAccount($socialAccount);
// The CRM Service is properly bootstrapped, and supports remote operations
$this->connect();
}
public function normalizeValue(string $fieldType, string $fieldValue, bool $internal = false): string
{
return $fieldValue;
}
public function find(string $name, array $scopes): array
{
/** @var LocalSearch $localSearch */
$localSearch = app(LocalSearch::class);
$localSearch->setConfiguration($this->config);
$localSearch->setCountryCode($this->invokedUser->getCountryCode());
return $localSearch->search($name);
// if (! empty($localMatch)) {
// return $localMatch;
// }
//
// /** @var RemoteSearch $remoteSearch */
// $remoteSearch = app(RemoteSearch::class);
// $remoteSearch->setClient($this->client);
// $remoteSearch->setConfiguration($this->config);
//
// return $remoteSearch->search($name);
}
public function findOpportunities(?string $crmAccountId, ?string $crmContactId, ?int $userId = null): array
{
$data = [];
$ownerData = [];
$account = $this->getAccount($crmAccountId, $crmContactId);
if ($account === null) {
return [];
}
$ownerId = $this->getOwnerId($userId);
try {
$opportunityRepository = app(OpportunityRepository::class);
$opportunities = $opportunityRepository->findAllByConfigurationAndAccountId(
$this->config,
$account->getId()
);
foreach ($opportunities as $opportunity) {
/** @var Opportunity $opportunity */
$record = $this->buildOpportunityData($opportunity);
if ($ownerId && $opportunity->getOwnerId() === $ownerId) {
$ownerData[] = $record;
}
$data[] = $record;
}
if (! empty($ownerData)) {
return $ownerData;
}
return $data;
} catch (\Exception $e) {
$this->logger->info('[integration-app] Failed to fetch opportunities', [
'contact' => $crmContactId,
'account' => $crmAccountId,
'owner' => $ownerId,
'error' => $e->getMessage(),
]);
return $data;
}
}
private function getOwnerId(?int $userId = null): ?string
{
if (! $userId) {
return null;
}
$profileRepository = app(ProfileRepository::class);
$profile = $profileRepository->findProfileByUserId($this->config, $userId);
return $profile instanceof Profile ? $profile->getCrmProviderId() : null;
}
private function getAccount(?string $crmAccountId = null, ?string $crmContactId = null): ?Account
{
$crmRepository = app(CrmObjectsRepository::class);
if ($crmAccountId === null) {
$contact = $crmRepository->findContactByCrmProviderId($this->config, $crmContactId);
return $contact->getAccount();
}
return $crmRepository->findAccountByCrmProviderId($this->config, $crmAccountId);
}
private function buildOpportunityData(Opportunity $opportunity): array
{
$record = [
'crmId' => $opportunity->getCrmProviderId(),
'name' => $opportunity->getName(),
'won' => $opportunity->isWon(),
'closed' => $opportunity->isClosed(),
];
if (! empty($opportunity->getFormattedValueAttribute())) {
$record['value'] = $opportunity->getFormattedValueAttribute();
}
if (! empty($opportunity->getStage())) {
$record['stage'] = [
'id' => $opportunity->getStage()->getUuid(),
'name' => $opportunity->getStage()->getName(),
];
}
return $record;
}
public function updateRecord(string $objectType, string $objectId, array $data, array $headers = []): void
{
$data = [
'data' => $this->normalizeData($objectType, $data),
];
$this->client->updateRecordById($objectType, $objectId, $data);
}
private function normalizeData(string $objectType, array $data): array
{
$fieldMapper = $this->getFieldMapper($objectType);
if (! $fieldMapper instanceof FieldMapperInterface) {
return $data;
}
return $fieldMapper->mapToCrmFields($data);
}
private function getFieldMapper(string $objectType): ?FieldMapperInterface
{
if ($objectType === self::OBJECT_OPPORTUNITY) {
return app(OpportunityFieldMapper::class);
}
if ($objectType === self::OBJECT_LEAD) {
return app(LeadFieldMapper::class);
}
return null;
}
public function getRecord(string $objectType, string $objectId, array $fields = []): array
{
return $this->client->getRecordById($objectType, $objectId);
}
public function getConfiguration(): Configuration
{
return $this->config;
}
public function setConfiguration(Configuration $config): void
{
$this->clearExternalMapCache();
$this->config = $config;
}
private function setEditionConfiguration(string $provider): void
{
$this->editionConfig = app(IntegrationConfigFactory::class)->create($provider);
}
public function setCrmUrlGenerator(Configuration $config): void
{
$this->crmUrlGenerator = app(IntegrationAppCrmGeneratorFactory::class)->create($config);
}
public function getCrmUrlGenerator(): ?GenerateProviderUrlInterface
{
if ($this->crmUrlGenerator === null) {
$this->setCrmUrlGenerator($this->config);
}
return $this->crmUrlGenerator;
}
public function subscribeEntityEvents(bool $enableTrigger = true): void
{
$eventStates = $this->client->updateEntityEventsState($enableTrigger);
$this->logger->info('[integration-app] Change team entity events subscription', [
'teamId' => $this->team->getId(),
'teamName' => $this->team->getName(),
'states' => $eventStates,
'action' => $enableTrigger ? 'subscribe' : 'unsubscribe',
]);
}
#[\Override] public function supportsNotes(): bool
{
return $this->editionConfig->supportsNotes();
}
#[\Override] public function saveNote(
string $title,
string $body,
string $objectId,
?NoteObject $noteObject = null,
): ?string {
if ($noteObject === null) {
return null;
}
$notePayload = [
'title' => $title,
'content' => $body,
'objectId' => $objectId,
'objectType' => $noteObject->value,
];
$result = $this->client->createNote($notePayload);
// debug saving note response
$this->logger->info('[integration-app] createNote response', [
'objectId' => $objectId,
'objectType' => $noteObject->value,
'result' => $result,
'hasId' => isset($result['id']),
]);
return $result['id'] ?? null;
}
/**
* @throws CrmException
*/
#[\Override] public function saveActivity(Activity $activity): Activity
{
$this->logger->info('[integration-app] saveActivity', [
'activity' => $activity->getUuid(),
'type' => $activity->getType(),
]);
if ($activity->getCrmType() === Activity::TYPE_CONFERENCE) {
$crmActivity = $this->saveMeeting($activity);
} elseif (in_array($activity->getType(), [Activity::TYPE_SOFTPHONE, Activity::TYPE_SOFTPHONE_INBOUND])) {
$crmActivity = $this->saveCall($activity);
} else {
throw new CrmException('Unsupported activity type');
}
$crmActivityId = $crmActivity['id'] ?? null;
if ($crmActivityId !== null) {
$activity->crm_provider_id = $crmActivityId;
$activity->save();
$this->logger->info('[integration-app] Activity successfully logged to CRM', [
'activity' => $activity->getUuid(),
'type' => $activity->getType(),
'crmId' => $crmActivityId,
]);
}
return $activity;
}
public function saveMeeting(Activity $activity): array
{
$decorateActivity = app(DecorateActivity::class);
$meetingPayload = [
'Event_Title' => $decorateActivity->generateTitle($activity),
'Start_DateTime' => $activity->getActualStartTime()->toIso8601String(),
'End_DateTime' => $activity->getActualEndTime()->toIso8601String(),
'ownerId' => $this->getActivityOwnerId($activity),
];
$payload = array_merge($meetingPayload, $this->attachToProspect($activity));
if ($activity->hasCrmProviderId()) {
$crmId = $activity->getCrmProviderId();
$meeting = $this->client->getMeeting($crmId);
$oldDescription = $meeting['fields']['Description'] ?? null;
$payload['Description'] = $decorateActivity->generateUpdatedDescription($oldDescription, $activity);
$this->logger->info('[integration-app] CRM update meeting', [
'activity' => $activity->getUuid(),
'crm_id' => $crmId,
'payload' => $payload,
]);
return $this->client->updateMeeting($crmId, $payload);
}
$payload['Description'] = $decorateActivity->generateDescription($activity);
$this->logger->info('[integration-app] CRM log meeting', [
'activity' => $activity->getUuid(),
'payload' => $payload,
]);
return $this->client->createMeeting($payload);
}
public function saveCall(Activity $activity): array
{
$decorateActivity = app(DecorateActivity::class);
$callPayload = [
'Call_Type' => $this->getCallType($activity),
'Call_Start_Time' => $activity->getActualStartTime()->toIso8601String(),
'Call_Duration' => $activity->getDuration(),
'name' => $decorateActivity->generateTitle($activity),
'ownerId' => $this->getActivityOwnerId($activity),
];
$payload = array_merge($callPayload, $this->attachToProspect($activity));
if ($activity->hasCrmProviderId()) {
$crmId = $activity->getCrmProviderId();
$call = $this->client->getCall($crmId);
$oldDescription = $call['fields']['Description'] ?? null;
$payload['description'] = $decorateActivity->generateUpdatedDescription($oldDescription, $activity);
$this->logger->info('[integration-app] CRM update call', [
'activity' => $activity->getUuid(),
'crm_id' => $crmId,
'payload' => $payload,
]);
return $this->client->updateCall($crmId, $payload);
}
$payload['description'] = $decorateActivity->generateDescription($activity);
$this->logger->info('[integration-app] CRM log call', [
'activity' => $activity->getUuid(),
'payload' => $payload,
]);
return $this->client->createCall($payload);
}
private function getCallType(Activity $activity): string
{
if ($activity->getStatus() === Activity::STATUS_NO_ANSWER) {
return self::CALL_TYPE_MISSED;
}
return $activity->getType() === Activity::TYPE_SOFTPHONE_INBOUND ? self::CALL_TYPE_INBOUND : self::CALL_TYPE_OUTBOUND;
}
private function attachToProspect(Activity $activity): array
{
$payload = [];
if ($activity->hasContact()) {
$payload['contactId'] = $activity->getContact()->getCrmProviderId();
}
if ($activity->hasOpportunity()) {
return array_merge(
$payload,
$this->buildBasicPayload(
self::RELATIONSHIP_OPPORTUNITY,
$activity->getOpportunity()->getCrmProviderId()
)
);
}
if ($activity->hasAccount() && ! $activity->getAccount()->getIsInternal()) {
return array_merge(
$payload,
$this->buildBasicPayload(
self::RELATIONSHIP_ACCOUNT,
$activity->getAccount()->getCrmProviderId()
)
);
}
if ($activity->hasLead()) {
$payload = $this->handleLeadPayload($activity);
}
return $payload;
}
private function handleLeadPayload(Activity $activity): array
{
$freshLead = $this->syncLead($activity->getLead()->getCrmProviderId());
$lead = $freshLead ?? $activity->getLead();
if ($lead->getConvertedAt() === null) {
return $this->buildBasicPayload(self::RELATIONSHIP_LEAD, $lead->getCrmProviderId());
}
$activity->lead_id = null;
if ($lead->hasAccount()) {
$account = $lead->getAccount();
$activity->account_id = $account->getId();
$payload = $this->buildBasicPayload(self::RELATIONSHIP_ACCOUNT, $account->getCrmProviderId());
} else {
$payload = [];
}
if ($lead->hasOpportunity()) {
$opportunity = $lead->getOpportunity();
$payload = $this->buildBasicPayload(self::RELATIONSHIP_OPPORTUNITY, $opportunity->getCrmProviderId());
$activity->opportunity_id = $opportunity->getId();
$activity->value = $opportunity->value;
$activity->stage_id = $opportunity->stage_id;
} else {
$activity->stage_id = null;
}
if ($lead->hasContact()) {
$contact = $lead->getContact();
$payload['contactId'] = $contact->getCrmProviderId();
$activity->contact_id = $contact->getId();
}
$activity->save();
event(new ActivityLeadConverted($activity, $lead));
$this->logger->info('[integration-app] Lead converted', [
'activityUuid' => $activity->getUuid(),
'leadUuid' => $lead->getUuid(),
]);
return $payload;
}
private function buildBasicPayload(string $type, string $id): array
{
return [
'type' => $type,
'id' => $id,
];
}
private function getActivityOwnerId(Activity $activity): ?string
{
$ownerId = null;
if ($activity->hasUser() && $activity->getUser()->getProfile() !== null) {
$ownerId = $activity->getUser()->getProfile()->getCrmProviderId();
}
return $ownerId;
}
#[\Override] public function saveFollowupActivity(Activity $activity, array $fields): ?string
{
$taskPayload = [
'subject' => $fields['subject'],
'dueTime' => isset($fields['dueDate']) ? Carbon::parse($fields['dueDate'])->format('Y-m-d') : null,
'ownerId' => $this->getActivityOwnerId($activity),
];
if (isset($fields['status'])) {
$taskPayload['status'] = $fields['status'];
}
if (isset($fields['priority'])) {
$taskPayload['priority'] = $fields['priority'];
}
if (isset($fields['content'])) {
$taskPayload['content'] = $fields['content'];
}
$payload = array_merge($taskPayload, $this->attachToProspect($activity));
$this->logger->info('[integration-app] CRM log follow up task', [
'activity' => $activity->getUuid(),
'payload' => $payload,
]);
$task = $this->client->createTask($payload);
return $task['id'] ?? null;
}
#[\Override] public function saveTranscriptionSummaryAsNote(
ActivityContract $activity,
string $title,
string $body,
?string $objectId,
?NoteObject $noteObject = null,
): ?string {
// We have to find a way to store the transcription summary
// This might be possible either by Tasks, Events, Engagements & Notes
// Find what the CRM supports and save the note with the appropriate object(eg Notes)
// For now use only Notes as both ZOHO & Salesforce support them.
if ($this->supportsNotes() && $objectId !== null) {
$this->logger->info('[integration-app] saving note', [
'activityId' => $activity->getUuid(),
'objectId' => $objectId,
]);
return $this->saveNote($title, $body, $objectId, $noteObject);
}
$this->logger->info('[integration-app] skip saveTranscriptionSummaryAsNote', [
'activityId' => $activity->getUuid(),
'supportsNotes' => $this->supportsNotes(),
'objectId' => $objectId,
]);
return null;
}
public function generateProviderUrl(string $providerId, string $objectType): ?string
{
return $this->getCrmUrlGenerator()?->generateProviderUrl($providerId, $objectType);
}
public function updateStage($crmObject, Stage $stage): void
{
$objectType = $stage->getType();
$objectId = $crmObject->getCrmProviderId();
$params = ['stageName' => $stage->getCrmProviderId()];
$this->logger->info('[integration-app] updateStage', [
'objectType' => $objectType,
'objectId' => $objectId,
'params' => $params,
]);
$data = [
'data' => $this->normalizeData($objectType, $params),
];
if ($objectType === Stage::TYPE_LEAD) {
$this->client->updateLead($objectId, $data);
} else {
$this->client->updateDeal($objectId, $data);
}
}
/**
* @throws \Exception
*/
public function fetchAndAssociateRelatedActivity(Activity $activity): ?Activity
{
if ($activity->getCrm()?->getEdition() !== IntegrationAppProviders::ZOHO_CRM) {
return null;
}
if (! $activity->isTypeConference()) {
return null;
}
// The related activity is already linked.
if ($activity->hasCrmProviderId()) {
return $activity;
}
if ($activity->hasActualStartTime() === false) {
return null;
}
return $this->fetchAndAssociateZohoRelatedActivity($activity);
}
public function fetchAndAssociateZohoRelatedActivity(Activity $activity): ?Activity
{
try {
$meeting = $this->fetchRelatedZohoActivity($activity);
if (empty($meeting)) {
$this->logger->info('[integration-app] fetchRelatedZohoActivity No related activity found', [
'activity' => $activity->getUuid(),
]);
return null;
}
$decorateActivity = app(DecorateActivity::class);
$oldDescription = $meeting['Description'] ?? '';
$updatedDescription = $decorateActivity->generateUpdatedDescription($oldDescription, $activity);
$this->logger->info('[integration-app] fetchAndAssociateZohoRelatedActivity updating related activity', [
'activity' => $activity->getUuid(),
'description' => $updatedDescription,
]);
$this->client->updateMeeting($meeting['id'], ['Description' => $updatedDescription]);
// Update our activity to reflect the remote data.
$activity->update([
'crm_provider_id' => $meeting['id'],
'summary' => $meeting['Description'],
]);
return $activity;
} catch (\Exception $exception) {
\Sentry::captureException($exception);
throw $exception;
}
}
public function fetchRelatedZohoActivity(Activity $activity): array
{
[$from, $to] = $this->getFromToDates($activity);
$start = $from?->toIso8601String(); // e.g., 2025-07-01T00:00:00+00:00
$end = $to?->toIso8601String(); // e.g., 2025-07-14T23:59:59+00:00
if ($start === null || $end === null) {
$this->logger->info(
'[integration-app] fetchRelatedZohoActivity missing start or end date',
[
'activity' => $activity->getUuid(),
'start' => $start,
'end' => $end,
'from' => $from,
'to' => $to,
]
);
return [];
}
$whoId = null;
$whatId = null;
$criteriaParts = [];
if ($activity->getContact()) {
$whoId = $activity->getContact()->getCrmProviderId();
$criteriaParts[] = "(Who_Id:equals:$whoId)";
}
if ($activity->getOpportunity()) {
$whatId = $activity->getOpportunity()->getCrmProviderId();
} elseif ($activity->getAccount() && $activity->getAccount()->getIsInternal() === false) {
$whatId = $activity->getAccount()->getCrmProviderId();
} elseif ($activity->getLead()) {
$whatId = $activity->getLead()->getCrmProviderId();
}
if ($whatId !== null) {
$criteriaParts[] = "(What_Id:equals:$whatId)";
}
if ($whoId === null && $whatId === null) {
$this->logger->info(
'[integration-app] fetchRelatedZohoActivity cannot find prospect',
[
'activity' => $activity->getUuid(),
]
);
return [];
}
$criteriaParts[] = "(Start_DateTime:greater_equal:$start)";
$criteriaParts[] = "(End_DateTime:less_equal:$end)";
$criteria = implode(' AND ', $criteriaParts);
$params = [
'criteria' => $criteria,
'sort_by' => 'Modified_Time',
'sort_order' => 'desc',
];
$this->logger->info(
'[integration-app] fetchRelatedZohoActivity searching for related activity',
[
'activity' => $activity->getUuid(),
'params' => $params,
]
);
$meetings = $this->client->searchMeetings($params);
if (! empty($meetings)) {
return $meetings[0];
}
return [];
}
private function getFromToDates(Activity $activity): array
{
$calendarEvent = $activity->calendarEvent()->first();
$from = $calendarEvent?->getStartTime();
$to = $calendarEvent?->getEndTime();
if (! $from || ! $to) {
$from = $activity->hasScheduledStartTime()
? $activity->getScheduledStartTime()
: $activity->getActualStartTime();
$to = $activity->hasScheduledEndTime()
? $activity->getScheduledEndTime()->addMinutes(15)
: $activity->getActualEndTime();
}
return [$from, $to];
}
}
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
8
1
3
4
Previous Highlighted Error
Next Highlighted Error
SELECT
# DISTINCT
opp.id as opp_id, opp.uuid, opp.name,
# COUNT(dr.id) AS deal_risk_count,
# dr.id,
# cfd.value,
usr.name AS owner_name,
opp.value, opp.currency_code, opp.close_date, opp.remotely_created_at, opp.is_closed, opp.is_won,
usr.uuid as owner_uuid,
usr.photo_path as owner_photo,
usr.id AS owner_id,
jt.name as owner_job,
opp.stage_id, opp.stage_updated_at,
acc.name AS acc_name, opp.stage_updated_at, acc.crm_provider_id AS acc_provider_id, opp.crm_provider_id AS opp_provider_id,
rt.business_process_id AS pipeline_id
FROM opportunities opp
LEFT JOIN record_types rt ON opp.record_type_id = rt.id
LEFT JOIN users usr ON opp.user_id = usr.id
LEFT JOIN accounts acc ON opp.account_id = acc.id
LEFT JOIN job_titles jt ON usr.job_title_id = jt.id
# LEFT JOIN group_deal_risk_types gdrt ON gdrt.group_id = usr.group_id
# LEFT JOIN deal_risks dr ON dr.opportunity_id = opp.id AND dr.group_deal_risk_type_id = gdrt.id
LEFT JOIN crm_field_data cfd ON (cfd.object_id = opp.id and cfd.crm_field_id = 66814)
WHERE opp.user_id IS NOT NULL
AND opp.deleted_at IS NULL
AND opp.is_closed = 1
AND opp.is_won = 0
AND opp.close_date >= '2024-01-01 00:00:00'
AND opp.close_date <= '2024-12-31 23:59:59'
AND usr.team_id = 1
# and opp.id = 4823179
GROUP BY opp.id, cfd.value
ORDER BY
# cfd.value
CAST(cfd.value AS UNSIGNED)
# owner_name
# (SELECT COUNT(dr.id)
# FROM deal_risks dr
# JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id
# WHERE dr.opportunity_id = opp.id
# AND dr.is_active = 1
# AND gdrt.is_enabled = 1)
DESC
LIMIT 25
# OFFSET 0
;
select * from crm_fields where crm_configuration_id = 1 and object_type = 'opportunity';
select * from crm_layout_entities where crm_layout_id = 1493;
SELECT * FROM opportunities WHERE id = 4584045;
SELECT * FROM crm_field_data WHERE object_id = 4584045;
SELECT * FROM opportunities where team_id = 1 and crm_provider_id = '0061K00000lfb9IQAQ'
SELECT
opp.id as opportunity_id,
opp.name,
COUNT(dr.id) as risk_count
FROM opportunities opp
LEFT JOIN deal_risks dr ON dr.opportunity_id = opp.id
WHERE opp.id IN (
6069574,8900938,9507638,9524799,9660490,9662824,9705675,9749758,4158460,4391812,6450439,4448422,5118945,5590675,4584045,7228149,9002408,9165534,9446720,9641778,9665149,9703344,9709280,5747948,4158491,6182565,6263970,5798120,5111315,4536978,6062352,6548383,6072095,6548225,4480986,5011422,6548381,8760540,8917554,9509986,9514392,9569009,9569011,9578490,9713604,5784397,7276612,7288405,8994421,9118219,9608148,9818911,4510535,6479693,5958049,6271674,6550448,4158331,4158483,6126571,6171615,6540943,4897466,5190896,5796182,5932762,8572433,8723698,8892697,9711001,9789264,4549188,6100831,6170064,6260799,6263653,6449936,6530871,6538978,7777651,8059269,8319918,8787049,8901150,9263153,9453207,9514738,9696700,9791062,5752018,6421452,7439134,7878923,9354763,9369285,9514396,9582506,9889949,9890216,4094311,4158495,4158496,6098128,5585661,3872564,6442149,5891604,6164746,6199593,6583474,6519684,9018490,9809006,4496897,5041324,5829430,6198319,6253504,6555763,7242914,7931055,8024125,8797814,8058559,8673347,8892695,8994420,9616219,9714970,9722004,9809439,9818918,6523177,8134147,9002915,9711422,9892713,9901719,9954210,9978435,5800810,6243518,6416114,6222251,6411974,6512456,5791953,6545606,9914780,5805540,6238986,6463838,6547680,9767049,9809437,9810885,9890855,6673493,9902036,4335521,6379871,6503799,6546077,8018765,9907556,9958433,9905855,9916179,9946741,9957877,5563344,6271838,6450815,7641128,7762567,7780592,8684810,8685786,8685787,8685788
)
GROUP BY opp.id;
SELECT COUNT(dr.id)
FROM deal_risks dr
JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id
WHERE dr.opportunity_id = 5563344
# AND gdrt.group_id = usr.group_id
EXPLAIN SELECT
opp.id as opp_id, opp.uuid, opp.name,
cfd.value,
cfv.sequence,
cfv.value,
# MAX(cfd.value) AS max_cfd_value,
usr.name AS owner_name,
opp.value, opp.currency_code, opp.close_date, opp.remotely_created_at, opp.is_closed, opp.is_won,
usr.uuid as owner_uuid,
usr.photo_path as owner_photo,
usr.id AS owner_id,
jt.name as owner_job,
opp.stage_id, opp.stage_updated_at,
acc.name AS acc_name, opp.stage_updated_at, acc.crm_provider_id AS acc_provider_id, opp.crm_provider_id AS opp_provider_id,
rt.business_process_id AS pipeline_id
FROM opportunities opp
LEFT JOIN record_types rt ON opp.record_type_id = rt.id
LEFT JOIN users usr ON opp.user_id = usr.id
LEFT JOIN accounts acc ON opp.account_id = acc.id
LEFT JOIN job_titles jt ON usr.job_title_id = jt.id
LEFT JOIN crm_field_data cfd ON cfd.id = (SELECT sub_cfd.id
FROM crm_field_data sub_cfd
WHERE sub_cfd.object_id = opp.id
AND sub_cfd.crm_field_id = 66810
ORDER BY sub_cfd.updated_at DESC
LIMIT 1)
LEFT JOIN crm_field_values cfv ON cfv.crm_field_id = 66810 AND cfv.value = cfd.value
WHERE opp.user_id IS NOT NULL
AND opp.deleted_at IS NULL
AND opp.is_closed = 0
# AND opp.is_closed = 1
# AND opp.is_won = 0
AND opp.close_date >= '2024-01-01 00:00:00'
AND opp.close_date <= '2024-12-31 23:59:59'
AND usr.team_id = 1
# and opp.id = 4823179
# GROUP BY opp.id
ORDER BY
cfv.sequence DESC,
# opp.name
# owner_name
cfd.value
# CAST(cfd.value AS UNSIGNED)
# CAST(MAX(cfd.value) AS UNSIGNED)
# (SELECT COUNT(dr.id)
# FROM deal_risks dr
# JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id
# WHERE dr.opportunity_id = opp.id
# AND dr.is_active = 1 AND gdrt.is_enabled = 1)
DESC
# LIMIT 75, 25
;
SELECT * FROM crm_field_values WHERE crm_field_id = 66810;
SELECT f.id, f.crm_provider_id AS field_name, f.label, fd.object_id AS dealId, fd.value, fd.updated_at, fd.id, fd.created_at
FROM crm_fields f
INNER JOIN crm_field_data fd ON fd.crm_field_id = f.id
WHERE (f.crm_configuration_id = 1)
AND (f.object_type = 'opportunity')
# AND (fd.object_id IN (4158331,4158483,4158495,4158496,6069574,6263970,6171615,6540943,6545606,5829430,6198319,6263653,6548381,7242914,8797814,7228149,7439134,7878923,8134147,9002915,9118219,9165534,9354763,9369285,9446720))
AND (fd.object_id IN (4158460))
AND (f.crm_provider_id IN ('ForecastCategoryName'))
ORDER BY fd.object_id ASC, fd.updated_at DESC;
select * from crm_layouts where crm_configuration_id = 1;
select cf.* from crm_fields cf
join crm_layout_entities cle on cf.id = cle.crm_field_id
where crm_layout_id = 1493;
SELECT * FROM opportunities WHERE id = 4158460;
SELECT * FROM crm_field_data WHERE object_id = 4158460;
select * from users where team_id = 1;
SELECT * FROM users WHERE id = 7160;
select * from role_user where user_id = 3248;
select * from crm_field_values where crm_field_id = 66824;
SELECT * FROM users WHERE id = 23470;
select * from crm_configurations;
# [PASSWORD_DOTS]
select * from teams where id = 1038; # 23521, 966
select * from users where team_id = 1038;
select * from crm_configurations where id = 966;
SELECT * FROM activities WHERE uuid_to_bin('e8dc7c34-31f6-4430-bd81-2d9d8f00dd07') = uuid; # 54965762
SELECT * FROM activities WHERE uuid_to_bin('4b5727c0-69d1-428f-b8d9-b649055166e2') = uuid; # 54965764
SELECT * FROM participants WHERE activity_id = 54965764;
SELECT id, uuid, title, recording_state FROM activities WHERE uuid_to_bin('355f105d-5606-4379-b0c5-d91daf59f4ce') = uuid; # 54964075
SELECT * FROM participants WHERE activity_id = 54964075;
select f.id, slug, title, tf.team_id from team_features tf JOIN features f on tf.feature_id = f.id
where tf.team_id = 1038;
# [PASSWORD_DOTS] PD [PASSWORD_DOTS]
select * from teams where id = 1029;
SELECT * FROM crm_configurations WHERE id = 957;
SELECT * FROM activities WHERE uuid_to_bin('581a33cb-4343-44bd-ac0c-4a5cee71c5ec') = uuid; # 54963423
SELECT * FROM activities WHERE uuid_to_bin('07238011-25fa-418e-838b-fb21e82b9ea2') = uuid; # 54963433
SELECT * FROM activities WHERE uuid_to_bin('8b6bb2f7-e7a7-4aec-8806-fbfea7093ccd') = uuid; # 54963421
# [PASSWORD_DOTS] Close [PASSWORD_DOTS]
select * from teams where id = 1031;
SELECT * FROM crm_configurations WHERE id = 959;
SELECT * FROM activities WHERE uuid_to_bin('59c517e0-96c9-4dad-bfeb-b7bef72f8725') = uuid; # 54963517
SELECT * FROM activities WHERE uuid_to_bin('07238011-25fa-418e-838b-fb21e82b9ea2') = uuid; # 54963433
SELECT * FROM activities WHERE uuid_to_bin('d68311e3-ac34-49bd-bf04-88323a7e5352') = uuid; # 54966009
# [PASSWORD_DOTS] SF [PASSWORD_DOTS]
SELECT * FROM activities WHERE uuid_to_bin('2bd4cfa3-4eb5-4c77-84a7-9ed46a21c988') = uuid;
select * from roles;
select * from permissions;
select * from permission_role where permission_id = 136;
select * from migrations order by id desc;
select * from teams where id IN (1, 1037);
select * from crm_layouts where crm_configuration_id = 1;
SELECT * FROM crm_layout_entities WHERE crm_layout_id = 1493;
SELECT * FROM crm_fields WHERE id IN (1652,1661,66799,66814,66821,66836,66843,66846,66864,84752,182306,323580,380378);
select * from features;
select * from team_features where feature_id = 33;
select * from opportunities;
select * from teams;
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 = 1052 and sa.provider = 'hubspot';
SELECT * FROM accounts where id = 11512582;
select * from activities where account_id = 11512582;
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.2962101,"top":1.0,"width":0.03856383,"height":-0.019952059},"on_screen":true,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"#12066 on JY-20725-handle-HS-search-rate-limit, menu","depth":5,"bounds":{"left":0.33477393,"top":1.0,"width":0.122340426,"height":-0.019952059},"on_screen":true,"help_text":"Pull request #12066 exists for current branch JY-20725-handle-HS-search-rate-limit, but local branch is out of sync with remote","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"bounds":{"left":0.5731383,"top":1.0,"width":0.011303191,"height":-0.019952059},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"HandleHubspotRateLimitTest","depth":6,"bounds":{"left":0.5884308,"top":1.0,"width":0.076130316,"height":-0.019952059},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run 'HandleHubspotRateLimitTest'","depth":6,"bounds":{"left":0.66456115,"top":1.0,"width":0.011303191,"height":-0.019952059},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'HandleHubspotRateLimitTest'","depth":6,"bounds":{"left":0.67586434,"top":1.0,"width":0.011303191,"height":-0.019952059},"on_screen":true,"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.6871675,"top":1.0,"width":0.011303191,"height":-0.019952059},"on_screen":true,"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.7150931,"top":1.0,"width":0.011303191,"height":-0.019952059},"on_screen":true,"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.72639626,"top":1.0,"width":0.011303191,"height":-0.019952059},"on_screen":true,"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.73769945,"top":1.0,"width":0.011303191,"height":-0.019952059},"on_screen":true,"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},"on_screen":false,"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},"on_screen":false,"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},"on_screen":false,"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},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"16","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"2","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"on_screen":true,"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\\IntegrationApp;\n\nuse Carbon\\Carbon;\nuse Jiminny\\Contracts\\Crm\\Providers;\nuse Jiminny\\Contracts\\Services\\Crm\\ClientInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\FetchRelatedActivityInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\ImportsBusinessProcessesInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\LayoutManagementInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\MatchCrmEntitiesInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\Provider\\IntegrationAppInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\RemoteEntityLookupInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\RemoteEntityManipulationInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\RemoteNoteEntityManipulationInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\SendSummaryToCrmInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\SettingsInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\SyncCrmEntitiesInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\SyncCrmMetadataInterface;\nuse Jiminny\\Events\\Activities\\Crm\\ActivityLeadConverted;\nuse Jiminny\\Exceptions\\CrmException;\nuse Jiminny\\Exceptions\\SocialAccountNotFoundException;\nuse Jiminny\\Jobs\\Crm\\NoteObject;\nuse Jiminny\\Models\\Account;\nuse Jiminny\\Models\\Activity;\nuse Jiminny\\Models\\Contracts\\ActivityContract;\nuse Jiminny\\Models\\Crm\\Configuration;\nuse Jiminny\\Models\\Opportunity;\nuse Jiminny\\Models\\Stage;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Services\\Crm\\BaseService;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\Config\\IntegrationAppProviders;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\Config\\IntegrationConfigFactory;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\DTO\\Mappers\\FieldMapperInterface;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\DTO\\Mappers\\LeadFieldMapper;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\DTO\\Utils\\GenerateProviderUrlInterface;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\DTO\\Utils\\IntegrationAppCrmGeneratorFactory;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\DTO\\Utils\\UrlGeneratorInterface;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\ServiceTraits\\SyncCrmFieldsTrait;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\ServiceTraits\\SystemStateTrait;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\ServiceTraits\\LayoutTrait;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\ServiceTraits\\MatchProspectsTrait;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\ServiceTraits\\NotSupportedTrait;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\ServiceTraits\\SyncCrmEntitiesTrait;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\ServiceTraits\\SyncCrmMetadataTrait;\nuse Psr\\Log\\LoggerInterface;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\DTO\\Mappers\\OpportunityFieldMapper;\nuse Jiminny\\Repositories\\Crm\\ProfileRepository;\nuse Jiminny\\Repositories\\Crm\\OpportunityRepository;\nuse Jiminny\\Models\\Crm\\Profile;\nuse Jiminny\\Services\\Crm\\CrmObjects\\CrmObjectsRepository;\n\nclass Service extends BaseService implements\n IntegrationAppInterface,\n SyncCrmEntitiesInterface,\n SyncCrmMetadataInterface,\n ImportsBusinessProcessesInterface,\n RemoteEntityManipulationInterface,\n LayoutManagementInterface,\n SettingsInterface,\n MatchCrmEntitiesInterface,\n RemoteEntityLookupInterface,\n RemoteNoteEntityManipulationInterface,\n SendSummaryToCrmInterface,\n UrlGeneratorInterface,\n FetchRelatedActivityInterface\n{\n use SyncCrmMetadataTrait;\n use SyncCrmEntitiesTrait;\n use SystemStateTrait;\n use LayoutTrait;\n use NotSupportedTrait;\n use MatchProspectsTrait;\n use SyncCrmFieldsTrait;\n\n public const string CALL_TYPE_MISSED = 'Missed';\n public const string CALL_TYPE_INBOUND = 'Inbound';\n public const string CALL_TYPE_OUTBOUND = 'Outbound';\n public const string RELATIONSHIP_OPPORTUNITY = 'Deals';\n public const string RELATIONSHIP_LEAD = 'Leads';\n public const string RELATIONSHIP_ACCOUNT = 'Accounts';\n\n /**\n * @var ClientInterface&DataClient\n */\n protected $client;\n\n protected ?User $invokedUser = null;\n\n protected ?GenerateProviderUrlInterface $crmUrlGenerator = null;\n\n public function __construct(\n DataClient $client,\n LoggerInterface $logger,\n ) {\n parent::__construct();\n $this->client = $client;\n $this->logger = $logger;\n }\n\n public function getDisplayName(): string\n {\n return Providers::getProviderDisplayName(\n Providers::getCrmIntegrationSlug($this->config)\n );\n }\n\n /**\n * @throws \\Exception\n */\n public function setUser(User $user): void\n {\n $this->configureSentryScope($user);\n $this->invokedUser = $user;\n\n $this->team = $user->getTeam();\n $teamOwner = $this->team->getOwner();\n\n $this->setConfiguration($user->getTeam()->getCrmConfiguration());\n $this->setEditionConfiguration(Providers::getCrmIntegrationSlug($this->config));\n $this->setCrmUrlGenerator($this->config);\n\n $this->client->setTeam($this->team);\n $socialAccount = $teamOwner?->getSocialAccount('integration-app');\n if ($socialAccount === null) {\n $this->logger->info('[integration-app] Social account not found', [\n 'teamId' => $this->team->getId(),\n 'teamOwnerId' => $teamOwner?->getId(),\n 'userId' => $user->getId(),\n ]);\n\n throw new SocialAccountNotFoundException('Social account not found!');\n }\n $this->client->setSocialAccount($socialAccount);\n\n // The CRM Service is properly bootstrapped, and supports remote operations\n $this->connect();\n }\n\n public function normalizeValue(string $fieldType, string $fieldValue, bool $internal = false): string\n {\n return $fieldValue;\n }\n\n public function find(string $name, array $scopes): array\n {\n /** @var LocalSearch $localSearch */\n $localSearch = app(LocalSearch::class);\n $localSearch->setConfiguration($this->config);\n $localSearch->setCountryCode($this->invokedUser->getCountryCode());\n\n return $localSearch->search($name);\n\n // if (! empty($localMatch)) {\n // return $localMatch;\n // }\n //\n // /** @var RemoteSearch $remoteSearch */\n // $remoteSearch = app(RemoteSearch::class);\n // $remoteSearch->setClient($this->client);\n // $remoteSearch->setConfiguration($this->config);\n //\n // return $remoteSearch->search($name);\n }\n\n public function findOpportunities(?string $crmAccountId, ?string $crmContactId, ?int $userId = null): array\n {\n $data = [];\n $ownerData = [];\n\n $account = $this->getAccount($crmAccountId, $crmContactId);\n if ($account === null) {\n return [];\n }\n\n $ownerId = $this->getOwnerId($userId);\n\n try {\n $opportunityRepository = app(OpportunityRepository::class);\n $opportunities = $opportunityRepository->findAllByConfigurationAndAccountId(\n $this->config,\n $account->getId()\n );\n\n foreach ($opportunities as $opportunity) {\n /** @var Opportunity $opportunity */\n $record = $this->buildOpportunityData($opportunity);\n\n if ($ownerId && $opportunity->getOwnerId() === $ownerId) {\n $ownerData[] = $record;\n }\n\n $data[] = $record;\n }\n\n if (! empty($ownerData)) {\n return $ownerData;\n }\n\n return $data;\n } catch (\\Exception $e) {\n $this->logger->info('[integration-app] Failed to fetch opportunities', [\n 'contact' => $crmContactId,\n 'account' => $crmAccountId,\n 'owner' => $ownerId,\n 'error' => $e->getMessage(),\n ]);\n\n return $data;\n }\n }\n\n private function getOwnerId(?int $userId = null): ?string\n {\n if (! $userId) {\n return null;\n }\n\n $profileRepository = app(ProfileRepository::class);\n $profile = $profileRepository->findProfileByUserId($this->config, $userId);\n\n return $profile instanceof Profile ? $profile->getCrmProviderId() : null;\n }\n\n private function getAccount(?string $crmAccountId = null, ?string $crmContactId = null): ?Account\n {\n $crmRepository = app(CrmObjectsRepository::class);\n\n if ($crmAccountId === null) {\n $contact = $crmRepository->findContactByCrmProviderId($this->config, $crmContactId);\n\n return $contact->getAccount();\n }\n\n return $crmRepository->findAccountByCrmProviderId($this->config, $crmAccountId);\n }\n\n private function buildOpportunityData(Opportunity $opportunity): array\n {\n $record = [\n 'crmId' => $opportunity->getCrmProviderId(),\n 'name' => $opportunity->getName(),\n 'won' => $opportunity->isWon(),\n 'closed' => $opportunity->isClosed(),\n ];\n\n if (! empty($opportunity->getFormattedValueAttribute())) {\n $record['value'] = $opportunity->getFormattedValueAttribute();\n }\n\n if (! empty($opportunity->getStage())) {\n $record['stage'] = [\n 'id' => $opportunity->getStage()->getUuid(),\n 'name' => $opportunity->getStage()->getName(),\n ];\n }\n\n return $record;\n }\n\n public function updateRecord(string $objectType, string $objectId, array $data, array $headers = []): void\n {\n $data = [\n 'data' => $this->normalizeData($objectType, $data),\n ];\n\n $this->client->updateRecordById($objectType, $objectId, $data);\n }\n\n private function normalizeData(string $objectType, array $data): array\n {\n $fieldMapper = $this->getFieldMapper($objectType);\n\n if (! $fieldMapper instanceof FieldMapperInterface) {\n return $data;\n }\n\n return $fieldMapper->mapToCrmFields($data);\n }\n\n private function getFieldMapper(string $objectType): ?FieldMapperInterface\n {\n if ($objectType === self::OBJECT_OPPORTUNITY) {\n return app(OpportunityFieldMapper::class);\n }\n\n if ($objectType === self::OBJECT_LEAD) {\n return app(LeadFieldMapper::class);\n }\n\n return null;\n }\n\n public function getRecord(string $objectType, string $objectId, array $fields = []): array\n {\n return $this->client->getRecordById($objectType, $objectId);\n }\n\n public function getConfiguration(): Configuration\n {\n return $this->config;\n }\n\n public function setConfiguration(Configuration $config): void\n {\n $this->clearExternalMapCache();\n\n $this->config = $config;\n }\n\n private function setEditionConfiguration(string $provider): void\n {\n $this->editionConfig = app(IntegrationConfigFactory::class)->create($provider);\n }\n\n public function setCrmUrlGenerator(Configuration $config): void\n {\n $this->crmUrlGenerator = app(IntegrationAppCrmGeneratorFactory::class)->create($config);\n }\n\n public function getCrmUrlGenerator(): ?GenerateProviderUrlInterface\n {\n if ($this->crmUrlGenerator === null) {\n $this->setCrmUrlGenerator($this->config);\n }\n\n return $this->crmUrlGenerator;\n }\n\n public function subscribeEntityEvents(bool $enableTrigger = true): void\n {\n $eventStates = $this->client->updateEntityEventsState($enableTrigger);\n\n $this->logger->info('[integration-app] Change team entity events subscription', [\n 'teamId' => $this->team->getId(),\n 'teamName' => $this->team->getName(),\n 'states' => $eventStates,\n 'action' => $enableTrigger ? 'subscribe' : 'unsubscribe',\n ]);\n }\n\n #[\\Override] public function supportsNotes(): bool\n {\n return $this->editionConfig->supportsNotes();\n }\n\n #[\\Override] public function saveNote(\n string $title,\n string $body,\n string $objectId,\n ?NoteObject $noteObject = null,\n ): ?string {\n if ($noteObject === null) {\n return null;\n }\n\n $notePayload = [\n 'title' => $title,\n 'content' => $body,\n 'objectId' => $objectId,\n 'objectType' => $noteObject->value,\n ];\n\n $result = $this->client->createNote($notePayload);\n\n // debug saving note response\n $this->logger->info('[integration-app] createNote response', [\n 'objectId' => $objectId,\n 'objectType' => $noteObject->value,\n 'result' => $result,\n 'hasId' => isset($result['id']),\n ]);\n\n return $result['id'] ?? null;\n }\n\n /**\n * @throws CrmException\n */\n #[\\Override] public function saveActivity(Activity $activity): Activity\n {\n $this->logger->info('[integration-app] saveActivity', [\n 'activity' => $activity->getUuid(),\n 'type' => $activity->getType(),\n ]);\n\n if ($activity->getCrmType() === Activity::TYPE_CONFERENCE) {\n $crmActivity = $this->saveMeeting($activity);\n } elseif (in_array($activity->getType(), [Activity::TYPE_SOFTPHONE, Activity::TYPE_SOFTPHONE_INBOUND])) {\n $crmActivity = $this->saveCall($activity);\n } else {\n throw new CrmException('Unsupported activity type');\n }\n\n $crmActivityId = $crmActivity['id'] ?? null;\n\n if ($crmActivityId !== null) {\n $activity->crm_provider_id = $crmActivityId;\n $activity->save();\n\n $this->logger->info('[integration-app] Activity successfully logged to CRM', [\n 'activity' => $activity->getUuid(),\n 'type' => $activity->getType(),\n 'crmId' => $crmActivityId,\n ]);\n }\n\n return $activity;\n }\n\n public function saveMeeting(Activity $activity): array\n {\n $decorateActivity = app(DecorateActivity::class);\n\n $meetingPayload = [\n 'Event_Title' => $decorateActivity->generateTitle($activity),\n 'Start_DateTime' => $activity->getActualStartTime()->toIso8601String(),\n 'End_DateTime' => $activity->getActualEndTime()->toIso8601String(),\n 'ownerId' => $this->getActivityOwnerId($activity),\n ];\n\n $payload = array_merge($meetingPayload, $this->attachToProspect($activity));\n\n if ($activity->hasCrmProviderId()) {\n $crmId = $activity->getCrmProviderId();\n $meeting = $this->client->getMeeting($crmId);\n\n $oldDescription = $meeting['fields']['Description'] ?? null;\n $payload['Description'] = $decorateActivity->generateUpdatedDescription($oldDescription, $activity);\n\n $this->logger->info('[integration-app] CRM update meeting', [\n 'activity' => $activity->getUuid(),\n 'crm_id' => $crmId,\n 'payload' => $payload,\n ]);\n\n return $this->client->updateMeeting($crmId, $payload);\n }\n\n $payload['Description'] = $decorateActivity->generateDescription($activity);\n\n $this->logger->info('[integration-app] CRM log meeting', [\n 'activity' => $activity->getUuid(),\n 'payload' => $payload,\n ]);\n\n return $this->client->createMeeting($payload);\n }\n\n public function saveCall(Activity $activity): array\n {\n $decorateActivity = app(DecorateActivity::class);\n\n $callPayload = [\n 'Call_Type' => $this->getCallType($activity),\n 'Call_Start_Time' => $activity->getActualStartTime()->toIso8601String(),\n 'Call_Duration' => $activity->getDuration(),\n 'name' => $decorateActivity->generateTitle($activity),\n 'ownerId' => $this->getActivityOwnerId($activity),\n ];\n\n $payload = array_merge($callPayload, $this->attachToProspect($activity));\n\n if ($activity->hasCrmProviderId()) {\n $crmId = $activity->getCrmProviderId();\n $call = $this->client->getCall($crmId);\n\n $oldDescription = $call['fields']['Description'] ?? null;\n $payload['description'] = $decorateActivity->generateUpdatedDescription($oldDescription, $activity);\n\n $this->logger->info('[integration-app] CRM update call', [\n 'activity' => $activity->getUuid(),\n 'crm_id' => $crmId,\n 'payload' => $payload,\n ]);\n\n return $this->client->updateCall($crmId, $payload);\n }\n\n $payload['description'] = $decorateActivity->generateDescription($activity);\n\n $this->logger->info('[integration-app] CRM log call', [\n 'activity' => $activity->getUuid(),\n 'payload' => $payload,\n ]);\n\n return $this->client->createCall($payload);\n }\n\n private function getCallType(Activity $activity): string\n {\n if ($activity->getStatus() === Activity::STATUS_NO_ANSWER) {\n return self::CALL_TYPE_MISSED;\n }\n\n return $activity->getType() === Activity::TYPE_SOFTPHONE_INBOUND ? self::CALL_TYPE_INBOUND : self::CALL_TYPE_OUTBOUND;\n }\n\n private function attachToProspect(Activity $activity): array\n {\n $payload = [];\n\n if ($activity->hasContact()) {\n $payload['contactId'] = $activity->getContact()->getCrmProviderId();\n }\n\n if ($activity->hasOpportunity()) {\n return array_merge(\n $payload,\n $this->buildBasicPayload(\n self::RELATIONSHIP_OPPORTUNITY,\n $activity->getOpportunity()->getCrmProviderId()\n )\n );\n }\n\n if ($activity->hasAccount() && ! $activity->getAccount()->getIsInternal()) {\n return array_merge(\n $payload,\n $this->buildBasicPayload(\n self::RELATIONSHIP_ACCOUNT,\n $activity->getAccount()->getCrmProviderId()\n )\n );\n }\n\n if ($activity->hasLead()) {\n $payload = $this->handleLeadPayload($activity);\n }\n\n return $payload;\n }\n\n private function handleLeadPayload(Activity $activity): array\n {\n $freshLead = $this->syncLead($activity->getLead()->getCrmProviderId());\n $lead = $freshLead ?? $activity->getLead();\n\n if ($lead->getConvertedAt() === null) {\n return $this->buildBasicPayload(self::RELATIONSHIP_LEAD, $lead->getCrmProviderId());\n }\n\n $activity->lead_id = null;\n\n if ($lead->hasAccount()) {\n $account = $lead->getAccount();\n $activity->account_id = $account->getId();\n $payload = $this->buildBasicPayload(self::RELATIONSHIP_ACCOUNT, $account->getCrmProviderId());\n } else {\n $payload = [];\n }\n\n if ($lead->hasOpportunity()) {\n $opportunity = $lead->getOpportunity();\n $payload = $this->buildBasicPayload(self::RELATIONSHIP_OPPORTUNITY, $opportunity->getCrmProviderId());\n $activity->opportunity_id = $opportunity->getId();\n $activity->value = $opportunity->value;\n $activity->stage_id = $opportunity->stage_id;\n } else {\n $activity->stage_id = null;\n }\n\n if ($lead->hasContact()) {\n $contact = $lead->getContact();\n $payload['contactId'] = $contact->getCrmProviderId();\n $activity->contact_id = $contact->getId();\n }\n\n $activity->save();\n event(new ActivityLeadConverted($activity, $lead));\n\n $this->logger->info('[integration-app] Lead converted', [\n 'activityUuid' => $activity->getUuid(),\n 'leadUuid' => $lead->getUuid(),\n ]);\n\n return $payload;\n }\n\n private function buildBasicPayload(string $type, string $id): array\n {\n return [\n 'type' => $type,\n 'id' => $id,\n ];\n }\n private function getActivityOwnerId(Activity $activity): ?string\n {\n $ownerId = null;\n if ($activity->hasUser() && $activity->getUser()->getProfile() !== null) {\n $ownerId = $activity->getUser()->getProfile()->getCrmProviderId();\n }\n\n return $ownerId;\n }\n\n #[\\Override] public function saveFollowupActivity(Activity $activity, array $fields): ?string\n {\n $taskPayload = [\n 'subject' => $fields['subject'],\n 'dueTime' => isset($fields['dueDate']) ? Carbon::parse($fields['dueDate'])->format('Y-m-d') : null,\n 'ownerId' => $this->getActivityOwnerId($activity),\n ];\n\n if (isset($fields['status'])) {\n $taskPayload['status'] = $fields['status'];\n }\n\n if (isset($fields['priority'])) {\n $taskPayload['priority'] = $fields['priority'];\n }\n\n if (isset($fields['content'])) {\n $taskPayload['content'] = $fields['content'];\n }\n\n $payload = array_merge($taskPayload, $this->attachToProspect($activity));\n\n $this->logger->info('[integration-app] CRM log follow up task', [\n 'activity' => $activity->getUuid(),\n 'payload' => $payload,\n ]);\n\n $task = $this->client->createTask($payload);\n\n return $task['id'] ?? null;\n }\n\n #[\\Override] public function saveTranscriptionSummaryAsNote(\n ActivityContract $activity,\n string $title,\n string $body,\n ?string $objectId,\n ?NoteObject $noteObject = null,\n ): ?string {\n // We have to find a way to store the transcription summary\n // This might be possible either by Tasks, Events, Engagements & Notes\n // Find what the CRM supports and save the note with the appropriate object(eg Notes)\n\n // For now use only Notes as both ZOHO & Salesforce support them.\n if ($this->supportsNotes() && $objectId !== null) {\n $this->logger->info('[integration-app] saving note', [\n 'activityId' => $activity->getUuid(),\n 'objectId' => $objectId,\n ]);\n\n return $this->saveNote($title, $body, $objectId, $noteObject);\n }\n\n $this->logger->info('[integration-app] skip saveTranscriptionSummaryAsNote', [\n 'activityId' => $activity->getUuid(),\n 'supportsNotes' => $this->supportsNotes(),\n 'objectId' => $objectId,\n ]);\n\n return null;\n }\n\n public function generateProviderUrl(string $providerId, string $objectType): ?string\n {\n return $this->getCrmUrlGenerator()?->generateProviderUrl($providerId, $objectType);\n }\n\n public function updateStage($crmObject, Stage $stage): void\n {\n $objectType = $stage->getType();\n $objectId = $crmObject->getCrmProviderId();\n $params = ['stageName' => $stage->getCrmProviderId()];\n\n $this->logger->info('[integration-app] updateStage', [\n 'objectType' => $objectType,\n 'objectId' => $objectId,\n 'params' => $params,\n ]);\n\n $data = [\n 'data' => $this->normalizeData($objectType, $params),\n ];\n\n\n if ($objectType === Stage::TYPE_LEAD) {\n $this->client->updateLead($objectId, $data);\n } else {\n $this->client->updateDeal($objectId, $data);\n }\n }\n\n /**\n * @throws \\Exception\n */\n public function fetchAndAssociateRelatedActivity(Activity $activity): ?Activity\n {\n if ($activity->getCrm()?->getEdition() !== IntegrationAppProviders::ZOHO_CRM) {\n return null;\n }\n\n if (! $activity->isTypeConference()) {\n return null;\n }\n\n // The related activity is already linked.\n if ($activity->hasCrmProviderId()) {\n return $activity;\n }\n\n if ($activity->hasActualStartTime() === false) {\n return null;\n }\n\n return $this->fetchAndAssociateZohoRelatedActivity($activity);\n }\n\n public function fetchAndAssociateZohoRelatedActivity(Activity $activity): ?Activity\n {\n try {\n $meeting = $this->fetchRelatedZohoActivity($activity);\n if (empty($meeting)) {\n $this->logger->info('[integration-app] fetchRelatedZohoActivity No related activity found', [\n 'activity' => $activity->getUuid(),\n ]);\n\n return null;\n }\n\n $decorateActivity = app(DecorateActivity::class);\n $oldDescription = $meeting['Description'] ?? '';\n $updatedDescription = $decorateActivity->generateUpdatedDescription($oldDescription, $activity);\n\n $this->logger->info('[integration-app] fetchAndAssociateZohoRelatedActivity updating related activity', [\n 'activity' => $activity->getUuid(),\n 'description' => $updatedDescription,\n ]);\n\n $this->client->updateMeeting($meeting['id'], ['Description' => $updatedDescription]);\n\n // Update our activity to reflect the remote data.\n $activity->update([\n 'crm_provider_id' => $meeting['id'],\n 'summary' => $meeting['Description'],\n ]);\n\n return $activity;\n } catch (\\Exception $exception) {\n \\Sentry::captureException($exception);\n\n throw $exception;\n }\n }\n\n public function fetchRelatedZohoActivity(Activity $activity): array\n {\n [$from, $to] = $this->getFromToDates($activity);\n\n $start = $from?->toIso8601String(); // e.g., 2025-07-01T00:00:00+00:00\n $end = $to?->toIso8601String(); // e.g., 2025-07-14T23:59:59+00:00\n if ($start === null || $end === null) {\n $this->logger->info(\n '[integration-app] fetchRelatedZohoActivity missing start or end date',\n [\n 'activity' => $activity->getUuid(),\n 'start' => $start,\n 'end' => $end,\n 'from' => $from,\n 'to' => $to,\n ]\n );\n\n return [];\n }\n\n $whoId = null;\n $whatId = null;\n $criteriaParts = [];\n\n if ($activity->getContact()) {\n $whoId = $activity->getContact()->getCrmProviderId();\n $criteriaParts[] = \"(Who_Id:equals:$whoId)\";\n }\n\n if ($activity->getOpportunity()) {\n $whatId = $activity->getOpportunity()->getCrmProviderId();\n } elseif ($activity->getAccount() && $activity->getAccount()->getIsInternal() === false) {\n $whatId = $activity->getAccount()->getCrmProviderId();\n } elseif ($activity->getLead()) {\n $whatId = $activity->getLead()->getCrmProviderId();\n }\n\n if ($whatId !== null) {\n $criteriaParts[] = \"(What_Id:equals:$whatId)\";\n }\n\n if ($whoId === null && $whatId === null) {\n $this->logger->info(\n '[integration-app] fetchRelatedZohoActivity cannot find prospect',\n [\n 'activity' => $activity->getUuid(),\n ]\n );\n\n return [];\n }\n\n $criteriaParts[] = \"(Start_DateTime:greater_equal:$start)\";\n $criteriaParts[] = \"(End_DateTime:less_equal:$end)\";\n\n $criteria = implode(' AND ', $criteriaParts);\n\n $params = [\n 'criteria' => $criteria,\n 'sort_by' => 'Modified_Time',\n 'sort_order' => 'desc',\n ];\n\n $this->logger->info(\n '[integration-app] fetchRelatedZohoActivity searching for related activity',\n [\n 'activity' => $activity->getUuid(),\n 'params' => $params,\n ]\n );\n\n $meetings = $this->client->searchMeetings($params);\n if (! empty($meetings)) {\n return $meetings[0];\n }\n\n return [];\n }\n\n private function getFromToDates(Activity $activity): array\n {\n $calendarEvent = $activity->calendarEvent()->first();\n\n $from = $calendarEvent?->getStartTime();\n $to = $calendarEvent?->getEndTime();\n\n if (! $from || ! $to) {\n $from = $activity->hasScheduledStartTime()\n ? $activity->getScheduledStartTime()\n : $activity->getActualStartTime();\n\n $to = $activity->hasScheduledEndTime()\n ? $activity->getScheduledEndTime()->addMinutes(15)\n : $activity->getActualEndTime();\n }\n\n return [$from, $to];\n }\n}","depth":4,"on_screen":true,"value":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Services\\Crm\\IntegrationApp;\n\nuse Carbon\\Carbon;\nuse Jiminny\\Contracts\\Crm\\Providers;\nuse Jiminny\\Contracts\\Services\\Crm\\ClientInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\FetchRelatedActivityInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\ImportsBusinessProcessesInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\LayoutManagementInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\MatchCrmEntitiesInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\Provider\\IntegrationAppInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\RemoteEntityLookupInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\RemoteEntityManipulationInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\RemoteNoteEntityManipulationInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\SendSummaryToCrmInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\SettingsInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\SyncCrmEntitiesInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\SyncCrmMetadataInterface;\nuse Jiminny\\Events\\Activities\\Crm\\ActivityLeadConverted;\nuse Jiminny\\Exceptions\\CrmException;\nuse Jiminny\\Exceptions\\SocialAccountNotFoundException;\nuse Jiminny\\Jobs\\Crm\\NoteObject;\nuse Jiminny\\Models\\Account;\nuse Jiminny\\Models\\Activity;\nuse Jiminny\\Models\\Contracts\\ActivityContract;\nuse Jiminny\\Models\\Crm\\Configuration;\nuse Jiminny\\Models\\Opportunity;\nuse Jiminny\\Models\\Stage;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Services\\Crm\\BaseService;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\Config\\IntegrationAppProviders;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\Config\\IntegrationConfigFactory;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\DTO\\Mappers\\FieldMapperInterface;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\DTO\\Mappers\\LeadFieldMapper;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\DTO\\Utils\\GenerateProviderUrlInterface;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\DTO\\Utils\\IntegrationAppCrmGeneratorFactory;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\DTO\\Utils\\UrlGeneratorInterface;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\ServiceTraits\\SyncCrmFieldsTrait;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\ServiceTraits\\SystemStateTrait;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\ServiceTraits\\LayoutTrait;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\ServiceTraits\\MatchProspectsTrait;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\ServiceTraits\\NotSupportedTrait;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\ServiceTraits\\SyncCrmEntitiesTrait;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\ServiceTraits\\SyncCrmMetadataTrait;\nuse Psr\\Log\\LoggerInterface;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\DTO\\Mappers\\OpportunityFieldMapper;\nuse Jiminny\\Repositories\\Crm\\ProfileRepository;\nuse Jiminny\\Repositories\\Crm\\OpportunityRepository;\nuse Jiminny\\Models\\Crm\\Profile;\nuse Jiminny\\Services\\Crm\\CrmObjects\\CrmObjectsRepository;\n\nclass Service extends BaseService implements\n IntegrationAppInterface,\n SyncCrmEntitiesInterface,\n SyncCrmMetadataInterface,\n ImportsBusinessProcessesInterface,\n RemoteEntityManipulationInterface,\n LayoutManagementInterface,\n SettingsInterface,\n MatchCrmEntitiesInterface,\n RemoteEntityLookupInterface,\n RemoteNoteEntityManipulationInterface,\n SendSummaryToCrmInterface,\n UrlGeneratorInterface,\n FetchRelatedActivityInterface\n{\n use SyncCrmMetadataTrait;\n use SyncCrmEntitiesTrait;\n use SystemStateTrait;\n use LayoutTrait;\n use NotSupportedTrait;\n use MatchProspectsTrait;\n use SyncCrmFieldsTrait;\n\n public const string CALL_TYPE_MISSED = 'Missed';\n public const string CALL_TYPE_INBOUND = 'Inbound';\n public const string CALL_TYPE_OUTBOUND = 'Outbound';\n public const string RELATIONSHIP_OPPORTUNITY = 'Deals';\n public const string RELATIONSHIP_LEAD = 'Leads';\n public const string RELATIONSHIP_ACCOUNT = 'Accounts';\n\n /**\n * @var ClientInterface&DataClient\n */\n protected $client;\n\n protected ?User $invokedUser = null;\n\n protected ?GenerateProviderUrlInterface $crmUrlGenerator = null;\n\n public function __construct(\n DataClient $client,\n LoggerInterface $logger,\n ) {\n parent::__construct();\n $this->client = $client;\n $this->logger = $logger;\n }\n\n public function getDisplayName(): string\n {\n return Providers::getProviderDisplayName(\n Providers::getCrmIntegrationSlug($this->config)\n );\n }\n\n /**\n * @throws \\Exception\n */\n public function setUser(User $user): void\n {\n $this->configureSentryScope($user);\n $this->invokedUser = $user;\n\n $this->team = $user->getTeam();\n $teamOwner = $this->team->getOwner();\n\n $this->setConfiguration($user->getTeam()->getCrmConfiguration());\n $this->setEditionConfiguration(Providers::getCrmIntegrationSlug($this->config));\n $this->setCrmUrlGenerator($this->config);\n\n $this->client->setTeam($this->team);\n $socialAccount = $teamOwner?->getSocialAccount('integration-app');\n if ($socialAccount === null) {\n $this->logger->info('[integration-app] Social account not found', [\n 'teamId' => $this->team->getId(),\n 'teamOwnerId' => $teamOwner?->getId(),\n 'userId' => $user->getId(),\n ]);\n\n throw new SocialAccountNotFoundException('Social account not found!');\n }\n $this->client->setSocialAccount($socialAccount);\n\n // The CRM Service is properly bootstrapped, and supports remote operations\n $this->connect();\n }\n\n public function normalizeValue(string $fieldType, string $fieldValue, bool $internal = false): string\n {\n return $fieldValue;\n }\n\n public function find(string $name, array $scopes): array\n {\n /** @var LocalSearch $localSearch */\n $localSearch = app(LocalSearch::class);\n $localSearch->setConfiguration($this->config);\n $localSearch->setCountryCode($this->invokedUser->getCountryCode());\n\n return $localSearch->search($name);\n\n // if (! empty($localMatch)) {\n // return $localMatch;\n // }\n //\n // /** @var RemoteSearch $remoteSearch */\n // $remoteSearch = app(RemoteSearch::class);\n // $remoteSearch->setClient($this->client);\n // $remoteSearch->setConfiguration($this->config);\n //\n // return $remoteSearch->search($name);\n }\n\n public function findOpportunities(?string $crmAccountId, ?string $crmContactId, ?int $userId = null): array\n {\n $data = [];\n $ownerData = [];\n\n $account = $this->getAccount($crmAccountId, $crmContactId);\n if ($account === null) {\n return [];\n }\n\n $ownerId = $this->getOwnerId($userId);\n\n try {\n $opportunityRepository = app(OpportunityRepository::class);\n $opportunities = $opportunityRepository->findAllByConfigurationAndAccountId(\n $this->config,\n $account->getId()\n );\n\n foreach ($opportunities as $opportunity) {\n /** @var Opportunity $opportunity */\n $record = $this->buildOpportunityData($opportunity);\n\n if ($ownerId && $opportunity->getOwnerId() === $ownerId) {\n $ownerData[] = $record;\n }\n\n $data[] = $record;\n }\n\n if (! empty($ownerData)) {\n return $ownerData;\n }\n\n return $data;\n } catch (\\Exception $e) {\n $this->logger->info('[integration-app] Failed to fetch opportunities', [\n 'contact' => $crmContactId,\n 'account' => $crmAccountId,\n 'owner' => $ownerId,\n 'error' => $e->getMessage(),\n ]);\n\n return $data;\n }\n }\n\n private function getOwnerId(?int $userId = null): ?string\n {\n if (! $userId) {\n return null;\n }\n\n $profileRepository = app(ProfileRepository::class);\n $profile = $profileRepository->findProfileByUserId($this->config, $userId);\n\n return $profile instanceof Profile ? $profile->getCrmProviderId() : null;\n }\n\n private function getAccount(?string $crmAccountId = null, ?string $crmContactId = null): ?Account\n {\n $crmRepository = app(CrmObjectsRepository::class);\n\n if ($crmAccountId === null) {\n $contact = $crmRepository->findContactByCrmProviderId($this->config, $crmContactId);\n\n return $contact->getAccount();\n }\n\n return $crmRepository->findAccountByCrmProviderId($this->config, $crmAccountId);\n }\n\n private function buildOpportunityData(Opportunity $opportunity): array\n {\n $record = [\n 'crmId' => $opportunity->getCrmProviderId(),\n 'name' => $opportunity->getName(),\n 'won' => $opportunity->isWon(),\n 'closed' => $opportunity->isClosed(),\n ];\n\n if (! empty($opportunity->getFormattedValueAttribute())) {\n $record['value'] = $opportunity->getFormattedValueAttribute();\n }\n\n if (! empty($opportunity->getStage())) {\n $record['stage'] = [\n 'id' => $opportunity->getStage()->getUuid(),\n 'name' => $opportunity->getStage()->getName(),\n ];\n }\n\n return $record;\n }\n\n public function updateRecord(string $objectType, string $objectId, array $data, array $headers = []): void\n {\n $data = [\n 'data' => $this->normalizeData($objectType, $data),\n ];\n\n $this->client->updateRecordById($objectType, $objectId, $data);\n }\n\n private function normalizeData(string $objectType, array $data): array\n {\n $fieldMapper = $this->getFieldMapper($objectType);\n\n if (! $fieldMapper instanceof FieldMapperInterface) {\n return $data;\n }\n\n return $fieldMapper->mapToCrmFields($data);\n }\n\n private function getFieldMapper(string $objectType): ?FieldMapperInterface\n {\n if ($objectType === self::OBJECT_OPPORTUNITY) {\n return app(OpportunityFieldMapper::class);\n }\n\n if ($objectType === self::OBJECT_LEAD) {\n return app(LeadFieldMapper::class);\n }\n\n return null;\n }\n\n public function getRecord(string $objectType, string $objectId, array $fields = []): array\n {\n return $this->client->getRecordById($objectType, $objectId);\n }\n\n public function getConfiguration(): Configuration\n {\n return $this->config;\n }\n\n public function setConfiguration(Configuration $config): void\n {\n $this->clearExternalMapCache();\n\n $this->config = $config;\n }\n\n private function setEditionConfiguration(string $provider): void\n {\n $this->editionConfig = app(IntegrationConfigFactory::class)->create($provider);\n }\n\n public function setCrmUrlGenerator(Configuration $config): void\n {\n $this->crmUrlGenerator = app(IntegrationAppCrmGeneratorFactory::class)->create($config);\n }\n\n public function getCrmUrlGenerator(): ?GenerateProviderUrlInterface\n {\n if ($this->crmUrlGenerator === null) {\n $this->setCrmUrlGenerator($this->config);\n }\n\n return $this->crmUrlGenerator;\n }\n\n public function subscribeEntityEvents(bool $enableTrigger = true): void\n {\n $eventStates = $this->client->updateEntityEventsState($enableTrigger);\n\n $this->logger->info('[integration-app] Change team entity events subscription', [\n 'teamId' => $this->team->getId(),\n 'teamName' => $this->team->getName(),\n 'states' => $eventStates,\n 'action' => $enableTrigger ? 'subscribe' : 'unsubscribe',\n ]);\n }\n\n #[\\Override] public function supportsNotes(): bool\n {\n return $this->editionConfig->supportsNotes();\n }\n\n #[\\Override] public function saveNote(\n string $title,\n string $body,\n string $objectId,\n ?NoteObject $noteObject = null,\n ): ?string {\n if ($noteObject === null) {\n return null;\n }\n\n $notePayload = [\n 'title' => $title,\n 'content' => $body,\n 'objectId' => $objectId,\n 'objectType' => $noteObject->value,\n ];\n\n $result = $this->client->createNote($notePayload);\n\n // debug saving note response\n $this->logger->info('[integration-app] createNote response', [\n 'objectId' => $objectId,\n 'objectType' => $noteObject->value,\n 'result' => $result,\n 'hasId' => isset($result['id']),\n ]);\n\n return $result['id'] ?? null;\n }\n\n /**\n * @throws CrmException\n */\n #[\\Override] public function saveActivity(Activity $activity): Activity\n {\n $this->logger->info('[integration-app] saveActivity', [\n 'activity' => $activity->getUuid(),\n 'type' => $activity->getType(),\n ]);\n\n if ($activity->getCrmType() === Activity::TYPE_CONFERENCE) {\n $crmActivity = $this->saveMeeting($activity);\n } elseif (in_array($activity->getType(), [Activity::TYPE_SOFTPHONE, Activity::TYPE_SOFTPHONE_INBOUND])) {\n $crmActivity = $this->saveCall($activity);\n } else {\n throw new CrmException('Unsupported activity type');\n }\n\n $crmActivityId = $crmActivity['id'] ?? null;\n\n if ($crmActivityId !== null) {\n $activity->crm_provider_id = $crmActivityId;\n $activity->save();\n\n $this->logger->info('[integration-app] Activity successfully logged to CRM', [\n 'activity' => $activity->getUuid(),\n 'type' => $activity->getType(),\n 'crmId' => $crmActivityId,\n ]);\n }\n\n return $activity;\n }\n\n public function saveMeeting(Activity $activity): array\n {\n $decorateActivity = app(DecorateActivity::class);\n\n $meetingPayload = [\n 'Event_Title' => $decorateActivity->generateTitle($activity),\n 'Start_DateTime' => $activity->getActualStartTime()->toIso8601String(),\n 'End_DateTime' => $activity->getActualEndTime()->toIso8601String(),\n 'ownerId' => $this->getActivityOwnerId($activity),\n ];\n\n $payload = array_merge($meetingPayload, $this->attachToProspect($activity));\n\n if ($activity->hasCrmProviderId()) {\n $crmId = $activity->getCrmProviderId();\n $meeting = $this->client->getMeeting($crmId);\n\n $oldDescription = $meeting['fields']['Description'] ?? null;\n $payload['Description'] = $decorateActivity->generateUpdatedDescription($oldDescription, $activity);\n\n $this->logger->info('[integration-app] CRM update meeting', [\n 'activity' => $activity->getUuid(),\n 'crm_id' => $crmId,\n 'payload' => $payload,\n ]);\n\n return $this->client->updateMeeting($crmId, $payload);\n }\n\n $payload['Description'] = $decorateActivity->generateDescription($activity);\n\n $this->logger->info('[integration-app] CRM log meeting', [\n 'activity' => $activity->getUuid(),\n 'payload' => $payload,\n ]);\n\n return $this->client->createMeeting($payload);\n }\n\n public function saveCall(Activity $activity): array\n {\n $decorateActivity = app(DecorateActivity::class);\n\n $callPayload = [\n 'Call_Type' => $this->getCallType($activity),\n 'Call_Start_Time' => $activity->getActualStartTime()->toIso8601String(),\n 'Call_Duration' => $activity->getDuration(),\n 'name' => $decorateActivity->generateTitle($activity),\n 'ownerId' => $this->getActivityOwnerId($activity),\n ];\n\n $payload = array_merge($callPayload, $this->attachToProspect($activity));\n\n if ($activity->hasCrmProviderId()) {\n $crmId = $activity->getCrmProviderId();\n $call = $this->client->getCall($crmId);\n\n $oldDescription = $call['fields']['Description'] ?? null;\n $payload['description'] = $decorateActivity->generateUpdatedDescription($oldDescription, $activity);\n\n $this->logger->info('[integration-app] CRM update call', [\n 'activity' => $activity->getUuid(),\n 'crm_id' => $crmId,\n 'payload' => $payload,\n ]);\n\n return $this->client->updateCall($crmId, $payload);\n }\n\n $payload['description'] = $decorateActivity->generateDescription($activity);\n\n $this->logger->info('[integration-app] CRM log call', [\n 'activity' => $activity->getUuid(),\n 'payload' => $payload,\n ]);\n\n return $this->client->createCall($payload);\n }\n\n private function getCallType(Activity $activity): string\n {\n if ($activity->getStatus() === Activity::STATUS_NO_ANSWER) {\n return self::CALL_TYPE_MISSED;\n }\n\n return $activity->getType() === Activity::TYPE_SOFTPHONE_INBOUND ? self::CALL_TYPE_INBOUND : self::CALL_TYPE_OUTBOUND;\n }\n\n private function attachToProspect(Activity $activity): array\n {\n $payload = [];\n\n if ($activity->hasContact()) {\n $payload['contactId'] = $activity->getContact()->getCrmProviderId();\n }\n\n if ($activity->hasOpportunity()) {\n return array_merge(\n $payload,\n $this->buildBasicPayload(\n self::RELATIONSHIP_OPPORTUNITY,\n $activity->getOpportunity()->getCrmProviderId()\n )\n );\n }\n\n if ($activity->hasAccount() && ! $activity->getAccount()->getIsInternal()) {\n return array_merge(\n $payload,\n $this->buildBasicPayload(\n self::RELATIONSHIP_ACCOUNT,\n $activity->getAccount()->getCrmProviderId()\n )\n );\n }\n\n if ($activity->hasLead()) {\n $payload = $this->handleLeadPayload($activity);\n }\n\n return $payload;\n }\n\n private function handleLeadPayload(Activity $activity): array\n {\n $freshLead = $this->syncLead($activity->getLead()->getCrmProviderId());\n $lead = $freshLead ?? $activity->getLead();\n\n if ($lead->getConvertedAt() === null) {\n return $this->buildBasicPayload(self::RELATIONSHIP_LEAD, $lead->getCrmProviderId());\n }\n\n $activity->lead_id = null;\n\n if ($lead->hasAccount()) {\n $account = $lead->getAccount();\n $activity->account_id = $account->getId();\n $payload = $this->buildBasicPayload(self::RELATIONSHIP_ACCOUNT, $account->getCrmProviderId());\n } else {\n $payload = [];\n }\n\n if ($lead->hasOpportunity()) {\n $opportunity = $lead->getOpportunity();\n $payload = $this->buildBasicPayload(self::RELATIONSHIP_OPPORTUNITY, $opportunity->getCrmProviderId());\n $activity->opportunity_id = $opportunity->getId();\n $activity->value = $opportunity->value;\n $activity->stage_id = $opportunity->stage_id;\n } else {\n $activity->stage_id = null;\n }\n\n if ($lead->hasContact()) {\n $contact = $lead->getContact();\n $payload['contactId'] = $contact->getCrmProviderId();\n $activity->contact_id = $contact->getId();\n }\n\n $activity->save();\n event(new ActivityLeadConverted($activity, $lead));\n\n $this->logger->info('[integration-app] Lead converted', [\n 'activityUuid' => $activity->getUuid(),\n 'leadUuid' => $lead->getUuid(),\n ]);\n\n return $payload;\n }\n\n private function buildBasicPayload(string $type, string $id): array\n {\n return [\n 'type' => $type,\n 'id' => $id,\n ];\n }\n private function getActivityOwnerId(Activity $activity): ?string\n {\n $ownerId = null;\n if ($activity->hasUser() && $activity->getUser()->getProfile() !== null) {\n $ownerId = $activity->getUser()->getProfile()->getCrmProviderId();\n }\n\n return $ownerId;\n }\n\n #[\\Override] public function saveFollowupActivity(Activity $activity, array $fields): ?string\n {\n $taskPayload = [\n 'subject' => $fields['subject'],\n 'dueTime' => isset($fields['dueDate']) ? Carbon::parse($fields['dueDate'])->format('Y-m-d') : null,\n 'ownerId' => $this->getActivityOwnerId($activity),\n ];\n\n if (isset($fields['status'])) {\n $taskPayload['status'] = $fields['status'];\n }\n\n if (isset($fields['priority'])) {\n $taskPayload['priority'] = $fields['priority'];\n }\n\n if (isset($fields['content'])) {\n $taskPayload['content'] = $fields['content'];\n }\n\n $payload = array_merge($taskPayload, $this->attachToProspect($activity));\n\n $this->logger->info('[integration-app] CRM log follow up task', [\n 'activity' => $activity->getUuid(),\n 'payload' => $payload,\n ]);\n\n $task = $this->client->createTask($payload);\n\n return $task['id'] ?? null;\n }\n\n #[\\Override] public function saveTranscriptionSummaryAsNote(\n ActivityContract $activity,\n string $title,\n string $body,\n ?string $objectId,\n ?NoteObject $noteObject = null,\n ): ?string {\n // We have to find a way to store the transcription summary\n // This might be possible either by Tasks, Events, Engagements & Notes\n // Find what the CRM supports and save the note with the appropriate object(eg Notes)\n\n // For now use only Notes as both ZOHO & Salesforce support them.\n if ($this->supportsNotes() && $objectId !== null) {\n $this->logger->info('[integration-app] saving note', [\n 'activityId' => $activity->getUuid(),\n 'objectId' => $objectId,\n ]);\n\n return $this->saveNote($title, $body, $objectId, $noteObject);\n }\n\n $this->logger->info('[integration-app] skip saveTranscriptionSummaryAsNote', [\n 'activityId' => $activity->getUuid(),\n 'supportsNotes' => $this->supportsNotes(),\n 'objectId' => $objectId,\n ]);\n\n return null;\n }\n\n public function generateProviderUrl(string $providerId, string $objectType): ?string\n {\n return $this->getCrmUrlGenerator()?->generateProviderUrl($providerId, $objectType);\n }\n\n public function updateStage($crmObject, Stage $stage): void\n {\n $objectType = $stage->getType();\n $objectId = $crmObject->getCrmProviderId();\n $params = ['stageName' => $stage->getCrmProviderId()];\n\n $this->logger->info('[integration-app] updateStage', [\n 'objectType' => $objectType,\n 'objectId' => $objectId,\n 'params' => $params,\n ]);\n\n $data = [\n 'data' => $this->normalizeData($objectType, $params),\n ];\n\n\n if ($objectType === Stage::TYPE_LEAD) {\n $this->client->updateLead($objectId, $data);\n } else {\n $this->client->updateDeal($objectId, $data);\n }\n }\n\n /**\n * @throws \\Exception\n */\n public function fetchAndAssociateRelatedActivity(Activity $activity): ?Activity\n {\n if ($activity->getCrm()?->getEdition() !== IntegrationAppProviders::ZOHO_CRM) {\n return null;\n }\n\n if (! $activity->isTypeConference()) {\n return null;\n }\n\n // The related activity is already linked.\n if ($activity->hasCrmProviderId()) {\n return $activity;\n }\n\n if ($activity->hasActualStartTime() === false) {\n return null;\n }\n\n return $this->fetchAndAssociateZohoRelatedActivity($activity);\n }\n\n public function fetchAndAssociateZohoRelatedActivity(Activity $activity): ?Activity\n {\n try {\n $meeting = $this->fetchRelatedZohoActivity($activity);\n if (empty($meeting)) {\n $this->logger->info('[integration-app] fetchRelatedZohoActivity No related activity found', [\n 'activity' => $activity->getUuid(),\n ]);\n\n return null;\n }\n\n $decorateActivity = app(DecorateActivity::class);\n $oldDescription = $meeting['Description'] ?? '';\n $updatedDescription = $decorateActivity->generateUpdatedDescription($oldDescription, $activity);\n\n $this->logger->info('[integration-app] fetchAndAssociateZohoRelatedActivity updating related activity', [\n 'activity' => $activity->getUuid(),\n 'description' => $updatedDescription,\n ]);\n\n $this->client->updateMeeting($meeting['id'], ['Description' => $updatedDescription]);\n\n // Update our activity to reflect the remote data.\n $activity->update([\n 'crm_provider_id' => $meeting['id'],\n 'summary' => $meeting['Description'],\n ]);\n\n return $activity;\n } catch (\\Exception $exception) {\n \\Sentry::captureException($exception);\n\n throw $exception;\n }\n }\n\n public function fetchRelatedZohoActivity(Activity $activity): array\n {\n [$from, $to] = $this->getFromToDates($activity);\n\n $start = $from?->toIso8601String(); // e.g., 2025-07-01T00:00:00+00:00\n $end = $to?->toIso8601String(); // e.g., 2025-07-14T23:59:59+00:00\n if ($start === null || $end === null) {\n $this->logger->info(\n '[integration-app] fetchRelatedZohoActivity missing start or end date',\n [\n 'activity' => $activity->getUuid(),\n 'start' => $start,\n 'end' => $end,\n 'from' => $from,\n 'to' => $to,\n ]\n );\n\n return [];\n }\n\n $whoId = null;\n $whatId = null;\n $criteriaParts = [];\n\n if ($activity->getContact()) {\n $whoId = $activity->getContact()->getCrmProviderId();\n $criteriaParts[] = \"(Who_Id:equals:$whoId)\";\n }\n\n if ($activity->getOpportunity()) {\n $whatId = $activity->getOpportunity()->getCrmProviderId();\n } elseif ($activity->getAccount() && $activity->getAccount()->getIsInternal() === false) {\n $whatId = $activity->getAccount()->getCrmProviderId();\n } elseif ($activity->getLead()) {\n $whatId = $activity->getLead()->getCrmProviderId();\n }\n\n if ($whatId !== null) {\n $criteriaParts[] = \"(What_Id:equals:$whatId)\";\n }\n\n if ($whoId === null && $whatId === null) {\n $this->logger->info(\n '[integration-app] fetchRelatedZohoActivity cannot find prospect',\n [\n 'activity' => $activity->getUuid(),\n ]\n );\n\n return [];\n }\n\n $criteriaParts[] = \"(Start_DateTime:greater_equal:$start)\";\n $criteriaParts[] = \"(End_DateTime:less_equal:$end)\";\n\n $criteria = implode(' AND ', $criteriaParts);\n\n $params = [\n 'criteria' => $criteria,\n 'sort_by' => 'Modified_Time',\n 'sort_order' => 'desc',\n ];\n\n $this->logger->info(\n '[integration-app] fetchRelatedZohoActivity searching for related activity',\n [\n 'activity' => $activity->getUuid(),\n 'params' => $params,\n ]\n );\n\n $meetings = $this->client->searchMeetings($params);\n if (! empty($meetings)) {\n return $meetings[0];\n }\n\n return [];\n }\n\n private function getFromToDates(Activity $activity): array\n {\n $calendarEvent = $activity->calendarEvent()->first();\n\n $from = $calendarEvent?->getStartTime();\n $to = $calendarEvent?->getEndTime();\n\n if (! $from || ! $to) {\n $from = $activity->hasScheduledStartTime()\n ? $activity->getScheduledStartTime()\n : $activity->getActualStartTime();\n\n $to = $activity->hasScheduledEndTime()\n ? $activity->getScheduledEndTime()->addMinutes(15)\n : $activity->getActualEndTime();\n }\n\n return [$from, $to];\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,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Explain Plan","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Browse Query History","depth":4,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"View Parameters","depth":4,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Open Query Execution Settings…","depth":4,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"In-Editor Results","depth":4,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Tx: Auto","depth":4,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Cancel Running Statements","depth":4,"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Playground","depth":4,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"jiminny","depth":4,"on_screen":true,"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},"on_screen":false,"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},"on_screen":false,"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},"on_screen":false,"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},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"8","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"1","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"3","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"4","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"SELECT\n# DISTINCT\nopp.id as opp_id, opp.uuid, opp.name,\n# COUNT(dr.id) AS deal_risk_count,\n\n# dr.id,\n# cfd.value,\nusr.name AS owner_name,\nopp.value, opp.currency_code, opp.close_date, opp.remotely_created_at, opp.is_closed, opp.is_won,\nusr.uuid as owner_uuid,\nusr.photo_path as owner_photo,\nusr.id AS owner_id,\njt.name as owner_job,\nopp.stage_id, opp.stage_updated_at,\nacc.name AS acc_name, opp.stage_updated_at, acc.crm_provider_id AS acc_provider_id, opp.crm_provider_id AS opp_provider_id,\nrt.business_process_id AS pipeline_id\nFROM opportunities opp\nLEFT JOIN record_types rt ON opp.record_type_id = rt.id\nLEFT JOIN users usr ON opp.user_id = usr.id\nLEFT JOIN accounts acc ON opp.account_id = acc.id\nLEFT JOIN job_titles jt ON usr.job_title_id = jt.id\n\n# LEFT JOIN group_deal_risk_types gdrt ON gdrt.group_id = usr.group_id\n# LEFT JOIN deal_risks dr ON dr.opportunity_id = opp.id AND dr.group_deal_risk_type_id = gdrt.id\n\nLEFT JOIN crm_field_data cfd ON (cfd.object_id = opp.id and cfd.crm_field_id = 66814)\n\nWHERE opp.user_id IS NOT NULL\nAND opp.deleted_at IS NULL\nAND opp.is_closed = 1\nAND opp.is_won = 0\nAND opp.close_date >= '2024-01-01 00:00:00'\nAND opp.close_date <= '2024-12-31 23:59:59'\nAND usr.team_id = 1\n\n# and opp.id = 4823179\n\nGROUP BY opp.id, cfd.value\nORDER BY\n# cfd.value\n CAST(cfd.value AS UNSIGNED)\n# owner_name\n# (SELECT COUNT(dr.id)\n# FROM deal_risks dr\n# JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id\n# WHERE dr.opportunity_id = opp.id\n# AND dr.is_active = 1\n# AND gdrt.is_enabled = 1)\nDESC\nLIMIT 25\n# OFFSET 0\n;\n\nselect * from crm_fields where crm_configuration_id = 1 and object_type = 'opportunity';\nselect * from crm_layout_entities where crm_layout_id = 1493;\n\nSELECT * FROM opportunities WHERE id = 4584045;\nSELECT * FROM crm_field_data WHERE object_id = 4584045;\n\nSELECT * FROM opportunities where team_id = 1 and crm_provider_id = '0061K00000lfb9IQAQ'\n\nSELECT\n opp.id as opportunity_id,\n opp.name,\n COUNT(dr.id) as risk_count\nFROM opportunities opp\nLEFT JOIN deal_risks dr ON dr.opportunity_id = opp.id\nWHERE opp.id IN (\n 6069574,8900938,9507638,9524799,9660490,9662824,9705675,9749758,4158460,4391812,6450439,4448422,5118945,5590675,4584045,7228149,9002408,9165534,9446720,9641778,9665149,9703344,9709280,5747948,4158491,6182565,6263970,5798120,5111315,4536978,6062352,6548383,6072095,6548225,4480986,5011422,6548381,8760540,8917554,9509986,9514392,9569009,9569011,9578490,9713604,5784397,7276612,7288405,8994421,9118219,9608148,9818911,4510535,6479693,5958049,6271674,6550448,4158331,4158483,6126571,6171615,6540943,4897466,5190896,5796182,5932762,8572433,8723698,8892697,9711001,9789264,4549188,6100831,6170064,6260799,6263653,6449936,6530871,6538978,7777651,8059269,8319918,8787049,8901150,9263153,9453207,9514738,9696700,9791062,5752018,6421452,7439134,7878923,9354763,9369285,9514396,9582506,9889949,9890216,4094311,4158495,4158496,6098128,5585661,3872564,6442149,5891604,6164746,6199593,6583474,6519684,9018490,9809006,4496897,5041324,5829430,6198319,6253504,6555763,7242914,7931055,8024125,8797814,8058559,8673347,8892695,8994420,9616219,9714970,9722004,9809439,9818918,6523177,8134147,9002915,9711422,9892713,9901719,9954210,9978435,5800810,6243518,6416114,6222251,6411974,6512456,5791953,6545606,9914780,5805540,6238986,6463838,6547680,9767049,9809437,9810885,9890855,6673493,9902036,4335521,6379871,6503799,6546077,8018765,9907556,9958433,9905855,9916179,9946741,9957877,5563344,6271838,6450815,7641128,7762567,7780592,8684810,8685786,8685787,8685788\n)\nGROUP BY opp.id;\n\nSELECT COUNT(dr.id)\n FROM deal_risks dr\n JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id\n WHERE dr.opportunity_id = 5563344\n# AND gdrt.group_id = usr.group_id\n\n\n\nEXPLAIN SELECT\n opp.id as opp_id, opp.uuid, opp.name,\n\ncfd.value,\ncfv.sequence,\ncfv.value,\n# MAX(cfd.value) AS max_cfd_value,\nusr.name AS owner_name,\nopp.value, opp.currency_code, opp.close_date, opp.remotely_created_at, opp.is_closed, opp.is_won,\nusr.uuid as owner_uuid,\nusr.photo_path as owner_photo,\nusr.id AS owner_id,\njt.name as owner_job,\nopp.stage_id, opp.stage_updated_at,\nacc.name AS acc_name, opp.stage_updated_at, acc.crm_provider_id AS acc_provider_id, opp.crm_provider_id AS opp_provider_id,\nrt.business_process_id AS pipeline_id\nFROM opportunities opp\n\nLEFT JOIN record_types rt ON opp.record_type_id = rt.id\nLEFT JOIN users usr ON opp.user_id = usr.id\nLEFT JOIN accounts acc ON opp.account_id = acc.id\nLEFT JOIN job_titles jt ON usr.job_title_id = jt.id\n\nLEFT JOIN crm_field_data cfd ON cfd.id = (SELECT sub_cfd.id\n FROM crm_field_data sub_cfd\n WHERE sub_cfd.object_id = opp.id\n AND sub_cfd.crm_field_id = 66810\n ORDER BY sub_cfd.updated_at DESC\n LIMIT 1)\n\nLEFT JOIN crm_field_values cfv ON cfv.crm_field_id = 66810 AND cfv.value = cfd.value\n\nWHERE opp.user_id IS NOT NULL\nAND opp.deleted_at IS NULL\nAND opp.is_closed = 0\n# AND opp.is_closed = 1\n# AND opp.is_won = 0\nAND opp.close_date >= '2024-01-01 00:00:00'\nAND opp.close_date <= '2024-12-31 23:59:59'\nAND usr.team_id = 1\n\n# and opp.id = 4823179\n\n# GROUP BY opp.id\nORDER BY\n cfv.sequence DESC,\n# opp.name\n# owner_name\n cfd.value\n# CAST(cfd.value AS UNSIGNED)\n# CAST(MAX(cfd.value) AS UNSIGNED)\n# (SELECT COUNT(dr.id)\n# FROM deal_risks dr\n# JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id\n# WHERE dr.opportunity_id = opp.id\n# AND dr.is_active = 1 AND gdrt.is_enabled = 1)\nDESC\n# LIMIT 75, 25\n;\n\n\n\nSELECT * FROM crm_field_values WHERE crm_field_id = 66810;\n\nSELECT f.id, f.crm_provider_id AS field_name, f.label, fd.object_id AS dealId, fd.value, fd.updated_at, fd.id, fd.created_at\nFROM crm_fields f\nINNER JOIN crm_field_data fd ON fd.crm_field_id = f.id\n WHERE (f.crm_configuration_id = 1)\n AND (f.object_type = 'opportunity')\n# AND (fd.object_id IN (4158331,4158483,4158495,4158496,6069574,6263970,6171615,6540943,6545606,5829430,6198319,6263653,6548381,7242914,8797814,7228149,7439134,7878923,8134147,9002915,9118219,9165534,9354763,9369285,9446720))\n AND (fd.object_id IN (4158460))\n AND (f.crm_provider_id IN ('ForecastCategoryName'))\n ORDER BY fd.object_id ASC, fd.updated_at DESC;\n\nselect * from crm_layouts where crm_configuration_id = 1;\nselect cf.* from crm_fields cf\njoin crm_layout_entities cle on cf.id = cle.crm_field_id\nwhere crm_layout_id = 1493;\n\nSELECT * FROM opportunities WHERE id = 4158460;\nSELECT * FROM crm_field_data WHERE object_id = 4158460;\n\nselect * from users where team_id = 1;\nSELECT * FROM users WHERE id = 7160;\nselect * from role_user where user_id = 3248;\n\nselect * from crm_field_values where crm_field_id = 66824;\n\nSELECT * FROM users WHERE id = 23470;\nselect * from crm_configurations;\n\n# ******************************************\nselect * from teams where id = 1038; # 23521, 966\nselect * from users where team_id = 1038;\nselect * from crm_configurations where id = 966;\nSELECT * FROM activities WHERE uuid_to_bin('e8dc7c34-31f6-4430-bd81-2d9d8f00dd07') = uuid; # 54965762\nSELECT * FROM activities WHERE uuid_to_bin('4b5727c0-69d1-428f-b8d9-b649055166e2') = uuid; # 54965764\nSELECT * FROM participants WHERE activity_id = 54965764;\n\nSELECT id, uuid, title, recording_state FROM activities WHERE uuid_to_bin('355f105d-5606-4379-b0c5-d91daf59f4ce') = uuid; # 54964075\nSELECT * FROM participants WHERE activity_id = 54964075;\nselect f.id, slug, title, tf.team_id from team_features tf JOIN features f on tf.feature_id = f.id\n where tf.team_id = 1038;\n\n\n# ****************************************** PD *************************\nselect * from teams where id = 1029;\nSELECT * FROM crm_configurations WHERE id = 957;\nSELECT * FROM activities WHERE uuid_to_bin('581a33cb-4343-44bd-ac0c-4a5cee71c5ec') = uuid; # 54963423\nSELECT * FROM activities WHERE uuid_to_bin('07238011-25fa-418e-838b-fb21e82b9ea2') = uuid; # 54963433\n\nSELECT * FROM activities WHERE uuid_to_bin('8b6bb2f7-e7a7-4aec-8806-fbfea7093ccd') = uuid; # 54963421\n\n# ****************************************** Close *************************\nselect * from teams where id = 1031;\nSELECT * FROM crm_configurations WHERE id = 959;\nSELECT * FROM activities WHERE uuid_to_bin('59c517e0-96c9-4dad-bfeb-b7bef72f8725') = uuid; # 54963517\n\n\nSELECT * FROM activities WHERE uuid_to_bin('07238011-25fa-418e-838b-fb21e82b9ea2') = uuid; # 54963433\n\nSELECT * FROM activities WHERE uuid_to_bin('d68311e3-ac34-49bd-bf04-88323a7e5352') = uuid; # 54966009\n\n# ****************************************** SF *************************\nSELECT * FROM activities WHERE uuid_to_bin('2bd4cfa3-4eb5-4c77-84a7-9ed46a21c988') = uuid;\n\nselect * from roles;\nselect * from permissions;\nselect * from permission_role where permission_id = 136;\n\nselect * from migrations order by id desc;\n\nselect * from teams where id IN (1, 1037);\nselect * from crm_layouts where crm_configuration_id = 1;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1493;\nSELECT * FROM crm_fields WHERE id IN (1652,1661,66799,66814,66821,66836,66843,66846,66864,84752,182306,323580,380378);\n\nselect * from features;\nselect * from team_features where feature_id = 33;\nselect * from opportunities;\n\nselect * from teams;\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 = 1052 and sa.provider = 'hubspot';\n\nSELECT * FROM accounts where id = 11512582;\nselect * from activities where account_id = 11512582;","depth":4,"on_screen":true,"value":"SELECT\n# DISTINCT\nopp.id as opp_id, opp.uuid, opp.name,\n# COUNT(dr.id) AS deal_risk_count,\n\n# dr.id,\n# cfd.value,\nusr.name AS owner_name,\nopp.value, opp.currency_code, opp.close_date, opp.remotely_created_at, opp.is_closed, opp.is_won,\nusr.uuid as owner_uuid,\nusr.photo_path as owner_photo,\nusr.id AS owner_id,\njt.name as owner_job,\nopp.stage_id, opp.stage_updated_at,\nacc.name AS acc_name, opp.stage_updated_at, acc.crm_provider_id AS acc_provider_id, opp.crm_provider_id AS opp_provider_id,\nrt.business_process_id AS pipeline_id\nFROM opportunities opp\nLEFT JOIN record_types rt ON opp.record_type_id = rt.id\nLEFT JOIN users usr ON opp.user_id = usr.id\nLEFT JOIN accounts acc ON opp.account_id = acc.id\nLEFT JOIN job_titles jt ON usr.job_title_id = jt.id\n\n# LEFT JOIN group_deal_risk_types gdrt ON gdrt.group_id = usr.group_id\n# LEFT JOIN deal_risks dr ON dr.opportunity_id = opp.id AND dr.group_deal_risk_type_id = gdrt.id\n\nLEFT JOIN crm_field_data cfd ON (cfd.object_id = opp.id and cfd.crm_field_id = 66814)\n\nWHERE opp.user_id IS NOT NULL\nAND opp.deleted_at IS NULL\nAND opp.is_closed = 1\nAND opp.is_won = 0\nAND opp.close_date >= '2024-01-01 00:00:00'\nAND opp.close_date <= '2024-12-31 23:59:59'\nAND usr.team_id = 1\n\n# and opp.id = 4823179\n\nGROUP BY opp.id, cfd.value\nORDER BY\n# cfd.value\n CAST(cfd.value AS UNSIGNED)\n# owner_name\n# (SELECT COUNT(dr.id)\n# FROM deal_risks dr\n# JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id\n# WHERE dr.opportunity_id = opp.id\n# AND dr.is_active = 1\n# AND gdrt.is_enabled = 1)\nDESC\nLIMIT 25\n# OFFSET 0\n;\n\nselect * from crm_fields where crm_configuration_id = 1 and object_type = 'opportunity';\nselect * from crm_layout_entities where crm_layout_id = 1493;\n\nSELECT * FROM opportunities WHERE id = 4584045;\nSELECT * FROM crm_field_data WHERE object_id = 4584045;\n\nSELECT * FROM opportunities where team_id = 1 and crm_provider_id = '0061K00000lfb9IQAQ'\n\nSELECT\n opp.id as opportunity_id,\n opp.name,\n COUNT(dr.id) as risk_count\nFROM opportunities opp\nLEFT JOIN deal_risks dr ON dr.opportunity_id = opp.id\nWHERE opp.id IN (\n 6069574,8900938,9507638,9524799,9660490,9662824,9705675,9749758,4158460,4391812,6450439,4448422,5118945,5590675,4584045,7228149,9002408,9165534,9446720,9641778,9665149,9703344,9709280,5747948,4158491,6182565,6263970,5798120,5111315,4536978,6062352,6548383,6072095,6548225,4480986,5011422,6548381,8760540,8917554,9509986,9514392,9569009,9569011,9578490,9713604,5784397,7276612,7288405,8994421,9118219,9608148,9818911,4510535,6479693,5958049,6271674,6550448,4158331,4158483,6126571,6171615,6540943,4897466,5190896,5796182,5932762,8572433,8723698,8892697,9711001,9789264,4549188,6100831,6170064,6260799,6263653,6449936,6530871,6538978,7777651,8059269,8319918,8787049,8901150,9263153,9453207,9514738,9696700,9791062,5752018,6421452,7439134,7878923,9354763,9369285,9514396,9582506,9889949,9890216,4094311,4158495,4158496,6098128,5585661,3872564,6442149,5891604,6164746,6199593,6583474,6519684,9018490,9809006,4496897,5041324,5829430,6198319,6253504,6555763,7242914,7931055,8024125,8797814,8058559,8673347,8892695,8994420,9616219,9714970,9722004,9809439,9818918,6523177,8134147,9002915,9711422,9892713,9901719,9954210,9978435,5800810,6243518,6416114,6222251,6411974,6512456,5791953,6545606,9914780,5805540,6238986,6463838,6547680,9767049,9809437,9810885,9890855,6673493,9902036,4335521,6379871,6503799,6546077,8018765,9907556,9958433,9905855,9916179,9946741,9957877,5563344,6271838,6450815,7641128,7762567,7780592,8684810,8685786,8685787,8685788\n)\nGROUP BY opp.id;\n\nSELECT COUNT(dr.id)\n FROM deal_risks dr\n JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id\n WHERE dr.opportunity_id = 5563344\n# AND gdrt.group_id = usr.group_id\n\n\n\nEXPLAIN SELECT\n opp.id as opp_id, opp.uuid, opp.name,\n\ncfd.value,\ncfv.sequence,\ncfv.value,\n# MAX(cfd.value) AS max_cfd_value,\nusr.name AS owner_name,\nopp.value, opp.currency_code, opp.close_date, opp.remotely_created_at, opp.is_closed, opp.is_won,\nusr.uuid as owner_uuid,\nusr.photo_path as owner_photo,\nusr.id AS owner_id,\njt.name as owner_job,\nopp.stage_id, opp.stage_updated_at,\nacc.name AS acc_name, opp.stage_updated_at, acc.crm_provider_id AS acc_provider_id, opp.crm_provider_id AS opp_provider_id,\nrt.business_process_id AS pipeline_id\nFROM opportunities opp\n\nLEFT JOIN record_types rt ON opp.record_type_id = rt.id\nLEFT JOIN users usr ON opp.user_id = usr.id\nLEFT JOIN accounts acc ON opp.account_id = acc.id\nLEFT JOIN job_titles jt ON usr.job_title_id = jt.id\n\nLEFT JOIN crm_field_data cfd ON cfd.id = (SELECT sub_cfd.id\n FROM crm_field_data sub_cfd\n WHERE sub_cfd.object_id = opp.id\n AND sub_cfd.crm_field_id = 66810\n ORDER BY sub_cfd.updated_at DESC\n LIMIT 1)\n\nLEFT JOIN crm_field_values cfv ON cfv.crm_field_id = 66810 AND cfv.value = cfd.value\n\nWHERE opp.user_id IS NOT NULL\nAND opp.deleted_at IS NULL\nAND opp.is_closed = 0\n# AND opp.is_closed = 1\n# AND opp.is_won = 0\nAND opp.close_date >= '2024-01-01 00:00:00'\nAND opp.close_date <= '2024-12-31 23:59:59'\nAND usr.team_id = 1\n\n# and opp.id = 4823179\n\n# GROUP BY opp.id\nORDER BY\n cfv.sequence DESC,\n# opp.name\n# owner_name\n cfd.value\n# CAST(cfd.value AS UNSIGNED)\n# CAST(MAX(cfd.value) AS UNSIGNED)\n# (SELECT COUNT(dr.id)\n# FROM deal_risks dr\n# JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id\n# WHERE dr.opportunity_id = opp.id\n# AND dr.is_active = 1 AND gdrt.is_enabled = 1)\nDESC\n# LIMIT 75, 25\n;\n\n\n\nSELECT * FROM crm_field_values WHERE crm_field_id = 66810;\n\nSELECT f.id, f.crm_provider_id AS field_name, f.label, fd.object_id AS dealId, fd.value, fd.updated_at, fd.id, fd.created_at\nFROM crm_fields f\nINNER JOIN crm_field_data fd ON fd.crm_field_id = f.id\n WHERE (f.crm_configuration_id = 1)\n AND (f.object_type = 'opportunity')\n# AND (fd.object_id IN (4158331,4158483,4158495,4158496,6069574,6263970,6171615,6540943,6545606,5829430,6198319,6263653,6548381,7242914,8797814,7228149,7439134,7878923,8134147,9002915,9118219,9165534,9354763,9369285,9446720))\n AND (fd.object_id IN (4158460))\n AND (f.crm_provider_id IN ('ForecastCategoryName'))\n ORDER BY fd.object_id ASC, fd.updated_at DESC;\n\nselect * from crm_layouts where crm_configuration_id = 1;\nselect cf.* from crm_fields cf\njoin crm_layout_entities cle on cf.id = cle.crm_field_id\nwhere crm_layout_id = 1493;\n\nSELECT * FROM opportunities WHERE id = 4158460;\nSELECT * FROM crm_field_data WHERE object_id = 4158460;\n\nselect * from users where team_id = 1;\nSELECT * FROM users WHERE id = 7160;\nselect * from role_user where user_id = 3248;\n\nselect * from crm_field_values where crm_field_id = 66824;\n\nSELECT * FROM users WHERE id = 23470;\nselect * from crm_configurations;\n\n# ******************************************\nselect * from teams where id = 1038; # 23521, 966\nselect * from users where team_id = 1038;\nselect * from crm_configurations where id = 966;\nSELECT * FROM activities WHERE uuid_to_bin('e8dc7c34-31f6-4430-bd81-2d9d8f00dd07') = uuid; # 54965762\nSELECT * FROM activities WHERE uuid_to_bin('4b5727c0-69d1-428f-b8d9-b649055166e2') = uuid; # 54965764\nSELECT * FROM participants WHERE activity_id = 54965764;\n\nSELECT id, uuid, title, recording_state FROM activities WHERE uuid_to_bin('355f105d-5606-4379-b0c5-d91daf59f4ce') = uuid; # 54964075\nSELECT * FROM participants WHERE activity_id = 54964075;\nselect f.id, slug, title, tf.team_id from team_features tf JOIN features f on tf.feature_id = f.id\n where tf.team_id = 1038;\n\n\n# ****************************************** PD *************************\nselect * from teams where id = 1029;\nSELECT * FROM crm_configurations WHERE id = 957;\nSELECT * FROM activities WHERE uuid_to_bin('581a33cb-4343-44bd-ac0c-4a5cee71c5ec') = uuid; # 54963423\nSELECT * FROM activities WHERE uuid_to_bin('07238011-25fa-418e-838b-fb21e82b9ea2') = uuid; # 54963433\n\nSELECT * FROM activities WHERE uuid_to_bin('8b6bb2f7-e7a7-4aec-8806-fbfea7093ccd') = uuid; # 54963421\n\n# ****************************************** Close *************************\nselect * from teams where id = 1031;\nSELECT * FROM crm_configurations WHERE id = 959;\nSELECT * FROM activities WHERE uuid_to_bin('59c517e0-96c9-4dad-bfeb-b7bef72f8725') = uuid; # 54963517\n\n\nSELECT * FROM activities WHERE uuid_to_bin('07238011-25fa-418e-838b-fb21e82b9ea2') = uuid; # 54963433\n\nSELECT * FROM activities WHERE uuid_to_bin('d68311e3-ac34-49bd-bf04-88323a7e5352') = uuid; # 54966009\n\n# ****************************************** SF *************************\nSELECT * FROM activities WHERE uuid_to_bin('2bd4cfa3-4eb5-4c77-84a7-9ed46a21c988') = uuid;\n\nselect * from roles;\nselect * from permissions;\nselect * from permission_role where permission_id = 136;\n\nselect * from migrations order by id desc;\n\nselect * from teams where id IN (1, 1037);\nselect * from crm_layouts where crm_configuration_id = 1;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1493;\nSELECT * FROM crm_fields WHERE id IN (1652,1661,66799,66814,66821,66836,66843,66846,66864,84752,182306,323580,380378);\n\nselect * from features;\nselect * from team_features where feature_id = 33;\nselect * from opportunities;\n\nselect * from teams;\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 = 1052 and sa.provider = 'hubspot';\n\nSELECT * FROM accounts where id = 11512582;\nselect * from activities where account_id = 11512582;","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Project","depth":3,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Project","depth":3,"bounds":{"left":0.28224733,"top":1.0,"width":0.024268618,"height":-0.04788506},"on_screen":true,"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},"on_screen":false,"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},"on_screen":false,"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},"on_screen":false,"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},"on_screen":false,"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},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
4266403488567062772
|
6524482065460761565
|
click
|
accessibility
|
NULL
|
Project: faVsco.js, menu
#12066 on JY-20725-handle Project: faVsco.js, menu
#12066 on JY-20725-handle-HS-search-rate-limit, menu
Start Listening for PHP Debug Connections
HandleHubspotRateLimitTest
Run 'HandleHubspotRateLimitTest'
Debug 'HandleHubspotRateLimitTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
16
2
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Services\Crm\IntegrationApp;
use Carbon\Carbon;
use Jiminny\Contracts\Crm\Providers;
use Jiminny\Contracts\Services\Crm\ClientInterface;
use Jiminny\Contracts\Services\Crm\FetchRelatedActivityInterface;
use Jiminny\Contracts\Services\Crm\ImportsBusinessProcessesInterface;
use Jiminny\Contracts\Services\Crm\LayoutManagementInterface;
use Jiminny\Contracts\Services\Crm\MatchCrmEntitiesInterface;
use Jiminny\Contracts\Services\Crm\Provider\IntegrationAppInterface;
use Jiminny\Contracts\Services\Crm\RemoteEntityLookupInterface;
use Jiminny\Contracts\Services\Crm\RemoteEntityManipulationInterface;
use Jiminny\Contracts\Services\Crm\RemoteNoteEntityManipulationInterface;
use Jiminny\Contracts\Services\Crm\SendSummaryToCrmInterface;
use Jiminny\Contracts\Services\Crm\SettingsInterface;
use Jiminny\Contracts\Services\Crm\SyncCrmEntitiesInterface;
use Jiminny\Contracts\Services\Crm\SyncCrmMetadataInterface;
use Jiminny\Events\Activities\Crm\ActivityLeadConverted;
use Jiminny\Exceptions\CrmException;
use Jiminny\Exceptions\SocialAccountNotFoundException;
use Jiminny\Jobs\Crm\NoteObject;
use Jiminny\Models\Account;
use Jiminny\Models\Activity;
use Jiminny\Models\Contracts\ActivityContract;
use Jiminny\Models\Crm\Configuration;
use Jiminny\Models\Opportunity;
use Jiminny\Models\Stage;
use Jiminny\Models\User;
use Jiminny\Services\Crm\BaseService;
use Jiminny\Services\Crm\IntegrationApp\Config\IntegrationAppProviders;
use Jiminny\Services\Crm\IntegrationApp\Config\IntegrationConfigFactory;
use Jiminny\Services\Crm\IntegrationApp\DTO\Mappers\FieldMapperInterface;
use Jiminny\Services\Crm\IntegrationApp\DTO\Mappers\LeadFieldMapper;
use Jiminny\Services\Crm\IntegrationApp\DTO\Utils\GenerateProviderUrlInterface;
use Jiminny\Services\Crm\IntegrationApp\DTO\Utils\IntegrationAppCrmGeneratorFactory;
use Jiminny\Services\Crm\IntegrationApp\DTO\Utils\UrlGeneratorInterface;
use Jiminny\Services\Crm\IntegrationApp\ServiceTraits\SyncCrmFieldsTrait;
use Jiminny\Services\Crm\IntegrationApp\ServiceTraits\SystemStateTrait;
use Jiminny\Services\Crm\IntegrationApp\ServiceTraits\LayoutTrait;
use Jiminny\Services\Crm\IntegrationApp\ServiceTraits\MatchProspectsTrait;
use Jiminny\Services\Crm\IntegrationApp\ServiceTraits\NotSupportedTrait;
use Jiminny\Services\Crm\IntegrationApp\ServiceTraits\SyncCrmEntitiesTrait;
use Jiminny\Services\Crm\IntegrationApp\ServiceTraits\SyncCrmMetadataTrait;
use Psr\Log\LoggerInterface;
use Jiminny\Services\Crm\IntegrationApp\DTO\Mappers\OpportunityFieldMapper;
use Jiminny\Repositories\Crm\ProfileRepository;
use Jiminny\Repositories\Crm\OpportunityRepository;
use Jiminny\Models\Crm\Profile;
use Jiminny\Services\Crm\CrmObjects\CrmObjectsRepository;
class Service extends BaseService implements
IntegrationAppInterface,
SyncCrmEntitiesInterface,
SyncCrmMetadataInterface,
ImportsBusinessProcessesInterface,
RemoteEntityManipulationInterface,
LayoutManagementInterface,
SettingsInterface,
MatchCrmEntitiesInterface,
RemoteEntityLookupInterface,
RemoteNoteEntityManipulationInterface,
SendSummaryToCrmInterface,
UrlGeneratorInterface,
FetchRelatedActivityInterface
{
use SyncCrmMetadataTrait;
use SyncCrmEntitiesTrait;
use SystemStateTrait;
use LayoutTrait;
use NotSupportedTrait;
use MatchProspectsTrait;
use SyncCrmFieldsTrait;
public const string CALL_TYPE_MISSED = 'Missed';
public const string CALL_TYPE_INBOUND = 'Inbound';
public const string CALL_TYPE_OUTBOUND = 'Outbound';
public const string RELATIONSHIP_OPPORTUNITY = 'Deals';
public const string RELATIONSHIP_LEAD = 'Leads';
public const string RELATIONSHIP_ACCOUNT = 'Accounts';
/**
* @var ClientInterface&DataClient
*/
protected $client;
protected ?User $invokedUser = null;
protected ?GenerateProviderUrlInterface $crmUrlGenerator = null;
public function __construct(
DataClient $client,
LoggerInterface $logger,
) {
parent::__construct();
$this->client = $client;
$this->logger = $logger;
}
public function getDisplayName(): string
{
return Providers::getProviderDisplayName(
Providers::getCrmIntegrationSlug($this->config)
);
}
/**
* @throws \Exception
*/
public function setUser(User $user): void
{
$this->configureSentryScope($user);
$this->invokedUser = $user;
$this->team = $user->getTeam();
$teamOwner = $this->team->getOwner();
$this->setConfiguration($user->getTeam()->getCrmConfiguration());
$this->setEditionConfiguration(Providers::getCrmIntegrationSlug($this->config));
$this->setCrmUrlGenerator($this->config);
$this->client->setTeam($this->team);
$socialAccount = $teamOwner?->getSocialAccount('integration-app');
if ($socialAccount === null) {
$this->logger->info('[integration-app] Social account not found', [
'teamId' => $this->team->getId(),
'teamOwnerId' => $teamOwner?->getId(),
'userId' => $user->getId(),
]);
throw new SocialAccountNotFoundException('Social account not found!');
}
$this->client->setSocialAccount($socialAccount);
// The CRM Service is properly bootstrapped, and supports remote operations
$this->connect();
}
public function normalizeValue(string $fieldType, string $fieldValue, bool $internal = false): string
{
return $fieldValue;
}
public function find(string $name, array $scopes): array
{
/** @var LocalSearch $localSearch */
$localSearch = app(LocalSearch::class);
$localSearch->setConfiguration($this->config);
$localSearch->setCountryCode($this->invokedUser->getCountryCode());
return $localSearch->search($name);
// if (! empty($localMatch)) {
// return $localMatch;
// }
//
// /** @var RemoteSearch $remoteSearch */
// $remoteSearch = app(RemoteSearch::class);
// $remoteSearch->setClient($this->client);
// $remoteSearch->setConfiguration($this->config);
//
// return $remoteSearch->search($name);
}
public function findOpportunities(?string $crmAccountId, ?string $crmContactId, ?int $userId = null): array
{
$data = [];
$ownerData = [];
$account = $this->getAccount($crmAccountId, $crmContactId);
if ($account === null) {
return [];
}
$ownerId = $this->getOwnerId($userId);
try {
$opportunityRepository = app(OpportunityRepository::class);
$opportunities = $opportunityRepository->findAllByConfigurationAndAccountId(
$this->config,
$account->getId()
);
foreach ($opportunities as $opportunity) {
/** @var Opportunity $opportunity */
$record = $this->buildOpportunityData($opportunity);
if ($ownerId && $opportunity->getOwnerId() === $ownerId) {
$ownerData[] = $record;
}
$data[] = $record;
}
if (! empty($ownerData)) {
return $ownerData;
}
return $data;
} catch (\Exception $e) {
$this->logger->info('[integration-app] Failed to fetch opportunities', [
'contact' => $crmContactId,
'account' => $crmAccountId,
'owner' => $ownerId,
'error' => $e->getMessage(),
]);
return $data;
}
}
private function getOwnerId(?int $userId = null): ?string
{
if (! $userId) {
return null;
}
$profileRepository = app(ProfileRepository::class);
$profile = $profileRepository->findProfileByUserId($this->config, $userId);
return $profile instanceof Profile ? $profile->getCrmProviderId() : null;
}
private function getAccount(?string $crmAccountId = null, ?string $crmContactId = null): ?Account
{
$crmRepository = app(CrmObjectsRepository::class);
if ($crmAccountId === null) {
$contact = $crmRepository->findContactByCrmProviderId($this->config, $crmContactId);
return $contact->getAccount();
}
return $crmRepository->findAccountByCrmProviderId($this->config, $crmAccountId);
}
private function buildOpportunityData(Opportunity $opportunity): array
{
$record = [
'crmId' => $opportunity->getCrmProviderId(),
'name' => $opportunity->getName(),
'won' => $opportunity->isWon(),
'closed' => $opportunity->isClosed(),
];
if (! empty($opportunity->getFormattedValueAttribute())) {
$record['value'] = $opportunity->getFormattedValueAttribute();
}
if (! empty($opportunity->getStage())) {
$record['stage'] = [
'id' => $opportunity->getStage()->getUuid(),
'name' => $opportunity->getStage()->getName(),
];
}
return $record;
}
public function updateRecord(string $objectType, string $objectId, array $data, array $headers = []): void
{
$data = [
'data' => $this->normalizeData($objectType, $data),
];
$this->client->updateRecordById($objectType, $objectId, $data);
}
private function normalizeData(string $objectType, array $data): array
{
$fieldMapper = $this->getFieldMapper($objectType);
if (! $fieldMapper instanceof FieldMapperInterface) {
return $data;
}
return $fieldMapper->mapToCrmFields($data);
}
private function getFieldMapper(string $objectType): ?FieldMapperInterface
{
if ($objectType === self::OBJECT_OPPORTUNITY) {
return app(OpportunityFieldMapper::class);
}
if ($objectType === self::OBJECT_LEAD) {
return app(LeadFieldMapper::class);
}
return null;
}
public function getRecord(string $objectType, string $objectId, array $fields = []): array
{
return $this->client->getRecordById($objectType, $objectId);
}
public function getConfiguration(): Configuration
{
return $this->config;
}
public function setConfiguration(Configuration $config): void
{
$this->clearExternalMapCache();
$this->config = $config;
}
private function setEditionConfiguration(string $provider): void
{
$this->editionConfig = app(IntegrationConfigFactory::class)->create($provider);
}
public function setCrmUrlGenerator(Configuration $config): void
{
$this->crmUrlGenerator = app(IntegrationAppCrmGeneratorFactory::class)->create($config);
}
public function getCrmUrlGenerator(): ?GenerateProviderUrlInterface
{
if ($this->crmUrlGenerator === null) {
$this->setCrmUrlGenerator($this->config);
}
return $this->crmUrlGenerator;
}
public function subscribeEntityEvents(bool $enableTrigger = true): void
{
$eventStates = $this->client->updateEntityEventsState($enableTrigger);
$this->logger->info('[integration-app] Change team entity events subscription', [
'teamId' => $this->team->getId(),
'teamName' => $this->team->getName(),
'states' => $eventStates,
'action' => $enableTrigger ? 'subscribe' : 'unsubscribe',
]);
}
#[\Override] public function supportsNotes(): bool
{
return $this->editionConfig->supportsNotes();
}
#[\Override] public function saveNote(
string $title,
string $body,
string $objectId,
?NoteObject $noteObject = null,
): ?string {
if ($noteObject === null) {
return null;
}
$notePayload = [
'title' => $title,
'content' => $body,
'objectId' => $objectId,
'objectType' => $noteObject->value,
];
$result = $this->client->createNote($notePayload);
// debug saving note response
$this->logger->info('[integration-app] createNote response', [
'objectId' => $objectId,
'objectType' => $noteObject->value,
'result' => $result,
'hasId' => isset($result['id']),
]);
return $result['id'] ?? null;
}
/**
* @throws CrmException
*/
#[\Override] public function saveActivity(Activity $activity): Activity
{
$this->logger->info('[integration-app] saveActivity', [
'activity' => $activity->getUuid(),
'type' => $activity->getType(),
]);
if ($activity->getCrmType() === Activity::TYPE_CONFERENCE) {
$crmActivity = $this->saveMeeting($activity);
} elseif (in_array($activity->getType(), [Activity::TYPE_SOFTPHONE, Activity::TYPE_SOFTPHONE_INBOUND])) {
$crmActivity = $this->saveCall($activity);
} else {
throw new CrmException('Unsupported activity type');
}
$crmActivityId = $crmActivity['id'] ?? null;
if ($crmActivityId !== null) {
$activity->crm_provider_id = $crmActivityId;
$activity->save();
$this->logger->info('[integration-app] Activity successfully logged to CRM', [
'activity' => $activity->getUuid(),
'type' => $activity->getType(),
'crmId' => $crmActivityId,
]);
}
return $activity;
}
public function saveMeeting(Activity $activity): array
{
$decorateActivity = app(DecorateActivity::class);
$meetingPayload = [
'Event_Title' => $decorateActivity->generateTitle($activity),
'Start_DateTime' => $activity->getActualStartTime()->toIso8601String(),
'End_DateTime' => $activity->getActualEndTime()->toIso8601String(),
'ownerId' => $this->getActivityOwnerId($activity),
];
$payload = array_merge($meetingPayload, $this->attachToProspect($activity));
if ($activity->hasCrmProviderId()) {
$crmId = $activity->getCrmProviderId();
$meeting = $this->client->getMeeting($crmId);
$oldDescription = $meeting['fields']['Description'] ?? null;
$payload['Description'] = $decorateActivity->generateUpdatedDescription($oldDescription, $activity);
$this->logger->info('[integration-app] CRM update meeting', [
'activity' => $activity->getUuid(),
'crm_id' => $crmId,
'payload' => $payload,
]);
return $this->client->updateMeeting($crmId, $payload);
}
$payload['Description'] = $decorateActivity->generateDescription($activity);
$this->logger->info('[integration-app] CRM log meeting', [
'activity' => $activity->getUuid(),
'payload' => $payload,
]);
return $this->client->createMeeting($payload);
}
public function saveCall(Activity $activity): array
{
$decorateActivity = app(DecorateActivity::class);
$callPayload = [
'Call_Type' => $this->getCallType($activity),
'Call_Start_Time' => $activity->getActualStartTime()->toIso8601String(),
'Call_Duration' => $activity->getDuration(),
'name' => $decorateActivity->generateTitle($activity),
'ownerId' => $this->getActivityOwnerId($activity),
];
$payload = array_merge($callPayload, $this->attachToProspect($activity));
if ($activity->hasCrmProviderId()) {
$crmId = $activity->getCrmProviderId();
$call = $this->client->getCall($crmId);
$oldDescription = $call['fields']['Description'] ?? null;
$payload['description'] = $decorateActivity->generateUpdatedDescription($oldDescription, $activity);
$this->logger->info('[integration-app] CRM update call', [
'activity' => $activity->getUuid(),
'crm_id' => $crmId,
'payload' => $payload,
]);
return $this->client->updateCall($crmId, $payload);
}
$payload['description'] = $decorateActivity->generateDescription($activity);
$this->logger->info('[integration-app] CRM log call', [
'activity' => $activity->getUuid(),
'payload' => $payload,
]);
return $this->client->createCall($payload);
}
private function getCallType(Activity $activity): string
{
if ($activity->getStatus() === Activity::STATUS_NO_ANSWER) {
return self::CALL_TYPE_MISSED;
}
return $activity->getType() === Activity::TYPE_SOFTPHONE_INBOUND ? self::CALL_TYPE_INBOUND : self::CALL_TYPE_OUTBOUND;
}
private function attachToProspect(Activity $activity): array
{
$payload = [];
if ($activity->hasContact()) {
$payload['contactId'] = $activity->getContact()->getCrmProviderId();
}
if ($activity->hasOpportunity()) {
return array_merge(
$payload,
$this->buildBasicPayload(
self::RELATIONSHIP_OPPORTUNITY,
$activity->getOpportunity()->getCrmProviderId()
)
);
}
if ($activity->hasAccount() && ! $activity->getAccount()->getIsInternal()) {
return array_merge(
$payload,
$this->buildBasicPayload(
self::RELATIONSHIP_ACCOUNT,
$activity->getAccount()->getCrmProviderId()
)
);
}
if ($activity->hasLead()) {
$payload = $this->handleLeadPayload($activity);
}
return $payload;
}
private function handleLeadPayload(Activity $activity): array
{
$freshLead = $this->syncLead($activity->getLead()->getCrmProviderId());
$lead = $freshLead ?? $activity->getLead();
if ($lead->getConvertedAt() === null) {
return $this->buildBasicPayload(self::RELATIONSHIP_LEAD, $lead->getCrmProviderId());
}
$activity->lead_id = null;
if ($lead->hasAccount()) {
$account = $lead->getAccount();
$activity->account_id = $account->getId();
$payload = $this->buildBasicPayload(self::RELATIONSHIP_ACCOUNT, $account->getCrmProviderId());
} else {
$payload = [];
}
if ($lead->hasOpportunity()) {
$opportunity = $lead->getOpportunity();
$payload = $this->buildBasicPayload(self::RELATIONSHIP_OPPORTUNITY, $opportunity->getCrmProviderId());
$activity->opportunity_id = $opportunity->getId();
$activity->value = $opportunity->value;
$activity->stage_id = $opportunity->stage_id;
} else {
$activity->stage_id = null;
}
if ($lead->hasContact()) {
$contact = $lead->getContact();
$payload['contactId'] = $contact->getCrmProviderId();
$activity->contact_id = $contact->getId();
}
$activity->save();
event(new ActivityLeadConverted($activity, $lead));
$this->logger->info('[integration-app] Lead converted', [
'activityUuid' => $activity->getUuid(),
'leadUuid' => $lead->getUuid(),
]);
return $payload;
}
private function buildBasicPayload(string $type, string $id): array
{
return [
'type' => $type,
'id' => $id,
];
}
private function getActivityOwnerId(Activity $activity): ?string
{
$ownerId = null;
if ($activity->hasUser() && $activity->getUser()->getProfile() !== null) {
$ownerId = $activity->getUser()->getProfile()->getCrmProviderId();
}
return $ownerId;
}
#[\Override] public function saveFollowupActivity(Activity $activity, array $fields): ?string
{
$taskPayload = [
'subject' => $fields['subject'],
'dueTime' => isset($fields['dueDate']) ? Carbon::parse($fields['dueDate'])->format('Y-m-d') : null,
'ownerId' => $this->getActivityOwnerId($activity),
];
if (isset($fields['status'])) {
$taskPayload['status'] = $fields['status'];
}
if (isset($fields['priority'])) {
$taskPayload['priority'] = $fields['priority'];
}
if (isset($fields['content'])) {
$taskPayload['content'] = $fields['content'];
}
$payload = array_merge($taskPayload, $this->attachToProspect($activity));
$this->logger->info('[integration-app] CRM log follow up task', [
'activity' => $activity->getUuid(),
'payload' => $payload,
]);
$task = $this->client->createTask($payload);
return $task['id'] ?? null;
}
#[\Override] public function saveTranscriptionSummaryAsNote(
ActivityContract $activity,
string $title,
string $body,
?string $objectId,
?NoteObject $noteObject = null,
): ?string {
// We have to find a way to store the transcription summary
// This might be possible either by Tasks, Events, Engagements & Notes
// Find what the CRM supports and save the note with the appropriate object(eg Notes)
// For now use only Notes as both ZOHO & Salesforce support them.
if ($this->supportsNotes() && $objectId !== null) {
$this->logger->info('[integration-app] saving note', [
'activityId' => $activity->getUuid(),
'objectId' => $objectId,
]);
return $this->saveNote($title, $body, $objectId, $noteObject);
}
$this->logger->info('[integration-app] skip saveTranscriptionSummaryAsNote', [
'activityId' => $activity->getUuid(),
'supportsNotes' => $this->supportsNotes(),
'objectId' => $objectId,
]);
return null;
}
public function generateProviderUrl(string $providerId, string $objectType): ?string
{
return $this->getCrmUrlGenerator()?->generateProviderUrl($providerId, $objectType);
}
public function updateStage($crmObject, Stage $stage): void
{
$objectType = $stage->getType();
$objectId = $crmObject->getCrmProviderId();
$params = ['stageName' => $stage->getCrmProviderId()];
$this->logger->info('[integration-app] updateStage', [
'objectType' => $objectType,
'objectId' => $objectId,
'params' => $params,
]);
$data = [
'data' => $this->normalizeData($objectType, $params),
];
if ($objectType === Stage::TYPE_LEAD) {
$this->client->updateLead($objectId, $data);
} else {
$this->client->updateDeal($objectId, $data);
}
}
/**
* @throws \Exception
*/
public function fetchAndAssociateRelatedActivity(Activity $activity): ?Activity
{
if ($activity->getCrm()?->getEdition() !== IntegrationAppProviders::ZOHO_CRM) {
return null;
}
if (! $activity->isTypeConference()) {
return null;
}
// The related activity is already linked.
if ($activity->hasCrmProviderId()) {
return $activity;
}
if ($activity->hasActualStartTime() === false) {
return null;
}
return $this->fetchAndAssociateZohoRelatedActivity($activity);
}
public function fetchAndAssociateZohoRelatedActivity(Activity $activity): ?Activity
{
try {
$meeting = $this->fetchRelatedZohoActivity($activity);
if (empty($meeting)) {
$this->logger->info('[integration-app] fetchRelatedZohoActivity No related activity found', [
'activity' => $activity->getUuid(),
]);
return null;
}
$decorateActivity = app(DecorateActivity::class);
$oldDescription = $meeting['Description'] ?? '';
$updatedDescription = $decorateActivity->generateUpdatedDescription($oldDescription, $activity);
$this->logger->info('[integration-app] fetchAndAssociateZohoRelatedActivity updating related activity', [
'activity' => $activity->getUuid(),
'description' => $updatedDescription,
]);
$this->client->updateMeeting($meeting['id'], ['Description' => $updatedDescription]);
// Update our activity to reflect the remote data.
$activity->update([
'crm_provider_id' => $meeting['id'],
'summary' => $meeting['Description'],
]);
return $activity;
} catch (\Exception $exception) {
\Sentry::captureException($exception);
throw $exception;
}
}
public function fetchRelatedZohoActivity(Activity $activity): array
{
[$from, $to] = $this->getFromToDates($activity);
$start = $from?->toIso8601String(); // e.g., 2025-07-01T00:00:00+00:00
$end = $to?->toIso8601String(); // e.g., 2025-07-14T23:59:59+00:00
if ($start === null || $end === null) {
$this->logger->info(
'[integration-app] fetchRelatedZohoActivity missing start or end date',
[
'activity' => $activity->getUuid(),
'start' => $start,
'end' => $end,
'from' => $from,
'to' => $to,
]
);
return [];
}
$whoId = null;
$whatId = null;
$criteriaParts = [];
if ($activity->getContact()) {
$whoId = $activity->getContact()->getCrmProviderId();
$criteriaParts[] = "(Who_Id:equals:$whoId)";
}
if ($activity->getOpportunity()) {
$whatId = $activity->getOpportunity()->getCrmProviderId();
} elseif ($activity->getAccount() && $activity->getAccount()->getIsInternal() === false) {
$whatId = $activity->getAccount()->getCrmProviderId();
} elseif ($activity->getLead()) {
$whatId = $activity->getLead()->getCrmProviderId();
}
if ($whatId !== null) {
$criteriaParts[] = "(What_Id:equals:$whatId)";
}
if ($whoId === null && $whatId === null) {
$this->logger->info(
'[integration-app] fetchRelatedZohoActivity cannot find prospect',
[
'activity' => $activity->getUuid(),
]
);
return [];
}
$criteriaParts[] = "(Start_DateTime:greater_equal:$start)";
$criteriaParts[] = "(End_DateTime:less_equal:$end)";
$criteria = implode(' AND ', $criteriaParts);
$params = [
'criteria' => $criteria,
'sort_by' => 'Modified_Time',
'sort_order' => 'desc',
];
$this->logger->info(
'[integration-app] fetchRelatedZohoActivity searching for related activity',
[
'activity' => $activity->getUuid(),
'params' => $params,
]
);
$meetings = $this->client->searchMeetings($params);
if (! empty($meetings)) {
return $meetings[0];
}
return [];
}
private function getFromToDates(Activity $activity): array
{
$calendarEvent = $activity->calendarEvent()->first();
$from = $calendarEvent?->getStartTime();
$to = $calendarEvent?->getEndTime();
if (! $from || ! $to) {
$from = $activity->hasScheduledStartTime()
? $activity->getScheduledStartTime()
: $activity->getActualStartTime();
$to = $activity->hasScheduledEndTime()
? $activity->getScheduledEndTime()->addMinutes(15)
: $activity->getActualEndTime();
}
return [$from, $to];
}
}
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
8
1
3
4
Previous Highlighted Error
Next Highlighted Error
SELECT
# DISTINCT
opp.id as opp_id, opp.uuid, opp.name,
# COUNT(dr.id) AS deal_risk_count,
# dr.id,
# cfd.value,
usr.name AS owner_name,
opp.value, opp.currency_code, opp.close_date, opp.remotely_created_at, opp.is_closed, opp.is_won,
usr.uuid as owner_uuid,
usr.photo_path as owner_photo,
usr.id AS owner_id,
jt.name as owner_job,
opp.stage_id, opp.stage_updated_at,
acc.name AS acc_name, opp.stage_updated_at, acc.crm_provider_id AS acc_provider_id, opp.crm_provider_id AS opp_provider_id,
rt.business_process_id AS pipeline_id
FROM opportunities opp
LEFT JOIN record_types rt ON opp.record_type_id = rt.id
LEFT JOIN users usr ON opp.user_id = usr.id
LEFT JOIN accounts acc ON opp.account_id = acc.id
LEFT JOIN job_titles jt ON usr.job_title_id = jt.id
# LEFT JOIN group_deal_risk_types gdrt ON gdrt.group_id = usr.group_id
# LEFT JOIN deal_risks dr ON dr.opportunity_id = opp.id AND dr.group_deal_risk_type_id = gdrt.id
LEFT JOIN crm_field_data cfd ON (cfd.object_id = opp.id and cfd.crm_field_id = 66814)
WHERE opp.user_id IS NOT NULL
AND opp.deleted_at IS NULL
AND opp.is_closed = 1
AND opp.is_won = 0
AND opp.close_date >= '2024-01-01 00:00:00'
AND opp.close_date <= '2024-12-31 23:59:59'
AND usr.team_id = 1
# and opp.id = 4823179
GROUP BY opp.id, cfd.value
ORDER BY
# cfd.value
CAST(cfd.value AS UNSIGNED)
# owner_name
# (SELECT COUNT(dr.id)
# FROM deal_risks dr
# JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id
# WHERE dr.opportunity_id = opp.id
# AND dr.is_active = 1
# AND gdrt.is_enabled = 1)
DESC
LIMIT 25
# OFFSET 0
;
select * from crm_fields where crm_configuration_id = 1 and object_type = 'opportunity';
select * from crm_layout_entities where crm_layout_id = 1493;
SELECT * FROM opportunities WHERE id = 4584045;
SELECT * FROM crm_field_data WHERE object_id = 4584045;
SELECT * FROM opportunities where team_id = 1 and crm_provider_id = '0061K00000lfb9IQAQ'
SELECT
opp.id as opportunity_id,
opp.name,
COUNT(dr.id) as risk_count
FROM opportunities opp
LEFT JOIN deal_risks dr ON dr.opportunity_id = opp.id
WHERE opp.id IN (
6069574,8900938,9507638,9524799,9660490,9662824,9705675,9749758,4158460,4391812,6450439,4448422,5118945,5590675,4584045,7228149,9002408,9165534,9446720,9641778,9665149,9703344,9709280,5747948,4158491,6182565,6263970,5798120,5111315,4536978,6062352,6548383,6072095,6548225,4480986,5011422,6548381,8760540,8917554,9509986,9514392,9569009,9569011,9578490,9713604,5784397,7276612,7288405,8994421,9118219,9608148,9818911,4510535,6479693,5958049,6271674,6550448,4158331,4158483,6126571,6171615,6540943,4897466,5190896,5796182,5932762,8572433,8723698,8892697,9711001,9789264,4549188,6100831,6170064,6260799,6263653,6449936,6530871,6538978,7777651,8059269,8319918,8787049,8901150,9263153,9453207,9514738,9696700,9791062,5752018,6421452,7439134,7878923,9354763,9369285,9514396,9582506,9889949,9890216,4094311,4158495,4158496,6098128,5585661,3872564,6442149,5891604,6164746,6199593,6583474,6519684,9018490,9809006,4496897,5041324,5829430,6198319,6253504,6555763,7242914,7931055,8024125,8797814,8058559,8673347,8892695,8994420,9616219,9714970,9722004,9809439,9818918,6523177,8134147,9002915,9711422,9892713,9901719,9954210,9978435,5800810,6243518,6416114,6222251,6411974,6512456,5791953,6545606,9914780,5805540,6238986,6463838,6547680,9767049,9809437,9810885,9890855,6673493,9902036,4335521,6379871,6503799,6546077,8018765,9907556,9958433,9905855,9916179,9946741,9957877,5563344,6271838,6450815,7641128,7762567,7780592,8684810,8685786,8685787,8685788
)
GROUP BY opp.id;
SELECT COUNT(dr.id)
FROM deal_risks dr
JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id
WHERE dr.opportunity_id = 5563344
# AND gdrt.group_id = usr.group_id
EXPLAIN SELECT
opp.id as opp_id, opp.uuid, opp.name,
cfd.value,
cfv.sequence,
cfv.value,
# MAX(cfd.value) AS max_cfd_value,
usr.name AS owner_name,
opp.value, opp.currency_code, opp.close_date, opp.remotely_created_at, opp.is_closed, opp.is_won,
usr.uuid as owner_uuid,
usr.photo_path as owner_photo,
usr.id AS owner_id,
jt.name as owner_job,
opp.stage_id, opp.stage_updated_at,
acc.name AS acc_name, opp.stage_updated_at, acc.crm_provider_id AS acc_provider_id, opp.crm_provider_id AS opp_provider_id,
rt.business_process_id AS pipeline_id
FROM opportunities opp
LEFT JOIN record_types rt ON opp.record_type_id = rt.id
LEFT JOIN users usr ON opp.user_id = usr.id
LEFT JOIN accounts acc ON opp.account_id = acc.id
LEFT JOIN job_titles jt ON usr.job_title_id = jt.id
LEFT JOIN crm_field_data cfd ON cfd.id = (SELECT sub_cfd.id
FROM crm_field_data sub_cfd
WHERE sub_cfd.object_id = opp.id
AND sub_cfd.crm_field_id = 66810
ORDER BY sub_cfd.updated_at DESC
LIMIT 1)
LEFT JOIN crm_field_values cfv ON cfv.crm_field_id = 66810 AND cfv.value = cfd.value
WHERE opp.user_id IS NOT NULL
AND opp.deleted_at IS NULL
AND opp.is_closed = 0
# AND opp.is_closed = 1
# AND opp.is_won = 0
AND opp.close_date >= '2024-01-01 00:00:00'
AND opp.close_date <= '2024-12-31 23:59:59'
AND usr.team_id = 1
# and opp.id = 4823179
# GROUP BY opp.id
ORDER BY
cfv.sequence DESC,
# opp.name
# owner_name
cfd.value
# CAST(cfd.value AS UNSIGNED)
# CAST(MAX(cfd.value) AS UNSIGNED)
# (SELECT COUNT(dr.id)
# FROM deal_risks dr
# JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id
# WHERE dr.opportunity_id = opp.id
# AND dr.is_active = 1 AND gdrt.is_enabled = 1)
DESC
# LIMIT 75, 25
;
SELECT * FROM crm_field_values WHERE crm_field_id = 66810;
SELECT f.id, f.crm_provider_id AS field_name, f.label, fd.object_id AS dealId, fd.value, fd.updated_at, fd.id, fd.created_at
FROM crm_fields f
INNER JOIN crm_field_data fd ON fd.crm_field_id = f.id
WHERE (f.crm_configuration_id = 1)
AND (f.object_type = 'opportunity')
# AND (fd.object_id IN (4158331,4158483,4158495,4158496,6069574,6263970,6171615,6540943,6545606,5829430,6198319,6263653,6548381,7242914,8797814,7228149,7439134,7878923,8134147,9002915,9118219,9165534,9354763,9369285,9446720))
AND (fd.object_id IN (4158460))
AND (f.crm_provider_id IN ('ForecastCategoryName'))
ORDER BY fd.object_id ASC, fd.updated_at DESC;
select * from crm_layouts where crm_configuration_id = 1;
select cf.* from crm_fields cf
join crm_layout_entities cle on cf.id = cle.crm_field_id
where crm_layout_id = 1493;
SELECT * FROM opportunities WHERE id = 4158460;
SELECT * FROM crm_field_data WHERE object_id = 4158460;
select * from users where team_id = 1;
SELECT * FROM users WHERE id = 7160;
select * from role_user where user_id = 3248;
select * from crm_field_values where crm_field_id = 66824;
SELECT * FROM users WHERE id = 23470;
select * from crm_configurations;
# [PASSWORD_DOTS]
select * from teams where id = 1038; # 23521, 966
select * from users where team_id = 1038;
select * from crm_configurations where id = 966;
SELECT * FROM activities WHERE uuid_to_bin('e8dc7c34-31f6-4430-bd81-2d9d8f00dd07') = uuid; # 54965762
SELECT * FROM activities WHERE uuid_to_bin('4b5727c0-69d1-428f-b8d9-b649055166e2') = uuid; # 54965764
SELECT * FROM participants WHERE activity_id = 54965764;
SELECT id, uuid, title, recording_state FROM activities WHERE uuid_to_bin('355f105d-5606-4379-b0c5-d91daf59f4ce') = uuid; # 54964075
SELECT * FROM participants WHERE activity_id = 54964075;
select f.id, slug, title, tf.team_id from team_features tf JOIN features f on tf.feature_id = f.id
where tf.team_id = 1038;
# [PASSWORD_DOTS] PD [PASSWORD_DOTS]
select * from teams where id = 1029;
SELECT * FROM crm_configurations WHERE id = 957;
SELECT * FROM activities WHERE uuid_to_bin('581a33cb-4343-44bd-ac0c-4a5cee71c5ec') = uuid; # 54963423
SELECT * FROM activities WHERE uuid_to_bin('07238011-25fa-418e-838b-fb21e82b9ea2') = uuid; # 54963433
SELECT * FROM activities WHERE uuid_to_bin('8b6bb2f7-e7a7-4aec-8806-fbfea7093ccd') = uuid; # 54963421
# [PASSWORD_DOTS] Close [PASSWORD_DOTS]
select * from teams where id = 1031;
SELECT * FROM crm_configurations WHERE id = 959;
SELECT * FROM activities WHERE uuid_to_bin('59c517e0-96c9-4dad-bfeb-b7bef72f8725') = uuid; # 54963517
SELECT * FROM activities WHERE uuid_to_bin('07238011-25fa-418e-838b-fb21e82b9ea2') = uuid; # 54963433
SELECT * FROM activities WHERE uuid_to_bin('d68311e3-ac34-49bd-bf04-88323a7e5352') = uuid; # 54966009
# [PASSWORD_DOTS] SF [PASSWORD_DOTS]
SELECT * FROM activities WHERE uuid_to_bin('2bd4cfa3-4eb5-4c77-84a7-9ed46a21c988') = uuid;
select * from roles;
select * from permissions;
select * from permission_role where permission_id = 136;
select * from migrations order by id desc;
select * from teams where id IN (1, 1037);
select * from crm_layouts where crm_configuration_id = 1;
SELECT * FROM crm_layout_entities WHERE crm_layout_id = 1493;
SELECT * FROM crm_fields WHERE id IN (1652,1661,66799,66814,66821,66836,66843,66846,66864,84752,182306,323580,380378);
select * from features;
select * from team_features where feature_id = 33;
select * from opportunities;
select * from teams;
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 = 1052 and sa.provider = 'hubspot';
SELECT * FROM accounts where id = 11512582;
select * from activities where account_id = 11512582;
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
45545
|
NULL
|
0
|
2026-05-14T14:42:03.548722+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-14/1778 /Users/lukas/.screenpipe/data/data/2026-05-14/1778769723548_m2.jpg...
|
PhpStorm
|
faVsco.js – IntegrationApp/Service.php
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
#12066 on JY-20725-handle Project: faVsco.js, menu
#12066 on JY-20725-handle-HS-search-rate-limit, menu
Start Listening for PHP Debug Connections
HandleHubspotRateLimitTest
Run 'HandleHubspotRateLimitTest'
Debug 'HandleHubspotRateLimitTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
16
2
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Services\Crm\IntegrationApp;
use Carbon\Carbon;
use Jiminny\Contracts\Crm\Providers;
use Jiminny\Contracts\Services\Crm\ClientInterface;
use Jiminny\Contracts\Services\Crm\FetchRelatedActivityInterface;
use Jiminny\Contracts\Services\Crm\ImportsBusinessProcessesInterface;
use Jiminny\Contracts\Services\Crm\LayoutManagementInterface;
use Jiminny\Contracts\Services\Crm\MatchCrmEntitiesInterface;
use Jiminny\Contracts\Services\Crm\Provider\IntegrationAppInterface;
use Jiminny\Contracts\Services\Crm\RemoteEntityLookupInterface;
use Jiminny\Contracts\Services\Crm\RemoteEntityManipulationInterface;
use Jiminny\Contracts\Services\Crm\RemoteNoteEntityManipulationInterface;
use Jiminny\Contracts\Services\Crm\SendSummaryToCrmInterface;
use Jiminny\Contracts\Services\Crm\SettingsInterface;
use Jiminny\Contracts\Services\Crm\SyncCrmEntitiesInterface;
use Jiminny\Contracts\Services\Crm\SyncCrmMetadataInterface;
use Jiminny\Events\Activities\Crm\ActivityLeadConverted;
use Jiminny\Exceptions\CrmException;
use Jiminny\Exceptions\SocialAccountNotFoundException;
use Jiminny\Jobs\Crm\NoteObject;
use Jiminny\Models\Account;
use Jiminny\Models\Activity;
use Jiminny\Models\Contracts\ActivityContract;
use Jiminny\Models\Crm\Configuration;
use Jiminny\Models\Opportunity;
use Jiminny\Models\Stage;
use Jiminny\Models\User;
use Jiminny\Services\Crm\BaseService;
use Jiminny\Services\Crm\IntegrationApp\Config\IntegrationAppProviders;
use Jiminny\Services\Crm\IntegrationApp\Config\IntegrationConfigFactory;
use Jiminny\Services\Crm\IntegrationApp\DTO\Mappers\FieldMapperInterface;
use Jiminny\Services\Crm\IntegrationApp\DTO\Mappers\LeadFieldMapper;
use Jiminny\Services\Crm\IntegrationApp\DTO\Utils\GenerateProviderUrlInterface;
use Jiminny\Services\Crm\IntegrationApp\DTO\Utils\IntegrationAppCrmGeneratorFactory;
use Jiminny\Services\Crm\IntegrationApp\DTO\Utils\UrlGeneratorInterface;
use Jiminny\Services\Crm\IntegrationApp\ServiceTraits\SyncCrmFieldsTrait;
use Jiminny\Services\Crm\IntegrationApp\ServiceTraits\SystemStateTrait;
use Jiminny\Services\Crm\IntegrationApp\ServiceTraits\LayoutTrait;
use Jiminny\Services\Crm\IntegrationApp\ServiceTraits\MatchProspectsTrait;
use Jiminny\Services\Crm\IntegrationApp\ServiceTraits\NotSupportedTrait;
use Jiminny\Services\Crm\IntegrationApp\ServiceTraits\SyncCrmEntitiesTrait;
use Jiminny\Services\Crm\IntegrationApp\ServiceTraits\SyncCrmMetadataTrait;
use Psr\Log\LoggerInterface;
use Jiminny\Services\Crm\IntegrationApp\DTO\Mappers\OpportunityFieldMapper;
use Jiminny\Repositories\Crm\ProfileRepository;
use Jiminny\Repositories\Crm\OpportunityRepository;
use Jiminny\Models\Crm\Profile;
use Jiminny\Services\Crm\CrmObjects\CrmObjectsRepository;
class Service extends BaseService implements
IntegrationAppInterface,
SyncCrmEntitiesInterface,
SyncCrmMetadataInterface,
ImportsBusinessProcessesInterface,
RemoteEntityManipulationInterface,
LayoutManagementInterface,
SettingsInterface,
MatchCrmEntitiesInterface,
RemoteEntityLookupInterface,
RemoteNoteEntityManipulationInterface,
SendSummaryToCrmInterface,
UrlGeneratorInterface,
FetchRelatedActivityInterface
{
use SyncCrmMetadataTrait;
use SyncCrmEntitiesTrait;
use SystemStateTrait;
use LayoutTrait;
use NotSupportedTrait;
use MatchProspectsTrait;
use SyncCrmFieldsTrait;
public const string CALL_TYPE_MISSED = 'Missed';
public const string CALL_TYPE_INBOUND = 'Inbound';
public const string CALL_TYPE_OUTBOUND = 'Outbound';
public const string RELATIONSHIP_OPPORTUNITY = 'Deals';
public const string RELATIONSHIP_LEAD = 'Leads';
public const string RELATIONSHIP_ACCOUNT = 'Accounts';
/**
* @var ClientInterface&DataClient
*/
protected $client;
protected ?User $invokedUser = null;
protected ?GenerateProviderUrlInterface $crmUrlGenerator = null;
public function __construct(
DataClient $client,
LoggerInterface $logger,
) {
parent::__construct();
$this->client = $client;
$this->logger = $logger;
}
public function getDisplayName(): string
{
return Providers::getProviderDisplayName(
Providers::getCrmIntegrationSlug($this->config)
);
}
/**
* @throws \Exception
*/
public function setUser(User $user): void
{
$this->configureSentryScope($user);
$this->invokedUser = $user;
$this->team = $user->getTeam();
$teamOwner = $this->team->getOwner();
$this->setConfiguration($user->getTeam()->getCrmConfiguration());
$this->setEditionConfiguration(Providers::getCrmIntegrationSlug($this->config));
$this->setCrmUrlGenerator($this->config);
$this->client->setTeam($this->team);
$socialAccount = $teamOwner?->getSocialAccount('integration-app');
if ($socialAccount === null) {
$this->logger->info('[integration-app] Social account not found', [
'teamId' => $this->team->getId(),
'teamOwnerId' => $teamOwner?->getId(),
'userId' => $user->getId(),
]);
throw new SocialAccountNotFoundException('Social account not found!');
}
$this->client->setSocialAccount($socialAccount);
// The CRM Service is properly bootstrapped, and supports remote operations
$this->connect();
}
public function normalizeValue(string $fieldType, string $fieldValue, bool $internal = false): string
{
return $fieldValue;
}
public function find(string $name, array $scopes): array
{
/** @var LocalSearch $localSearch */
$localSearch = app(LocalSearch::class);
$localSearch->setConfiguration($this->config);
$localSearch->setCountryCode($this->invokedUser->getCountryCode());
return $localSearch->search($name);
// if (! empty($localMatch)) {
// return $localMatch;
// }
//
// /** @var RemoteSearch $remoteSearch */
// $remoteSearch = app(RemoteSearch::class);
// $remoteSearch->setClient($this->client);
// $remoteSearch->setConfiguration($this->config);
//
// return $remoteSearch->search($name);
}
public function findOpportunities(?string $crmAccountId, ?string $crmContactId, ?int $userId = null): array
{
$data = [];
$ownerData = [];
$account = $this->getAccount($crmAccountId, $crmContactId);
if ($account === null) {
return [];
}
$ownerId = $this->getOwnerId($userId);
try {
$opportunityRepository = app(OpportunityRepository::class);
$opportunities = $opportunityRepository->findAllByConfigurationAndAccountId(
$this->config,
$account->getId()
);
foreach ($opportunities as $opportunity) {
/** @var Opportunity $opportunity */
$record = $this->buildOpportunityData($opportunity);
if ($ownerId && $opportunity->getOwnerId() === $ownerId) {
$ownerData[] = $record;
}
$data[] = $record;
}
if (! empty($ownerData)) {
return $ownerData;
}
return $data;
} catch (\Exception $e) {
$this->logger->info('[integration-app] Failed to fetch opportunities', [
'contact' => $crmContactId,
'account' => $crmAccountId,
'owner' => $ownerId,
'error' => $e->getMessage(),
]);
return $data;
}
}
private function getOwnerId(?int $userId = null): ?string
{
if (! $userId) {
return null;
}
$profileRepository = app(ProfileRepository::class);
$profile = $profileRepository->findProfileByUserId($this->config, $userId);
return $profile instanceof Profile ? $profile->getCrmProviderId() : null;
}
private function getAccount(?string $crmAccountId = null, ?string $crmContactId = null): ?Account
{
$crmRepository = app(CrmObjectsRepository::class);
if ($crmAccountId === null) {
$contact = $crmRepository->findContactByCrmProviderId($this->config, $crmContactId);
return $contact->getAccount();
}
return $crmRepository->findAccountByCrmProviderId($this->config, $crmAccountId);
}
private function buildOpportunityData(Opportunity $opportunity): array
{
$record = [
'crmId' => $opportunity->getCrmProviderId(),
'name' => $opportunity->getName(),
'won' => $opportunity->isWon(),
'closed' => $opportunity->isClosed(),
];
if (! empty($opportunity->getFormattedValueAttribute())) {
$record['value'] = $opportunity->getFormattedValueAttribute();
}
if (! empty($opportunity->getStage())) {
$record['stage'] = [
'id' => $opportunity->getStage()->getUuid(),
'name' => $opportunity->getStage()->getName(),
];
}
return $record;
}
public function updateRecord(string $objectType, string $objectId, array $data, array $headers = []): void
{
$data = [
'data' => $this->normalizeData($objectType, $data),
];
$this->client->updateRecordById($objectType, $objectId, $data);
}
private function normalizeData(string $objectType, array $data): array
{
$fieldMapper = $this->getFieldMapper($objectType);
if (! $fieldMapper instanceof FieldMapperInterface) {
return $data;
}
return $fieldMapper->mapToCrmFields($data);
}
private function getFieldMapper(string $objectType): ?FieldMapperInterface
{
if ($objectType === self::OBJECT_OPPORTUNITY) {
return app(OpportunityFieldMapper::class);
}
if ($objectType === self::OBJECT_LEAD) {
return app(LeadFieldMapper::class);
}
return null;
}
public function getRecord(string $objectType, string $objectId, array $fields = []): array
{
return $this->client->getRecordById($objectType, $objectId);
}
public function getConfiguration(): Configuration
{
return $this->config;
}
public function setConfiguration(Configuration $config): void
{
$this->clearExternalMapCache();
$this->config = $config;
}
private function setEditionConfiguration(string $provider): void
{
$this->editionConfig = app(IntegrationConfigFactory::class)->create($provider);
}
public function setCrmUrlGenerator(Configuration $config): void
{
$this->crmUrlGenerator = app(IntegrationAppCrmGeneratorFactory::class)->create($config);
}
public function getCrmUrlGenerator(): ?GenerateProviderUrlInterface
{
if ($this->crmUrlGenerator === null) {
$this->setCrmUrlGenerator($this->config);
}
return $this->crmUrlGenerator;
}
public function subscribeEntityEvents(bool $enableTrigger = true): void
{
$eventStates = $this->client->updateEntityEventsState($enableTrigger);
$this->logger->info('[integration-app] Change team entity events subscription', [
'teamId' => $this->team->getId(),
'teamName' => $this->team->getName(),
'states' => $eventStates,
'action' => $enableTrigger ? 'subscribe' : 'unsubscribe',
]);
}
#[\Override] public function supportsNotes(): bool
{
return $this->editionConfig->supportsNotes();
}
#[\Override] public function saveNote(
string $title,
string $body,
string $objectId,
?NoteObject $noteObject = null,
): ?string {
if ($noteObject === null) {
return null;
}
$notePayload = [
'title' => $title,
'content' => $body,
'objectId' => $objectId,
'objectType' => $noteObject->value,
];
$result = $this->client->createNote($notePayload);
// debug saving note response
$this->logger->info('[integration-app] createNote response', [
'objectId' => $objectId,
'objectType' => $noteObject->value,
'result' => $result,
'hasId' => isset($result['id']),
]);
return $result['id'] ?? null;
}
/**
* @throws CrmException
*/
#[\Override] public function saveActivity(Activity $activity): Activity
{
$this->logger->info('[integration-app] saveActivity', [
'activity' => $activity->getUuid(),
'type' => $activity->getType(),
]);
if ($activity->getCrmType() === Activity::TYPE_CONFERENCE) {
$crmActivity = $this->saveMeeting($activity);
} elseif (in_array($activity->getType(), [Activity::TYPE_SOFTPHONE, Activity::TYPE_SOFTPHONE_INBOUND])) {
$crmActivity = $this->saveCall($activity);
} else {
throw new CrmException('Unsupported activity type');
}
$crmActivityId = $crmActivity['id'] ?? null;
if ($crmActivityId !== null) {
$activity->crm_provider_id = $crmActivityId;
$activity->save();
$this->logger->info('[integration-app] Activity successfully logged to CRM', [
'activity' => $activity->getUuid(),
'type' => $activity->getType(),
'crmId' => $crmActivityId,
]);
}
return $activity;
}
public function saveMeeting(Activity $activity): array
{
$decorateActivity = app(DecorateActivity::class);
$meetingPayload = [
'Event_Title' => $decorateActivity->generateTitle($activity),
'Start_DateTime' => $activity->getActualStartTime()->toIso8601String(),
'End_DateTime' => $activity->getActualEndTime()->toIso8601String(),
'ownerId' => $this->getActivityOwnerId($activity),
];
$payload = array_merge($meetingPayload, $this->attachToProspect($activity));
if ($activity->hasCrmProviderId()) {
$crmId = $activity->getCrmProviderId();
$meeting = $this->client->getMeeting($crmId);
$oldDescription = $meeting['fields']['Description'] ?? null;
$payload['Description'] = $decorateActivity->generateUpdatedDescription($oldDescription, $activity);
$this->logger->info('[integration-app] CRM update meeting', [
'activity' => $activity->getUuid(),
'crm_id' => $crmId,
'payload' => $payload,
]);
return $this->client->updateMeeting($crmId, $payload);
}
$payload['Description'] = $decorateActivity->generateDescription($activity);
$this->logger->info('[integration-app] CRM log meeting', [
'activity' => $activity->getUuid(),
'payload' => $payload,
]);
return $this->client->createMeeting($payload);
}
public function saveCall(Activity $activity): array
{
$decorateActivity = app(DecorateActivity::class);
$callPayload = [
'Call_Type' => $this->getCallType($activity),
'Call_Start_Time' => $activity->getActualStartTime()->toIso8601String(),
'Call_Duration' => $activity->getDuration(),
'name' => $decorateActivity->generateTitle($activity),
'ownerId' => $this->getActivityOwnerId($activity),
];
$payload = array_merge($callPayload, $this->attachToProspect($activity));
if ($activity->hasCrmProviderId()) {
$crmId = $activity->getCrmProviderId();
$call = $this->client->getCall($crmId);
$oldDescription = $call['fields']['Description'] ?? null;
$payload['description'] = $decorateActivity->generateUpdatedDescription($oldDescription, $activity);
$this->logger->info('[integration-app] CRM update call', [
'activity' => $activity->getUuid(),
'crm_id' => $crmId,
'payload' => $payload,
]);
return $this->client->updateCall($crmId, $payload);
}
$payload['description'] = $decorateActivity->generateDescription($activity);
$this->logger->info('[integration-app] CRM log call', [
'activity' => $activity->getUuid(),
'payload' => $payload,
]);
return $this->client->createCall($payload);
}
private function getCallType(Activity $activity): string
{
if ($activity->getStatus() === Activity::STATUS_NO_ANSWER) {
return self::CALL_TYPE_MISSED;
}
return $activity->getType() === Activity::TYPE_SOFTPHONE_INBOUND ? self::CALL_TYPE_INBOUND : self::CALL_TYPE_OUTBOUND;
}
private function attachToProspect(Activity $activity): array
{
$payload = [];
if ($activity->hasContact()) {
$payload['contactId'] = $activity->getContact()->getCrmProviderId();
}
if ($activity->hasOpportunity()) {
return array_merge(
$payload,
$this->buildBasicPayload(
self::RELATIONSHIP_OPPORTUNITY,
$activity->getOpportunity()->getCrmProviderId()
)
);
}
if ($activity->hasAccount() && ! $activity->getAccount()->getIsInternal()) {
return array_merge(
$payload,
$this->buildBasicPayload(
self::RELATIONSHIP_ACCOUNT,
$activity->getAccount()->getCrmProviderId()
)
);
}
if ($activity->hasLead()) {
$payload = $this->handleLeadPayload($activity);
}
return $payload;
}
private function handleLeadPayload(Activity $activity): array
{
$freshLead = $this->syncLead($activity->getLead()->getCrmProviderId());
$lead = $freshLead ?? $activity->getLead();
if ($lead->getConvertedAt() === null) {
return $this->buildBasicPayload(self::RELATIONSHIP_LEAD, $lead->getCrmProviderId());
}
$activity->lead_id = null;
if ($lead->hasAccount()) {
$account = $lead->getAccount();
$activity->account_id = $account->getId();
$payload = $this->buildBasicPayload(self::RELATIONSHIP_ACCOUNT, $account->getCrmProviderId());
} else {
$payload = [];
}
if ($lead->hasOpportunity()) {
$opportunity = $lead->getOpportunity();
$payload = $this->buildBasicPayload(self::RELATIONSHIP_OPPORTUNITY, $opportunity->getCrmProviderId());
$activity->opportunity_id = $opportunity->getId();
$activity->value = $opportunity->value;
$activity->stage_id = $opportunity->stage_id;
} else {
$activity->stage_id = null;
}
if ($lead->hasContact()) {
$contact = $lead->getContact();
$payload['contactId'] = $contact->getCrmProviderId();
$activity->contact_id = $contact->getId();
}
$activity->save();
event(new ActivityLeadConverted($activity, $lead));
$this->logger->info('[integration-app] Lead converted', [
'activityUuid' => $activity->getUuid(),
'leadUuid' => $lead->getUuid(),
]);
return $payload;
}
private function buildBasicPayload(string $type, string $id): array
{
return [
'type' => $type,
'id' => $id,
];
}
private function getActivityOwnerId(Activity $activity): ?string
{
$ownerId = null;
if ($activity->hasUser() && $activity->getUser()->getProfile() !== null) {
$ownerId = $activity->getUser()->getProfile()->getCrmProviderId();
}
return $ownerId;
}
#[\Override] public function saveFollowupActivity(Activity $activity, array $fields): ?string
{
$taskPayload = [
'subject' => $fields['subject'],
'dueTime' => isset($fields['dueDate']) ? Carbon::parse($fields['dueDate'])->format('Y-m-d') : null,
'ownerId' => $this->getActivityOwnerId($activity),
];
if (isset($fields['status'])) {
$taskPayload['status'] = $fields['status'];
}
if (isset($fields['priority'])) {
$taskPayload['priority'] = $fields['priority'];
}
if (isset($fields['content'])) {
$taskPayload['content'] = $fields['content'];
}
$payload = array_merge($taskPayload, $this->attachToProspect($activity));
$this->logger->info('[integration-app] CRM log follow up task', [
'activity' => $activity->getUuid(),
'payload' => $payload,
]);
$task = $this->client->createTask($payload);
return $task['id'] ?? null;
}
#[\Override] public function saveTranscriptionSummaryAsNote(
ActivityContract $activity,
string $title,
string $body,
?string $objectId,
?NoteObject $noteObject = null,
): ?string {
// We have to find a way to store the transcription summary
// This might be possible either by Tasks, Events, Engagements & Notes
// Find what the CRM supports and save the note with the appropriate object(eg Notes)
// For now use only Notes as both ZOHO & Salesforce support them.
if ($this->supportsNotes() && $objectId !== null) {
$this->logger->info('[integration-app] saving note', [
'activityId' => $activity->getUuid(),
'objectId' => $objectId,
]);
return $this->saveNote($title, $body, $objectId, $noteObject);
}
$this->logger->info('[integration-app] skip saveTranscriptionSummaryAsNote', [
'activityId' => $activity->getUuid(),
'supportsNotes' => $this->supportsNotes(),
'objectId' => $objectId,
]);
return null;
}
public function generateProviderUrl(string $providerId, string $objectType): ?string
{
return $this->getCrmUrlGenerator()?->generateProviderUrl($providerId, $objectType);
}
public function updateStage($crmObject, Stage $stage): void
{
$objectType = $stage->getType();
$objectId = $crmObject->getCrmProviderId();
$params = ['stageName' => $stage->getCrmProviderId()];
$this->logger->info('[integration-app] updateStage', [
'objectType' => $objectType,
'objectId' => $objectId,
'params' => $params,
]);
$data = [
'data' => $this->normalizeData($objectType, $params),
];
if ($objectType === Stage::TYPE_LEAD) {
$this->client->updateLead($objectId, $data);
} else {
$this->client->updateDeal($objectId, $data);
}
}
/**
* @throws \Exception
*/
public function fetchAndAssociateRelatedActivity(Activity $activity): ?Activity
{
if ($activity->getCrm()?->getEdition() !== IntegrationAppProviders::ZOHO_CRM) {
return null;
}
if (! $activity->isTypeConference()) {
return null;
}
// The related activity is already linked.
if ($activity->hasCrmProviderId()) {
return $activity;
}
if ($activity->hasActualStartTime() === false) {
return null;
}
return $this->fetchAndAssociateZohoRelatedActivity($activity);
}
public function fetchAndAssociateZohoRelatedActivity(Activity $activity): ?Activity
{
try {
$meeting = $this->fetchRelatedZohoActivity($activity);
if (empty($meeting)) {
$this->logger->info('[integration-app] fetchRelatedZohoActivity No related activity found', [
'activity' => $activity->getUuid(),
]);
return null;
}
$decorateActivity = app(DecorateActivity::class);
$oldDescription = $meeting['Description'] ?? '';
$updatedDescription = $decorateActivity->generateUpdatedDescription($oldDescription, $activity);
$this->logger->info('[integration-app] fetchAndAssociateZohoRelatedActivity updating related activity', [
'activity' => $activity->getUuid(),
'description' => $updatedDescription,
]);
$this->client->updateMeeting($meeting['id'], ['Description' => $updatedDescription]);
// Update our activity to reflect the remote data.
$activity->update([
'crm_provider_id' => $meeting['id'],
'summary' => $meeting['Description'],
]);
return $activity;
} catch (\Exception $exception) {
\Sentry::captureException($exception);
throw $exception;
}
}
public function fetchRelatedZohoActivity(Activity $activity): array
{
[$from, $to] = $this->getFromToDates($activity);
$start = $from?->toIso8601String(); // e.g., 2025-07-01T00:00:00+00:00
$end = $to?->toIso8601String(); // e.g., 2025-07-14T23:59:59+00:00
if ($start === null || $end === null) {
$this->logger->info(
'[integration-app] fetchRelatedZohoActivity missing start or end date',
[
'activity' => $activity->getUuid(),
'start' => $start,
'end' => $end,
'from' => $from,
'to' => $to,
]
);
return [];
}
$whoId = null;
$whatId = null;
$criteriaParts = [];
if ($activity->getContact()) {
$whoId = $activity->getContact()->getCrmProviderId();
$criteriaParts[] = "(Who_Id:equals:$whoId)";
}
if ($activity->getOpportunity()) {
$whatId = $activity->getOpportunity()->getCrmProviderId();
} elseif ($activity->getAccount() && $activity->getAccount()->getIsInternal() === false) {
$whatId = $activity->getAccount()->getCrmProviderId();
} elseif ($activity->getLead()) {
$whatId = $activity->getLead()->getCrmProviderId();
}
if ($whatId !== null) {
$criteriaParts[] = "(What_Id:equals:$whatId)";
}
if ($whoId === null && $whatId === null) {
$this->logger->info(
'[integration-app] fetchRelatedZohoActivity cannot find prospect',
[
'activity' => $activity->getUuid(),
]
);
return [];
}
$criteriaParts[] = "(Start_DateTime:greater_equal:$start)";
$criteriaParts[] = "(End_DateTime:less_equal:$end)";
$criteria = implode(' AND ', $criteriaParts);
$params = [
'criteria' => $criteria,
'sort_by' => 'Modified_Time',
'sort_order' => 'desc',
];
$this->logger->info(
'[integration-app] fetchRelatedZohoActivity searching for related activity',
[
'activity' => $activity->getUuid(),
'params' => $params,
]
);
$meetings = $this->client->searchMeetings($params);
if (! empty($meetings)) {
return $meetings[0];
}
return [];
}
private function getFromToDates(Activity $activity): array
{
$calendarEvent = $activity->calendarEvent()->first();
$from = $calendarEvent?->getStartTime();
$to = $calendarEvent?->getEndTime();
if (! $from || ! $to) {
$from = $activity->hasScheduledStartTime()
? $activity->getScheduledStartTime()
: $activity->getActualStartTime();
$to = $activity->hasScheduledEndTime()
? $activity->getScheduledEndTime()->addMinutes(15)
: $activity->getActualEndTime();
}
return [$from, $to];
}
}
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
8
1
3
4
Previous Highlighted Error
Next Highlighted Error
SELECT
# DISTINCT
opp.id as opp_id, opp.uuid, opp.name,
# COUNT(dr.id) AS deal_risk_count,
# dr.id,
# cfd.value,
usr.name AS owner_name,
opp.value, opp.currency_code, opp.close_date, opp.remotely_created_at, opp.is_closed, opp.is_won,
usr.uuid as owner_uuid,
usr.photo_path as owner_photo,
usr.id AS owner_id,
jt.name as owner_job,
opp.stage_id, opp.stage_updated_at,
acc.name AS acc_name, opp.stage_updated_at, acc.crm_provider_id AS acc_provider_id, opp.crm_provider_id AS opp_provider_id,
rt.business_process_id AS pipeline_id
FROM opportunities opp
LEFT JOIN record_types rt ON opp.record_type_id = rt.id
LEFT JOIN users usr ON opp.user_id = usr.id
LEFT JOIN accounts acc ON opp.account_id = acc.id
LEFT JOIN job_titles jt ON usr.job_title_id = jt.id
# LEFT JOIN group_deal_risk_types gdrt ON gdrt.group_id = usr.group_id
# LEFT JOIN deal_risks dr ON dr.opportunity_id = opp.id AND dr.group_deal_risk_type_id = gdrt.id
LEFT JOIN crm_field_data cfd ON (cfd.object_id = opp.id and cfd.crm_field_id = 66814)
WHERE opp.user_id IS NOT NULL
AND opp.deleted_at IS NULL
AND opp.is_closed = 1
AND opp.is_won = 0
AND opp.close_date >= '2024-01-01 00:00:00'
AND opp.close_date <= '2024-12-31 23:59:59'
AND usr.team_id = 1
# and opp.id = 4823179
GROUP BY opp.id, cfd.value
ORDER BY
# cfd.value
CAST(cfd.value AS UNSIGNED)
# owner_name
# (SELECT COUNT(dr.id)
# FROM deal_risks dr
# JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id
# WHERE dr.opportunity_id = opp.id
# AND dr.is_active = 1
# AND gdrt.is_enabled = 1)
DESC
LIMIT 25
# OFFSET 0
;
select * from crm_fields where crm_configuration_id = 1 and object_type = 'opportunity';
select * from crm_layout_entities where crm_layout_id = 1493;
SELECT * FROM opportunities WHERE id = 4584045;
SELECT * FROM crm_field_data WHERE object_id = 4584045;
SELECT * FROM opportunities where team_id = 1 and crm_provider_id = '0061K00000lfb9IQAQ'
SELECT
opp.id as opportunity_id,
opp.name,
COUNT(dr.id) as risk_count
FROM opportunities opp
LEFT JOIN deal_risks dr ON dr.opportunity_id = opp.id
WHERE opp.id IN (
6069574,8900938,9507638,9524799,9660490,9662824,9705675,9749758,4158460,4391812,6450439,4448422,5118945,5590675,4584045,7228149,9002408,9165534,9446720,9641778,9665149,9703344,9709280,5747948,4158491,6182565,6263970,5798120,5111315,4536978,6062352,6548383,6072095,6548225,4480986,5011422,6548381,8760540,8917554,9509986,9514392,9569009,9569011,9578490,9713604,5784397,7276612,7288405,8994421,9118219,9608148,9818911,4510535,6479693,5958049,6271674,6550448,4158331,4158483,6126571,6171615,6540943,4897466,5190896,5796182,5932762,8572433,8723698,8892697,9711001,9789264,4549188,6100831,6170064,6260799,6263653,6449936,6530871,6538978,7777651,8059269,8319918,8787049,8901150,9263153,9453207,9514738,9696700,9791062,5752018,6421452,7439134,7878923,9354763,9369285,9514396,9582506,9889949,9890216,4094311,4158495,4158496,6098128,5585661,3872564,6442149,5891604,6164746,6199593,6583474,6519684,9018490,9809006,4496897,5041324,5829430,6198319,6253504,6555763,7242914,7931055,8024125,8797814,8058559,8673347,8892695,8994420,9616219,9714970,9722004,9809439,9818918,6523177,8134147,9002915,9711422,9892713,9901719,9954210,9978435,5800810,6243518,6416114,6222251,6411974,6512456,5791953,6545606,9914780,5805540,6238986,6463838,6547680,9767049,9809437,9810885,9890855,6673493,9902036,4335521,6379871,6503799,6546077,8018765,9907556,9958433,9905855,9916179,9946741,9957877,5563344,6271838,6450815,7641128,7762567,7780592,8684810,8685786,8685787,8685788
)
GROUP BY opp.id;
SELECT COUNT(dr.id)
FROM deal_risks dr
JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id
WHERE dr.opportunity_id = 5563344
# AND gdrt.group_id = usr.group_id
EXPLAIN SELECT
opp.id as opp_id, opp.uuid, opp.name,
cfd.value,
cfv.sequence,
cfv.value,
# MAX(cfd.value) AS max_cfd_value,
usr.name AS owner_name,
opp.value, opp.currency_code, opp.close_date, opp.remotely_created_at, opp.is_closed, opp.is_won,
usr.uuid as owner_uuid,
usr.photo_path as owner_photo,
usr.id AS owner_id,
jt.name as owner_job,
opp.stage_id, opp.stage_updated_at,
acc.name AS acc_name, opp.stage_updated_at, acc.crm_provider_id AS acc_provider_id, opp.crm_provider_id AS opp_provider_id,
rt.business_process_id AS pipeline_id
FROM opportunities opp
LEFT JOIN record_types rt ON opp.record_type_id = rt.id
LEFT JOIN users usr ON opp.user_id = usr.id
LEFT JOIN accounts acc ON opp.account_id = acc.id
LEFT JOIN job_titles jt ON usr.job_title_id = jt.id
LEFT JOIN crm_field_data cfd ON cfd.id = (SELECT sub_cfd.id
FROM crm_field_data sub_cfd
WHERE sub_cfd.object_id = opp.id
AND sub_cfd.crm_field_id = 66810
ORDER BY sub_cfd.updated_at DESC
LIMIT 1)
LEFT JOIN crm_field_values cfv ON cfv.crm_field_id = 66810 AND cfv.value = cfd.value
WHERE opp.user_id IS NOT NULL
AND opp.deleted_at IS NULL
AND opp.is_closed = 0
# AND opp.is_closed = 1
# AND opp.is_won = 0
AND opp.close_date >= '2024-01-01 00:00:00'
AND opp.close_date <= '2024-12-31 23:59:59'
AND usr.team_id = 1
# and opp.id = 4823179
# GROUP BY opp.id
ORDER BY
cfv.sequence DESC,
# opp.name
# owner_name
cfd.value
# CAST(cfd.value AS UNSIGNED)
# CAST(MAX(cfd.value) AS UNSIGNED)
# (SELECT COUNT(dr.id)
# FROM deal_risks dr
# JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id
# WHERE dr.opportunity_id = opp.id
# AND dr.is_active = 1 AND gdrt.is_enabled = 1)
DESC
# LIMIT 75, 25
;
SELECT * FROM crm_field_values WHERE crm_field_id = 66810;
SELECT f.id, f.crm_provider_id AS field_name, f.label, fd.object_id AS dealId, fd.value, fd.updated_at, fd.id, fd.created_at
FROM crm_fields f
INNER JOIN crm_field_data fd ON fd.crm_field_id = f.id
WHERE (f.crm_configuration_id = 1)
AND (f.object_type = 'opportunity')
# AND (fd.object_id IN (4158331,4158483,4158495,4158496,6069574,6263970,6171615,6540943,6545606,5829430,6198319,6263653,6548381,7242914,8797814,7228149,7439134,7878923,8134147,9002915,9118219,9165534,9354763,9369285,9446720))
AND (fd.object_id IN (4158460))
AND (f.crm_provider_id IN ('ForecastCategoryName'))
ORDER BY fd.object_id ASC, fd.updated_at DESC;
select * from crm_layouts where crm_configuration_id = 1;
select cf.* from crm_fields cf
join crm_layout_entities cle on cf.id = cle.crm_field_id
where crm_layout_id = 1493;
SELECT * FROM opportunities WHERE id = 4158460;
SELECT * FROM crm_field_data WHERE object_id = 4158460;
select * from users where team_id = 1;
SELECT * FROM users WHERE id = 7160;
select * from role_user where user_id = 3248;
select * from crm_field_values where crm_field_id = 66824;
SELECT * FROM users WHERE id = 23470;
select * from crm_configurations;
# [PASSWORD_DOTS]
select * from teams where id = 1038; # 23521, 966
select * from users where team_id = 1038;
select * from crm_configurations where id = 966;
SELECT * FROM activities WHERE uuid_to_bin('e8dc7c34-31f6-4430-bd81-2d9d8f00dd07') = uuid; # 54965762
SELECT * FROM activities WHERE uuid_to_bin('4b5727c0-69d1-428f-b8d9-b649055166e2') = uuid; # 54965764
SELECT * FROM participants WHERE activity_id = 54965764;
SELECT id, uuid, title, recording_state FROM activities WHERE uuid_to_bin('355f105d-5606-4379-b0c5-d91daf59f4ce') = uuid; # 54964075
SELECT * FROM participants WHERE activity_id = 54964075;
select f.id, slug, title, tf.team_id from team_features tf JOIN features f on tf.feature_id = f.id
where tf.team_id = 1038;
# [PASSWORD_DOTS] PD [PASSWORD_DOTS]
select * from teams where id = 1029;
SELECT * FROM crm_configurations WHERE id = 957;
SELECT * FROM activities WHERE uuid_to_bin('581a33cb-4343-44bd-ac0c-4a5cee71c5ec') = uuid; # 54963423
SELECT * FROM activities WHERE uuid_to_bin('07238011-25fa-418e-838b-fb21e82b9ea2') = uuid; # 54963433
SELECT * FROM activities WHERE uuid_to_bin('8b6bb2f7-e7a7-4aec-8806-fbfea7093ccd') = uuid; # 54963421
# [PASSWORD_DOTS] Close [PASSWORD_DOTS]
select * from teams where id = 1031;
SELECT * FROM crm_configurations WHERE id = 959;
SELECT * FROM activities WHERE uuid_to_bin('59c517e0-96c9-4dad-bfeb-b7bef72f8725') = uuid; # 54963517
SELECT * FROM activities WHERE uuid_to_bin('07238011-25fa-418e-838b-fb21e82b9ea2') = uuid; # 54963433
SELECT * FROM activities WHERE uuid_to_bin('d68311e3-ac34-49bd-bf04-88323a7e5352') = uuid; # 54966009
# [PASSWORD_DOTS] SF [PASSWORD_DOTS]
SELECT * FROM activities WHERE uuid_to_bin('2bd4cfa3-4eb5-4c77-84a7-9ed46a21c988') = uuid;
select * from roles;
select * from permissions;
select * from permission_role where permission_id = 136;
select * from migrations order by id desc;
select * from teams where id IN (1, 1037);
select * from crm_layouts where crm_configuration_id = 1;
SELECT * FROM crm_layout_entities WHERE crm_layout_id = 1493;
SELECT * FROM crm_fields WHERE id IN (1652,1661,66799,66814,66821,66836,66843,66846,66864,84752,182306,323580,380378);
select * from features;
select * from team_features where feature_id = 33;
select * from opportunities;
select * from teams;
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 = 1052 and sa.provider = 'hubspot';
SELECT * FROM accounts where id = 11512582;
select * from activities where account_id = 11512582;
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.2962101,"top":1.0,"width":0.03856383,"height":-0.019952059},"on_screen":true,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"#12066 on JY-20725-handle-HS-search-rate-limit, menu","depth":5,"bounds":{"left":0.33477393,"top":1.0,"width":0.122340426,"height":-0.019952059},"on_screen":true,"help_text":"Pull request #12066 exists for current branch JY-20725-handle-HS-search-rate-limit, but local branch is out of sync with remote","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"bounds":{"left":0.5731383,"top":1.0,"width":0.011303191,"height":-0.019952059},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"HandleHubspotRateLimitTest","depth":6,"bounds":{"left":0.5884308,"top":1.0,"width":0.076130316,"height":-0.019952059},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run 'HandleHubspotRateLimitTest'","depth":6,"bounds":{"left":0.66456115,"top":1.0,"width":0.011303191,"height":-0.019952059},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'HandleHubspotRateLimitTest'","depth":6,"bounds":{"left":0.67586434,"top":1.0,"width":0.011303191,"height":-0.019952059},"on_screen":true,"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.6871675,"top":1.0,"width":0.011303191,"height":-0.019952059},"on_screen":true,"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.7150931,"top":1.0,"width":0.011303191,"height":-0.019952059},"on_screen":true,"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.72639626,"top":1.0,"width":0.011303191,"height":-0.019952059},"on_screen":true,"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.73769945,"top":1.0,"width":0.011303191,"height":-0.019952059},"on_screen":true,"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},"on_screen":false,"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},"on_screen":false,"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},"on_screen":false,"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},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"16","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"2","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"on_screen":true,"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\\IntegrationApp;\n\nuse Carbon\\Carbon;\nuse Jiminny\\Contracts\\Crm\\Providers;\nuse Jiminny\\Contracts\\Services\\Crm\\ClientInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\FetchRelatedActivityInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\ImportsBusinessProcessesInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\LayoutManagementInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\MatchCrmEntitiesInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\Provider\\IntegrationAppInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\RemoteEntityLookupInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\RemoteEntityManipulationInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\RemoteNoteEntityManipulationInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\SendSummaryToCrmInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\SettingsInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\SyncCrmEntitiesInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\SyncCrmMetadataInterface;\nuse Jiminny\\Events\\Activities\\Crm\\ActivityLeadConverted;\nuse Jiminny\\Exceptions\\CrmException;\nuse Jiminny\\Exceptions\\SocialAccountNotFoundException;\nuse Jiminny\\Jobs\\Crm\\NoteObject;\nuse Jiminny\\Models\\Account;\nuse Jiminny\\Models\\Activity;\nuse Jiminny\\Models\\Contracts\\ActivityContract;\nuse Jiminny\\Models\\Crm\\Configuration;\nuse Jiminny\\Models\\Opportunity;\nuse Jiminny\\Models\\Stage;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Services\\Crm\\BaseService;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\Config\\IntegrationAppProviders;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\Config\\IntegrationConfigFactory;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\DTO\\Mappers\\FieldMapperInterface;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\DTO\\Mappers\\LeadFieldMapper;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\DTO\\Utils\\GenerateProviderUrlInterface;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\DTO\\Utils\\IntegrationAppCrmGeneratorFactory;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\DTO\\Utils\\UrlGeneratorInterface;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\ServiceTraits\\SyncCrmFieldsTrait;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\ServiceTraits\\SystemStateTrait;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\ServiceTraits\\LayoutTrait;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\ServiceTraits\\MatchProspectsTrait;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\ServiceTraits\\NotSupportedTrait;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\ServiceTraits\\SyncCrmEntitiesTrait;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\ServiceTraits\\SyncCrmMetadataTrait;\nuse Psr\\Log\\LoggerInterface;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\DTO\\Mappers\\OpportunityFieldMapper;\nuse Jiminny\\Repositories\\Crm\\ProfileRepository;\nuse Jiminny\\Repositories\\Crm\\OpportunityRepository;\nuse Jiminny\\Models\\Crm\\Profile;\nuse Jiminny\\Services\\Crm\\CrmObjects\\CrmObjectsRepository;\n\nclass Service extends BaseService implements\n IntegrationAppInterface,\n SyncCrmEntitiesInterface,\n SyncCrmMetadataInterface,\n ImportsBusinessProcessesInterface,\n RemoteEntityManipulationInterface,\n LayoutManagementInterface,\n SettingsInterface,\n MatchCrmEntitiesInterface,\n RemoteEntityLookupInterface,\n RemoteNoteEntityManipulationInterface,\n SendSummaryToCrmInterface,\n UrlGeneratorInterface,\n FetchRelatedActivityInterface\n{\n use SyncCrmMetadataTrait;\n use SyncCrmEntitiesTrait;\n use SystemStateTrait;\n use LayoutTrait;\n use NotSupportedTrait;\n use MatchProspectsTrait;\n use SyncCrmFieldsTrait;\n\n public const string CALL_TYPE_MISSED = 'Missed';\n public const string CALL_TYPE_INBOUND = 'Inbound';\n public const string CALL_TYPE_OUTBOUND = 'Outbound';\n public const string RELATIONSHIP_OPPORTUNITY = 'Deals';\n public const string RELATIONSHIP_LEAD = 'Leads';\n public const string RELATIONSHIP_ACCOUNT = 'Accounts';\n\n /**\n * @var ClientInterface&DataClient\n */\n protected $client;\n\n protected ?User $invokedUser = null;\n\n protected ?GenerateProviderUrlInterface $crmUrlGenerator = null;\n\n public function __construct(\n DataClient $client,\n LoggerInterface $logger,\n ) {\n parent::__construct();\n $this->client = $client;\n $this->logger = $logger;\n }\n\n public function getDisplayName(): string\n {\n return Providers::getProviderDisplayName(\n Providers::getCrmIntegrationSlug($this->config)\n );\n }\n\n /**\n * @throws \\Exception\n */\n public function setUser(User $user): void\n {\n $this->configureSentryScope($user);\n $this->invokedUser = $user;\n\n $this->team = $user->getTeam();\n $teamOwner = $this->team->getOwner();\n\n $this->setConfiguration($user->getTeam()->getCrmConfiguration());\n $this->setEditionConfiguration(Providers::getCrmIntegrationSlug($this->config));\n $this->setCrmUrlGenerator($this->config);\n\n $this->client->setTeam($this->team);\n $socialAccount = $teamOwner?->getSocialAccount('integration-app');\n if ($socialAccount === null) {\n $this->logger->info('[integration-app] Social account not found', [\n 'teamId' => $this->team->getId(),\n 'teamOwnerId' => $teamOwner?->getId(),\n 'userId' => $user->getId(),\n ]);\n\n throw new SocialAccountNotFoundException('Social account not found!');\n }\n $this->client->setSocialAccount($socialAccount);\n\n // The CRM Service is properly bootstrapped, and supports remote operations\n $this->connect();\n }\n\n public function normalizeValue(string $fieldType, string $fieldValue, bool $internal = false): string\n {\n return $fieldValue;\n }\n\n public function find(string $name, array $scopes): array\n {\n /** @var LocalSearch $localSearch */\n $localSearch = app(LocalSearch::class);\n $localSearch->setConfiguration($this->config);\n $localSearch->setCountryCode($this->invokedUser->getCountryCode());\n\n return $localSearch->search($name);\n\n // if (! empty($localMatch)) {\n // return $localMatch;\n // }\n //\n // /** @var RemoteSearch $remoteSearch */\n // $remoteSearch = app(RemoteSearch::class);\n // $remoteSearch->setClient($this->client);\n // $remoteSearch->setConfiguration($this->config);\n //\n // return $remoteSearch->search($name);\n }\n\n public function findOpportunities(?string $crmAccountId, ?string $crmContactId, ?int $userId = null): array\n {\n $data = [];\n $ownerData = [];\n\n $account = $this->getAccount($crmAccountId, $crmContactId);\n if ($account === null) {\n return [];\n }\n\n $ownerId = $this->getOwnerId($userId);\n\n try {\n $opportunityRepository = app(OpportunityRepository::class);\n $opportunities = $opportunityRepository->findAllByConfigurationAndAccountId(\n $this->config,\n $account->getId()\n );\n\n foreach ($opportunities as $opportunity) {\n /** @var Opportunity $opportunity */\n $record = $this->buildOpportunityData($opportunity);\n\n if ($ownerId && $opportunity->getOwnerId() === $ownerId) {\n $ownerData[] = $record;\n }\n\n $data[] = $record;\n }\n\n if (! empty($ownerData)) {\n return $ownerData;\n }\n\n return $data;\n } catch (\\Exception $e) {\n $this->logger->info('[integration-app] Failed to fetch opportunities', [\n 'contact' => $crmContactId,\n 'account' => $crmAccountId,\n 'owner' => $ownerId,\n 'error' => $e->getMessage(),\n ]);\n\n return $data;\n }\n }\n\n private function getOwnerId(?int $userId = null): ?string\n {\n if (! $userId) {\n return null;\n }\n\n $profileRepository = app(ProfileRepository::class);\n $profile = $profileRepository->findProfileByUserId($this->config, $userId);\n\n return $profile instanceof Profile ? $profile->getCrmProviderId() : null;\n }\n\n private function getAccount(?string $crmAccountId = null, ?string $crmContactId = null): ?Account\n {\n $crmRepository = app(CrmObjectsRepository::class);\n\n if ($crmAccountId === null) {\n $contact = $crmRepository->findContactByCrmProviderId($this->config, $crmContactId);\n\n return $contact->getAccount();\n }\n\n return $crmRepository->findAccountByCrmProviderId($this->config, $crmAccountId);\n }\n\n private function buildOpportunityData(Opportunity $opportunity): array\n {\n $record = [\n 'crmId' => $opportunity->getCrmProviderId(),\n 'name' => $opportunity->getName(),\n 'won' => $opportunity->isWon(),\n 'closed' => $opportunity->isClosed(),\n ];\n\n if (! empty($opportunity->getFormattedValueAttribute())) {\n $record['value'] = $opportunity->getFormattedValueAttribute();\n }\n\n if (! empty($opportunity->getStage())) {\n $record['stage'] = [\n 'id' => $opportunity->getStage()->getUuid(),\n 'name' => $opportunity->getStage()->getName(),\n ];\n }\n\n return $record;\n }\n\n public function updateRecord(string $objectType, string $objectId, array $data, array $headers = []): void\n {\n $data = [\n 'data' => $this->normalizeData($objectType, $data),\n ];\n\n $this->client->updateRecordById($objectType, $objectId, $data);\n }\n\n private function normalizeData(string $objectType, array $data): array\n {\n $fieldMapper = $this->getFieldMapper($objectType);\n\n if (! $fieldMapper instanceof FieldMapperInterface) {\n return $data;\n }\n\n return $fieldMapper->mapToCrmFields($data);\n }\n\n private function getFieldMapper(string $objectType): ?FieldMapperInterface\n {\n if ($objectType === self::OBJECT_OPPORTUNITY) {\n return app(OpportunityFieldMapper::class);\n }\n\n if ($objectType === self::OBJECT_LEAD) {\n return app(LeadFieldMapper::class);\n }\n\n return null;\n }\n\n public function getRecord(string $objectType, string $objectId, array $fields = []): array\n {\n return $this->client->getRecordById($objectType, $objectId);\n }\n\n public function getConfiguration(): Configuration\n {\n return $this->config;\n }\n\n public function setConfiguration(Configuration $config): void\n {\n $this->clearExternalMapCache();\n\n $this->config = $config;\n }\n\n private function setEditionConfiguration(string $provider): void\n {\n $this->editionConfig = app(IntegrationConfigFactory::class)->create($provider);\n }\n\n public function setCrmUrlGenerator(Configuration $config): void\n {\n $this->crmUrlGenerator = app(IntegrationAppCrmGeneratorFactory::class)->create($config);\n }\n\n public function getCrmUrlGenerator(): ?GenerateProviderUrlInterface\n {\n if ($this->crmUrlGenerator === null) {\n $this->setCrmUrlGenerator($this->config);\n }\n\n return $this->crmUrlGenerator;\n }\n\n public function subscribeEntityEvents(bool $enableTrigger = true): void\n {\n $eventStates = $this->client->updateEntityEventsState($enableTrigger);\n\n $this->logger->info('[integration-app] Change team entity events subscription', [\n 'teamId' => $this->team->getId(),\n 'teamName' => $this->team->getName(),\n 'states' => $eventStates,\n 'action' => $enableTrigger ? 'subscribe' : 'unsubscribe',\n ]);\n }\n\n #[\\Override] public function supportsNotes(): bool\n {\n return $this->editionConfig->supportsNotes();\n }\n\n #[\\Override] public function saveNote(\n string $title,\n string $body,\n string $objectId,\n ?NoteObject $noteObject = null,\n ): ?string {\n if ($noteObject === null) {\n return null;\n }\n\n $notePayload = [\n 'title' => $title,\n 'content' => $body,\n 'objectId' => $objectId,\n 'objectType' => $noteObject->value,\n ];\n\n $result = $this->client->createNote($notePayload);\n\n // debug saving note response\n $this->logger->info('[integration-app] createNote response', [\n 'objectId' => $objectId,\n 'objectType' => $noteObject->value,\n 'result' => $result,\n 'hasId' => isset($result['id']),\n ]);\n\n return $result['id'] ?? null;\n }\n\n /**\n * @throws CrmException\n */\n #[\\Override] public function saveActivity(Activity $activity): Activity\n {\n $this->logger->info('[integration-app] saveActivity', [\n 'activity' => $activity->getUuid(),\n 'type' => $activity->getType(),\n ]);\n\n if ($activity->getCrmType() === Activity::TYPE_CONFERENCE) {\n $crmActivity = $this->saveMeeting($activity);\n } elseif (in_array($activity->getType(), [Activity::TYPE_SOFTPHONE, Activity::TYPE_SOFTPHONE_INBOUND])) {\n $crmActivity = $this->saveCall($activity);\n } else {\n throw new CrmException('Unsupported activity type');\n }\n\n $crmActivityId = $crmActivity['id'] ?? null;\n\n if ($crmActivityId !== null) {\n $activity->crm_provider_id = $crmActivityId;\n $activity->save();\n\n $this->logger->info('[integration-app] Activity successfully logged to CRM', [\n 'activity' => $activity->getUuid(),\n 'type' => $activity->getType(),\n 'crmId' => $crmActivityId,\n ]);\n }\n\n return $activity;\n }\n\n public function saveMeeting(Activity $activity): array\n {\n $decorateActivity = app(DecorateActivity::class);\n\n $meetingPayload = [\n 'Event_Title' => $decorateActivity->generateTitle($activity),\n 'Start_DateTime' => $activity->getActualStartTime()->toIso8601String(),\n 'End_DateTime' => $activity->getActualEndTime()->toIso8601String(),\n 'ownerId' => $this->getActivityOwnerId($activity),\n ];\n\n $payload = array_merge($meetingPayload, $this->attachToProspect($activity));\n\n if ($activity->hasCrmProviderId()) {\n $crmId = $activity->getCrmProviderId();\n $meeting = $this->client->getMeeting($crmId);\n\n $oldDescription = $meeting['fields']['Description'] ?? null;\n $payload['Description'] = $decorateActivity->generateUpdatedDescription($oldDescription, $activity);\n\n $this->logger->info('[integration-app] CRM update meeting', [\n 'activity' => $activity->getUuid(),\n 'crm_id' => $crmId,\n 'payload' => $payload,\n ]);\n\n return $this->client->updateMeeting($crmId, $payload);\n }\n\n $payload['Description'] = $decorateActivity->generateDescription($activity);\n\n $this->logger->info('[integration-app] CRM log meeting', [\n 'activity' => $activity->getUuid(),\n 'payload' => $payload,\n ]);\n\n return $this->client->createMeeting($payload);\n }\n\n public function saveCall(Activity $activity): array\n {\n $decorateActivity = app(DecorateActivity::class);\n\n $callPayload = [\n 'Call_Type' => $this->getCallType($activity),\n 'Call_Start_Time' => $activity->getActualStartTime()->toIso8601String(),\n 'Call_Duration' => $activity->getDuration(),\n 'name' => $decorateActivity->generateTitle($activity),\n 'ownerId' => $this->getActivityOwnerId($activity),\n ];\n\n $payload = array_merge($callPayload, $this->attachToProspect($activity));\n\n if ($activity->hasCrmProviderId()) {\n $crmId = $activity->getCrmProviderId();\n $call = $this->client->getCall($crmId);\n\n $oldDescription = $call['fields']['Description'] ?? null;\n $payload['description'] = $decorateActivity->generateUpdatedDescription($oldDescription, $activity);\n\n $this->logger->info('[integration-app] CRM update call', [\n 'activity' => $activity->getUuid(),\n 'crm_id' => $crmId,\n 'payload' => $payload,\n ]);\n\n return $this->client->updateCall($crmId, $payload);\n }\n\n $payload['description'] = $decorateActivity->generateDescription($activity);\n\n $this->logger->info('[integration-app] CRM log call', [\n 'activity' => $activity->getUuid(),\n 'payload' => $payload,\n ]);\n\n return $this->client->createCall($payload);\n }\n\n private function getCallType(Activity $activity): string\n {\n if ($activity->getStatus() === Activity::STATUS_NO_ANSWER) {\n return self::CALL_TYPE_MISSED;\n }\n\n return $activity->getType() === Activity::TYPE_SOFTPHONE_INBOUND ? self::CALL_TYPE_INBOUND : self::CALL_TYPE_OUTBOUND;\n }\n\n private function attachToProspect(Activity $activity): array\n {\n $payload = [];\n\n if ($activity->hasContact()) {\n $payload['contactId'] = $activity->getContact()->getCrmProviderId();\n }\n\n if ($activity->hasOpportunity()) {\n return array_merge(\n $payload,\n $this->buildBasicPayload(\n self::RELATIONSHIP_OPPORTUNITY,\n $activity->getOpportunity()->getCrmProviderId()\n )\n );\n }\n\n if ($activity->hasAccount() && ! $activity->getAccount()->getIsInternal()) {\n return array_merge(\n $payload,\n $this->buildBasicPayload(\n self::RELATIONSHIP_ACCOUNT,\n $activity->getAccount()->getCrmProviderId()\n )\n );\n }\n\n if ($activity->hasLead()) {\n $payload = $this->handleLeadPayload($activity);\n }\n\n return $payload;\n }\n\n private function handleLeadPayload(Activity $activity): array\n {\n $freshLead = $this->syncLead($activity->getLead()->getCrmProviderId());\n $lead = $freshLead ?? $activity->getLead();\n\n if ($lead->getConvertedAt() === null) {\n return $this->buildBasicPayload(self::RELATIONSHIP_LEAD, $lead->getCrmProviderId());\n }\n\n $activity->lead_id = null;\n\n if ($lead->hasAccount()) {\n $account = $lead->getAccount();\n $activity->account_id = $account->getId();\n $payload = $this->buildBasicPayload(self::RELATIONSHIP_ACCOUNT, $account->getCrmProviderId());\n } else {\n $payload = [];\n }\n\n if ($lead->hasOpportunity()) {\n $opportunity = $lead->getOpportunity();\n $payload = $this->buildBasicPayload(self::RELATIONSHIP_OPPORTUNITY, $opportunity->getCrmProviderId());\n $activity->opportunity_id = $opportunity->getId();\n $activity->value = $opportunity->value;\n $activity->stage_id = $opportunity->stage_id;\n } else {\n $activity->stage_id = null;\n }\n\n if ($lead->hasContact()) {\n $contact = $lead->getContact();\n $payload['contactId'] = $contact->getCrmProviderId();\n $activity->contact_id = $contact->getId();\n }\n\n $activity->save();\n event(new ActivityLeadConverted($activity, $lead));\n\n $this->logger->info('[integration-app] Lead converted', [\n 'activityUuid' => $activity->getUuid(),\n 'leadUuid' => $lead->getUuid(),\n ]);\n\n return $payload;\n }\n\n private function buildBasicPayload(string $type, string $id): array\n {\n return [\n 'type' => $type,\n 'id' => $id,\n ];\n }\n private function getActivityOwnerId(Activity $activity): ?string\n {\n $ownerId = null;\n if ($activity->hasUser() && $activity->getUser()->getProfile() !== null) {\n $ownerId = $activity->getUser()->getProfile()->getCrmProviderId();\n }\n\n return $ownerId;\n }\n\n #[\\Override] public function saveFollowupActivity(Activity $activity, array $fields): ?string\n {\n $taskPayload = [\n 'subject' => $fields['subject'],\n 'dueTime' => isset($fields['dueDate']) ? Carbon::parse($fields['dueDate'])->format('Y-m-d') : null,\n 'ownerId' => $this->getActivityOwnerId($activity),\n ];\n\n if (isset($fields['status'])) {\n $taskPayload['status'] = $fields['status'];\n }\n\n if (isset($fields['priority'])) {\n $taskPayload['priority'] = $fields['priority'];\n }\n\n if (isset($fields['content'])) {\n $taskPayload['content'] = $fields['content'];\n }\n\n $payload = array_merge($taskPayload, $this->attachToProspect($activity));\n\n $this->logger->info('[integration-app] CRM log follow up task', [\n 'activity' => $activity->getUuid(),\n 'payload' => $payload,\n ]);\n\n $task = $this->client->createTask($payload);\n\n return $task['id'] ?? null;\n }\n\n #[\\Override] public function saveTranscriptionSummaryAsNote(\n ActivityContract $activity,\n string $title,\n string $body,\n ?string $objectId,\n ?NoteObject $noteObject = null,\n ): ?string {\n // We have to find a way to store the transcription summary\n // This might be possible either by Tasks, Events, Engagements & Notes\n // Find what the CRM supports and save the note with the appropriate object(eg Notes)\n\n // For now use only Notes as both ZOHO & Salesforce support them.\n if ($this->supportsNotes() && $objectId !== null) {\n $this->logger->info('[integration-app] saving note', [\n 'activityId' => $activity->getUuid(),\n 'objectId' => $objectId,\n ]);\n\n return $this->saveNote($title, $body, $objectId, $noteObject);\n }\n\n $this->logger->info('[integration-app] skip saveTranscriptionSummaryAsNote', [\n 'activityId' => $activity->getUuid(),\n 'supportsNotes' => $this->supportsNotes(),\n 'objectId' => $objectId,\n ]);\n\n return null;\n }\n\n public function generateProviderUrl(string $providerId, string $objectType): ?string\n {\n return $this->getCrmUrlGenerator()?->generateProviderUrl($providerId, $objectType);\n }\n\n public function updateStage($crmObject, Stage $stage): void\n {\n $objectType = $stage->getType();\n $objectId = $crmObject->getCrmProviderId();\n $params = ['stageName' => $stage->getCrmProviderId()];\n\n $this->logger->info('[integration-app] updateStage', [\n 'objectType' => $objectType,\n 'objectId' => $objectId,\n 'params' => $params,\n ]);\n\n $data = [\n 'data' => $this->normalizeData($objectType, $params),\n ];\n\n\n if ($objectType === Stage::TYPE_LEAD) {\n $this->client->updateLead($objectId, $data);\n } else {\n $this->client->updateDeal($objectId, $data);\n }\n }\n\n /**\n * @throws \\Exception\n */\n public function fetchAndAssociateRelatedActivity(Activity $activity): ?Activity\n {\n if ($activity->getCrm()?->getEdition() !== IntegrationAppProviders::ZOHO_CRM) {\n return null;\n }\n\n if (! $activity->isTypeConference()) {\n return null;\n }\n\n // The related activity is already linked.\n if ($activity->hasCrmProviderId()) {\n return $activity;\n }\n\n if ($activity->hasActualStartTime() === false) {\n return null;\n }\n\n return $this->fetchAndAssociateZohoRelatedActivity($activity);\n }\n\n public function fetchAndAssociateZohoRelatedActivity(Activity $activity): ?Activity\n {\n try {\n $meeting = $this->fetchRelatedZohoActivity($activity);\n if (empty($meeting)) {\n $this->logger->info('[integration-app] fetchRelatedZohoActivity No related activity found', [\n 'activity' => $activity->getUuid(),\n ]);\n\n return null;\n }\n\n $decorateActivity = app(DecorateActivity::class);\n $oldDescription = $meeting['Description'] ?? '';\n $updatedDescription = $decorateActivity->generateUpdatedDescription($oldDescription, $activity);\n\n $this->logger->info('[integration-app] fetchAndAssociateZohoRelatedActivity updating related activity', [\n 'activity' => $activity->getUuid(),\n 'description' => $updatedDescription,\n ]);\n\n $this->client->updateMeeting($meeting['id'], ['Description' => $updatedDescription]);\n\n // Update our activity to reflect the remote data.\n $activity->update([\n 'crm_provider_id' => $meeting['id'],\n 'summary' => $meeting['Description'],\n ]);\n\n return $activity;\n } catch (\\Exception $exception) {\n \\Sentry::captureException($exception);\n\n throw $exception;\n }\n }\n\n public function fetchRelatedZohoActivity(Activity $activity): array\n {\n [$from, $to] = $this->getFromToDates($activity);\n\n $start = $from?->toIso8601String(); // e.g., 2025-07-01T00:00:00+00:00\n $end = $to?->toIso8601String(); // e.g., 2025-07-14T23:59:59+00:00\n if ($start === null || $end === null) {\n $this->logger->info(\n '[integration-app] fetchRelatedZohoActivity missing start or end date',\n [\n 'activity' => $activity->getUuid(),\n 'start' => $start,\n 'end' => $end,\n 'from' => $from,\n 'to' => $to,\n ]\n );\n\n return [];\n }\n\n $whoId = null;\n $whatId = null;\n $criteriaParts = [];\n\n if ($activity->getContact()) {\n $whoId = $activity->getContact()->getCrmProviderId();\n $criteriaParts[] = \"(Who_Id:equals:$whoId)\";\n }\n\n if ($activity->getOpportunity()) {\n $whatId = $activity->getOpportunity()->getCrmProviderId();\n } elseif ($activity->getAccount() && $activity->getAccount()->getIsInternal() === false) {\n $whatId = $activity->getAccount()->getCrmProviderId();\n } elseif ($activity->getLead()) {\n $whatId = $activity->getLead()->getCrmProviderId();\n }\n\n if ($whatId !== null) {\n $criteriaParts[] = \"(What_Id:equals:$whatId)\";\n }\n\n if ($whoId === null && $whatId === null) {\n $this->logger->info(\n '[integration-app] fetchRelatedZohoActivity cannot find prospect',\n [\n 'activity' => $activity->getUuid(),\n ]\n );\n\n return [];\n }\n\n $criteriaParts[] = \"(Start_DateTime:greater_equal:$start)\";\n $criteriaParts[] = \"(End_DateTime:less_equal:$end)\";\n\n $criteria = implode(' AND ', $criteriaParts);\n\n $params = [\n 'criteria' => $criteria,\n 'sort_by' => 'Modified_Time',\n 'sort_order' => 'desc',\n ];\n\n $this->logger->info(\n '[integration-app] fetchRelatedZohoActivity searching for related activity',\n [\n 'activity' => $activity->getUuid(),\n 'params' => $params,\n ]\n );\n\n $meetings = $this->client->searchMeetings($params);\n if (! empty($meetings)) {\n return $meetings[0];\n }\n\n return [];\n }\n\n private function getFromToDates(Activity $activity): array\n {\n $calendarEvent = $activity->calendarEvent()->first();\n\n $from = $calendarEvent?->getStartTime();\n $to = $calendarEvent?->getEndTime();\n\n if (! $from || ! $to) {\n $from = $activity->hasScheduledStartTime()\n ? $activity->getScheduledStartTime()\n : $activity->getActualStartTime();\n\n $to = $activity->hasScheduledEndTime()\n ? $activity->getScheduledEndTime()->addMinutes(15)\n : $activity->getActualEndTime();\n }\n\n return [$from, $to];\n }\n}","depth":4,"on_screen":true,"value":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Services\\Crm\\IntegrationApp;\n\nuse Carbon\\Carbon;\nuse Jiminny\\Contracts\\Crm\\Providers;\nuse Jiminny\\Contracts\\Services\\Crm\\ClientInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\FetchRelatedActivityInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\ImportsBusinessProcessesInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\LayoutManagementInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\MatchCrmEntitiesInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\Provider\\IntegrationAppInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\RemoteEntityLookupInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\RemoteEntityManipulationInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\RemoteNoteEntityManipulationInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\SendSummaryToCrmInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\SettingsInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\SyncCrmEntitiesInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\SyncCrmMetadataInterface;\nuse Jiminny\\Events\\Activities\\Crm\\ActivityLeadConverted;\nuse Jiminny\\Exceptions\\CrmException;\nuse Jiminny\\Exceptions\\SocialAccountNotFoundException;\nuse Jiminny\\Jobs\\Crm\\NoteObject;\nuse Jiminny\\Models\\Account;\nuse Jiminny\\Models\\Activity;\nuse Jiminny\\Models\\Contracts\\ActivityContract;\nuse Jiminny\\Models\\Crm\\Configuration;\nuse Jiminny\\Models\\Opportunity;\nuse Jiminny\\Models\\Stage;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Services\\Crm\\BaseService;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\Config\\IntegrationAppProviders;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\Config\\IntegrationConfigFactory;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\DTO\\Mappers\\FieldMapperInterface;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\DTO\\Mappers\\LeadFieldMapper;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\DTO\\Utils\\GenerateProviderUrlInterface;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\DTO\\Utils\\IntegrationAppCrmGeneratorFactory;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\DTO\\Utils\\UrlGeneratorInterface;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\ServiceTraits\\SyncCrmFieldsTrait;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\ServiceTraits\\SystemStateTrait;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\ServiceTraits\\LayoutTrait;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\ServiceTraits\\MatchProspectsTrait;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\ServiceTraits\\NotSupportedTrait;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\ServiceTraits\\SyncCrmEntitiesTrait;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\ServiceTraits\\SyncCrmMetadataTrait;\nuse Psr\\Log\\LoggerInterface;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\DTO\\Mappers\\OpportunityFieldMapper;\nuse Jiminny\\Repositories\\Crm\\ProfileRepository;\nuse Jiminny\\Repositories\\Crm\\OpportunityRepository;\nuse Jiminny\\Models\\Crm\\Profile;\nuse Jiminny\\Services\\Crm\\CrmObjects\\CrmObjectsRepository;\n\nclass Service extends BaseService implements\n IntegrationAppInterface,\n SyncCrmEntitiesInterface,\n SyncCrmMetadataInterface,\n ImportsBusinessProcessesInterface,\n RemoteEntityManipulationInterface,\n LayoutManagementInterface,\n SettingsInterface,\n MatchCrmEntitiesInterface,\n RemoteEntityLookupInterface,\n RemoteNoteEntityManipulationInterface,\n SendSummaryToCrmInterface,\n UrlGeneratorInterface,\n FetchRelatedActivityInterface\n{\n use SyncCrmMetadataTrait;\n use SyncCrmEntitiesTrait;\n use SystemStateTrait;\n use LayoutTrait;\n use NotSupportedTrait;\n use MatchProspectsTrait;\n use SyncCrmFieldsTrait;\n\n public const string CALL_TYPE_MISSED = 'Missed';\n public const string CALL_TYPE_INBOUND = 'Inbound';\n public const string CALL_TYPE_OUTBOUND = 'Outbound';\n public const string RELATIONSHIP_OPPORTUNITY = 'Deals';\n public const string RELATIONSHIP_LEAD = 'Leads';\n public const string RELATIONSHIP_ACCOUNT = 'Accounts';\n\n /**\n * @var ClientInterface&DataClient\n */\n protected $client;\n\n protected ?User $invokedUser = null;\n\n protected ?GenerateProviderUrlInterface $crmUrlGenerator = null;\n\n public function __construct(\n DataClient $client,\n LoggerInterface $logger,\n ) {\n parent::__construct();\n $this->client = $client;\n $this->logger = $logger;\n }\n\n public function getDisplayName(): string\n {\n return Providers::getProviderDisplayName(\n Providers::getCrmIntegrationSlug($this->config)\n );\n }\n\n /**\n * @throws \\Exception\n */\n public function setUser(User $user): void\n {\n $this->configureSentryScope($user);\n $this->invokedUser = $user;\n\n $this->team = $user->getTeam();\n $teamOwner = $this->team->getOwner();\n\n $this->setConfiguration($user->getTeam()->getCrmConfiguration());\n $this->setEditionConfiguration(Providers::getCrmIntegrationSlug($this->config));\n $this->setCrmUrlGenerator($this->config);\n\n $this->client->setTeam($this->team);\n $socialAccount = $teamOwner?->getSocialAccount('integration-app');\n if ($socialAccount === null) {\n $this->logger->info('[integration-app] Social account not found', [\n 'teamId' => $this->team->getId(),\n 'teamOwnerId' => $teamOwner?->getId(),\n 'userId' => $user->getId(),\n ]);\n\n throw new SocialAccountNotFoundException('Social account not found!');\n }\n $this->client->setSocialAccount($socialAccount);\n\n // The CRM Service is properly bootstrapped, and supports remote operations\n $this->connect();\n }\n\n public function normalizeValue(string $fieldType, string $fieldValue, bool $internal = false): string\n {\n return $fieldValue;\n }\n\n public function find(string $name, array $scopes): array\n {\n /** @var LocalSearch $localSearch */\n $localSearch = app(LocalSearch::class);\n $localSearch->setConfiguration($this->config);\n $localSearch->setCountryCode($this->invokedUser->getCountryCode());\n\n return $localSearch->search($name);\n\n // if (! empty($localMatch)) {\n // return $localMatch;\n // }\n //\n // /** @var RemoteSearch $remoteSearch */\n // $remoteSearch = app(RemoteSearch::class);\n // $remoteSearch->setClient($this->client);\n // $remoteSearch->setConfiguration($this->config);\n //\n // return $remoteSearch->search($name);\n }\n\n public function findOpportunities(?string $crmAccountId, ?string $crmContactId, ?int $userId = null): array\n {\n $data = [];\n $ownerData = [];\n\n $account = $this->getAccount($crmAccountId, $crmContactId);\n if ($account === null) {\n return [];\n }\n\n $ownerId = $this->getOwnerId($userId);\n\n try {\n $opportunityRepository = app(OpportunityRepository::class);\n $opportunities = $opportunityRepository->findAllByConfigurationAndAccountId(\n $this->config,\n $account->getId()\n );\n\n foreach ($opportunities as $opportunity) {\n /** @var Opportunity $opportunity */\n $record = $this->buildOpportunityData($opportunity);\n\n if ($ownerId && $opportunity->getOwnerId() === $ownerId) {\n $ownerData[] = $record;\n }\n\n $data[] = $record;\n }\n\n if (! empty($ownerData)) {\n return $ownerData;\n }\n\n return $data;\n } catch (\\Exception $e) {\n $this->logger->info('[integration-app] Failed to fetch opportunities', [\n 'contact' => $crmContactId,\n 'account' => $crmAccountId,\n 'owner' => $ownerId,\n 'error' => $e->getMessage(),\n ]);\n\n return $data;\n }\n }\n\n private function getOwnerId(?int $userId = null): ?string\n {\n if (! $userId) {\n return null;\n }\n\n $profileRepository = app(ProfileRepository::class);\n $profile = $profileRepository->findProfileByUserId($this->config, $userId);\n\n return $profile instanceof Profile ? $profile->getCrmProviderId() : null;\n }\n\n private function getAccount(?string $crmAccountId = null, ?string $crmContactId = null): ?Account\n {\n $crmRepository = app(CrmObjectsRepository::class);\n\n if ($crmAccountId === null) {\n $contact = $crmRepository->findContactByCrmProviderId($this->config, $crmContactId);\n\n return $contact->getAccount();\n }\n\n return $crmRepository->findAccountByCrmProviderId($this->config, $crmAccountId);\n }\n\n private function buildOpportunityData(Opportunity $opportunity): array\n {\n $record = [\n 'crmId' => $opportunity->getCrmProviderId(),\n 'name' => $opportunity->getName(),\n 'won' => $opportunity->isWon(),\n 'closed' => $opportunity->isClosed(),\n ];\n\n if (! empty($opportunity->getFormattedValueAttribute())) {\n $record['value'] = $opportunity->getFormattedValueAttribute();\n }\n\n if (! empty($opportunity->getStage())) {\n $record['stage'] = [\n 'id' => $opportunity->getStage()->getUuid(),\n 'name' => $opportunity->getStage()->getName(),\n ];\n }\n\n return $record;\n }\n\n public function updateRecord(string $objectType, string $objectId, array $data, array $headers = []): void\n {\n $data = [\n 'data' => $this->normalizeData($objectType, $data),\n ];\n\n $this->client->updateRecordById($objectType, $objectId, $data);\n }\n\n private function normalizeData(string $objectType, array $data): array\n {\n $fieldMapper = $this->getFieldMapper($objectType);\n\n if (! $fieldMapper instanceof FieldMapperInterface) {\n return $data;\n }\n\n return $fieldMapper->mapToCrmFields($data);\n }\n\n private function getFieldMapper(string $objectType): ?FieldMapperInterface\n {\n if ($objectType === self::OBJECT_OPPORTUNITY) {\n return app(OpportunityFieldMapper::class);\n }\n\n if ($objectType === self::OBJECT_LEAD) {\n return app(LeadFieldMapper::class);\n }\n\n return null;\n }\n\n public function getRecord(string $objectType, string $objectId, array $fields = []): array\n {\n return $this->client->getRecordById($objectType, $objectId);\n }\n\n public function getConfiguration(): Configuration\n {\n return $this->config;\n }\n\n public function setConfiguration(Configuration $config): void\n {\n $this->clearExternalMapCache();\n\n $this->config = $config;\n }\n\n private function setEditionConfiguration(string $provider): void\n {\n $this->editionConfig = app(IntegrationConfigFactory::class)->create($provider);\n }\n\n public function setCrmUrlGenerator(Configuration $config): void\n {\n $this->crmUrlGenerator = app(IntegrationAppCrmGeneratorFactory::class)->create($config);\n }\n\n public function getCrmUrlGenerator(): ?GenerateProviderUrlInterface\n {\n if ($this->crmUrlGenerator === null) {\n $this->setCrmUrlGenerator($this->config);\n }\n\n return $this->crmUrlGenerator;\n }\n\n public function subscribeEntityEvents(bool $enableTrigger = true): void\n {\n $eventStates = $this->client->updateEntityEventsState($enableTrigger);\n\n $this->logger->info('[integration-app] Change team entity events subscription', [\n 'teamId' => $this->team->getId(),\n 'teamName' => $this->team->getName(),\n 'states' => $eventStates,\n 'action' => $enableTrigger ? 'subscribe' : 'unsubscribe',\n ]);\n }\n\n #[\\Override] public function supportsNotes(): bool\n {\n return $this->editionConfig->supportsNotes();\n }\n\n #[\\Override] public function saveNote(\n string $title,\n string $body,\n string $objectId,\n ?NoteObject $noteObject = null,\n ): ?string {\n if ($noteObject === null) {\n return null;\n }\n\n $notePayload = [\n 'title' => $title,\n 'content' => $body,\n 'objectId' => $objectId,\n 'objectType' => $noteObject->value,\n ];\n\n $result = $this->client->createNote($notePayload);\n\n // debug saving note response\n $this->logger->info('[integration-app] createNote response', [\n 'objectId' => $objectId,\n 'objectType' => $noteObject->value,\n 'result' => $result,\n 'hasId' => isset($result['id']),\n ]);\n\n return $result['id'] ?? null;\n }\n\n /**\n * @throws CrmException\n */\n #[\\Override] public function saveActivity(Activity $activity): Activity\n {\n $this->logger->info('[integration-app] saveActivity', [\n 'activity' => $activity->getUuid(),\n 'type' => $activity->getType(),\n ]);\n\n if ($activity->getCrmType() === Activity::TYPE_CONFERENCE) {\n $crmActivity = $this->saveMeeting($activity);\n } elseif (in_array($activity->getType(), [Activity::TYPE_SOFTPHONE, Activity::TYPE_SOFTPHONE_INBOUND])) {\n $crmActivity = $this->saveCall($activity);\n } else {\n throw new CrmException('Unsupported activity type');\n }\n\n $crmActivityId = $crmActivity['id'] ?? null;\n\n if ($crmActivityId !== null) {\n $activity->crm_provider_id = $crmActivityId;\n $activity->save();\n\n $this->logger->info('[integration-app] Activity successfully logged to CRM', [\n 'activity' => $activity->getUuid(),\n 'type' => $activity->getType(),\n 'crmId' => $crmActivityId,\n ]);\n }\n\n return $activity;\n }\n\n public function saveMeeting(Activity $activity): array\n {\n $decorateActivity = app(DecorateActivity::class);\n\n $meetingPayload = [\n 'Event_Title' => $decorateActivity->generateTitle($activity),\n 'Start_DateTime' => $activity->getActualStartTime()->toIso8601String(),\n 'End_DateTime' => $activity->getActualEndTime()->toIso8601String(),\n 'ownerId' => $this->getActivityOwnerId($activity),\n ];\n\n $payload = array_merge($meetingPayload, $this->attachToProspect($activity));\n\n if ($activity->hasCrmProviderId()) {\n $crmId = $activity->getCrmProviderId();\n $meeting = $this->client->getMeeting($crmId);\n\n $oldDescription = $meeting['fields']['Description'] ?? null;\n $payload['Description'] = $decorateActivity->generateUpdatedDescription($oldDescription, $activity);\n\n $this->logger->info('[integration-app] CRM update meeting', [\n 'activity' => $activity->getUuid(),\n 'crm_id' => $crmId,\n 'payload' => $payload,\n ]);\n\n return $this->client->updateMeeting($crmId, $payload);\n }\n\n $payload['Description'] = $decorateActivity->generateDescription($activity);\n\n $this->logger->info('[integration-app] CRM log meeting', [\n 'activity' => $activity->getUuid(),\n 'payload' => $payload,\n ]);\n\n return $this->client->createMeeting($payload);\n }\n\n public function saveCall(Activity $activity): array\n {\n $decorateActivity = app(DecorateActivity::class);\n\n $callPayload = [\n 'Call_Type' => $this->getCallType($activity),\n 'Call_Start_Time' => $activity->getActualStartTime()->toIso8601String(),\n 'Call_Duration' => $activity->getDuration(),\n 'name' => $decorateActivity->generateTitle($activity),\n 'ownerId' => $this->getActivityOwnerId($activity),\n ];\n\n $payload = array_merge($callPayload, $this->attachToProspect($activity));\n\n if ($activity->hasCrmProviderId()) {\n $crmId = $activity->getCrmProviderId();\n $call = $this->client->getCall($crmId);\n\n $oldDescription = $call['fields']['Description'] ?? null;\n $payload['description'] = $decorateActivity->generateUpdatedDescription($oldDescription, $activity);\n\n $this->logger->info('[integration-app] CRM update call', [\n 'activity' => $activity->getUuid(),\n 'crm_id' => $crmId,\n 'payload' => $payload,\n ]);\n\n return $this->client->updateCall($crmId, $payload);\n }\n\n $payload['description'] = $decorateActivity->generateDescription($activity);\n\n $this->logger->info('[integration-app] CRM log call', [\n 'activity' => $activity->getUuid(),\n 'payload' => $payload,\n ]);\n\n return $this->client->createCall($payload);\n }\n\n private function getCallType(Activity $activity): string\n {\n if ($activity->getStatus() === Activity::STATUS_NO_ANSWER) {\n return self::CALL_TYPE_MISSED;\n }\n\n return $activity->getType() === Activity::TYPE_SOFTPHONE_INBOUND ? self::CALL_TYPE_INBOUND : self::CALL_TYPE_OUTBOUND;\n }\n\n private function attachToProspect(Activity $activity): array\n {\n $payload = [];\n\n if ($activity->hasContact()) {\n $payload['contactId'] = $activity->getContact()->getCrmProviderId();\n }\n\n if ($activity->hasOpportunity()) {\n return array_merge(\n $payload,\n $this->buildBasicPayload(\n self::RELATIONSHIP_OPPORTUNITY,\n $activity->getOpportunity()->getCrmProviderId()\n )\n );\n }\n\n if ($activity->hasAccount() && ! $activity->getAccount()->getIsInternal()) {\n return array_merge(\n $payload,\n $this->buildBasicPayload(\n self::RELATIONSHIP_ACCOUNT,\n $activity->getAccount()->getCrmProviderId()\n )\n );\n }\n\n if ($activity->hasLead()) {\n $payload = $this->handleLeadPayload($activity);\n }\n\n return $payload;\n }\n\n private function handleLeadPayload(Activity $activity): array\n {\n $freshLead = $this->syncLead($activity->getLead()->getCrmProviderId());\n $lead = $freshLead ?? $activity->getLead();\n\n if ($lead->getConvertedAt() === null) {\n return $this->buildBasicPayload(self::RELATIONSHIP_LEAD, $lead->getCrmProviderId());\n }\n\n $activity->lead_id = null;\n\n if ($lead->hasAccount()) {\n $account = $lead->getAccount();\n $activity->account_id = $account->getId();\n $payload = $this->buildBasicPayload(self::RELATIONSHIP_ACCOUNT, $account->getCrmProviderId());\n } else {\n $payload = [];\n }\n\n if ($lead->hasOpportunity()) {\n $opportunity = $lead->getOpportunity();\n $payload = $this->buildBasicPayload(self::RELATIONSHIP_OPPORTUNITY, $opportunity->getCrmProviderId());\n $activity->opportunity_id = $opportunity->getId();\n $activity->value = $opportunity->value;\n $activity->stage_id = $opportunity->stage_id;\n } else {\n $activity->stage_id = null;\n }\n\n if ($lead->hasContact()) {\n $contact = $lead->getContact();\n $payload['contactId'] = $contact->getCrmProviderId();\n $activity->contact_id = $contact->getId();\n }\n\n $activity->save();\n event(new ActivityLeadConverted($activity, $lead));\n\n $this->logger->info('[integration-app] Lead converted', [\n 'activityUuid' => $activity->getUuid(),\n 'leadUuid' => $lead->getUuid(),\n ]);\n\n return $payload;\n }\n\n private function buildBasicPayload(string $type, string $id): array\n {\n return [\n 'type' => $type,\n 'id' => $id,\n ];\n }\n private function getActivityOwnerId(Activity $activity): ?string\n {\n $ownerId = null;\n if ($activity->hasUser() && $activity->getUser()->getProfile() !== null) {\n $ownerId = $activity->getUser()->getProfile()->getCrmProviderId();\n }\n\n return $ownerId;\n }\n\n #[\\Override] public function saveFollowupActivity(Activity $activity, array $fields): ?string\n {\n $taskPayload = [\n 'subject' => $fields['subject'],\n 'dueTime' => isset($fields['dueDate']) ? Carbon::parse($fields['dueDate'])->format('Y-m-d') : null,\n 'ownerId' => $this->getActivityOwnerId($activity),\n ];\n\n if (isset($fields['status'])) {\n $taskPayload['status'] = $fields['status'];\n }\n\n if (isset($fields['priority'])) {\n $taskPayload['priority'] = $fields['priority'];\n }\n\n if (isset($fields['content'])) {\n $taskPayload['content'] = $fields['content'];\n }\n\n $payload = array_merge($taskPayload, $this->attachToProspect($activity));\n\n $this->logger->info('[integration-app] CRM log follow up task', [\n 'activity' => $activity->getUuid(),\n 'payload' => $payload,\n ]);\n\n $task = $this->client->createTask($payload);\n\n return $task['id'] ?? null;\n }\n\n #[\\Override] public function saveTranscriptionSummaryAsNote(\n ActivityContract $activity,\n string $title,\n string $body,\n ?string $objectId,\n ?NoteObject $noteObject = null,\n ): ?string {\n // We have to find a way to store the transcription summary\n // This might be possible either by Tasks, Events, Engagements & Notes\n // Find what the CRM supports and save the note with the appropriate object(eg Notes)\n\n // For now use only Notes as both ZOHO & Salesforce support them.\n if ($this->supportsNotes() && $objectId !== null) {\n $this->logger->info('[integration-app] saving note', [\n 'activityId' => $activity->getUuid(),\n 'objectId' => $objectId,\n ]);\n\n return $this->saveNote($title, $body, $objectId, $noteObject);\n }\n\n $this->logger->info('[integration-app] skip saveTranscriptionSummaryAsNote', [\n 'activityId' => $activity->getUuid(),\n 'supportsNotes' => $this->supportsNotes(),\n 'objectId' => $objectId,\n ]);\n\n return null;\n }\n\n public function generateProviderUrl(string $providerId, string $objectType): ?string\n {\n return $this->getCrmUrlGenerator()?->generateProviderUrl($providerId, $objectType);\n }\n\n public function updateStage($crmObject, Stage $stage): void\n {\n $objectType = $stage->getType();\n $objectId = $crmObject->getCrmProviderId();\n $params = ['stageName' => $stage->getCrmProviderId()];\n\n $this->logger->info('[integration-app] updateStage', [\n 'objectType' => $objectType,\n 'objectId' => $objectId,\n 'params' => $params,\n ]);\n\n $data = [\n 'data' => $this->normalizeData($objectType, $params),\n ];\n\n\n if ($objectType === Stage::TYPE_LEAD) {\n $this->client->updateLead($objectId, $data);\n } else {\n $this->client->updateDeal($objectId, $data);\n }\n }\n\n /**\n * @throws \\Exception\n */\n public function fetchAndAssociateRelatedActivity(Activity $activity): ?Activity\n {\n if ($activity->getCrm()?->getEdition() !== IntegrationAppProviders::ZOHO_CRM) {\n return null;\n }\n\n if (! $activity->isTypeConference()) {\n return null;\n }\n\n // The related activity is already linked.\n if ($activity->hasCrmProviderId()) {\n return $activity;\n }\n\n if ($activity->hasActualStartTime() === false) {\n return null;\n }\n\n return $this->fetchAndAssociateZohoRelatedActivity($activity);\n }\n\n public function fetchAndAssociateZohoRelatedActivity(Activity $activity): ?Activity\n {\n try {\n $meeting = $this->fetchRelatedZohoActivity($activity);\n if (empty($meeting)) {\n $this->logger->info('[integration-app] fetchRelatedZohoActivity No related activity found', [\n 'activity' => $activity->getUuid(),\n ]);\n\n return null;\n }\n\n $decorateActivity = app(DecorateActivity::class);\n $oldDescription = $meeting['Description'] ?? '';\n $updatedDescription = $decorateActivity->generateUpdatedDescription($oldDescription, $activity);\n\n $this->logger->info('[integration-app] fetchAndAssociateZohoRelatedActivity updating related activity', [\n 'activity' => $activity->getUuid(),\n 'description' => $updatedDescription,\n ]);\n\n $this->client->updateMeeting($meeting['id'], ['Description' => $updatedDescription]);\n\n // Update our activity to reflect the remote data.\n $activity->update([\n 'crm_provider_id' => $meeting['id'],\n 'summary' => $meeting['Description'],\n ]);\n\n return $activity;\n } catch (\\Exception $exception) {\n \\Sentry::captureException($exception);\n\n throw $exception;\n }\n }\n\n public function fetchRelatedZohoActivity(Activity $activity): array\n {\n [$from, $to] = $this->getFromToDates($activity);\n\n $start = $from?->toIso8601String(); // e.g., 2025-07-01T00:00:00+00:00\n $end = $to?->toIso8601String(); // e.g., 2025-07-14T23:59:59+00:00\n if ($start === null || $end === null) {\n $this->logger->info(\n '[integration-app] fetchRelatedZohoActivity missing start or end date',\n [\n 'activity' => $activity->getUuid(),\n 'start' => $start,\n 'end' => $end,\n 'from' => $from,\n 'to' => $to,\n ]\n );\n\n return [];\n }\n\n $whoId = null;\n $whatId = null;\n $criteriaParts = [];\n\n if ($activity->getContact()) {\n $whoId = $activity->getContact()->getCrmProviderId();\n $criteriaParts[] = \"(Who_Id:equals:$whoId)\";\n }\n\n if ($activity->getOpportunity()) {\n $whatId = $activity->getOpportunity()->getCrmProviderId();\n } elseif ($activity->getAccount() && $activity->getAccount()->getIsInternal() === false) {\n $whatId = $activity->getAccount()->getCrmProviderId();\n } elseif ($activity->getLead()) {\n $whatId = $activity->getLead()->getCrmProviderId();\n }\n\n if ($whatId !== null) {\n $criteriaParts[] = \"(What_Id:equals:$whatId)\";\n }\n\n if ($whoId === null && $whatId === null) {\n $this->logger->info(\n '[integration-app] fetchRelatedZohoActivity cannot find prospect',\n [\n 'activity' => $activity->getUuid(),\n ]\n );\n\n return [];\n }\n\n $criteriaParts[] = \"(Start_DateTime:greater_equal:$start)\";\n $criteriaParts[] = \"(End_DateTime:less_equal:$end)\";\n\n $criteria = implode(' AND ', $criteriaParts);\n\n $params = [\n 'criteria' => $criteria,\n 'sort_by' => 'Modified_Time',\n 'sort_order' => 'desc',\n ];\n\n $this->logger->info(\n '[integration-app] fetchRelatedZohoActivity searching for related activity',\n [\n 'activity' => $activity->getUuid(),\n 'params' => $params,\n ]\n );\n\n $meetings = $this->client->searchMeetings($params);\n if (! empty($meetings)) {\n return $meetings[0];\n }\n\n return [];\n }\n\n private function getFromToDates(Activity $activity): array\n {\n $calendarEvent = $activity->calendarEvent()->first();\n\n $from = $calendarEvent?->getStartTime();\n $to = $calendarEvent?->getEndTime();\n\n if (! $from || ! $to) {\n $from = $activity->hasScheduledStartTime()\n ? $activity->getScheduledStartTime()\n : $activity->getActualStartTime();\n\n $to = $activity->hasScheduledEndTime()\n ? $activity->getScheduledEndTime()->addMinutes(15)\n : $activity->getActualEndTime();\n }\n\n return [$from, $to];\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,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Explain Plan","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Browse Query History","depth":4,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"View Parameters","depth":4,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Open Query Execution Settings…","depth":4,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"In-Editor Results","depth":4,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Tx: Auto","depth":4,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Cancel Running Statements","depth":4,"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Playground","depth":4,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"jiminny","depth":4,"on_screen":true,"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},"on_screen":false,"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},"on_screen":false,"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},"on_screen":false,"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},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"8","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"1","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"3","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"4","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"SELECT\n# DISTINCT\nopp.id as opp_id, opp.uuid, opp.name,\n# COUNT(dr.id) AS deal_risk_count,\n\n# dr.id,\n# cfd.value,\nusr.name AS owner_name,\nopp.value, opp.currency_code, opp.close_date, opp.remotely_created_at, opp.is_closed, opp.is_won,\nusr.uuid as owner_uuid,\nusr.photo_path as owner_photo,\nusr.id AS owner_id,\njt.name as owner_job,\nopp.stage_id, opp.stage_updated_at,\nacc.name AS acc_name, opp.stage_updated_at, acc.crm_provider_id AS acc_provider_id, opp.crm_provider_id AS opp_provider_id,\nrt.business_process_id AS pipeline_id\nFROM opportunities opp\nLEFT JOIN record_types rt ON opp.record_type_id = rt.id\nLEFT JOIN users usr ON opp.user_id = usr.id\nLEFT JOIN accounts acc ON opp.account_id = acc.id\nLEFT JOIN job_titles jt ON usr.job_title_id = jt.id\n\n# LEFT JOIN group_deal_risk_types gdrt ON gdrt.group_id = usr.group_id\n# LEFT JOIN deal_risks dr ON dr.opportunity_id = opp.id AND dr.group_deal_risk_type_id = gdrt.id\n\nLEFT JOIN crm_field_data cfd ON (cfd.object_id = opp.id and cfd.crm_field_id = 66814)\n\nWHERE opp.user_id IS NOT NULL\nAND opp.deleted_at IS NULL\nAND opp.is_closed = 1\nAND opp.is_won = 0\nAND opp.close_date >= '2024-01-01 00:00:00'\nAND opp.close_date <= '2024-12-31 23:59:59'\nAND usr.team_id = 1\n\n# and opp.id = 4823179\n\nGROUP BY opp.id, cfd.value\nORDER BY\n# cfd.value\n CAST(cfd.value AS UNSIGNED)\n# owner_name\n# (SELECT COUNT(dr.id)\n# FROM deal_risks dr\n# JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id\n# WHERE dr.opportunity_id = opp.id\n# AND dr.is_active = 1\n# AND gdrt.is_enabled = 1)\nDESC\nLIMIT 25\n# OFFSET 0\n;\n\nselect * from crm_fields where crm_configuration_id = 1 and object_type = 'opportunity';\nselect * from crm_layout_entities where crm_layout_id = 1493;\n\nSELECT * FROM opportunities WHERE id = 4584045;\nSELECT * FROM crm_field_data WHERE object_id = 4584045;\n\nSELECT * FROM opportunities where team_id = 1 and crm_provider_id = '0061K00000lfb9IQAQ'\n\nSELECT\n opp.id as opportunity_id,\n opp.name,\n COUNT(dr.id) as risk_count\nFROM opportunities opp\nLEFT JOIN deal_risks dr ON dr.opportunity_id = opp.id\nWHERE opp.id IN (\n 6069574,8900938,9507638,9524799,9660490,9662824,9705675,9749758,4158460,4391812,6450439,4448422,5118945,5590675,4584045,7228149,9002408,9165534,9446720,9641778,9665149,9703344,9709280,5747948,4158491,6182565,6263970,5798120,5111315,4536978,6062352,6548383,6072095,6548225,4480986,5011422,6548381,8760540,8917554,9509986,9514392,9569009,9569011,9578490,9713604,5784397,7276612,7288405,8994421,9118219,9608148,9818911,4510535,6479693,5958049,6271674,6550448,4158331,4158483,6126571,6171615,6540943,4897466,5190896,5796182,5932762,8572433,8723698,8892697,9711001,9789264,4549188,6100831,6170064,6260799,6263653,6449936,6530871,6538978,7777651,8059269,8319918,8787049,8901150,9263153,9453207,9514738,9696700,9791062,5752018,6421452,7439134,7878923,9354763,9369285,9514396,9582506,9889949,9890216,4094311,4158495,4158496,6098128,5585661,3872564,6442149,5891604,6164746,6199593,6583474,6519684,9018490,9809006,4496897,5041324,5829430,6198319,6253504,6555763,7242914,7931055,8024125,8797814,8058559,8673347,8892695,8994420,9616219,9714970,9722004,9809439,9818918,6523177,8134147,9002915,9711422,9892713,9901719,9954210,9978435,5800810,6243518,6416114,6222251,6411974,6512456,5791953,6545606,9914780,5805540,6238986,6463838,6547680,9767049,9809437,9810885,9890855,6673493,9902036,4335521,6379871,6503799,6546077,8018765,9907556,9958433,9905855,9916179,9946741,9957877,5563344,6271838,6450815,7641128,7762567,7780592,8684810,8685786,8685787,8685788\n)\nGROUP BY opp.id;\n\nSELECT COUNT(dr.id)\n FROM deal_risks dr\n JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id\n WHERE dr.opportunity_id = 5563344\n# AND gdrt.group_id = usr.group_id\n\n\n\nEXPLAIN SELECT\n opp.id as opp_id, opp.uuid, opp.name,\n\ncfd.value,\ncfv.sequence,\ncfv.value,\n# MAX(cfd.value) AS max_cfd_value,\nusr.name AS owner_name,\nopp.value, opp.currency_code, opp.close_date, opp.remotely_created_at, opp.is_closed, opp.is_won,\nusr.uuid as owner_uuid,\nusr.photo_path as owner_photo,\nusr.id AS owner_id,\njt.name as owner_job,\nopp.stage_id, opp.stage_updated_at,\nacc.name AS acc_name, opp.stage_updated_at, acc.crm_provider_id AS acc_provider_id, opp.crm_provider_id AS opp_provider_id,\nrt.business_process_id AS pipeline_id\nFROM opportunities opp\n\nLEFT JOIN record_types rt ON opp.record_type_id = rt.id\nLEFT JOIN users usr ON opp.user_id = usr.id\nLEFT JOIN accounts acc ON opp.account_id = acc.id\nLEFT JOIN job_titles jt ON usr.job_title_id = jt.id\n\nLEFT JOIN crm_field_data cfd ON cfd.id = (SELECT sub_cfd.id\n FROM crm_field_data sub_cfd\n WHERE sub_cfd.object_id = opp.id\n AND sub_cfd.crm_field_id = 66810\n ORDER BY sub_cfd.updated_at DESC\n LIMIT 1)\n\nLEFT JOIN crm_field_values cfv ON cfv.crm_field_id = 66810 AND cfv.value = cfd.value\n\nWHERE opp.user_id IS NOT NULL\nAND opp.deleted_at IS NULL\nAND opp.is_closed = 0\n# AND opp.is_closed = 1\n# AND opp.is_won = 0\nAND opp.close_date >= '2024-01-01 00:00:00'\nAND opp.close_date <= '2024-12-31 23:59:59'\nAND usr.team_id = 1\n\n# and opp.id = 4823179\n\n# GROUP BY opp.id\nORDER BY\n cfv.sequence DESC,\n# opp.name\n# owner_name\n cfd.value\n# CAST(cfd.value AS UNSIGNED)\n# CAST(MAX(cfd.value) AS UNSIGNED)\n# (SELECT COUNT(dr.id)\n# FROM deal_risks dr\n# JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id\n# WHERE dr.opportunity_id = opp.id\n# AND dr.is_active = 1 AND gdrt.is_enabled = 1)\nDESC\n# LIMIT 75, 25\n;\n\n\n\nSELECT * FROM crm_field_values WHERE crm_field_id = 66810;\n\nSELECT f.id, f.crm_provider_id AS field_name, f.label, fd.object_id AS dealId, fd.value, fd.updated_at, fd.id, fd.created_at\nFROM crm_fields f\nINNER JOIN crm_field_data fd ON fd.crm_field_id = f.id\n WHERE (f.crm_configuration_id = 1)\n AND (f.object_type = 'opportunity')\n# AND (fd.object_id IN (4158331,4158483,4158495,4158496,6069574,6263970,6171615,6540943,6545606,5829430,6198319,6263653,6548381,7242914,8797814,7228149,7439134,7878923,8134147,9002915,9118219,9165534,9354763,9369285,9446720))\n AND (fd.object_id IN (4158460))\n AND (f.crm_provider_id IN ('ForecastCategoryName'))\n ORDER BY fd.object_id ASC, fd.updated_at DESC;\n\nselect * from crm_layouts where crm_configuration_id = 1;\nselect cf.* from crm_fields cf\njoin crm_layout_entities cle on cf.id = cle.crm_field_id\nwhere crm_layout_id = 1493;\n\nSELECT * FROM opportunities WHERE id = 4158460;\nSELECT * FROM crm_field_data WHERE object_id = 4158460;\n\nselect * from users where team_id = 1;\nSELECT * FROM users WHERE id = 7160;\nselect * from role_user where user_id = 3248;\n\nselect * from crm_field_values where crm_field_id = 66824;\n\nSELECT * FROM users WHERE id = 23470;\nselect * from crm_configurations;\n\n# ******************************************\nselect * from teams where id = 1038; # 23521, 966\nselect * from users where team_id = 1038;\nselect * from crm_configurations where id = 966;\nSELECT * FROM activities WHERE uuid_to_bin('e8dc7c34-31f6-4430-bd81-2d9d8f00dd07') = uuid; # 54965762\nSELECT * FROM activities WHERE uuid_to_bin('4b5727c0-69d1-428f-b8d9-b649055166e2') = uuid; # 54965764\nSELECT * FROM participants WHERE activity_id = 54965764;\n\nSELECT id, uuid, title, recording_state FROM activities WHERE uuid_to_bin('355f105d-5606-4379-b0c5-d91daf59f4ce') = uuid; # 54964075\nSELECT * FROM participants WHERE activity_id = 54964075;\nselect f.id, slug, title, tf.team_id from team_features tf JOIN features f on tf.feature_id = f.id\n where tf.team_id = 1038;\n\n\n# ****************************************** PD *************************\nselect * from teams where id = 1029;\nSELECT * FROM crm_configurations WHERE id = 957;\nSELECT * FROM activities WHERE uuid_to_bin('581a33cb-4343-44bd-ac0c-4a5cee71c5ec') = uuid; # 54963423\nSELECT * FROM activities WHERE uuid_to_bin('07238011-25fa-418e-838b-fb21e82b9ea2') = uuid; # 54963433\n\nSELECT * FROM activities WHERE uuid_to_bin('8b6bb2f7-e7a7-4aec-8806-fbfea7093ccd') = uuid; # 54963421\n\n# ****************************************** Close *************************\nselect * from teams where id = 1031;\nSELECT * FROM crm_configurations WHERE id = 959;\nSELECT * FROM activities WHERE uuid_to_bin('59c517e0-96c9-4dad-bfeb-b7bef72f8725') = uuid; # 54963517\n\n\nSELECT * FROM activities WHERE uuid_to_bin('07238011-25fa-418e-838b-fb21e82b9ea2') = uuid; # 54963433\n\nSELECT * FROM activities WHERE uuid_to_bin('d68311e3-ac34-49bd-bf04-88323a7e5352') = uuid; # 54966009\n\n# ****************************************** SF *************************\nSELECT * FROM activities WHERE uuid_to_bin('2bd4cfa3-4eb5-4c77-84a7-9ed46a21c988') = uuid;\n\nselect * from roles;\nselect * from permissions;\nselect * from permission_role where permission_id = 136;\n\nselect * from migrations order by id desc;\n\nselect * from teams where id IN (1, 1037);\nselect * from crm_layouts where crm_configuration_id = 1;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1493;\nSELECT * FROM crm_fields WHERE id IN (1652,1661,66799,66814,66821,66836,66843,66846,66864,84752,182306,323580,380378);\n\nselect * from features;\nselect * from team_features where feature_id = 33;\nselect * from opportunities;\n\nselect * from teams;\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 = 1052 and sa.provider = 'hubspot';\n\nSELECT * FROM accounts where id = 11512582;\nselect * from activities where account_id = 11512582;","depth":4,"on_screen":true,"value":"SELECT\n# DISTINCT\nopp.id as opp_id, opp.uuid, opp.name,\n# COUNT(dr.id) AS deal_risk_count,\n\n# dr.id,\n# cfd.value,\nusr.name AS owner_name,\nopp.value, opp.currency_code, opp.close_date, opp.remotely_created_at, opp.is_closed, opp.is_won,\nusr.uuid as owner_uuid,\nusr.photo_path as owner_photo,\nusr.id AS owner_id,\njt.name as owner_job,\nopp.stage_id, opp.stage_updated_at,\nacc.name AS acc_name, opp.stage_updated_at, acc.crm_provider_id AS acc_provider_id, opp.crm_provider_id AS opp_provider_id,\nrt.business_process_id AS pipeline_id\nFROM opportunities opp\nLEFT JOIN record_types rt ON opp.record_type_id = rt.id\nLEFT JOIN users usr ON opp.user_id = usr.id\nLEFT JOIN accounts acc ON opp.account_id = acc.id\nLEFT JOIN job_titles jt ON usr.job_title_id = jt.id\n\n# LEFT JOIN group_deal_risk_types gdrt ON gdrt.group_id = usr.group_id\n# LEFT JOIN deal_risks dr ON dr.opportunity_id = opp.id AND dr.group_deal_risk_type_id = gdrt.id\n\nLEFT JOIN crm_field_data cfd ON (cfd.object_id = opp.id and cfd.crm_field_id = 66814)\n\nWHERE opp.user_id IS NOT NULL\nAND opp.deleted_at IS NULL\nAND opp.is_closed = 1\nAND opp.is_won = 0\nAND opp.close_date >= '2024-01-01 00:00:00'\nAND opp.close_date <= '2024-12-31 23:59:59'\nAND usr.team_id = 1\n\n# and opp.id = 4823179\n\nGROUP BY opp.id, cfd.value\nORDER BY\n# cfd.value\n CAST(cfd.value AS UNSIGNED)\n# owner_name\n# (SELECT COUNT(dr.id)\n# FROM deal_risks dr\n# JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id\n# WHERE dr.opportunity_id = opp.id\n# AND dr.is_active = 1\n# AND gdrt.is_enabled = 1)\nDESC\nLIMIT 25\n# OFFSET 0\n;\n\nselect * from crm_fields where crm_configuration_id = 1 and object_type = 'opportunity';\nselect * from crm_layout_entities where crm_layout_id = 1493;\n\nSELECT * FROM opportunities WHERE id = 4584045;\nSELECT * FROM crm_field_data WHERE object_id = 4584045;\n\nSELECT * FROM opportunities where team_id = 1 and crm_provider_id = '0061K00000lfb9IQAQ'\n\nSELECT\n opp.id as opportunity_id,\n opp.name,\n COUNT(dr.id) as risk_count\nFROM opportunities opp\nLEFT JOIN deal_risks dr ON dr.opportunity_id = opp.id\nWHERE opp.id IN (\n 6069574,8900938,9507638,9524799,9660490,9662824,9705675,9749758,4158460,4391812,6450439,4448422,5118945,5590675,4584045,7228149,9002408,9165534,9446720,9641778,9665149,9703344,9709280,5747948,4158491,6182565,6263970,5798120,5111315,4536978,6062352,6548383,6072095,6548225,4480986,5011422,6548381,8760540,8917554,9509986,9514392,9569009,9569011,9578490,9713604,5784397,7276612,7288405,8994421,9118219,9608148,9818911,4510535,6479693,5958049,6271674,6550448,4158331,4158483,6126571,6171615,6540943,4897466,5190896,5796182,5932762,8572433,8723698,8892697,9711001,9789264,4549188,6100831,6170064,6260799,6263653,6449936,6530871,6538978,7777651,8059269,8319918,8787049,8901150,9263153,9453207,9514738,9696700,9791062,5752018,6421452,7439134,7878923,9354763,9369285,9514396,9582506,9889949,9890216,4094311,4158495,4158496,6098128,5585661,3872564,6442149,5891604,6164746,6199593,6583474,6519684,9018490,9809006,4496897,5041324,5829430,6198319,6253504,6555763,7242914,7931055,8024125,8797814,8058559,8673347,8892695,8994420,9616219,9714970,9722004,9809439,9818918,6523177,8134147,9002915,9711422,9892713,9901719,9954210,9978435,5800810,6243518,6416114,6222251,6411974,6512456,5791953,6545606,9914780,5805540,6238986,6463838,6547680,9767049,9809437,9810885,9890855,6673493,9902036,4335521,6379871,6503799,6546077,8018765,9907556,9958433,9905855,9916179,9946741,9957877,5563344,6271838,6450815,7641128,7762567,7780592,8684810,8685786,8685787,8685788\n)\nGROUP BY opp.id;\n\nSELECT COUNT(dr.id)\n FROM deal_risks dr\n JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id\n WHERE dr.opportunity_id = 5563344\n# AND gdrt.group_id = usr.group_id\n\n\n\nEXPLAIN SELECT\n opp.id as opp_id, opp.uuid, opp.name,\n\ncfd.value,\ncfv.sequence,\ncfv.value,\n# MAX(cfd.value) AS max_cfd_value,\nusr.name AS owner_name,\nopp.value, opp.currency_code, opp.close_date, opp.remotely_created_at, opp.is_closed, opp.is_won,\nusr.uuid as owner_uuid,\nusr.photo_path as owner_photo,\nusr.id AS owner_id,\njt.name as owner_job,\nopp.stage_id, opp.stage_updated_at,\nacc.name AS acc_name, opp.stage_updated_at, acc.crm_provider_id AS acc_provider_id, opp.crm_provider_id AS opp_provider_id,\nrt.business_process_id AS pipeline_id\nFROM opportunities opp\n\nLEFT JOIN record_types rt ON opp.record_type_id = rt.id\nLEFT JOIN users usr ON opp.user_id = usr.id\nLEFT JOIN accounts acc ON opp.account_id = acc.id\nLEFT JOIN job_titles jt ON usr.job_title_id = jt.id\n\nLEFT JOIN crm_field_data cfd ON cfd.id = (SELECT sub_cfd.id\n FROM crm_field_data sub_cfd\n WHERE sub_cfd.object_id = opp.id\n AND sub_cfd.crm_field_id = 66810\n ORDER BY sub_cfd.updated_at DESC\n LIMIT 1)\n\nLEFT JOIN crm_field_values cfv ON cfv.crm_field_id = 66810 AND cfv.value = cfd.value\n\nWHERE opp.user_id IS NOT NULL\nAND opp.deleted_at IS NULL\nAND opp.is_closed = 0\n# AND opp.is_closed = 1\n# AND opp.is_won = 0\nAND opp.close_date >= '2024-01-01 00:00:00'\nAND opp.close_date <= '2024-12-31 23:59:59'\nAND usr.team_id = 1\n\n# and opp.id = 4823179\n\n# GROUP BY opp.id\nORDER BY\n cfv.sequence DESC,\n# opp.name\n# owner_name\n cfd.value\n# CAST(cfd.value AS UNSIGNED)\n# CAST(MAX(cfd.value) AS UNSIGNED)\n# (SELECT COUNT(dr.id)\n# FROM deal_risks dr\n# JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id\n# WHERE dr.opportunity_id = opp.id\n# AND dr.is_active = 1 AND gdrt.is_enabled = 1)\nDESC\n# LIMIT 75, 25\n;\n\n\n\nSELECT * FROM crm_field_values WHERE crm_field_id = 66810;\n\nSELECT f.id, f.crm_provider_id AS field_name, f.label, fd.object_id AS dealId, fd.value, fd.updated_at, fd.id, fd.created_at\nFROM crm_fields f\nINNER JOIN crm_field_data fd ON fd.crm_field_id = f.id\n WHERE (f.crm_configuration_id = 1)\n AND (f.object_type = 'opportunity')\n# AND (fd.object_id IN (4158331,4158483,4158495,4158496,6069574,6263970,6171615,6540943,6545606,5829430,6198319,6263653,6548381,7242914,8797814,7228149,7439134,7878923,8134147,9002915,9118219,9165534,9354763,9369285,9446720))\n AND (fd.object_id IN (4158460))\n AND (f.crm_provider_id IN ('ForecastCategoryName'))\n ORDER BY fd.object_id ASC, fd.updated_at DESC;\n\nselect * from crm_layouts where crm_configuration_id = 1;\nselect cf.* from crm_fields cf\njoin crm_layout_entities cle on cf.id = cle.crm_field_id\nwhere crm_layout_id = 1493;\n\nSELECT * FROM opportunities WHERE id = 4158460;\nSELECT * FROM crm_field_data WHERE object_id = 4158460;\n\nselect * from users where team_id = 1;\nSELECT * FROM users WHERE id = 7160;\nselect * from role_user where user_id = 3248;\n\nselect * from crm_field_values where crm_field_id = 66824;\n\nSELECT * FROM users WHERE id = 23470;\nselect * from crm_configurations;\n\n# ******************************************\nselect * from teams where id = 1038; # 23521, 966\nselect * from users where team_id = 1038;\nselect * from crm_configurations where id = 966;\nSELECT * FROM activities WHERE uuid_to_bin('e8dc7c34-31f6-4430-bd81-2d9d8f00dd07') = uuid; # 54965762\nSELECT * FROM activities WHERE uuid_to_bin('4b5727c0-69d1-428f-b8d9-b649055166e2') = uuid; # 54965764\nSELECT * FROM participants WHERE activity_id = 54965764;\n\nSELECT id, uuid, title, recording_state FROM activities WHERE uuid_to_bin('355f105d-5606-4379-b0c5-d91daf59f4ce') = uuid; # 54964075\nSELECT * FROM participants WHERE activity_id = 54964075;\nselect f.id, slug, title, tf.team_id from team_features tf JOIN features f on tf.feature_id = f.id\n where tf.team_id = 1038;\n\n\n# ****************************************** PD *************************\nselect * from teams where id = 1029;\nSELECT * FROM crm_configurations WHERE id = 957;\nSELECT * FROM activities WHERE uuid_to_bin('581a33cb-4343-44bd-ac0c-4a5cee71c5ec') = uuid; # 54963423\nSELECT * FROM activities WHERE uuid_to_bin('07238011-25fa-418e-838b-fb21e82b9ea2') = uuid; # 54963433\n\nSELECT * FROM activities WHERE uuid_to_bin('8b6bb2f7-e7a7-4aec-8806-fbfea7093ccd') = uuid; # 54963421\n\n# ****************************************** Close *************************\nselect * from teams where id = 1031;\nSELECT * FROM crm_configurations WHERE id = 959;\nSELECT * FROM activities WHERE uuid_to_bin('59c517e0-96c9-4dad-bfeb-b7bef72f8725') = uuid; # 54963517\n\n\nSELECT * FROM activities WHERE uuid_to_bin('07238011-25fa-418e-838b-fb21e82b9ea2') = uuid; # 54963433\n\nSELECT * FROM activities WHERE uuid_to_bin('d68311e3-ac34-49bd-bf04-88323a7e5352') = uuid; # 54966009\n\n# ****************************************** SF *************************\nSELECT * FROM activities WHERE uuid_to_bin('2bd4cfa3-4eb5-4c77-84a7-9ed46a21c988') = uuid;\n\nselect * from roles;\nselect * from permissions;\nselect * from permission_role where permission_id = 136;\n\nselect * from migrations order by id desc;\n\nselect * from teams where id IN (1, 1037);\nselect * from crm_layouts where crm_configuration_id = 1;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1493;\nSELECT * FROM crm_fields WHERE id IN (1652,1661,66799,66814,66821,66836,66843,66846,66864,84752,182306,323580,380378);\n\nselect * from features;\nselect * from team_features where feature_id = 33;\nselect * from opportunities;\n\nselect * from teams;\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 = 1052 and sa.provider = 'hubspot';\n\nSELECT * FROM accounts where id = 11512582;\nselect * from activities where account_id = 11512582;","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Project","depth":3,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Project","depth":3,"bounds":{"left":0.28224733,"top":1.0,"width":0.024268618,"height":-0.04788506},"on_screen":true,"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},"on_screen":false,"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},"on_screen":false,"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},"on_screen":false,"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},"on_screen":false,"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},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
4266403488567062772
|
6524482065460761565
|
click
|
accessibility
|
NULL
|
Project: faVsco.js, menu
#12066 on JY-20725-handle Project: faVsco.js, menu
#12066 on JY-20725-handle-HS-search-rate-limit, menu
Start Listening for PHP Debug Connections
HandleHubspotRateLimitTest
Run 'HandleHubspotRateLimitTest'
Debug 'HandleHubspotRateLimitTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
16
2
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Services\Crm\IntegrationApp;
use Carbon\Carbon;
use Jiminny\Contracts\Crm\Providers;
use Jiminny\Contracts\Services\Crm\ClientInterface;
use Jiminny\Contracts\Services\Crm\FetchRelatedActivityInterface;
use Jiminny\Contracts\Services\Crm\ImportsBusinessProcessesInterface;
use Jiminny\Contracts\Services\Crm\LayoutManagementInterface;
use Jiminny\Contracts\Services\Crm\MatchCrmEntitiesInterface;
use Jiminny\Contracts\Services\Crm\Provider\IntegrationAppInterface;
use Jiminny\Contracts\Services\Crm\RemoteEntityLookupInterface;
use Jiminny\Contracts\Services\Crm\RemoteEntityManipulationInterface;
use Jiminny\Contracts\Services\Crm\RemoteNoteEntityManipulationInterface;
use Jiminny\Contracts\Services\Crm\SendSummaryToCrmInterface;
use Jiminny\Contracts\Services\Crm\SettingsInterface;
use Jiminny\Contracts\Services\Crm\SyncCrmEntitiesInterface;
use Jiminny\Contracts\Services\Crm\SyncCrmMetadataInterface;
use Jiminny\Events\Activities\Crm\ActivityLeadConverted;
use Jiminny\Exceptions\CrmException;
use Jiminny\Exceptions\SocialAccountNotFoundException;
use Jiminny\Jobs\Crm\NoteObject;
use Jiminny\Models\Account;
use Jiminny\Models\Activity;
use Jiminny\Models\Contracts\ActivityContract;
use Jiminny\Models\Crm\Configuration;
use Jiminny\Models\Opportunity;
use Jiminny\Models\Stage;
use Jiminny\Models\User;
use Jiminny\Services\Crm\BaseService;
use Jiminny\Services\Crm\IntegrationApp\Config\IntegrationAppProviders;
use Jiminny\Services\Crm\IntegrationApp\Config\IntegrationConfigFactory;
use Jiminny\Services\Crm\IntegrationApp\DTO\Mappers\FieldMapperInterface;
use Jiminny\Services\Crm\IntegrationApp\DTO\Mappers\LeadFieldMapper;
use Jiminny\Services\Crm\IntegrationApp\DTO\Utils\GenerateProviderUrlInterface;
use Jiminny\Services\Crm\IntegrationApp\DTO\Utils\IntegrationAppCrmGeneratorFactory;
use Jiminny\Services\Crm\IntegrationApp\DTO\Utils\UrlGeneratorInterface;
use Jiminny\Services\Crm\IntegrationApp\ServiceTraits\SyncCrmFieldsTrait;
use Jiminny\Services\Crm\IntegrationApp\ServiceTraits\SystemStateTrait;
use Jiminny\Services\Crm\IntegrationApp\ServiceTraits\LayoutTrait;
use Jiminny\Services\Crm\IntegrationApp\ServiceTraits\MatchProspectsTrait;
use Jiminny\Services\Crm\IntegrationApp\ServiceTraits\NotSupportedTrait;
use Jiminny\Services\Crm\IntegrationApp\ServiceTraits\SyncCrmEntitiesTrait;
use Jiminny\Services\Crm\IntegrationApp\ServiceTraits\SyncCrmMetadataTrait;
use Psr\Log\LoggerInterface;
use Jiminny\Services\Crm\IntegrationApp\DTO\Mappers\OpportunityFieldMapper;
use Jiminny\Repositories\Crm\ProfileRepository;
use Jiminny\Repositories\Crm\OpportunityRepository;
use Jiminny\Models\Crm\Profile;
use Jiminny\Services\Crm\CrmObjects\CrmObjectsRepository;
class Service extends BaseService implements
IntegrationAppInterface,
SyncCrmEntitiesInterface,
SyncCrmMetadataInterface,
ImportsBusinessProcessesInterface,
RemoteEntityManipulationInterface,
LayoutManagementInterface,
SettingsInterface,
MatchCrmEntitiesInterface,
RemoteEntityLookupInterface,
RemoteNoteEntityManipulationInterface,
SendSummaryToCrmInterface,
UrlGeneratorInterface,
FetchRelatedActivityInterface
{
use SyncCrmMetadataTrait;
use SyncCrmEntitiesTrait;
use SystemStateTrait;
use LayoutTrait;
use NotSupportedTrait;
use MatchProspectsTrait;
use SyncCrmFieldsTrait;
public const string CALL_TYPE_MISSED = 'Missed';
public const string CALL_TYPE_INBOUND = 'Inbound';
public const string CALL_TYPE_OUTBOUND = 'Outbound';
public const string RELATIONSHIP_OPPORTUNITY = 'Deals';
public const string RELATIONSHIP_LEAD = 'Leads';
public const string RELATIONSHIP_ACCOUNT = 'Accounts';
/**
* @var ClientInterface&DataClient
*/
protected $client;
protected ?User $invokedUser = null;
protected ?GenerateProviderUrlInterface $crmUrlGenerator = null;
public function __construct(
DataClient $client,
LoggerInterface $logger,
) {
parent::__construct();
$this->client = $client;
$this->logger = $logger;
}
public function getDisplayName(): string
{
return Providers::getProviderDisplayName(
Providers::getCrmIntegrationSlug($this->config)
);
}
/**
* @throws \Exception
*/
public function setUser(User $user): void
{
$this->configureSentryScope($user);
$this->invokedUser = $user;
$this->team = $user->getTeam();
$teamOwner = $this->team->getOwner();
$this->setConfiguration($user->getTeam()->getCrmConfiguration());
$this->setEditionConfiguration(Providers::getCrmIntegrationSlug($this->config));
$this->setCrmUrlGenerator($this->config);
$this->client->setTeam($this->team);
$socialAccount = $teamOwner?->getSocialAccount('integration-app');
if ($socialAccount === null) {
$this->logger->info('[integration-app] Social account not found', [
'teamId' => $this->team->getId(),
'teamOwnerId' => $teamOwner?->getId(),
'userId' => $user->getId(),
]);
throw new SocialAccountNotFoundException('Social account not found!');
}
$this->client->setSocialAccount($socialAccount);
// The CRM Service is properly bootstrapped, and supports remote operations
$this->connect();
}
public function normalizeValue(string $fieldType, string $fieldValue, bool $internal = false): string
{
return $fieldValue;
}
public function find(string $name, array $scopes): array
{
/** @var LocalSearch $localSearch */
$localSearch = app(LocalSearch::class);
$localSearch->setConfiguration($this->config);
$localSearch->setCountryCode($this->invokedUser->getCountryCode());
return $localSearch->search($name);
// if (! empty($localMatch)) {
// return $localMatch;
// }
//
// /** @var RemoteSearch $remoteSearch */
// $remoteSearch = app(RemoteSearch::class);
// $remoteSearch->setClient($this->client);
// $remoteSearch->setConfiguration($this->config);
//
// return $remoteSearch->search($name);
}
public function findOpportunities(?string $crmAccountId, ?string $crmContactId, ?int $userId = null): array
{
$data = [];
$ownerData = [];
$account = $this->getAccount($crmAccountId, $crmContactId);
if ($account === null) {
return [];
}
$ownerId = $this->getOwnerId($userId);
try {
$opportunityRepository = app(OpportunityRepository::class);
$opportunities = $opportunityRepository->findAllByConfigurationAndAccountId(
$this->config,
$account->getId()
);
foreach ($opportunities as $opportunity) {
/** @var Opportunity $opportunity */
$record = $this->buildOpportunityData($opportunity);
if ($ownerId && $opportunity->getOwnerId() === $ownerId) {
$ownerData[] = $record;
}
$data[] = $record;
}
if (! empty($ownerData)) {
return $ownerData;
}
return $data;
} catch (\Exception $e) {
$this->logger->info('[integration-app] Failed to fetch opportunities', [
'contact' => $crmContactId,
'account' => $crmAccountId,
'owner' => $ownerId,
'error' => $e->getMessage(),
]);
return $data;
}
}
private function getOwnerId(?int $userId = null): ?string
{
if (! $userId) {
return null;
}
$profileRepository = app(ProfileRepository::class);
$profile = $profileRepository->findProfileByUserId($this->config, $userId);
return $profile instanceof Profile ? $profile->getCrmProviderId() : null;
}
private function getAccount(?string $crmAccountId = null, ?string $crmContactId = null): ?Account
{
$crmRepository = app(CrmObjectsRepository::class);
if ($crmAccountId === null) {
$contact = $crmRepository->findContactByCrmProviderId($this->config, $crmContactId);
return $contact->getAccount();
}
return $crmRepository->findAccountByCrmProviderId($this->config, $crmAccountId);
}
private function buildOpportunityData(Opportunity $opportunity): array
{
$record = [
'crmId' => $opportunity->getCrmProviderId(),
'name' => $opportunity->getName(),
'won' => $opportunity->isWon(),
'closed' => $opportunity->isClosed(),
];
if (! empty($opportunity->getFormattedValueAttribute())) {
$record['value'] = $opportunity->getFormattedValueAttribute();
}
if (! empty($opportunity->getStage())) {
$record['stage'] = [
'id' => $opportunity->getStage()->getUuid(),
'name' => $opportunity->getStage()->getName(),
];
}
return $record;
}
public function updateRecord(string $objectType, string $objectId, array $data, array $headers = []): void
{
$data = [
'data' => $this->normalizeData($objectType, $data),
];
$this->client->updateRecordById($objectType, $objectId, $data);
}
private function normalizeData(string $objectType, array $data): array
{
$fieldMapper = $this->getFieldMapper($objectType);
if (! $fieldMapper instanceof FieldMapperInterface) {
return $data;
}
return $fieldMapper->mapToCrmFields($data);
}
private function getFieldMapper(string $objectType): ?FieldMapperInterface
{
if ($objectType === self::OBJECT_OPPORTUNITY) {
return app(OpportunityFieldMapper::class);
}
if ($objectType === self::OBJECT_LEAD) {
return app(LeadFieldMapper::class);
}
return null;
}
public function getRecord(string $objectType, string $objectId, array $fields = []): array
{
return $this->client->getRecordById($objectType, $objectId);
}
public function getConfiguration(): Configuration
{
return $this->config;
}
public function setConfiguration(Configuration $config): void
{
$this->clearExternalMapCache();
$this->config = $config;
}
private function setEditionConfiguration(string $provider): void
{
$this->editionConfig = app(IntegrationConfigFactory::class)->create($provider);
}
public function setCrmUrlGenerator(Configuration $config): void
{
$this->crmUrlGenerator = app(IntegrationAppCrmGeneratorFactory::class)->create($config);
}
public function getCrmUrlGenerator(): ?GenerateProviderUrlInterface
{
if ($this->crmUrlGenerator === null) {
$this->setCrmUrlGenerator($this->config);
}
return $this->crmUrlGenerator;
}
public function subscribeEntityEvents(bool $enableTrigger = true): void
{
$eventStates = $this->client->updateEntityEventsState($enableTrigger);
$this->logger->info('[integration-app] Change team entity events subscription', [
'teamId' => $this->team->getId(),
'teamName' => $this->team->getName(),
'states' => $eventStates,
'action' => $enableTrigger ? 'subscribe' : 'unsubscribe',
]);
}
#[\Override] public function supportsNotes(): bool
{
return $this->editionConfig->supportsNotes();
}
#[\Override] public function saveNote(
string $title,
string $body,
string $objectId,
?NoteObject $noteObject = null,
): ?string {
if ($noteObject === null) {
return null;
}
$notePayload = [
'title' => $title,
'content' => $body,
'objectId' => $objectId,
'objectType' => $noteObject->value,
];
$result = $this->client->createNote($notePayload);
// debug saving note response
$this->logger->info('[integration-app] createNote response', [
'objectId' => $objectId,
'objectType' => $noteObject->value,
'result' => $result,
'hasId' => isset($result['id']),
]);
return $result['id'] ?? null;
}
/**
* @throws CrmException
*/
#[\Override] public function saveActivity(Activity $activity): Activity
{
$this->logger->info('[integration-app] saveActivity', [
'activity' => $activity->getUuid(),
'type' => $activity->getType(),
]);
if ($activity->getCrmType() === Activity::TYPE_CONFERENCE) {
$crmActivity = $this->saveMeeting($activity);
} elseif (in_array($activity->getType(), [Activity::TYPE_SOFTPHONE, Activity::TYPE_SOFTPHONE_INBOUND])) {
$crmActivity = $this->saveCall($activity);
} else {
throw new CrmException('Unsupported activity type');
}
$crmActivityId = $crmActivity['id'] ?? null;
if ($crmActivityId !== null) {
$activity->crm_provider_id = $crmActivityId;
$activity->save();
$this->logger->info('[integration-app] Activity successfully logged to CRM', [
'activity' => $activity->getUuid(),
'type' => $activity->getType(),
'crmId' => $crmActivityId,
]);
}
return $activity;
}
public function saveMeeting(Activity $activity): array
{
$decorateActivity = app(DecorateActivity::class);
$meetingPayload = [
'Event_Title' => $decorateActivity->generateTitle($activity),
'Start_DateTime' => $activity->getActualStartTime()->toIso8601String(),
'End_DateTime' => $activity->getActualEndTime()->toIso8601String(),
'ownerId' => $this->getActivityOwnerId($activity),
];
$payload = array_merge($meetingPayload, $this->attachToProspect($activity));
if ($activity->hasCrmProviderId()) {
$crmId = $activity->getCrmProviderId();
$meeting = $this->client->getMeeting($crmId);
$oldDescription = $meeting['fields']['Description'] ?? null;
$payload['Description'] = $decorateActivity->generateUpdatedDescription($oldDescription, $activity);
$this->logger->info('[integration-app] CRM update meeting', [
'activity' => $activity->getUuid(),
'crm_id' => $crmId,
'payload' => $payload,
]);
return $this->client->updateMeeting($crmId, $payload);
}
$payload['Description'] = $decorateActivity->generateDescription($activity);
$this->logger->info('[integration-app] CRM log meeting', [
'activity' => $activity->getUuid(),
'payload' => $payload,
]);
return $this->client->createMeeting($payload);
}
public function saveCall(Activity $activity): array
{
$decorateActivity = app(DecorateActivity::class);
$callPayload = [
'Call_Type' => $this->getCallType($activity),
'Call_Start_Time' => $activity->getActualStartTime()->toIso8601String(),
'Call_Duration' => $activity->getDuration(),
'name' => $decorateActivity->generateTitle($activity),
'ownerId' => $this->getActivityOwnerId($activity),
];
$payload = array_merge($callPayload, $this->attachToProspect($activity));
if ($activity->hasCrmProviderId()) {
$crmId = $activity->getCrmProviderId();
$call = $this->client->getCall($crmId);
$oldDescription = $call['fields']['Description'] ?? null;
$payload['description'] = $decorateActivity->generateUpdatedDescription($oldDescription, $activity);
$this->logger->info('[integration-app] CRM update call', [
'activity' => $activity->getUuid(),
'crm_id' => $crmId,
'payload' => $payload,
]);
return $this->client->updateCall($crmId, $payload);
}
$payload['description'] = $decorateActivity->generateDescription($activity);
$this->logger->info('[integration-app] CRM log call', [
'activity' => $activity->getUuid(),
'payload' => $payload,
]);
return $this->client->createCall($payload);
}
private function getCallType(Activity $activity): string
{
if ($activity->getStatus() === Activity::STATUS_NO_ANSWER) {
return self::CALL_TYPE_MISSED;
}
return $activity->getType() === Activity::TYPE_SOFTPHONE_INBOUND ? self::CALL_TYPE_INBOUND : self::CALL_TYPE_OUTBOUND;
}
private function attachToProspect(Activity $activity): array
{
$payload = [];
if ($activity->hasContact()) {
$payload['contactId'] = $activity->getContact()->getCrmProviderId();
}
if ($activity->hasOpportunity()) {
return array_merge(
$payload,
$this->buildBasicPayload(
self::RELATIONSHIP_OPPORTUNITY,
$activity->getOpportunity()->getCrmProviderId()
)
);
}
if ($activity->hasAccount() && ! $activity->getAccount()->getIsInternal()) {
return array_merge(
$payload,
$this->buildBasicPayload(
self::RELATIONSHIP_ACCOUNT,
$activity->getAccount()->getCrmProviderId()
)
);
}
if ($activity->hasLead()) {
$payload = $this->handleLeadPayload($activity);
}
return $payload;
}
private function handleLeadPayload(Activity $activity): array
{
$freshLead = $this->syncLead($activity->getLead()->getCrmProviderId());
$lead = $freshLead ?? $activity->getLead();
if ($lead->getConvertedAt() === null) {
return $this->buildBasicPayload(self::RELATIONSHIP_LEAD, $lead->getCrmProviderId());
}
$activity->lead_id = null;
if ($lead->hasAccount()) {
$account = $lead->getAccount();
$activity->account_id = $account->getId();
$payload = $this->buildBasicPayload(self::RELATIONSHIP_ACCOUNT, $account->getCrmProviderId());
} else {
$payload = [];
}
if ($lead->hasOpportunity()) {
$opportunity = $lead->getOpportunity();
$payload = $this->buildBasicPayload(self::RELATIONSHIP_OPPORTUNITY, $opportunity->getCrmProviderId());
$activity->opportunity_id = $opportunity->getId();
$activity->value = $opportunity->value;
$activity->stage_id = $opportunity->stage_id;
} else {
$activity->stage_id = null;
}
if ($lead->hasContact()) {
$contact = $lead->getContact();
$payload['contactId'] = $contact->getCrmProviderId();
$activity->contact_id = $contact->getId();
}
$activity->save();
event(new ActivityLeadConverted($activity, $lead));
$this->logger->info('[integration-app] Lead converted', [
'activityUuid' => $activity->getUuid(),
'leadUuid' => $lead->getUuid(),
]);
return $payload;
}
private function buildBasicPayload(string $type, string $id): array
{
return [
'type' => $type,
'id' => $id,
];
}
private function getActivityOwnerId(Activity $activity): ?string
{
$ownerId = null;
if ($activity->hasUser() && $activity->getUser()->getProfile() !== null) {
$ownerId = $activity->getUser()->getProfile()->getCrmProviderId();
}
return $ownerId;
}
#[\Override] public function saveFollowupActivity(Activity $activity, array $fields): ?string
{
$taskPayload = [
'subject' => $fields['subject'],
'dueTime' => isset($fields['dueDate']) ? Carbon::parse($fields['dueDate'])->format('Y-m-d') : null,
'ownerId' => $this->getActivityOwnerId($activity),
];
if (isset($fields['status'])) {
$taskPayload['status'] = $fields['status'];
}
if (isset($fields['priority'])) {
$taskPayload['priority'] = $fields['priority'];
}
if (isset($fields['content'])) {
$taskPayload['content'] = $fields['content'];
}
$payload = array_merge($taskPayload, $this->attachToProspect($activity));
$this->logger->info('[integration-app] CRM log follow up task', [
'activity' => $activity->getUuid(),
'payload' => $payload,
]);
$task = $this->client->createTask($payload);
return $task['id'] ?? null;
}
#[\Override] public function saveTranscriptionSummaryAsNote(
ActivityContract $activity,
string $title,
string $body,
?string $objectId,
?NoteObject $noteObject = null,
): ?string {
// We have to find a way to store the transcription summary
// This might be possible either by Tasks, Events, Engagements & Notes
// Find what the CRM supports and save the note with the appropriate object(eg Notes)
// For now use only Notes as both ZOHO & Salesforce support them.
if ($this->supportsNotes() && $objectId !== null) {
$this->logger->info('[integration-app] saving note', [
'activityId' => $activity->getUuid(),
'objectId' => $objectId,
]);
return $this->saveNote($title, $body, $objectId, $noteObject);
}
$this->logger->info('[integration-app] skip saveTranscriptionSummaryAsNote', [
'activityId' => $activity->getUuid(),
'supportsNotes' => $this->supportsNotes(),
'objectId' => $objectId,
]);
return null;
}
public function generateProviderUrl(string $providerId, string $objectType): ?string
{
return $this->getCrmUrlGenerator()?->generateProviderUrl($providerId, $objectType);
}
public function updateStage($crmObject, Stage $stage): void
{
$objectType = $stage->getType();
$objectId = $crmObject->getCrmProviderId();
$params = ['stageName' => $stage->getCrmProviderId()];
$this->logger->info('[integration-app] updateStage', [
'objectType' => $objectType,
'objectId' => $objectId,
'params' => $params,
]);
$data = [
'data' => $this->normalizeData($objectType, $params),
];
if ($objectType === Stage::TYPE_LEAD) {
$this->client->updateLead($objectId, $data);
} else {
$this->client->updateDeal($objectId, $data);
}
}
/**
* @throws \Exception
*/
public function fetchAndAssociateRelatedActivity(Activity $activity): ?Activity
{
if ($activity->getCrm()?->getEdition() !== IntegrationAppProviders::ZOHO_CRM) {
return null;
}
if (! $activity->isTypeConference()) {
return null;
}
// The related activity is already linked.
if ($activity->hasCrmProviderId()) {
return $activity;
}
if ($activity->hasActualStartTime() === false) {
return null;
}
return $this->fetchAndAssociateZohoRelatedActivity($activity);
}
public function fetchAndAssociateZohoRelatedActivity(Activity $activity): ?Activity
{
try {
$meeting = $this->fetchRelatedZohoActivity($activity);
if (empty($meeting)) {
$this->logger->info('[integration-app] fetchRelatedZohoActivity No related activity found', [
'activity' => $activity->getUuid(),
]);
return null;
}
$decorateActivity = app(DecorateActivity::class);
$oldDescription = $meeting['Description'] ?? '';
$updatedDescription = $decorateActivity->generateUpdatedDescription($oldDescription, $activity);
$this->logger->info('[integration-app] fetchAndAssociateZohoRelatedActivity updating related activity', [
'activity' => $activity->getUuid(),
'description' => $updatedDescription,
]);
$this->client->updateMeeting($meeting['id'], ['Description' => $updatedDescription]);
// Update our activity to reflect the remote data.
$activity->update([
'crm_provider_id' => $meeting['id'],
'summary' => $meeting['Description'],
]);
return $activity;
} catch (\Exception $exception) {
\Sentry::captureException($exception);
throw $exception;
}
}
public function fetchRelatedZohoActivity(Activity $activity): array
{
[$from, $to] = $this->getFromToDates($activity);
$start = $from?->toIso8601String(); // e.g., 2025-07-01T00:00:00+00:00
$end = $to?->toIso8601String(); // e.g., 2025-07-14T23:59:59+00:00
if ($start === null || $end === null) {
$this->logger->info(
'[integration-app] fetchRelatedZohoActivity missing start or end date',
[
'activity' => $activity->getUuid(),
'start' => $start,
'end' => $end,
'from' => $from,
'to' => $to,
]
);
return [];
}
$whoId = null;
$whatId = null;
$criteriaParts = [];
if ($activity->getContact()) {
$whoId = $activity->getContact()->getCrmProviderId();
$criteriaParts[] = "(Who_Id:equals:$whoId)";
}
if ($activity->getOpportunity()) {
$whatId = $activity->getOpportunity()->getCrmProviderId();
} elseif ($activity->getAccount() && $activity->getAccount()->getIsInternal() === false) {
$whatId = $activity->getAccount()->getCrmProviderId();
} elseif ($activity->getLead()) {
$whatId = $activity->getLead()->getCrmProviderId();
}
if ($whatId !== null) {
$criteriaParts[] = "(What_Id:equals:$whatId)";
}
if ($whoId === null && $whatId === null) {
$this->logger->info(
'[integration-app] fetchRelatedZohoActivity cannot find prospect',
[
'activity' => $activity->getUuid(),
]
);
return [];
}
$criteriaParts[] = "(Start_DateTime:greater_equal:$start)";
$criteriaParts[] = "(End_DateTime:less_equal:$end)";
$criteria = implode(' AND ', $criteriaParts);
$params = [
'criteria' => $criteria,
'sort_by' => 'Modified_Time',
'sort_order' => 'desc',
];
$this->logger->info(
'[integration-app] fetchRelatedZohoActivity searching for related activity',
[
'activity' => $activity->getUuid(),
'params' => $params,
]
);
$meetings = $this->client->searchMeetings($params);
if (! empty($meetings)) {
return $meetings[0];
}
return [];
}
private function getFromToDates(Activity $activity): array
{
$calendarEvent = $activity->calendarEvent()->first();
$from = $calendarEvent?->getStartTime();
$to = $calendarEvent?->getEndTime();
if (! $from || ! $to) {
$from = $activity->hasScheduledStartTime()
? $activity->getScheduledStartTime()
: $activity->getActualStartTime();
$to = $activity->hasScheduledEndTime()
? $activity->getScheduledEndTime()->addMinutes(15)
: $activity->getActualEndTime();
}
return [$from, $to];
}
}
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
8
1
3
4
Previous Highlighted Error
Next Highlighted Error
SELECT
# DISTINCT
opp.id as opp_id, opp.uuid, opp.name,
# COUNT(dr.id) AS deal_risk_count,
# dr.id,
# cfd.value,
usr.name AS owner_name,
opp.value, opp.currency_code, opp.close_date, opp.remotely_created_at, opp.is_closed, opp.is_won,
usr.uuid as owner_uuid,
usr.photo_path as owner_photo,
usr.id AS owner_id,
jt.name as owner_job,
opp.stage_id, opp.stage_updated_at,
acc.name AS acc_name, opp.stage_updated_at, acc.crm_provider_id AS acc_provider_id, opp.crm_provider_id AS opp_provider_id,
rt.business_process_id AS pipeline_id
FROM opportunities opp
LEFT JOIN record_types rt ON opp.record_type_id = rt.id
LEFT JOIN users usr ON opp.user_id = usr.id
LEFT JOIN accounts acc ON opp.account_id = acc.id
LEFT JOIN job_titles jt ON usr.job_title_id = jt.id
# LEFT JOIN group_deal_risk_types gdrt ON gdrt.group_id = usr.group_id
# LEFT JOIN deal_risks dr ON dr.opportunity_id = opp.id AND dr.group_deal_risk_type_id = gdrt.id
LEFT JOIN crm_field_data cfd ON (cfd.object_id = opp.id and cfd.crm_field_id = 66814)
WHERE opp.user_id IS NOT NULL
AND opp.deleted_at IS NULL
AND opp.is_closed = 1
AND opp.is_won = 0
AND opp.close_date >= '2024-01-01 00:00:00'
AND opp.close_date <= '2024-12-31 23:59:59'
AND usr.team_id = 1
# and opp.id = 4823179
GROUP BY opp.id, cfd.value
ORDER BY
# cfd.value
CAST(cfd.value AS UNSIGNED)
# owner_name
# (SELECT COUNT(dr.id)
# FROM deal_risks dr
# JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id
# WHERE dr.opportunity_id = opp.id
# AND dr.is_active = 1
# AND gdrt.is_enabled = 1)
DESC
LIMIT 25
# OFFSET 0
;
select * from crm_fields where crm_configuration_id = 1 and object_type = 'opportunity';
select * from crm_layout_entities where crm_layout_id = 1493;
SELECT * FROM opportunities WHERE id = 4584045;
SELECT * FROM crm_field_data WHERE object_id = 4584045;
SELECT * FROM opportunities where team_id = 1 and crm_provider_id = '0061K00000lfb9IQAQ'
SELECT
opp.id as opportunity_id,
opp.name,
COUNT(dr.id) as risk_count
FROM opportunities opp
LEFT JOIN deal_risks dr ON dr.opportunity_id = opp.id
WHERE opp.id IN (
6069574,8900938,9507638,9524799,9660490,9662824,9705675,9749758,4158460,4391812,6450439,4448422,5118945,5590675,4584045,7228149,9002408,9165534,9446720,9641778,9665149,9703344,9709280,5747948,4158491,6182565,6263970,5798120,5111315,4536978,6062352,6548383,6072095,6548225,4480986,5011422,6548381,8760540,8917554,9509986,9514392,9569009,9569011,9578490,9713604,5784397,7276612,7288405,8994421,9118219,9608148,9818911,4510535,6479693,5958049,6271674,6550448,4158331,4158483,6126571,6171615,6540943,4897466,5190896,5796182,5932762,8572433,8723698,8892697,9711001,9789264,4549188,6100831,6170064,6260799,6263653,6449936,6530871,6538978,7777651,8059269,8319918,8787049,8901150,9263153,9453207,9514738,9696700,9791062,5752018,6421452,7439134,7878923,9354763,9369285,9514396,9582506,9889949,9890216,4094311,4158495,4158496,6098128,5585661,3872564,6442149,5891604,6164746,6199593,6583474,6519684,9018490,9809006,4496897,5041324,5829430,6198319,6253504,6555763,7242914,7931055,8024125,8797814,8058559,8673347,8892695,8994420,9616219,9714970,9722004,9809439,9818918,6523177,8134147,9002915,9711422,9892713,9901719,9954210,9978435,5800810,6243518,6416114,6222251,6411974,6512456,5791953,6545606,9914780,5805540,6238986,6463838,6547680,9767049,9809437,9810885,9890855,6673493,9902036,4335521,6379871,6503799,6546077,8018765,9907556,9958433,9905855,9916179,9946741,9957877,5563344,6271838,6450815,7641128,7762567,7780592,8684810,8685786,8685787,8685788
)
GROUP BY opp.id;
SELECT COUNT(dr.id)
FROM deal_risks dr
JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id
WHERE dr.opportunity_id = 5563344
# AND gdrt.group_id = usr.group_id
EXPLAIN SELECT
opp.id as opp_id, opp.uuid, opp.name,
cfd.value,
cfv.sequence,
cfv.value,
# MAX(cfd.value) AS max_cfd_value,
usr.name AS owner_name,
opp.value, opp.currency_code, opp.close_date, opp.remotely_created_at, opp.is_closed, opp.is_won,
usr.uuid as owner_uuid,
usr.photo_path as owner_photo,
usr.id AS owner_id,
jt.name as owner_job,
opp.stage_id, opp.stage_updated_at,
acc.name AS acc_name, opp.stage_updated_at, acc.crm_provider_id AS acc_provider_id, opp.crm_provider_id AS opp_provider_id,
rt.business_process_id AS pipeline_id
FROM opportunities opp
LEFT JOIN record_types rt ON opp.record_type_id = rt.id
LEFT JOIN users usr ON opp.user_id = usr.id
LEFT JOIN accounts acc ON opp.account_id = acc.id
LEFT JOIN job_titles jt ON usr.job_title_id = jt.id
LEFT JOIN crm_field_data cfd ON cfd.id = (SELECT sub_cfd.id
FROM crm_field_data sub_cfd
WHERE sub_cfd.object_id = opp.id
AND sub_cfd.crm_field_id = 66810
ORDER BY sub_cfd.updated_at DESC
LIMIT 1)
LEFT JOIN crm_field_values cfv ON cfv.crm_field_id = 66810 AND cfv.value = cfd.value
WHERE opp.user_id IS NOT NULL
AND opp.deleted_at IS NULL
AND opp.is_closed = 0
# AND opp.is_closed = 1
# AND opp.is_won = 0
AND opp.close_date >= '2024-01-01 00:00:00'
AND opp.close_date <= '2024-12-31 23:59:59'
AND usr.team_id = 1
# and opp.id = 4823179
# GROUP BY opp.id
ORDER BY
cfv.sequence DESC,
# opp.name
# owner_name
cfd.value
# CAST(cfd.value AS UNSIGNED)
# CAST(MAX(cfd.value) AS UNSIGNED)
# (SELECT COUNT(dr.id)
# FROM deal_risks dr
# JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id
# WHERE dr.opportunity_id = opp.id
# AND dr.is_active = 1 AND gdrt.is_enabled = 1)
DESC
# LIMIT 75, 25
;
SELECT * FROM crm_field_values WHERE crm_field_id = 66810;
SELECT f.id, f.crm_provider_id AS field_name, f.label, fd.object_id AS dealId, fd.value, fd.updated_at, fd.id, fd.created_at
FROM crm_fields f
INNER JOIN crm_field_data fd ON fd.crm_field_id = f.id
WHERE (f.crm_configuration_id = 1)
AND (f.object_type = 'opportunity')
# AND (fd.object_id IN (4158331,4158483,4158495,4158496,6069574,6263970,6171615,6540943,6545606,5829430,6198319,6263653,6548381,7242914,8797814,7228149,7439134,7878923,8134147,9002915,9118219,9165534,9354763,9369285,9446720))
AND (fd.object_id IN (4158460))
AND (f.crm_provider_id IN ('ForecastCategoryName'))
ORDER BY fd.object_id ASC, fd.updated_at DESC;
select * from crm_layouts where crm_configuration_id = 1;
select cf.* from crm_fields cf
join crm_layout_entities cle on cf.id = cle.crm_field_id
where crm_layout_id = 1493;
SELECT * FROM opportunities WHERE id = 4158460;
SELECT * FROM crm_field_data WHERE object_id = 4158460;
select * from users where team_id = 1;
SELECT * FROM users WHERE id = 7160;
select * from role_user where user_id = 3248;
select * from crm_field_values where crm_field_id = 66824;
SELECT * FROM users WHERE id = 23470;
select * from crm_configurations;
# [PASSWORD_DOTS]
select * from teams where id = 1038; # 23521, 966
select * from users where team_id = 1038;
select * from crm_configurations where id = 966;
SELECT * FROM activities WHERE uuid_to_bin('e8dc7c34-31f6-4430-bd81-2d9d8f00dd07') = uuid; # 54965762
SELECT * FROM activities WHERE uuid_to_bin('4b5727c0-69d1-428f-b8d9-b649055166e2') = uuid; # 54965764
SELECT * FROM participants WHERE activity_id = 54965764;
SELECT id, uuid, title, recording_state FROM activities WHERE uuid_to_bin('355f105d-5606-4379-b0c5-d91daf59f4ce') = uuid; # 54964075
SELECT * FROM participants WHERE activity_id = 54964075;
select f.id, slug, title, tf.team_id from team_features tf JOIN features f on tf.feature_id = f.id
where tf.team_id = 1038;
# [PASSWORD_DOTS] PD [PASSWORD_DOTS]
select * from teams where id = 1029;
SELECT * FROM crm_configurations WHERE id = 957;
SELECT * FROM activities WHERE uuid_to_bin('581a33cb-4343-44bd-ac0c-4a5cee71c5ec') = uuid; # 54963423
SELECT * FROM activities WHERE uuid_to_bin('07238011-25fa-418e-838b-fb21e82b9ea2') = uuid; # 54963433
SELECT * FROM activities WHERE uuid_to_bin('8b6bb2f7-e7a7-4aec-8806-fbfea7093ccd') = uuid; # 54963421
# [PASSWORD_DOTS] Close [PASSWORD_DOTS]
select * from teams where id = 1031;
SELECT * FROM crm_configurations WHERE id = 959;
SELECT * FROM activities WHERE uuid_to_bin('59c517e0-96c9-4dad-bfeb-b7bef72f8725') = uuid; # 54963517
SELECT * FROM activities WHERE uuid_to_bin('07238011-25fa-418e-838b-fb21e82b9ea2') = uuid; # 54963433
SELECT * FROM activities WHERE uuid_to_bin('d68311e3-ac34-49bd-bf04-88323a7e5352') = uuid; # 54966009
# [PASSWORD_DOTS] SF [PASSWORD_DOTS]
SELECT * FROM activities WHERE uuid_to_bin('2bd4cfa3-4eb5-4c77-84a7-9ed46a21c988') = uuid;
select * from roles;
select * from permissions;
select * from permission_role where permission_id = 136;
select * from migrations order by id desc;
select * from teams where id IN (1, 1037);
select * from crm_layouts where crm_configuration_id = 1;
SELECT * FROM crm_layout_entities WHERE crm_layout_id = 1493;
SELECT * FROM crm_fields WHERE id IN (1652,1661,66799,66814,66821,66836,66843,66846,66864,84752,182306,323580,380378);
select * from features;
select * from team_features where feature_id = 33;
select * from opportunities;
select * from teams;
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 = 1052 and sa.provider = 'hubspot';
SELECT * FROM accounts where id = 11512582;
select * from activities where account_id = 11512582;
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
45544
|
NULL
|
0
|
2026-05-14T14:42:03.567378+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-14/1778 /Users/lukas/.screenpipe/data/data/2026-05-14/1778769723567_m1.jpg...
|
PhpStorm
|
faVsco.js – IntegrationApp/Service.php
|
1
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
#12066 on JY-20725-handle Project: faVsco.js, menu
#12066 on JY-20725-handle-HS-search-rate-limit, menu
Start Listening for PHP Debug Connections
HandleHubspotRateLimitTest
Run 'HandleHubspotRateLimitTest'
Debug 'HandleHubspotRateLimitTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
16
2
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Services\Crm\IntegrationApp;
use Carbon\Carbon;
use Jiminny\Contracts\Crm\Providers;
use Jiminny\Contracts\Services\Crm\ClientInterface;
use Jiminny\Contracts\Services\Crm\FetchRelatedActivityInterface;
use Jiminny\Contracts\Services\Crm\ImportsBusinessProcessesInterface;
use Jiminny\Contracts\Services\Crm\LayoutManagementInterface;
use Jiminny\Contracts\Services\Crm\MatchCrmEntitiesInterface;
use Jiminny\Contracts\Services\Crm\Provider\IntegrationAppInterface;
use Jiminny\Contracts\Services\Crm\RemoteEntityLookupInterface;
use Jiminny\Contracts\Services\Crm\RemoteEntityManipulationInterface;
use Jiminny\Contracts\Services\Crm\RemoteNoteEntityManipulationInterface;
use Jiminny\Contracts\Services\Crm\SendSummaryToCrmInterface;
use Jiminny\Contracts\Services\Crm\SettingsInterface;
use Jiminny\Contracts\Services\Crm\SyncCrmEntitiesInterface;
use Jiminny\Contracts\Services\Crm\SyncCrmMetadataInterface;
use Jiminny\Events\Activities\Crm\ActivityLeadConverted;
use Jiminny\Exceptions\CrmException;
use Jiminny\Exceptions\SocialAccountNotFoundException;
use Jiminny\Jobs\Crm\NoteObject;
use Jiminny\Models\Account;
use Jiminny\Models\Activity;
use Jiminny\Models\Contracts\ActivityContract;
use Jiminny\Models\Crm\Configuration;
use Jiminny\Models\Opportunity;
use Jiminny\Models\Stage;
use Jiminny\Models\User;
use Jiminny\Services\Crm\BaseService;
use Jiminny\Services\Crm\IntegrationApp\Config\IntegrationAppProviders;
use Jiminny\Services\Crm\IntegrationApp\Config\IntegrationConfigFactory;
use Jiminny\Services\Crm\IntegrationApp\DTO\Mappers\FieldMapperInterface;
use Jiminny\Services\Crm\IntegrationApp\DTO\Mappers\LeadFieldMapper;
use Jiminny\Services\Crm\IntegrationApp\DTO\Utils\GenerateProviderUrlInterface;
use Jiminny\Services\Crm\IntegrationApp\DTO\Utils\IntegrationAppCrmGeneratorFactory;
use Jiminny\Services\Crm\IntegrationApp\DTO\Utils\UrlGeneratorInterface;
use Jiminny\Services\Crm\IntegrationApp\ServiceTraits\SyncCrmFieldsTrait;
use Jiminny\Services\Crm\IntegrationApp\ServiceTraits\SystemStateTrait;
use Jiminny\Services\Crm\IntegrationApp\ServiceTraits\LayoutTrait;
use Jiminny\Services\Crm\IntegrationApp\ServiceTraits\MatchProspectsTrait;
use Jiminny\Services\Crm\IntegrationApp\ServiceTraits\NotSupportedTrait;
use Jiminny\Services\Crm\IntegrationApp\ServiceTraits\SyncCrmEntitiesTrait;
use Jiminny\Services\Crm\IntegrationApp\ServiceTraits\SyncCrmMetadataTrait;
use Psr\Log\LoggerInterface;
use Jiminny\Services\Crm\IntegrationApp\DTO\Mappers\OpportunityFieldMapper;
use Jiminny\Repositories\Crm\ProfileRepository;
use Jiminny\Repositories\Crm\OpportunityRepository;
use Jiminny\Models\Crm\Profile;
use Jiminny\Services\Crm\CrmObjects\CrmObjectsRepository;
class Service extends BaseService implements
IntegrationAppInterface,
SyncCrmEntitiesInterface,
SyncCrmMetadataInterface,
ImportsBusinessProcessesInterface,
RemoteEntityManipulationInterface,
LayoutManagementInterface,
SettingsInterface,
MatchCrmEntitiesInterface,
RemoteEntityLookupInterface,
RemoteNoteEntityManipulationInterface,
SendSummaryToCrmInterface,
UrlGeneratorInterface,
FetchRelatedActivityInterface
{
use SyncCrmMetadataTrait;
use SyncCrmEntitiesTrait;
use SystemStateTrait;
use LayoutTrait;
use NotSupportedTrait;
use MatchProspectsTrait;
use SyncCrmFieldsTrait;
public const string CALL_TYPE_MISSED = 'Missed';
public const string CALL_TYPE_INBOUND = 'Inbound';
public const string CALL_TYPE_OUTBOUND = 'Outbound';
public const string RELATIONSHIP_OPPORTUNITY = 'Deals';
public const string RELATIONSHIP_LEAD = 'Leads';
public const string RELATIONSHIP_ACCOUNT = 'Accounts';
/**
* @var ClientInterface&DataClient
*/
protected $client;
protected ?User $invokedUser = null;
protected ?GenerateProviderUrlInterface $crmUrlGenerator = null;
public function __construct(
DataClient $client,
LoggerInterface $logger,
) {
parent::__construct();
$this->client = $client;
$this->logger = $logger;
}
public function getDisplayName(): string
{
return Providers::getProviderDisplayName(
Providers::getCrmIntegrationSlug($this->config)
);
}
/**
* @throws \Exception
*/
public function setUser(User $user): void
{
$this->configureSentryScope($user);
$this->invokedUser = $user;
$this->team = $user->getTeam();
$teamOwner = $this->team->getOwner();
$this->setConfiguration($user->getTeam()->getCrmConfiguration());
$this->setEditionConfiguration(Providers::getCrmIntegrationSlug($this->config));
$this->setCrmUrlGenerator($this->config);
$this->client->setTeam($this->team);
$socialAccount = $teamOwner?->getSocialAccount('integration-app');
if ($socialAccount === null) {
$this->logger->info('[integration-app] Social account not found', [
'teamId' => $this->team->getId(),
'teamOwnerId' => $teamOwner?->getId(),
'userId' => $user->getId(),
]);
throw new SocialAccountNotFoundException('Social account not found!');
}
$this->client->setSocialAccount($socialAccount);
// The CRM Service is properly bootstrapped, and supports remote operations
$this->connect();
}
public function normalizeValue(string $fieldType, string $fieldValue, bool $internal = false): string
{
return $fieldValue;
}
public function find(string $name, array $scopes): array
{
/** @var LocalSearch $localSearch */
$localSearch = app(LocalSearch::class);
$localSearch->setConfiguration($this->config);
$localSearch->setCountryCode($this->invokedUser->getCountryCode());
return $localSearch->search($name);
// if (! empty($localMatch)) {
// return $localMatch;
// }
//
// /** @var RemoteSearch $remoteSearch */
// $remoteSearch = app(RemoteSearch::class);
// $remoteSearch->setClient($this->client);
// $remoteSearch->setConfiguration($this->config);
//
// return $remoteSearch->search($name);
}
public function findOpportunities(?string $crmAccountId, ?string $crmContactId, ?int $userId = null): array
{
$data = [];
$ownerData = [];
$account = $this->getAccount($crmAccountId, $crmContactId);
if ($account === null) {
return [];
}
$ownerId = $this->getOwnerId($userId);
try {
$opportunityRepository = app(OpportunityRepository::class);
$opportunities = $opportunityRepository->findAllByConfigurationAndAccountId(
$this->config,
$account->getId()
);
foreach ($opportunities as $opportunity) {
/** @var Opportunity $opportunity */
$record = $this->buildOpportunityData($opportunity);
if ($ownerId && $opportunity->getOwnerId() === $ownerId) {
$ownerData[] = $record;
}
$data[] = $record;
}
if (! empty($ownerData)) {
return $ownerData;
}
return $data;
} catch (\Exception $e) {
$this->logger->info('[integration-app] Failed to fetch opportunities', [
'contact' => $crmContactId,
'account' => $crmAccountId,
'owner' => $ownerId,
'error' => $e->getMessage(),
]);
return $data;
}
}
private function getOwnerId(?int $userId = null): ?string
{
if (! $userId) {
return null;
}
$profileRepository = app(ProfileRepository::class);
$profile = $profileRepository->findProfileByUserId($this->config, $userId);
return $profile instanceof Profile ? $profile->getCrmProviderId() : null;
}
private function getAccount(?string $crmAccountId = null, ?string $crmContactId = null): ?Account
{
$crmRepository = app(CrmObjectsRepository::class);
if ($crmAccountId === null) {
$contact = $crmRepository->findContactByCrmProviderId($this->config, $crmContactId);
return $contact->getAccount();
}
return $crmRepository->findAccountByCrmProviderId($this->config, $crmAccountId);
}
private function buildOpportunityData(Opportunity $opportunity): array
{
$record = [
'crmId' => $opportunity->getCrmProviderId(),
'name' => $opportunity->getName(),
'won' => $opportunity->isWon(),
'closed' => $opportunity->isClosed(),
];
if (! empty($opportunity->getFormattedValueAttribute())) {
$record['value'] = $opportunity->getFormattedValueAttribute();
}
if (! empty($opportunity->getStage())) {
$record['stage'] = [
'id' => $opportunity->getStage()->getUuid(),
'name' => $opportunity->getStage()->getName(),
];
}
return $record;
}
public function updateRecord(string $objectType, string $objectId, array $data, array $headers = []): void
{
$data = [
'data' => $this->normalizeData($objectType, $data),
];
$this->client->updateRecordById($objectType, $objectId, $data);
}
private function normalizeData(string $objectType, array $data): array
{
$fieldMapper = $this->getFieldMapper($objectType);
if (! $fieldMapper instanceof FieldMapperInterface) {
return $data;
}
return $fieldMapper->mapToCrmFields($data);
}
private function getFieldMapper(string $objectType): ?FieldMapperInterface
{
if ($objectType === self::OBJECT_OPPORTUNITY) {
return app(OpportunityFieldMapper::class);
}
if ($objectType === self::OBJECT_LEAD) {
return app(LeadFieldMapper::class);
}
return null;
}
public function getRecord(string $objectType, string $objectId, array $fields = []): array
{
return $this->client->getRecordById($objectType, $objectId);
}
public function getConfiguration(): Configuration
{
return $this->config;
}
public function setConfiguration(Configuration $config): void
{
$this->clearExternalMapCache();
$this->config = $config;
}
private function setEditionConfiguration(string $provider): void
{
$this->editionConfig = app(IntegrationConfigFactory::class)->create($provider);
}
public function setCrmUrlGenerator(Configuration $config): void
{
$this->crmUrlGenerator = app(IntegrationAppCrmGeneratorFactory::class)->create($config);
}
public function getCrmUrlGenerator(): ?GenerateProviderUrlInterface
{
if ($this->crmUrlGenerator === null) {
$this->setCrmUrlGenerator($this->config);
}
return $this->crmUrlGenerator;
}
public function subscribeEntityEvents(bool $enableTrigger = true): void
{
$eventStates = $this->client->updateEntityEventsState($enableTrigger);
$this->logger->info('[integration-app] Change team entity events subscription', [
'teamId' => $this->team->getId(),
'teamName' => $this->team->getName(),
'states' => $eventStates,
'action' => $enableTrigger ? 'subscribe' : 'unsubscribe',
]);
}
#[\Override] public function supportsNotes(): bool
{
return $this->editionConfig->supportsNotes();
}
#[\Override] public function saveNote(
string $title,
string $body,
string $objectId,
?NoteObject $noteObject = null,
): ?string {
if ($noteObject === null) {
return null;
}
$notePayload = [
'title' => $title,
'content' => $body,
'objectId' => $objectId,
'objectType' => $noteObject->value,
];
$result = $this->client->createNote($notePayload);
// debug saving note response
$this->logger->info('[integration-app] createNote response', [
'objectId' => $objectId,
'objectType' => $noteObject->value,
'result' => $result,
'hasId' => isset($result['id']),
]);
return $result['id'] ?? null;
}
/**
* @throws CrmException
*/
#[\Override] public function saveActivity(Activity $activity): Activity
{
$this->logger->info('[integration-app] saveActivity', [
'activity' => $activity->getUuid(),
'type' => $activity->getType(),
]);
if ($activity->getCrmType() === Activity::TYPE_CONFERENCE) {
$crmActivity = $this->saveMeeting($activity);
} elseif (in_array($activity->getType(), [Activity::TYPE_SOFTPHONE, Activity::TYPE_SOFTPHONE_INBOUND])) {
$crmActivity = $this->saveCall($activity);
} else {
throw new CrmException('Unsupported activity type');
}
$crmActivityId = $crmActivity['id'] ?? null;
if ($crmActivityId !== null) {
$activity->crm_provider_id = $crmActivityId;
$activity->save();
$this->logger->info('[integration-app] Activity successfully logged to CRM', [
'activity' => $activity->getUuid(),
'type' => $activity->getType(),
'crmId' => $crmActivityId,
]);
}
return $activity;
}
public function saveMeeting(Activity $activity): array
{
$decorateActivity = app(DecorateActivity::class);
$meetingPayload = [
'Event_Title' => $decorateActivity->generateTitle($activity),
'Start_DateTime' => $activity->getActualStartTime()->toIso8601String(),
'End_DateTime' => $activity->getActualEndTime()->toIso8601String(),
'ownerId' => $this->getActivityOwnerId($activity),
];
$payload = array_merge($meetingPayload, $this->attachToProspect($activity));
if ($activity->hasCrmProviderId()) {
$crmId = $activity->getCrmProviderId();
$meeting = $this->client->getMeeting($crmId);
$oldDescription = $meeting['fields']['Description'] ?? null;
$payload['Description'] = $decorateActivity->generateUpdatedDescription($oldDescription, $activity);
$this->logger->info('[integration-app] CRM update meeting', [
'activity' => $activity->getUuid(),
'crm_id' => $crmId,
'payload' => $payload,
]);
return $this->client->updateMeeting($crmId, $payload);
}
$payload['Description'] = $decorateActivity->generateDescription($activity);
$this->logger->info('[integration-app] CRM log meeting', [
'activity' => $activity->getUuid(),
'payload' => $payload,
]);
return $this->client->createMeeting($payload);
}
public function saveCall(Activity $activity): array
{
$decorateActivity = app(DecorateActivity::class);
$callPayload = [
'Call_Type' => $this->getCallType($activity),
'Call_Start_Time' => $activity->getActualStartTime()->toIso8601String(),
'Call_Duration' => $activity->getDuration(),
'name' => $decorateActivity->generateTitle($activity),
'ownerId' => $this->getActivityOwnerId($activity),
];
$payload = array_merge($callPayload, $this->attachToProspect($activity));
if ($activity->hasCrmProviderId()) {
$crmId = $activity->getCrmProviderId();
$call = $this->client->getCall($crmId);
$oldDescription = $call['fields']['Description'] ?? null;
$payload['description'] = $decorateActivity->generateUpdatedDescription($oldDescription, $activity);
$this->logger->info('[integration-app] CRM update call', [
'activity' => $activity->getUuid(),
'crm_id' => $crmId,
'payload' => $payload,
]);
return $this->client->updateCall($crmId, $payload);
}
$payload['description'] = $decorateActivity->generateDescription($activity);
$this->logger->info('[integration-app] CRM log call', [
'activity' => $activity->getUuid(),
'payload' => $payload,
]);
return $this->client->createCall($payload);
}
private function getCallType(Activity $activity): string
{
if ($activity->getStatus() === Activity::STATUS_NO_ANSWER) {
return self::CALL_TYPE_MISSED;
}
return $activity->getType() === Activity::TYPE_SOFTPHONE_INBOUND ? self::CALL_TYPE_INBOUND : self::CALL_TYPE_OUTBOUND;
}
private function attachToProspect(Activity $activity): array
{
$payload = [];
if ($activity->hasContact()) {
$payload['contactId'] = $activity->getContact()->getCrmProviderId();
}
if ($activity->hasOpportunity()) {
return array_merge(
$payload,
$this->buildBasicPayload(
self::RELATIONSHIP_OPPORTUNITY,
$activity->getOpportunity()->getCrmProviderId()
)
);
}
if ($activity->hasAccount() && ! $activity->getAccount()->getIsInternal()) {
return array_merge(
$payload,
$this->buildBasicPayload(
self::RELATIONSHIP_ACCOUNT,
$activity->getAccount()->getCrmProviderId()
)
);
}
if ($activity->hasLead()) {
$payload = $this->handleLeadPayload($activity);
}
return $payload;
}
private function handleLeadPayload(Activity $activity): array
{
$freshLead = $this->syncLead($activity->getLead()->getCrmProviderId());
$lead = $freshLead ?? $activity->getLead();
if ($lead->getConvertedAt() === null) {
return $this->buildBasicPayload(self::RELATIONSHIP_LEAD, $lead->getCrmProviderId());
}
$activity->lead_id = null;
if ($lead->hasAccount()) {
$account = $lead->getAccount();
$activity->account_id = $account->getId();
$payload = $this->buildBasicPayload(self::RELATIONSHIP_ACCOUNT, $account->getCrmProviderId());
} else {
$payload = [];
}
if ($lead->hasOpportunity()) {
$opportunity = $lead->getOpportunity();
$payload = $this->buildBasicPayload(self::RELATIONSHIP_OPPORTUNITY, $opportunity->getCrmProviderId());
$activity->opportunity_id = $opportunity->getId();
$activity->value = $opportunity->value;
$activity->stage_id = $opportunity->stage_id;
} else {
$activity->stage_id = null;
}
if ($lead->hasContact()) {
$contact = $lead->getContact();
$payload['contactId'] = $contact->getCrmProviderId();
$activity->contact_id = $contact->getId();
}
$activity->save();
event(new ActivityLeadConverted($activity, $lead));
$this->logger->info('[integration-app] Lead converted', [
'activityUuid' => $activity->getUuid(),
'leadUuid' => $lead->getUuid(),
]);
return $payload;
}
private function buildBasicPayload(string $type, string $id): array
{
return [
'type' => $type,
'id' => $id,
];
}
private function getActivityOwnerId(Activity $activity): ?string
{
$ownerId = null;
if ($activity->hasUser() && $activity->getUser()->getProfile() !== null) {
$ownerId = $activity->getUser()->getProfile()->getCrmProviderId();
}
return $ownerId;
}
#[\Override] public function saveFollowupActivity(Activity $activity, array $fields): ?string
{
$taskPayload = [
'subject' => $fields['subject'],
'dueTime' => isset($fields['dueDate']) ? Carbon::parse($fields['dueDate'])->format('Y-m-d') : null,
'ownerId' => $this->getActivityOwnerId($activity),
];
if (isset($fields['status'])) {
$taskPayload['status'] = $fields['status'];
}
if (isset($fields['priority'])) {
$taskPayload['priority'] = $fields['priority'];
}
if (isset($fields['content'])) {
$taskPayload['content'] = $fields['content'];
}
$payload = array_merge($taskPayload, $this->attachToProspect($activity));
$this->logger->info('[integration-app] CRM log follow up task', [
'activity' => $activity->getUuid(),
'payload' => $payload,
]);
$task = $this->client->createTask($payload);
return $task['id'] ?? null;
}
#[\Override] public function saveTranscriptionSummaryAsNote(
ActivityContract $activity,
string $title,
string $body,
?string $objectId,
?NoteObject $noteObject = null,
): ?string {
// We have to find a way to store the transcription summary
// This might be possible either by Tasks, Events, Engagements & Notes
// Find what the CRM supports and save the note with the appropriate object(eg Notes)
// For now use only Notes as both ZOHO & Salesforce support them.
if ($this->supportsNotes() && $objectId !== null) {
$this->logger->info('[integration-app] saving note', [
'activityId' => $activity->getUuid(),
'objectId' => $objectId,
]);
return $this->saveNote($title, $body, $objectId, $noteObject);
}
$this->logger->info('[integration-app] skip saveTranscriptionSummaryAsNote', [
'activityId' => $activity->getUuid(),
'supportsNotes' => $this->supportsNotes(),
'objectId' => $objectId,
]);
return null;
}
public function generateProviderUrl(string $providerId, string $objectType): ?string
{
return $this->getCrmUrlGenerator()?->generateProviderUrl($providerId, $objectType);
}
public function updateStage($crmObject, Stage $stage): void
{
$objectType = $stage->getType();
$objectId = $crmObject->getCrmProviderId();
$params = ['stageName' => $stage->getCrmProviderId()];
$this->logger->info('[integration-app] updateStage', [
'objectType' => $objectType,
'objectId' => $objectId,
'params' => $params,
]);
$data = [
'data' => $this->normalizeData($objectType, $params),
];
if ($objectType === Stage::TYPE_LEAD) {
$this->client->updateLead($objectId, $data);
} else {
$this->client->updateDeal($objectId, $data);
}
}
/**
* @throws \Exception
*/
public function fetchAndAssociateRelatedActivity(Activity $activity): ?Activity
{
if ($activity->getCrm()?->getEdition() !== IntegrationAppProviders::ZOHO_CRM) {
return null;
}
if (! $activity->isTypeConference()) {
return null;
}
// The related activity is already linked.
if ($activity->hasCrmProviderId()) {
return $activity;
}
if ($activity->hasActualStartTime() === false) {
return null;
}
return $this->fetchAndAssociateZohoRelatedActivity($activity);
}
public function fetchAndAssociateZohoRelatedActivity(Activity $activity): ?Activity
{
try {
$meeting = $this->fetchRelatedZohoActivity($activity);
if (empty($meeting)) {
$this->logger->info('[integration-app] fetchRelatedZohoActivity No related activity found', [
'activity' => $activity->getUuid(),
]);
return null;
}
$decorateActivity = app(DecorateActivity::class);
$oldDescription = $meeting['Description'] ?? '';
$updatedDescription = $decorateActivity->generateUpdatedDescription($oldDescription, $activity);
$this->logger->info('[integration-app] fetchAndAssociateZohoRelatedActivity updating related activity', [
'activity' => $activity->getUuid(),
'description' => $updatedDescription,
]);
$this->client->updateMeeting($meeting['id'], ['Description' => $updatedDescription]);
// Update our activity to reflect the remote data.
$activity->update([
'crm_provider_id' => $meeting['id'],
'summary' => $meeting['Description'],
]);
return $activity;
} catch (\Exception $exception) {
\Sentry::captureException($exception);
throw $exception;
}
}
public function fetchRelatedZohoActivity(Activity $activity): array
{
[$from, $to] = $this->getFromToDates($activity);
$start = $from?->toIso8601String(); // e.g., 2025-07-01T00:00:00+00:00
$end = $to?->toIso8601String(); // e.g., 2025-07-14T23:59:59+00:00
if ($start === null || $end === null) {
$this->logger->info(
'[integration-app] fetchRelatedZohoActivity missing start or end date',
[
'activity' => $activity->getUuid(),
'start' => $start,
'end' => $end,
'from' => $from,
'to' => $to,
]
);
return [];
}
$whoId = null;
$whatId = null;
$criteriaParts = [];
if ($activity->getContact()) {
$whoId = $activity->getContact()->getCrmProviderId();
$criteriaParts[] = "(Who_Id:equals:$whoId)";
}
if ($activity->getOpportunity()) {
$whatId = $activity->getOpportunity()->getCrmProviderId();
} elseif ($activity->getAccount() && $activity->getAccount()->getIsInternal() === false) {
$whatId = $activity->getAccount()->getCrmProviderId();
} elseif ($activity->getLead()) {
$whatId = $activity->getLead()->getCrmProviderId();
}
if ($whatId !== null) {
$criteriaParts[] = "(What_Id:equals:$whatId)";
}
if ($whoId === null && $whatId === null) {
$this->logger->info(
'[integration-app] fetchRelatedZohoActivity cannot find prospect',
[
'activity' => $activity->getUuid(),
]
);
return [];
}
$criteriaParts[] = "(Start_DateTime:greater_equal:$start)";
$criteriaParts[] = "(End_DateTime:less_equal:$end)";
$criteria = implode(' AND ', $criteriaParts);
$params = [
'criteria' => $criteria,
'sort_by' => 'Modified_Time',
'sort_order' => 'desc',
];
$this->logger->info(
'[integration-app] fetchRelatedZohoActivity searching for related activity',
[
'activity' => $activity->getUuid(),
'params' => $params,
]
);
$meetings = $this->client->searchMeetings($params);
if (! empty($meetings)) {
return $meetings[0];
}
return [];
}
private function getFromToDates(Activity $activity): array
{
$calendarEvent = $activity->calendarEvent()->first();
$from = $calendarEvent?->getStartTime();
$to = $calendarEvent?->getEndTime();
if (! $from || ! $to) {
$from = $activity->hasScheduledStartTime()
? $activity->getScheduledStartTime()
: $activity->getActualStartTime();
$to = $activity->hasScheduledEndTime()
? $activity->getScheduledEndTime()->addMinutes(15)
: $activity->getActualEndTime();
}
return [$from, $to];
}
}
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
8
1
3
4
Previous Highlighted Error
Next Highlighted Error
SELECT
# DISTINCT
opp.id as opp_id, opp.uuid, opp.name,
# COUNT(dr.id) AS deal_risk_count,
# dr.id,
# cfd.value,
usr.name AS owner_name,
opp.value, opp.currency_code, opp.close_date, opp.remotely_created_at, opp.is_closed, opp.is_won,
usr.uuid as owner_uuid,
usr.photo_path as owner_photo,
usr.id AS owner_id,
jt.name as owner_job,
opp.stage_id, opp.stage_updated_at,
acc.name AS acc_name, opp.stage_updated_at, acc.crm_provider_id AS acc_provider_id, opp.crm_provider_id AS opp_provider_id,
rt.business_process_id AS pipeline_id
FROM opportunities opp
LEFT JOIN record_types rt ON opp.record_type_id = rt.id
LEFT JOIN users usr ON opp.user_id = usr.id
LEFT JOIN accounts acc ON opp.account_id = acc.id
LEFT JOIN job_titles jt ON usr.job_title_id = jt.id
# LEFT JOIN group_deal_risk_types gdrt ON gdrt.group_id = usr.group_id
# LEFT JOIN deal_risks dr ON dr.opportunity_id = opp.id AND dr.group_deal_risk_type_id = gdrt.id
LEFT JOIN crm_field_data cfd ON (cfd.object_id = opp.id and cfd.crm_field_id = 66814)
WHERE opp.user_id IS NOT NULL
AND opp.deleted_at IS NULL
AND opp.is_closed = 1
AND opp.is_won = 0
AND opp.close_date >= '2024-01-01 00:00:00'
AND opp.close_date <= '2024-12-31 23:59:59'
AND usr.team_id = 1
# and opp.id = 4823179
GROUP BY opp.id, cfd.value
ORDER BY
# cfd.value
CAST(cfd.value AS UNSIGNED)
# owner_name
# (SELECT COUNT(dr.id)
# FROM deal_risks dr
# JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id
# WHERE dr.opportunity_id = opp.id
# AND dr.is_active = 1
# AND gdrt.is_enabled = 1)
DESC
LIMIT 25
# OFFSET 0
;
select * from crm_fields where crm_configuration_id = 1 and object_type = 'opportunity';
select * from crm_layout_entities where crm_layout_id = 1493;
SELECT * FROM opportunities WHERE id = 4584045;
SELECT * FROM crm_field_data WHERE object_id = 4584045;
SELECT * FROM opportunities where team_id = 1 and crm_provider_id = '0061K00000lfb9IQAQ'
SELECT
opp.id as opportunity_id,
opp.name,
COUNT(dr.id) as risk_count
FROM opportunities opp
LEFT JOIN deal_risks dr ON dr.opportunity_id = opp.id
WHERE opp.id IN (
6069574,8900938,9507638,9524799,9660490,9662824,9705675,9749758,4158460,4391812,6450439,4448422,5118945,5590675,4584045,7228149,9002408,9165534,9446720,9641778,9665149,9703344,9709280,5747948,4158491,6182565,6263970,5798120,5111315,4536978,6062352,6548383,6072095,6548225,4480986,5011422,6548381,8760540,8917554,9509986,9514392,9569009,9569011,9578490,9713604,5784397,7276612,7288405,8994421,9118219,9608148,9818911,4510535,6479693,5958049,6271674,6550448,4158331,4158483,6126571,6171615,6540943,4897466,5190896,5796182,5932762,8572433,8723698,8892697,9711001,9789264,4549188,6100831,6170064,6260799,6263653,6449936,6530871,6538978,7777651,8059269,8319918,8787049,8901150,9263153,9453207,9514738,9696700,9791062,5752018,6421452,7439134,7878923,9354763,9369285,9514396,9582506,9889949,9890216,4094311,4158495,4158496,6098128,5585661,3872564,6442149,5891604,6164746,6199593,6583474,6519684,9018490,9809006,4496897,5041324,5829430,6198319,6253504,6555763,7242914,7931055,8024125,8797814,8058559,8673347,8892695,8994420,9616219,9714970,9722004,9809439,9818918,6523177,8134147,9002915,9711422,9892713,9901719,9954210,9978435,5800810,6243518,6416114,6222251,6411974,6512456,5791953,6545606,9914780,5805540,6238986,6463838,6547680,9767049,9809437,9810885,9890855,6673493,9902036,4335521,6379871,6503799,6546077,8018765,9907556,9958433,9905855,9916179,9946741,9957877,5563344,6271838,6450815,7641128,7762567,7780592,8684810,8685786,8685787,8685788
)
GROUP BY opp.id;
SELECT COUNT(dr.id)
FROM deal_risks dr
JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id
WHERE dr.opportunity_id = 5563344
# AND gdrt.group_id = usr.group_id
EXPLAIN SELECT
opp.id as opp_id, opp.uuid, opp.name,
cfd.value,
cfv.sequence,
cfv.value,
# MAX(cfd.value) AS max_cfd_value,
usr.name AS owner_name,
opp.value, opp.currency_code, opp.close_date, opp.remotely_created_at, opp.is_closed, opp.is_won,
usr.uuid as owner_uuid,
usr.photo_path as owner_photo,
usr.id AS owner_id,
jt.name as owner_job,
opp.stage_id, opp.stage_updated_at,
acc.name AS acc_name, opp.stage_updated_at, acc.crm_provider_id AS acc_provider_id, opp.crm_provider_id AS opp_provider_id,
rt.business_process_id AS pipeline_id
FROM opportunities opp
LEFT JOIN record_types rt ON opp.record_type_id = rt.id
LEFT JOIN users usr ON opp.user_id = usr.id
LEFT JOIN accounts acc ON opp.account_id = acc.id
LEFT JOIN job_titles jt ON usr.job_title_id = jt.id
LEFT JOIN crm_field_data cfd ON cfd.id = (SELECT sub_cfd.id
FROM crm_field_data sub_cfd
WHERE sub_cfd.object_id = opp.id
AND sub_cfd.crm_field_id = 66810
ORDER BY sub_cfd.updated_at DESC
LIMIT 1)
LEFT JOIN crm_field_values cfv ON cfv.crm_field_id = 66810 AND cfv.value = cfd.value
WHERE opp.user_id IS NOT NULL
AND opp.deleted_at IS NULL
AND opp.is_closed = 0
# AND opp.is_closed = 1
# AND opp.is_won = 0
AND opp.close_date >= '2024-01-01 00:00:00'
AND opp.close_date <= '2024-12-31 23:59:59'
AND usr.team_id = 1
# and opp.id = 4823179
# GROUP BY opp.id
ORDER BY
cfv.sequence DESC,
# opp.name
# owner_name
cfd.value
# CAST(cfd.value AS UNSIGNED)
# CAST(MAX(cfd.value) AS UNSIGNED)
# (SELECT COUNT(dr.id)
# FROM deal_risks dr
# JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id
# WHERE dr.opportunity_id = opp.id
# AND dr.is_active = 1 AND gdrt.is_enabled = 1)
DESC
# LIMIT 75, 25
;
SELECT * FROM crm_field_values WHERE crm_field_id = 66810;
SELECT f.id, f.crm_provider_id AS field_name, f.label, fd.object_id AS dealId, fd.value, fd.updated_at, fd.id, fd.created_at
FROM crm_fields f
INNER JOIN crm_field_data fd ON fd.crm_field_id = f.id
WHERE (f.crm_configuration_id = 1)
AND (f.object_type = 'opportunity')
# AND (fd.object_id IN (4158331,4158483,4158495,4158496,6069574,6263970,6171615,6540943,6545606,5829430,6198319,6263653,6548381,7242914,8797814,7228149,7439134,7878923,8134147,9002915,9118219,9165534,9354763,9369285,9446720))
AND (fd.object_id IN (4158460))
AND (f.crm_provider_id IN ('ForecastCategoryName'))
ORDER BY fd.object_id ASC, fd.updated_at DESC;
select * from crm_layouts where crm_configuration_id = 1;
select cf.* from crm_fields cf
join crm_layout_entities cle on cf.id = cle.crm_field_id
where crm_layout_id = 1493;
SELECT * FROM opportunities WHERE id = 4158460;
SELECT * FROM crm_field_data WHERE object_id = 4158460;
select * from users where team_id = 1;
SELECT * FROM users WHERE id = 7160;
select * from role_user where user_id = 3248;
select * from crm_field_values where crm_field_id = 66824;
SELECT * FROM users WHERE id = 23470;
select * from crm_configurations;
# [PASSWORD_DOTS]
select * from teams where id = 1038; # 23521, 966
select * from users where team_id = 1038;
select * from crm_configurations where id = 966;
SELECT * FROM activities WHERE uuid_to_bin('e8dc7c34-31f6-4430-bd81-2d9d8f00dd07') = uuid; # 54965762
SELECT * FROM activities WHERE uuid_to_bin('4b5727c0-69d1-428f-b8d9-b649055166e2') = uuid; # 54965764
SELECT * FROM participants WHERE activity_id = 54965764;
SELECT id, uuid, title, recording_state FROM activities WHERE uuid_to_bin('355f105d-5606-4379-b0c5-d91daf59f4ce') = uuid; # 54964075
SELECT * FROM participants WHERE activity_id = 54964075;
select f.id, slug, title, tf.team_id from team_features tf JOIN features f on tf.feature_id = f.id
where tf.team_id = 1038;
# [PASSWORD_DOTS] PD [PASSWORD_DOTS]
select * from teams where id = 1029;
SELECT * FROM crm_configurations WHERE id = 957;
SELECT * FROM activities WHERE uuid_to_bin('581a33cb-4343-44bd-ac0c-4a5cee71c5ec') = uuid; # 54963423
SELECT * FROM activities WHERE uuid_to_bin('07238011-25fa-418e-838b-fb21e82b9ea2') = uuid; # 54963433
SELECT * FROM activities WHERE uuid_to_bin('8b6bb2f7-e7a7-4aec-8806-fbfea7093ccd') = uuid; # 54963421
# [PASSWORD_DOTS] Close [PASSWORD_DOTS]
select * from teams where id = 1031;
SELECT * FROM crm_configurations WHERE id = 959;
SELECT * FROM activities WHERE uuid_to_bin('59c517e0-96c9-4dad-bfeb-b7bef72f8725') = uuid; # 54963517
SELECT * FROM activities WHERE uuid_to_bin('07238011-25fa-418e-838b-fb21e82b9ea2') = uuid; # 54963433
SELECT * FROM activities WHERE uuid_to_bin('d68311e3-ac34-49bd-bf04-88323a7e5352') = uuid; # 54966009
# [PASSWORD_DOTS] SF [PASSWORD_DOTS]
SELECT * FROM activities WHERE uuid_to_bin('2bd4cfa3-4eb5-4c77-84a7-9ed46a21c988') = uuid;
select * from roles;
select * from permissions;
select * from permission_role where permission_id = 136;
select * from migrations order by id desc;
select * from teams where id IN (1, 1037);
select * from crm_layouts where crm_configuration_id = 1;
SELECT * FROM crm_layout_entities WHERE crm_layout_id = 1493;
SELECT * FROM crm_fields WHERE id IN (1652,1661,66799,66814,66821,66836,66843,66846,66864,84752,182306,323580,380378);
select * from features;
select * from team_features where feature_id = 33;
select * from opportunities;
select * from teams;
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 = 1052 and sa.provider = 'hubspot';
SELECT * FROM accounts where id = 11512582;
select * from activities where account_id = 11512582;
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.054166667,"top":0.027777778,"width":0.08055556,"height":0.035555556},"on_screen":true,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"#12066 on JY-20725-handle-HS-search-rate-limit, menu","depth":5,"bounds":{"left":0.13472222,"top":0.027777778,"width":0.25555557,"height":0.035555556},"on_screen":true,"help_text":"Pull request #12066 exists for current branch JY-20725-handle-HS-search-rate-limit, but local branch is out of sync with remote","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"bounds":{"left":0.6326389,"top":0.027777778,"width":0.023611112,"height":0.035555556},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"HandleHubspotRateLimitTest","depth":6,"bounds":{"left":0.6645833,"top":0.027777778,"width":0.15902779,"height":0.035555556},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run 'HandleHubspotRateLimitTest'","depth":6,"bounds":{"left":0.82361114,"top":0.027777778,"width":0.023611112,"height":0.035555556},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'HandleHubspotRateLimitTest'","depth":6,"bounds":{"left":0.8472222,"top":0.027777778,"width":0.023611112,"height":0.035555556},"on_screen":true,"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.87083334,"top":0.027777778,"width":0.023611112,"height":0.035555556},"on_screen":true,"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.9291667,"top":0.027777778,"width":0.023611112,"height":0.035555556},"on_screen":true,"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.9527778,"top":0.027777778,"width":0.023611112,"height":0.035555556},"on_screen":true,"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.9763889,"top":0.027777778,"width":0.023611112,"height":0.035555556},"on_screen":true,"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},"on_screen":false,"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},"on_screen":false,"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},"on_screen":false,"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},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"16","depth":4,"bounds":{"left":0.77708334,"top":0.3122222,"width":0.02013889,"height":0.02111111},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"2","depth":4,"bounds":{"left":0.80138886,"top":0.3122222,"width":0.016666668,"height":0.02111111},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.8215278,"top":0.31,"width":0.015277778,"height":0.025555555},"on_screen":true,"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.8368056,"top":0.31,"width":0.014583333,"height":0.025555555},"on_screen":true,"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\\IntegrationApp;\n\nuse Carbon\\Carbon;\nuse Jiminny\\Contracts\\Crm\\Providers;\nuse Jiminny\\Contracts\\Services\\Crm\\ClientInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\FetchRelatedActivityInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\ImportsBusinessProcessesInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\LayoutManagementInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\MatchCrmEntitiesInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\Provider\\IntegrationAppInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\RemoteEntityLookupInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\RemoteEntityManipulationInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\RemoteNoteEntityManipulationInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\SendSummaryToCrmInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\SettingsInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\SyncCrmEntitiesInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\SyncCrmMetadataInterface;\nuse Jiminny\\Events\\Activities\\Crm\\ActivityLeadConverted;\nuse Jiminny\\Exceptions\\CrmException;\nuse Jiminny\\Exceptions\\SocialAccountNotFoundException;\nuse Jiminny\\Jobs\\Crm\\NoteObject;\nuse Jiminny\\Models\\Account;\nuse Jiminny\\Models\\Activity;\nuse Jiminny\\Models\\Contracts\\ActivityContract;\nuse Jiminny\\Models\\Crm\\Configuration;\nuse Jiminny\\Models\\Opportunity;\nuse Jiminny\\Models\\Stage;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Services\\Crm\\BaseService;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\Config\\IntegrationAppProviders;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\Config\\IntegrationConfigFactory;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\DTO\\Mappers\\FieldMapperInterface;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\DTO\\Mappers\\LeadFieldMapper;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\DTO\\Utils\\GenerateProviderUrlInterface;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\DTO\\Utils\\IntegrationAppCrmGeneratorFactory;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\DTO\\Utils\\UrlGeneratorInterface;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\ServiceTraits\\SyncCrmFieldsTrait;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\ServiceTraits\\SystemStateTrait;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\ServiceTraits\\LayoutTrait;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\ServiceTraits\\MatchProspectsTrait;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\ServiceTraits\\NotSupportedTrait;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\ServiceTraits\\SyncCrmEntitiesTrait;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\ServiceTraits\\SyncCrmMetadataTrait;\nuse Psr\\Log\\LoggerInterface;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\DTO\\Mappers\\OpportunityFieldMapper;\nuse Jiminny\\Repositories\\Crm\\ProfileRepository;\nuse Jiminny\\Repositories\\Crm\\OpportunityRepository;\nuse Jiminny\\Models\\Crm\\Profile;\nuse Jiminny\\Services\\Crm\\CrmObjects\\CrmObjectsRepository;\n\nclass Service extends BaseService implements\n IntegrationAppInterface,\n SyncCrmEntitiesInterface,\n SyncCrmMetadataInterface,\n ImportsBusinessProcessesInterface,\n RemoteEntityManipulationInterface,\n LayoutManagementInterface,\n SettingsInterface,\n MatchCrmEntitiesInterface,\n RemoteEntityLookupInterface,\n RemoteNoteEntityManipulationInterface,\n SendSummaryToCrmInterface,\n UrlGeneratorInterface,\n FetchRelatedActivityInterface\n{\n use SyncCrmMetadataTrait;\n use SyncCrmEntitiesTrait;\n use SystemStateTrait;\n use LayoutTrait;\n use NotSupportedTrait;\n use MatchProspectsTrait;\n use SyncCrmFieldsTrait;\n\n public const string CALL_TYPE_MISSED = 'Missed';\n public const string CALL_TYPE_INBOUND = 'Inbound';\n public const string CALL_TYPE_OUTBOUND = 'Outbound';\n public const string RELATIONSHIP_OPPORTUNITY = 'Deals';\n public const string RELATIONSHIP_LEAD = 'Leads';\n public const string RELATIONSHIP_ACCOUNT = 'Accounts';\n\n /**\n * @var ClientInterface&DataClient\n */\n protected $client;\n\n protected ?User $invokedUser = null;\n\n protected ?GenerateProviderUrlInterface $crmUrlGenerator = null;\n\n public function __construct(\n DataClient $client,\n LoggerInterface $logger,\n ) {\n parent::__construct();\n $this->client = $client;\n $this->logger = $logger;\n }\n\n public function getDisplayName(): string\n {\n return Providers::getProviderDisplayName(\n Providers::getCrmIntegrationSlug($this->config)\n );\n }\n\n /**\n * @throws \\Exception\n */\n public function setUser(User $user): void\n {\n $this->configureSentryScope($user);\n $this->invokedUser = $user;\n\n $this->team = $user->getTeam();\n $teamOwner = $this->team->getOwner();\n\n $this->setConfiguration($user->getTeam()->getCrmConfiguration());\n $this->setEditionConfiguration(Providers::getCrmIntegrationSlug($this->config));\n $this->setCrmUrlGenerator($this->config);\n\n $this->client->setTeam($this->team);\n $socialAccount = $teamOwner?->getSocialAccount('integration-app');\n if ($socialAccount === null) {\n $this->logger->info('[integration-app] Social account not found', [\n 'teamId' => $this->team->getId(),\n 'teamOwnerId' => $teamOwner?->getId(),\n 'userId' => $user->getId(),\n ]);\n\n throw new SocialAccountNotFoundException('Social account not found!');\n }\n $this->client->setSocialAccount($socialAccount);\n\n // The CRM Service is properly bootstrapped, and supports remote operations\n $this->connect();\n }\n\n public function normalizeValue(string $fieldType, string $fieldValue, bool $internal = false): string\n {\n return $fieldValue;\n }\n\n public function find(string $name, array $scopes): array\n {\n /** @var LocalSearch $localSearch */\n $localSearch = app(LocalSearch::class);\n $localSearch->setConfiguration($this->config);\n $localSearch->setCountryCode($this->invokedUser->getCountryCode());\n\n return $localSearch->search($name);\n\n // if (! empty($localMatch)) {\n // return $localMatch;\n // }\n //\n // /** @var RemoteSearch $remoteSearch */\n // $remoteSearch = app(RemoteSearch::class);\n // $remoteSearch->setClient($this->client);\n // $remoteSearch->setConfiguration($this->config);\n //\n // return $remoteSearch->search($name);\n }\n\n public function findOpportunities(?string $crmAccountId, ?string $crmContactId, ?int $userId = null): array\n {\n $data = [];\n $ownerData = [];\n\n $account = $this->getAccount($crmAccountId, $crmContactId);\n if ($account === null) {\n return [];\n }\n\n $ownerId = $this->getOwnerId($userId);\n\n try {\n $opportunityRepository = app(OpportunityRepository::class);\n $opportunities = $opportunityRepository->findAllByConfigurationAndAccountId(\n $this->config,\n $account->getId()\n );\n\n foreach ($opportunities as $opportunity) {\n /** @var Opportunity $opportunity */\n $record = $this->buildOpportunityData($opportunity);\n\n if ($ownerId && $opportunity->getOwnerId() === $ownerId) {\n $ownerData[] = $record;\n }\n\n $data[] = $record;\n }\n\n if (! empty($ownerData)) {\n return $ownerData;\n }\n\n return $data;\n } catch (\\Exception $e) {\n $this->logger->info('[integration-app] Failed to fetch opportunities', [\n 'contact' => $crmContactId,\n 'account' => $crmAccountId,\n 'owner' => $ownerId,\n 'error' => $e->getMessage(),\n ]);\n\n return $data;\n }\n }\n\n private function getOwnerId(?int $userId = null): ?string\n {\n if (! $userId) {\n return null;\n }\n\n $profileRepository = app(ProfileRepository::class);\n $profile = $profileRepository->findProfileByUserId($this->config, $userId);\n\n return $profile instanceof Profile ? $profile->getCrmProviderId() : null;\n }\n\n private function getAccount(?string $crmAccountId = null, ?string $crmContactId = null): ?Account\n {\n $crmRepository = app(CrmObjectsRepository::class);\n\n if ($crmAccountId === null) {\n $contact = $crmRepository->findContactByCrmProviderId($this->config, $crmContactId);\n\n return $contact->getAccount();\n }\n\n return $crmRepository->findAccountByCrmProviderId($this->config, $crmAccountId);\n }\n\n private function buildOpportunityData(Opportunity $opportunity): array\n {\n $record = [\n 'crmId' => $opportunity->getCrmProviderId(),\n 'name' => $opportunity->getName(),\n 'won' => $opportunity->isWon(),\n 'closed' => $opportunity->isClosed(),\n ];\n\n if (! empty($opportunity->getFormattedValueAttribute())) {\n $record['value'] = $opportunity->getFormattedValueAttribute();\n }\n\n if (! empty($opportunity->getStage())) {\n $record['stage'] = [\n 'id' => $opportunity->getStage()->getUuid(),\n 'name' => $opportunity->getStage()->getName(),\n ];\n }\n\n return $record;\n }\n\n public function updateRecord(string $objectType, string $objectId, array $data, array $headers = []): void\n {\n $data = [\n 'data' => $this->normalizeData($objectType, $data),\n ];\n\n $this->client->updateRecordById($objectType, $objectId, $data);\n }\n\n private function normalizeData(string $objectType, array $data): array\n {\n $fieldMapper = $this->getFieldMapper($objectType);\n\n if (! $fieldMapper instanceof FieldMapperInterface) {\n return $data;\n }\n\n return $fieldMapper->mapToCrmFields($data);\n }\n\n private function getFieldMapper(string $objectType): ?FieldMapperInterface\n {\n if ($objectType === self::OBJECT_OPPORTUNITY) {\n return app(OpportunityFieldMapper::class);\n }\n\n if ($objectType === self::OBJECT_LEAD) {\n return app(LeadFieldMapper::class);\n }\n\n return null;\n }\n\n public function getRecord(string $objectType, string $objectId, array $fields = []): array\n {\n return $this->client->getRecordById($objectType, $objectId);\n }\n\n public function getConfiguration(): Configuration\n {\n return $this->config;\n }\n\n public function setConfiguration(Configuration $config): void\n {\n $this->clearExternalMapCache();\n\n $this->config = $config;\n }\n\n private function setEditionConfiguration(string $provider): void\n {\n $this->editionConfig = app(IntegrationConfigFactory::class)->create($provider);\n }\n\n public function setCrmUrlGenerator(Configuration $config): void\n {\n $this->crmUrlGenerator = app(IntegrationAppCrmGeneratorFactory::class)->create($config);\n }\n\n public function getCrmUrlGenerator(): ?GenerateProviderUrlInterface\n {\n if ($this->crmUrlGenerator === null) {\n $this->setCrmUrlGenerator($this->config);\n }\n\n return $this->crmUrlGenerator;\n }\n\n public function subscribeEntityEvents(bool $enableTrigger = true): void\n {\n $eventStates = $this->client->updateEntityEventsState($enableTrigger);\n\n $this->logger->info('[integration-app] Change team entity events subscription', [\n 'teamId' => $this->team->getId(),\n 'teamName' => $this->team->getName(),\n 'states' => $eventStates,\n 'action' => $enableTrigger ? 'subscribe' : 'unsubscribe',\n ]);\n }\n\n #[\\Override] public function supportsNotes(): bool\n {\n return $this->editionConfig->supportsNotes();\n }\n\n #[\\Override] public function saveNote(\n string $title,\n string $body,\n string $objectId,\n ?NoteObject $noteObject = null,\n ): ?string {\n if ($noteObject === null) {\n return null;\n }\n\n $notePayload = [\n 'title' => $title,\n 'content' => $body,\n 'objectId' => $objectId,\n 'objectType' => $noteObject->value,\n ];\n\n $result = $this->client->createNote($notePayload);\n\n // debug saving note response\n $this->logger->info('[integration-app] createNote response', [\n 'objectId' => $objectId,\n 'objectType' => $noteObject->value,\n 'result' => $result,\n 'hasId' => isset($result['id']),\n ]);\n\n return $result['id'] ?? null;\n }\n\n /**\n * @throws CrmException\n */\n #[\\Override] public function saveActivity(Activity $activity): Activity\n {\n $this->logger->info('[integration-app] saveActivity', [\n 'activity' => $activity->getUuid(),\n 'type' => $activity->getType(),\n ]);\n\n if ($activity->getCrmType() === Activity::TYPE_CONFERENCE) {\n $crmActivity = $this->saveMeeting($activity);\n } elseif (in_array($activity->getType(), [Activity::TYPE_SOFTPHONE, Activity::TYPE_SOFTPHONE_INBOUND])) {\n $crmActivity = $this->saveCall($activity);\n } else {\n throw new CrmException('Unsupported activity type');\n }\n\n $crmActivityId = $crmActivity['id'] ?? null;\n\n if ($crmActivityId !== null) {\n $activity->crm_provider_id = $crmActivityId;\n $activity->save();\n\n $this->logger->info('[integration-app] Activity successfully logged to CRM', [\n 'activity' => $activity->getUuid(),\n 'type' => $activity->getType(),\n 'crmId' => $crmActivityId,\n ]);\n }\n\n return $activity;\n }\n\n public function saveMeeting(Activity $activity): array\n {\n $decorateActivity = app(DecorateActivity::class);\n\n $meetingPayload = [\n 'Event_Title' => $decorateActivity->generateTitle($activity),\n 'Start_DateTime' => $activity->getActualStartTime()->toIso8601String(),\n 'End_DateTime' => $activity->getActualEndTime()->toIso8601String(),\n 'ownerId' => $this->getActivityOwnerId($activity),\n ];\n\n $payload = array_merge($meetingPayload, $this->attachToProspect($activity));\n\n if ($activity->hasCrmProviderId()) {\n $crmId = $activity->getCrmProviderId();\n $meeting = $this->client->getMeeting($crmId);\n\n $oldDescription = $meeting['fields']['Description'] ?? null;\n $payload['Description'] = $decorateActivity->generateUpdatedDescription($oldDescription, $activity);\n\n $this->logger->info('[integration-app] CRM update meeting', [\n 'activity' => $activity->getUuid(),\n 'crm_id' => $crmId,\n 'payload' => $payload,\n ]);\n\n return $this->client->updateMeeting($crmId, $payload);\n }\n\n $payload['Description'] = $decorateActivity->generateDescription($activity);\n\n $this->logger->info('[integration-app] CRM log meeting', [\n 'activity' => $activity->getUuid(),\n 'payload' => $payload,\n ]);\n\n return $this->client->createMeeting($payload);\n }\n\n public function saveCall(Activity $activity): array\n {\n $decorateActivity = app(DecorateActivity::class);\n\n $callPayload = [\n 'Call_Type' => $this->getCallType($activity),\n 'Call_Start_Time' => $activity->getActualStartTime()->toIso8601String(),\n 'Call_Duration' => $activity->getDuration(),\n 'name' => $decorateActivity->generateTitle($activity),\n 'ownerId' => $this->getActivityOwnerId($activity),\n ];\n\n $payload = array_merge($callPayload, $this->attachToProspect($activity));\n\n if ($activity->hasCrmProviderId()) {\n $crmId = $activity->getCrmProviderId();\n $call = $this->client->getCall($crmId);\n\n $oldDescription = $call['fields']['Description'] ?? null;\n $payload['description'] = $decorateActivity->generateUpdatedDescription($oldDescription, $activity);\n\n $this->logger->info('[integration-app] CRM update call', [\n 'activity' => $activity->getUuid(),\n 'crm_id' => $crmId,\n 'payload' => $payload,\n ]);\n\n return $this->client->updateCall($crmId, $payload);\n }\n\n $payload['description'] = $decorateActivity->generateDescription($activity);\n\n $this->logger->info('[integration-app] CRM log call', [\n 'activity' => $activity->getUuid(),\n 'payload' => $payload,\n ]);\n\n return $this->client->createCall($payload);\n }\n\n private function getCallType(Activity $activity): string\n {\n if ($activity->getStatus() === Activity::STATUS_NO_ANSWER) {\n return self::CALL_TYPE_MISSED;\n }\n\n return $activity->getType() === Activity::TYPE_SOFTPHONE_INBOUND ? self::CALL_TYPE_INBOUND : self::CALL_TYPE_OUTBOUND;\n }\n\n private function attachToProspect(Activity $activity): array\n {\n $payload = [];\n\n if ($activity->hasContact()) {\n $payload['contactId'] = $activity->getContact()->getCrmProviderId();\n }\n\n if ($activity->hasOpportunity()) {\n return array_merge(\n $payload,\n $this->buildBasicPayload(\n self::RELATIONSHIP_OPPORTUNITY,\n $activity->getOpportunity()->getCrmProviderId()\n )\n );\n }\n\n if ($activity->hasAccount() && ! $activity->getAccount()->getIsInternal()) {\n return array_merge(\n $payload,\n $this->buildBasicPayload(\n self::RELATIONSHIP_ACCOUNT,\n $activity->getAccount()->getCrmProviderId()\n )\n );\n }\n\n if ($activity->hasLead()) {\n $payload = $this->handleLeadPayload($activity);\n }\n\n return $payload;\n }\n\n private function handleLeadPayload(Activity $activity): array\n {\n $freshLead = $this->syncLead($activity->getLead()->getCrmProviderId());\n $lead = $freshLead ?? $activity->getLead();\n\n if ($lead->getConvertedAt() === null) {\n return $this->buildBasicPayload(self::RELATIONSHIP_LEAD, $lead->getCrmProviderId());\n }\n\n $activity->lead_id = null;\n\n if ($lead->hasAccount()) {\n $account = $lead->getAccount();\n $activity->account_id = $account->getId();\n $payload = $this->buildBasicPayload(self::RELATIONSHIP_ACCOUNT, $account->getCrmProviderId());\n } else {\n $payload = [];\n }\n\n if ($lead->hasOpportunity()) {\n $opportunity = $lead->getOpportunity();\n $payload = $this->buildBasicPayload(self::RELATIONSHIP_OPPORTUNITY, $opportunity->getCrmProviderId());\n $activity->opportunity_id = $opportunity->getId();\n $activity->value = $opportunity->value;\n $activity->stage_id = $opportunity->stage_id;\n } else {\n $activity->stage_id = null;\n }\n\n if ($lead->hasContact()) {\n $contact = $lead->getContact();\n $payload['contactId'] = $contact->getCrmProviderId();\n $activity->contact_id = $contact->getId();\n }\n\n $activity->save();\n event(new ActivityLeadConverted($activity, $lead));\n\n $this->logger->info('[integration-app] Lead converted', [\n 'activityUuid' => $activity->getUuid(),\n 'leadUuid' => $lead->getUuid(),\n ]);\n\n return $payload;\n }\n\n private function buildBasicPayload(string $type, string $id): array\n {\n return [\n 'type' => $type,\n 'id' => $id,\n ];\n }\n private function getActivityOwnerId(Activity $activity): ?string\n {\n $ownerId = null;\n if ($activity->hasUser() && $activity->getUser()->getProfile() !== null) {\n $ownerId = $activity->getUser()->getProfile()->getCrmProviderId();\n }\n\n return $ownerId;\n }\n\n #[\\Override] public function saveFollowupActivity(Activity $activity, array $fields): ?string\n {\n $taskPayload = [\n 'subject' => $fields['subject'],\n 'dueTime' => isset($fields['dueDate']) ? Carbon::parse($fields['dueDate'])->format('Y-m-d') : null,\n 'ownerId' => $this->getActivityOwnerId($activity),\n ];\n\n if (isset($fields['status'])) {\n $taskPayload['status'] = $fields['status'];\n }\n\n if (isset($fields['priority'])) {\n $taskPayload['priority'] = $fields['priority'];\n }\n\n if (isset($fields['content'])) {\n $taskPayload['content'] = $fields['content'];\n }\n\n $payload = array_merge($taskPayload, $this->attachToProspect($activity));\n\n $this->logger->info('[integration-app] CRM log follow up task', [\n 'activity' => $activity->getUuid(),\n 'payload' => $payload,\n ]);\n\n $task = $this->client->createTask($payload);\n\n return $task['id'] ?? null;\n }\n\n #[\\Override] public function saveTranscriptionSummaryAsNote(\n ActivityContract $activity,\n string $title,\n string $body,\n ?string $objectId,\n ?NoteObject $noteObject = null,\n ): ?string {\n // We have to find a way to store the transcription summary\n // This might be possible either by Tasks, Events, Engagements & Notes\n // Find what the CRM supports and save the note with the appropriate object(eg Notes)\n\n // For now use only Notes as both ZOHO & Salesforce support them.\n if ($this->supportsNotes() && $objectId !== null) {\n $this->logger->info('[integration-app] saving note', [\n 'activityId' => $activity->getUuid(),\n 'objectId' => $objectId,\n ]);\n\n return $this->saveNote($title, $body, $objectId, $noteObject);\n }\n\n $this->logger->info('[integration-app] skip saveTranscriptionSummaryAsNote', [\n 'activityId' => $activity->getUuid(),\n 'supportsNotes' => $this->supportsNotes(),\n 'objectId' => $objectId,\n ]);\n\n return null;\n }\n\n public function generateProviderUrl(string $providerId, string $objectType): ?string\n {\n return $this->getCrmUrlGenerator()?->generateProviderUrl($providerId, $objectType);\n }\n\n public function updateStage($crmObject, Stage $stage): void\n {\n $objectType = $stage->getType();\n $objectId = $crmObject->getCrmProviderId();\n $params = ['stageName' => $stage->getCrmProviderId()];\n\n $this->logger->info('[integration-app] updateStage', [\n 'objectType' => $objectType,\n 'objectId' => $objectId,\n 'params' => $params,\n ]);\n\n $data = [\n 'data' => $this->normalizeData($objectType, $params),\n ];\n\n\n if ($objectType === Stage::TYPE_LEAD) {\n $this->client->updateLead($objectId, $data);\n } else {\n $this->client->updateDeal($objectId, $data);\n }\n }\n\n /**\n * @throws \\Exception\n */\n public function fetchAndAssociateRelatedActivity(Activity $activity): ?Activity\n {\n if ($activity->getCrm()?->getEdition() !== IntegrationAppProviders::ZOHO_CRM) {\n return null;\n }\n\n if (! $activity->isTypeConference()) {\n return null;\n }\n\n // The related activity is already linked.\n if ($activity->hasCrmProviderId()) {\n return $activity;\n }\n\n if ($activity->hasActualStartTime() === false) {\n return null;\n }\n\n return $this->fetchAndAssociateZohoRelatedActivity($activity);\n }\n\n public function fetchAndAssociateZohoRelatedActivity(Activity $activity): ?Activity\n {\n try {\n $meeting = $this->fetchRelatedZohoActivity($activity);\n if (empty($meeting)) {\n $this->logger->info('[integration-app] fetchRelatedZohoActivity No related activity found', [\n 'activity' => $activity->getUuid(),\n ]);\n\n return null;\n }\n\n $decorateActivity = app(DecorateActivity::class);\n $oldDescription = $meeting['Description'] ?? '';\n $updatedDescription = $decorateActivity->generateUpdatedDescription($oldDescription, $activity);\n\n $this->logger->info('[integration-app] fetchAndAssociateZohoRelatedActivity updating related activity', [\n 'activity' => $activity->getUuid(),\n 'description' => $updatedDescription,\n ]);\n\n $this->client->updateMeeting($meeting['id'], ['Description' => $updatedDescription]);\n\n // Update our activity to reflect the remote data.\n $activity->update([\n 'crm_provider_id' => $meeting['id'],\n 'summary' => $meeting['Description'],\n ]);\n\n return $activity;\n } catch (\\Exception $exception) {\n \\Sentry::captureException($exception);\n\n throw $exception;\n }\n }\n\n public function fetchRelatedZohoActivity(Activity $activity): array\n {\n [$from, $to] = $this->getFromToDates($activity);\n\n $start = $from?->toIso8601String(); // e.g., 2025-07-01T00:00:00+00:00\n $end = $to?->toIso8601String(); // e.g., 2025-07-14T23:59:59+00:00\n if ($start === null || $end === null) {\n $this->logger->info(\n '[integration-app] fetchRelatedZohoActivity missing start or end date',\n [\n 'activity' => $activity->getUuid(),\n 'start' => $start,\n 'end' => $end,\n 'from' => $from,\n 'to' => $to,\n ]\n );\n\n return [];\n }\n\n $whoId = null;\n $whatId = null;\n $criteriaParts = [];\n\n if ($activity->getContact()) {\n $whoId = $activity->getContact()->getCrmProviderId();\n $criteriaParts[] = \"(Who_Id:equals:$whoId)\";\n }\n\n if ($activity->getOpportunity()) {\n $whatId = $activity->getOpportunity()->getCrmProviderId();\n } elseif ($activity->getAccount() && $activity->getAccount()->getIsInternal() === false) {\n $whatId = $activity->getAccount()->getCrmProviderId();\n } elseif ($activity->getLead()) {\n $whatId = $activity->getLead()->getCrmProviderId();\n }\n\n if ($whatId !== null) {\n $criteriaParts[] = \"(What_Id:equals:$whatId)\";\n }\n\n if ($whoId === null && $whatId === null) {\n $this->logger->info(\n '[integration-app] fetchRelatedZohoActivity cannot find prospect',\n [\n 'activity' => $activity->getUuid(),\n ]\n );\n\n return [];\n }\n\n $criteriaParts[] = \"(Start_DateTime:greater_equal:$start)\";\n $criteriaParts[] = \"(End_DateTime:less_equal:$end)\";\n\n $criteria = implode(' AND ', $criteriaParts);\n\n $params = [\n 'criteria' => $criteria,\n 'sort_by' => 'Modified_Time',\n 'sort_order' => 'desc',\n ];\n\n $this->logger->info(\n '[integration-app] fetchRelatedZohoActivity searching for related activity',\n [\n 'activity' => $activity->getUuid(),\n 'params' => $params,\n ]\n );\n\n $meetings = $this->client->searchMeetings($params);\n if (! empty($meetings)) {\n return $meetings[0];\n }\n\n return [];\n }\n\n private function getFromToDates(Activity $activity): array\n {\n $calendarEvent = $activity->calendarEvent()->first();\n\n $from = $calendarEvent?->getStartTime();\n $to = $calendarEvent?->getEndTime();\n\n if (! $from || ! $to) {\n $from = $activity->hasScheduledStartTime()\n ? $activity->getScheduledStartTime()\n : $activity->getActualStartTime();\n\n $to = $activity->hasScheduledEndTime()\n ? $activity->getScheduledEndTime()->addMinutes(15)\n : $activity->getActualEndTime();\n }\n\n return [$from, $to];\n }\n}","depth":4,"on_screen":true,"value":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Services\\Crm\\IntegrationApp;\n\nuse Carbon\\Carbon;\nuse Jiminny\\Contracts\\Crm\\Providers;\nuse Jiminny\\Contracts\\Services\\Crm\\ClientInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\FetchRelatedActivityInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\ImportsBusinessProcessesInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\LayoutManagementInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\MatchCrmEntitiesInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\Provider\\IntegrationAppInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\RemoteEntityLookupInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\RemoteEntityManipulationInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\RemoteNoteEntityManipulationInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\SendSummaryToCrmInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\SettingsInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\SyncCrmEntitiesInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\SyncCrmMetadataInterface;\nuse Jiminny\\Events\\Activities\\Crm\\ActivityLeadConverted;\nuse Jiminny\\Exceptions\\CrmException;\nuse Jiminny\\Exceptions\\SocialAccountNotFoundException;\nuse Jiminny\\Jobs\\Crm\\NoteObject;\nuse Jiminny\\Models\\Account;\nuse Jiminny\\Models\\Activity;\nuse Jiminny\\Models\\Contracts\\ActivityContract;\nuse Jiminny\\Models\\Crm\\Configuration;\nuse Jiminny\\Models\\Opportunity;\nuse Jiminny\\Models\\Stage;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Services\\Crm\\BaseService;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\Config\\IntegrationAppProviders;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\Config\\IntegrationConfigFactory;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\DTO\\Mappers\\FieldMapperInterface;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\DTO\\Mappers\\LeadFieldMapper;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\DTO\\Utils\\GenerateProviderUrlInterface;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\DTO\\Utils\\IntegrationAppCrmGeneratorFactory;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\DTO\\Utils\\UrlGeneratorInterface;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\ServiceTraits\\SyncCrmFieldsTrait;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\ServiceTraits\\SystemStateTrait;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\ServiceTraits\\LayoutTrait;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\ServiceTraits\\MatchProspectsTrait;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\ServiceTraits\\NotSupportedTrait;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\ServiceTraits\\SyncCrmEntitiesTrait;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\ServiceTraits\\SyncCrmMetadataTrait;\nuse Psr\\Log\\LoggerInterface;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\DTO\\Mappers\\OpportunityFieldMapper;\nuse Jiminny\\Repositories\\Crm\\ProfileRepository;\nuse Jiminny\\Repositories\\Crm\\OpportunityRepository;\nuse Jiminny\\Models\\Crm\\Profile;\nuse Jiminny\\Services\\Crm\\CrmObjects\\CrmObjectsRepository;\n\nclass Service extends BaseService implements\n IntegrationAppInterface,\n SyncCrmEntitiesInterface,\n SyncCrmMetadataInterface,\n ImportsBusinessProcessesInterface,\n RemoteEntityManipulationInterface,\n LayoutManagementInterface,\n SettingsInterface,\n MatchCrmEntitiesInterface,\n RemoteEntityLookupInterface,\n RemoteNoteEntityManipulationInterface,\n SendSummaryToCrmInterface,\n UrlGeneratorInterface,\n FetchRelatedActivityInterface\n{\n use SyncCrmMetadataTrait;\n use SyncCrmEntitiesTrait;\n use SystemStateTrait;\n use LayoutTrait;\n use NotSupportedTrait;\n use MatchProspectsTrait;\n use SyncCrmFieldsTrait;\n\n public const string CALL_TYPE_MISSED = 'Missed';\n public const string CALL_TYPE_INBOUND = 'Inbound';\n public const string CALL_TYPE_OUTBOUND = 'Outbound';\n public const string RELATIONSHIP_OPPORTUNITY = 'Deals';\n public const string RELATIONSHIP_LEAD = 'Leads';\n public const string RELATIONSHIP_ACCOUNT = 'Accounts';\n\n /**\n * @var ClientInterface&DataClient\n */\n protected $client;\n\n protected ?User $invokedUser = null;\n\n protected ?GenerateProviderUrlInterface $crmUrlGenerator = null;\n\n public function __construct(\n DataClient $client,\n LoggerInterface $logger,\n ) {\n parent::__construct();\n $this->client = $client;\n $this->logger = $logger;\n }\n\n public function getDisplayName(): string\n {\n return Providers::getProviderDisplayName(\n Providers::getCrmIntegrationSlug($this->config)\n );\n }\n\n /**\n * @throws \\Exception\n */\n public function setUser(User $user): void\n {\n $this->configureSentryScope($user);\n $this->invokedUser = $user;\n\n $this->team = $user->getTeam();\n $teamOwner = $this->team->getOwner();\n\n $this->setConfiguration($user->getTeam()->getCrmConfiguration());\n $this->setEditionConfiguration(Providers::getCrmIntegrationSlug($this->config));\n $this->setCrmUrlGenerator($this->config);\n\n $this->client->setTeam($this->team);\n $socialAccount = $teamOwner?->getSocialAccount('integration-app');\n if ($socialAccount === null) {\n $this->logger->info('[integration-app] Social account not found', [\n 'teamId' => $this->team->getId(),\n 'teamOwnerId' => $teamOwner?->getId(),\n 'userId' => $user->getId(),\n ]);\n\n throw new SocialAccountNotFoundException('Social account not found!');\n }\n $this->client->setSocialAccount($socialAccount);\n\n // The CRM Service is properly bootstrapped, and supports remote operations\n $this->connect();\n }\n\n public function normalizeValue(string $fieldType, string $fieldValue, bool $internal = false): string\n {\n return $fieldValue;\n }\n\n public function find(string $name, array $scopes): array\n {\n /** @var LocalSearch $localSearch */\n $localSearch = app(LocalSearch::class);\n $localSearch->setConfiguration($this->config);\n $localSearch->setCountryCode($this->invokedUser->getCountryCode());\n\n return $localSearch->search($name);\n\n // if (! empty($localMatch)) {\n // return $localMatch;\n // }\n //\n // /** @var RemoteSearch $remoteSearch */\n // $remoteSearch = app(RemoteSearch::class);\n // $remoteSearch->setClient($this->client);\n // $remoteSearch->setConfiguration($this->config);\n //\n // return $remoteSearch->search($name);\n }\n\n public function findOpportunities(?string $crmAccountId, ?string $crmContactId, ?int $userId = null): array\n {\n $data = [];\n $ownerData = [];\n\n $account = $this->getAccount($crmAccountId, $crmContactId);\n if ($account === null) {\n return [];\n }\n\n $ownerId = $this->getOwnerId($userId);\n\n try {\n $opportunityRepository = app(OpportunityRepository::class);\n $opportunities = $opportunityRepository->findAllByConfigurationAndAccountId(\n $this->config,\n $account->getId()\n );\n\n foreach ($opportunities as $opportunity) {\n /** @var Opportunity $opportunity */\n $record = $this->buildOpportunityData($opportunity);\n\n if ($ownerId && $opportunity->getOwnerId() === $ownerId) {\n $ownerData[] = $record;\n }\n\n $data[] = $record;\n }\n\n if (! empty($ownerData)) {\n return $ownerData;\n }\n\n return $data;\n } catch (\\Exception $e) {\n $this->logger->info('[integration-app] Failed to fetch opportunities', [\n 'contact' => $crmContactId,\n 'account' => $crmAccountId,\n 'owner' => $ownerId,\n 'error' => $e->getMessage(),\n ]);\n\n return $data;\n }\n }\n\n private function getOwnerId(?int $userId = null): ?string\n {\n if (! $userId) {\n return null;\n }\n\n $profileRepository = app(ProfileRepository::class);\n $profile = $profileRepository->findProfileByUserId($this->config, $userId);\n\n return $profile instanceof Profile ? $profile->getCrmProviderId() : null;\n }\n\n private function getAccount(?string $crmAccountId = null, ?string $crmContactId = null): ?Account\n {\n $crmRepository = app(CrmObjectsRepository::class);\n\n if ($crmAccountId === null) {\n $contact = $crmRepository->findContactByCrmProviderId($this->config, $crmContactId);\n\n return $contact->getAccount();\n }\n\n return $crmRepository->findAccountByCrmProviderId($this->config, $crmAccountId);\n }\n\n private function buildOpportunityData(Opportunity $opportunity): array\n {\n $record = [\n 'crmId' => $opportunity->getCrmProviderId(),\n 'name' => $opportunity->getName(),\n 'won' => $opportunity->isWon(),\n 'closed' => $opportunity->isClosed(),\n ];\n\n if (! empty($opportunity->getFormattedValueAttribute())) {\n $record['value'] = $opportunity->getFormattedValueAttribute();\n }\n\n if (! empty($opportunity->getStage())) {\n $record['stage'] = [\n 'id' => $opportunity->getStage()->getUuid(),\n 'name' => $opportunity->getStage()->getName(),\n ];\n }\n\n return $record;\n }\n\n public function updateRecord(string $objectType, string $objectId, array $data, array $headers = []): void\n {\n $data = [\n 'data' => $this->normalizeData($objectType, $data),\n ];\n\n $this->client->updateRecordById($objectType, $objectId, $data);\n }\n\n private function normalizeData(string $objectType, array $data): array\n {\n $fieldMapper = $this->getFieldMapper($objectType);\n\n if (! $fieldMapper instanceof FieldMapperInterface) {\n return $data;\n }\n\n return $fieldMapper->mapToCrmFields($data);\n }\n\n private function getFieldMapper(string $objectType): ?FieldMapperInterface\n {\n if ($objectType === self::OBJECT_OPPORTUNITY) {\n return app(OpportunityFieldMapper::class);\n }\n\n if ($objectType === self::OBJECT_LEAD) {\n return app(LeadFieldMapper::class);\n }\n\n return null;\n }\n\n public function getRecord(string $objectType, string $objectId, array $fields = []): array\n {\n return $this->client->getRecordById($objectType, $objectId);\n }\n\n public function getConfiguration(): Configuration\n {\n return $this->config;\n }\n\n public function setConfiguration(Configuration $config): void\n {\n $this->clearExternalMapCache();\n\n $this->config = $config;\n }\n\n private function setEditionConfiguration(string $provider): void\n {\n $this->editionConfig = app(IntegrationConfigFactory::class)->create($provider);\n }\n\n public function setCrmUrlGenerator(Configuration $config): void\n {\n $this->crmUrlGenerator = app(IntegrationAppCrmGeneratorFactory::class)->create($config);\n }\n\n public function getCrmUrlGenerator(): ?GenerateProviderUrlInterface\n {\n if ($this->crmUrlGenerator === null) {\n $this->setCrmUrlGenerator($this->config);\n }\n\n return $this->crmUrlGenerator;\n }\n\n public function subscribeEntityEvents(bool $enableTrigger = true): void\n {\n $eventStates = $this->client->updateEntityEventsState($enableTrigger);\n\n $this->logger->info('[integration-app] Change team entity events subscription', [\n 'teamId' => $this->team->getId(),\n 'teamName' => $this->team->getName(),\n 'states' => $eventStates,\n 'action' => $enableTrigger ? 'subscribe' : 'unsubscribe',\n ]);\n }\n\n #[\\Override] public function supportsNotes(): bool\n {\n return $this->editionConfig->supportsNotes();\n }\n\n #[\\Override] public function saveNote(\n string $title,\n string $body,\n string $objectId,\n ?NoteObject $noteObject = null,\n ): ?string {\n if ($noteObject === null) {\n return null;\n }\n\n $notePayload = [\n 'title' => $title,\n 'content' => $body,\n 'objectId' => $objectId,\n 'objectType' => $noteObject->value,\n ];\n\n $result = $this->client->createNote($notePayload);\n\n // debug saving note response\n $this->logger->info('[integration-app] createNote response', [\n 'objectId' => $objectId,\n 'objectType' => $noteObject->value,\n 'result' => $result,\n 'hasId' => isset($result['id']),\n ]);\n\n return $result['id'] ?? null;\n }\n\n /**\n * @throws CrmException\n */\n #[\\Override] public function saveActivity(Activity $activity): Activity\n {\n $this->logger->info('[integration-app] saveActivity', [\n 'activity' => $activity->getUuid(),\n 'type' => $activity->getType(),\n ]);\n\n if ($activity->getCrmType() === Activity::TYPE_CONFERENCE) {\n $crmActivity = $this->saveMeeting($activity);\n } elseif (in_array($activity->getType(), [Activity::TYPE_SOFTPHONE, Activity::TYPE_SOFTPHONE_INBOUND])) {\n $crmActivity = $this->saveCall($activity);\n } else {\n throw new CrmException('Unsupported activity type');\n }\n\n $crmActivityId = $crmActivity['id'] ?? null;\n\n if ($crmActivityId !== null) {\n $activity->crm_provider_id = $crmActivityId;\n $activity->save();\n\n $this->logger->info('[integration-app] Activity successfully logged to CRM', [\n 'activity' => $activity->getUuid(),\n 'type' => $activity->getType(),\n 'crmId' => $crmActivityId,\n ]);\n }\n\n return $activity;\n }\n\n public function saveMeeting(Activity $activity): array\n {\n $decorateActivity = app(DecorateActivity::class);\n\n $meetingPayload = [\n 'Event_Title' => $decorateActivity->generateTitle($activity),\n 'Start_DateTime' => $activity->getActualStartTime()->toIso8601String(),\n 'End_DateTime' => $activity->getActualEndTime()->toIso8601String(),\n 'ownerId' => $this->getActivityOwnerId($activity),\n ];\n\n $payload = array_merge($meetingPayload, $this->attachToProspect($activity));\n\n if ($activity->hasCrmProviderId()) {\n $crmId = $activity->getCrmProviderId();\n $meeting = $this->client->getMeeting($crmId);\n\n $oldDescription = $meeting['fields']['Description'] ?? null;\n $payload['Description'] = $decorateActivity->generateUpdatedDescription($oldDescription, $activity);\n\n $this->logger->info('[integration-app] CRM update meeting', [\n 'activity' => $activity->getUuid(),\n 'crm_id' => $crmId,\n 'payload' => $payload,\n ]);\n\n return $this->client->updateMeeting($crmId, $payload);\n }\n\n $payload['Description'] = $decorateActivity->generateDescription($activity);\n\n $this->logger->info('[integration-app] CRM log meeting', [\n 'activity' => $activity->getUuid(),\n 'payload' => $payload,\n ]);\n\n return $this->client->createMeeting($payload);\n }\n\n public function saveCall(Activity $activity): array\n {\n $decorateActivity = app(DecorateActivity::class);\n\n $callPayload = [\n 'Call_Type' => $this->getCallType($activity),\n 'Call_Start_Time' => $activity->getActualStartTime()->toIso8601String(),\n 'Call_Duration' => $activity->getDuration(),\n 'name' => $decorateActivity->generateTitle($activity),\n 'ownerId' => $this->getActivityOwnerId($activity),\n ];\n\n $payload = array_merge($callPayload, $this->attachToProspect($activity));\n\n if ($activity->hasCrmProviderId()) {\n $crmId = $activity->getCrmProviderId();\n $call = $this->client->getCall($crmId);\n\n $oldDescription = $call['fields']['Description'] ?? null;\n $payload['description'] = $decorateActivity->generateUpdatedDescription($oldDescription, $activity);\n\n $this->logger->info('[integration-app] CRM update call', [\n 'activity' => $activity->getUuid(),\n 'crm_id' => $crmId,\n 'payload' => $payload,\n ]);\n\n return $this->client->updateCall($crmId, $payload);\n }\n\n $payload['description'] = $decorateActivity->generateDescription($activity);\n\n $this->logger->info('[integration-app] CRM log call', [\n 'activity' => $activity->getUuid(),\n 'payload' => $payload,\n ]);\n\n return $this->client->createCall($payload);\n }\n\n private function getCallType(Activity $activity): string\n {\n if ($activity->getStatus() === Activity::STATUS_NO_ANSWER) {\n return self::CALL_TYPE_MISSED;\n }\n\n return $activity->getType() === Activity::TYPE_SOFTPHONE_INBOUND ? self::CALL_TYPE_INBOUND : self::CALL_TYPE_OUTBOUND;\n }\n\n private function attachToProspect(Activity $activity): array\n {\n $payload = [];\n\n if ($activity->hasContact()) {\n $payload['contactId'] = $activity->getContact()->getCrmProviderId();\n }\n\n if ($activity->hasOpportunity()) {\n return array_merge(\n $payload,\n $this->buildBasicPayload(\n self::RELATIONSHIP_OPPORTUNITY,\n $activity->getOpportunity()->getCrmProviderId()\n )\n );\n }\n\n if ($activity->hasAccount() && ! $activity->getAccount()->getIsInternal()) {\n return array_merge(\n $payload,\n $this->buildBasicPayload(\n self::RELATIONSHIP_ACCOUNT,\n $activity->getAccount()->getCrmProviderId()\n )\n );\n }\n\n if ($activity->hasLead()) {\n $payload = $this->handleLeadPayload($activity);\n }\n\n return $payload;\n }\n\n private function handleLeadPayload(Activity $activity): array\n {\n $freshLead = $this->syncLead($activity->getLead()->getCrmProviderId());\n $lead = $freshLead ?? $activity->getLead();\n\n if ($lead->getConvertedAt() === null) {\n return $this->buildBasicPayload(self::RELATIONSHIP_LEAD, $lead->getCrmProviderId());\n }\n\n $activity->lead_id = null;\n\n if ($lead->hasAccount()) {\n $account = $lead->getAccount();\n $activity->account_id = $account->getId();\n $payload = $this->buildBasicPayload(self::RELATIONSHIP_ACCOUNT, $account->getCrmProviderId());\n } else {\n $payload = [];\n }\n\n if ($lead->hasOpportunity()) {\n $opportunity = $lead->getOpportunity();\n $payload = $this->buildBasicPayload(self::RELATIONSHIP_OPPORTUNITY, $opportunity->getCrmProviderId());\n $activity->opportunity_id = $opportunity->getId();\n $activity->value = $opportunity->value;\n $activity->stage_id = $opportunity->stage_id;\n } else {\n $activity->stage_id = null;\n }\n\n if ($lead->hasContact()) {\n $contact = $lead->getContact();\n $payload['contactId'] = $contact->getCrmProviderId();\n $activity->contact_id = $contact->getId();\n }\n\n $activity->save();\n event(new ActivityLeadConverted($activity, $lead));\n\n $this->logger->info('[integration-app] Lead converted', [\n 'activityUuid' => $activity->getUuid(),\n 'leadUuid' => $lead->getUuid(),\n ]);\n\n return $payload;\n }\n\n private function buildBasicPayload(string $type, string $id): array\n {\n return [\n 'type' => $type,\n 'id' => $id,\n ];\n }\n private function getActivityOwnerId(Activity $activity): ?string\n {\n $ownerId = null;\n if ($activity->hasUser() && $activity->getUser()->getProfile() !== null) {\n $ownerId = $activity->getUser()->getProfile()->getCrmProviderId();\n }\n\n return $ownerId;\n }\n\n #[\\Override] public function saveFollowupActivity(Activity $activity, array $fields): ?string\n {\n $taskPayload = [\n 'subject' => $fields['subject'],\n 'dueTime' => isset($fields['dueDate']) ? Carbon::parse($fields['dueDate'])->format('Y-m-d') : null,\n 'ownerId' => $this->getActivityOwnerId($activity),\n ];\n\n if (isset($fields['status'])) {\n $taskPayload['status'] = $fields['status'];\n }\n\n if (isset($fields['priority'])) {\n $taskPayload['priority'] = $fields['priority'];\n }\n\n if (isset($fields['content'])) {\n $taskPayload['content'] = $fields['content'];\n }\n\n $payload = array_merge($taskPayload, $this->attachToProspect($activity));\n\n $this->logger->info('[integration-app] CRM log follow up task', [\n 'activity' => $activity->getUuid(),\n 'payload' => $payload,\n ]);\n\n $task = $this->client->createTask($payload);\n\n return $task['id'] ?? null;\n }\n\n #[\\Override] public function saveTranscriptionSummaryAsNote(\n ActivityContract $activity,\n string $title,\n string $body,\n ?string $objectId,\n ?NoteObject $noteObject = null,\n ): ?string {\n // We have to find a way to store the transcription summary\n // This might be possible either by Tasks, Events, Engagements & Notes\n // Find what the CRM supports and save the note with the appropriate object(eg Notes)\n\n // For now use only Notes as both ZOHO & Salesforce support them.\n if ($this->supportsNotes() && $objectId !== null) {\n $this->logger->info('[integration-app] saving note', [\n 'activityId' => $activity->getUuid(),\n 'objectId' => $objectId,\n ]);\n\n return $this->saveNote($title, $body, $objectId, $noteObject);\n }\n\n $this->logger->info('[integration-app] skip saveTranscriptionSummaryAsNote', [\n 'activityId' => $activity->getUuid(),\n 'supportsNotes' => $this->supportsNotes(),\n 'objectId' => $objectId,\n ]);\n\n return null;\n }\n\n public function generateProviderUrl(string $providerId, string $objectType): ?string\n {\n return $this->getCrmUrlGenerator()?->generateProviderUrl($providerId, $objectType);\n }\n\n public function updateStage($crmObject, Stage $stage): void\n {\n $objectType = $stage->getType();\n $objectId = $crmObject->getCrmProviderId();\n $params = ['stageName' => $stage->getCrmProviderId()];\n\n $this->logger->info('[integration-app] updateStage', [\n 'objectType' => $objectType,\n 'objectId' => $objectId,\n 'params' => $params,\n ]);\n\n $data = [\n 'data' => $this->normalizeData($objectType, $params),\n ];\n\n\n if ($objectType === Stage::TYPE_LEAD) {\n $this->client->updateLead($objectId, $data);\n } else {\n $this->client->updateDeal($objectId, $data);\n }\n }\n\n /**\n * @throws \\Exception\n */\n public function fetchAndAssociateRelatedActivity(Activity $activity): ?Activity\n {\n if ($activity->getCrm()?->getEdition() !== IntegrationAppProviders::ZOHO_CRM) {\n return null;\n }\n\n if (! $activity->isTypeConference()) {\n return null;\n }\n\n // The related activity is already linked.\n if ($activity->hasCrmProviderId()) {\n return $activity;\n }\n\n if ($activity->hasActualStartTime() === false) {\n return null;\n }\n\n return $this->fetchAndAssociateZohoRelatedActivity($activity);\n }\n\n public function fetchAndAssociateZohoRelatedActivity(Activity $activity): ?Activity\n {\n try {\n $meeting = $this->fetchRelatedZohoActivity($activity);\n if (empty($meeting)) {\n $this->logger->info('[integration-app] fetchRelatedZohoActivity No related activity found', [\n 'activity' => $activity->getUuid(),\n ]);\n\n return null;\n }\n\n $decorateActivity = app(DecorateActivity::class);\n $oldDescription = $meeting['Description'] ?? '';\n $updatedDescription = $decorateActivity->generateUpdatedDescription($oldDescription, $activity);\n\n $this->logger->info('[integration-app] fetchAndAssociateZohoRelatedActivity updating related activity', [\n 'activity' => $activity->getUuid(),\n 'description' => $updatedDescription,\n ]);\n\n $this->client->updateMeeting($meeting['id'], ['Description' => $updatedDescription]);\n\n // Update our activity to reflect the remote data.\n $activity->update([\n 'crm_provider_id' => $meeting['id'],\n 'summary' => $meeting['Description'],\n ]);\n\n return $activity;\n } catch (\\Exception $exception) {\n \\Sentry::captureException($exception);\n\n throw $exception;\n }\n }\n\n public function fetchRelatedZohoActivity(Activity $activity): array\n {\n [$from, $to] = $this->getFromToDates($activity);\n\n $start = $from?->toIso8601String(); // e.g., 2025-07-01T00:00:00+00:00\n $end = $to?->toIso8601String(); // e.g., 2025-07-14T23:59:59+00:00\n if ($start === null || $end === null) {\n $this->logger->info(\n '[integration-app] fetchRelatedZohoActivity missing start or end date',\n [\n 'activity' => $activity->getUuid(),\n 'start' => $start,\n 'end' => $end,\n 'from' => $from,\n 'to' => $to,\n ]\n );\n\n return [];\n }\n\n $whoId = null;\n $whatId = null;\n $criteriaParts = [];\n\n if ($activity->getContact()) {\n $whoId = $activity->getContact()->getCrmProviderId();\n $criteriaParts[] = \"(Who_Id:equals:$whoId)\";\n }\n\n if ($activity->getOpportunity()) {\n $whatId = $activity->getOpportunity()->getCrmProviderId();\n } elseif ($activity->getAccount() && $activity->getAccount()->getIsInternal() === false) {\n $whatId = $activity->getAccount()->getCrmProviderId();\n } elseif ($activity->getLead()) {\n $whatId = $activity->getLead()->getCrmProviderId();\n }\n\n if ($whatId !== null) {\n $criteriaParts[] = \"(What_Id:equals:$whatId)\";\n }\n\n if ($whoId === null && $whatId === null) {\n $this->logger->info(\n '[integration-app] fetchRelatedZohoActivity cannot find prospect',\n [\n 'activity' => $activity->getUuid(),\n ]\n );\n\n return [];\n }\n\n $criteriaParts[] = \"(Start_DateTime:greater_equal:$start)\";\n $criteriaParts[] = \"(End_DateTime:less_equal:$end)\";\n\n $criteria = implode(' AND ', $criteriaParts);\n\n $params = [\n 'criteria' => $criteria,\n 'sort_by' => 'Modified_Time',\n 'sort_order' => 'desc',\n ];\n\n $this->logger->info(\n '[integration-app] fetchRelatedZohoActivity searching for related activity',\n [\n 'activity' => $activity->getUuid(),\n 'params' => $params,\n ]\n );\n\n $meetings = $this->client->searchMeetings($params);\n if (! empty($meetings)) {\n return $meetings[0];\n }\n\n return [];\n }\n\n private function getFromToDates(Activity $activity): array\n {\n $calendarEvent = $activity->calendarEvent()->first();\n\n $from = $calendarEvent?->getStartTime();\n $to = $calendarEvent?->getEndTime();\n\n if (! $from || ! $to) {\n $from = $activity->hasScheduledStartTime()\n ? $activity->getScheduledStartTime()\n : $activity->getActualStartTime();\n\n $to = $activity->hasScheduledEndTime()\n ? $activity->getScheduledEndTime()->addMinutes(15)\n : $activity->getActualEndTime();\n }\n\n return [$from, $to];\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.85486114,"top":0.31,"width":0.018055556,"height":0.026666667},"on_screen":true,"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.87291664,"top":0.31,"width":0.018055556,"height":0.026666667},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Browse Query History","depth":4,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"View Parameters","depth":4,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Open Query Execution Settings…","depth":4,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"In-Editor Results","depth":4,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Tx: Auto","depth":4,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Cancel Running Statements","depth":4,"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Playground","depth":4,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"jiminny","depth":4,"bounds":{"left":0.9138889,"top":0.31,"width":0.059027776,"height":0.026666667},"on_screen":true,"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},"on_screen":false,"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},"on_screen":false,"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},"on_screen":false,"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},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"8","depth":4,"bounds":{"left":0.8645833,"top":0.34444445,"width":0.016666668,"height":0.02111111},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"1","depth":4,"bounds":{"left":0.8854167,"top":0.34444445,"width":0.015277778,"height":0.02111111},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"3","depth":4,"bounds":{"left":0.9048611,"top":0.34444445,"width":0.016666668,"height":0.02111111},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"4","depth":4,"bounds":{"left":0.92569447,"top":0.34444445,"width":0.016666668,"height":0.02111111},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.9458333,"top":0.3422222,"width":0.015277778,"height":0.025555555},"on_screen":true,"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.9611111,"top":0.3422222,"width":0.014583333,"height":0.025555555},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"SELECT\n# DISTINCT\nopp.id as opp_id, opp.uuid, opp.name,\n# COUNT(dr.id) AS deal_risk_count,\n\n# dr.id,\n# cfd.value,\nusr.name AS owner_name,\nopp.value, opp.currency_code, opp.close_date, opp.remotely_created_at, opp.is_closed, opp.is_won,\nusr.uuid as owner_uuid,\nusr.photo_path as owner_photo,\nusr.id AS owner_id,\njt.name as owner_job,\nopp.stage_id, opp.stage_updated_at,\nacc.name AS acc_name, opp.stage_updated_at, acc.crm_provider_id AS acc_provider_id, opp.crm_provider_id AS opp_provider_id,\nrt.business_process_id AS pipeline_id\nFROM opportunities opp\nLEFT JOIN record_types rt ON opp.record_type_id = rt.id\nLEFT JOIN users usr ON opp.user_id = usr.id\nLEFT JOIN accounts acc ON opp.account_id = acc.id\nLEFT JOIN job_titles jt ON usr.job_title_id = jt.id\n\n# LEFT JOIN group_deal_risk_types gdrt ON gdrt.group_id = usr.group_id\n# LEFT JOIN deal_risks dr ON dr.opportunity_id = opp.id AND dr.group_deal_risk_type_id = gdrt.id\n\nLEFT JOIN crm_field_data cfd ON (cfd.object_id = opp.id and cfd.crm_field_id = 66814)\n\nWHERE opp.user_id IS NOT NULL\nAND opp.deleted_at IS NULL\nAND opp.is_closed = 1\nAND opp.is_won = 0\nAND opp.close_date >= '2024-01-01 00:00:00'\nAND opp.close_date <= '2024-12-31 23:59:59'\nAND usr.team_id = 1\n\n# and opp.id = 4823179\n\nGROUP BY opp.id, cfd.value\nORDER BY\n# cfd.value\n CAST(cfd.value AS UNSIGNED)\n# owner_name\n# (SELECT COUNT(dr.id)\n# FROM deal_risks dr\n# JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id\n# WHERE dr.opportunity_id = opp.id\n# AND dr.is_active = 1\n# AND gdrt.is_enabled = 1)\nDESC\nLIMIT 25\n# OFFSET 0\n;\n\nselect * from crm_fields where crm_configuration_id = 1 and object_type = 'opportunity';\nselect * from crm_layout_entities where crm_layout_id = 1493;\n\nSELECT * FROM opportunities WHERE id = 4584045;\nSELECT * FROM crm_field_data WHERE object_id = 4584045;\n\nSELECT * FROM opportunities where team_id = 1 and crm_provider_id = '0061K00000lfb9IQAQ'\n\nSELECT\n opp.id as opportunity_id,\n opp.name,\n COUNT(dr.id) as risk_count\nFROM opportunities opp\nLEFT JOIN deal_risks dr ON dr.opportunity_id = opp.id\nWHERE opp.id IN (\n 6069574,8900938,9507638,9524799,9660490,9662824,9705675,9749758,4158460,4391812,6450439,4448422,5118945,5590675,4584045,7228149,9002408,9165534,9446720,9641778,9665149,9703344,9709280,5747948,4158491,6182565,6263970,5798120,5111315,4536978,6062352,6548383,6072095,6548225,4480986,5011422,6548381,8760540,8917554,9509986,9514392,9569009,9569011,9578490,9713604,5784397,7276612,7288405,8994421,9118219,9608148,9818911,4510535,6479693,5958049,6271674,6550448,4158331,4158483,6126571,6171615,6540943,4897466,5190896,5796182,5932762,8572433,8723698,8892697,9711001,9789264,4549188,6100831,6170064,6260799,6263653,6449936,6530871,6538978,7777651,8059269,8319918,8787049,8901150,9263153,9453207,9514738,9696700,9791062,5752018,6421452,7439134,7878923,9354763,9369285,9514396,9582506,9889949,9890216,4094311,4158495,4158496,6098128,5585661,3872564,6442149,5891604,6164746,6199593,6583474,6519684,9018490,9809006,4496897,5041324,5829430,6198319,6253504,6555763,7242914,7931055,8024125,8797814,8058559,8673347,8892695,8994420,9616219,9714970,9722004,9809439,9818918,6523177,8134147,9002915,9711422,9892713,9901719,9954210,9978435,5800810,6243518,6416114,6222251,6411974,6512456,5791953,6545606,9914780,5805540,6238986,6463838,6547680,9767049,9809437,9810885,9890855,6673493,9902036,4335521,6379871,6503799,6546077,8018765,9907556,9958433,9905855,9916179,9946741,9957877,5563344,6271838,6450815,7641128,7762567,7780592,8684810,8685786,8685787,8685788\n)\nGROUP BY opp.id;\n\nSELECT COUNT(dr.id)\n FROM deal_risks dr\n JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id\n WHERE dr.opportunity_id = 5563344\n# AND gdrt.group_id = usr.group_id\n\n\n\nEXPLAIN SELECT\n opp.id as opp_id, opp.uuid, opp.name,\n\ncfd.value,\ncfv.sequence,\ncfv.value,\n# MAX(cfd.value) AS max_cfd_value,\nusr.name AS owner_name,\nopp.value, opp.currency_code, opp.close_date, opp.remotely_created_at, opp.is_closed, opp.is_won,\nusr.uuid as owner_uuid,\nusr.photo_path as owner_photo,\nusr.id AS owner_id,\njt.name as owner_job,\nopp.stage_id, opp.stage_updated_at,\nacc.name AS acc_name, opp.stage_updated_at, acc.crm_provider_id AS acc_provider_id, opp.crm_provider_id AS opp_provider_id,\nrt.business_process_id AS pipeline_id\nFROM opportunities opp\n\nLEFT JOIN record_types rt ON opp.record_type_id = rt.id\nLEFT JOIN users usr ON opp.user_id = usr.id\nLEFT JOIN accounts acc ON opp.account_id = acc.id\nLEFT JOIN job_titles jt ON usr.job_title_id = jt.id\n\nLEFT JOIN crm_field_data cfd ON cfd.id = (SELECT sub_cfd.id\n FROM crm_field_data sub_cfd\n WHERE sub_cfd.object_id = opp.id\n AND sub_cfd.crm_field_id = 66810\n ORDER BY sub_cfd.updated_at DESC\n LIMIT 1)\n\nLEFT JOIN crm_field_values cfv ON cfv.crm_field_id = 66810 AND cfv.value = cfd.value\n\nWHERE opp.user_id IS NOT NULL\nAND opp.deleted_at IS NULL\nAND opp.is_closed = 0\n# AND opp.is_closed = 1\n# AND opp.is_won = 0\nAND opp.close_date >= '2024-01-01 00:00:00'\nAND opp.close_date <= '2024-12-31 23:59:59'\nAND usr.team_id = 1\n\n# and opp.id = 4823179\n\n# GROUP BY opp.id\nORDER BY\n cfv.sequence DESC,\n# opp.name\n# owner_name\n cfd.value\n# CAST(cfd.value AS UNSIGNED)\n# CAST(MAX(cfd.value) AS UNSIGNED)\n# (SELECT COUNT(dr.id)\n# FROM deal_risks dr\n# JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id\n# WHERE dr.opportunity_id = opp.id\n# AND dr.is_active = 1 AND gdrt.is_enabled = 1)\nDESC\n# LIMIT 75, 25\n;\n\n\n\nSELECT * FROM crm_field_values WHERE crm_field_id = 66810;\n\nSELECT f.id, f.crm_provider_id AS field_name, f.label, fd.object_id AS dealId, fd.value, fd.updated_at, fd.id, fd.created_at\nFROM crm_fields f\nINNER JOIN crm_field_data fd ON fd.crm_field_id = f.id\n WHERE (f.crm_configuration_id = 1)\n AND (f.object_type = 'opportunity')\n# AND (fd.object_id IN (4158331,4158483,4158495,4158496,6069574,6263970,6171615,6540943,6545606,5829430,6198319,6263653,6548381,7242914,8797814,7228149,7439134,7878923,8134147,9002915,9118219,9165534,9354763,9369285,9446720))\n AND (fd.object_id IN (4158460))\n AND (f.crm_provider_id IN ('ForecastCategoryName'))\n ORDER BY fd.object_id ASC, fd.updated_at DESC;\n\nselect * from crm_layouts where crm_configuration_id = 1;\nselect cf.* from crm_fields cf\njoin crm_layout_entities cle on cf.id = cle.crm_field_id\nwhere crm_layout_id = 1493;\n\nSELECT * FROM opportunities WHERE id = 4158460;\nSELECT * FROM crm_field_data WHERE object_id = 4158460;\n\nselect * from users where team_id = 1;\nSELECT * FROM users WHERE id = 7160;\nselect * from role_user where user_id = 3248;\n\nselect * from crm_field_values where crm_field_id = 66824;\n\nSELECT * FROM users WHERE id = 23470;\nselect * from crm_configurations;\n\n# ******************************************\nselect * from teams where id = 1038; # 23521, 966\nselect * from users where team_id = 1038;\nselect * from crm_configurations where id = 966;\nSELECT * FROM activities WHERE uuid_to_bin('e8dc7c34-31f6-4430-bd81-2d9d8f00dd07') = uuid; # 54965762\nSELECT * FROM activities WHERE uuid_to_bin('4b5727c0-69d1-428f-b8d9-b649055166e2') = uuid; # 54965764\nSELECT * FROM participants WHERE activity_id = 54965764;\n\nSELECT id, uuid, title, recording_state FROM activities WHERE uuid_to_bin('355f105d-5606-4379-b0c5-d91daf59f4ce') = uuid; # 54964075\nSELECT * FROM participants WHERE activity_id = 54964075;\nselect f.id, slug, title, tf.team_id from team_features tf JOIN features f on tf.feature_id = f.id\n where tf.team_id = 1038;\n\n\n# ****************************************** PD *************************\nselect * from teams where id = 1029;\nSELECT * FROM crm_configurations WHERE id = 957;\nSELECT * FROM activities WHERE uuid_to_bin('581a33cb-4343-44bd-ac0c-4a5cee71c5ec') = uuid; # 54963423\nSELECT * FROM activities WHERE uuid_to_bin('07238011-25fa-418e-838b-fb21e82b9ea2') = uuid; # 54963433\n\nSELECT * FROM activities WHERE uuid_to_bin('8b6bb2f7-e7a7-4aec-8806-fbfea7093ccd') = uuid; # 54963421\n\n# ****************************************** Close *************************\nselect * from teams where id = 1031;\nSELECT * FROM crm_configurations WHERE id = 959;\nSELECT * FROM activities WHERE uuid_to_bin('59c517e0-96c9-4dad-bfeb-b7bef72f8725') = uuid; # 54963517\n\n\nSELECT * FROM activities WHERE uuid_to_bin('07238011-25fa-418e-838b-fb21e82b9ea2') = uuid; # 54963433\n\nSELECT * FROM activities WHERE uuid_to_bin('d68311e3-ac34-49bd-bf04-88323a7e5352') = uuid; # 54966009\n\n# ****************************************** SF *************************\nSELECT * FROM activities WHERE uuid_to_bin('2bd4cfa3-4eb5-4c77-84a7-9ed46a21c988') = uuid;\n\nselect * from roles;\nselect * from permissions;\nselect * from permission_role where permission_id = 136;\n\nselect * from migrations order by id desc;\n\nselect * from teams where id IN (1, 1037);\nselect * from crm_layouts where crm_configuration_id = 1;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1493;\nSELECT * FROM crm_fields WHERE id IN (1652,1661,66799,66814,66821,66836,66843,66846,66864,84752,182306,323580,380378);\n\nselect * from features;\nselect * from team_features where feature_id = 33;\nselect * from opportunities;\n\nselect * from teams;\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 = 1052 and sa.provider = 'hubspot';\n\nSELECT * FROM accounts where id = 11512582;\nselect * from activities where account_id = 11512582;","depth":4,"on_screen":true,"value":"SELECT\n# DISTINCT\nopp.id as opp_id, opp.uuid, opp.name,\n# COUNT(dr.id) AS deal_risk_count,\n\n# dr.id,\n# cfd.value,\nusr.name AS owner_name,\nopp.value, opp.currency_code, opp.close_date, opp.remotely_created_at, opp.is_closed, opp.is_won,\nusr.uuid as owner_uuid,\nusr.photo_path as owner_photo,\nusr.id AS owner_id,\njt.name as owner_job,\nopp.stage_id, opp.stage_updated_at,\nacc.name AS acc_name, opp.stage_updated_at, acc.crm_provider_id AS acc_provider_id, opp.crm_provider_id AS opp_provider_id,\nrt.business_process_id AS pipeline_id\nFROM opportunities opp\nLEFT JOIN record_types rt ON opp.record_type_id = rt.id\nLEFT JOIN users usr ON opp.user_id = usr.id\nLEFT JOIN accounts acc ON opp.account_id = acc.id\nLEFT JOIN job_titles jt ON usr.job_title_id = jt.id\n\n# LEFT JOIN group_deal_risk_types gdrt ON gdrt.group_id = usr.group_id\n# LEFT JOIN deal_risks dr ON dr.opportunity_id = opp.id AND dr.group_deal_risk_type_id = gdrt.id\n\nLEFT JOIN crm_field_data cfd ON (cfd.object_id = opp.id and cfd.crm_field_id = 66814)\n\nWHERE opp.user_id IS NOT NULL\nAND opp.deleted_at IS NULL\nAND opp.is_closed = 1\nAND opp.is_won = 0\nAND opp.close_date >= '2024-01-01 00:00:00'\nAND opp.close_date <= '2024-12-31 23:59:59'\nAND usr.team_id = 1\n\n# and opp.id = 4823179\n\nGROUP BY opp.id, cfd.value\nORDER BY\n# cfd.value\n CAST(cfd.value AS UNSIGNED)\n# owner_name\n# (SELECT COUNT(dr.id)\n# FROM deal_risks dr\n# JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id\n# WHERE dr.opportunity_id = opp.id\n# AND dr.is_active = 1\n# AND gdrt.is_enabled = 1)\nDESC\nLIMIT 25\n# OFFSET 0\n;\n\nselect * from crm_fields where crm_configuration_id = 1 and object_type = 'opportunity';\nselect * from crm_layout_entities where crm_layout_id = 1493;\n\nSELECT * FROM opportunities WHERE id = 4584045;\nSELECT * FROM crm_field_data WHERE object_id = 4584045;\n\nSELECT * FROM opportunities where team_id = 1 and crm_provider_id = '0061K00000lfb9IQAQ'\n\nSELECT\n opp.id as opportunity_id,\n opp.name,\n COUNT(dr.id) as risk_count\nFROM opportunities opp\nLEFT JOIN deal_risks dr ON dr.opportunity_id = opp.id\nWHERE opp.id IN (\n 6069574,8900938,9507638,9524799,9660490,9662824,9705675,9749758,4158460,4391812,6450439,4448422,5118945,5590675,4584045,7228149,9002408,9165534,9446720,9641778,9665149,9703344,9709280,5747948,4158491,6182565,6263970,5798120,5111315,4536978,6062352,6548383,6072095,6548225,4480986,5011422,6548381,8760540,8917554,9509986,9514392,9569009,9569011,9578490,9713604,5784397,7276612,7288405,8994421,9118219,9608148,9818911,4510535,6479693,5958049,6271674,6550448,4158331,4158483,6126571,6171615,6540943,4897466,5190896,5796182,5932762,8572433,8723698,8892697,9711001,9789264,4549188,6100831,6170064,6260799,6263653,6449936,6530871,6538978,7777651,8059269,8319918,8787049,8901150,9263153,9453207,9514738,9696700,9791062,5752018,6421452,7439134,7878923,9354763,9369285,9514396,9582506,9889949,9890216,4094311,4158495,4158496,6098128,5585661,3872564,6442149,5891604,6164746,6199593,6583474,6519684,9018490,9809006,4496897,5041324,5829430,6198319,6253504,6555763,7242914,7931055,8024125,8797814,8058559,8673347,8892695,8994420,9616219,9714970,9722004,9809439,9818918,6523177,8134147,9002915,9711422,9892713,9901719,9954210,9978435,5800810,6243518,6416114,6222251,6411974,6512456,5791953,6545606,9914780,5805540,6238986,6463838,6547680,9767049,9809437,9810885,9890855,6673493,9902036,4335521,6379871,6503799,6546077,8018765,9907556,9958433,9905855,9916179,9946741,9957877,5563344,6271838,6450815,7641128,7762567,7780592,8684810,8685786,8685787,8685788\n)\nGROUP BY opp.id;\n\nSELECT COUNT(dr.id)\n FROM deal_risks dr\n JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id\n WHERE dr.opportunity_id = 5563344\n# AND gdrt.group_id = usr.group_id\n\n\n\nEXPLAIN SELECT\n opp.id as opp_id, opp.uuid, opp.name,\n\ncfd.value,\ncfv.sequence,\ncfv.value,\n# MAX(cfd.value) AS max_cfd_value,\nusr.name AS owner_name,\nopp.value, opp.currency_code, opp.close_date, opp.remotely_created_at, opp.is_closed, opp.is_won,\nusr.uuid as owner_uuid,\nusr.photo_path as owner_photo,\nusr.id AS owner_id,\njt.name as owner_job,\nopp.stage_id, opp.stage_updated_at,\nacc.name AS acc_name, opp.stage_updated_at, acc.crm_provider_id AS acc_provider_id, opp.crm_provider_id AS opp_provider_id,\nrt.business_process_id AS pipeline_id\nFROM opportunities opp\n\nLEFT JOIN record_types rt ON opp.record_type_id = rt.id\nLEFT JOIN users usr ON opp.user_id = usr.id\nLEFT JOIN accounts acc ON opp.account_id = acc.id\nLEFT JOIN job_titles jt ON usr.job_title_id = jt.id\n\nLEFT JOIN crm_field_data cfd ON cfd.id = (SELECT sub_cfd.id\n FROM crm_field_data sub_cfd\n WHERE sub_cfd.object_id = opp.id\n AND sub_cfd.crm_field_id = 66810\n ORDER BY sub_cfd.updated_at DESC\n LIMIT 1)\n\nLEFT JOIN crm_field_values cfv ON cfv.crm_field_id = 66810 AND cfv.value = cfd.value\n\nWHERE opp.user_id IS NOT NULL\nAND opp.deleted_at IS NULL\nAND opp.is_closed = 0\n# AND opp.is_closed = 1\n# AND opp.is_won = 0\nAND opp.close_date >= '2024-01-01 00:00:00'\nAND opp.close_date <= '2024-12-31 23:59:59'\nAND usr.team_id = 1\n\n# and opp.id = 4823179\n\n# GROUP BY opp.id\nORDER BY\n cfv.sequence DESC,\n# opp.name\n# owner_name\n cfd.value\n# CAST(cfd.value AS UNSIGNED)\n# CAST(MAX(cfd.value) AS UNSIGNED)\n# (SELECT COUNT(dr.id)\n# FROM deal_risks dr\n# JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id\n# WHERE dr.opportunity_id = opp.id\n# AND dr.is_active = 1 AND gdrt.is_enabled = 1)\nDESC\n# LIMIT 75, 25\n;\n\n\n\nSELECT * FROM crm_field_values WHERE crm_field_id = 66810;\n\nSELECT f.id, f.crm_provider_id AS field_name, f.label, fd.object_id AS dealId, fd.value, fd.updated_at, fd.id, fd.created_at\nFROM crm_fields f\nINNER JOIN crm_field_data fd ON fd.crm_field_id = f.id\n WHERE (f.crm_configuration_id = 1)\n AND (f.object_type = 'opportunity')\n# AND (fd.object_id IN (4158331,4158483,4158495,4158496,6069574,6263970,6171615,6540943,6545606,5829430,6198319,6263653,6548381,7242914,8797814,7228149,7439134,7878923,8134147,9002915,9118219,9165534,9354763,9369285,9446720))\n AND (fd.object_id IN (4158460))\n AND (f.crm_provider_id IN ('ForecastCategoryName'))\n ORDER BY fd.object_id ASC, fd.updated_at DESC;\n\nselect * from crm_layouts where crm_configuration_id = 1;\nselect cf.* from crm_fields cf\njoin crm_layout_entities cle on cf.id = cle.crm_field_id\nwhere crm_layout_id = 1493;\n\nSELECT * FROM opportunities WHERE id = 4158460;\nSELECT * FROM crm_field_data WHERE object_id = 4158460;\n\nselect * from users where team_id = 1;\nSELECT * FROM users WHERE id = 7160;\nselect * from role_user where user_id = 3248;\n\nselect * from crm_field_values where crm_field_id = 66824;\n\nSELECT * FROM users WHERE id = 23470;\nselect * from crm_configurations;\n\n# ******************************************\nselect * from teams where id = 1038; # 23521, 966\nselect * from users where team_id = 1038;\nselect * from crm_configurations where id = 966;\nSELECT * FROM activities WHERE uuid_to_bin('e8dc7c34-31f6-4430-bd81-2d9d8f00dd07') = uuid; # 54965762\nSELECT * FROM activities WHERE uuid_to_bin('4b5727c0-69d1-428f-b8d9-b649055166e2') = uuid; # 54965764\nSELECT * FROM participants WHERE activity_id = 54965764;\n\nSELECT id, uuid, title, recording_state FROM activities WHERE uuid_to_bin('355f105d-5606-4379-b0c5-d91daf59f4ce') = uuid; # 54964075\nSELECT * FROM participants WHERE activity_id = 54964075;\nselect f.id, slug, title, tf.team_id from team_features tf JOIN features f on tf.feature_id = f.id\n where tf.team_id = 1038;\n\n\n# ****************************************** PD *************************\nselect * from teams where id = 1029;\nSELECT * FROM crm_configurations WHERE id = 957;\nSELECT * FROM activities WHERE uuid_to_bin('581a33cb-4343-44bd-ac0c-4a5cee71c5ec') = uuid; # 54963423\nSELECT * FROM activities WHERE uuid_to_bin('07238011-25fa-418e-838b-fb21e82b9ea2') = uuid; # 54963433\n\nSELECT * FROM activities WHERE uuid_to_bin('8b6bb2f7-e7a7-4aec-8806-fbfea7093ccd') = uuid; # 54963421\n\n# ****************************************** Close *************************\nselect * from teams where id = 1031;\nSELECT * FROM crm_configurations WHERE id = 959;\nSELECT * FROM activities WHERE uuid_to_bin('59c517e0-96c9-4dad-bfeb-b7bef72f8725') = uuid; # 54963517\n\n\nSELECT * FROM activities WHERE uuid_to_bin('07238011-25fa-418e-838b-fb21e82b9ea2') = uuid; # 54963433\n\nSELECT * FROM activities WHERE uuid_to_bin('d68311e3-ac34-49bd-bf04-88323a7e5352') = uuid; # 54966009\n\n# ****************************************** SF *************************\nSELECT * FROM activities WHERE uuid_to_bin('2bd4cfa3-4eb5-4c77-84a7-9ed46a21c988') = uuid;\n\nselect * from roles;\nselect * from permissions;\nselect * from permission_role where permission_id = 136;\n\nselect * from migrations order by id desc;\n\nselect * from teams where id IN (1, 1037);\nselect * from crm_layouts where crm_configuration_id = 1;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1493;\nSELECT * FROM crm_fields WHERE id IN (1652,1661,66799,66814,66821,66836,66843,66846,66864,84752,182306,323580,380378);\n\nselect * from features;\nselect * from team_features where feature_id = 33;\nselect * from opportunities;\n\nselect * from teams;\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 = 1052 and sa.provider = 'hubspot';\n\nSELECT * FROM accounts where id = 11512582;\nselect * from activities where account_id = 11512582;","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Project","depth":3,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Project","depth":3,"bounds":{"left":0.025,"top":0.06666667,"width":0.050694443,"height":0.034444444},"on_screen":true,"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},"on_screen":false,"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},"on_screen":false,"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},"on_screen":false,"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},"on_screen":false,"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},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
4266403488567062772
|
6524482065460761565
|
click
|
accessibility
|
NULL
|
Project: faVsco.js, menu
#12066 on JY-20725-handle Project: faVsco.js, menu
#12066 on JY-20725-handle-HS-search-rate-limit, menu
Start Listening for PHP Debug Connections
HandleHubspotRateLimitTest
Run 'HandleHubspotRateLimitTest'
Debug 'HandleHubspotRateLimitTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
16
2
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Services\Crm\IntegrationApp;
use Carbon\Carbon;
use Jiminny\Contracts\Crm\Providers;
use Jiminny\Contracts\Services\Crm\ClientInterface;
use Jiminny\Contracts\Services\Crm\FetchRelatedActivityInterface;
use Jiminny\Contracts\Services\Crm\ImportsBusinessProcessesInterface;
use Jiminny\Contracts\Services\Crm\LayoutManagementInterface;
use Jiminny\Contracts\Services\Crm\MatchCrmEntitiesInterface;
use Jiminny\Contracts\Services\Crm\Provider\IntegrationAppInterface;
use Jiminny\Contracts\Services\Crm\RemoteEntityLookupInterface;
use Jiminny\Contracts\Services\Crm\RemoteEntityManipulationInterface;
use Jiminny\Contracts\Services\Crm\RemoteNoteEntityManipulationInterface;
use Jiminny\Contracts\Services\Crm\SendSummaryToCrmInterface;
use Jiminny\Contracts\Services\Crm\SettingsInterface;
use Jiminny\Contracts\Services\Crm\SyncCrmEntitiesInterface;
use Jiminny\Contracts\Services\Crm\SyncCrmMetadataInterface;
use Jiminny\Events\Activities\Crm\ActivityLeadConverted;
use Jiminny\Exceptions\CrmException;
use Jiminny\Exceptions\SocialAccountNotFoundException;
use Jiminny\Jobs\Crm\NoteObject;
use Jiminny\Models\Account;
use Jiminny\Models\Activity;
use Jiminny\Models\Contracts\ActivityContract;
use Jiminny\Models\Crm\Configuration;
use Jiminny\Models\Opportunity;
use Jiminny\Models\Stage;
use Jiminny\Models\User;
use Jiminny\Services\Crm\BaseService;
use Jiminny\Services\Crm\IntegrationApp\Config\IntegrationAppProviders;
use Jiminny\Services\Crm\IntegrationApp\Config\IntegrationConfigFactory;
use Jiminny\Services\Crm\IntegrationApp\DTO\Mappers\FieldMapperInterface;
use Jiminny\Services\Crm\IntegrationApp\DTO\Mappers\LeadFieldMapper;
use Jiminny\Services\Crm\IntegrationApp\DTO\Utils\GenerateProviderUrlInterface;
use Jiminny\Services\Crm\IntegrationApp\DTO\Utils\IntegrationAppCrmGeneratorFactory;
use Jiminny\Services\Crm\IntegrationApp\DTO\Utils\UrlGeneratorInterface;
use Jiminny\Services\Crm\IntegrationApp\ServiceTraits\SyncCrmFieldsTrait;
use Jiminny\Services\Crm\IntegrationApp\ServiceTraits\SystemStateTrait;
use Jiminny\Services\Crm\IntegrationApp\ServiceTraits\LayoutTrait;
use Jiminny\Services\Crm\IntegrationApp\ServiceTraits\MatchProspectsTrait;
use Jiminny\Services\Crm\IntegrationApp\ServiceTraits\NotSupportedTrait;
use Jiminny\Services\Crm\IntegrationApp\ServiceTraits\SyncCrmEntitiesTrait;
use Jiminny\Services\Crm\IntegrationApp\ServiceTraits\SyncCrmMetadataTrait;
use Psr\Log\LoggerInterface;
use Jiminny\Services\Crm\IntegrationApp\DTO\Mappers\OpportunityFieldMapper;
use Jiminny\Repositories\Crm\ProfileRepository;
use Jiminny\Repositories\Crm\OpportunityRepository;
use Jiminny\Models\Crm\Profile;
use Jiminny\Services\Crm\CrmObjects\CrmObjectsRepository;
class Service extends BaseService implements
IntegrationAppInterface,
SyncCrmEntitiesInterface,
SyncCrmMetadataInterface,
ImportsBusinessProcessesInterface,
RemoteEntityManipulationInterface,
LayoutManagementInterface,
SettingsInterface,
MatchCrmEntitiesInterface,
RemoteEntityLookupInterface,
RemoteNoteEntityManipulationInterface,
SendSummaryToCrmInterface,
UrlGeneratorInterface,
FetchRelatedActivityInterface
{
use SyncCrmMetadataTrait;
use SyncCrmEntitiesTrait;
use SystemStateTrait;
use LayoutTrait;
use NotSupportedTrait;
use MatchProspectsTrait;
use SyncCrmFieldsTrait;
public const string CALL_TYPE_MISSED = 'Missed';
public const string CALL_TYPE_INBOUND = 'Inbound';
public const string CALL_TYPE_OUTBOUND = 'Outbound';
public const string RELATIONSHIP_OPPORTUNITY = 'Deals';
public const string RELATIONSHIP_LEAD = 'Leads';
public const string RELATIONSHIP_ACCOUNT = 'Accounts';
/**
* @var ClientInterface&DataClient
*/
protected $client;
protected ?User $invokedUser = null;
protected ?GenerateProviderUrlInterface $crmUrlGenerator = null;
public function __construct(
DataClient $client,
LoggerInterface $logger,
) {
parent::__construct();
$this->client = $client;
$this->logger = $logger;
}
public function getDisplayName(): string
{
return Providers::getProviderDisplayName(
Providers::getCrmIntegrationSlug($this->config)
);
}
/**
* @throws \Exception
*/
public function setUser(User $user): void
{
$this->configureSentryScope($user);
$this->invokedUser = $user;
$this->team = $user->getTeam();
$teamOwner = $this->team->getOwner();
$this->setConfiguration($user->getTeam()->getCrmConfiguration());
$this->setEditionConfiguration(Providers::getCrmIntegrationSlug($this->config));
$this->setCrmUrlGenerator($this->config);
$this->client->setTeam($this->team);
$socialAccount = $teamOwner?->getSocialAccount('integration-app');
if ($socialAccount === null) {
$this->logger->info('[integration-app] Social account not found', [
'teamId' => $this->team->getId(),
'teamOwnerId' => $teamOwner?->getId(),
'userId' => $user->getId(),
]);
throw new SocialAccountNotFoundException('Social account not found!');
}
$this->client->setSocialAccount($socialAccount);
// The CRM Service is properly bootstrapped, and supports remote operations
$this->connect();
}
public function normalizeValue(string $fieldType, string $fieldValue, bool $internal = false): string
{
return $fieldValue;
}
public function find(string $name, array $scopes): array
{
/** @var LocalSearch $localSearch */
$localSearch = app(LocalSearch::class);
$localSearch->setConfiguration($this->config);
$localSearch->setCountryCode($this->invokedUser->getCountryCode());
return $localSearch->search($name);
// if (! empty($localMatch)) {
// return $localMatch;
// }
//
// /** @var RemoteSearch $remoteSearch */
// $remoteSearch = app(RemoteSearch::class);
// $remoteSearch->setClient($this->client);
// $remoteSearch->setConfiguration($this->config);
//
// return $remoteSearch->search($name);
}
public function findOpportunities(?string $crmAccountId, ?string $crmContactId, ?int $userId = null): array
{
$data = [];
$ownerData = [];
$account = $this->getAccount($crmAccountId, $crmContactId);
if ($account === null) {
return [];
}
$ownerId = $this->getOwnerId($userId);
try {
$opportunityRepository = app(OpportunityRepository::class);
$opportunities = $opportunityRepository->findAllByConfigurationAndAccountId(
$this->config,
$account->getId()
);
foreach ($opportunities as $opportunity) {
/** @var Opportunity $opportunity */
$record = $this->buildOpportunityData($opportunity);
if ($ownerId && $opportunity->getOwnerId() === $ownerId) {
$ownerData[] = $record;
}
$data[] = $record;
}
if (! empty($ownerData)) {
return $ownerData;
}
return $data;
} catch (\Exception $e) {
$this->logger->info('[integration-app] Failed to fetch opportunities', [
'contact' => $crmContactId,
'account' => $crmAccountId,
'owner' => $ownerId,
'error' => $e->getMessage(),
]);
return $data;
}
}
private function getOwnerId(?int $userId = null): ?string
{
if (! $userId) {
return null;
}
$profileRepository = app(ProfileRepository::class);
$profile = $profileRepository->findProfileByUserId($this->config, $userId);
return $profile instanceof Profile ? $profile->getCrmProviderId() : null;
}
private function getAccount(?string $crmAccountId = null, ?string $crmContactId = null): ?Account
{
$crmRepository = app(CrmObjectsRepository::class);
if ($crmAccountId === null) {
$contact = $crmRepository->findContactByCrmProviderId($this->config, $crmContactId);
return $contact->getAccount();
}
return $crmRepository->findAccountByCrmProviderId($this->config, $crmAccountId);
}
private function buildOpportunityData(Opportunity $opportunity): array
{
$record = [
'crmId' => $opportunity->getCrmProviderId(),
'name' => $opportunity->getName(),
'won' => $opportunity->isWon(),
'closed' => $opportunity->isClosed(),
];
if (! empty($opportunity->getFormattedValueAttribute())) {
$record['value'] = $opportunity->getFormattedValueAttribute();
}
if (! empty($opportunity->getStage())) {
$record['stage'] = [
'id' => $opportunity->getStage()->getUuid(),
'name' => $opportunity->getStage()->getName(),
];
}
return $record;
}
public function updateRecord(string $objectType, string $objectId, array $data, array $headers = []): void
{
$data = [
'data' => $this->normalizeData($objectType, $data),
];
$this->client->updateRecordById($objectType, $objectId, $data);
}
private function normalizeData(string $objectType, array $data): array
{
$fieldMapper = $this->getFieldMapper($objectType);
if (! $fieldMapper instanceof FieldMapperInterface) {
return $data;
}
return $fieldMapper->mapToCrmFields($data);
}
private function getFieldMapper(string $objectType): ?FieldMapperInterface
{
if ($objectType === self::OBJECT_OPPORTUNITY) {
return app(OpportunityFieldMapper::class);
}
if ($objectType === self::OBJECT_LEAD) {
return app(LeadFieldMapper::class);
}
return null;
}
public function getRecord(string $objectType, string $objectId, array $fields = []): array
{
return $this->client->getRecordById($objectType, $objectId);
}
public function getConfiguration(): Configuration
{
return $this->config;
}
public function setConfiguration(Configuration $config): void
{
$this->clearExternalMapCache();
$this->config = $config;
}
private function setEditionConfiguration(string $provider): void
{
$this->editionConfig = app(IntegrationConfigFactory::class)->create($provider);
}
public function setCrmUrlGenerator(Configuration $config): void
{
$this->crmUrlGenerator = app(IntegrationAppCrmGeneratorFactory::class)->create($config);
}
public function getCrmUrlGenerator(): ?GenerateProviderUrlInterface
{
if ($this->crmUrlGenerator === null) {
$this->setCrmUrlGenerator($this->config);
}
return $this->crmUrlGenerator;
}
public function subscribeEntityEvents(bool $enableTrigger = true): void
{
$eventStates = $this->client->updateEntityEventsState($enableTrigger);
$this->logger->info('[integration-app] Change team entity events subscription', [
'teamId' => $this->team->getId(),
'teamName' => $this->team->getName(),
'states' => $eventStates,
'action' => $enableTrigger ? 'subscribe' : 'unsubscribe',
]);
}
#[\Override] public function supportsNotes(): bool
{
return $this->editionConfig->supportsNotes();
}
#[\Override] public function saveNote(
string $title,
string $body,
string $objectId,
?NoteObject $noteObject = null,
): ?string {
if ($noteObject === null) {
return null;
}
$notePayload = [
'title' => $title,
'content' => $body,
'objectId' => $objectId,
'objectType' => $noteObject->value,
];
$result = $this->client->createNote($notePayload);
// debug saving note response
$this->logger->info('[integration-app] createNote response', [
'objectId' => $objectId,
'objectType' => $noteObject->value,
'result' => $result,
'hasId' => isset($result['id']),
]);
return $result['id'] ?? null;
}
/**
* @throws CrmException
*/
#[\Override] public function saveActivity(Activity $activity): Activity
{
$this->logger->info('[integration-app] saveActivity', [
'activity' => $activity->getUuid(),
'type' => $activity->getType(),
]);
if ($activity->getCrmType() === Activity::TYPE_CONFERENCE) {
$crmActivity = $this->saveMeeting($activity);
} elseif (in_array($activity->getType(), [Activity::TYPE_SOFTPHONE, Activity::TYPE_SOFTPHONE_INBOUND])) {
$crmActivity = $this->saveCall($activity);
} else {
throw new CrmException('Unsupported activity type');
}
$crmActivityId = $crmActivity['id'] ?? null;
if ($crmActivityId !== null) {
$activity->crm_provider_id = $crmActivityId;
$activity->save();
$this->logger->info('[integration-app] Activity successfully logged to CRM', [
'activity' => $activity->getUuid(),
'type' => $activity->getType(),
'crmId' => $crmActivityId,
]);
}
return $activity;
}
public function saveMeeting(Activity $activity): array
{
$decorateActivity = app(DecorateActivity::class);
$meetingPayload = [
'Event_Title' => $decorateActivity->generateTitle($activity),
'Start_DateTime' => $activity->getActualStartTime()->toIso8601String(),
'End_DateTime' => $activity->getActualEndTime()->toIso8601String(),
'ownerId' => $this->getActivityOwnerId($activity),
];
$payload = array_merge($meetingPayload, $this->attachToProspect($activity));
if ($activity->hasCrmProviderId()) {
$crmId = $activity->getCrmProviderId();
$meeting = $this->client->getMeeting($crmId);
$oldDescription = $meeting['fields']['Description'] ?? null;
$payload['Description'] = $decorateActivity->generateUpdatedDescription($oldDescription, $activity);
$this->logger->info('[integration-app] CRM update meeting', [
'activity' => $activity->getUuid(),
'crm_id' => $crmId,
'payload' => $payload,
]);
return $this->client->updateMeeting($crmId, $payload);
}
$payload['Description'] = $decorateActivity->generateDescription($activity);
$this->logger->info('[integration-app] CRM log meeting', [
'activity' => $activity->getUuid(),
'payload' => $payload,
]);
return $this->client->createMeeting($payload);
}
public function saveCall(Activity $activity): array
{
$decorateActivity = app(DecorateActivity::class);
$callPayload = [
'Call_Type' => $this->getCallType($activity),
'Call_Start_Time' => $activity->getActualStartTime()->toIso8601String(),
'Call_Duration' => $activity->getDuration(),
'name' => $decorateActivity->generateTitle($activity),
'ownerId' => $this->getActivityOwnerId($activity),
];
$payload = array_merge($callPayload, $this->attachToProspect($activity));
if ($activity->hasCrmProviderId()) {
$crmId = $activity->getCrmProviderId();
$call = $this->client->getCall($crmId);
$oldDescription = $call['fields']['Description'] ?? null;
$payload['description'] = $decorateActivity->generateUpdatedDescription($oldDescription, $activity);
$this->logger->info('[integration-app] CRM update call', [
'activity' => $activity->getUuid(),
'crm_id' => $crmId,
'payload' => $payload,
]);
return $this->client->updateCall($crmId, $payload);
}
$payload['description'] = $decorateActivity->generateDescription($activity);
$this->logger->info('[integration-app] CRM log call', [
'activity' => $activity->getUuid(),
'payload' => $payload,
]);
return $this->client->createCall($payload);
}
private function getCallType(Activity $activity): string
{
if ($activity->getStatus() === Activity::STATUS_NO_ANSWER) {
return self::CALL_TYPE_MISSED;
}
return $activity->getType() === Activity::TYPE_SOFTPHONE_INBOUND ? self::CALL_TYPE_INBOUND : self::CALL_TYPE_OUTBOUND;
}
private function attachToProspect(Activity $activity): array
{
$payload = [];
if ($activity->hasContact()) {
$payload['contactId'] = $activity->getContact()->getCrmProviderId();
}
if ($activity->hasOpportunity()) {
return array_merge(
$payload,
$this->buildBasicPayload(
self::RELATIONSHIP_OPPORTUNITY,
$activity->getOpportunity()->getCrmProviderId()
)
);
}
if ($activity->hasAccount() && ! $activity->getAccount()->getIsInternal()) {
return array_merge(
$payload,
$this->buildBasicPayload(
self::RELATIONSHIP_ACCOUNT,
$activity->getAccount()->getCrmProviderId()
)
);
}
if ($activity->hasLead()) {
$payload = $this->handleLeadPayload($activity);
}
return $payload;
}
private function handleLeadPayload(Activity $activity): array
{
$freshLead = $this->syncLead($activity->getLead()->getCrmProviderId());
$lead = $freshLead ?? $activity->getLead();
if ($lead->getConvertedAt() === null) {
return $this->buildBasicPayload(self::RELATIONSHIP_LEAD, $lead->getCrmProviderId());
}
$activity->lead_id = null;
if ($lead->hasAccount()) {
$account = $lead->getAccount();
$activity->account_id = $account->getId();
$payload = $this->buildBasicPayload(self::RELATIONSHIP_ACCOUNT, $account->getCrmProviderId());
} else {
$payload = [];
}
if ($lead->hasOpportunity()) {
$opportunity = $lead->getOpportunity();
$payload = $this->buildBasicPayload(self::RELATIONSHIP_OPPORTUNITY, $opportunity->getCrmProviderId());
$activity->opportunity_id = $opportunity->getId();
$activity->value = $opportunity->value;
$activity->stage_id = $opportunity->stage_id;
} else {
$activity->stage_id = null;
}
if ($lead->hasContact()) {
$contact = $lead->getContact();
$payload['contactId'] = $contact->getCrmProviderId();
$activity->contact_id = $contact->getId();
}
$activity->save();
event(new ActivityLeadConverted($activity, $lead));
$this->logger->info('[integration-app] Lead converted', [
'activityUuid' => $activity->getUuid(),
'leadUuid' => $lead->getUuid(),
]);
return $payload;
}
private function buildBasicPayload(string $type, string $id): array
{
return [
'type' => $type,
'id' => $id,
];
}
private function getActivityOwnerId(Activity $activity): ?string
{
$ownerId = null;
if ($activity->hasUser() && $activity->getUser()->getProfile() !== null) {
$ownerId = $activity->getUser()->getProfile()->getCrmProviderId();
}
return $ownerId;
}
#[\Override] public function saveFollowupActivity(Activity $activity, array $fields): ?string
{
$taskPayload = [
'subject' => $fields['subject'],
'dueTime' => isset($fields['dueDate']) ? Carbon::parse($fields['dueDate'])->format('Y-m-d') : null,
'ownerId' => $this->getActivityOwnerId($activity),
];
if (isset($fields['status'])) {
$taskPayload['status'] = $fields['status'];
}
if (isset($fields['priority'])) {
$taskPayload['priority'] = $fields['priority'];
}
if (isset($fields['content'])) {
$taskPayload['content'] = $fields['content'];
}
$payload = array_merge($taskPayload, $this->attachToProspect($activity));
$this->logger->info('[integration-app] CRM log follow up task', [
'activity' => $activity->getUuid(),
'payload' => $payload,
]);
$task = $this->client->createTask($payload);
return $task['id'] ?? null;
}
#[\Override] public function saveTranscriptionSummaryAsNote(
ActivityContract $activity,
string $title,
string $body,
?string $objectId,
?NoteObject $noteObject = null,
): ?string {
// We have to find a way to store the transcription summary
// This might be possible either by Tasks, Events, Engagements & Notes
// Find what the CRM supports and save the note with the appropriate object(eg Notes)
// For now use only Notes as both ZOHO & Salesforce support them.
if ($this->supportsNotes() && $objectId !== null) {
$this->logger->info('[integration-app] saving note', [
'activityId' => $activity->getUuid(),
'objectId' => $objectId,
]);
return $this->saveNote($title, $body, $objectId, $noteObject);
}
$this->logger->info('[integration-app] skip saveTranscriptionSummaryAsNote', [
'activityId' => $activity->getUuid(),
'supportsNotes' => $this->supportsNotes(),
'objectId' => $objectId,
]);
return null;
}
public function generateProviderUrl(string $providerId, string $objectType): ?string
{
return $this->getCrmUrlGenerator()?->generateProviderUrl($providerId, $objectType);
}
public function updateStage($crmObject, Stage $stage): void
{
$objectType = $stage->getType();
$objectId = $crmObject->getCrmProviderId();
$params = ['stageName' => $stage->getCrmProviderId()];
$this->logger->info('[integration-app] updateStage', [
'objectType' => $objectType,
'objectId' => $objectId,
'params' => $params,
]);
$data = [
'data' => $this->normalizeData($objectType, $params),
];
if ($objectType === Stage::TYPE_LEAD) {
$this->client->updateLead($objectId, $data);
} else {
$this->client->updateDeal($objectId, $data);
}
}
/**
* @throws \Exception
*/
public function fetchAndAssociateRelatedActivity(Activity $activity): ?Activity
{
if ($activity->getCrm()?->getEdition() !== IntegrationAppProviders::ZOHO_CRM) {
return null;
}
if (! $activity->isTypeConference()) {
return null;
}
// The related activity is already linked.
if ($activity->hasCrmProviderId()) {
return $activity;
}
if ($activity->hasActualStartTime() === false) {
return null;
}
return $this->fetchAndAssociateZohoRelatedActivity($activity);
}
public function fetchAndAssociateZohoRelatedActivity(Activity $activity): ?Activity
{
try {
$meeting = $this->fetchRelatedZohoActivity($activity);
if (empty($meeting)) {
$this->logger->info('[integration-app] fetchRelatedZohoActivity No related activity found', [
'activity' => $activity->getUuid(),
]);
return null;
}
$decorateActivity = app(DecorateActivity::class);
$oldDescription = $meeting['Description'] ?? '';
$updatedDescription = $decorateActivity->generateUpdatedDescription($oldDescription, $activity);
$this->logger->info('[integration-app] fetchAndAssociateZohoRelatedActivity updating related activity', [
'activity' => $activity->getUuid(),
'description' => $updatedDescription,
]);
$this->client->updateMeeting($meeting['id'], ['Description' => $updatedDescription]);
// Update our activity to reflect the remote data.
$activity->update([
'crm_provider_id' => $meeting['id'],
'summary' => $meeting['Description'],
]);
return $activity;
} catch (\Exception $exception) {
\Sentry::captureException($exception);
throw $exception;
}
}
public function fetchRelatedZohoActivity(Activity $activity): array
{
[$from, $to] = $this->getFromToDates($activity);
$start = $from?->toIso8601String(); // e.g., 2025-07-01T00:00:00+00:00
$end = $to?->toIso8601String(); // e.g., 2025-07-14T23:59:59+00:00
if ($start === null || $end === null) {
$this->logger->info(
'[integration-app] fetchRelatedZohoActivity missing start or end date',
[
'activity' => $activity->getUuid(),
'start' => $start,
'end' => $end,
'from' => $from,
'to' => $to,
]
);
return [];
}
$whoId = null;
$whatId = null;
$criteriaParts = [];
if ($activity->getContact()) {
$whoId = $activity->getContact()->getCrmProviderId();
$criteriaParts[] = "(Who_Id:equals:$whoId)";
}
if ($activity->getOpportunity()) {
$whatId = $activity->getOpportunity()->getCrmProviderId();
} elseif ($activity->getAccount() && $activity->getAccount()->getIsInternal() === false) {
$whatId = $activity->getAccount()->getCrmProviderId();
} elseif ($activity->getLead()) {
$whatId = $activity->getLead()->getCrmProviderId();
}
if ($whatId !== null) {
$criteriaParts[] = "(What_Id:equals:$whatId)";
}
if ($whoId === null && $whatId === null) {
$this->logger->info(
'[integration-app] fetchRelatedZohoActivity cannot find prospect',
[
'activity' => $activity->getUuid(),
]
);
return [];
}
$criteriaParts[] = "(Start_DateTime:greater_equal:$start)";
$criteriaParts[] = "(End_DateTime:less_equal:$end)";
$criteria = implode(' AND ', $criteriaParts);
$params = [
'criteria' => $criteria,
'sort_by' => 'Modified_Time',
'sort_order' => 'desc',
];
$this->logger->info(
'[integration-app] fetchRelatedZohoActivity searching for related activity',
[
'activity' => $activity->getUuid(),
'params' => $params,
]
);
$meetings = $this->client->searchMeetings($params);
if (! empty($meetings)) {
return $meetings[0];
}
return [];
}
private function getFromToDates(Activity $activity): array
{
$calendarEvent = $activity->calendarEvent()->first();
$from = $calendarEvent?->getStartTime();
$to = $calendarEvent?->getEndTime();
if (! $from || ! $to) {
$from = $activity->hasScheduledStartTime()
? $activity->getScheduledStartTime()
: $activity->getActualStartTime();
$to = $activity->hasScheduledEndTime()
? $activity->getScheduledEndTime()->addMinutes(15)
: $activity->getActualEndTime();
}
return [$from, $to];
}
}
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
8
1
3
4
Previous Highlighted Error
Next Highlighted Error
SELECT
# DISTINCT
opp.id as opp_id, opp.uuid, opp.name,
# COUNT(dr.id) AS deal_risk_count,
# dr.id,
# cfd.value,
usr.name AS owner_name,
opp.value, opp.currency_code, opp.close_date, opp.remotely_created_at, opp.is_closed, opp.is_won,
usr.uuid as owner_uuid,
usr.photo_path as owner_photo,
usr.id AS owner_id,
jt.name as owner_job,
opp.stage_id, opp.stage_updated_at,
acc.name AS acc_name, opp.stage_updated_at, acc.crm_provider_id AS acc_provider_id, opp.crm_provider_id AS opp_provider_id,
rt.business_process_id AS pipeline_id
FROM opportunities opp
LEFT JOIN record_types rt ON opp.record_type_id = rt.id
LEFT JOIN users usr ON opp.user_id = usr.id
LEFT JOIN accounts acc ON opp.account_id = acc.id
LEFT JOIN job_titles jt ON usr.job_title_id = jt.id
# LEFT JOIN group_deal_risk_types gdrt ON gdrt.group_id = usr.group_id
# LEFT JOIN deal_risks dr ON dr.opportunity_id = opp.id AND dr.group_deal_risk_type_id = gdrt.id
LEFT JOIN crm_field_data cfd ON (cfd.object_id = opp.id and cfd.crm_field_id = 66814)
WHERE opp.user_id IS NOT NULL
AND opp.deleted_at IS NULL
AND opp.is_closed = 1
AND opp.is_won = 0
AND opp.close_date >= '2024-01-01 00:00:00'
AND opp.close_date <= '2024-12-31 23:59:59'
AND usr.team_id = 1
# and opp.id = 4823179
GROUP BY opp.id, cfd.value
ORDER BY
# cfd.value
CAST(cfd.value AS UNSIGNED)
# owner_name
# (SELECT COUNT(dr.id)
# FROM deal_risks dr
# JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id
# WHERE dr.opportunity_id = opp.id
# AND dr.is_active = 1
# AND gdrt.is_enabled = 1)
DESC
LIMIT 25
# OFFSET 0
;
select * from crm_fields where crm_configuration_id = 1 and object_type = 'opportunity';
select * from crm_layout_entities where crm_layout_id = 1493;
SELECT * FROM opportunities WHERE id = 4584045;
SELECT * FROM crm_field_data WHERE object_id = 4584045;
SELECT * FROM opportunities where team_id = 1 and crm_provider_id = '0061K00000lfb9IQAQ'
SELECT
opp.id as opportunity_id,
opp.name,
COUNT(dr.id) as risk_count
FROM opportunities opp
LEFT JOIN deal_risks dr ON dr.opportunity_id = opp.id
WHERE opp.id IN (
6069574,8900938,9507638,9524799,9660490,9662824,9705675,9749758,4158460,4391812,6450439,4448422,5118945,5590675,4584045,7228149,9002408,9165534,9446720,9641778,9665149,9703344,9709280,5747948,4158491,6182565,6263970,5798120,5111315,4536978,6062352,6548383,6072095,6548225,4480986,5011422,6548381,8760540,8917554,9509986,9514392,9569009,9569011,9578490,9713604,5784397,7276612,7288405,8994421,9118219,9608148,9818911,4510535,6479693,5958049,6271674,6550448,4158331,4158483,6126571,6171615,6540943,4897466,5190896,5796182,5932762,8572433,8723698,8892697,9711001,9789264,4549188,6100831,6170064,6260799,6263653,6449936,6530871,6538978,7777651,8059269,8319918,8787049,8901150,9263153,9453207,9514738,9696700,9791062,5752018,6421452,7439134,7878923,9354763,9369285,9514396,9582506,9889949,9890216,4094311,4158495,4158496,6098128,5585661,3872564,6442149,5891604,6164746,6199593,6583474,6519684,9018490,9809006,4496897,5041324,5829430,6198319,6253504,6555763,7242914,7931055,8024125,8797814,8058559,8673347,8892695,8994420,9616219,9714970,9722004,9809439,9818918,6523177,8134147,9002915,9711422,9892713,9901719,9954210,9978435,5800810,6243518,6416114,6222251,6411974,6512456,5791953,6545606,9914780,5805540,6238986,6463838,6547680,9767049,9809437,9810885,9890855,6673493,9902036,4335521,6379871,6503799,6546077,8018765,9907556,9958433,9905855,9916179,9946741,9957877,5563344,6271838,6450815,7641128,7762567,7780592,8684810,8685786,8685787,8685788
)
GROUP BY opp.id;
SELECT COUNT(dr.id)
FROM deal_risks dr
JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id
WHERE dr.opportunity_id = 5563344
# AND gdrt.group_id = usr.group_id
EXPLAIN SELECT
opp.id as opp_id, opp.uuid, opp.name,
cfd.value,
cfv.sequence,
cfv.value,
# MAX(cfd.value) AS max_cfd_value,
usr.name AS owner_name,
opp.value, opp.currency_code, opp.close_date, opp.remotely_created_at, opp.is_closed, opp.is_won,
usr.uuid as owner_uuid,
usr.photo_path as owner_photo,
usr.id AS owner_id,
jt.name as owner_job,
opp.stage_id, opp.stage_updated_at,
acc.name AS acc_name, opp.stage_updated_at, acc.crm_provider_id AS acc_provider_id, opp.crm_provider_id AS opp_provider_id,
rt.business_process_id AS pipeline_id
FROM opportunities opp
LEFT JOIN record_types rt ON opp.record_type_id = rt.id
LEFT JOIN users usr ON opp.user_id = usr.id
LEFT JOIN accounts acc ON opp.account_id = acc.id
LEFT JOIN job_titles jt ON usr.job_title_id = jt.id
LEFT JOIN crm_field_data cfd ON cfd.id = (SELECT sub_cfd.id
FROM crm_field_data sub_cfd
WHERE sub_cfd.object_id = opp.id
AND sub_cfd.crm_field_id = 66810
ORDER BY sub_cfd.updated_at DESC
LIMIT 1)
LEFT JOIN crm_field_values cfv ON cfv.crm_field_id = 66810 AND cfv.value = cfd.value
WHERE opp.user_id IS NOT NULL
AND opp.deleted_at IS NULL
AND opp.is_closed = 0
# AND opp.is_closed = 1
# AND opp.is_won = 0
AND opp.close_date >= '2024-01-01 00:00:00'
AND opp.close_date <= '2024-12-31 23:59:59'
AND usr.team_id = 1
# and opp.id = 4823179
# GROUP BY opp.id
ORDER BY
cfv.sequence DESC,
# opp.name
# owner_name
cfd.value
# CAST(cfd.value AS UNSIGNED)
# CAST(MAX(cfd.value) AS UNSIGNED)
# (SELECT COUNT(dr.id)
# FROM deal_risks dr
# JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id
# WHERE dr.opportunity_id = opp.id
# AND dr.is_active = 1 AND gdrt.is_enabled = 1)
DESC
# LIMIT 75, 25
;
SELECT * FROM crm_field_values WHERE crm_field_id = 66810;
SELECT f.id, f.crm_provider_id AS field_name, f.label, fd.object_id AS dealId, fd.value, fd.updated_at, fd.id, fd.created_at
FROM crm_fields f
INNER JOIN crm_field_data fd ON fd.crm_field_id = f.id
WHERE (f.crm_configuration_id = 1)
AND (f.object_type = 'opportunity')
# AND (fd.object_id IN (4158331,4158483,4158495,4158496,6069574,6263970,6171615,6540943,6545606,5829430,6198319,6263653,6548381,7242914,8797814,7228149,7439134,7878923,8134147,9002915,9118219,9165534,9354763,9369285,9446720))
AND (fd.object_id IN (4158460))
AND (f.crm_provider_id IN ('ForecastCategoryName'))
ORDER BY fd.object_id ASC, fd.updated_at DESC;
select * from crm_layouts where crm_configuration_id = 1;
select cf.* from crm_fields cf
join crm_layout_entities cle on cf.id = cle.crm_field_id
where crm_layout_id = 1493;
SELECT * FROM opportunities WHERE id = 4158460;
SELECT * FROM crm_field_data WHERE object_id = 4158460;
select * from users where team_id = 1;
SELECT * FROM users WHERE id = 7160;
select * from role_user where user_id = 3248;
select * from crm_field_values where crm_field_id = 66824;
SELECT * FROM users WHERE id = 23470;
select * from crm_configurations;
# [PASSWORD_DOTS]
select * from teams where id = 1038; # 23521, 966
select * from users where team_id = 1038;
select * from crm_configurations where id = 966;
SELECT * FROM activities WHERE uuid_to_bin('e8dc7c34-31f6-4430-bd81-2d9d8f00dd07') = uuid; # 54965762
SELECT * FROM activities WHERE uuid_to_bin('4b5727c0-69d1-428f-b8d9-b649055166e2') = uuid; # 54965764
SELECT * FROM participants WHERE activity_id = 54965764;
SELECT id, uuid, title, recording_state FROM activities WHERE uuid_to_bin('355f105d-5606-4379-b0c5-d91daf59f4ce') = uuid; # 54964075
SELECT * FROM participants WHERE activity_id = 54964075;
select f.id, slug, title, tf.team_id from team_features tf JOIN features f on tf.feature_id = f.id
where tf.team_id = 1038;
# [PASSWORD_DOTS] PD [PASSWORD_DOTS]
select * from teams where id = 1029;
SELECT * FROM crm_configurations WHERE id = 957;
SELECT * FROM activities WHERE uuid_to_bin('581a33cb-4343-44bd-ac0c-4a5cee71c5ec') = uuid; # 54963423
SELECT * FROM activities WHERE uuid_to_bin('07238011-25fa-418e-838b-fb21e82b9ea2') = uuid; # 54963433
SELECT * FROM activities WHERE uuid_to_bin('8b6bb2f7-e7a7-4aec-8806-fbfea7093ccd') = uuid; # 54963421
# [PASSWORD_DOTS] Close [PASSWORD_DOTS]
select * from teams where id = 1031;
SELECT * FROM crm_configurations WHERE id = 959;
SELECT * FROM activities WHERE uuid_to_bin('59c517e0-96c9-4dad-bfeb-b7bef72f8725') = uuid; # 54963517
SELECT * FROM activities WHERE uuid_to_bin('07238011-25fa-418e-838b-fb21e82b9ea2') = uuid; # 54963433
SELECT * FROM activities WHERE uuid_to_bin('d68311e3-ac34-49bd-bf04-88323a7e5352') = uuid; # 54966009
# [PASSWORD_DOTS] SF [PASSWORD_DOTS]
SELECT * FROM activities WHERE uuid_to_bin('2bd4cfa3-4eb5-4c77-84a7-9ed46a21c988') = uuid;
select * from roles;
select * from permissions;
select * from permission_role where permission_id = 136;
select * from migrations order by id desc;
select * from teams where id IN (1, 1037);
select * from crm_layouts where crm_configuration_id = 1;
SELECT * FROM crm_layout_entities WHERE crm_layout_id = 1493;
SELECT * FROM crm_fields WHERE id IN (1652,1661,66799,66814,66821,66836,66843,66846,66864,84752,182306,323580,380378);
select * from features;
select * from team_features where feature_id = 33;
select * from opportunities;
select * from teams;
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 = 1052 and sa.provider = 'hubspot';
SELECT * FROM accounts where id = 11512582;
select * from activities where account_id = 11512582;
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide...
|
45543
|
NULL
|
NULL
|
NULL
|
|
45543
|
1627
|
57
|
2026-05-14T14:41:57.653591+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-14/1778 /Users/lukas/.screenpipe/data/data/2026-05-14/1778769717653_m1.jpg...
|
PhpStorm
|
faVsco.js – IntegrationApp/Service.php
|
1
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
#12066 on JY-20725-handle Project: faVsco.js, menu
#12066 on JY-20725-handle-HS-search-rate-limit, menu
Start Listening for PHP Debug Connections
HandleHubspotRateLimitTest
Run 'HandleHubspotRateLimitTest'
Debug 'HandleHubspotRateLimitTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"bounds":{"left":0.054166667,"top":0.027777778,"width":0.08055556,"height":0.035555556},"on_screen":true,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"#12066 on JY-20725-handle-HS-search-rate-limit, menu","depth":5,"bounds":{"left":0.13472222,"top":0.027777778,"width":0.25555557,"height":0.035555556},"on_screen":true,"help_text":"Pull request #12066 exists for current branch JY-20725-handle-HS-search-rate-limit, but local branch is out of sync with remote","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"bounds":{"left":0.6326389,"top":0.027777778,"width":0.023611112,"height":0.035555556},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"HandleHubspotRateLimitTest","depth":6,"bounds":{"left":0.6645833,"top":0.027777778,"width":0.15902779,"height":0.035555556},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run 'HandleHubspotRateLimitTest'","depth":6,"bounds":{"left":0.82361114,"top":0.027777778,"width":0.023611112,"height":0.035555556},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'HandleHubspotRateLimitTest'","depth":6,"bounds":{"left":0.8472222,"top":0.027777778,"width":0.023611112,"height":0.035555556},"on_screen":true,"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.87083334,"top":0.027777778,"width":0.023611112,"height":0.035555556},"on_screen":true,"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.9291667,"top":0.027777778,"width":0.023611112,"height":0.035555556},"on_screen":true,"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.9527778,"top":0.027777778,"width":0.023611112,"height":0.035555556},"on_screen":true,"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.9763889,"top":0.027777778,"width":0.023611112,"height":0.035555556},"on_screen":true,"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},"on_screen":false,"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},"on_screen":false,"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},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
-4027196623176036612
|
-8132283174711358517
|
click
|
hybrid
|
NULL
|
Project: faVsco.js, menu
#12066 on JY-20725-handle Project: faVsco.js, menu
#12066 on JY-20725-handle-HS-search-rate-limit, menu
Start Listening for PHP Debug Connections
HandleHubspotRateLimitTest
Run 'HandleHubspotRateLimitTest'
Debug 'HandleHubspotRateLimitTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
PhpStormFileEditViewNavigateCodeLaravelRefactorRunToolsGitWindowHelp•FV faVsco.jsv* #12066 on JY-20725-handle-HS-search-rate-limit K vablU HandleHubspotRateLimitTest ~100% C* :8• Thu 14 May 17:41:57QProjectvSendReportJob.php• DeleteCrmEntityTrait.phpT WriteCrmTrait.php=custom.logDeleteAccountJob.phpImportActivityTypes.php> MetadataAccessors© Hubspot/DecorateActivity.phpIntegrationAppServiceTrait.phpIntegrationApp/Service.php xT AccountAccessor.php• BaseAccessor.php© IntegrationApp/DecorateActivity.php© Activity.php© Salesforce/Service.phpD LogActivityTrait.php• ContactAccessor.php© Pipedrive/Service.phpClose/Service.phpCopper/Service.php© BullhornService.phpDealAccessor.phpT ActivityPlaybookTrait.phpCrmHelperRepository.php© AccountController.php=.env.staging=.env18.••© IntegrationAppAccessExce• LeadAccessor.phpDetachActivityObject.phpRematchActivityOnCrmObjectDetach.phpMatchActivityCrmData.phpT MeetingAccessor.php• RegisterEventsAccessor.pt55• RemoteWriteAccessor.php413• SystemStateAccessor.php© HubspotPaginationService.php© HandleHubspotRateLimit.phpclass Service extendsBaseService implementspublic function saveMeeting(Activity $activity): arraypaycodu→ ppaycodu,T UserAccessor.php4371):• Арi438Config439return Sthis->client->updateMeeting($crmId, Spayload);O DTO440> O Filters441v D Jobs442$payload['Description'] = $decorateActivity->generateDescription(Sactivity);© CrmEntitiesFullSyncJob.ph 443© DeleteRemoteTeamJob.ph 444T IntegrationAppService Trait 445© SubscribeForEventsJob.ph446$this->logger->info('[integration-app] CRM log meeting', ['activity' => $activity->getUvid(),'payload' => $payload,© TeamInitialSyncJob.php4471):© UnsubscribeForEventsJob.448© UpdateProfileRelatedEntiti 449return $this->client->createMeeting($payload);© ValidateTeamActiveConne450> ProspectSearchStrategy451> D ServiceTraits2 usages© DataClient.php© DecorateActivity.php452491public function saveCall(Activity $activity): array{...}© LocalSearch.php1 usage• LocalSearchlnterface.phpC RemoteSearch.php492500private function getCallType(Activity $activity): string{...}© Service.php3 usagesv • ListenersC ConvertLeadActivities.php501535private function attachToProspect(Activity $activity): array{...}© Purnel onkunCache nhnWorkspace associated with branch 'JY-20725-handle-HS-search-rate-limit' has been restored // Rollback // Configure... (today 16:17)( RemoteWriteAccessor.php=laravel.logPlaybook.phpSF [jiminny@localhost]PlainTextDecorateActivity.phpA HS_local [jiminny@localho:4 console [QAI PROD] XClient.php4 console [PROD]A console (EU]B16 × 2DGo jiminny084143 ×4 л215•m_layout_id =2162,1661,66799,66217218219id = 33;_220_221222—223224id THEN '(own=225_226227228229230hubspot':-231232233 V= 11512582;T234W Windsurf Teams449:37UTF-8Ca 4 spaces...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
45542
|
1628
|
41
|
2026-05-14T14:41:57.619741+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-14/1778 /Users/lukas/.screenpipe/data/data/2026-05-14/1778769717619_m2.jpg...
|
PhpStorm
|
faVsco.js – IntegrationApp/Service.php
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
#12066 on JY-20725-handle Project: faVsco.js, menu
#12066 on JY-20725-handle-HS-search-rate-limit, menu
Start Listening for PHP Debug Connections
HandleHubspotRateLimitTest
Run 'HandleHubspotRateLimitTest'
Debug 'HandleHubspotRateLimitTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
16
2
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Services\Crm\IntegrationApp;
use Carbon\Carbon;
use Jiminny\Contracts\Crm\Providers;
use Jiminny\Contracts\Services\Crm\ClientInterface;
use Jiminny\Contracts\Services\Crm\FetchRelatedActivityInterface;
use Jiminny\Contracts\Services\Crm\ImportsBusinessProcessesInterface;
use Jiminny\Contracts\Services\Crm\LayoutManagementInterface;
use Jiminny\Contracts\Services\Crm\MatchCrmEntitiesInterface;
use Jiminny\Contracts\Services\Crm\Provider\IntegrationAppInterface;
use Jiminny\Contracts\Services\Crm\RemoteEntityLookupInterface;
use Jiminny\Contracts\Services\Crm\RemoteEntityManipulationInterface;
use Jiminny\Contracts\Services\Crm\RemoteNoteEntityManipulationInterface;
use Jiminny\Contracts\Services\Crm\SendSummaryToCrmInterface;
use Jiminny\Contracts\Services\Crm\SettingsInterface;
use Jiminny\Contracts\Services\Crm\SyncCrmEntitiesInterface;
use Jiminny\Contracts\Services\Crm\SyncCrmMetadataInterface;
use Jiminny\Events\Activities\Crm\ActivityLeadConverted;
use Jiminny\Exceptions\CrmException;
use Jiminny\Exceptions\SocialAccountNotFoundException;
use Jiminny\Jobs\Crm\NoteObject;
use Jiminny\Models\Account;
use Jiminny\Models\Activity;
use Jiminny\Models\Contracts\ActivityContract;
use Jiminny\Models\Crm\Configuration;
use Jiminny\Models\Opportunity;
use Jiminny\Models\Stage;
use Jiminny\Models\User;
use Jiminny\Services\Crm\BaseService;
use Jiminny\Services\Crm\IntegrationApp\Config\IntegrationAppProviders;
use Jiminny\Services\Crm\IntegrationApp\Config\IntegrationConfigFactory;
use Jiminny\Services\Crm\IntegrationApp\DTO\Mappers\FieldMapperInterface;
use Jiminny\Services\Crm\IntegrationApp\DTO\Mappers\LeadFieldMapper;
use Jiminny\Services\Crm\IntegrationApp\DTO\Utils\GenerateProviderUrlInterface;
use Jiminny\Services\Crm\IntegrationApp\DTO\Utils\IntegrationAppCrmGeneratorFactory;
use Jiminny\Services\Crm\IntegrationApp\DTO\Utils\UrlGeneratorInterface;
use Jiminny\Services\Crm\IntegrationApp\ServiceTraits\SyncCrmFieldsTrait;
use Jiminny\Services\Crm\IntegrationApp\ServiceTraits\SystemStateTrait;
use Jiminny\Services\Crm\IntegrationApp\ServiceTraits\LayoutTrait;
use Jiminny\Services\Crm\IntegrationApp\ServiceTraits\MatchProspectsTrait;
use Jiminny\Services\Crm\IntegrationApp\ServiceTraits\NotSupportedTrait;
use Jiminny\Services\Crm\IntegrationApp\ServiceTraits\SyncCrmEntitiesTrait;
use Jiminny\Services\Crm\IntegrationApp\ServiceTraits\SyncCrmMetadataTrait;
use Psr\Log\LoggerInterface;
use Jiminny\Services\Crm\IntegrationApp\DTO\Mappers\OpportunityFieldMapper;
use Jiminny\Repositories\Crm\ProfileRepository;
use Jiminny\Repositories\Crm\OpportunityRepository;
use Jiminny\Models\Crm\Profile;
use Jiminny\Services\Crm\CrmObjects\CrmObjectsRepository;
class Service extends BaseService implements
IntegrationAppInterface,
SyncCrmEntitiesInterface,
SyncCrmMetadataInterface,
ImportsBusinessProcessesInterface,
RemoteEntityManipulationInterface,
LayoutManagementInterface,
SettingsInterface,
MatchCrmEntitiesInterface,
RemoteEntityLookupInterface,
RemoteNoteEntityManipulationInterface,
SendSummaryToCrmInterface,
UrlGeneratorInterface,
FetchRelatedActivityInterface
{
use SyncCrmMetadataTrait;
use SyncCrmEntitiesTrait;
use SystemStateTrait;
use LayoutTrait;
use NotSupportedTrait;
use MatchProspectsTrait;
use SyncCrmFieldsTrait;
public const string CALL_TYPE_MISSED = 'Missed';
public const string CALL_TYPE_INBOUND = 'Inbound';
public const string CALL_TYPE_OUTBOUND = 'Outbound';
public const string RELATIONSHIP_OPPORTUNITY = 'Deals';
public const string RELATIONSHIP_LEAD = 'Leads';
public const string RELATIONSHIP_ACCOUNT = 'Accounts';
/**
* @var ClientInterface&DataClient
*/
protected $client;
protected ?User $invokedUser = null;
protected ?GenerateProviderUrlInterface $crmUrlGenerator = null;
public function __construct(
DataClient $client,
LoggerInterface $logger,
) {
parent::__construct();
$this->client = $client;
$this->logger = $logger;
}
public function getDisplayName(): string
{
return Providers::getProviderDisplayName(
Providers::getCrmIntegrationSlug($this->config)
);
}
/**
* @throws \Exception
*/
public function setUser(User $user): void
{
$this->configureSentryScope($user);
$this->invokedUser = $user;
$this->team = $user->getTeam();
$teamOwner = $this->team->getOwner();
$this->setConfiguration($user->getTeam()->getCrmConfiguration());
$this->setEditionConfiguration(Providers::getCrmIntegrationSlug($this->config));
$this->setCrmUrlGenerator($this->config);
$this->client->setTeam($this->team);
$socialAccount = $teamOwner?->getSocialAccount('integration-app');
if ($socialAccount === null) {
$this->logger->info('[integration-app] Social account not found', [
'teamId' => $this->team->getId(),
'teamOwnerId' => $teamOwner?->getId(),
'userId' => $user->getId(),
]);
throw new SocialAccountNotFoundException('Social account not found!');
}
$this->client->setSocialAccount($socialAccount);
// The CRM Service is properly bootstrapped, and supports remote operations
$this->connect();
}
public function normalizeValue(string $fieldType, string $fieldValue, bool $internal = false): string
{
return $fieldValue;
}
public function find(string $name, array $scopes): array
{
/** @var LocalSearch $localSearch */
$localSearch = app(LocalSearch::class);
$localSearch->setConfiguration($this->config);
$localSearch->setCountryCode($this->invokedUser->getCountryCode());
return $localSearch->search($name);
// if (! empty($localMatch)) {
// return $localMatch;
// }
//
// /** @var RemoteSearch $remoteSearch */
// $remoteSearch = app(RemoteSearch::class);
// $remoteSearch->setClient($this->client);
// $remoteSearch->setConfiguration($this->config);
//
// return $remoteSearch->search($name);
}
public function findOpportunities(?string $crmAccountId, ?string $crmContactId, ?int $userId = null): array
{
$data = [];
$ownerData = [];
$account = $this->getAccount($crmAccountId, $crmContactId);
if ($account === null) {
return [];
}
$ownerId = $this->getOwnerId($userId);
try {
$opportunityRepository = app(OpportunityRepository::class);
$opportunities = $opportunityRepository->findAllByConfigurationAndAccountId(
$this->config,
$account->getId()
);
foreach ($opportunities as $opportunity) {
/** @var Opportunity $opportunity */
$record = $this->buildOpportunityData($opportunity);
if ($ownerId && $opportunity->getOwnerId() === $ownerId) {
$ownerData[] = $record;
}
$data[] = $record;
}
if (! empty($ownerData)) {
return $ownerData;
}
return $data;
} catch (\Exception $e) {
$this->logger->info('[integration-app] Failed to fetch opportunities', [
'contact' => $crmContactId,
'account' => $crmAccountId,
'owner' => $ownerId,
'error' => $e->getMessage(),
]);
return $data;
}
}
private function getOwnerId(?int $userId = null): ?string
{
if (! $userId) {
return null;
}
$profileRepository = app(ProfileRepository::class);
$profile = $profileRepository->findProfileByUserId($this->config, $userId);
return $profile instanceof Profile ? $profile->getCrmProviderId() : null;
}
private function getAccount(?string $crmAccountId = null, ?string $crmContactId = null): ?Account
{
$crmRepository = app(CrmObjectsRepository::class);
if ($crmAccountId === null) {
$contact = $crmRepository->findContactByCrmProviderId($this->config, $crmContactId);
return $contact->getAccount();
}
return $crmRepository->findAccountByCrmProviderId($this->config, $crmAccountId);
}
private function buildOpportunityData(Opportunity $opportunity): array
{
$record = [
'crmId' => $opportunity->getCrmProviderId(),
'name' => $opportunity->getName(),
'won' => $opportunity->isWon(),
'closed' => $opportunity->isClosed(),
];
if (! empty($opportunity->getFormattedValueAttribute())) {
$record['value'] = $opportunity->getFormattedValueAttribute();
}
if (! empty($opportunity->getStage())) {
$record['stage'] = [
'id' => $opportunity->getStage()->getUuid(),
'name' => $opportunity->getStage()->getName(),
];
}
return $record;
}
public function updateRecord(string $objectType, string $objectId, array $data, array $headers = []): void
{
$data = [
'data' => $this->normalizeData($objectType, $data),
];
$this->client->updateRecordById($objectType, $objectId, $data);
}
private function normalizeData(string $objectType, array $data): array
{
$fieldMapper = $this->getFieldMapper($objectType);
if (! $fieldMapper instanceof FieldMapperInterface) {
return $data;
}
return $fieldMapper->mapToCrmFields($data);
}
private function getFieldMapper(string $objectType): ?FieldMapperInterface
{
if ($objectType === self::OBJECT_OPPORTUNITY) {
return app(OpportunityFieldMapper::class);
}
if ($objectType === self::OBJECT_LEAD) {
return app(LeadFieldMapper::class);
}
return null;
}
public function getRecord(string $objectType, string $objectId, array $fields = []): array
{
return $this->client->getRecordById($objectType, $objectId);
}
public function getConfiguration(): Configuration
{
return $this->config;
}
public function setConfiguration(Configuration $config): void
{
$this->clearExternalMapCache();
$this->config = $config;
}
private function setEditionConfiguration(string $provider): void
{
$this->editionConfig = app(IntegrationConfigFactory::class)->create($provider);
}
public function setCrmUrlGenerator(Configuration $config): void
{
$this->crmUrlGenerator = app(IntegrationAppCrmGeneratorFactory::class)->create($config);
}
public function getCrmUrlGenerator(): ?GenerateProviderUrlInterface
{
if ($this->crmUrlGenerator === null) {
$this->setCrmUrlGenerator($this->config);
}
return $this->crmUrlGenerator;
}
public function subscribeEntityEvents(bool $enableTrigger = true): void
{
$eventStates = $this->client->updateEntityEventsState($enableTrigger);
$this->logger->info('[integration-app] Change team entity events subscription', [
'teamId' => $this->team->getId(),
'teamName' => $this->team->getName(),
'states' => $eventStates,
'action' => $enableTrigger ? 'subscribe' : 'unsubscribe',
]);
}
#[\Override] public function supportsNotes(): bool
{
return $this->editionConfig->supportsNotes();
}
#[\Override] public function saveNote(
string $title,
string $body,
string $objectId,
?NoteObject $noteObject = null,
): ?string {
if ($noteObject === null) {
return null;
}
$notePayload = [
'title' => $title,
'content' => $body,
'objectId' => $objectId,
'objectType' => $noteObject->value,
];
$result = $this->client->createNote($notePayload);
// debug saving note response
$this->logger->info('[integration-app] createNote response', [
'objectId' => $objectId,
'objectType' => $noteObject->value,
'result' => $result,
'hasId' => isset($result['id']),
]);
return $result['id'] ?? null;
}
/**
* @throws CrmException
*/
#[\Override] public function saveActivity(Activity $activity): Activity
{
$this->logger->info('[integration-app] saveActivity', [
'activity' => $activity->getUuid(),
'type' => $activity->getType(),
]);
if ($activity->getCrmType() === Activity::TYPE_CONFERENCE) {
$crmActivity = $this->saveMeeting($activity);
} elseif (in_array($activity->getType(), [Activity::TYPE_SOFTPHONE, Activity::TYPE_SOFTPHONE_INBOUND])) {
$crmActivity = $this->saveCall($activity);
} else {
throw new CrmException('Unsupported activity type');
}
$crmActivityId = $crmActivity['id'] ?? null;
if ($crmActivityId !== null) {
$activity->crm_provider_id = $crmActivityId;
$activity->save();
$this->logger->info('[integration-app] Activity successfully logged to CRM', [
'activity' => $activity->getUuid(),
'type' => $activity->getType(),
'crmId' => $crmActivityId,
]);
}
return $activity;
}
public function saveMeeting(Activity $activity): array
{
$decorateActivity = app(DecorateActivity::class);
$meetingPayload = [
'Event_Title' => $decorateActivity->generateTitle($activity),
'Start_DateTime' => $activity->getActualStartTime()->toIso8601String(),
'End_DateTime' => $activity->getActualEndTime()->toIso8601String(),
'ownerId' => $this->getActivityOwnerId($activity),
];
$payload = array_merge($meetingPayload, $this->attachToProspect($activity));
if ($activity->hasCrmProviderId()) {
$crmId = $activity->getCrmProviderId();
$meeting = $this->client->getMeeting($crmId);
$oldDescription = $meeting['fields']['Description'] ?? null;
$payload['Description'] = $decorateActivity->generateUpdatedDescription($oldDescription, $activity);
$this->logger->info('[integration-app] CRM update meeting', [
'activity' => $activity->getUuid(),
'crm_id' => $crmId,
'payload' => $payload,
]);
return $this->client->updateMeeting($crmId, $payload);
}
$payload['Description'] = $decorateActivity->generateDescription($activity);
$this->logger->info('[integration-app] CRM log meeting', [
'activity' => $activity->getUuid(),
'payload' => $payload,
]);
return $this->client->createMeeting($payload);
}
public function saveCall(Activity $activity): array
{
$decorateActivity = app(DecorateActivity::class);
$callPayload = [
'Call_Type' => $this->getCallType($activity),
'Call_Start_Time' => $activity->getActualStartTime()->toIso8601String(),
'Call_Duration' => $activity->getDuration(),
'name' => $decorateActivity->generateTitle($activity),
'ownerId' => $this->getActivityOwnerId($activity),
];
$payload = array_merge($callPayload, $this->attachToProspect($activity));
if ($activity->hasCrmProviderId()) {
$crmId = $activity->getCrmProviderId();
$call = $this->client->getCall($crmId);
$oldDescription = $call['fields']['Description'] ?? null;
$payload['description'] = $decorateActivity->generateUpdatedDescription($oldDescription, $activity);
$this->logger->info('[integration-app] CRM update call', [
'activity' => $activity->getUuid(),
'crm_id' => $crmId,
'payload' => $payload,
]);
return $this->client->updateCall($crmId, $payload);
}
$payload['description'] = $decorateActivity->generateDescription($activity);
$this->logger->info('[integration-app] CRM log call', [
'activity' => $activity->getUuid(),
'payload' => $payload,
]);
return $this->client->createCall($payload);
}
private function getCallType(Activity $activity): string
{
if ($activity->getStatus() === Activity::STATUS_NO_ANSWER) {
return self::CALL_TYPE_MISSED;
}
return $activity->getType() === Activity::TYPE_SOFTPHONE_INBOUND ? self::CALL_TYPE_INBOUND : self::CALL_TYPE_OUTBOUND;
}
private function attachToProspect(Activity $activity): array
{
$payload = [];
if ($activity->hasContact()) {
$payload['contactId'] = $activity->getContact()->getCrmProviderId();
}
if ($activity->hasOpportunity()) {
return array_merge(
$payload,
$this->buildBasicPayload(
self::RELATIONSHIP_OPPORTUNITY,
$activity->getOpportunity()->getCrmProviderId()
)
);
}
if ($activity->hasAccount() && ! $activity->getAccount()->getIsInternal()) {
return array_merge(
$payload,
$this->buildBasicPayload(
self::RELATIONSHIP_ACCOUNT,
$activity->getAccount()->getCrmProviderId()
)
);
}
if ($activity->hasLead()) {
$payload = $this->handleLeadPayload($activity);
}
return $payload;
}
private function handleLeadPayload(Activity $activity): array
{
$freshLead = $this->syncLead($activity->getLead()->getCrmProviderId());
$lead = $freshLead ?? $activity->getLead();
if ($lead->getConvertedAt() === null) {
return $this->buildBasicPayload(self::RELATIONSHIP_LEAD, $lead->getCrmProviderId());
}
$activity->lead_id = null;
if ($lead->hasAccount()) {
$account = $lead->getAccount();
$activity->account_id = $account->getId();
$payload = $this->buildBasicPayload(self::RELATIONSHIP_ACCOUNT, $account->getCrmProviderId());
} else {
$payload = [];
}
if ($lead->hasOpportunity()) {
$opportunity = $lead->getOpportunity();
$payload = $this->buildBasicPayload(self::RELATIONSHIP_OPPORTUNITY, $opportunity->getCrmProviderId());
$activity->opportunity_id = $opportunity->getId();
$activity->value = $opportunity->value;
$activity->stage_id = $opportunity->stage_id;
} else {
$activity->stage_id = null;
}
if ($lead->hasContact()) {
$contact = $lead->getContact();
$payload['contactId'] = $contact->getCrmProviderId();
$activity->contact_id = $contact->getId();
}
$activity->save();
event(new ActivityLeadConverted($activity, $lead));
$this->logger->info('[integration-app] Lead converted', [
'activityUuid' => $activity->getUuid(),
'leadUuid' => $lead->getUuid(),
]);
return $payload;
}
private function buildBasicPayload(string $type, string $id): array
{
return [
'type' => $type,
'id' => $id,
];
}
private function getActivityOwnerId(Activity $activity): ?string
{
$ownerId = null;
if ($activity->hasUser() && $activity->getUser()->getProfile() !== null) {
$ownerId = $activity->getUser()->getProfile()->getCrmProviderId();
}
return $ownerId;
}
#[\Override] public function saveFollowupActivity(Activity $activity, array $fields): ?string
{
$taskPayload = [
'subject' => $fields['subject'],
'dueTime' => isset($fields['dueDate']) ? Carbon::parse($fields['dueDate'])->format('Y-m-d') : null,
'ownerId' => $this->getActivityOwnerId($activity),
];
if (isset($fields['status'])) {
$taskPayload['status'] = $fields['status'];
}
if (isset($fields['priority'])) {
$taskPayload['priority'] = $fields['priority'];
}
if (isset($fields['content'])) {
$taskPayload['content'] = $fields['content'];
}
$payload = array_merge($taskPayload, $this->attachToProspect($activity));
$this->logger->info('[integration-app] CRM log follow up task', [
'activity' => $activity->getUuid(),
'payload' => $payload,
]);
$task = $this->client->createTask($payload);
return $task['id'] ?? null;
}
#[\Override] public function saveTranscriptionSummaryAsNote(
ActivityContract $activity,
string $title,
string $body,
?string $objectId,
?NoteObject $noteObject = null,
): ?string {
// We have to find a way to store the transcription summary
// This might be possible either by Tasks, Events, Engagements & Notes
// Find what the CRM supports and save the note with the appropriate object(eg Notes)
// For now use only Notes as both ZOHO & Salesforce support them.
if ($this->supportsNotes() && $objectId !== null) {
$this->logger->info('[integration-app] saving note', [
'activityId' => $activity->getUuid(),
'objectId' => $objectId,
]);
return $this->saveNote($title, $body, $objectId, $noteObject);
}
$this->logger->info('[integration-app] skip saveTranscriptionSummaryAsNote', [
'activityId' => $activity->getUuid(),
'supportsNotes' => $this->supportsNotes(),
'objectId' => $objectId,
]);
return null;
}
public function generateProviderUrl(string $providerId, string $objectType): ?string
{
return $this->getCrmUrlGenerator()?->generateProviderUrl($providerId, $objectType);
}
public function updateStage($crmObject, Stage $stage): void
{
$objectType = $stage->getType();
$objectId = $crmObject->getCrmProviderId();
$params = ['stageName' => $stage->getCrmProviderId()];
$this->logger->info('[integration-app] updateStage', [
'objectType' => $objectType,
'objectId' => $objectId,
'params' => $params,
]);
$data = [
'data' => $this->normalizeData($objectType, $params),
];
if ($objectType === Stage::TYPE_LEAD) {
$this->client->updateLead($objectId, $data);
} else {
$this->client->updateDeal($objectId, $data);
}
}
/**
* @throws \Exception
*/
public function fetchAndAssociateRelatedActivity(Activity $activity): ?Activity
{
if ($activity->getCrm()?->getEdition() !== IntegrationAppProviders::ZOHO_CRM) {
return null;
}
if (! $activity->isTypeConference()) {
return null;
}
// The related activity is already linked.
if ($activity->hasCrmProviderId()) {
return $activity;
}
if ($activity->hasActualStartTime() === false) {
return null;
}
return $this->fetchAndAssociateZohoRelatedActivity($activity);
}
public function fetchAndAssociateZohoRelatedActivity(Activity $activity): ?Activity
{
try {
$meeting = $this->fetchRelatedZohoActivity($activity);
if (empty($meeting)) {
$this->logger->info('[integration-app] fetchRelatedZohoActivity No related activity found', [
'activity' => $activity->getUuid(),
]);
return null;
}
$decorateActivity = app(DecorateActivity::class);
$oldDescription = $meeting['Description'] ?? '';
$updatedDescription = $decorateActivity->generateUpdatedDescription($oldDescription, $activity);
$this->logger->info('[integration-app] fetchAndAssociateZohoRelatedActivity updating related activity', [
'activity' => $activity->getUuid(),
'description' => $updatedDescription,
]);
$this->client->updateMeeting($meeting['id'], ['Description' => $updatedDescription]);
// Update our activity to reflect the remote data.
$activity->update([
'crm_provider_id' => $meeting['id'],
'summary' => $meeting['Description'],
]);
return $activity;
} catch (\Exception $exception) {
\Sentry::captureException($exception);
throw $exception;
}
}
public function fetchRelatedZohoActivity(Activity $activity): array
{
[$from, $to] = $this->getFromToDates($activity);
$start = $from?->toIso8601String(); // e.g., 2025-07-01T00:00:00+00:00
$end = $to?->toIso8601String(); // e.g., 2025-07-14T23:59:59+00:00
if ($start === null || $end === null) {
$this->logger->info(
'[integration-app] fetchRelatedZohoActivity missing start or end date',
[
'activity' => $activity->getUuid(),
'start' => $start,
'end' => $end,
'from' => $from,
'to' => $to,
]
);
return [];
}
$whoId = null;
$whatId = null;
$criteriaParts = [];
if ($activity->getContact()) {
$whoId = $activity->getContact()->getCrmProviderId();
$criteriaParts[] = "(Who_Id:equals:$whoId)";
}
if ($activity->getOpportunity()) {
$whatId = $activity->getOpportunity()->getCrmProviderId();
} elseif ($activity->getAccount() && $activity->getAccount()->getIsInternal() === false) {
$whatId = $activity->getAccount()->getCrmProviderId();
} elseif ($activity->getLead()) {
$whatId = $activity->getLead()->getCrmProviderId();
}
if ($whatId !== null) {
$criteriaParts[] = "(What_Id:equals:$whatId)";
}
if ($whoId === null && $whatId === null) {
$this->logger->info(
'[integration-app] fetchRelatedZohoActivity cannot find prospect',
[
'activity' => $activity->getUuid(),
]
);
return [];
}
$criteriaParts[] = "(Start_DateTime:greater_equal:$start)";
$criteriaParts[] = "(End_DateTime:less_equal:$end)";
$criteria = implode(' AND ', $criteriaParts);
$params = [
'criteria' => $criteria,
'sort_by' => 'Modified_Time',
'sort_order' => 'desc',
];
$this->logger->info(
'[integration-app] fetchRelatedZohoActivity searching for related activity',
[
'activity' => $activity->getUuid(),
'params' => $params,
]
);
$meetings = $this->client->searchMeetings($params);
if (! empty($meetings)) {
return $meetings[0];
}
return [];
}
private function getFromToDates(Activity $activity): array
{
$calendarEvent = $activity->calendarEvent()->first();
$from = $calendarEvent?->getStartTime();
$to = $calendarEvent?->getEndTime();
if (! $from || ! $to) {
$from = $activity->hasScheduledStartTime()
? $activity->getScheduledStartTime()
: $activity->getActualStartTime();
$to = $activity->hasScheduledEndTime()
? $activity->getScheduledEndTime()->addMinutes(15)
: $activity->getActualEndTime();
}
return [$from, $to];
}
}
Execute
Explain Plan
Browse Query History
View Parameters...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"bounds":{"left":0.2962101,"top":1.0,"width":0.03856383,"height":-0.019952059},"on_screen":true,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"#12066 on JY-20725-handle-HS-search-rate-limit, menu","depth":5,"bounds":{"left":0.33477393,"top":1.0,"width":0.122340426,"height":-0.019952059},"on_screen":true,"help_text":"Pull request #12066 exists for current branch JY-20725-handle-HS-search-rate-limit, but local branch is out of sync with remote","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"bounds":{"left":0.5731383,"top":1.0,"width":0.011303191,"height":-0.019952059},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"HandleHubspotRateLimitTest","depth":6,"bounds":{"left":0.5884308,"top":1.0,"width":0.076130316,"height":-0.019952059},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run 'HandleHubspotRateLimitTest'","depth":6,"bounds":{"left":0.66456115,"top":1.0,"width":0.011303191,"height":-0.019952059},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'HandleHubspotRateLimitTest'","depth":6,"bounds":{"left":0.67586434,"top":1.0,"width":0.011303191,"height":-0.019952059},"on_screen":true,"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.6871675,"top":1.0,"width":0.011303191,"height":-0.019952059},"on_screen":true,"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.7150931,"top":1.0,"width":0.011303191,"height":-0.019952059},"on_screen":true,"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.72639626,"top":1.0,"width":0.011303191,"height":-0.019952059},"on_screen":true,"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.73769945,"top":1.0,"width":0.011303191,"height":-0.019952059},"on_screen":true,"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},"on_screen":false,"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},"on_screen":false,"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},"on_screen":false,"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},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"16","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"2","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"on_screen":true,"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\\IntegrationApp;\n\nuse Carbon\\Carbon;\nuse Jiminny\\Contracts\\Crm\\Providers;\nuse Jiminny\\Contracts\\Services\\Crm\\ClientInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\FetchRelatedActivityInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\ImportsBusinessProcessesInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\LayoutManagementInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\MatchCrmEntitiesInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\Provider\\IntegrationAppInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\RemoteEntityLookupInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\RemoteEntityManipulationInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\RemoteNoteEntityManipulationInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\SendSummaryToCrmInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\SettingsInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\SyncCrmEntitiesInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\SyncCrmMetadataInterface;\nuse Jiminny\\Events\\Activities\\Crm\\ActivityLeadConverted;\nuse Jiminny\\Exceptions\\CrmException;\nuse Jiminny\\Exceptions\\SocialAccountNotFoundException;\nuse Jiminny\\Jobs\\Crm\\NoteObject;\nuse Jiminny\\Models\\Account;\nuse Jiminny\\Models\\Activity;\nuse Jiminny\\Models\\Contracts\\ActivityContract;\nuse Jiminny\\Models\\Crm\\Configuration;\nuse Jiminny\\Models\\Opportunity;\nuse Jiminny\\Models\\Stage;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Services\\Crm\\BaseService;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\Config\\IntegrationAppProviders;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\Config\\IntegrationConfigFactory;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\DTO\\Mappers\\FieldMapperInterface;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\DTO\\Mappers\\LeadFieldMapper;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\DTO\\Utils\\GenerateProviderUrlInterface;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\DTO\\Utils\\IntegrationAppCrmGeneratorFactory;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\DTO\\Utils\\UrlGeneratorInterface;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\ServiceTraits\\SyncCrmFieldsTrait;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\ServiceTraits\\SystemStateTrait;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\ServiceTraits\\LayoutTrait;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\ServiceTraits\\MatchProspectsTrait;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\ServiceTraits\\NotSupportedTrait;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\ServiceTraits\\SyncCrmEntitiesTrait;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\ServiceTraits\\SyncCrmMetadataTrait;\nuse Psr\\Log\\LoggerInterface;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\DTO\\Mappers\\OpportunityFieldMapper;\nuse Jiminny\\Repositories\\Crm\\ProfileRepository;\nuse Jiminny\\Repositories\\Crm\\OpportunityRepository;\nuse Jiminny\\Models\\Crm\\Profile;\nuse Jiminny\\Services\\Crm\\CrmObjects\\CrmObjectsRepository;\n\nclass Service extends BaseService implements\n IntegrationAppInterface,\n SyncCrmEntitiesInterface,\n SyncCrmMetadataInterface,\n ImportsBusinessProcessesInterface,\n RemoteEntityManipulationInterface,\n LayoutManagementInterface,\n SettingsInterface,\n MatchCrmEntitiesInterface,\n RemoteEntityLookupInterface,\n RemoteNoteEntityManipulationInterface,\n SendSummaryToCrmInterface,\n UrlGeneratorInterface,\n FetchRelatedActivityInterface\n{\n use SyncCrmMetadataTrait;\n use SyncCrmEntitiesTrait;\n use SystemStateTrait;\n use LayoutTrait;\n use NotSupportedTrait;\n use MatchProspectsTrait;\n use SyncCrmFieldsTrait;\n\n public const string CALL_TYPE_MISSED = 'Missed';\n public const string CALL_TYPE_INBOUND = 'Inbound';\n public const string CALL_TYPE_OUTBOUND = 'Outbound';\n public const string RELATIONSHIP_OPPORTUNITY = 'Deals';\n public const string RELATIONSHIP_LEAD = 'Leads';\n public const string RELATIONSHIP_ACCOUNT = 'Accounts';\n\n /**\n * @var ClientInterface&DataClient\n */\n protected $client;\n\n protected ?User $invokedUser = null;\n\n protected ?GenerateProviderUrlInterface $crmUrlGenerator = null;\n\n public function __construct(\n DataClient $client,\n LoggerInterface $logger,\n ) {\n parent::__construct();\n $this->client = $client;\n $this->logger = $logger;\n }\n\n public function getDisplayName(): string\n {\n return Providers::getProviderDisplayName(\n Providers::getCrmIntegrationSlug($this->config)\n );\n }\n\n /**\n * @throws \\Exception\n */\n public function setUser(User $user): void\n {\n $this->configureSentryScope($user);\n $this->invokedUser = $user;\n\n $this->team = $user->getTeam();\n $teamOwner = $this->team->getOwner();\n\n $this->setConfiguration($user->getTeam()->getCrmConfiguration());\n $this->setEditionConfiguration(Providers::getCrmIntegrationSlug($this->config));\n $this->setCrmUrlGenerator($this->config);\n\n $this->client->setTeam($this->team);\n $socialAccount = $teamOwner?->getSocialAccount('integration-app');\n if ($socialAccount === null) {\n $this->logger->info('[integration-app] Social account not found', [\n 'teamId' => $this->team->getId(),\n 'teamOwnerId' => $teamOwner?->getId(),\n 'userId' => $user->getId(),\n ]);\n\n throw new SocialAccountNotFoundException('Social account not found!');\n }\n $this->client->setSocialAccount($socialAccount);\n\n // The CRM Service is properly bootstrapped, and supports remote operations\n $this->connect();\n }\n\n public function normalizeValue(string $fieldType, string $fieldValue, bool $internal = false): string\n {\n return $fieldValue;\n }\n\n public function find(string $name, array $scopes): array\n {\n /** @var LocalSearch $localSearch */\n $localSearch = app(LocalSearch::class);\n $localSearch->setConfiguration($this->config);\n $localSearch->setCountryCode($this->invokedUser->getCountryCode());\n\n return $localSearch->search($name);\n\n // if (! empty($localMatch)) {\n // return $localMatch;\n // }\n //\n // /** @var RemoteSearch $remoteSearch */\n // $remoteSearch = app(RemoteSearch::class);\n // $remoteSearch->setClient($this->client);\n // $remoteSearch->setConfiguration($this->config);\n //\n // return $remoteSearch->search($name);\n }\n\n public function findOpportunities(?string $crmAccountId, ?string $crmContactId, ?int $userId = null): array\n {\n $data = [];\n $ownerData = [];\n\n $account = $this->getAccount($crmAccountId, $crmContactId);\n if ($account === null) {\n return [];\n }\n\n $ownerId = $this->getOwnerId($userId);\n\n try {\n $opportunityRepository = app(OpportunityRepository::class);\n $opportunities = $opportunityRepository->findAllByConfigurationAndAccountId(\n $this->config,\n $account->getId()\n );\n\n foreach ($opportunities as $opportunity) {\n /** @var Opportunity $opportunity */\n $record = $this->buildOpportunityData($opportunity);\n\n if ($ownerId && $opportunity->getOwnerId() === $ownerId) {\n $ownerData[] = $record;\n }\n\n $data[] = $record;\n }\n\n if (! empty($ownerData)) {\n return $ownerData;\n }\n\n return $data;\n } catch (\\Exception $e) {\n $this->logger->info('[integration-app] Failed to fetch opportunities', [\n 'contact' => $crmContactId,\n 'account' => $crmAccountId,\n 'owner' => $ownerId,\n 'error' => $e->getMessage(),\n ]);\n\n return $data;\n }\n }\n\n private function getOwnerId(?int $userId = null): ?string\n {\n if (! $userId) {\n return null;\n }\n\n $profileRepository = app(ProfileRepository::class);\n $profile = $profileRepository->findProfileByUserId($this->config, $userId);\n\n return $profile instanceof Profile ? $profile->getCrmProviderId() : null;\n }\n\n private function getAccount(?string $crmAccountId = null, ?string $crmContactId = null): ?Account\n {\n $crmRepository = app(CrmObjectsRepository::class);\n\n if ($crmAccountId === null) {\n $contact = $crmRepository->findContactByCrmProviderId($this->config, $crmContactId);\n\n return $contact->getAccount();\n }\n\n return $crmRepository->findAccountByCrmProviderId($this->config, $crmAccountId);\n }\n\n private function buildOpportunityData(Opportunity $opportunity): array\n {\n $record = [\n 'crmId' => $opportunity->getCrmProviderId(),\n 'name' => $opportunity->getName(),\n 'won' => $opportunity->isWon(),\n 'closed' => $opportunity->isClosed(),\n ];\n\n if (! empty($opportunity->getFormattedValueAttribute())) {\n $record['value'] = $opportunity->getFormattedValueAttribute();\n }\n\n if (! empty($opportunity->getStage())) {\n $record['stage'] = [\n 'id' => $opportunity->getStage()->getUuid(),\n 'name' => $opportunity->getStage()->getName(),\n ];\n }\n\n return $record;\n }\n\n public function updateRecord(string $objectType, string $objectId, array $data, array $headers = []): void\n {\n $data = [\n 'data' => $this->normalizeData($objectType, $data),\n ];\n\n $this->client->updateRecordById($objectType, $objectId, $data);\n }\n\n private function normalizeData(string $objectType, array $data): array\n {\n $fieldMapper = $this->getFieldMapper($objectType);\n\n if (! $fieldMapper instanceof FieldMapperInterface) {\n return $data;\n }\n\n return $fieldMapper->mapToCrmFields($data);\n }\n\n private function getFieldMapper(string $objectType): ?FieldMapperInterface\n {\n if ($objectType === self::OBJECT_OPPORTUNITY) {\n return app(OpportunityFieldMapper::class);\n }\n\n if ($objectType === self::OBJECT_LEAD) {\n return app(LeadFieldMapper::class);\n }\n\n return null;\n }\n\n public function getRecord(string $objectType, string $objectId, array $fields = []): array\n {\n return $this->client->getRecordById($objectType, $objectId);\n }\n\n public function getConfiguration(): Configuration\n {\n return $this->config;\n }\n\n public function setConfiguration(Configuration $config): void\n {\n $this->clearExternalMapCache();\n\n $this->config = $config;\n }\n\n private function setEditionConfiguration(string $provider): void\n {\n $this->editionConfig = app(IntegrationConfigFactory::class)->create($provider);\n }\n\n public function setCrmUrlGenerator(Configuration $config): void\n {\n $this->crmUrlGenerator = app(IntegrationAppCrmGeneratorFactory::class)->create($config);\n }\n\n public function getCrmUrlGenerator(): ?GenerateProviderUrlInterface\n {\n if ($this->crmUrlGenerator === null) {\n $this->setCrmUrlGenerator($this->config);\n }\n\n return $this->crmUrlGenerator;\n }\n\n public function subscribeEntityEvents(bool $enableTrigger = true): void\n {\n $eventStates = $this->client->updateEntityEventsState($enableTrigger);\n\n $this->logger->info('[integration-app] Change team entity events subscription', [\n 'teamId' => $this->team->getId(),\n 'teamName' => $this->team->getName(),\n 'states' => $eventStates,\n 'action' => $enableTrigger ? 'subscribe' : 'unsubscribe',\n ]);\n }\n\n #[\\Override] public function supportsNotes(): bool\n {\n return $this->editionConfig->supportsNotes();\n }\n\n #[\\Override] public function saveNote(\n string $title,\n string $body,\n string $objectId,\n ?NoteObject $noteObject = null,\n ): ?string {\n if ($noteObject === null) {\n return null;\n }\n\n $notePayload = [\n 'title' => $title,\n 'content' => $body,\n 'objectId' => $objectId,\n 'objectType' => $noteObject->value,\n ];\n\n $result = $this->client->createNote($notePayload);\n\n // debug saving note response\n $this->logger->info('[integration-app] createNote response', [\n 'objectId' => $objectId,\n 'objectType' => $noteObject->value,\n 'result' => $result,\n 'hasId' => isset($result['id']),\n ]);\n\n return $result['id'] ?? null;\n }\n\n /**\n * @throws CrmException\n */\n #[\\Override] public function saveActivity(Activity $activity): Activity\n {\n $this->logger->info('[integration-app] saveActivity', [\n 'activity' => $activity->getUuid(),\n 'type' => $activity->getType(),\n ]);\n\n if ($activity->getCrmType() === Activity::TYPE_CONFERENCE) {\n $crmActivity = $this->saveMeeting($activity);\n } elseif (in_array($activity->getType(), [Activity::TYPE_SOFTPHONE, Activity::TYPE_SOFTPHONE_INBOUND])) {\n $crmActivity = $this->saveCall($activity);\n } else {\n throw new CrmException('Unsupported activity type');\n }\n\n $crmActivityId = $crmActivity['id'] ?? null;\n\n if ($crmActivityId !== null) {\n $activity->crm_provider_id = $crmActivityId;\n $activity->save();\n\n $this->logger->info('[integration-app] Activity successfully logged to CRM', [\n 'activity' => $activity->getUuid(),\n 'type' => $activity->getType(),\n 'crmId' => $crmActivityId,\n ]);\n }\n\n return $activity;\n }\n\n public function saveMeeting(Activity $activity): array\n {\n $decorateActivity = app(DecorateActivity::class);\n\n $meetingPayload = [\n 'Event_Title' => $decorateActivity->generateTitle($activity),\n 'Start_DateTime' => $activity->getActualStartTime()->toIso8601String(),\n 'End_DateTime' => $activity->getActualEndTime()->toIso8601String(),\n 'ownerId' => $this->getActivityOwnerId($activity),\n ];\n\n $payload = array_merge($meetingPayload, $this->attachToProspect($activity));\n\n if ($activity->hasCrmProviderId()) {\n $crmId = $activity->getCrmProviderId();\n $meeting = $this->client->getMeeting($crmId);\n\n $oldDescription = $meeting['fields']['Description'] ?? null;\n $payload['Description'] = $decorateActivity->generateUpdatedDescription($oldDescription, $activity);\n\n $this->logger->info('[integration-app] CRM update meeting', [\n 'activity' => $activity->getUuid(),\n 'crm_id' => $crmId,\n 'payload' => $payload,\n ]);\n\n return $this->client->updateMeeting($crmId, $payload);\n }\n\n $payload['Description'] = $decorateActivity->generateDescription($activity);\n\n $this->logger->info('[integration-app] CRM log meeting', [\n 'activity' => $activity->getUuid(),\n 'payload' => $payload,\n ]);\n\n return $this->client->createMeeting($payload);\n }\n\n public function saveCall(Activity $activity): array\n {\n $decorateActivity = app(DecorateActivity::class);\n\n $callPayload = [\n 'Call_Type' => $this->getCallType($activity),\n 'Call_Start_Time' => $activity->getActualStartTime()->toIso8601String(),\n 'Call_Duration' => $activity->getDuration(),\n 'name' => $decorateActivity->generateTitle($activity),\n 'ownerId' => $this->getActivityOwnerId($activity),\n ];\n\n $payload = array_merge($callPayload, $this->attachToProspect($activity));\n\n if ($activity->hasCrmProviderId()) {\n $crmId = $activity->getCrmProviderId();\n $call = $this->client->getCall($crmId);\n\n $oldDescription = $call['fields']['Description'] ?? null;\n $payload['description'] = $decorateActivity->generateUpdatedDescription($oldDescription, $activity);\n\n $this->logger->info('[integration-app] CRM update call', [\n 'activity' => $activity->getUuid(),\n 'crm_id' => $crmId,\n 'payload' => $payload,\n ]);\n\n return $this->client->updateCall($crmId, $payload);\n }\n\n $payload['description'] = $decorateActivity->generateDescription($activity);\n\n $this->logger->info('[integration-app] CRM log call', [\n 'activity' => $activity->getUuid(),\n 'payload' => $payload,\n ]);\n\n return $this->client->createCall($payload);\n }\n\n private function getCallType(Activity $activity): string\n {\n if ($activity->getStatus() === Activity::STATUS_NO_ANSWER) {\n return self::CALL_TYPE_MISSED;\n }\n\n return $activity->getType() === Activity::TYPE_SOFTPHONE_INBOUND ? self::CALL_TYPE_INBOUND : self::CALL_TYPE_OUTBOUND;\n }\n\n private function attachToProspect(Activity $activity): array\n {\n $payload = [];\n\n if ($activity->hasContact()) {\n $payload['contactId'] = $activity->getContact()->getCrmProviderId();\n }\n\n if ($activity->hasOpportunity()) {\n return array_merge(\n $payload,\n $this->buildBasicPayload(\n self::RELATIONSHIP_OPPORTUNITY,\n $activity->getOpportunity()->getCrmProviderId()\n )\n );\n }\n\n if ($activity->hasAccount() && ! $activity->getAccount()->getIsInternal()) {\n return array_merge(\n $payload,\n $this->buildBasicPayload(\n self::RELATIONSHIP_ACCOUNT,\n $activity->getAccount()->getCrmProviderId()\n )\n );\n }\n\n if ($activity->hasLead()) {\n $payload = $this->handleLeadPayload($activity);\n }\n\n return $payload;\n }\n\n private function handleLeadPayload(Activity $activity): array\n {\n $freshLead = $this->syncLead($activity->getLead()->getCrmProviderId());\n $lead = $freshLead ?? $activity->getLead();\n\n if ($lead->getConvertedAt() === null) {\n return $this->buildBasicPayload(self::RELATIONSHIP_LEAD, $lead->getCrmProviderId());\n }\n\n $activity->lead_id = null;\n\n if ($lead->hasAccount()) {\n $account = $lead->getAccount();\n $activity->account_id = $account->getId();\n $payload = $this->buildBasicPayload(self::RELATIONSHIP_ACCOUNT, $account->getCrmProviderId());\n } else {\n $payload = [];\n }\n\n if ($lead->hasOpportunity()) {\n $opportunity = $lead->getOpportunity();\n $payload = $this->buildBasicPayload(self::RELATIONSHIP_OPPORTUNITY, $opportunity->getCrmProviderId());\n $activity->opportunity_id = $opportunity->getId();\n $activity->value = $opportunity->value;\n $activity->stage_id = $opportunity->stage_id;\n } else {\n $activity->stage_id = null;\n }\n\n if ($lead->hasContact()) {\n $contact = $lead->getContact();\n $payload['contactId'] = $contact->getCrmProviderId();\n $activity->contact_id = $contact->getId();\n }\n\n $activity->save();\n event(new ActivityLeadConverted($activity, $lead));\n\n $this->logger->info('[integration-app] Lead converted', [\n 'activityUuid' => $activity->getUuid(),\n 'leadUuid' => $lead->getUuid(),\n ]);\n\n return $payload;\n }\n\n private function buildBasicPayload(string $type, string $id): array\n {\n return [\n 'type' => $type,\n 'id' => $id,\n ];\n }\n private function getActivityOwnerId(Activity $activity): ?string\n {\n $ownerId = null;\n if ($activity->hasUser() && $activity->getUser()->getProfile() !== null) {\n $ownerId = $activity->getUser()->getProfile()->getCrmProviderId();\n }\n\n return $ownerId;\n }\n\n #[\\Override] public function saveFollowupActivity(Activity $activity, array $fields): ?string\n {\n $taskPayload = [\n 'subject' => $fields['subject'],\n 'dueTime' => isset($fields['dueDate']) ? Carbon::parse($fields['dueDate'])->format('Y-m-d') : null,\n 'ownerId' => $this->getActivityOwnerId($activity),\n ];\n\n if (isset($fields['status'])) {\n $taskPayload['status'] = $fields['status'];\n }\n\n if (isset($fields['priority'])) {\n $taskPayload['priority'] = $fields['priority'];\n }\n\n if (isset($fields['content'])) {\n $taskPayload['content'] = $fields['content'];\n }\n\n $payload = array_merge($taskPayload, $this->attachToProspect($activity));\n\n $this->logger->info('[integration-app] CRM log follow up task', [\n 'activity' => $activity->getUuid(),\n 'payload' => $payload,\n ]);\n\n $task = $this->client->createTask($payload);\n\n return $task['id'] ?? null;\n }\n\n #[\\Override] public function saveTranscriptionSummaryAsNote(\n ActivityContract $activity,\n string $title,\n string $body,\n ?string $objectId,\n ?NoteObject $noteObject = null,\n ): ?string {\n // We have to find a way to store the transcription summary\n // This might be possible either by Tasks, Events, Engagements & Notes\n // Find what the CRM supports and save the note with the appropriate object(eg Notes)\n\n // For now use only Notes as both ZOHO & Salesforce support them.\n if ($this->supportsNotes() && $objectId !== null) {\n $this->logger->info('[integration-app] saving note', [\n 'activityId' => $activity->getUuid(),\n 'objectId' => $objectId,\n ]);\n\n return $this->saveNote($title, $body, $objectId, $noteObject);\n }\n\n $this->logger->info('[integration-app] skip saveTranscriptionSummaryAsNote', [\n 'activityId' => $activity->getUuid(),\n 'supportsNotes' => $this->supportsNotes(),\n 'objectId' => $objectId,\n ]);\n\n return null;\n }\n\n public function generateProviderUrl(string $providerId, string $objectType): ?string\n {\n return $this->getCrmUrlGenerator()?->generateProviderUrl($providerId, $objectType);\n }\n\n public function updateStage($crmObject, Stage $stage): void\n {\n $objectType = $stage->getType();\n $objectId = $crmObject->getCrmProviderId();\n $params = ['stageName' => $stage->getCrmProviderId()];\n\n $this->logger->info('[integration-app] updateStage', [\n 'objectType' => $objectType,\n 'objectId' => $objectId,\n 'params' => $params,\n ]);\n\n $data = [\n 'data' => $this->normalizeData($objectType, $params),\n ];\n\n\n if ($objectType === Stage::TYPE_LEAD) {\n $this->client->updateLead($objectId, $data);\n } else {\n $this->client->updateDeal($objectId, $data);\n }\n }\n\n /**\n * @throws \\Exception\n */\n public function fetchAndAssociateRelatedActivity(Activity $activity): ?Activity\n {\n if ($activity->getCrm()?->getEdition() !== IntegrationAppProviders::ZOHO_CRM) {\n return null;\n }\n\n if (! $activity->isTypeConference()) {\n return null;\n }\n\n // The related activity is already linked.\n if ($activity->hasCrmProviderId()) {\n return $activity;\n }\n\n if ($activity->hasActualStartTime() === false) {\n return null;\n }\n\n return $this->fetchAndAssociateZohoRelatedActivity($activity);\n }\n\n public function fetchAndAssociateZohoRelatedActivity(Activity $activity): ?Activity\n {\n try {\n $meeting = $this->fetchRelatedZohoActivity($activity);\n if (empty($meeting)) {\n $this->logger->info('[integration-app] fetchRelatedZohoActivity No related activity found', [\n 'activity' => $activity->getUuid(),\n ]);\n\n return null;\n }\n\n $decorateActivity = app(DecorateActivity::class);\n $oldDescription = $meeting['Description'] ?? '';\n $updatedDescription = $decorateActivity->generateUpdatedDescription($oldDescription, $activity);\n\n $this->logger->info('[integration-app] fetchAndAssociateZohoRelatedActivity updating related activity', [\n 'activity' => $activity->getUuid(),\n 'description' => $updatedDescription,\n ]);\n\n $this->client->updateMeeting($meeting['id'], ['Description' => $updatedDescription]);\n\n // Update our activity to reflect the remote data.\n $activity->update([\n 'crm_provider_id' => $meeting['id'],\n 'summary' => $meeting['Description'],\n ]);\n\n return $activity;\n } catch (\\Exception $exception) {\n \\Sentry::captureException($exception);\n\n throw $exception;\n }\n }\n\n public function fetchRelatedZohoActivity(Activity $activity): array\n {\n [$from, $to] = $this->getFromToDates($activity);\n\n $start = $from?->toIso8601String(); // e.g., 2025-07-01T00:00:00+00:00\n $end = $to?->toIso8601String(); // e.g., 2025-07-14T23:59:59+00:00\n if ($start === null || $end === null) {\n $this->logger->info(\n '[integration-app] fetchRelatedZohoActivity missing start or end date',\n [\n 'activity' => $activity->getUuid(),\n 'start' => $start,\n 'end' => $end,\n 'from' => $from,\n 'to' => $to,\n ]\n );\n\n return [];\n }\n\n $whoId = null;\n $whatId = null;\n $criteriaParts = [];\n\n if ($activity->getContact()) {\n $whoId = $activity->getContact()->getCrmProviderId();\n $criteriaParts[] = \"(Who_Id:equals:$whoId)\";\n }\n\n if ($activity->getOpportunity()) {\n $whatId = $activity->getOpportunity()->getCrmProviderId();\n } elseif ($activity->getAccount() && $activity->getAccount()->getIsInternal() === false) {\n $whatId = $activity->getAccount()->getCrmProviderId();\n } elseif ($activity->getLead()) {\n $whatId = $activity->getLead()->getCrmProviderId();\n }\n\n if ($whatId !== null) {\n $criteriaParts[] = \"(What_Id:equals:$whatId)\";\n }\n\n if ($whoId === null && $whatId === null) {\n $this->logger->info(\n '[integration-app] fetchRelatedZohoActivity cannot find prospect',\n [\n 'activity' => $activity->getUuid(),\n ]\n );\n\n return [];\n }\n\n $criteriaParts[] = \"(Start_DateTime:greater_equal:$start)\";\n $criteriaParts[] = \"(End_DateTime:less_equal:$end)\";\n\n $criteria = implode(' AND ', $criteriaParts);\n\n $params = [\n 'criteria' => $criteria,\n 'sort_by' => 'Modified_Time',\n 'sort_order' => 'desc',\n ];\n\n $this->logger->info(\n '[integration-app] fetchRelatedZohoActivity searching for related activity',\n [\n 'activity' => $activity->getUuid(),\n 'params' => $params,\n ]\n );\n\n $meetings = $this->client->searchMeetings($params);\n if (! empty($meetings)) {\n return $meetings[0];\n }\n\n return [];\n }\n\n private function getFromToDates(Activity $activity): array\n {\n $calendarEvent = $activity->calendarEvent()->first();\n\n $from = $calendarEvent?->getStartTime();\n $to = $calendarEvent?->getEndTime();\n\n if (! $from || ! $to) {\n $from = $activity->hasScheduledStartTime()\n ? $activity->getScheduledStartTime()\n : $activity->getActualStartTime();\n\n $to = $activity->hasScheduledEndTime()\n ? $activity->getScheduledEndTime()->addMinutes(15)\n : $activity->getActualEndTime();\n }\n\n return [$from, $to];\n }\n}","depth":4,"on_screen":true,"value":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Services\\Crm\\IntegrationApp;\n\nuse Carbon\\Carbon;\nuse Jiminny\\Contracts\\Crm\\Providers;\nuse Jiminny\\Contracts\\Services\\Crm\\ClientInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\FetchRelatedActivityInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\ImportsBusinessProcessesInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\LayoutManagementInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\MatchCrmEntitiesInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\Provider\\IntegrationAppInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\RemoteEntityLookupInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\RemoteEntityManipulationInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\RemoteNoteEntityManipulationInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\SendSummaryToCrmInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\SettingsInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\SyncCrmEntitiesInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\SyncCrmMetadataInterface;\nuse Jiminny\\Events\\Activities\\Crm\\ActivityLeadConverted;\nuse Jiminny\\Exceptions\\CrmException;\nuse Jiminny\\Exceptions\\SocialAccountNotFoundException;\nuse Jiminny\\Jobs\\Crm\\NoteObject;\nuse Jiminny\\Models\\Account;\nuse Jiminny\\Models\\Activity;\nuse Jiminny\\Models\\Contracts\\ActivityContract;\nuse Jiminny\\Models\\Crm\\Configuration;\nuse Jiminny\\Models\\Opportunity;\nuse Jiminny\\Models\\Stage;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Services\\Crm\\BaseService;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\Config\\IntegrationAppProviders;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\Config\\IntegrationConfigFactory;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\DTO\\Mappers\\FieldMapperInterface;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\DTO\\Mappers\\LeadFieldMapper;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\DTO\\Utils\\GenerateProviderUrlInterface;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\DTO\\Utils\\IntegrationAppCrmGeneratorFactory;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\DTO\\Utils\\UrlGeneratorInterface;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\ServiceTraits\\SyncCrmFieldsTrait;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\ServiceTraits\\SystemStateTrait;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\ServiceTraits\\LayoutTrait;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\ServiceTraits\\MatchProspectsTrait;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\ServiceTraits\\NotSupportedTrait;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\ServiceTraits\\SyncCrmEntitiesTrait;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\ServiceTraits\\SyncCrmMetadataTrait;\nuse Psr\\Log\\LoggerInterface;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\DTO\\Mappers\\OpportunityFieldMapper;\nuse Jiminny\\Repositories\\Crm\\ProfileRepository;\nuse Jiminny\\Repositories\\Crm\\OpportunityRepository;\nuse Jiminny\\Models\\Crm\\Profile;\nuse Jiminny\\Services\\Crm\\CrmObjects\\CrmObjectsRepository;\n\nclass Service extends BaseService implements\n IntegrationAppInterface,\n SyncCrmEntitiesInterface,\n SyncCrmMetadataInterface,\n ImportsBusinessProcessesInterface,\n RemoteEntityManipulationInterface,\n LayoutManagementInterface,\n SettingsInterface,\n MatchCrmEntitiesInterface,\n RemoteEntityLookupInterface,\n RemoteNoteEntityManipulationInterface,\n SendSummaryToCrmInterface,\n UrlGeneratorInterface,\n FetchRelatedActivityInterface\n{\n use SyncCrmMetadataTrait;\n use SyncCrmEntitiesTrait;\n use SystemStateTrait;\n use LayoutTrait;\n use NotSupportedTrait;\n use MatchProspectsTrait;\n use SyncCrmFieldsTrait;\n\n public const string CALL_TYPE_MISSED = 'Missed';\n public const string CALL_TYPE_INBOUND = 'Inbound';\n public const string CALL_TYPE_OUTBOUND = 'Outbound';\n public const string RELATIONSHIP_OPPORTUNITY = 'Deals';\n public const string RELATIONSHIP_LEAD = 'Leads';\n public const string RELATIONSHIP_ACCOUNT = 'Accounts';\n\n /**\n * @var ClientInterface&DataClient\n */\n protected $client;\n\n protected ?User $invokedUser = null;\n\n protected ?GenerateProviderUrlInterface $crmUrlGenerator = null;\n\n public function __construct(\n DataClient $client,\n LoggerInterface $logger,\n ) {\n parent::__construct();\n $this->client = $client;\n $this->logger = $logger;\n }\n\n public function getDisplayName(): string\n {\n return Providers::getProviderDisplayName(\n Providers::getCrmIntegrationSlug($this->config)\n );\n }\n\n /**\n * @throws \\Exception\n */\n public function setUser(User $user): void\n {\n $this->configureSentryScope($user);\n $this->invokedUser = $user;\n\n $this->team = $user->getTeam();\n $teamOwner = $this->team->getOwner();\n\n $this->setConfiguration($user->getTeam()->getCrmConfiguration());\n $this->setEditionConfiguration(Providers::getCrmIntegrationSlug($this->config));\n $this->setCrmUrlGenerator($this->config);\n\n $this->client->setTeam($this->team);\n $socialAccount = $teamOwner?->getSocialAccount('integration-app');\n if ($socialAccount === null) {\n $this->logger->info('[integration-app] Social account not found', [\n 'teamId' => $this->team->getId(),\n 'teamOwnerId' => $teamOwner?->getId(),\n 'userId' => $user->getId(),\n ]);\n\n throw new SocialAccountNotFoundException('Social account not found!');\n }\n $this->client->setSocialAccount($socialAccount);\n\n // The CRM Service is properly bootstrapped, and supports remote operations\n $this->connect();\n }\n\n public function normalizeValue(string $fieldType, string $fieldValue, bool $internal = false): string\n {\n return $fieldValue;\n }\n\n public function find(string $name, array $scopes): array\n {\n /** @var LocalSearch $localSearch */\n $localSearch = app(LocalSearch::class);\n $localSearch->setConfiguration($this->config);\n $localSearch->setCountryCode($this->invokedUser->getCountryCode());\n\n return $localSearch->search($name);\n\n // if (! empty($localMatch)) {\n // return $localMatch;\n // }\n //\n // /** @var RemoteSearch $remoteSearch */\n // $remoteSearch = app(RemoteSearch::class);\n // $remoteSearch->setClient($this->client);\n // $remoteSearch->setConfiguration($this->config);\n //\n // return $remoteSearch->search($name);\n }\n\n public function findOpportunities(?string $crmAccountId, ?string $crmContactId, ?int $userId = null): array\n {\n $data = [];\n $ownerData = [];\n\n $account = $this->getAccount($crmAccountId, $crmContactId);\n if ($account === null) {\n return [];\n }\n\n $ownerId = $this->getOwnerId($userId);\n\n try {\n $opportunityRepository = app(OpportunityRepository::class);\n $opportunities = $opportunityRepository->findAllByConfigurationAndAccountId(\n $this->config,\n $account->getId()\n );\n\n foreach ($opportunities as $opportunity) {\n /** @var Opportunity $opportunity */\n $record = $this->buildOpportunityData($opportunity);\n\n if ($ownerId && $opportunity->getOwnerId() === $ownerId) {\n $ownerData[] = $record;\n }\n\n $data[] = $record;\n }\n\n if (! empty($ownerData)) {\n return $ownerData;\n }\n\n return $data;\n } catch (\\Exception $e) {\n $this->logger->info('[integration-app] Failed to fetch opportunities', [\n 'contact' => $crmContactId,\n 'account' => $crmAccountId,\n 'owner' => $ownerId,\n 'error' => $e->getMessage(),\n ]);\n\n return $data;\n }\n }\n\n private function getOwnerId(?int $userId = null): ?string\n {\n if (! $userId) {\n return null;\n }\n\n $profileRepository = app(ProfileRepository::class);\n $profile = $profileRepository->findProfileByUserId($this->config, $userId);\n\n return $profile instanceof Profile ? $profile->getCrmProviderId() : null;\n }\n\n private function getAccount(?string $crmAccountId = null, ?string $crmContactId = null): ?Account\n {\n $crmRepository = app(CrmObjectsRepository::class);\n\n if ($crmAccountId === null) {\n $contact = $crmRepository->findContactByCrmProviderId($this->config, $crmContactId);\n\n return $contact->getAccount();\n }\n\n return $crmRepository->findAccountByCrmProviderId($this->config, $crmAccountId);\n }\n\n private function buildOpportunityData(Opportunity $opportunity): array\n {\n $record = [\n 'crmId' => $opportunity->getCrmProviderId(),\n 'name' => $opportunity->getName(),\n 'won' => $opportunity->isWon(),\n 'closed' => $opportunity->isClosed(),\n ];\n\n if (! empty($opportunity->getFormattedValueAttribute())) {\n $record['value'] = $opportunity->getFormattedValueAttribute();\n }\n\n if (! empty($opportunity->getStage())) {\n $record['stage'] = [\n 'id' => $opportunity->getStage()->getUuid(),\n 'name' => $opportunity->getStage()->getName(),\n ];\n }\n\n return $record;\n }\n\n public function updateRecord(string $objectType, string $objectId, array $data, array $headers = []): void\n {\n $data = [\n 'data' => $this->normalizeData($objectType, $data),\n ];\n\n $this->client->updateRecordById($objectType, $objectId, $data);\n }\n\n private function normalizeData(string $objectType, array $data): array\n {\n $fieldMapper = $this->getFieldMapper($objectType);\n\n if (! $fieldMapper instanceof FieldMapperInterface) {\n return $data;\n }\n\n return $fieldMapper->mapToCrmFields($data);\n }\n\n private function getFieldMapper(string $objectType): ?FieldMapperInterface\n {\n if ($objectType === self::OBJECT_OPPORTUNITY) {\n return app(OpportunityFieldMapper::class);\n }\n\n if ($objectType === self::OBJECT_LEAD) {\n return app(LeadFieldMapper::class);\n }\n\n return null;\n }\n\n public function getRecord(string $objectType, string $objectId, array $fields = []): array\n {\n return $this->client->getRecordById($objectType, $objectId);\n }\n\n public function getConfiguration(): Configuration\n {\n return $this->config;\n }\n\n public function setConfiguration(Configuration $config): void\n {\n $this->clearExternalMapCache();\n\n $this->config = $config;\n }\n\n private function setEditionConfiguration(string $provider): void\n {\n $this->editionConfig = app(IntegrationConfigFactory::class)->create($provider);\n }\n\n public function setCrmUrlGenerator(Configuration $config): void\n {\n $this->crmUrlGenerator = app(IntegrationAppCrmGeneratorFactory::class)->create($config);\n }\n\n public function getCrmUrlGenerator(): ?GenerateProviderUrlInterface\n {\n if ($this->crmUrlGenerator === null) {\n $this->setCrmUrlGenerator($this->config);\n }\n\n return $this->crmUrlGenerator;\n }\n\n public function subscribeEntityEvents(bool $enableTrigger = true): void\n {\n $eventStates = $this->client->updateEntityEventsState($enableTrigger);\n\n $this->logger->info('[integration-app] Change team entity events subscription', [\n 'teamId' => $this->team->getId(),\n 'teamName' => $this->team->getName(),\n 'states' => $eventStates,\n 'action' => $enableTrigger ? 'subscribe' : 'unsubscribe',\n ]);\n }\n\n #[\\Override] public function supportsNotes(): bool\n {\n return $this->editionConfig->supportsNotes();\n }\n\n #[\\Override] public function saveNote(\n string $title,\n string $body,\n string $objectId,\n ?NoteObject $noteObject = null,\n ): ?string {\n if ($noteObject === null) {\n return null;\n }\n\n $notePayload = [\n 'title' => $title,\n 'content' => $body,\n 'objectId' => $objectId,\n 'objectType' => $noteObject->value,\n ];\n\n $result = $this->client->createNote($notePayload);\n\n // debug saving note response\n $this->logger->info('[integration-app] createNote response', [\n 'objectId' => $objectId,\n 'objectType' => $noteObject->value,\n 'result' => $result,\n 'hasId' => isset($result['id']),\n ]);\n\n return $result['id'] ?? null;\n }\n\n /**\n * @throws CrmException\n */\n #[\\Override] public function saveActivity(Activity $activity): Activity\n {\n $this->logger->info('[integration-app] saveActivity', [\n 'activity' => $activity->getUuid(),\n 'type' => $activity->getType(),\n ]);\n\n if ($activity->getCrmType() === Activity::TYPE_CONFERENCE) {\n $crmActivity = $this->saveMeeting($activity);\n } elseif (in_array($activity->getType(), [Activity::TYPE_SOFTPHONE, Activity::TYPE_SOFTPHONE_INBOUND])) {\n $crmActivity = $this->saveCall($activity);\n } else {\n throw new CrmException('Unsupported activity type');\n }\n\n $crmActivityId = $crmActivity['id'] ?? null;\n\n if ($crmActivityId !== null) {\n $activity->crm_provider_id = $crmActivityId;\n $activity->save();\n\n $this->logger->info('[integration-app] Activity successfully logged to CRM', [\n 'activity' => $activity->getUuid(),\n 'type' => $activity->getType(),\n 'crmId' => $crmActivityId,\n ]);\n }\n\n return $activity;\n }\n\n public function saveMeeting(Activity $activity): array\n {\n $decorateActivity = app(DecorateActivity::class);\n\n $meetingPayload = [\n 'Event_Title' => $decorateActivity->generateTitle($activity),\n 'Start_DateTime' => $activity->getActualStartTime()->toIso8601String(),\n 'End_DateTime' => $activity->getActualEndTime()->toIso8601String(),\n 'ownerId' => $this->getActivityOwnerId($activity),\n ];\n\n $payload = array_merge($meetingPayload, $this->attachToProspect($activity));\n\n if ($activity->hasCrmProviderId()) {\n $crmId = $activity->getCrmProviderId();\n $meeting = $this->client->getMeeting($crmId);\n\n $oldDescription = $meeting['fields']['Description'] ?? null;\n $payload['Description'] = $decorateActivity->generateUpdatedDescription($oldDescription, $activity);\n\n $this->logger->info('[integration-app] CRM update meeting', [\n 'activity' => $activity->getUuid(),\n 'crm_id' => $crmId,\n 'payload' => $payload,\n ]);\n\n return $this->client->updateMeeting($crmId, $payload);\n }\n\n $payload['Description'] = $decorateActivity->generateDescription($activity);\n\n $this->logger->info('[integration-app] CRM log meeting', [\n 'activity' => $activity->getUuid(),\n 'payload' => $payload,\n ]);\n\n return $this->client->createMeeting($payload);\n }\n\n public function saveCall(Activity $activity): array\n {\n $decorateActivity = app(DecorateActivity::class);\n\n $callPayload = [\n 'Call_Type' => $this->getCallType($activity),\n 'Call_Start_Time' => $activity->getActualStartTime()->toIso8601String(),\n 'Call_Duration' => $activity->getDuration(),\n 'name' => $decorateActivity->generateTitle($activity),\n 'ownerId' => $this->getActivityOwnerId($activity),\n ];\n\n $payload = array_merge($callPayload, $this->attachToProspect($activity));\n\n if ($activity->hasCrmProviderId()) {\n $crmId = $activity->getCrmProviderId();\n $call = $this->client->getCall($crmId);\n\n $oldDescription = $call['fields']['Description'] ?? null;\n $payload['description'] = $decorateActivity->generateUpdatedDescription($oldDescription, $activity);\n\n $this->logger->info('[integration-app] CRM update call', [\n 'activity' => $activity->getUuid(),\n 'crm_id' => $crmId,\n 'payload' => $payload,\n ]);\n\n return $this->client->updateCall($crmId, $payload);\n }\n\n $payload['description'] = $decorateActivity->generateDescription($activity);\n\n $this->logger->info('[integration-app] CRM log call', [\n 'activity' => $activity->getUuid(),\n 'payload' => $payload,\n ]);\n\n return $this->client->createCall($payload);\n }\n\n private function getCallType(Activity $activity): string\n {\n if ($activity->getStatus() === Activity::STATUS_NO_ANSWER) {\n return self::CALL_TYPE_MISSED;\n }\n\n return $activity->getType() === Activity::TYPE_SOFTPHONE_INBOUND ? self::CALL_TYPE_INBOUND : self::CALL_TYPE_OUTBOUND;\n }\n\n private function attachToProspect(Activity $activity): array\n {\n $payload = [];\n\n if ($activity->hasContact()) {\n $payload['contactId'] = $activity->getContact()->getCrmProviderId();\n }\n\n if ($activity->hasOpportunity()) {\n return array_merge(\n $payload,\n $this->buildBasicPayload(\n self::RELATIONSHIP_OPPORTUNITY,\n $activity->getOpportunity()->getCrmProviderId()\n )\n );\n }\n\n if ($activity->hasAccount() && ! $activity->getAccount()->getIsInternal()) {\n return array_merge(\n $payload,\n $this->buildBasicPayload(\n self::RELATIONSHIP_ACCOUNT,\n $activity->getAccount()->getCrmProviderId()\n )\n );\n }\n\n if ($activity->hasLead()) {\n $payload = $this->handleLeadPayload($activity);\n }\n\n return $payload;\n }\n\n private function handleLeadPayload(Activity $activity): array\n {\n $freshLead = $this->syncLead($activity->getLead()->getCrmProviderId());\n $lead = $freshLead ?? $activity->getLead();\n\n if ($lead->getConvertedAt() === null) {\n return $this->buildBasicPayload(self::RELATIONSHIP_LEAD, $lead->getCrmProviderId());\n }\n\n $activity->lead_id = null;\n\n if ($lead->hasAccount()) {\n $account = $lead->getAccount();\n $activity->account_id = $account->getId();\n $payload = $this->buildBasicPayload(self::RELATIONSHIP_ACCOUNT, $account->getCrmProviderId());\n } else {\n $payload = [];\n }\n\n if ($lead->hasOpportunity()) {\n $opportunity = $lead->getOpportunity();\n $payload = $this->buildBasicPayload(self::RELATIONSHIP_OPPORTUNITY, $opportunity->getCrmProviderId());\n $activity->opportunity_id = $opportunity->getId();\n $activity->value = $opportunity->value;\n $activity->stage_id = $opportunity->stage_id;\n } else {\n $activity->stage_id = null;\n }\n\n if ($lead->hasContact()) {\n $contact = $lead->getContact();\n $payload['contactId'] = $contact->getCrmProviderId();\n $activity->contact_id = $contact->getId();\n }\n\n $activity->save();\n event(new ActivityLeadConverted($activity, $lead));\n\n $this->logger->info('[integration-app] Lead converted', [\n 'activityUuid' => $activity->getUuid(),\n 'leadUuid' => $lead->getUuid(),\n ]);\n\n return $payload;\n }\n\n private function buildBasicPayload(string $type, string $id): array\n {\n return [\n 'type' => $type,\n 'id' => $id,\n ];\n }\n private function getActivityOwnerId(Activity $activity): ?string\n {\n $ownerId = null;\n if ($activity->hasUser() && $activity->getUser()->getProfile() !== null) {\n $ownerId = $activity->getUser()->getProfile()->getCrmProviderId();\n }\n\n return $ownerId;\n }\n\n #[\\Override] public function saveFollowupActivity(Activity $activity, array $fields): ?string\n {\n $taskPayload = [\n 'subject' => $fields['subject'],\n 'dueTime' => isset($fields['dueDate']) ? Carbon::parse($fields['dueDate'])->format('Y-m-d') : null,\n 'ownerId' => $this->getActivityOwnerId($activity),\n ];\n\n if (isset($fields['status'])) {\n $taskPayload['status'] = $fields['status'];\n }\n\n if (isset($fields['priority'])) {\n $taskPayload['priority'] = $fields['priority'];\n }\n\n if (isset($fields['content'])) {\n $taskPayload['content'] = $fields['content'];\n }\n\n $payload = array_merge($taskPayload, $this->attachToProspect($activity));\n\n $this->logger->info('[integration-app] CRM log follow up task', [\n 'activity' => $activity->getUuid(),\n 'payload' => $payload,\n ]);\n\n $task = $this->client->createTask($payload);\n\n return $task['id'] ?? null;\n }\n\n #[\\Override] public function saveTranscriptionSummaryAsNote(\n ActivityContract $activity,\n string $title,\n string $body,\n ?string $objectId,\n ?NoteObject $noteObject = null,\n ): ?string {\n // We have to find a way to store the transcription summary\n // This might be possible either by Tasks, Events, Engagements & Notes\n // Find what the CRM supports and save the note with the appropriate object(eg Notes)\n\n // For now use only Notes as both ZOHO & Salesforce support them.\n if ($this->supportsNotes() && $objectId !== null) {\n $this->logger->info('[integration-app] saving note', [\n 'activityId' => $activity->getUuid(),\n 'objectId' => $objectId,\n ]);\n\n return $this->saveNote($title, $body, $objectId, $noteObject);\n }\n\n $this->logger->info('[integration-app] skip saveTranscriptionSummaryAsNote', [\n 'activityId' => $activity->getUuid(),\n 'supportsNotes' => $this->supportsNotes(),\n 'objectId' => $objectId,\n ]);\n\n return null;\n }\n\n public function generateProviderUrl(string $providerId, string $objectType): ?string\n {\n return $this->getCrmUrlGenerator()?->generateProviderUrl($providerId, $objectType);\n }\n\n public function updateStage($crmObject, Stage $stage): void\n {\n $objectType = $stage->getType();\n $objectId = $crmObject->getCrmProviderId();\n $params = ['stageName' => $stage->getCrmProviderId()];\n\n $this->logger->info('[integration-app] updateStage', [\n 'objectType' => $objectType,\n 'objectId' => $objectId,\n 'params' => $params,\n ]);\n\n $data = [\n 'data' => $this->normalizeData($objectType, $params),\n ];\n\n\n if ($objectType === Stage::TYPE_LEAD) {\n $this->client->updateLead($objectId, $data);\n } else {\n $this->client->updateDeal($objectId, $data);\n }\n }\n\n /**\n * @throws \\Exception\n */\n public function fetchAndAssociateRelatedActivity(Activity $activity): ?Activity\n {\n if ($activity->getCrm()?->getEdition() !== IntegrationAppProviders::ZOHO_CRM) {\n return null;\n }\n\n if (! $activity->isTypeConference()) {\n return null;\n }\n\n // The related activity is already linked.\n if ($activity->hasCrmProviderId()) {\n return $activity;\n }\n\n if ($activity->hasActualStartTime() === false) {\n return null;\n }\n\n return $this->fetchAndAssociateZohoRelatedActivity($activity);\n }\n\n public function fetchAndAssociateZohoRelatedActivity(Activity $activity): ?Activity\n {\n try {\n $meeting = $this->fetchRelatedZohoActivity($activity);\n if (empty($meeting)) {\n $this->logger->info('[integration-app] fetchRelatedZohoActivity No related activity found', [\n 'activity' => $activity->getUuid(),\n ]);\n\n return null;\n }\n\n $decorateActivity = app(DecorateActivity::class);\n $oldDescription = $meeting['Description'] ?? '';\n $updatedDescription = $decorateActivity->generateUpdatedDescription($oldDescription, $activity);\n\n $this->logger->info('[integration-app] fetchAndAssociateZohoRelatedActivity updating related activity', [\n 'activity' => $activity->getUuid(),\n 'description' => $updatedDescription,\n ]);\n\n $this->client->updateMeeting($meeting['id'], ['Description' => $updatedDescription]);\n\n // Update our activity to reflect the remote data.\n $activity->update([\n 'crm_provider_id' => $meeting['id'],\n 'summary' => $meeting['Description'],\n ]);\n\n return $activity;\n } catch (\\Exception $exception) {\n \\Sentry::captureException($exception);\n\n throw $exception;\n }\n }\n\n public function fetchRelatedZohoActivity(Activity $activity): array\n {\n [$from, $to] = $this->getFromToDates($activity);\n\n $start = $from?->toIso8601String(); // e.g., 2025-07-01T00:00:00+00:00\n $end = $to?->toIso8601String(); // e.g., 2025-07-14T23:59:59+00:00\n if ($start === null || $end === null) {\n $this->logger->info(\n '[integration-app] fetchRelatedZohoActivity missing start or end date',\n [\n 'activity' => $activity->getUuid(),\n 'start' => $start,\n 'end' => $end,\n 'from' => $from,\n 'to' => $to,\n ]\n );\n\n return [];\n }\n\n $whoId = null;\n $whatId = null;\n $criteriaParts = [];\n\n if ($activity->getContact()) {\n $whoId = $activity->getContact()->getCrmProviderId();\n $criteriaParts[] = \"(Who_Id:equals:$whoId)\";\n }\n\n if ($activity->getOpportunity()) {\n $whatId = $activity->getOpportunity()->getCrmProviderId();\n } elseif ($activity->getAccount() && $activity->getAccount()->getIsInternal() === false) {\n $whatId = $activity->getAccount()->getCrmProviderId();\n } elseif ($activity->getLead()) {\n $whatId = $activity->getLead()->getCrmProviderId();\n }\n\n if ($whatId !== null) {\n $criteriaParts[] = \"(What_Id:equals:$whatId)\";\n }\n\n if ($whoId === null && $whatId === null) {\n $this->logger->info(\n '[integration-app] fetchRelatedZohoActivity cannot find prospect',\n [\n 'activity' => $activity->getUuid(),\n ]\n );\n\n return [];\n }\n\n $criteriaParts[] = \"(Start_DateTime:greater_equal:$start)\";\n $criteriaParts[] = \"(End_DateTime:less_equal:$end)\";\n\n $criteria = implode(' AND ', $criteriaParts);\n\n $params = [\n 'criteria' => $criteria,\n 'sort_by' => 'Modified_Time',\n 'sort_order' => 'desc',\n ];\n\n $this->logger->info(\n '[integration-app] fetchRelatedZohoActivity searching for related activity',\n [\n 'activity' => $activity->getUuid(),\n 'params' => $params,\n ]\n );\n\n $meetings = $this->client->searchMeetings($params);\n if (! empty($meetings)) {\n return $meetings[0];\n }\n\n return [];\n }\n\n private function getFromToDates(Activity $activity): array\n {\n $calendarEvent = $activity->calendarEvent()->first();\n\n $from = $calendarEvent?->getStartTime();\n $to = $calendarEvent?->getEndTime();\n\n if (! $from || ! $to) {\n $from = $activity->hasScheduledStartTime()\n ? $activity->getScheduledStartTime()\n : $activity->getActualStartTime();\n\n $to = $activity->hasScheduledEndTime()\n ? $activity->getScheduledEndTime()->addMinutes(15)\n : $activity->getActualEndTime();\n }\n\n return [$from, $to];\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,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Explain Plan","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Browse Query History","depth":4,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"View Parameters","depth":4,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
-3854124401442490710
|
1922900134730021341
|
click
|
accessibility
|
NULL
|
Project: faVsco.js, menu
#12066 on JY-20725-handle Project: faVsco.js, menu
#12066 on JY-20725-handle-HS-search-rate-limit, menu
Start Listening for PHP Debug Connections
HandleHubspotRateLimitTest
Run 'HandleHubspotRateLimitTest'
Debug 'HandleHubspotRateLimitTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
16
2
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Services\Crm\IntegrationApp;
use Carbon\Carbon;
use Jiminny\Contracts\Crm\Providers;
use Jiminny\Contracts\Services\Crm\ClientInterface;
use Jiminny\Contracts\Services\Crm\FetchRelatedActivityInterface;
use Jiminny\Contracts\Services\Crm\ImportsBusinessProcessesInterface;
use Jiminny\Contracts\Services\Crm\LayoutManagementInterface;
use Jiminny\Contracts\Services\Crm\MatchCrmEntitiesInterface;
use Jiminny\Contracts\Services\Crm\Provider\IntegrationAppInterface;
use Jiminny\Contracts\Services\Crm\RemoteEntityLookupInterface;
use Jiminny\Contracts\Services\Crm\RemoteEntityManipulationInterface;
use Jiminny\Contracts\Services\Crm\RemoteNoteEntityManipulationInterface;
use Jiminny\Contracts\Services\Crm\SendSummaryToCrmInterface;
use Jiminny\Contracts\Services\Crm\SettingsInterface;
use Jiminny\Contracts\Services\Crm\SyncCrmEntitiesInterface;
use Jiminny\Contracts\Services\Crm\SyncCrmMetadataInterface;
use Jiminny\Events\Activities\Crm\ActivityLeadConverted;
use Jiminny\Exceptions\CrmException;
use Jiminny\Exceptions\SocialAccountNotFoundException;
use Jiminny\Jobs\Crm\NoteObject;
use Jiminny\Models\Account;
use Jiminny\Models\Activity;
use Jiminny\Models\Contracts\ActivityContract;
use Jiminny\Models\Crm\Configuration;
use Jiminny\Models\Opportunity;
use Jiminny\Models\Stage;
use Jiminny\Models\User;
use Jiminny\Services\Crm\BaseService;
use Jiminny\Services\Crm\IntegrationApp\Config\IntegrationAppProviders;
use Jiminny\Services\Crm\IntegrationApp\Config\IntegrationConfigFactory;
use Jiminny\Services\Crm\IntegrationApp\DTO\Mappers\FieldMapperInterface;
use Jiminny\Services\Crm\IntegrationApp\DTO\Mappers\LeadFieldMapper;
use Jiminny\Services\Crm\IntegrationApp\DTO\Utils\GenerateProviderUrlInterface;
use Jiminny\Services\Crm\IntegrationApp\DTO\Utils\IntegrationAppCrmGeneratorFactory;
use Jiminny\Services\Crm\IntegrationApp\DTO\Utils\UrlGeneratorInterface;
use Jiminny\Services\Crm\IntegrationApp\ServiceTraits\SyncCrmFieldsTrait;
use Jiminny\Services\Crm\IntegrationApp\ServiceTraits\SystemStateTrait;
use Jiminny\Services\Crm\IntegrationApp\ServiceTraits\LayoutTrait;
use Jiminny\Services\Crm\IntegrationApp\ServiceTraits\MatchProspectsTrait;
use Jiminny\Services\Crm\IntegrationApp\ServiceTraits\NotSupportedTrait;
use Jiminny\Services\Crm\IntegrationApp\ServiceTraits\SyncCrmEntitiesTrait;
use Jiminny\Services\Crm\IntegrationApp\ServiceTraits\SyncCrmMetadataTrait;
use Psr\Log\LoggerInterface;
use Jiminny\Services\Crm\IntegrationApp\DTO\Mappers\OpportunityFieldMapper;
use Jiminny\Repositories\Crm\ProfileRepository;
use Jiminny\Repositories\Crm\OpportunityRepository;
use Jiminny\Models\Crm\Profile;
use Jiminny\Services\Crm\CrmObjects\CrmObjectsRepository;
class Service extends BaseService implements
IntegrationAppInterface,
SyncCrmEntitiesInterface,
SyncCrmMetadataInterface,
ImportsBusinessProcessesInterface,
RemoteEntityManipulationInterface,
LayoutManagementInterface,
SettingsInterface,
MatchCrmEntitiesInterface,
RemoteEntityLookupInterface,
RemoteNoteEntityManipulationInterface,
SendSummaryToCrmInterface,
UrlGeneratorInterface,
FetchRelatedActivityInterface
{
use SyncCrmMetadataTrait;
use SyncCrmEntitiesTrait;
use SystemStateTrait;
use LayoutTrait;
use NotSupportedTrait;
use MatchProspectsTrait;
use SyncCrmFieldsTrait;
public const string CALL_TYPE_MISSED = 'Missed';
public const string CALL_TYPE_INBOUND = 'Inbound';
public const string CALL_TYPE_OUTBOUND = 'Outbound';
public const string RELATIONSHIP_OPPORTUNITY = 'Deals';
public const string RELATIONSHIP_LEAD = 'Leads';
public const string RELATIONSHIP_ACCOUNT = 'Accounts';
/**
* @var ClientInterface&DataClient
*/
protected $client;
protected ?User $invokedUser = null;
protected ?GenerateProviderUrlInterface $crmUrlGenerator = null;
public function __construct(
DataClient $client,
LoggerInterface $logger,
) {
parent::__construct();
$this->client = $client;
$this->logger = $logger;
}
public function getDisplayName(): string
{
return Providers::getProviderDisplayName(
Providers::getCrmIntegrationSlug($this->config)
);
}
/**
* @throws \Exception
*/
public function setUser(User $user): void
{
$this->configureSentryScope($user);
$this->invokedUser = $user;
$this->team = $user->getTeam();
$teamOwner = $this->team->getOwner();
$this->setConfiguration($user->getTeam()->getCrmConfiguration());
$this->setEditionConfiguration(Providers::getCrmIntegrationSlug($this->config));
$this->setCrmUrlGenerator($this->config);
$this->client->setTeam($this->team);
$socialAccount = $teamOwner?->getSocialAccount('integration-app');
if ($socialAccount === null) {
$this->logger->info('[integration-app] Social account not found', [
'teamId' => $this->team->getId(),
'teamOwnerId' => $teamOwner?->getId(),
'userId' => $user->getId(),
]);
throw new SocialAccountNotFoundException('Social account not found!');
}
$this->client->setSocialAccount($socialAccount);
// The CRM Service is properly bootstrapped, and supports remote operations
$this->connect();
}
public function normalizeValue(string $fieldType, string $fieldValue, bool $internal = false): string
{
return $fieldValue;
}
public function find(string $name, array $scopes): array
{
/** @var LocalSearch $localSearch */
$localSearch = app(LocalSearch::class);
$localSearch->setConfiguration($this->config);
$localSearch->setCountryCode($this->invokedUser->getCountryCode());
return $localSearch->search($name);
// if (! empty($localMatch)) {
// return $localMatch;
// }
//
// /** @var RemoteSearch $remoteSearch */
// $remoteSearch = app(RemoteSearch::class);
// $remoteSearch->setClient($this->client);
// $remoteSearch->setConfiguration($this->config);
//
// return $remoteSearch->search($name);
}
public function findOpportunities(?string $crmAccountId, ?string $crmContactId, ?int $userId = null): array
{
$data = [];
$ownerData = [];
$account = $this->getAccount($crmAccountId, $crmContactId);
if ($account === null) {
return [];
}
$ownerId = $this->getOwnerId($userId);
try {
$opportunityRepository = app(OpportunityRepository::class);
$opportunities = $opportunityRepository->findAllByConfigurationAndAccountId(
$this->config,
$account->getId()
);
foreach ($opportunities as $opportunity) {
/** @var Opportunity $opportunity */
$record = $this->buildOpportunityData($opportunity);
if ($ownerId && $opportunity->getOwnerId() === $ownerId) {
$ownerData[] = $record;
}
$data[] = $record;
}
if (! empty($ownerData)) {
return $ownerData;
}
return $data;
} catch (\Exception $e) {
$this->logger->info('[integration-app] Failed to fetch opportunities', [
'contact' => $crmContactId,
'account' => $crmAccountId,
'owner' => $ownerId,
'error' => $e->getMessage(),
]);
return $data;
}
}
private function getOwnerId(?int $userId = null): ?string
{
if (! $userId) {
return null;
}
$profileRepository = app(ProfileRepository::class);
$profile = $profileRepository->findProfileByUserId($this->config, $userId);
return $profile instanceof Profile ? $profile->getCrmProviderId() : null;
}
private function getAccount(?string $crmAccountId = null, ?string $crmContactId = null): ?Account
{
$crmRepository = app(CrmObjectsRepository::class);
if ($crmAccountId === null) {
$contact = $crmRepository->findContactByCrmProviderId($this->config, $crmContactId);
return $contact->getAccount();
}
return $crmRepository->findAccountByCrmProviderId($this->config, $crmAccountId);
}
private function buildOpportunityData(Opportunity $opportunity): array
{
$record = [
'crmId' => $opportunity->getCrmProviderId(),
'name' => $opportunity->getName(),
'won' => $opportunity->isWon(),
'closed' => $opportunity->isClosed(),
];
if (! empty($opportunity->getFormattedValueAttribute())) {
$record['value'] = $opportunity->getFormattedValueAttribute();
}
if (! empty($opportunity->getStage())) {
$record['stage'] = [
'id' => $opportunity->getStage()->getUuid(),
'name' => $opportunity->getStage()->getName(),
];
}
return $record;
}
public function updateRecord(string $objectType, string $objectId, array $data, array $headers = []): void
{
$data = [
'data' => $this->normalizeData($objectType, $data),
];
$this->client->updateRecordById($objectType, $objectId, $data);
}
private function normalizeData(string $objectType, array $data): array
{
$fieldMapper = $this->getFieldMapper($objectType);
if (! $fieldMapper instanceof FieldMapperInterface) {
return $data;
}
return $fieldMapper->mapToCrmFields($data);
}
private function getFieldMapper(string $objectType): ?FieldMapperInterface
{
if ($objectType === self::OBJECT_OPPORTUNITY) {
return app(OpportunityFieldMapper::class);
}
if ($objectType === self::OBJECT_LEAD) {
return app(LeadFieldMapper::class);
}
return null;
}
public function getRecord(string $objectType, string $objectId, array $fields = []): array
{
return $this->client->getRecordById($objectType, $objectId);
}
public function getConfiguration(): Configuration
{
return $this->config;
}
public function setConfiguration(Configuration $config): void
{
$this->clearExternalMapCache();
$this->config = $config;
}
private function setEditionConfiguration(string $provider): void
{
$this->editionConfig = app(IntegrationConfigFactory::class)->create($provider);
}
public function setCrmUrlGenerator(Configuration $config): void
{
$this->crmUrlGenerator = app(IntegrationAppCrmGeneratorFactory::class)->create($config);
}
public function getCrmUrlGenerator(): ?GenerateProviderUrlInterface
{
if ($this->crmUrlGenerator === null) {
$this->setCrmUrlGenerator($this->config);
}
return $this->crmUrlGenerator;
}
public function subscribeEntityEvents(bool $enableTrigger = true): void
{
$eventStates = $this->client->updateEntityEventsState($enableTrigger);
$this->logger->info('[integration-app] Change team entity events subscription', [
'teamId' => $this->team->getId(),
'teamName' => $this->team->getName(),
'states' => $eventStates,
'action' => $enableTrigger ? 'subscribe' : 'unsubscribe',
]);
}
#[\Override] public function supportsNotes(): bool
{
return $this->editionConfig->supportsNotes();
}
#[\Override] public function saveNote(
string $title,
string $body,
string $objectId,
?NoteObject $noteObject = null,
): ?string {
if ($noteObject === null) {
return null;
}
$notePayload = [
'title' => $title,
'content' => $body,
'objectId' => $objectId,
'objectType' => $noteObject->value,
];
$result = $this->client->createNote($notePayload);
// debug saving note response
$this->logger->info('[integration-app] createNote response', [
'objectId' => $objectId,
'objectType' => $noteObject->value,
'result' => $result,
'hasId' => isset($result['id']),
]);
return $result['id'] ?? null;
}
/**
* @throws CrmException
*/
#[\Override] public function saveActivity(Activity $activity): Activity
{
$this->logger->info('[integration-app] saveActivity', [
'activity' => $activity->getUuid(),
'type' => $activity->getType(),
]);
if ($activity->getCrmType() === Activity::TYPE_CONFERENCE) {
$crmActivity = $this->saveMeeting($activity);
} elseif (in_array($activity->getType(), [Activity::TYPE_SOFTPHONE, Activity::TYPE_SOFTPHONE_INBOUND])) {
$crmActivity = $this->saveCall($activity);
} else {
throw new CrmException('Unsupported activity type');
}
$crmActivityId = $crmActivity['id'] ?? null;
if ($crmActivityId !== null) {
$activity->crm_provider_id = $crmActivityId;
$activity->save();
$this->logger->info('[integration-app] Activity successfully logged to CRM', [
'activity' => $activity->getUuid(),
'type' => $activity->getType(),
'crmId' => $crmActivityId,
]);
}
return $activity;
}
public function saveMeeting(Activity $activity): array
{
$decorateActivity = app(DecorateActivity::class);
$meetingPayload = [
'Event_Title' => $decorateActivity->generateTitle($activity),
'Start_DateTime' => $activity->getActualStartTime()->toIso8601String(),
'End_DateTime' => $activity->getActualEndTime()->toIso8601String(),
'ownerId' => $this->getActivityOwnerId($activity),
];
$payload = array_merge($meetingPayload, $this->attachToProspect($activity));
if ($activity->hasCrmProviderId()) {
$crmId = $activity->getCrmProviderId();
$meeting = $this->client->getMeeting($crmId);
$oldDescription = $meeting['fields']['Description'] ?? null;
$payload['Description'] = $decorateActivity->generateUpdatedDescription($oldDescription, $activity);
$this->logger->info('[integration-app] CRM update meeting', [
'activity' => $activity->getUuid(),
'crm_id' => $crmId,
'payload' => $payload,
]);
return $this->client->updateMeeting($crmId, $payload);
}
$payload['Description'] = $decorateActivity->generateDescription($activity);
$this->logger->info('[integration-app] CRM log meeting', [
'activity' => $activity->getUuid(),
'payload' => $payload,
]);
return $this->client->createMeeting($payload);
}
public function saveCall(Activity $activity): array
{
$decorateActivity = app(DecorateActivity::class);
$callPayload = [
'Call_Type' => $this->getCallType($activity),
'Call_Start_Time' => $activity->getActualStartTime()->toIso8601String(),
'Call_Duration' => $activity->getDuration(),
'name' => $decorateActivity->generateTitle($activity),
'ownerId' => $this->getActivityOwnerId($activity),
];
$payload = array_merge($callPayload, $this->attachToProspect($activity));
if ($activity->hasCrmProviderId()) {
$crmId = $activity->getCrmProviderId();
$call = $this->client->getCall($crmId);
$oldDescription = $call['fields']['Description'] ?? null;
$payload['description'] = $decorateActivity->generateUpdatedDescription($oldDescription, $activity);
$this->logger->info('[integration-app] CRM update call', [
'activity' => $activity->getUuid(),
'crm_id' => $crmId,
'payload' => $payload,
]);
return $this->client->updateCall($crmId, $payload);
}
$payload['description'] = $decorateActivity->generateDescription($activity);
$this->logger->info('[integration-app] CRM log call', [
'activity' => $activity->getUuid(),
'payload' => $payload,
]);
return $this->client->createCall($payload);
}
private function getCallType(Activity $activity): string
{
if ($activity->getStatus() === Activity::STATUS_NO_ANSWER) {
return self::CALL_TYPE_MISSED;
}
return $activity->getType() === Activity::TYPE_SOFTPHONE_INBOUND ? self::CALL_TYPE_INBOUND : self::CALL_TYPE_OUTBOUND;
}
private function attachToProspect(Activity $activity): array
{
$payload = [];
if ($activity->hasContact()) {
$payload['contactId'] = $activity->getContact()->getCrmProviderId();
}
if ($activity->hasOpportunity()) {
return array_merge(
$payload,
$this->buildBasicPayload(
self::RELATIONSHIP_OPPORTUNITY,
$activity->getOpportunity()->getCrmProviderId()
)
);
}
if ($activity->hasAccount() && ! $activity->getAccount()->getIsInternal()) {
return array_merge(
$payload,
$this->buildBasicPayload(
self::RELATIONSHIP_ACCOUNT,
$activity->getAccount()->getCrmProviderId()
)
);
}
if ($activity->hasLead()) {
$payload = $this->handleLeadPayload($activity);
}
return $payload;
}
private function handleLeadPayload(Activity $activity): array
{
$freshLead = $this->syncLead($activity->getLead()->getCrmProviderId());
$lead = $freshLead ?? $activity->getLead();
if ($lead->getConvertedAt() === null) {
return $this->buildBasicPayload(self::RELATIONSHIP_LEAD, $lead->getCrmProviderId());
}
$activity->lead_id = null;
if ($lead->hasAccount()) {
$account = $lead->getAccount();
$activity->account_id = $account->getId();
$payload = $this->buildBasicPayload(self::RELATIONSHIP_ACCOUNT, $account->getCrmProviderId());
} else {
$payload = [];
}
if ($lead->hasOpportunity()) {
$opportunity = $lead->getOpportunity();
$payload = $this->buildBasicPayload(self::RELATIONSHIP_OPPORTUNITY, $opportunity->getCrmProviderId());
$activity->opportunity_id = $opportunity->getId();
$activity->value = $opportunity->value;
$activity->stage_id = $opportunity->stage_id;
} else {
$activity->stage_id = null;
}
if ($lead->hasContact()) {
$contact = $lead->getContact();
$payload['contactId'] = $contact->getCrmProviderId();
$activity->contact_id = $contact->getId();
}
$activity->save();
event(new ActivityLeadConverted($activity, $lead));
$this->logger->info('[integration-app] Lead converted', [
'activityUuid' => $activity->getUuid(),
'leadUuid' => $lead->getUuid(),
]);
return $payload;
}
private function buildBasicPayload(string $type, string $id): array
{
return [
'type' => $type,
'id' => $id,
];
}
private function getActivityOwnerId(Activity $activity): ?string
{
$ownerId = null;
if ($activity->hasUser() && $activity->getUser()->getProfile() !== null) {
$ownerId = $activity->getUser()->getProfile()->getCrmProviderId();
}
return $ownerId;
}
#[\Override] public function saveFollowupActivity(Activity $activity, array $fields): ?string
{
$taskPayload = [
'subject' => $fields['subject'],
'dueTime' => isset($fields['dueDate']) ? Carbon::parse($fields['dueDate'])->format('Y-m-d') : null,
'ownerId' => $this->getActivityOwnerId($activity),
];
if (isset($fields['status'])) {
$taskPayload['status'] = $fields['status'];
}
if (isset($fields['priority'])) {
$taskPayload['priority'] = $fields['priority'];
}
if (isset($fields['content'])) {
$taskPayload['content'] = $fields['content'];
}
$payload = array_merge($taskPayload, $this->attachToProspect($activity));
$this->logger->info('[integration-app] CRM log follow up task', [
'activity' => $activity->getUuid(),
'payload' => $payload,
]);
$task = $this->client->createTask($payload);
return $task['id'] ?? null;
}
#[\Override] public function saveTranscriptionSummaryAsNote(
ActivityContract $activity,
string $title,
string $body,
?string $objectId,
?NoteObject $noteObject = null,
): ?string {
// We have to find a way to store the transcription summary
// This might be possible either by Tasks, Events, Engagements & Notes
// Find what the CRM supports and save the note with the appropriate object(eg Notes)
// For now use only Notes as both ZOHO & Salesforce support them.
if ($this->supportsNotes() && $objectId !== null) {
$this->logger->info('[integration-app] saving note', [
'activityId' => $activity->getUuid(),
'objectId' => $objectId,
]);
return $this->saveNote($title, $body, $objectId, $noteObject);
}
$this->logger->info('[integration-app] skip saveTranscriptionSummaryAsNote', [
'activityId' => $activity->getUuid(),
'supportsNotes' => $this->supportsNotes(),
'objectId' => $objectId,
]);
return null;
}
public function generateProviderUrl(string $providerId, string $objectType): ?string
{
return $this->getCrmUrlGenerator()?->generateProviderUrl($providerId, $objectType);
}
public function updateStage($crmObject, Stage $stage): void
{
$objectType = $stage->getType();
$objectId = $crmObject->getCrmProviderId();
$params = ['stageName' => $stage->getCrmProviderId()];
$this->logger->info('[integration-app] updateStage', [
'objectType' => $objectType,
'objectId' => $objectId,
'params' => $params,
]);
$data = [
'data' => $this->normalizeData($objectType, $params),
];
if ($objectType === Stage::TYPE_LEAD) {
$this->client->updateLead($objectId, $data);
} else {
$this->client->updateDeal($objectId, $data);
}
}
/**
* @throws \Exception
*/
public function fetchAndAssociateRelatedActivity(Activity $activity): ?Activity
{
if ($activity->getCrm()?->getEdition() !== IntegrationAppProviders::ZOHO_CRM) {
return null;
}
if (! $activity->isTypeConference()) {
return null;
}
// The related activity is already linked.
if ($activity->hasCrmProviderId()) {
return $activity;
}
if ($activity->hasActualStartTime() === false) {
return null;
}
return $this->fetchAndAssociateZohoRelatedActivity($activity);
}
public function fetchAndAssociateZohoRelatedActivity(Activity $activity): ?Activity
{
try {
$meeting = $this->fetchRelatedZohoActivity($activity);
if (empty($meeting)) {
$this->logger->info('[integration-app] fetchRelatedZohoActivity No related activity found', [
'activity' => $activity->getUuid(),
]);
return null;
}
$decorateActivity = app(DecorateActivity::class);
$oldDescription = $meeting['Description'] ?? '';
$updatedDescription = $decorateActivity->generateUpdatedDescription($oldDescription, $activity);
$this->logger->info('[integration-app] fetchAndAssociateZohoRelatedActivity updating related activity', [
'activity' => $activity->getUuid(),
'description' => $updatedDescription,
]);
$this->client->updateMeeting($meeting['id'], ['Description' => $updatedDescription]);
// Update our activity to reflect the remote data.
$activity->update([
'crm_provider_id' => $meeting['id'],
'summary' => $meeting['Description'],
]);
return $activity;
} catch (\Exception $exception) {
\Sentry::captureException($exception);
throw $exception;
}
}
public function fetchRelatedZohoActivity(Activity $activity): array
{
[$from, $to] = $this->getFromToDates($activity);
$start = $from?->toIso8601String(); // e.g., 2025-07-01T00:00:00+00:00
$end = $to?->toIso8601String(); // e.g., 2025-07-14T23:59:59+00:00
if ($start === null || $end === null) {
$this->logger->info(
'[integration-app] fetchRelatedZohoActivity missing start or end date',
[
'activity' => $activity->getUuid(),
'start' => $start,
'end' => $end,
'from' => $from,
'to' => $to,
]
);
return [];
}
$whoId = null;
$whatId = null;
$criteriaParts = [];
if ($activity->getContact()) {
$whoId = $activity->getContact()->getCrmProviderId();
$criteriaParts[] = "(Who_Id:equals:$whoId)";
}
if ($activity->getOpportunity()) {
$whatId = $activity->getOpportunity()->getCrmProviderId();
} elseif ($activity->getAccount() && $activity->getAccount()->getIsInternal() === false) {
$whatId = $activity->getAccount()->getCrmProviderId();
} elseif ($activity->getLead()) {
$whatId = $activity->getLead()->getCrmProviderId();
}
if ($whatId !== null) {
$criteriaParts[] = "(What_Id:equals:$whatId)";
}
if ($whoId === null && $whatId === null) {
$this->logger->info(
'[integration-app] fetchRelatedZohoActivity cannot find prospect',
[
'activity' => $activity->getUuid(),
]
);
return [];
}
$criteriaParts[] = "(Start_DateTime:greater_equal:$start)";
$criteriaParts[] = "(End_DateTime:less_equal:$end)";
$criteria = implode(' AND ', $criteriaParts);
$params = [
'criteria' => $criteria,
'sort_by' => 'Modified_Time',
'sort_order' => 'desc',
];
$this->logger->info(
'[integration-app] fetchRelatedZohoActivity searching for related activity',
[
'activity' => $activity->getUuid(),
'params' => $params,
]
);
$meetings = $this->client->searchMeetings($params);
if (! empty($meetings)) {
return $meetings[0];
}
return [];
}
private function getFromToDates(Activity $activity): array
{
$calendarEvent = $activity->calendarEvent()->first();
$from = $calendarEvent?->getStartTime();
$to = $calendarEvent?->getEndTime();
if (! $from || ! $to) {
$from = $activity->hasScheduledStartTime()
? $activity->getScheduledStartTime()
: $activity->getActualStartTime();
$to = $activity->hasScheduledEndTime()
? $activity->getScheduledEndTime()->addMinutes(15)
: $activity->getActualEndTime();
}
return [$from, $to];
}
}
Execute
Explain Plan
Browse Query History
View Parameters...
|
45538
|
NULL
|
NULL
|
NULL
|
|
45529
|
1627
|
48
|
2026-05-14T14:41:26.267907+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-14/1778 /Users/lukas/.screenpipe/data/data/2026-05-14/1778769686267_m1.jpg...
|
PhpStorm
|
faVsco.js – IntegrationApp/Service.php
|
1
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
PhpStormFileEditViewNavigateCodeLaravelRefactorRun PhpStormFileEditViewNavigateCodeLaravelRefactorRunToolsGitWindowHelp•FV faVsco.jsv* #12066 on JY-20725-handle-HS-search-rate-limit K vablU HandleHubspotRateLimitTest ~100% C* :8• Thu 14 May 17:41:25QProjectvSendReportJob.php• DeleteCrmEntityTrait.phpT WriteCrmTrait.php=custom.logDeleteAccountJob.phpImportActivityTypes.php> MetadataAccessors© Hubspot/DecorateActivity.phpIntegrationAppServiceTrait.phpIntegrationApp/Service.php xT AccountAccessor.php• BaseAccessor.php© IntegrationApp/DecorateActivity.php© Activity.php© Salesforce/Service.phpD LogActivityTrait.php• ContactAccessor.php© Pipedrive/Service.phpClose/Service.phpCopper/Service.php© BullhornService.phpDealAccessor.phpT ActivityPlaybookTrait.phpCrmHelperRepository.php© AccountController.php=.env.staging=.env18© IntegrationAppAccessExce• LeadAccessor.phpDetachActivityObject.phpRematchActivityOnCrmObjectDetach.phpMatchActivityCrmData.phpT MeetingAccessor.phpRegisterEventsAccessor.pt55• RemoteWriteAccessor.php413• SystemStateAccessor.php© HubspotPaginationService.php© HandleHubspotRateLimit.phpclass Service extendsBaseService implementspublic function saveMeeting(Activity $activity): arraypaycodu→ ppaycodu,T UserAccessor.php437D:• Арi438Config439return Sthis->client->updateMeeting($crmId, Spayload);O DTO440> O Filters441v D Jobs442$payload['Description'] = $decorateActivity->generateDescription(Sactivity);© CrmEntitiesFullSyncJob.ph 443© DeleteRemoteTeamJob.ph 444T IntegrationAppService Trait 445© SubscribeForEventsJob.ph446$this->logger->info('[integration-app] CRM log meeting', ['activity' => $activity->getUvid(),'payload' => $payload,© TeamInitialSyncJob.php4471):© UnsubscribeForEventsJob.448© UpdateProfileRelatedEntiti449return $this->client->createMeeting($payload);© ValidateTeamActiveConne450> ProspectSearchStrategy451> D ServiceTraits2 usages© DataClient.php© DecorateActivity.php452491public function saveCall(Activity $activity): array{..© LocalSearch.php1 usage• LocalSearchlnterface.phpC RemoteSearch.php492500private function getCallType(Activity $activity): string{...}© Service.php3 usagesv • ListenersC ConvertLeadActivities.php501535private function attachToProspect(Activity $activity): array{...}© Purnel onkunCache nhnWorkspace associated with branch 'JY-20725-handle-HS-search-rate-limit' has been restored // Rollback // Configure... (today 16:17)( RemoteWriteAccessor.php=laravel.logPlaybook.phpSF [jiminny@localhost]PlainTextDecorateActivity.phpA HS_local [jiminny@localho:4 console [QAI PROD] XClient.php4 console [PROD]A console (EU]B16 × 2DGo jiminny084143 ×4 л215•m_layout_id =2162,1661,66799,66217218219id = 33;_220_221222—223224id THEN '(own=225_226227228229230hubspot':-231232233 V= 11512582;234111W Windsurf Teams433:74UTF-8Ca 4 spaces...
|
NULL
|
3921354521730133984
|
NULL
|
visual_change
|
ocr
|
NULL
|
PhpStormFileEditViewNavigateCodeLaravelRefactorRun PhpStormFileEditViewNavigateCodeLaravelRefactorRunToolsGitWindowHelp•FV faVsco.jsv* #12066 on JY-20725-handle-HS-search-rate-limit K vablU HandleHubspotRateLimitTest ~100% C* :8• Thu 14 May 17:41:25QProjectvSendReportJob.php• DeleteCrmEntityTrait.phpT WriteCrmTrait.php=custom.logDeleteAccountJob.phpImportActivityTypes.php> MetadataAccessors© Hubspot/DecorateActivity.phpIntegrationAppServiceTrait.phpIntegrationApp/Service.php xT AccountAccessor.php• BaseAccessor.php© IntegrationApp/DecorateActivity.php© Activity.php© Salesforce/Service.phpD LogActivityTrait.php• ContactAccessor.php© Pipedrive/Service.phpClose/Service.phpCopper/Service.php© BullhornService.phpDealAccessor.phpT ActivityPlaybookTrait.phpCrmHelperRepository.php© AccountController.php=.env.staging=.env18© IntegrationAppAccessExce• LeadAccessor.phpDetachActivityObject.phpRematchActivityOnCrmObjectDetach.phpMatchActivityCrmData.phpT MeetingAccessor.phpRegisterEventsAccessor.pt55• RemoteWriteAccessor.php413• SystemStateAccessor.php© HubspotPaginationService.php© HandleHubspotRateLimit.phpclass Service extendsBaseService implementspublic function saveMeeting(Activity $activity): arraypaycodu→ ppaycodu,T UserAccessor.php437D:• Арi438Config439return Sthis->client->updateMeeting($crmId, Spayload);O DTO440> O Filters441v D Jobs442$payload['Description'] = $decorateActivity->generateDescription(Sactivity);© CrmEntitiesFullSyncJob.ph 443© DeleteRemoteTeamJob.ph 444T IntegrationAppService Trait 445© SubscribeForEventsJob.ph446$this->logger->info('[integration-app] CRM log meeting', ['activity' => $activity->getUvid(),'payload' => $payload,© TeamInitialSyncJob.php4471):© UnsubscribeForEventsJob.448© UpdateProfileRelatedEntiti449return $this->client->createMeeting($payload);© ValidateTeamActiveConne450> ProspectSearchStrategy451> D ServiceTraits2 usages© DataClient.php© DecorateActivity.php452491public function saveCall(Activity $activity): array{..© LocalSearch.php1 usage• LocalSearchlnterface.phpC RemoteSearch.php492500private function getCallType(Activity $activity): string{...}© Service.php3 usagesv • ListenersC ConvertLeadActivities.php501535private function attachToProspect(Activity $activity): array{...}© Purnel onkunCache nhnWorkspace associated with branch 'JY-20725-handle-HS-search-rate-limit' has been restored // Rollback // Configure... (today 16:17)( RemoteWriteAccessor.php=laravel.logPlaybook.phpSF [jiminny@localhost]PlainTextDecorateActivity.phpA HS_local [jiminny@localho:4 console [QAI PROD] XClient.php4 console [PROD]A console (EU]B16 × 2DGo jiminny084143 ×4 л215•m_layout_id =2162,1661,66799,66217218219id = 33;_220_221222—223224id THEN '(own=225_226227228229230hubspot':-231232233 V= 11512582;234111W Windsurf Teams433:74UTF-8Ca 4 spaces...
|
45527
|
NULL
|
NULL
|
NULL
|
|
45528
|
1628
|
36
|
2026-05-14T14:41:22.874094+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-14/1778 /Users/lukas/.screenpipe/data/data/2026-05-14/1778769682874_m2.jpg...
|
PhpStorm
|
faVsco.js – IntegrationApp/Service.php
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
ActivityFilesLaterJiminny... ~@ jiminny-x-integrat ActivityFilesLaterJiminny... ~@ jiminny-x-integrati& platform-inner-team© Channels# ai-chapter# alertsi backend# bugscontusion-cllnia# curiosity_lab# engineering# general# jiminny-bg# platform-tickets# product_launches# random# releases# sofia-office# support# thank-yous# the people of iimi..• Direct messages8. A...• A3 62P. Galya Dimitrova Mvasil Vasilevf. Stefka Stoyanova%: Todor Stamatovf. Mario GeorgievP. Nikolay Ivanov2o James Graham "2. Stoyan Tanev. Steliyan Georgiev. Petko Kashinski*. Lukas Kovali...a: Apps® ToastS lira Gloud6 Huddle with Aneliya Angelova& R. Aneliya Angelova •• Messagest Add canvasur FilesAneliya Angelova 2:30 PMЛукаш, само при Сейлсфорс и Хубспот се синкваха активити типовете, когато се направи плейбук,нали?пои останалите скМі тоябва оъчно ла се въвелат.Lukas Kovalik 2:47 PMтряова да се за всички, някьде не се ли попьлвапри зохо май беше hardcoded но май и там си връщаха две категорииAneliya Angelova @ 4:00 PMЛукаш имаш ли време да се чуем за тестването на https://jiminny.atlassian.net/browse/JY-20725X Preview insackt[HubSpot] Optimise CRM rematctC OpenReady for QA- MediumAA Aneliya AngelovaAs of today at 4:00 PM RetreshOpen in Jira+ SummariseLukas Kovalik 4:02 PMzean-iurwiniareelYou joined the huddle LIVE 4:06 PMAneliva Angelova is here toolAneliya Angelova 4:44 PM11512582Lukas Kovalik O 5:16 PMcurl --location "httns:ani.hubani.com/crm/v3/obiects/contacts/search--header 'Content-Type: application/json'\--header "Authorization: BearerC|Kvma?iMx7OINOM8kOFwrAowAcAkUAhIR24?A05D?xiVrIYMILuP6SA01Kwcmhr=n.v2 hytorDniMvDalYck-CMalovolNOM9kOFwrAUAcrkcaws-ThwRARIRAOF-ATFSAOFRAO-ROIEBAQUBEggBAQEBAYICFIґ7Au8O2Nwal9YW2CbCCxYvwngmSgNldTFSAFoAYABoAHAAeAA'\--data "{ "limit", 13'Message Aneliva Angelova+ AaIAl Notes: OffLeave~ (Q SearchDate ModifiedYesterdav at 13.35Yesterday at 13:35Yesterday at 13.34Yesterdav at 13:33Yesterday at 13:32Yesterdav at 13:37Yesterday at 13:31Yesterday at 13.30Yesterday at 13:30Yesterday at 13:29resterday at 15.4gYesterdav at 13:28Yesterday at 13:28Yesterday at 13:27Yesterday at 13:26resterday at 13-4oYesterdav at 13:25Yesterday at 13:24Yesterday at 13:24Yesterday at 13:23Yesterday at 13:22Yesterday at 13.21Yesterdav at 13:20Yesterday at 13:20Yesterday at 13:19Yesterday at 13:19Yesterday at 13:18Yesterday at 13.17Yecterdav at 12:17Yesterday at 13:16Yesterday at 13-10Yesterdav at 13:15Yesterday at 13:15Yesterday at 13:14Yecterdav at 12:12Yesterday at 13.12Yesterdav at 13:12Yesterday at 13:11Yesterday at 13:10Yoctorday at 12:10Yesterday at 13:09Yesterday at 13.09Yocterdav at 12:081Yesterday at 13:08Yesterdav at 13:071S K:MPEG-4 movie16 KBMPEG-4 movie17 KB29 Kb6 KEMPEG-4 movieMPEG-4 movie12 KB9 KBMPE0"4 movie7 K:8 KBMPEG-4 movie37 KB10 KbMP2G-4 movie7 KBMPEG-4 movie8 KBMPEG-4 movie8 K:72 KBMPEG-4 movie14 KB13 K:O KRIMPEG-4 movieMPEG-4 movie18 KB12 KBMPEG-4 movie10 KEMPEG-4 movie16 KB MPEG-4 movie6 KB6 KB1MPEG-4 movie12 KBMPEG-4 movie23 KB8 KBMPEG-4 movie6KEMPEG-4 movie6 KBMPEG-4 movie11 KB11 K:MPEG-4 movie20 KBMPEG-4 movie10 KBMPEG-4 movie7 KPMPEG-4 movie5 KBMPEG-4 movie11 KBMPEG-4 movie26 KBMPEG-4 movie111 KBMPEG-4 movie102 KB88 KBMPEG-4 movieKO KRMDEG-A movie98 KBMPEG-4 movie97 KBMPEG-4 movie66 K:MPEG-A movie44 KB MPEG-4 movie93 KB78 KB50 kpMPEG-4 movieMPEG-4 movie58 KB27 KBMPEG-4 movie7KP12 KBMPEG-4 movie32 KB17 K8MPEG-4 movieFavouritesE jiminny© Recents* ApplicationsiCloudiCloud Drive228 Sync folderQ DXP4800PLUS-B5FA@ Network|• CRMI• Orange• Red• Yellow• Green• Purple•) All lags..lohlDownloadsNameLoom.pkgAlfred copv.alfredoreterencesB KeychronAssist-1.0.2 (1).dmgA Keychron Assist-1.0.2.dmgmazanoke-images-yWJo.zioPhotos-3-001.zipD Transcript.pdf→mage U.loge1 Orioninstaller.dmaimage.jpg- image (2).1pc• ПО-22221726037035-004-001_ORGES.pdf• %D0%9F%D0%9E-22221726037035-004-001_archive.zipПO-22221726037035-004-001_archive (1).zipD report(2) xmlAltred copy2.altredoreterences05012026_0000000026574472_ SWIFT_OB70501260015890.pdf27022026_0000000026574472_SWIFT_OB72702260049200.pdf= 03042026 [CREDIT_CARD] SWIFT [CREDIT_CARD].001B reporti) xm=pdt.odipdf-1.pdfD pdf-2.pdf-pdf-5.pd1= ndf-1 ndipdf-3.pdfKoválik Family Tree.gedbitwarden export 20251031122528.isonKoválik Family Tree.zip*macOS Storage_Cleanup.mdal favicon icofirst_aid_notes_complete.docxrenortl2).esvconfig.ymlIteration run Search HS.postman_collection.jsonm licence hettertouchtoalMariusHosting Config.json1ooks-891a6503-bbb7-4b2b-9c3.csv•Alfredmazanoke-images-YWJ6ана Ковалик.jpg•искане даниел Ковалик..pa• Фактура Март Даниел Ковалик.jрс• Фактура Април Даниел Ковалик.jpg• Dhotac 2.001Q SearchKind00,4 MDinstdlle..dckage55.9 MBAlfred...ferences10,1 MBDisk Image10,1 MBDisk ImageIL MBLiP archive6,6 MBZIP archive2,5 MB PDF Document2,5 MBJreo lmage2.2 MBDisk Image2,2 MB PDF Document2 MBJPEG image1,9 MBJPEG imaqe192 KBPDF Document140 KbZIP archive148 KВ148 KB122 KB111 KB94 KBZIP archivelZIP archiveXML documentAlfred...ferencesPDF Document92 KBPDr DocumentPDF Document91 KB91 KB30 KB29 KBXML documentPDF Document28 KBPDF Document28 KR28 KB27 KB14 KB11 KB6 KB6KBPDE DocumentDocumentJSONICSV DocumentZIP archiveMarkdo…..ument5KRWindo...n image4 KB3 KBword ..cumentCSV Document2 KBYAML document1 KBcSV Document928 byteshttlicence183 bytesZero butesJSONAlfred.. ferencesZero bytesFolde1,9 MB1,8 MB17 MB1,7 MBColdorJPEG imageJPEG ImageIPEG imadeJPEG imageColdo1 of 58 selected, 8.41 GB availabld• Inu 14 Mаy 1/.41-L4Date AddedIs Mdl ZUzo dl 19:4530 Jan 2026 at 12:3617 Mar 2026 at 20:2717 Mar 2026 at 20:26Z3 Aor 2020 al 13:0229 Jan 2026 at 15:2019 Dec 2025 at 10:1619 Dec 2025 at 12:238 Aor 2026 at 20:3519 Dec 2025 at 10:2919 Dec 2025 at 12:1819 Dec 2025 at 12:4026 Mar 2026 at 11:2410 May 2026 at 13:5326 Mar 2026 at 11:2426 Mar 2026 at 11:2426 Mar 2026 at 11:2310 May 2026 at 14:3730 Jan 2026 at 12:3713 Feb 2026 at 11:54Z3 Apr 2026 at 13.0823 Aor 2026 at 13:0810 May 2026 at 13:5410 May 2026 at 14:3710 May 2026 at 13:4910 May 2026 at 13:5010 May 2026 at 13:5110 Mav 2026 at 12:51110 May 2026 at 13:5019 Dec 2025 at 11:3431 Oct 2025 at 12:2525 Nov 2025 at 17:596 Mar 2026 at 11.2224 Anr 2026 at 16:5220 Oct 2025 at 11:0218 Mar 2026 at 15:29• Mav 2026 at 11:09129 Oct 2025 at 19:329 May 2026 at 10:0418 Mar 2026 at 11:5510 May 2026 at 13:5712 Jun 2025 at 19:0430 Jan 2026 at 12:3630 Jan 2026 at 12:3616 Oct 2025 aт 16:0123 Apr 2026 at 13:0223 Apr 2026 at 13:0223 Apr 2026 at 13:0222 Anr 2026 at 12:0223 Apr 2026 at 13:0229 Jan 2026 at 15:20...
|
NULL
|
-7567659445726155218
|
NULL
|
click
|
ocr
|
NULL
|
ActivityFilesLaterJiminny... ~@ jiminny-x-integrat ActivityFilesLaterJiminny... ~@ jiminny-x-integrati& platform-inner-team© Channels# ai-chapter# alertsi backend# bugscontusion-cllnia# curiosity_lab# engineering# general# jiminny-bg# platform-tickets# product_launches# random# releases# sofia-office# support# thank-yous# the people of iimi..• Direct messages8. A...• A3 62P. Galya Dimitrova Mvasil Vasilevf. Stefka Stoyanova%: Todor Stamatovf. Mario GeorgievP. Nikolay Ivanov2o James Graham "2. Stoyan Tanev. Steliyan Georgiev. Petko Kashinski*. Lukas Kovali...a: Apps® ToastS lira Gloud6 Huddle with Aneliya Angelova& R. Aneliya Angelova •• Messagest Add canvasur FilesAneliya Angelova 2:30 PMЛукаш, само при Сейлсфорс и Хубспот се синкваха активити типовете, когато се направи плейбук,нали?пои останалите скМі тоябва оъчно ла се въвелат.Lukas Kovalik 2:47 PMтряова да се за всички, някьде не се ли попьлвапри зохо май беше hardcoded но май и там си връщаха две категорииAneliya Angelova @ 4:00 PMЛукаш имаш ли време да се чуем за тестването на https://jiminny.atlassian.net/browse/JY-20725X Preview insackt[HubSpot] Optimise CRM rematctC OpenReady for QA- MediumAA Aneliya AngelovaAs of today at 4:00 PM RetreshOpen in Jira+ SummariseLukas Kovalik 4:02 PMzean-iurwiniareelYou joined the huddle LIVE 4:06 PMAneliva Angelova is here toolAneliya Angelova 4:44 PM11512582Lukas Kovalik O 5:16 PMcurl --location "httns:ani.hubani.com/crm/v3/obiects/contacts/search--header 'Content-Type: application/json'\--header "Authorization: BearerC|Kvma?iMx7OINOM8kOFwrAowAcAkUAhIR24?A05D?xiVrIYMILuP6SA01Kwcmhr=n.v2 hytorDniMvDalYck-CMalovolNOM9kOFwrAUAcrkcaws-ThwRARIRAOF-ATFSAOFRAO-ROIEBAQUBEggBAQEBAYICFIґ7Au8O2Nwal9YW2CbCCxYvwngmSgNldTFSAFoAYABoAHAAeAA'\--data "{ "limit", 13'Message Aneliva Angelova+ AaIAl Notes: OffLeave~ (Q SearchDate ModifiedYesterdav at 13.35Yesterday at 13:35Yesterday at 13.34Yesterdav at 13:33Yesterday at 13:32Yesterdav at 13:37Yesterday at 13:31Yesterday at 13.30Yesterday at 13:30Yesterday at 13:29resterday at 15.4gYesterdav at 13:28Yesterday at 13:28Yesterday at 13:27Yesterday at 13:26resterday at 13-4oYesterdav at 13:25Yesterday at 13:24Yesterday at 13:24Yesterday at 13:23Yesterday at 13:22Yesterday at 13.21Yesterdav at 13:20Yesterday at 13:20Yesterday at 13:19Yesterday at 13:19Yesterday at 13:18Yesterday at 13.17Yecterdav at 12:17Yesterday at 13:16Yesterday at 13-10Yesterdav at 13:15Yesterday at 13:15Yesterday at 13:14Yecterdav at 12:12Yesterday at 13.12Yesterdav at 13:12Yesterday at 13:11Yesterday at 13:10Yoctorday at 12:10Yesterday at 13:09Yesterday at 13.09Yocterdav at 12:081Yesterday at 13:08Yesterdav at 13:071S K:MPEG-4 movie16 KBMPEG-4 movie17 KB29 Kb6 KEMPEG-4 movieMPEG-4 movie12 KB9 KBMPE0"4 movie7 K:8 KBMPEG-4 movie37 KB10 KbMP2G-4 movie7 KBMPEG-4 movie8 KBMPEG-4 movie8 K:72 KBMPEG-4 movie14 KB13 K:O KRIMPEG-4 movieMPEG-4 movie18 KB12 KBMPEG-4 movie10 KEMPEG-4 movie16 KB MPEG-4 movie6 KB6 KB1MPEG-4 movie12 KBMPEG-4 movie23 KB8 KBMPEG-4 movie6KEMPEG-4 movie6 KBMPEG-4 movie11 KB11 K:MPEG-4 movie20 KBMPEG-4 movie10 KBMPEG-4 movie7 KPMPEG-4 movie5 KBMPEG-4 movie11 KBMPEG-4 movie26 KBMPEG-4 movie111 KBMPEG-4 movie102 KB88 KBMPEG-4 movieKO KRMDEG-A movie98 KBMPEG-4 movie97 KBMPEG-4 movie66 K:MPEG-A movie44 KB MPEG-4 movie93 KB78 KB50 kpMPEG-4 movieMPEG-4 movie58 KB27 KBMPEG-4 movie7KP12 KBMPEG-4 movie32 KB17 K8MPEG-4 movieFavouritesE jiminny© Recents* ApplicationsiCloudiCloud Drive228 Sync folderQ DXP4800PLUS-B5FA@ Network|• CRMI• Orange• Red• Yellow• Green• Purple•) All lags..lohlDownloadsNameLoom.pkgAlfred copv.alfredoreterencesB KeychronAssist-1.0.2 (1).dmgA Keychron Assist-1.0.2.dmgmazanoke-images-yWJo.zioPhotos-3-001.zipD Transcript.pdf→mage U.loge1 Orioninstaller.dmaimage.jpg- image (2).1pc• ПО-22221726037035-004-001_ORGES.pdf• %D0%9F%D0%9E-22221726037035-004-001_archive.zipПO-22221726037035-004-001_archive (1).zipD report(2) xmlAltred copy2.altredoreterences05012026_0000000026574472_ SWIFT_OB70501260015890.pdf27022026_0000000026574472_SWIFT_OB72702260049200.pdf= 03042026 [CREDIT_CARD] SWIFT [CREDIT_CARD].001B reporti) xm=pdt.odipdf-1.pdfD pdf-2.pdf-pdf-5.pd1= ndf-1 ndipdf-3.pdfKoválik Family Tree.gedbitwarden export 20251031122528.isonKoválik Family Tree.zip*macOS Storage_Cleanup.mdal favicon icofirst_aid_notes_complete.docxrenortl2).esvconfig.ymlIteration run Search HS.postman_collection.jsonm licence hettertouchtoalMariusHosting Config.json1ooks-891a6503-bbb7-4b2b-9c3.csv•Alfredmazanoke-images-YWJ6ана Ковалик.jpg•искане даниел Ковалик..pa• Фактура Март Даниел Ковалик.jрс• Фактура Април Даниел Ковалик.jpg• Dhotac 2.001Q SearchKind00,4 MDinstdlle..dckage55.9 MBAlfred...ferences10,1 MBDisk Image10,1 MBDisk ImageIL MBLiP archive6,6 MBZIP archive2,5 MB PDF Document2,5 MBJreo lmage2.2 MBDisk Image2,2 MB PDF Document2 MBJPEG image1,9 MBJPEG imaqe192 KBPDF Document140 KbZIP archive148 KВ148 KB122 KB111 KB94 KBZIP archivelZIP archiveXML documentAlfred...ferencesPDF Document92 KBPDr DocumentPDF Document91 KB91 KB30 KB29 KBXML documentPDF Document28 KBPDF Document28 KR28 KB27 KB14 KB11 KB6 KB6KBPDE DocumentDocumentJSONICSV DocumentZIP archiveMarkdo…..ument5KRWindo...n image4 KB3 KBword ..cumentCSV Document2 KBYAML document1 KBcSV Document928 byteshttlicence183 bytesZero butesJSONAlfred.. ferencesZero bytesFolde1,9 MB1,8 MB17 MB1,7 MBColdorJPEG imageJPEG ImageIPEG imadeJPEG imageColdo1 of 58 selected, 8.41 GB availabld• Inu 14 Mаy 1/.41-L4Date AddedIs Mdl ZUzo dl 19:4530 Jan 2026 at 12:3617 Mar 2026 at 20:2717 Mar 2026 at 20:26Z3 Aor 2020 al 13:0229 Jan 2026 at 15:2019 Dec 2025 at 10:1619 Dec 2025 at 12:238 Aor 2026 at 20:3519 Dec 2025 at 10:2919 Dec 2025 at 12:1819 Dec 2025 at 12:4026 Mar 2026 at 11:2410 May 2026 at 13:5326 Mar 2026 at 11:2426 Mar 2026 at 11:2426 Mar 2026 at 11:2310 May 2026 at 14:3730 Jan 2026 at 12:3713 Feb 2026 at 11:54Z3 Apr 2026 at 13.0823 Aor 2026 at 13:0810 May 2026 at 13:5410 May 2026 at 14:3710 May 2026 at 13:4910 May 2026 at 13:5010 May 2026 at 13:5110 Mav 2026 at 12:51110 May 2026 at 13:5019 Dec 2025 at 11:3431 Oct 2025 at 12:2525 Nov 2025 at 17:596 Mar 2026 at 11.2224 Anr 2026 at 16:5220 Oct 2025 at 11:0218 Mar 2026 at 15:29• Mav 2026 at 11:09129 Oct 2025 at 19:329 May 2026 at 10:0418 Mar 2026 at 11:5510 May 2026 at 13:5712 Jun 2025 at 19:0430 Jan 2026 at 12:3630 Jan 2026 at 12:3616 Oct 2025 aт 16:0123 Apr 2026 at 13:0223 Apr 2026 at 13:0223 Apr 2026 at 13:0222 Anr 2026 at 12:0223 Apr 2026 at 13:0229 Jan 2026 at 15:20...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
45527
|
1627
|
47
|
2026-05-14T14:41:22.860846+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-14/1778 /Users/lukas/.screenpipe/data/data/2026-05-14/1778769682860_m1.jpg...
|
PhpStorm
|
faVsco.js – IntegrationApp/Service.php
|
1
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
PhpStormFileEditViewNavigateCodeLaravelRefactorRun PhpStormFileEditViewNavigateCodeLaravelRefactorRunToolsGitWindowHelpFV faVsco.jsv#12066 on JY-20725-handle-HS-search-rate-limit k vlhlU HandleHubspotRateLimitTest ~100% (C478• Thu 14 May 17:41:22* :QProjectv• DeleteCrmEntityTrait.phpDeleteAccountJob.phpImportActivityTypes.phpT WriteCrmTrait.php=custom.logSendReportJob.php> MetadataAccessors© Hubspot/DecorateActivity.phpIntegrationAppServiceTrait.phpIntegrationApp/Service.php X© RemoteWriteAccessor.php=laravel.logT AccountAccessor.php• BaseAccessor.php© IntegrationApp/DecorateActivity.php© Activity.php© Salesforce/Service.phpD LogActivityTrait.phpPlaybook.phpSF [jiminny@localhost]• ContactAccessor.php© Pipedrive/Service.phpClose/Service.phpCopper/Service.php© BullhornService.phpPlainTextDecorateActivity.phpA HS_local [jiminny@localho:WDealAccessor.php© ActivityPlaybookTrait.phpCrmHelperRepository.php© AccountController.php=.env.staging.env4 console [QAI PROD] X18.••© IntegrationAppAccessExce• LeadAccessor.phpDetachActivityObject.phpRematchActivityOnCrmObjectDetach.phpMatchActivityCrmData.phpClient.php4 console [PROD]T MeetingAccessor.phpRegisterEventsAccessor.pt• RemoteWriteAccessor.php413© HubspotPaginationService.php© HandleHubspotRateLimit.phpclass Service extends BaseService implementspublic function saveMeeting(Activity $activity): arrayA console (EU]55B16 × 2• SystemStateAccessor.phpT UserAccessor.php418• Арi419Config420O DTO421'Event_Title' => $decorateActivity->generateTitle(Sactivity),'Start_DateTime' => Sactivity->getActualStartTime()->toIs08601String(),'End_DateTime' => $activity->getActualEndTime()->toIso8601StringO,'ownerid' => Sthis->getActivity0wnerId(Sactivity),> O Filters422v d Jobs423© CrmEntitiesFullSyncJob.ph 424Spayload = array_merge($meetingPayload, $this->attachToProspect(Sactivity));© DeleteRemoteTeamJob.ph425T IntegrationAppService Trait 426© SubscribeForEventsJob.ph427© TeamInitialSyncJob.php428if ($activity->hasCrmProviderId)) {$crmId =Sactivity->getCrmProviderId();Smeeting = $this->client->getMeeting(ScrmId);© UnsubscribeForEventsJob.429© UpdateProfileRelatedEntiti430|© ValidateTeamActiveConne431$oldDescription = $meeting['fields']['Description'] ?? null;$payLoad[ 'Description'] = $decorateActivity->generateUpdatedDescription($oldDescription, $activity228> C ProspectSearchStrategy432> D ServiceTraits433© DataClient.php434© DecorateActivity.php435© LocalSearch.php436• LocalSearchlnterface.php4371):$this->logger-›info('[integration-app]CRM update meeting', l'activity' => $activity->getUuid(),'crm_id'=> $crmId,'payload' => $payload,Extract SurroundCascade 8e TlCommand 881//DGo jiminny084143 ×4 л215•m_layout_id =2162,1661,66799,66217218219.id = 33;_220-221222-223224id THEN '(own=225_226227229230hubspot':-231232233V= 11512582;234C RemoteSearch.php438© Service.php439retuv • Listeners440Customize Toolbar...Don't Show Toolbar1(ScrmId,Spayload);C ConvertLeadActivities.php441© Purnel onkunCache nhn442$payload['Description'] = $decorateActivity->generateDescription(Sactivity):Workspace associated with branch 'JY-20725-handle-HS-search-rate-limit' has been restored // Rollback // Configure... (today 16:17)W Windsurf Teams436:25 (96 chars, 2 line breaks)UTF-8Ca 4 spaces...
|
NULL
|
-7393957048253194855
|
NULL
|
click
|
ocr
|
NULL
|
PhpStormFileEditViewNavigateCodeLaravelRefactorRun PhpStormFileEditViewNavigateCodeLaravelRefactorRunToolsGitWindowHelpFV faVsco.jsv#12066 on JY-20725-handle-HS-search-rate-limit k vlhlU HandleHubspotRateLimitTest ~100% (C478• Thu 14 May 17:41:22* :QProjectv• DeleteCrmEntityTrait.phpDeleteAccountJob.phpImportActivityTypes.phpT WriteCrmTrait.php=custom.logSendReportJob.php> MetadataAccessors© Hubspot/DecorateActivity.phpIntegrationAppServiceTrait.phpIntegrationApp/Service.php X© RemoteWriteAccessor.php=laravel.logT AccountAccessor.php• BaseAccessor.php© IntegrationApp/DecorateActivity.php© Activity.php© Salesforce/Service.phpD LogActivityTrait.phpPlaybook.phpSF [jiminny@localhost]• ContactAccessor.php© Pipedrive/Service.phpClose/Service.phpCopper/Service.php© BullhornService.phpPlainTextDecorateActivity.phpA HS_local [jiminny@localho:WDealAccessor.php© ActivityPlaybookTrait.phpCrmHelperRepository.php© AccountController.php=.env.staging.env4 console [QAI PROD] X18.••© IntegrationAppAccessExce• LeadAccessor.phpDetachActivityObject.phpRematchActivityOnCrmObjectDetach.phpMatchActivityCrmData.phpClient.php4 console [PROD]T MeetingAccessor.phpRegisterEventsAccessor.pt• RemoteWriteAccessor.php413© HubspotPaginationService.php© HandleHubspotRateLimit.phpclass Service extends BaseService implementspublic function saveMeeting(Activity $activity): arrayA console (EU]55B16 × 2• SystemStateAccessor.phpT UserAccessor.php418• Арi419Config420O DTO421'Event_Title' => $decorateActivity->generateTitle(Sactivity),'Start_DateTime' => Sactivity->getActualStartTime()->toIs08601String(),'End_DateTime' => $activity->getActualEndTime()->toIso8601StringO,'ownerid' => Sthis->getActivity0wnerId(Sactivity),> O Filters422v d Jobs423© CrmEntitiesFullSyncJob.ph 424Spayload = array_merge($meetingPayload, $this->attachToProspect(Sactivity));© DeleteRemoteTeamJob.ph425T IntegrationAppService Trait 426© SubscribeForEventsJob.ph427© TeamInitialSyncJob.php428if ($activity->hasCrmProviderId)) {$crmId =Sactivity->getCrmProviderId();Smeeting = $this->client->getMeeting(ScrmId);© UnsubscribeForEventsJob.429© UpdateProfileRelatedEntiti430|© ValidateTeamActiveConne431$oldDescription = $meeting['fields']['Description'] ?? null;$payLoad[ 'Description'] = $decorateActivity->generateUpdatedDescription($oldDescription, $activity228> C ProspectSearchStrategy432> D ServiceTraits433© DataClient.php434© DecorateActivity.php435© LocalSearch.php436• LocalSearchlnterface.php4371):$this->logger-›info('[integration-app]CRM update meeting', l'activity' => $activity->getUuid(),'crm_id'=> $crmId,'payload' => $payload,Extract SurroundCascade 8e TlCommand 881//DGo jiminny084143 ×4 л215•m_layout_id =2162,1661,66799,66217218219.id = 33;_220-221222-223224id THEN '(own=225_226227229230hubspot':-231232233V= 11512582;234C RemoteSearch.php438© Service.php439retuv • Listeners440Customize Toolbar...Don't Show Toolbar1(ScrmId,Spayload);C ConvertLeadActivities.php441© Purnel onkunCache nhn442$payload['Description'] = $decorateActivity->generateDescription(Sactivity):Workspace associated with branch 'JY-20725-handle-HS-search-rate-limit' has been restored // Rollback // Configure... (today 16:17)W Windsurf Teams436:25 (96 chars, 2 line breaks)UTF-8Ca 4 spaces...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
45526
|
1628
|
35
|
2026-05-14T14:41:16.707402+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-14/1778 /Users/lukas/.screenpipe/data/data/2026-05-14/1778769676707_m2.jpg...
|
PhpStorm
|
faVsco.js – IntegrationApp/Service.php
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
ActivityFilesLaterJiminny... ~@ jiminny-x-integrat ActivityFilesLaterJiminny... ~@ jiminny-x-integrati& platform-inner-team© Channels# ai-chapter# alertsi backend# bugscontusion-cllnia# curiosity_lab# engineering# general# jiminny-bg# platform-tickets# product_launches# random# releases# sofia-office# support# thank-yous# the people of iimi..• Direct messages8. A...• A3 62P. Galya Dimitrova Mvasil Vasilevf. Stefka Stoyanova%: Todor Stamatovf. Mario GeorgievP. Nikolay Ivanov2o James Graham "2. Stoyan Tanev. Steliyan Georgiev. Petko Kashinski*. Lukas Kovali...a: Apps® ToastS lira Gloud6 Huddle with Aneliya Angelova& R. Aneliya Angelova •• Messagest Add canvasur FilesAneliya Angelova 2:30 PMЛукаш, само при Сейлсфорс и Хубспот се синкваха активити типовете, когато се направи плейбук,нали?пои останалите скМі тоябва оъчно ла се въвелат.Lukas Kovalik 2:47 PMтряова да се за всички, някьде не се ли попьлвапри зохо май беше hardcoded но май и там си връщаха две категорииAneliya Angelova @ 4:00 PMЛукаш имаш ли време да се чуем за тестването на https://jiminny.atlassian.net/browse/JY-20725X Preview insackt[HubSpot] Optimise CRM rematctC OpenReady for QA- MediumAA Aneliya AngelovaAs of today at 4:00 PM RetreshOpen in Jira+ SummariseLukas Kovalik 4:02 PMzean-iurwiniareelYou joined the huddle LIVE 4:06 PMAneliva Angelova is here toolAneliya Angelova 4:44 PM11512582Lukas Kovalik O 5:16 PMcurl --location "httns:ani.hubani.com/crm/v3/obiects/contacts/search--header 'Content-Type: application/json'\--header "Authorization: BearerC|Kvma?iMx7OINOM8kOFwrAowAcAkUAhIR24?A05D?xiVrIYMILuP6SA01Kwcmhr=n.v2 hytorDniMvDalYck-CMalovolNOM9kOFwrAUAcrkcaws-ThwRARIRAOF-ATFSAOFRAO-ROIEBAQUBEggBAQEBAYICFIґ7Au8O2Nwal9YW2CbCCxYvwngmSgNldTFSAFoAYABoAHAAeAA'\--data "{ "limit", 13'Message Aneliva Angelova+ AaIAl Notes: OffLeave~ (Q SearchDate ModifiedYesterdav at 13.35Yesterday at 13:35Yesterday at 13.34Yesterdav at 13:33Yesterday at 13:32Yesterdav at 13:37Yesterday at 13:31Yesterday at 13.30Yesterday at 13:30Yesterday at 13:29resterday at 15.4gYesterdav at 13:28Yesterday at 13:28Yesterday at 13:27Yesterday at 13:26resterday at 13-4oYesterdav at 13:25Yesterday at 13:24Yesterday at 13:24Yesterday at 13:23Yesterday at 13:22Yesterday at 13.21Yesterdav at 13:20Yesterday at 13:20Yesterday at 13:19Yesterday at 13:19Yesterday at 13:18Yesterday at 13.17Yecterdav at 12:17Yesterday at 13:16Yesterday at 13-10Yesterdav at 13:15Yesterday at 13:15Yesterday at 13:14Yecterdav at 12:12Yesterday at 13.12Yesterdav at 13:12Yesterday at 13:11Yesterday at 13:10Yoctorday at 12:10Yesterday at 13:09Yesterday at 13.09Yocterdav at 12:081Yesterday at 13:08Yesterdav at 13:071S K:MPEG-4 movie16 KBMPEG-4 movie17 KB29 Kb6 KEMPEG-4 movieMPEG-4 movie12 KB9 KBMPE0"4 movie7 K:8 KBMPEG-4 movie37 KB10 KbMP2G-4 movie7 KBMPEG-4 movie8 KBMPEG-4 movie8 K:72 KBMPEG-4 movie14 KB13 K:O KRIMPEG-4 movieMPEG-4 movie18 KB12 KBMPEG-4 movie10 KEMPEG-4 movie16 KB MPEG-4 movie6 KB6 KB1MPEG-4 movie12 KBMPEG-4 movie23 KB8 KBMPEG-4 movie6KEMPEG-4 movie6 KBMPEG-4 movie11 KB11 K:MPEG-4 movie20 KBMPEG-4 movie10 KBMPEG-4 movie7 KPMPEG-4 movie5 KBMPEG-4 movie11 KBMPEG-4 movie26 KBMPEG-4 movie111 KBMPEG-4 movie102 KB88 KBMPEG-4 movieKO KRMDEG-A movie98 KBMPEG-4 movie97 KBMPEG-4 movie66 K:MPEG-A movie44 KB MPEG-4 movie93 KB78 KB50 kpMPEG-4 movieMPEG-4 movie58 KB27 KBMPEG-4 movie7KP12 KBMPEG-4 movie32 KB17 K8MPEG-4 movieFavouritesE jiminny© Recents* ApplicationsiCloudiCloud Drive228 Sync folderQ DXP4800PLUS-B5FA@ Network_• CRMI• Orange• Red• Yellow• Green• Purple•) All lags..lohlDownloadsNameLoom.pkgAlfred copv.alfredoreterencesB KeychronAssist-1.0.2 (1).dmgA Keychron Assist-1.0.2.dmgmazanoke-images-yWJo.zioPhotos-3-001.zipD Transcript.pdf→mage U.loge1 Orioninstaller.dmaimage.jpg- image (2).1pc• ПО-22221726037035-004-001_ORGES.pdf• %D0%9F%D0%9E-22221726037035-004-001_archive.zipПO-22221726037035-004-001_archive (1).zip• repon 4).XmAltred copy2.altredoreterences05012026_0000000026574472_ SWIFT_OB70501260015890.pdf27022026_0000000026574472_SWIFT_OB72702260049200.pdf= 03042026 [CREDIT_CARD] SWIFT [CREDIT_CARD].001B reporti) xm=pdt.odipdf-1.pdfD pdf-2.pdf-pdf-5.pd1= ndf-1 ndipdf-3.pdfKoválik Family Tree.gedbitwarden export 20251031122528.isonKoválik Family Tree.zip*macOS Storage_Cleanup.mdal favicon icofirst_aid_notes_complete.docxrenortl2).esvconfig.ymlIteration run Search HS.postman_collection.jsonm licence hettertouchtoalMariusHosting Config.json1ooks-891a6503-bbb7-4b2b-9c3.csv•Alfredmazanoke-images-YWJ6ана Ковалик.jpg•искане даниел Ковалик..pa• Фактура Март Даниел Ковалик.jрс• Фактура Април Даниел Ковалик.jpg• Dhotac 2.001Q SearchKind00,4 MDinstdlle..dckage55.9 MBAlfred...ferences10,1 MBDisk Image10,1 MBDisk ImageIL MBLiP archive6,6 MBZIP archive2,5 MB PDF Document2,5 MBJreo lmage2.2 MBDisk Image2,2 MB PDF Document2 MBJPEG image1,9 MBJPEG imaqe192 KBPDF Document140 KbZIP archive148 KВ148 KB122 KB111 KB94 KBZIP archivelZIP archiveXML documentAlfred...ferencesPDF Document92 KBPDr DocumentK:91 KB91 KB30 KB29 KBPDF DocumentXML documentPDF Document28 KBPDF Document28 KR28 KB27 KB14 KB11 KB6 KB6KBPDE DocumentDocumentJSONICSV DocumentZIP archiveMarkdo…..ument5KRWindo...n image4 KB3 KBword ..cumentCSV Document2 KBYAML document1 KBcSV Document928 byteshttlicence183 bytesZero butesJSONAlfred.. ferencesZero bytesFolde1,9 MB1,8 MB17 MB1,7 MBColdorJPEG imageJPEG ImageIPEG imadeJPEG imageColdo1 of 58 selected, 8.41 GB availabld• Inu 14 Mаy 1/.41-10Date AddedIs Mdl ZUzo dl 19:4530 Jan 2026 at 12:3617 Mar 2026 at 20:2717 Mar 2026 at 20:26Z3 Aor 2020 al 13:0229 Jan 2026 at 15:2019 Dec 2025 at 10:1619 Dec 2025 at 12:238 Aor 2026 at 20:3519 Dec 2025 at 10:2919 Dec 2025 at 12:1819 Dec 2025 at 12:4026 Mar 2026 at 11:2410 May 2026 at 13:5326 Mar 2026 at 11:2426 Mar 2026 at 11:2426 Mar 2026 at 11:2310 May 2026 at 14:3730 Jan 2026 at 12:3713 Feb 2026 at 11:54Z3 Apr 2026 at 13.0823 Aor 2026 at 13:0810 May 2026 at 13:5410 May 2026 at 14:3710 May 2026 at 13:4910 May 2026 at 13:5010 May 2026 at 13:5110 Mav 2026 at 12:51110 May 2026 at 13:5019 Dec 2025 at 11:3431 Oct 2025 at 12:2525 Nov 2025 at 17:596 Mar 2026 at 11.2224 Anr 2026 at 16:5220 Oct 2025 at 11:0218 Mar 2026 at 15:29• Mav 2026 at 11:09129 Oct 2025 at 19:329 May 2026 at 10:0418 Mar 2026 at 11:5510 May 2026 at 13:5712 Jun 2025 at 19:0430 Jan 2026 at 12:3630 Jan 2026 at 12:3616 Oct 2025 aт 16:0123 Apr 2026 at 13:0223 Apr 2026 at 13:0223 Apr 2026 at 13:0222 Anr 2026 at 12:0223 Apr 2026 at 13:0229 Jan 2026 at 15:20...
|
NULL
|
-3763497527754205776
|
NULL
|
click
|
ocr
|
NULL
|
ActivityFilesLaterJiminny... ~@ jiminny-x-integrat ActivityFilesLaterJiminny... ~@ jiminny-x-integrati& platform-inner-team© Channels# ai-chapter# alertsi backend# bugscontusion-cllnia# curiosity_lab# engineering# general# jiminny-bg# platform-tickets# product_launches# random# releases# sofia-office# support# thank-yous# the people of iimi..• Direct messages8. A...• A3 62P. Galya Dimitrova Mvasil Vasilevf. Stefka Stoyanova%: Todor Stamatovf. Mario GeorgievP. Nikolay Ivanov2o James Graham "2. Stoyan Tanev. Steliyan Georgiev. Petko Kashinski*. Lukas Kovali...a: Apps® ToastS lira Gloud6 Huddle with Aneliya Angelova& R. Aneliya Angelova •• Messagest Add canvasur FilesAneliya Angelova 2:30 PMЛукаш, само при Сейлсфорс и Хубспот се синкваха активити типовете, когато се направи плейбук,нали?пои останалите скМі тоябва оъчно ла се въвелат.Lukas Kovalik 2:47 PMтряова да се за всички, някьде не се ли попьлвапри зохо май беше hardcoded но май и там си връщаха две категорииAneliya Angelova @ 4:00 PMЛукаш имаш ли време да се чуем за тестването на https://jiminny.atlassian.net/browse/JY-20725X Preview insackt[HubSpot] Optimise CRM rematctC OpenReady for QA- MediumAA Aneliya AngelovaAs of today at 4:00 PM RetreshOpen in Jira+ SummariseLukas Kovalik 4:02 PMzean-iurwiniareelYou joined the huddle LIVE 4:06 PMAneliva Angelova is here toolAneliya Angelova 4:44 PM11512582Lukas Kovalik O 5:16 PMcurl --location "httns:ani.hubani.com/crm/v3/obiects/contacts/search--header 'Content-Type: application/json'\--header "Authorization: BearerC|Kvma?iMx7OINOM8kOFwrAowAcAkUAhIR24?A05D?xiVrIYMILuP6SA01Kwcmhr=n.v2 hytorDniMvDalYck-CMalovolNOM9kOFwrAUAcrkcaws-ThwRARIRAOF-ATFSAOFRAO-ROIEBAQUBEggBAQEBAYICFIґ7Au8O2Nwal9YW2CbCCxYvwngmSgNldTFSAFoAYABoAHAAeAA'\--data "{ "limit", 13'Message Aneliva Angelova+ AaIAl Notes: OffLeave~ (Q SearchDate ModifiedYesterdav at 13.35Yesterday at 13:35Yesterday at 13.34Yesterdav at 13:33Yesterday at 13:32Yesterdav at 13:37Yesterday at 13:31Yesterday at 13.30Yesterday at 13:30Yesterday at 13:29resterday at 15.4gYesterdav at 13:28Yesterday at 13:28Yesterday at 13:27Yesterday at 13:26resterday at 13-4oYesterdav at 13:25Yesterday at 13:24Yesterday at 13:24Yesterday at 13:23Yesterday at 13:22Yesterday at 13.21Yesterdav at 13:20Yesterday at 13:20Yesterday at 13:19Yesterday at 13:19Yesterday at 13:18Yesterday at 13.17Yecterdav at 12:17Yesterday at 13:16Yesterday at 13-10Yesterdav at 13:15Yesterday at 13:15Yesterday at 13:14Yecterdav at 12:12Yesterday at 13.12Yesterdav at 13:12Yesterday at 13:11Yesterday at 13:10Yoctorday at 12:10Yesterday at 13:09Yesterday at 13.09Yocterdav at 12:081Yesterday at 13:08Yesterdav at 13:071S K:MPEG-4 movie16 KBMPEG-4 movie17 KB29 Kb6 KEMPEG-4 movieMPEG-4 movie12 KB9 KBMPE0"4 movie7 K:8 KBMPEG-4 movie37 KB10 KbMP2G-4 movie7 KBMPEG-4 movie8 KBMPEG-4 movie8 K:72 KBMPEG-4 movie14 KB13 K:O KRIMPEG-4 movieMPEG-4 movie18 KB12 KBMPEG-4 movie10 KEMPEG-4 movie16 KB MPEG-4 movie6 KB6 KB1MPEG-4 movie12 KBMPEG-4 movie23 KB8 KBMPEG-4 movie6KEMPEG-4 movie6 KBMPEG-4 movie11 KB11 K:MPEG-4 movie20 KBMPEG-4 movie10 KBMPEG-4 movie7 KPMPEG-4 movie5 KBMPEG-4 movie11 KBMPEG-4 movie26 KBMPEG-4 movie111 KBMPEG-4 movie102 KB88 KBMPEG-4 movieKO KRMDEG-A movie98 KBMPEG-4 movie97 KBMPEG-4 movie66 K:MPEG-A movie44 KB MPEG-4 movie93 KB78 KB50 kpMPEG-4 movieMPEG-4 movie58 KB27 KBMPEG-4 movie7KP12 KBMPEG-4 movie32 KB17 K8MPEG-4 movieFavouritesE jiminny© Recents* ApplicationsiCloudiCloud Drive228 Sync folderQ DXP4800PLUS-B5FA@ Network_• CRMI• Orange• Red• Yellow• Green• Purple•) All lags..lohlDownloadsNameLoom.pkgAlfred copv.alfredoreterencesB KeychronAssist-1.0.2 (1).dmgA Keychron Assist-1.0.2.dmgmazanoke-images-yWJo.zioPhotos-3-001.zipD Transcript.pdf→mage U.loge1 Orioninstaller.dmaimage.jpg- image (2).1pc• ПО-22221726037035-004-001_ORGES.pdf• %D0%9F%D0%9E-22221726037035-004-001_archive.zipПO-22221726037035-004-001_archive (1).zip• repon 4).XmAltred copy2.altredoreterences05012026_0000000026574472_ SWIFT_OB70501260015890.pdf27022026_0000000026574472_SWIFT_OB72702260049200.pdf= 03042026 [CREDIT_CARD] SWIFT [CREDIT_CARD].001B reporti) xm=pdt.odipdf-1.pdfD pdf-2.pdf-pdf-5.pd1= ndf-1 ndipdf-3.pdfKoválik Family Tree.gedbitwarden export 20251031122528.isonKoválik Family Tree.zip*macOS Storage_Cleanup.mdal favicon icofirst_aid_notes_complete.docxrenortl2).esvconfig.ymlIteration run Search HS.postman_collection.jsonm licence hettertouchtoalMariusHosting Config.json1ooks-891a6503-bbb7-4b2b-9c3.csv•Alfredmazanoke-images-YWJ6ана Ковалик.jpg•искане даниел Ковалик..pa• Фактура Март Даниел Ковалик.jрс• Фактура Април Даниел Ковалик.jpg• Dhotac 2.001Q SearchKind00,4 MDinstdlle..dckage55.9 MBAlfred...ferences10,1 MBDisk Image10,1 MBDisk ImageIL MBLiP archive6,6 MBZIP archive2,5 MB PDF Document2,5 MBJreo lmage2.2 MBDisk Image2,2 MB PDF Document2 MBJPEG image1,9 MBJPEG imaqe192 KBPDF Document140 KbZIP archive148 KВ148 KB122 KB111 KB94 KBZIP archivelZIP archiveXML documentAlfred...ferencesPDF Document92 KBPDr DocumentK:91 KB91 KB30 KB29 KBPDF DocumentXML documentPDF Document28 KBPDF Document28 KR28 KB27 KB14 KB11 KB6 KB6KBPDE DocumentDocumentJSONICSV DocumentZIP archiveMarkdo…..ument5KRWindo...n image4 KB3 KBword ..cumentCSV Document2 KBYAML document1 KBcSV Document928 byteshttlicence183 bytesZero butesJSONAlfred.. ferencesZero bytesFolde1,9 MB1,8 MB17 MB1,7 MBColdorJPEG imageJPEG ImageIPEG imadeJPEG imageColdo1 of 58 selected, 8.41 GB availabld• Inu 14 Mаy 1/.41-10Date AddedIs Mdl ZUzo dl 19:4530 Jan 2026 at 12:3617 Mar 2026 at 20:2717 Mar 2026 at 20:26Z3 Aor 2020 al 13:0229 Jan 2026 at 15:2019 Dec 2025 at 10:1619 Dec 2025 at 12:238 Aor 2026 at 20:3519 Dec 2025 at 10:2919 Dec 2025 at 12:1819 Dec 2025 at 12:4026 Mar 2026 at 11:2410 May 2026 at 13:5326 Mar 2026 at 11:2426 Mar 2026 at 11:2426 Mar 2026 at 11:2310 May 2026 at 14:3730 Jan 2026 at 12:3713 Feb 2026 at 11:54Z3 Apr 2026 at 13.0823 Aor 2026 at 13:0810 May 2026 at 13:5410 May 2026 at 14:3710 May 2026 at 13:4910 May 2026 at 13:5010 May 2026 at 13:5110 Mav 2026 at 12:51110 May 2026 at 13:5019 Dec 2025 at 11:3431 Oct 2025 at 12:2525 Nov 2025 at 17:596 Mar 2026 at 11.2224 Anr 2026 at 16:5220 Oct 2025 at 11:0218 Mar 2026 at 15:29• Mav 2026 at 11:09129 Oct 2025 at 19:329 May 2026 at 10:0418 Mar 2026 at 11:5510 May 2026 at 13:5712 Jun 2025 at 19:0430 Jan 2026 at 12:3630 Jan 2026 at 12:3616 Oct 2025 aт 16:0123 Apr 2026 at 13:0223 Apr 2026 at 13:0223 Apr 2026 at 13:0222 Anr 2026 at 12:0223 Apr 2026 at 13:0229 Jan 2026 at 15:20...
|
45524
|
NULL
|
NULL
|
NULL
|
|
45525
|
1627
|
46
|
2026-05-14T14:41:16.718621+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-14/1778 /Users/lukas/.screenpipe/data/data/2026-05-14/1778769676718_m1.jpg...
|
PhpStorm
|
faVsco.js – IntegrationApp/Service.php
|
1
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
PhpStormFileEditViewNavigateCodeLaravelRefactorRun PhpStormFileEditViewNavigateCodeLaravelRefactorRunToolsGitWindowHelp•FV faVsco.jsv* #12066 on JY-20725-handle-HS-search-rate-limit k vlhlU HandleHubspotRateLimitTest ~100% (C478• Thu 14 May 17:41:16* :QProjectvSendReportJob.php• DeleteCrmEntityTrait.phpDeleteAccountJob.phpImportActivityTypes.phpT WriteCrmTrait.php=custom.log> MetadataAccessors© Hubspot/DecorateActivity.phpIntegrationAppServiceTrait.phpIntegrationApp/Service.php x( RemoteWriteAccessor.php=laravel.logT AccountAccessor.php• BaseAccessor.php© IntegrationApp/DecorateActivity.phpActivity.php© Salesforce/Service.phpD LogActivityTrait.phpPlaybook.phpSF [jiminny@localhost]• ContactAccessor.php© Pipedrive/Service.phpClose/Service.phpCopper/Service.php© BullhornService.phpPlainTextDecorateActivity.phpA HS_local [jiminny@localho:WDealAccessor.phpT ActivityPlaybookTrait.phpCrmHelperRepository.php© AccountController.php.env.staging.env4 console [QAI PROD] X18.••© IntegrationAppAccessExce• LeadAccessor.phpDetachActivityObject.phpRematchActivityOnCrmObjectDetach.phpMatchActivityCrmData.phpClient.php4 console [PROD]T MeetingAccessor.php• RegisterEventsAccessor.pt• RemoteWriteAccessor.php55413© HubspotPaginationService.php© HandleHubspotRateLimit.phpclass Service extendsBaseService implementspublic function saveMeeting(Activity $activity): arrayA console (EU]A 16 × 2• SystemStateAccessor.phpT UserAccessor.php418• Арi419Config420O DTO421'Event_Title'=> SdecorateActivity->generateTitle(Sactivity),'Start_DateTime'=> $activity->getActualStartTime()->toIso8601String(),'Fnd DatoTime'=> Sactivitv->aetActualEndTime()->toIs08601StringO,ExtractSurround/OwnerId(Sactivity),D Filters422v d Jobs423© CrmEntitiesFullSyncJob.ph 424Spayload = array_merge($meetingPayload, $this->attachToProspect(Sactivity));© DeleteRemoteTeamJob.ph425T IntegrationAppService Trait 426© SubscribeForEventsJob.ph427© TeamInitialSyncJob.php428if (Sactivity->hasCrmProviderIdO) {$crmId = $activity->getCrmProviderId);Smeeting = $this->client->getMeeting(ScrmId):© UnsubscribeForEventsJob.429© UpdateProfileRelatedEntiti430|© ValidateTeamActiveConne431$oldDescription = $meeting['fields']['Description'] ?? null;$payLoad[ 'Description'] = $decorateActivity->generateUpdatedDescription($oldDescription, $activity228> ProspectSearchStrategy432> D ServiceTraits433© DataClient.php434© DecorateActivity.php435© LocalSearch.php436$this->logger->info('[integration-app]CRM update meeting','activity' => $activity->getUvid(),'crm_id' => $crmid,'payload' => $payload,• LocalSearchlnterface.php4371);DGo jiminny084143 ×4 л215•m_layout_id =2162,1661,66799,66217218219id = 33;_220-221222-223224id THEN •(own=225_226227229230hubspot':231232233V= 11512582;234C RemoteSearch.php438© Service.php439return $this->client->updateMeeting(ScrmId,$payload);v • Listeners440C ConvertLeadActivities.php441© Purnel onkunCache nhn442$payload['Description'] = $decorateActivity->generateDescription(Sactivity):Workspace associated with branch 'JY-20725-handle-HS-search-rate-limit' has been restored // Rollback // Configure... (today 16:17)W Windsurf Teams421:28 (252 chars, 3 line breaks)UTF-8Ca 4 spaces...
|
NULL
|
4039924033331417404
|
NULL
|
click
|
ocr
|
NULL
|
PhpStormFileEditViewNavigateCodeLaravelRefactorRun PhpStormFileEditViewNavigateCodeLaravelRefactorRunToolsGitWindowHelp•FV faVsco.jsv* #12066 on JY-20725-handle-HS-search-rate-limit k vlhlU HandleHubspotRateLimitTest ~100% (C478• Thu 14 May 17:41:16* :QProjectvSendReportJob.php• DeleteCrmEntityTrait.phpDeleteAccountJob.phpImportActivityTypes.phpT WriteCrmTrait.php=custom.log> MetadataAccessors© Hubspot/DecorateActivity.phpIntegrationAppServiceTrait.phpIntegrationApp/Service.php x( RemoteWriteAccessor.php=laravel.logT AccountAccessor.php• BaseAccessor.php© IntegrationApp/DecorateActivity.phpActivity.php© Salesforce/Service.phpD LogActivityTrait.phpPlaybook.phpSF [jiminny@localhost]• ContactAccessor.php© Pipedrive/Service.phpClose/Service.phpCopper/Service.php© BullhornService.phpPlainTextDecorateActivity.phpA HS_local [jiminny@localho:WDealAccessor.phpT ActivityPlaybookTrait.phpCrmHelperRepository.php© AccountController.php.env.staging.env4 console [QAI PROD] X18.••© IntegrationAppAccessExce• LeadAccessor.phpDetachActivityObject.phpRematchActivityOnCrmObjectDetach.phpMatchActivityCrmData.phpClient.php4 console [PROD]T MeetingAccessor.php• RegisterEventsAccessor.pt• RemoteWriteAccessor.php55413© HubspotPaginationService.php© HandleHubspotRateLimit.phpclass Service extendsBaseService implementspublic function saveMeeting(Activity $activity): arrayA console (EU]A 16 × 2• SystemStateAccessor.phpT UserAccessor.php418• Арi419Config420O DTO421'Event_Title'=> SdecorateActivity->generateTitle(Sactivity),'Start_DateTime'=> $activity->getActualStartTime()->toIso8601String(),'Fnd DatoTime'=> Sactivitv->aetActualEndTime()->toIs08601StringO,ExtractSurround/OwnerId(Sactivity),D Filters422v d Jobs423© CrmEntitiesFullSyncJob.ph 424Spayload = array_merge($meetingPayload, $this->attachToProspect(Sactivity));© DeleteRemoteTeamJob.ph425T IntegrationAppService Trait 426© SubscribeForEventsJob.ph427© TeamInitialSyncJob.php428if (Sactivity->hasCrmProviderIdO) {$crmId = $activity->getCrmProviderId);Smeeting = $this->client->getMeeting(ScrmId):© UnsubscribeForEventsJob.429© UpdateProfileRelatedEntiti430|© ValidateTeamActiveConne431$oldDescription = $meeting['fields']['Description'] ?? null;$payLoad[ 'Description'] = $decorateActivity->generateUpdatedDescription($oldDescription, $activity228> ProspectSearchStrategy432> D ServiceTraits433© DataClient.php434© DecorateActivity.php435© LocalSearch.php436$this->logger->info('[integration-app]CRM update meeting','activity' => $activity->getUvid(),'crm_id' => $crmid,'payload' => $payload,• LocalSearchlnterface.php4371);DGo jiminny084143 ×4 л215•m_layout_id =2162,1661,66799,66217218219id = 33;_220-221222-223224id THEN •(own=225_226227229230hubspot':231232233V= 11512582;234C RemoteSearch.php438© Service.php439return $this->client->updateMeeting(ScrmId,$payload);v • Listeners440C ConvertLeadActivities.php441© Purnel onkunCache nhn442$payload['Description'] = $decorateActivity->generateDescription(Sactivity):Workspace associated with branch 'JY-20725-handle-HS-search-rate-limit' has been restored // Rollback // Configure... (today 16:17)W Windsurf Teams421:28 (252 chars, 3 line breaks)UTF-8Ca 4 spaces...
|
45523
|
NULL
|
NULL
|
NULL
|
|
45524
|
1628
|
34
|
2026-05-14T14:41:09.413938+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-14/1778 /Users/lukas/.screenpipe/data/data/2026-05-14/1778769669413_m2.jpg...
|
PhpStorm
|
faVsco.js – IntegrationApp/Service.php
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
#12066 on JY-20725-handle Project: faVsco.js, menu
#12066 on JY-20725-handle-HS-search-rate-limit, menu
Start Listening for PHP Debug Connections
HandleHubspotRateLimitTest
Run 'HandleHubspotRateLimitTest'
Debug 'HandleHubspotRateLimitTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"bounds":{"left":0.2962101,"top":1.0,"width":0.03856383,"height":-0.019952059},"on_screen":true,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"#12066 on JY-20725-handle-HS-search-rate-limit, menu","depth":5,"bounds":{"left":0.33477393,"top":1.0,"width":0.122340426,"height":-0.019952059},"on_screen":true,"help_text":"Pull request #12066 exists for current branch JY-20725-handle-HS-search-rate-limit, but local branch is out of sync with remote","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"bounds":{"left":0.5731383,"top":1.0,"width":0.011303191,"height":-0.019952059},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"HandleHubspotRateLimitTest","depth":6,"bounds":{"left":0.5884308,"top":1.0,"width":0.076130316,"height":-0.019952059},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run 'HandleHubspotRateLimitTest'","depth":6,"bounds":{"left":0.66456115,"top":1.0,"width":0.011303191,"height":-0.019952059},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'HandleHubspotRateLimitTest'","depth":6,"bounds":{"left":0.67586434,"top":1.0,"width":0.011303191,"height":-0.019952059},"on_screen":true,"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.6871675,"top":1.0,"width":0.011303191,"height":-0.019952059},"on_screen":true,"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.7150931,"top":1.0,"width":0.011303191,"height":-0.019952059},"on_screen":true,"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.72639626,"top":1.0,"width":0.011303191,"height":-0.019952059},"on_screen":true,"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.73769945,"top":1.0,"width":0.011303191,"height":-0.019952059},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
2586234742233688171
|
-7051436856496256053
|
click
|
hybrid
|
NULL
|
Project: faVsco.js, menu
#12066 on JY-20725-handle Project: faVsco.js, menu
#12066 on JY-20725-handle-HS-search-rate-limit, menu
Start Listening for PHP Debug Connections
HandleHubspotRateLimitTest
Run 'HandleHubspotRateLimitTest'
Debug 'HandleHubspotRateLimitTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
ActivityFilesLaterJiminny... ~@ jiminny-x-integrati& platform-inner-team© Channels# ai-chapter# alertsi backend# bugscontusion-cllnia# curiosity_lab# engineering# general# jiminny-bg# platform-tickets# product_launches# random# releases# sofia-office# support# thank-yous# the people of iimi..• Direct messages8. A...• A3 62P. Galya Dimitrova Mvasil Vasilevf. Stefka Stoyanova%: Todor Stamatovf. Mario GeorgievP. Nikolay Ivanov2o James Graham "2. Stoyan Tanev. Steliyan Georgiev. Petko Kashinski*. Lukas Kovali...a: Apps® ToastS lira Gloud6 Huddle with Aneliya Angelova& R. Aneliya Angelova •• Messagest Add canvasur FilesAneliya Angelova 2:30 PMЛукаш, само при Сейлсфорс и Хубспот се синкваха активити типовете, когато се направи плейбук,нали?пои останалите скМі тоябва оъчно ла се въвелат.Lukas Kovalik 2:47 PMтряова да се за всички, някьде не се ли попьлвапри зохо май беше hardcoded но май и там си връщаха две категорииAneliya Angelova @ 4:00 PMЛукаш имаш ли време да се чуем за тестването на https://jiminny.atlassian.net/browse/JY-20725X Preview insackt[HubSpot] Optimise CRM rematctC OpenReady for QA- MediumAA Aneliya AngelovaAs of today at 4:00 PM RetreshOpen in Jira+ SummariseLukas Kovalik 4:02 PMzean-iurwiniareelYou joined the huddle LIVE 4:06 PMAneliva Angelova is here toolAneliya Angelova 4:44 PM11512582Lukas Kovalik O 5:16 PMcurl --location "httns:ani.hubani.com/crm/v3/obiects/contacts/search--header 'Content-Type: application/json'\--header "Authorization: BearerC|Kvma?iMx7OINOM8kOFwrAowAcAkUAhIR24?A05D?xiVrIYMILuP6SA01Kwcmhr=n.v2 hytorDniMvDalYck-CMalovolNOM9kOFwrAUAcrkcaws-ThwRARIRAOF-ATFSAOFRAO-ROIEBAQUBEggBAQEBAYICFIґ7Au8O2Nwal9YW2CbCCxYvwngmSgNldTFSAFoAYABoAHAAeAA'\--data "{ "limit", 13'Message Aneliva Angelova+ AaIAl Notes: OffLeave~ (Q SearchDate ModifiedYesterdav at 13.35Yesterday at 13:34Yesterday at 13.33Yesterdav at 13:33Yesterday at 13:32Yesterday at 13:32Yesterday at 13:31Yesterday at 13.30Yesterday at 13:29Yesterday at 13:29resterday at 15.2oYesterdav at 13:28Yesterday at 13:27Yesterday at 13:26Yesterday at 13:26resterday at 13-40Yesterdav at 13:24Yesterday at 13:24Yesterday at 13:23Yesterday at 13.20Yesterdav at 13:20Yesterday at 13:19Yesterday at 13:19Yesterday at 13:18Yesterday at 13:18Yesterday at 13.17Yecterdav at 12:16Yesterday at 13:16Yesterday at 13.10Yesterdav at 13:15Yesterday at 13:14Yesterday at 13:13Yecterdav at 12:12Yesterday at 13:12Yesterday at 13.12Yesterdav at 13:11Yesterday at 13:11Yesterday at 13:10Yesterday at 13:09Yesterday at 13:09Yesterday at 13.08Yocterdav at 12:08Yesterday at 13:07Yesterdav at 13:0616 K:MPEG-4 movie17 KBMPEG-4 movie29 KBMPEG-4 movieMPEG-4 movie12 KE9 KBMPE0"4 movie8 K:37 KBMPEG-4 movie10 KBIKBnMP2G-4 movie8 KBMPEG-4 movie9 KB8 KBMPEG-4 movie72 K:14 KBMPEG-4 movie13 KBMPEG-4 movie18 KBMPEG-4 movie12 KB10 KBMPEG-4 movie16 KEMPEG-4 movie6 KB MPEG-4 movie6 KB12 KB|MPEG-4 movie23 KBMPEG-4 movieMPEG-4 movie6KEMPEG-4 movie11 KBMPEG-4 movie11 KBMPEG-4 movie20 K:MPEG-4 movie34 KBMPEG-4 movie10 KB7 KBMPEG-4 movie5KPMPEG-4 movie11 KBMPEG-4 movie26 KBMPEG-4 movie111 K:MPEG-4 movie102 KBMPEG-4 movie88 KB59 KBO9 KRMPEG-4 movieMDEG-A movie97 KB66 KBMPEG-4 movie44K:MPSG-A movid93 KBMPEG-4 movie78 KB50 KB59 KPMPEG-4 movieMPEG-4 movie27 KBMPEG-4 movie12 K:32 KBMPEG-4 movie17 KB19K8MPEG-4 movie• 0FavouritesE jiminny© Recents* ApplicationsiCloudiCloud Drive228 Sync folderQ DXP4800PLUS-B5FA@ Network|• CRMI• Orange• Red• Yellow• Green• Purple•) All lags..lohlDownloadsNameLoom.pkgAlfred copv.alfredoreterencesB KeychronAssist-1.0.2 (1).dmgA Keychron Assist-1.0.2.dmgmazanoke-images-yWJo.zioPhotos-3-001.zipD Transcript.pdf→mage U.loge1 Orioninstaller.dmaimage.jpg- image (2).1pc• ПО-22221726037035-004-001_ORGES.pdf• %D0%9F%D0%9E-22221726037035-004-001_archive.zipПO-22221726037035-004-001_archive (1).zip• repon 4).XmAltred copy2.altredoreterences05012026_0000000026574472_ SWIFT_OB70501260015890.pdf27022026_0000000026574472_SWIFT_OB72702260049200.pdf= 03042026 [CREDIT_CARD] SWIFT [CREDIT_CARD].001B reporti) xm=pdt.odipdf-1.pdfD pdf-2.pdf-pdf-5.pd1= ndf-1 ndipdf-3.pdfB Rovaix Famly Treo gedbitwarden export 20251031122528.isonKoválik Family Tree.zip*macOS Storage_Cleanup.mdal favicon icofirst_aid_notes_complete.docxrenortl2).esvconfig.ymlIteration run Search HS.postman_collection.jsonm licence bettertouchtoalMariusHosting Config.json1ooks-891a6503-bbb7-4b2b-9c3.csv•Alfredmazanoke-images-YWJ6ана Ковалик.jpg•искане даниел Ковалик..pa• Фактура Март Даниел Ковалик.jрс• Фактура Април Даниел Ковалик.jpg• Dhotac 2.001Q SearchKind00,4 MDinstdlle..dckage55.9 MBAlfred...ferences10,1 MBDisk Image10,1 MBDisk ImageIL MBLiP archive6,6 MBZIP archive2,5 MB PDF Document2,5 MBJreo lmage2.2 MBDisk Image2,2 MB PDF Document2 MBJPEG image1,9 MBJPEG imaqe192 KBPDF Document140 KbZIP archive148 KВZIP archivel148 KBZIP archive122 KBXML document111 KBAlfred...ferences94 KBPDF Document92 KBPDr DocumentK:91 KB91 KB30 KB29 KBPDF DocumentXML documentPDF Document28 KBPDF Document28 KR28 KB27 KB14 KB11 KB6 KB6KBPDE DocumentDocumentJSONICSV DocumentZIP archiveMarkdo…..ument5KRWindo...n image4 KB3 KBword ..cumentCSV Document2 KBYAML document1 KBcSV Document928 byteshttlicence183 bytesZero butesJSONAlfred.. ferencesZero bytesFolde1,9 MB1,8 MB17 MB1,7 MBColdorJPEG imageJPEG ImageIPEG imadeJPEG imageColdo1 of 58 selected, 8.42 GB availabold• Inu 14 Mау 1/.41-04Date AddedIs Mdl ZUzo dl 19:4530 Jan 2026 at 12:3617 Mar 2026 at 20:2717 Mar 2026 at 20:26Z3 Aor 2020 al 13:0229 Jan 2026 at 15:2019 Dec 2025 at 10:1619 Dec 2025 at 12:238 Aor 2026 at 20:3519 Dec 2025 at 10:2919 Dec 2025 at 12:1819 Dec 2025 at 12:4026 Mar 2026 at 11:2410 May 2026 at 13:5326 Mar 2026 at 11:2426 Mar 2026 at 11:2426 Mar 2026 at 11:2310 May 2026 at 14:3730 Jan 2026 at 12:3713 Feb 2026 at 11:54Z3 Apr 2026 at 13.0823 Aor 2026 at 13:0810 May 2026 at 13:5410 May 2026 at 14:3710 May 2026 at 13:4910 May 2026 at 13:5010 May 2026 at 13:5110 Mav 2026 at 12:51110 May 2026 at 13:5019 Dec 2025 at 11:3431 Oct 2025 at 12:2525 Nov 2025 at 17:596 Mar 2026 at 11.2224 Anr 2026 at 16:5220 Oct 2025 at 11:0218 Mar 2026 at 15:29• Mav 2026 at 11:09129 Oct 2025 at 19:329 May 2026 at 10:0418 Mar 2026 at 11:5510 May 2026 at 13:5712 Jun 2025 at 19:0430 Jan 2026 at 12:3630 Jan 2026 at 12:3616 Oct 2025 aт 16:0123 Apr 2026 at 13:0223 Apr 2026 at 13:0223 Apr 2026 at 13:0222 Anr 2026 at 12:0223 Apr 2026 at 13:0229 Jan 2026 at 15:20...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
45523
|
1627
|
45
|
2026-05-14T14:41:11.662772+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-14/1778 /Users/lukas/.screenpipe/data/data/2026-05-14/1778769671662_m1.jpg...
|
PhpStorm
|
faVsco.js – IntegrationApp/Service.php
|
1
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
#12066 on JY-20725-handle Project: faVsco.js, menu
#12066 on JY-20725-handle-HS-search-rate-limit, menu
Start Listening for PHP Debug Connections
HandleHubspotRateLimitTest
Run 'HandleHubspotRateLimitTest'
Debug 'HandleHubspotRateLimitTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
16
2
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Services\Crm\IntegrationApp;
use Carbon\Carbon;
use Jiminny\Contracts\Crm\Providers;
use Jiminny\Contracts\Services\Crm\ClientInterface;
use Jiminny\Contracts\Services\Crm\FetchRelatedActivityInterface;
use Jiminny\Contracts\Services\Crm\ImportsBusinessProcessesInterface;
use Jiminny\Contracts\Services\Crm\LayoutManagementInterface;
use Jiminny\Contracts\Services\Crm\MatchCrmEntitiesInterface;
use Jiminny\Contracts\Services\Crm\Provider\IntegrationAppInterface;
use Jiminny\Contracts\Services\Crm\RemoteEntityLookupInterface;
use Jiminny\Contracts\Services\Crm\RemoteEntityManipulationInterface;
use Jiminny\Contracts\Services\Crm\RemoteNoteEntityManipulationInterface;
use Jiminny\Contracts\Services\Crm\SendSummaryToCrmInterface;
use Jiminny\Contracts\Services\Crm\SettingsInterface;
use Jiminny\Contracts\Services\Crm\SyncCrmEntitiesInterface;
use Jiminny\Contracts\Services\Crm\SyncCrmMetadataInterface;
use Jiminny\Events\Activities\Crm\ActivityLeadConverted;
use Jiminny\Exceptions\CrmException;
use Jiminny\Exceptions\SocialAccountNotFoundException;
use Jiminny\Jobs\Crm\NoteObject;
use Jiminny\Models\Account;
use Jiminny\Models\Activity;
use Jiminny\Models\Contracts\ActivityContract;
use Jiminny\Models\Crm\Configuration;
use Jiminny\Models\Opportunity;
use Jiminny\Models\Stage;
use Jiminny\Models\User;
use Jiminny\Services\Crm\BaseService;
use Jiminny\Services\Crm\IntegrationApp\Config\IntegrationAppProviders;
use Jiminny\Services\Crm\IntegrationApp\Config\IntegrationConfigFactory;
use Jiminny\Services\Crm\IntegrationApp\DTO\Mappers\FieldMapperInterface;
use Jiminny\Services\Crm\IntegrationApp\DTO\Mappers\LeadFieldMapper;
use Jiminny\Services\Crm\IntegrationApp\DTO\Utils\GenerateProviderUrlInterface;
use Jiminny\Services\Crm\IntegrationApp\DTO\Utils\IntegrationAppCrmGeneratorFactory;
use Jiminny\Services\Crm\IntegrationApp\DTO\Utils\UrlGeneratorInterface;
use Jiminny\Services\Crm\IntegrationApp\ServiceTraits\SyncCrmFieldsTrait;
use Jiminny\Services\Crm\IntegrationApp\ServiceTraits\SystemStateTrait;
use Jiminny\Services\Crm\IntegrationApp\ServiceTraits\LayoutTrait;
use Jiminny\Services\Crm\IntegrationApp\ServiceTraits\MatchProspectsTrait;
use Jiminny\Services\Crm\IntegrationApp\ServiceTraits\NotSupportedTrait;
use Jiminny\Services\Crm\IntegrationApp\ServiceTraits\SyncCrmEntitiesTrait;
use Jiminny\Services\Crm\IntegrationApp\ServiceTraits\SyncCrmMetadataTrait;
use Psr\Log\LoggerInterface;
use Jiminny\Services\Crm\IntegrationApp\DTO\Mappers\OpportunityFieldMapper;
use Jiminny\Repositories\Crm\ProfileRepository;
use Jiminny\Repositories\Crm\OpportunityRepository;
use Jiminny\Models\Crm\Profile;
use Jiminny\Services\Crm\CrmObjects\CrmObjectsRepository;
class Service extends BaseService implements
IntegrationAppInterface,
SyncCrmEntitiesInterface,
SyncCrmMetadataInterface,
ImportsBusinessProcessesInterface,
RemoteEntityManipulationInterface,
LayoutManagementInterface,
SettingsInterface,
MatchCrmEntitiesInterface,
RemoteEntityLookupInterface,
RemoteNoteEntityManipulationInterface,
SendSummaryToCrmInterface,
UrlGeneratorInterface,
FetchRelatedActivityInterface
{
use SyncCrmMetadataTrait;
use SyncCrmEntitiesTrait;
use SystemStateTrait;
use LayoutTrait;
use NotSupportedTrait;
use MatchProspectsTrait;
use SyncCrmFieldsTrait;
public const string CALL_TYPE_MISSED = 'Missed';
public const string CALL_TYPE_INBOUND = 'Inbound';
public const string CALL_TYPE_OUTBOUND = 'Outbound';
public const string RELATIONSHIP_OPPORTUNITY = 'Deals';
public const string RELATIONSHIP_LEAD = 'Leads';
public const string RELATIONSHIP_ACCOUNT = 'Accounts';
/**
* @var ClientInterface&DataClient
*/
protected $client;
protected ?User $invokedUser = null;
protected ?GenerateProviderUrlInterface $crmUrlGenerator = null;
public function __construct(
DataClient $client,
LoggerInterface $logger,
) {
parent::__construct();
$this->client = $client;
$this->logger = $logger;
}
public function getDisplayName(): string
{
return Providers::getProviderDisplayName(
Providers::getCrmIntegrationSlug($this->config)
);
}
/**
* @throws \Exception
*/
public function setUser(User $user): void
{
$this->configureSentryScope($user);
$this->invokedUser = $user;
$this->team = $user->getTeam();
$teamOwner = $this->team->getOwner();
$this->setConfiguration($user->getTeam()->getCrmConfiguration());
$this->setEditionConfiguration(Providers::getCrmIntegrationSlug($this->config));
$this->setCrmUrlGenerator($this->config);
$this->client->setTeam($this->team);
$socialAccount = $teamOwner?->getSocialAccount('integration-app');
if ($socialAccount === null) {
$this->logger->info('[integration-app] Social account not found', [
'teamId' => $this->team->getId(),
'teamOwnerId' => $teamOwner?->getId(),
'userId' => $user->getId(),
]);
throw new SocialAccountNotFoundException('Social account not found!');
}
$this->client->setSocialAccount($socialAccount);
// The CRM Service is properly bootstrapped, and supports remote operations
$this->connect();
}
public function normalizeValue(string $fieldType, string $fieldValue, bool $internal = false): string
{
return $fieldValue;
}
public function find(string $name, array $scopes): array
{
/** @var LocalSearch $localSearch */
$localSearch = app(LocalSearch::class);
$localSearch->setConfiguration($this->config);
$localSearch->setCountryCode($this->invokedUser->getCountryCode());
return $localSearch->search($name);
// if (! empty($localMatch)) {
// return $localMatch;
// }
//
// /** @var RemoteSearch $remoteSearch */
// $remoteSearch = app(RemoteSearch::class);
// $remoteSearch->setClient($this->client);
// $remoteSearch->setConfiguration($this->config);
//
// return $remoteSearch->search($name);
}
public function findOpportunities(?string $crmAccountId, ?string $crmContactId, ?int $userId = null): array
{
$data = [];
$ownerData = [];
$account = $this->getAccount($crmAccountId, $crmContactId);
if ($account === null) {
return [];
}
$ownerId = $this->getOwnerId($userId);
try {
$opportunityRepository = app(OpportunityRepository::class);
$opportunities = $opportunityRepository->findAllByConfigurationAndAccountId(
$this->config,
$account->getId()
);
foreach ($opportunities as $opportunity) {
/** @var Opportunity $opportunity */
$record = $this->buildOpportunityData($opportunity);
if ($ownerId && $opportunity->getOwnerId() === $ownerId) {
$ownerData[] = $record;
}
$data[] = $record;
}
if (! empty($ownerData)) {
return $ownerData;
}
return $data;
} catch (\Exception $e) {
$this->logger->info('[integration-app] Failed to fetch opportunities', [
'contact' => $crmContactId,
'account' => $crmAccountId,
'owner' => $ownerId,
'error' => $e->getMessage(),
]);
return $data;
}
}
private function getOwnerId(?int $userId = null): ?string
{
if (! $userId) {
return null;
}
$profileRepository = app(ProfileRepository::class);
$profile = $profileRepository->findProfileByUserId($this->config, $userId);
return $profile instanceof Profile ? $profile->getCrmProviderId() : null;
}
private function getAccount(?string $crmAccountId = null, ?string $crmContactId = null): ?Account
{
$crmRepository = app(CrmObjectsRepository::class);
if ($crmAccountId === null) {
$contact = $crmRepository->findContactByCrmProviderId($this->config, $crmContactId);
return $contact->getAccount();
}
return $crmRepository->findAccountByCrmProviderId($this->config, $crmAccountId);
}
private function buildOpportunityData(Opportunity $opportunity): array
{
$record = [
'crmId' => $opportunity->getCrmProviderId(),
'name' => $opportunity->getName(),
'won' => $opportunity->isWon(),
'closed' => $opportunity->isClosed(),
];
if (! empty($opportunity->getFormattedValueAttribute())) {
$record['value'] = $opportunity->getFormattedValueAttribute();
}
if (! empty($opportunity->getStage())) {
$record['stage'] = [
'id' => $opportunity->getStage()->getUuid(),
'name' => $opportunity->getStage()->getName(),
];
}
return $record;
}
public function updateRecord(string $objectType, string $objectId, array $data, array $headers = []): void
{
$data = [
'data' => $this->normalizeData($objectType, $data),
];
$this->client->updateRecordById($objectType, $objectId, $data);
}
private function normalizeData(string $objectType, array $data): array
{
$fieldMapper = $this->getFieldMapper($objectType);
if (! $fieldMapper instanceof FieldMapperInterface) {
return $data;
}
return $fieldMapper->mapToCrmFields($data);
}
private function getFieldMapper(string $objectType): ?FieldMapperInterface
{
if ($objectType === self::OBJECT_OPPORTUNITY) {
return app(OpportunityFieldMapper::class);
}
if ($objectType === self::OBJECT_LEAD) {
return app(LeadFieldMapper::class);
}
return null;
}
public function getRecord(string $objectType, string $objectId, array $fields = []): array
{
return $this->client->getRecordById($objectType, $objectId);
}
public function getConfiguration(): Configuration
{
return $this->config;
}
public function setConfiguration(Configuration $config): void
{
$this->clearExternalMapCache();
$this->config = $config;
}
private function setEditionConfiguration(string $provider): void
{
$this->editionConfig = app(IntegrationConfigFactory::class)->create($provider);
}
public function setCrmUrlGenerator(Configuration $config): void
{
$this->crmUrlGenerator = app(IntegrationAppCrmGeneratorFactory::class)->create($config);
}
public function getCrmUrlGenerator(): ?GenerateProviderUrlInterface
{
if ($this->crmUrlGenerator === null) {
$this->setCrmUrlGenerator($this->config);
}
return $this->crmUrlGenerator;
}
public function subscribeEntityEvents(bool $enableTrigger = true): void
{
$eventStates = $this->client->updateEntityEventsState($enableTrigger);
$this->logger->info('[integration-app] Change team entity events subscription', [
'teamId' => $this->team->getId(),
'teamName' => $this->team->getName(),
'states' => $eventStates,
'action' => $enableTrigger ? 'subscribe' : 'unsubscribe',
]);
}
#[\Override] public function supportsNotes(): bool
{
return $this->editionConfig->supportsNotes();
}
#[\Override] public function saveNote(
string $title,
string $body,
string $objectId,
?NoteObject $noteObject = null,
): ?string {
if ($noteObject === null) {
return null;
}
$notePayload = [
'title' => $title,
'content' => $body,
'objectId' => $objectId,
'objectType' => $noteObject->value,
];
$result = $this->client->createNote($notePayload);
// debug saving note response
$this->logger->info('[integration-app] createNote response', [
'objectId' => $objectId,
'objectType' => $noteObject->value,
'result' => $result,
'hasId' => isset($result['id']),
]);
return $result['id'] ?? null;
}
/**
* @throws CrmException
*/
#[\Override] public function saveActivity(Activity $activity): Activity
{
$this->logger->info('[integration-app] saveActivity', [
'activity' => $activity->getUuid(),
'type' => $activity->getType(),
]);
if ($activity->getCrmType() === Activity::TYPE_CONFERENCE) {
$crmActivity = $this->saveMeeting($activity);
} elseif (in_array($activity->getType(), [Activity::TYPE_SOFTPHONE, Activity::TYPE_SOFTPHONE_INBOUND])) {
$crmActivity = $this->saveCall($activity);
} else {
throw new CrmException('Unsupported activity type');
}
$crmActivityId = $crmActivity['id'] ?? null;
if ($crmActivityId !== null) {
$activity->crm_provider_id = $crmActivityId;
$activity->save();
$this->logger->info('[integration-app] Activity successfully logged to CRM', [
'activity' => $activity->getUuid(),
'type' => $activity->getType(),
'crmId' => $crmActivityId,
]);
}
return $activity;
}
public function saveMeeting(Activity $activity): array
{
$decorateActivity = app(DecorateActivity::class);
$meetingPayload = [
'Event_Title' => $decorateActivity->generateTitle($activity),
'Start_DateTime' => $activity->getActualStartTime()->toIso8601String(),
'End_DateTime' => $activity->getActualEndTime()->toIso8601String(),
'ownerId' => $this->getActivityOwnerId($activity),
];
$payload = array_merge($meetingPayload, $this->attachToProspect($activity));
if ($activity->hasCrmProviderId()) {
$crmId = $activity->getCrmProviderId();
$meeting = $this->client->getMeeting($crmId);
$oldDescription = $meeting['fields']['Description'] ?? null;
$payload['Description'] = $decorateActivity->generateUpdatedDescription($oldDescription, $activity);
$this->logger->info('[integration-app] CRM update meeting', [
'activity' => $activity->getUuid(),
'crm_id' => $crmId,
'payload' => $payload,
]);
return $this->client->updateMeeting($crmId, $payload);
}
$payload['Description'] = $decorateActivity->generateDescription($activity);
$this->logger->info('[integration-app] CRM log meeting', [
'activity' => $activity->getUuid(),
'payload' => $payload,
]);
return $this->client->createMeeting($payload);
}
public function saveCall(Activity $activity): array
{
$decorateActivity = app(DecorateActivity::class);
$callPayload = [
'Call_Type' => $this->getCallType($activity),
'Call_Start_Time' => $activity->getActualStartTime()->toIso8601String(),
'Call_Duration' => $activity->getDuration(),
'name' => $decorateActivity->generateTitle($activity),
'ownerId' => $this->getActivityOwnerId($activity),
];
$payload = array_merge($callPayload, $this->attachToProspect($activity));
if ($activity->hasCrmProviderId()) {
$crmId = $activity->getCrmProviderId();
$call = $this->client->getCall($crmId);
$oldDescription = $call['fields']['Description'] ?? null;
$payload['description'] = $decorateActivity->generateUpdatedDescription($oldDescription, $activity);
$this->logger->info('[integration-app] CRM update call', [
'activity' => $activity->getUuid(),
'crm_id' => $crmId,
'payload' => $payload,
]);
return $this->client->updateCall($crmId, $payload);
}
$payload['description'] = $decorateActivity->generateDescription($activity);
$this->logger->info('[integration-app] CRM log call', [
'activity' => $activity->getUuid(),
'payload' => $payload,
]);
return $this->client->createCall($payload);
}
private function getCallType(Activity $activity): string
{
if ($activity->getStatus() === Activity::STATUS_NO_ANSWER) {
return self::CALL_TYPE_MISSED;
}
return $activity->getType() === Activity::TYPE_SOFTPHONE_INBOUND ? self::CALL_TYPE_INBOUND : self::CALL_TYPE_OUTBOUND;
}
private function attachToProspect(Activity $activity): array
{
$payload = [];
if ($activity->hasContact()) {
$payload['contactId'] = $activity->getContact()->getCrmProviderId();
}
if ($activity->hasOpportunity()) {
return array_merge(
$payload,
$this->buildBasicPayload(
self::RELATIONSHIP_OPPORTUNITY,
$activity->getOpportunity()->getCrmProviderId()
)
);
}
if ($activity->hasAccount() && ! $activity->getAccount()->getIsInternal()) {
return array_merge(
$payload,
$this->buildBasicPayload(
self::RELATIONSHIP_ACCOUNT,
$activity->getAccount()->getCrmProviderId()
)
);
}
if ($activity->hasLead()) {
$payload = $this->handleLeadPayload($activity);
}
return $payload;
}
private function handleLeadPayload(Activity $activity): array
{
$freshLead = $this->syncLead($activity->getLead()->getCrmProviderId());
$lead = $freshLead ?? $activity->getLead();
if ($lead->getConvertedAt() === null) {
return $this->buildBasicPayload(self::RELATIONSHIP_LEAD, $lead->getCrmProviderId());
}
$activity->lead_id = null;
if ($lead->hasAccount()) {
$account = $lead->getAccount();
$activity->account_id = $account->getId();
$payload = $this->buildBasicPayload(self::RELATIONSHIP_ACCOUNT, $account->getCrmProviderId());
} else {
$payload = [];
}
if ($lead->hasOpportunity()) {
$opportunity = $lead->getOpportunity();
$payload = $this->buildBasicPayload(self::RELATIONSHIP_OPPORTUNITY, $opportunity->getCrmProviderId());
$activity->opportunity_id = $opportunity->getId();
$activity->value = $opportunity->value;
$activity->stage_id = $opportunity->stage_id;
} else {
$activity->stage_id = null;
}
if ($lead->hasContact()) {
$contact = $lead->getContact();
$payload['contactId'] = $contact->getCrmProviderId();
$activity->contact_id = $contact->getId();
}
$activity->save();
event(new ActivityLeadConverted($activity, $lead));
$this->logger->info('[integration-app] Lead converted', [
'activityUuid' => $activity->getUuid(),
'leadUuid' => $lead->getUuid(),
]);
return $payload;
}
private function buildBasicPayload(string $type, string $id): array
{
return [
'type' => $type,
'id' => $id,
];
}
private function getActivityOwnerId(Activity $activity): ?string
{
$ownerId = null;
if ($activity->hasUser() && $activity->getUser()->getProfile() !== null) {
$ownerId = $activity->getUser()->getProfile()->getCrmProviderId();
}
return $ownerId;
}
#[\Override] public function saveFollowupActivity(Activity $activity, array $fields): ?string
{
$taskPayload = [
'subject' => $fields['subject'],
'dueTime' => isset($fields['dueDate']) ? Carbon::parse($fields['dueDate'])->format('Y-m-d') : null,
'ownerId' => $this->getActivityOwnerId($activity),
];
if (isset($fields['status'])) {
$taskPayload['status'] = $fields['status'];
}
if (isset($fields['priority'])) {
$taskPayload['priority'] = $fields['priority'];
}
if (isset($fields['content'])) {
$taskPayload['content'] = $fields['content'];
}
$payload = array_merge($taskPayload, $this->attachToProspect($activity));
$this->logger->info('[integration-app] CRM log follow up task', [
'activity' => $activity->getUuid(),
'payload' => $payload,
]);
$task = $this->client->createTask($payload);
return $task['id'] ?? null;
}
#[\Override] public function saveTranscriptionSummaryAsNote(
ActivityContract $activity,
string $title,
string $body,
?string $objectId,
?NoteObject $noteObject = null,
): ?string {
// We have to find a way to store the transcription summary
// This might be possible either by Tasks, Events, Engagements & Notes
// Find what the CRM supports and save the note with the appropriate object(eg Notes)
// For now use only Notes as both ZOHO & Salesforce support them.
if ($this->supportsNotes() && $objectId !== null) {
$this->logger->info('[integration-app] saving note', [
'activityId' => $activity->getUuid(),
'objectId' => $objectId,
]);
return $this->saveNote($title, $body, $objectId, $noteObject);
}
$this->logger->info('[integration-app] skip saveTranscriptionSummaryAsNote', [
'activityId' => $activity->getUuid(),
'supportsNotes' => $this->supportsNotes(),
'objectId' => $objectId,
]);
return null;
}
public function generateProviderUrl(string $providerId, string $objectType): ?string
{
return $this->getCrmUrlGenerator()?->generateProviderUrl($providerId, $objectType);
}
public function updateStage($crmObject, Stage $stage): void
{
$objectType = $stage->getType();
$objectId = $crmObject->getCrmProviderId();
$params = ['stageName' => $stage->getCrmProviderId()];
$this->logger->info('[integration-app] updateStage', [
'objectType' => $objectType,
'objectId' => $objectId,
'params' => $params,
]);
$data = [
'data' => $this->normalizeData($objectType, $params),
];
if ($objectType === Stage::TYPE_LEAD) {
$this->client->updateLead($objectId, $data);
} else {
$this->client->updateDeal($objectId, $data);
}
}
/**
* @throws \Exception
*/
public function fetchAndAssociateRelatedActivity(Activity $activity): ?Activity
{
if ($activity->getCrm()?->getEdition() !== IntegrationAppProviders::ZOHO_CRM) {
return null;
}
if (! $activity->isTypeConference()) {
return null;
}
// The related activity is already linked.
if ($activity->hasCrmProviderId()) {
return $activity;
}
if ($activity->hasActualStartTime() === false) {
return null;
}
return $this->fetchAndAssociateZohoRelatedActivity($activity);
}
public function fetchAndAssociateZohoRelatedActivity(Activity $activity): ?Activity
{
try {
$meeting = $this->fetchRelatedZohoActivity($activity);
if (empty($meeting)) {
$this->logger->info('[integration-app] fetchRelatedZohoActivity No related activity found', [
'activity' => $activity->getUuid(),
]);
return null;
}
$decorateActivity = app(DecorateActivity::class);
$oldDescription = $meeting['Description'] ?? '';
$updatedDescription = $decorateActivity->generateUpdatedDescription($oldDescription, $activity);
$this->logger->info('[integration-app] fetchAndAssociateZohoRelatedActivity updating related activity', [
'activity' => $activity->getUuid(),
'description' => $updatedDescription,
]);
$this->client->updateMeeting($meeting['id'], ['Description' => $updatedDescription]);
// Update our activity to reflect the remote data.
$activity->update([
'crm_provider_id' => $meeting['id'],
'summary' => $meeting['Description'],
]);
return $activity;
} catch (\Exception $exception) {
\Sentry::captureException($exception);
throw $exception;
}
}
public function fetchRelatedZohoActivity(Activity $activity): array
{
[$from, $to] = $this->getFromToDates($activity);
$start = $from?->toIso8601String(); // e.g., 2025-07-01T00:00:00+00:00
$end = $to?->toIso8601String(); // e.g., 2025-07-14T23:59:59+00:00
if ($start === null || $end === null) {
$this->logger->info(
'[integration-app] fetchRelatedZohoActivity missing start or end date',
[
'activity' => $activity->getUuid(),
'start' => $start,
'end' => $end,
'from' => $from,
'to' => $to,
]
);
return [];
}
$whoId = null;
$whatId = null;
$criteriaParts = [];
if ($activity->getContact()) {
$whoId = $activity->getContact()->getCrmProviderId();
$criteriaParts[] = "(Who_Id:equals:$whoId)";
}
if ($activity->getOpportunity()) {
$whatId = $activity->getOpportunity()->getCrmProviderId();
} elseif ($activity->getAccount() && $activity->getAccount()->getIsInternal() === false) {
$whatId = $activity->getAccount()->getCrmProviderId();
} elseif ($activity->getLead()) {
$whatId = $activity->getLead()->getCrmProviderId();
}
if ($whatId !== null) {
$criteriaParts[] = "(What_Id:equals:$whatId)";
}
if ($whoId === null && $whatId === null) {
$this->logger->info(
'[integration-app] fetchRelatedZohoActivity cannot find prospect',
[
'activity' => $activity->getUuid(),
]
);
return [];
}
$criteriaParts[] = "(Start_DateTime:greater_equal:$start)";
$criteriaParts[] = "(End_DateTime:less_equal:$end)";
$criteria = implode(' AND ', $criteriaParts);
$params = [
'criteria' => $criteria,
'sort_by' => 'Modified_Time',
'sort_order' => 'desc',
];
$this->logger->info(
'[integration-app] fetchRelatedZohoActivity searching for related activity',
[
'activity' => $activity->getUuid(),
'params' => $params,
]
);
$meetings = $this->client->searchMeetings($params);
if (! empty($meetings)) {
return $meetings[0];
}
return [];
}
private function getFromToDates(Activity $activity): array
{
$calendarEvent = $activity->calendarEvent()->first();
$from = $calendarEvent?->getStartTime();
$to = $calendarEvent?->getEndTime();
if (! $from || ! $to) {
$from = $activity->hasScheduledStartTime()
? $activity->getScheduledStartTime()
: $activity->getActualStartTime();
$to = $activity->hasScheduledEndTime()
? $activity->getScheduledEndTime()->addMinutes(15)
: $activity->getActualEndTime();
}
return [$from, $to];
}
}
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
8
1
3
4
Previous Highlighted Error
Next Highlighted Error
SELECT
# DISTINCT
opp.id as opp_id, opp.uuid, opp.name,
# COUNT(dr.id) AS deal_risk_count,
# dr.id,
# cfd.value,
usr.name AS owner_name,
opp.value, opp.currency_code, opp.close_date, opp.remotely_created_at, opp.is_closed, opp.is_won,
usr.uuid as owner_uuid,
usr.photo_path as owner_photo,
usr.id AS owner_id,
jt.name as owner_job,
opp.stage_id, opp.stage_updated_at,
acc.name AS acc_name, opp.stage_updated_at, acc.crm_provider_id AS acc_provider_id, opp.crm_provider_id AS opp_provider_id,
rt.business_process_id AS pipeline_id
FROM opportunities opp
LEFT JOIN record_types rt ON opp.record_type_id = rt.id
LEFT JOIN users usr ON opp.user_id = usr.id
LEFT JOIN accounts acc ON opp.account_id = acc.id
LEFT JOIN job_titles jt ON usr.job_title_id = jt.id
# LEFT JOIN group_deal_risk_types gdrt ON gdrt.group_id = usr.group_id
# LEFT JOIN deal_risks dr ON dr.opportunity_id = opp.id AND dr.group_deal_risk_type_id = gdrt.id
LEFT JOIN crm_field_data cfd ON (cfd.object_id = opp.id and cfd.crm_field_id = 66814)
WHERE opp.user_id IS NOT NULL
AND opp.deleted_at IS NULL
AND opp.is_closed = 1
AND opp.is_won = 0
AND opp.close_date >= '2024-01-01 00:00:00'
AND opp.close_date <= '2024-12-31 23:59:59'
AND usr.team_id = 1
# and opp.id = 4823179
GROUP BY opp.id, cfd.value
ORDER BY
# cfd.value
CAST(cfd.value AS UNSIGNED)
# owner_name
# (SELECT COUNT(dr.id)
# FROM deal_risks dr
# JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id
# WHERE dr.opportunity_id = opp.id
# AND dr.is_active = 1
# AND gdrt.is_enabled = 1)
DESC
LIMIT 25
# OFFSET 0
;
select * from crm_fields where crm_configuration_id = 1 and object_type = 'opportunity';
select * from crm_layout_entities where crm_layout_id = 1493;
SELECT * FROM opportunities WHERE id = 4584045;
SELECT * FROM crm_field_data WHERE object_id = 4584045;
SELECT * FROM opportunities where team_id = 1 and crm_provider_id = '0061K00000lfb9IQAQ'
SELECT
opp.id as opportunity_id,
opp.name,
COUNT(dr.id) as risk_count
FROM opportunities opp
LEFT JOIN deal_risks dr ON dr.opportunity_id = opp.id
WHERE opp.id IN (
6069574,8900938,9507638,9524799,9660490,9662824,9705675,9749758,4158460,4391812,6450439,4448422,5118945,5590675,4584045,7228149,9002408,9165534,9446720,9641778,9665149,9703344,9709280,5747948,4158491,6182565,6263970,5798120,5111315,4536978,6062352,6548383,6072095,6548225,4480986,5011422,6548381,8760540,8917554,9509986,9514392,9569009,9569011,9578490,9713604,5784397,7276612,7288405,8994421,9118219,9608148,9818911,4510535,6479693,5958049,6271674,6550448,4158331,4158483,6126571,6171615,6540943,4897466,5190896,5796182,5932762,8572433,8723698,8892697,9711001,9789264,4549188,6100831,6170064,6260799,6263653,6449936,6530871,6538978,7777651,8059269,8319918,8787049,8901150,9263153,9453207,9514738,9696700,9791062,5752018,6421452,7439134,7878923,9354763,9369285,9514396,9582506,9889949,9890216,4094311,4158495,4158496,6098128,5585661,3872564,6442149,5891604,6164746,6199593,6583474,6519684,9018490,9809006,4496897,5041324,5829430,6198319,6253504,6555763,7242914,7931055,8024125,8797814,8058559,8673347,8892695,8994420,9616219,9714970,9722004,9809439,9818918,6523177,8134147,9002915,9711422,9892713,9901719,9954210,9978435,5800810,6243518,6416114,6222251,6411974,6512456,5791953,6545606,9914780,5805540,6238986,6463838,6547680,9767049,9809437,9810885,9890855,6673493,9902036,4335521,6379871,6503799,6546077,8018765,9907556,9958433,9905855,9916179,9946741,9957877,5563344,6271838,6450815,7641128,7762567,7780592,8684810,8685786,8685787,8685788
)
GROUP BY opp.id;
SELECT COUNT(dr.id)
FROM deal_risks dr
JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id
WHERE dr.opportunity_id = 5563344
# AND gdrt.group_id = usr.group_id
EXPLAIN SELECT
opp.id as opp_id, opp.uuid, opp.name,
cfd.value,
cfv.sequence,
cfv.value,
# MAX(cfd.value) AS max_cfd_value,
usr.name AS owner_name,
opp.value, opp.currency_code, opp.close_date, opp.remotely_created_at, opp.is_closed, opp.is_won,
usr.uuid as owner_uuid,
usr.photo_path as owner_photo,
usr.id AS owner_id,
jt.name as owner_job,
opp.stage_id, opp.stage_updated_at,
acc.name AS acc_name, opp.stage_updated_at, acc.crm_provider_id AS acc_provider_id, opp.crm_provider_id AS opp_provider_id,
rt.business_process_id AS pipeline_id
FROM opportunities opp
LEFT JOIN record_types rt ON opp.record_type_id = rt.id
LEFT JOIN users usr ON opp.user_id = usr.id
LEFT JOIN accounts acc ON opp.account_id = acc.id
LEFT JOIN job_titles jt ON usr.job_title_id = jt.id
LEFT JOIN crm_field_data cfd ON cfd.id = (SELECT sub_cfd.id
FROM crm_field_data sub_cfd
WHERE sub_cfd.object_id = opp.id
AND sub_cfd.crm_field_id = 66810
ORDER BY sub_cfd.updated_at DESC
LIMIT 1)
LEFT JOIN crm_field_values cfv ON cfv.crm_field_id = 66810 AND cfv.value = cfd.value
WHERE opp.user_id IS NOT NULL
AND opp.deleted_at IS NULL
AND opp.is_closed = 0
# AND opp.is_closed = 1
# AND opp.is_won = 0
AND opp.close_date >= '2024-01-01 00:00:00'
AND opp.close_date <= '2024-12-31 23:59:59'
AND usr.team_id = 1
# and opp.id = 4823179
# GROUP BY opp.id
ORDER BY
cfv.sequence DESC,
# opp.name
# owner_name
cfd.value
# CAST(cfd.value AS UNSIGNED)
# CAST(MAX(cfd.value) AS UNSIGNED)
# (SELECT COUNT(dr.id)
# FROM deal_risks dr
# JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id
# WHERE dr.opportunity_id = opp.id
# AND dr.is_active = 1 AND gdrt.is_enabled = 1)
DESC
# LIMIT 75, 25
;
SELECT * FROM crm_field_values WHERE crm_field_id = 66810;
SELECT f.id, f.crm_provider_id AS field_name, f.label, fd.object_id AS dealId, fd.value, fd.updated_at, fd.id, fd.created_at
FROM crm_fields f
INNER JOIN crm_field_data fd ON fd.crm_field_id = f.id
WHERE (f.crm_configuration_id = 1)
AND (f.object_type = 'opportunity')
# AND (fd.object_id IN (4158331,4158483,4158495,4158496,6069574,6263970,6171615,6540943,6545606,5829430,6198319,6263653,6548381,7242914,8797814,7228149,7439134,7878923,8134147,9002915,9118219,9165534,9354763,9369285,9446720))
AND (fd.object_id IN (4158460))
AND (f.crm_provider_id IN ('ForecastCategoryName'))
ORDER BY fd.object_id ASC, fd.updated_at DESC;
select * from crm_layouts where crm_configuration_id = 1;
select cf.* from crm_fields cf
join crm_layout_entities cle on cf.id = cle.crm_field_id
where crm_layout_id = 1493;
SELECT * FROM opportunities WHERE id = 4158460;
SELECT * FROM crm_field_data WHERE object_id = 4158460;
select * from users where team_id = 1;
SELECT * FROM users WHERE id = 7160;
select * from role_user where user_id = 3248;
select * from crm_field_values where crm_field_id = 66824;
SELECT * FROM users WHERE id = 23470;
select * from crm_configurations;
# [PASSWORD_DOTS]
select * from teams where id = 1038; # 23521, 966
select * from users where team_id = 1038;
select * from crm_configurations where id = 966;
SELECT * FROM activities WHERE uuid_to_bin('e8dc7c34-31f6-4430-bd81-2d9d8f00dd07') = uuid; # 54965762
SELECT * FROM activities WHERE uuid_to_bin('4b5727c0-69d1-428f-b8d9-b649055166e2') = uuid; # 54965764
SELECT * FROM participants WHERE activity_id = 54965764;
SELECT id, uuid, title, recording_state FROM activities WHERE uuid_to_bin('355f105d-5606-4379-b0c5-d91daf59f4ce') = uuid; # 54964075
SELECT * FROM participants WHERE activity_id = 54964075;
select f.id, slug, title, tf.team_id from team_features tf JOIN features f on tf.feature_id = f.id
where tf.team_id = 1038;
# [PASSWORD_DOTS] PD [PASSWORD_DOTS]
select * from teams where id = 1029;
SELECT * FROM crm_configurations WHERE id = 957;
SELECT * FROM activities WHERE uuid_to_bin('581a33cb-4343-44bd-ac0c-4a5cee71c5ec') = uuid; # 54963423
SELECT * FROM activities WHERE uuid_to_bin('07238011-25fa-418e-838b-fb21e82b9ea2') = uuid; # 54963433
SELECT * FROM activities WHERE uuid_to_bin('8b6bb2f7-e7a7-4aec-8806-fbfea7093ccd') = uuid; # 54963421
# [PASSWORD_DOTS] Close [PASSWORD_DOTS]
select * from teams where id = 1031;
SELECT * FROM crm_configurations WHERE id = 959;
SELECT * FROM activities WHERE uuid_to_bin('59c517e0-96c9-4dad-bfeb-b7bef72f8725') = uuid; # 54963517
SELECT * FROM activities WHERE uuid_to_bin('07238011-25fa-418e-838b-fb21e82b9ea2') = uuid; # 54963433
SELECT * FROM activities WHERE uuid_to_bin('d68311e3-ac34-49bd-bf04-88323a7e5352') = uuid; # 54966009
# [PASSWORD_DOTS] SF [PASSWORD_DOTS]
SELECT * FROM activities WHERE uuid_to_bin('2bd4cfa3-4eb5-4c77-84a7-9ed46a21c988') = uuid;
select * from roles;
select * from permissions;
select * from permission_role where permission_id = 136;
select * from migrations order by id desc;
select * from teams where id IN (1, 1037);
select * from crm_layouts where crm_configuration_id = 1;
SELECT * FROM crm_layout_entities WHERE crm_layout_id = 1493;
SELECT * FROM crm_fields WHERE id IN (1652,1661,66799,66814,66821,66836,66843,66846,66864,84752,182306,323580,380378);
select * from features;
select * from team_features where feature_id = 33;
select * from opportunities;
select * from teams;
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 = 1052 and sa.provider = 'hubspot';
SELECT * FROM accounts where id = 11512582;
select * from activities where account_id = 11512582;
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.054166667,"top":0.027777778,"width":0.08055556,"height":0.035555556},"on_screen":true,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"#12066 on JY-20725-handle-HS-search-rate-limit, menu","depth":5,"bounds":{"left":0.13472222,"top":0.027777778,"width":0.25555557,"height":0.035555556},"on_screen":true,"help_text":"Pull request #12066 exists for current branch JY-20725-handle-HS-search-rate-limit, but local branch is out of sync with remote","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"bounds":{"left":0.6326389,"top":0.027777778,"width":0.023611112,"height":0.035555556},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"HandleHubspotRateLimitTest","depth":6,"bounds":{"left":0.6645833,"top":0.027777778,"width":0.15902779,"height":0.035555556},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run 'HandleHubspotRateLimitTest'","depth":6,"bounds":{"left":0.82361114,"top":0.027777778,"width":0.023611112,"height":0.035555556},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'HandleHubspotRateLimitTest'","depth":6,"bounds":{"left":0.8472222,"top":0.027777778,"width":0.023611112,"height":0.035555556},"on_screen":true,"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.87083334,"top":0.027777778,"width":0.023611112,"height":0.035555556},"on_screen":true,"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.9291667,"top":0.027777778,"width":0.023611112,"height":0.035555556},"on_screen":true,"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.9527778,"top":0.027777778,"width":0.023611112,"height":0.035555556},"on_screen":true,"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.9763889,"top":0.027777778,"width":0.023611112,"height":0.035555556},"on_screen":true,"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},"on_screen":false,"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},"on_screen":false,"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},"on_screen":false,"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},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"16","depth":4,"bounds":{"left":0.77708334,"top":0.3122222,"width":0.02013889,"height":0.02111111},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"2","depth":4,"bounds":{"left":0.80138886,"top":0.3122222,"width":0.016666668,"height":0.02111111},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.8215278,"top":0.31,"width":0.015277778,"height":0.025555555},"on_screen":true,"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.8368056,"top":0.31,"width":0.014583333,"height":0.025555555},"on_screen":true,"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\\IntegrationApp;\n\nuse Carbon\\Carbon;\nuse Jiminny\\Contracts\\Crm\\Providers;\nuse Jiminny\\Contracts\\Services\\Crm\\ClientInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\FetchRelatedActivityInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\ImportsBusinessProcessesInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\LayoutManagementInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\MatchCrmEntitiesInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\Provider\\IntegrationAppInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\RemoteEntityLookupInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\RemoteEntityManipulationInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\RemoteNoteEntityManipulationInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\SendSummaryToCrmInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\SettingsInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\SyncCrmEntitiesInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\SyncCrmMetadataInterface;\nuse Jiminny\\Events\\Activities\\Crm\\ActivityLeadConverted;\nuse Jiminny\\Exceptions\\CrmException;\nuse Jiminny\\Exceptions\\SocialAccountNotFoundException;\nuse Jiminny\\Jobs\\Crm\\NoteObject;\nuse Jiminny\\Models\\Account;\nuse Jiminny\\Models\\Activity;\nuse Jiminny\\Models\\Contracts\\ActivityContract;\nuse Jiminny\\Models\\Crm\\Configuration;\nuse Jiminny\\Models\\Opportunity;\nuse Jiminny\\Models\\Stage;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Services\\Crm\\BaseService;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\Config\\IntegrationAppProviders;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\Config\\IntegrationConfigFactory;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\DTO\\Mappers\\FieldMapperInterface;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\DTO\\Mappers\\LeadFieldMapper;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\DTO\\Utils\\GenerateProviderUrlInterface;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\DTO\\Utils\\IntegrationAppCrmGeneratorFactory;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\DTO\\Utils\\UrlGeneratorInterface;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\ServiceTraits\\SyncCrmFieldsTrait;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\ServiceTraits\\SystemStateTrait;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\ServiceTraits\\LayoutTrait;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\ServiceTraits\\MatchProspectsTrait;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\ServiceTraits\\NotSupportedTrait;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\ServiceTraits\\SyncCrmEntitiesTrait;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\ServiceTraits\\SyncCrmMetadataTrait;\nuse Psr\\Log\\LoggerInterface;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\DTO\\Mappers\\OpportunityFieldMapper;\nuse Jiminny\\Repositories\\Crm\\ProfileRepository;\nuse Jiminny\\Repositories\\Crm\\OpportunityRepository;\nuse Jiminny\\Models\\Crm\\Profile;\nuse Jiminny\\Services\\Crm\\CrmObjects\\CrmObjectsRepository;\n\nclass Service extends BaseService implements\n IntegrationAppInterface,\n SyncCrmEntitiesInterface,\n SyncCrmMetadataInterface,\n ImportsBusinessProcessesInterface,\n RemoteEntityManipulationInterface,\n LayoutManagementInterface,\n SettingsInterface,\n MatchCrmEntitiesInterface,\n RemoteEntityLookupInterface,\n RemoteNoteEntityManipulationInterface,\n SendSummaryToCrmInterface,\n UrlGeneratorInterface,\n FetchRelatedActivityInterface\n{\n use SyncCrmMetadataTrait;\n use SyncCrmEntitiesTrait;\n use SystemStateTrait;\n use LayoutTrait;\n use NotSupportedTrait;\n use MatchProspectsTrait;\n use SyncCrmFieldsTrait;\n\n public const string CALL_TYPE_MISSED = 'Missed';\n public const string CALL_TYPE_INBOUND = 'Inbound';\n public const string CALL_TYPE_OUTBOUND = 'Outbound';\n public const string RELATIONSHIP_OPPORTUNITY = 'Deals';\n public const string RELATIONSHIP_LEAD = 'Leads';\n public const string RELATIONSHIP_ACCOUNT = 'Accounts';\n\n /**\n * @var ClientInterface&DataClient\n */\n protected $client;\n\n protected ?User $invokedUser = null;\n\n protected ?GenerateProviderUrlInterface $crmUrlGenerator = null;\n\n public function __construct(\n DataClient $client,\n LoggerInterface $logger,\n ) {\n parent::__construct();\n $this->client = $client;\n $this->logger = $logger;\n }\n\n public function getDisplayName(): string\n {\n return Providers::getProviderDisplayName(\n Providers::getCrmIntegrationSlug($this->config)\n );\n }\n\n /**\n * @throws \\Exception\n */\n public function setUser(User $user): void\n {\n $this->configureSentryScope($user);\n $this->invokedUser = $user;\n\n $this->team = $user->getTeam();\n $teamOwner = $this->team->getOwner();\n\n $this->setConfiguration($user->getTeam()->getCrmConfiguration());\n $this->setEditionConfiguration(Providers::getCrmIntegrationSlug($this->config));\n $this->setCrmUrlGenerator($this->config);\n\n $this->client->setTeam($this->team);\n $socialAccount = $teamOwner?->getSocialAccount('integration-app');\n if ($socialAccount === null) {\n $this->logger->info('[integration-app] Social account not found', [\n 'teamId' => $this->team->getId(),\n 'teamOwnerId' => $teamOwner?->getId(),\n 'userId' => $user->getId(),\n ]);\n\n throw new SocialAccountNotFoundException('Social account not found!');\n }\n $this->client->setSocialAccount($socialAccount);\n\n // The CRM Service is properly bootstrapped, and supports remote operations\n $this->connect();\n }\n\n public function normalizeValue(string $fieldType, string $fieldValue, bool $internal = false): string\n {\n return $fieldValue;\n }\n\n public function find(string $name, array $scopes): array\n {\n /** @var LocalSearch $localSearch */\n $localSearch = app(LocalSearch::class);\n $localSearch->setConfiguration($this->config);\n $localSearch->setCountryCode($this->invokedUser->getCountryCode());\n\n return $localSearch->search($name);\n\n // if (! empty($localMatch)) {\n // return $localMatch;\n // }\n //\n // /** @var RemoteSearch $remoteSearch */\n // $remoteSearch = app(RemoteSearch::class);\n // $remoteSearch->setClient($this->client);\n // $remoteSearch->setConfiguration($this->config);\n //\n // return $remoteSearch->search($name);\n }\n\n public function findOpportunities(?string $crmAccountId, ?string $crmContactId, ?int $userId = null): array\n {\n $data = [];\n $ownerData = [];\n\n $account = $this->getAccount($crmAccountId, $crmContactId);\n if ($account === null) {\n return [];\n }\n\n $ownerId = $this->getOwnerId($userId);\n\n try {\n $opportunityRepository = app(OpportunityRepository::class);\n $opportunities = $opportunityRepository->findAllByConfigurationAndAccountId(\n $this->config,\n $account->getId()\n );\n\n foreach ($opportunities as $opportunity) {\n /** @var Opportunity $opportunity */\n $record = $this->buildOpportunityData($opportunity);\n\n if ($ownerId && $opportunity->getOwnerId() === $ownerId) {\n $ownerData[] = $record;\n }\n\n $data[] = $record;\n }\n\n if (! empty($ownerData)) {\n return $ownerData;\n }\n\n return $data;\n } catch (\\Exception $e) {\n $this->logger->info('[integration-app] Failed to fetch opportunities', [\n 'contact' => $crmContactId,\n 'account' => $crmAccountId,\n 'owner' => $ownerId,\n 'error' => $e->getMessage(),\n ]);\n\n return $data;\n }\n }\n\n private function getOwnerId(?int $userId = null): ?string\n {\n if (! $userId) {\n return null;\n }\n\n $profileRepository = app(ProfileRepository::class);\n $profile = $profileRepository->findProfileByUserId($this->config, $userId);\n\n return $profile instanceof Profile ? $profile->getCrmProviderId() : null;\n }\n\n private function getAccount(?string $crmAccountId = null, ?string $crmContactId = null): ?Account\n {\n $crmRepository = app(CrmObjectsRepository::class);\n\n if ($crmAccountId === null) {\n $contact = $crmRepository->findContactByCrmProviderId($this->config, $crmContactId);\n\n return $contact->getAccount();\n }\n\n return $crmRepository->findAccountByCrmProviderId($this->config, $crmAccountId);\n }\n\n private function buildOpportunityData(Opportunity $opportunity): array\n {\n $record = [\n 'crmId' => $opportunity->getCrmProviderId(),\n 'name' => $opportunity->getName(),\n 'won' => $opportunity->isWon(),\n 'closed' => $opportunity->isClosed(),\n ];\n\n if (! empty($opportunity->getFormattedValueAttribute())) {\n $record['value'] = $opportunity->getFormattedValueAttribute();\n }\n\n if (! empty($opportunity->getStage())) {\n $record['stage'] = [\n 'id' => $opportunity->getStage()->getUuid(),\n 'name' => $opportunity->getStage()->getName(),\n ];\n }\n\n return $record;\n }\n\n public function updateRecord(string $objectType, string $objectId, array $data, array $headers = []): void\n {\n $data = [\n 'data' => $this->normalizeData($objectType, $data),\n ];\n\n $this->client->updateRecordById($objectType, $objectId, $data);\n }\n\n private function normalizeData(string $objectType, array $data): array\n {\n $fieldMapper = $this->getFieldMapper($objectType);\n\n if (! $fieldMapper instanceof FieldMapperInterface) {\n return $data;\n }\n\n return $fieldMapper->mapToCrmFields($data);\n }\n\n private function getFieldMapper(string $objectType): ?FieldMapperInterface\n {\n if ($objectType === self::OBJECT_OPPORTUNITY) {\n return app(OpportunityFieldMapper::class);\n }\n\n if ($objectType === self::OBJECT_LEAD) {\n return app(LeadFieldMapper::class);\n }\n\n return null;\n }\n\n public function getRecord(string $objectType, string $objectId, array $fields = []): array\n {\n return $this->client->getRecordById($objectType, $objectId);\n }\n\n public function getConfiguration(): Configuration\n {\n return $this->config;\n }\n\n public function setConfiguration(Configuration $config): void\n {\n $this->clearExternalMapCache();\n\n $this->config = $config;\n }\n\n private function setEditionConfiguration(string $provider): void\n {\n $this->editionConfig = app(IntegrationConfigFactory::class)->create($provider);\n }\n\n public function setCrmUrlGenerator(Configuration $config): void\n {\n $this->crmUrlGenerator = app(IntegrationAppCrmGeneratorFactory::class)->create($config);\n }\n\n public function getCrmUrlGenerator(): ?GenerateProviderUrlInterface\n {\n if ($this->crmUrlGenerator === null) {\n $this->setCrmUrlGenerator($this->config);\n }\n\n return $this->crmUrlGenerator;\n }\n\n public function subscribeEntityEvents(bool $enableTrigger = true): void\n {\n $eventStates = $this->client->updateEntityEventsState($enableTrigger);\n\n $this->logger->info('[integration-app] Change team entity events subscription', [\n 'teamId' => $this->team->getId(),\n 'teamName' => $this->team->getName(),\n 'states' => $eventStates,\n 'action' => $enableTrigger ? 'subscribe' : 'unsubscribe',\n ]);\n }\n\n #[\\Override] public function supportsNotes(): bool\n {\n return $this->editionConfig->supportsNotes();\n }\n\n #[\\Override] public function saveNote(\n string $title,\n string $body,\n string $objectId,\n ?NoteObject $noteObject = null,\n ): ?string {\n if ($noteObject === null) {\n return null;\n }\n\n $notePayload = [\n 'title' => $title,\n 'content' => $body,\n 'objectId' => $objectId,\n 'objectType' => $noteObject->value,\n ];\n\n $result = $this->client->createNote($notePayload);\n\n // debug saving note response\n $this->logger->info('[integration-app] createNote response', [\n 'objectId' => $objectId,\n 'objectType' => $noteObject->value,\n 'result' => $result,\n 'hasId' => isset($result['id']),\n ]);\n\n return $result['id'] ?? null;\n }\n\n /**\n * @throws CrmException\n */\n #[\\Override] public function saveActivity(Activity $activity): Activity\n {\n $this->logger->info('[integration-app] saveActivity', [\n 'activity' => $activity->getUuid(),\n 'type' => $activity->getType(),\n ]);\n\n if ($activity->getCrmType() === Activity::TYPE_CONFERENCE) {\n $crmActivity = $this->saveMeeting($activity);\n } elseif (in_array($activity->getType(), [Activity::TYPE_SOFTPHONE, Activity::TYPE_SOFTPHONE_INBOUND])) {\n $crmActivity = $this->saveCall($activity);\n } else {\n throw new CrmException('Unsupported activity type');\n }\n\n $crmActivityId = $crmActivity['id'] ?? null;\n\n if ($crmActivityId !== null) {\n $activity->crm_provider_id = $crmActivityId;\n $activity->save();\n\n $this->logger->info('[integration-app] Activity successfully logged to CRM', [\n 'activity' => $activity->getUuid(),\n 'type' => $activity->getType(),\n 'crmId' => $crmActivityId,\n ]);\n }\n\n return $activity;\n }\n\n public function saveMeeting(Activity $activity): array\n {\n $decorateActivity = app(DecorateActivity::class);\n\n $meetingPayload = [\n 'Event_Title' => $decorateActivity->generateTitle($activity),\n 'Start_DateTime' => $activity->getActualStartTime()->toIso8601String(),\n 'End_DateTime' => $activity->getActualEndTime()->toIso8601String(),\n 'ownerId' => $this->getActivityOwnerId($activity),\n ];\n\n $payload = array_merge($meetingPayload, $this->attachToProspect($activity));\n\n if ($activity->hasCrmProviderId()) {\n $crmId = $activity->getCrmProviderId();\n $meeting = $this->client->getMeeting($crmId);\n\n $oldDescription = $meeting['fields']['Description'] ?? null;\n $payload['Description'] = $decorateActivity->generateUpdatedDescription($oldDescription, $activity);\n\n $this->logger->info('[integration-app] CRM update meeting', [\n 'activity' => $activity->getUuid(),\n 'crm_id' => $crmId,\n 'payload' => $payload,\n ]);\n\n return $this->client->updateMeeting($crmId, $payload);\n }\n\n $payload['Description'] = $decorateActivity->generateDescription($activity);\n\n $this->logger->info('[integration-app] CRM log meeting', [\n 'activity' => $activity->getUuid(),\n 'payload' => $payload,\n ]);\n\n return $this->client->createMeeting($payload);\n }\n\n public function saveCall(Activity $activity): array\n {\n $decorateActivity = app(DecorateActivity::class);\n\n $callPayload = [\n 'Call_Type' => $this->getCallType($activity),\n 'Call_Start_Time' => $activity->getActualStartTime()->toIso8601String(),\n 'Call_Duration' => $activity->getDuration(),\n 'name' => $decorateActivity->generateTitle($activity),\n 'ownerId' => $this->getActivityOwnerId($activity),\n ];\n\n $payload = array_merge($callPayload, $this->attachToProspect($activity));\n\n if ($activity->hasCrmProviderId()) {\n $crmId = $activity->getCrmProviderId();\n $call = $this->client->getCall($crmId);\n\n $oldDescription = $call['fields']['Description'] ?? null;\n $payload['description'] = $decorateActivity->generateUpdatedDescription($oldDescription, $activity);\n\n $this->logger->info('[integration-app] CRM update call', [\n 'activity' => $activity->getUuid(),\n 'crm_id' => $crmId,\n 'payload' => $payload,\n ]);\n\n return $this->client->updateCall($crmId, $payload);\n }\n\n $payload['description'] = $decorateActivity->generateDescription($activity);\n\n $this->logger->info('[integration-app] CRM log call', [\n 'activity' => $activity->getUuid(),\n 'payload' => $payload,\n ]);\n\n return $this->client->createCall($payload);\n }\n\n private function getCallType(Activity $activity): string\n {\n if ($activity->getStatus() === Activity::STATUS_NO_ANSWER) {\n return self::CALL_TYPE_MISSED;\n }\n\n return $activity->getType() === Activity::TYPE_SOFTPHONE_INBOUND ? self::CALL_TYPE_INBOUND : self::CALL_TYPE_OUTBOUND;\n }\n\n private function attachToProspect(Activity $activity): array\n {\n $payload = [];\n\n if ($activity->hasContact()) {\n $payload['contactId'] = $activity->getContact()->getCrmProviderId();\n }\n\n if ($activity->hasOpportunity()) {\n return array_merge(\n $payload,\n $this->buildBasicPayload(\n self::RELATIONSHIP_OPPORTUNITY,\n $activity->getOpportunity()->getCrmProviderId()\n )\n );\n }\n\n if ($activity->hasAccount() && ! $activity->getAccount()->getIsInternal()) {\n return array_merge(\n $payload,\n $this->buildBasicPayload(\n self::RELATIONSHIP_ACCOUNT,\n $activity->getAccount()->getCrmProviderId()\n )\n );\n }\n\n if ($activity->hasLead()) {\n $payload = $this->handleLeadPayload($activity);\n }\n\n return $payload;\n }\n\n private function handleLeadPayload(Activity $activity): array\n {\n $freshLead = $this->syncLead($activity->getLead()->getCrmProviderId());\n $lead = $freshLead ?? $activity->getLead();\n\n if ($lead->getConvertedAt() === null) {\n return $this->buildBasicPayload(self::RELATIONSHIP_LEAD, $lead->getCrmProviderId());\n }\n\n $activity->lead_id = null;\n\n if ($lead->hasAccount()) {\n $account = $lead->getAccount();\n $activity->account_id = $account->getId();\n $payload = $this->buildBasicPayload(self::RELATIONSHIP_ACCOUNT, $account->getCrmProviderId());\n } else {\n $payload = [];\n }\n\n if ($lead->hasOpportunity()) {\n $opportunity = $lead->getOpportunity();\n $payload = $this->buildBasicPayload(self::RELATIONSHIP_OPPORTUNITY, $opportunity->getCrmProviderId());\n $activity->opportunity_id = $opportunity->getId();\n $activity->value = $opportunity->value;\n $activity->stage_id = $opportunity->stage_id;\n } else {\n $activity->stage_id = null;\n }\n\n if ($lead->hasContact()) {\n $contact = $lead->getContact();\n $payload['contactId'] = $contact->getCrmProviderId();\n $activity->contact_id = $contact->getId();\n }\n\n $activity->save();\n event(new ActivityLeadConverted($activity, $lead));\n\n $this->logger->info('[integration-app] Lead converted', [\n 'activityUuid' => $activity->getUuid(),\n 'leadUuid' => $lead->getUuid(),\n ]);\n\n return $payload;\n }\n\n private function buildBasicPayload(string $type, string $id): array\n {\n return [\n 'type' => $type,\n 'id' => $id,\n ];\n }\n private function getActivityOwnerId(Activity $activity): ?string\n {\n $ownerId = null;\n if ($activity->hasUser() && $activity->getUser()->getProfile() !== null) {\n $ownerId = $activity->getUser()->getProfile()->getCrmProviderId();\n }\n\n return $ownerId;\n }\n\n #[\\Override] public function saveFollowupActivity(Activity $activity, array $fields): ?string\n {\n $taskPayload = [\n 'subject' => $fields['subject'],\n 'dueTime' => isset($fields['dueDate']) ? Carbon::parse($fields['dueDate'])->format('Y-m-d') : null,\n 'ownerId' => $this->getActivityOwnerId($activity),\n ];\n\n if (isset($fields['status'])) {\n $taskPayload['status'] = $fields['status'];\n }\n\n if (isset($fields['priority'])) {\n $taskPayload['priority'] = $fields['priority'];\n }\n\n if (isset($fields['content'])) {\n $taskPayload['content'] = $fields['content'];\n }\n\n $payload = array_merge($taskPayload, $this->attachToProspect($activity));\n\n $this->logger->info('[integration-app] CRM log follow up task', [\n 'activity' => $activity->getUuid(),\n 'payload' => $payload,\n ]);\n\n $task = $this->client->createTask($payload);\n\n return $task['id'] ?? null;\n }\n\n #[\\Override] public function saveTranscriptionSummaryAsNote(\n ActivityContract $activity,\n string $title,\n string $body,\n ?string $objectId,\n ?NoteObject $noteObject = null,\n ): ?string {\n // We have to find a way to store the transcription summary\n // This might be possible either by Tasks, Events, Engagements & Notes\n // Find what the CRM supports and save the note with the appropriate object(eg Notes)\n\n // For now use only Notes as both ZOHO & Salesforce support them.\n if ($this->supportsNotes() && $objectId !== null) {\n $this->logger->info('[integration-app] saving note', [\n 'activityId' => $activity->getUuid(),\n 'objectId' => $objectId,\n ]);\n\n return $this->saveNote($title, $body, $objectId, $noteObject);\n }\n\n $this->logger->info('[integration-app] skip saveTranscriptionSummaryAsNote', [\n 'activityId' => $activity->getUuid(),\n 'supportsNotes' => $this->supportsNotes(),\n 'objectId' => $objectId,\n ]);\n\n return null;\n }\n\n public function generateProviderUrl(string $providerId, string $objectType): ?string\n {\n return $this->getCrmUrlGenerator()?->generateProviderUrl($providerId, $objectType);\n }\n\n public function updateStage($crmObject, Stage $stage): void\n {\n $objectType = $stage->getType();\n $objectId = $crmObject->getCrmProviderId();\n $params = ['stageName' => $stage->getCrmProviderId()];\n\n $this->logger->info('[integration-app] updateStage', [\n 'objectType' => $objectType,\n 'objectId' => $objectId,\n 'params' => $params,\n ]);\n\n $data = [\n 'data' => $this->normalizeData($objectType, $params),\n ];\n\n\n if ($objectType === Stage::TYPE_LEAD) {\n $this->client->updateLead($objectId, $data);\n } else {\n $this->client->updateDeal($objectId, $data);\n }\n }\n\n /**\n * @throws \\Exception\n */\n public function fetchAndAssociateRelatedActivity(Activity $activity): ?Activity\n {\n if ($activity->getCrm()?->getEdition() !== IntegrationAppProviders::ZOHO_CRM) {\n return null;\n }\n\n if (! $activity->isTypeConference()) {\n return null;\n }\n\n // The related activity is already linked.\n if ($activity->hasCrmProviderId()) {\n return $activity;\n }\n\n if ($activity->hasActualStartTime() === false) {\n return null;\n }\n\n return $this->fetchAndAssociateZohoRelatedActivity($activity);\n }\n\n public function fetchAndAssociateZohoRelatedActivity(Activity $activity): ?Activity\n {\n try {\n $meeting = $this->fetchRelatedZohoActivity($activity);\n if (empty($meeting)) {\n $this->logger->info('[integration-app] fetchRelatedZohoActivity No related activity found', [\n 'activity' => $activity->getUuid(),\n ]);\n\n return null;\n }\n\n $decorateActivity = app(DecorateActivity::class);\n $oldDescription = $meeting['Description'] ?? '';\n $updatedDescription = $decorateActivity->generateUpdatedDescription($oldDescription, $activity);\n\n $this->logger->info('[integration-app] fetchAndAssociateZohoRelatedActivity updating related activity', [\n 'activity' => $activity->getUuid(),\n 'description' => $updatedDescription,\n ]);\n\n $this->client->updateMeeting($meeting['id'], ['Description' => $updatedDescription]);\n\n // Update our activity to reflect the remote data.\n $activity->update([\n 'crm_provider_id' => $meeting['id'],\n 'summary' => $meeting['Description'],\n ]);\n\n return $activity;\n } catch (\\Exception $exception) {\n \\Sentry::captureException($exception);\n\n throw $exception;\n }\n }\n\n public function fetchRelatedZohoActivity(Activity $activity): array\n {\n [$from, $to] = $this->getFromToDates($activity);\n\n $start = $from?->toIso8601String(); // e.g., 2025-07-01T00:00:00+00:00\n $end = $to?->toIso8601String(); // e.g., 2025-07-14T23:59:59+00:00\n if ($start === null || $end === null) {\n $this->logger->info(\n '[integration-app] fetchRelatedZohoActivity missing start or end date',\n [\n 'activity' => $activity->getUuid(),\n 'start' => $start,\n 'end' => $end,\n 'from' => $from,\n 'to' => $to,\n ]\n );\n\n return [];\n }\n\n $whoId = null;\n $whatId = null;\n $criteriaParts = [];\n\n if ($activity->getContact()) {\n $whoId = $activity->getContact()->getCrmProviderId();\n $criteriaParts[] = \"(Who_Id:equals:$whoId)\";\n }\n\n if ($activity->getOpportunity()) {\n $whatId = $activity->getOpportunity()->getCrmProviderId();\n } elseif ($activity->getAccount() && $activity->getAccount()->getIsInternal() === false) {\n $whatId = $activity->getAccount()->getCrmProviderId();\n } elseif ($activity->getLead()) {\n $whatId = $activity->getLead()->getCrmProviderId();\n }\n\n if ($whatId !== null) {\n $criteriaParts[] = \"(What_Id:equals:$whatId)\";\n }\n\n if ($whoId === null && $whatId === null) {\n $this->logger->info(\n '[integration-app] fetchRelatedZohoActivity cannot find prospect',\n [\n 'activity' => $activity->getUuid(),\n ]\n );\n\n return [];\n }\n\n $criteriaParts[] = \"(Start_DateTime:greater_equal:$start)\";\n $criteriaParts[] = \"(End_DateTime:less_equal:$end)\";\n\n $criteria = implode(' AND ', $criteriaParts);\n\n $params = [\n 'criteria' => $criteria,\n 'sort_by' => 'Modified_Time',\n 'sort_order' => 'desc',\n ];\n\n $this->logger->info(\n '[integration-app] fetchRelatedZohoActivity searching for related activity',\n [\n 'activity' => $activity->getUuid(),\n 'params' => $params,\n ]\n );\n\n $meetings = $this->client->searchMeetings($params);\n if (! empty($meetings)) {\n return $meetings[0];\n }\n\n return [];\n }\n\n private function getFromToDates(Activity $activity): array\n {\n $calendarEvent = $activity->calendarEvent()->first();\n\n $from = $calendarEvent?->getStartTime();\n $to = $calendarEvent?->getEndTime();\n\n if (! $from || ! $to) {\n $from = $activity->hasScheduledStartTime()\n ? $activity->getScheduledStartTime()\n : $activity->getActualStartTime();\n\n $to = $activity->hasScheduledEndTime()\n ? $activity->getScheduledEndTime()->addMinutes(15)\n : $activity->getActualEndTime();\n }\n\n return [$from, $to];\n }\n}","depth":4,"on_screen":true,"value":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Services\\Crm\\IntegrationApp;\n\nuse Carbon\\Carbon;\nuse Jiminny\\Contracts\\Crm\\Providers;\nuse Jiminny\\Contracts\\Services\\Crm\\ClientInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\FetchRelatedActivityInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\ImportsBusinessProcessesInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\LayoutManagementInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\MatchCrmEntitiesInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\Provider\\IntegrationAppInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\RemoteEntityLookupInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\RemoteEntityManipulationInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\RemoteNoteEntityManipulationInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\SendSummaryToCrmInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\SettingsInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\SyncCrmEntitiesInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\SyncCrmMetadataInterface;\nuse Jiminny\\Events\\Activities\\Crm\\ActivityLeadConverted;\nuse Jiminny\\Exceptions\\CrmException;\nuse Jiminny\\Exceptions\\SocialAccountNotFoundException;\nuse Jiminny\\Jobs\\Crm\\NoteObject;\nuse Jiminny\\Models\\Account;\nuse Jiminny\\Models\\Activity;\nuse Jiminny\\Models\\Contracts\\ActivityContract;\nuse Jiminny\\Models\\Crm\\Configuration;\nuse Jiminny\\Models\\Opportunity;\nuse Jiminny\\Models\\Stage;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Services\\Crm\\BaseService;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\Config\\IntegrationAppProviders;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\Config\\IntegrationConfigFactory;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\DTO\\Mappers\\FieldMapperInterface;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\DTO\\Mappers\\LeadFieldMapper;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\DTO\\Utils\\GenerateProviderUrlInterface;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\DTO\\Utils\\IntegrationAppCrmGeneratorFactory;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\DTO\\Utils\\UrlGeneratorInterface;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\ServiceTraits\\SyncCrmFieldsTrait;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\ServiceTraits\\SystemStateTrait;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\ServiceTraits\\LayoutTrait;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\ServiceTraits\\MatchProspectsTrait;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\ServiceTraits\\NotSupportedTrait;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\ServiceTraits\\SyncCrmEntitiesTrait;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\ServiceTraits\\SyncCrmMetadataTrait;\nuse Psr\\Log\\LoggerInterface;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\DTO\\Mappers\\OpportunityFieldMapper;\nuse Jiminny\\Repositories\\Crm\\ProfileRepository;\nuse Jiminny\\Repositories\\Crm\\OpportunityRepository;\nuse Jiminny\\Models\\Crm\\Profile;\nuse Jiminny\\Services\\Crm\\CrmObjects\\CrmObjectsRepository;\n\nclass Service extends BaseService implements\n IntegrationAppInterface,\n SyncCrmEntitiesInterface,\n SyncCrmMetadataInterface,\n ImportsBusinessProcessesInterface,\n RemoteEntityManipulationInterface,\n LayoutManagementInterface,\n SettingsInterface,\n MatchCrmEntitiesInterface,\n RemoteEntityLookupInterface,\n RemoteNoteEntityManipulationInterface,\n SendSummaryToCrmInterface,\n UrlGeneratorInterface,\n FetchRelatedActivityInterface\n{\n use SyncCrmMetadataTrait;\n use SyncCrmEntitiesTrait;\n use SystemStateTrait;\n use LayoutTrait;\n use NotSupportedTrait;\n use MatchProspectsTrait;\n use SyncCrmFieldsTrait;\n\n public const string CALL_TYPE_MISSED = 'Missed';\n public const string CALL_TYPE_INBOUND = 'Inbound';\n public const string CALL_TYPE_OUTBOUND = 'Outbound';\n public const string RELATIONSHIP_OPPORTUNITY = 'Deals';\n public const string RELATIONSHIP_LEAD = 'Leads';\n public const string RELATIONSHIP_ACCOUNT = 'Accounts';\n\n /**\n * @var ClientInterface&DataClient\n */\n protected $client;\n\n protected ?User $invokedUser = null;\n\n protected ?GenerateProviderUrlInterface $crmUrlGenerator = null;\n\n public function __construct(\n DataClient $client,\n LoggerInterface $logger,\n ) {\n parent::__construct();\n $this->client = $client;\n $this->logger = $logger;\n }\n\n public function getDisplayName(): string\n {\n return Providers::getProviderDisplayName(\n Providers::getCrmIntegrationSlug($this->config)\n );\n }\n\n /**\n * @throws \\Exception\n */\n public function setUser(User $user): void\n {\n $this->configureSentryScope($user);\n $this->invokedUser = $user;\n\n $this->team = $user->getTeam();\n $teamOwner = $this->team->getOwner();\n\n $this->setConfiguration($user->getTeam()->getCrmConfiguration());\n $this->setEditionConfiguration(Providers::getCrmIntegrationSlug($this->config));\n $this->setCrmUrlGenerator($this->config);\n\n $this->client->setTeam($this->team);\n $socialAccount = $teamOwner?->getSocialAccount('integration-app');\n if ($socialAccount === null) {\n $this->logger->info('[integration-app] Social account not found', [\n 'teamId' => $this->team->getId(),\n 'teamOwnerId' => $teamOwner?->getId(),\n 'userId' => $user->getId(),\n ]);\n\n throw new SocialAccountNotFoundException('Social account not found!');\n }\n $this->client->setSocialAccount($socialAccount);\n\n // The CRM Service is properly bootstrapped, and supports remote operations\n $this->connect();\n }\n\n public function normalizeValue(string $fieldType, string $fieldValue, bool $internal = false): string\n {\n return $fieldValue;\n }\n\n public function find(string $name, array $scopes): array\n {\n /** @var LocalSearch $localSearch */\n $localSearch = app(LocalSearch::class);\n $localSearch->setConfiguration($this->config);\n $localSearch->setCountryCode($this->invokedUser->getCountryCode());\n\n return $localSearch->search($name);\n\n // if (! empty($localMatch)) {\n // return $localMatch;\n // }\n //\n // /** @var RemoteSearch $remoteSearch */\n // $remoteSearch = app(RemoteSearch::class);\n // $remoteSearch->setClient($this->client);\n // $remoteSearch->setConfiguration($this->config);\n //\n // return $remoteSearch->search($name);\n }\n\n public function findOpportunities(?string $crmAccountId, ?string $crmContactId, ?int $userId = null): array\n {\n $data = [];\n $ownerData = [];\n\n $account = $this->getAccount($crmAccountId, $crmContactId);\n if ($account === null) {\n return [];\n }\n\n $ownerId = $this->getOwnerId($userId);\n\n try {\n $opportunityRepository = app(OpportunityRepository::class);\n $opportunities = $opportunityRepository->findAllByConfigurationAndAccountId(\n $this->config,\n $account->getId()\n );\n\n foreach ($opportunities as $opportunity) {\n /** @var Opportunity $opportunity */\n $record = $this->buildOpportunityData($opportunity);\n\n if ($ownerId && $opportunity->getOwnerId() === $ownerId) {\n $ownerData[] = $record;\n }\n\n $data[] = $record;\n }\n\n if (! empty($ownerData)) {\n return $ownerData;\n }\n\n return $data;\n } catch (\\Exception $e) {\n $this->logger->info('[integration-app] Failed to fetch opportunities', [\n 'contact' => $crmContactId,\n 'account' => $crmAccountId,\n 'owner' => $ownerId,\n 'error' => $e->getMessage(),\n ]);\n\n return $data;\n }\n }\n\n private function getOwnerId(?int $userId = null): ?string\n {\n if (! $userId) {\n return null;\n }\n\n $profileRepository = app(ProfileRepository::class);\n $profile = $profileRepository->findProfileByUserId($this->config, $userId);\n\n return $profile instanceof Profile ? $profile->getCrmProviderId() : null;\n }\n\n private function getAccount(?string $crmAccountId = null, ?string $crmContactId = null): ?Account\n {\n $crmRepository = app(CrmObjectsRepository::class);\n\n if ($crmAccountId === null) {\n $contact = $crmRepository->findContactByCrmProviderId($this->config, $crmContactId);\n\n return $contact->getAccount();\n }\n\n return $crmRepository->findAccountByCrmProviderId($this->config, $crmAccountId);\n }\n\n private function buildOpportunityData(Opportunity $opportunity): array\n {\n $record = [\n 'crmId' => $opportunity->getCrmProviderId(),\n 'name' => $opportunity->getName(),\n 'won' => $opportunity->isWon(),\n 'closed' => $opportunity->isClosed(),\n ];\n\n if (! empty($opportunity->getFormattedValueAttribute())) {\n $record['value'] = $opportunity->getFormattedValueAttribute();\n }\n\n if (! empty($opportunity->getStage())) {\n $record['stage'] = [\n 'id' => $opportunity->getStage()->getUuid(),\n 'name' => $opportunity->getStage()->getName(),\n ];\n }\n\n return $record;\n }\n\n public function updateRecord(string $objectType, string $objectId, array $data, array $headers = []): void\n {\n $data = [\n 'data' => $this->normalizeData($objectType, $data),\n ];\n\n $this->client->updateRecordById($objectType, $objectId, $data);\n }\n\n private function normalizeData(string $objectType, array $data): array\n {\n $fieldMapper = $this->getFieldMapper($objectType);\n\n if (! $fieldMapper instanceof FieldMapperInterface) {\n return $data;\n }\n\n return $fieldMapper->mapToCrmFields($data);\n }\n\n private function getFieldMapper(string $objectType): ?FieldMapperInterface\n {\n if ($objectType === self::OBJECT_OPPORTUNITY) {\n return app(OpportunityFieldMapper::class);\n }\n\n if ($objectType === self::OBJECT_LEAD) {\n return app(LeadFieldMapper::class);\n }\n\n return null;\n }\n\n public function getRecord(string $objectType, string $objectId, array $fields = []): array\n {\n return $this->client->getRecordById($objectType, $objectId);\n }\n\n public function getConfiguration(): Configuration\n {\n return $this->config;\n }\n\n public function setConfiguration(Configuration $config): void\n {\n $this->clearExternalMapCache();\n\n $this->config = $config;\n }\n\n private function setEditionConfiguration(string $provider): void\n {\n $this->editionConfig = app(IntegrationConfigFactory::class)->create($provider);\n }\n\n public function setCrmUrlGenerator(Configuration $config): void\n {\n $this->crmUrlGenerator = app(IntegrationAppCrmGeneratorFactory::class)->create($config);\n }\n\n public function getCrmUrlGenerator(): ?GenerateProviderUrlInterface\n {\n if ($this->crmUrlGenerator === null) {\n $this->setCrmUrlGenerator($this->config);\n }\n\n return $this->crmUrlGenerator;\n }\n\n public function subscribeEntityEvents(bool $enableTrigger = true): void\n {\n $eventStates = $this->client->updateEntityEventsState($enableTrigger);\n\n $this->logger->info('[integration-app] Change team entity events subscription', [\n 'teamId' => $this->team->getId(),\n 'teamName' => $this->team->getName(),\n 'states' => $eventStates,\n 'action' => $enableTrigger ? 'subscribe' : 'unsubscribe',\n ]);\n }\n\n #[\\Override] public function supportsNotes(): bool\n {\n return $this->editionConfig->supportsNotes();\n }\n\n #[\\Override] public function saveNote(\n string $title,\n string $body,\n string $objectId,\n ?NoteObject $noteObject = null,\n ): ?string {\n if ($noteObject === null) {\n return null;\n }\n\n $notePayload = [\n 'title' => $title,\n 'content' => $body,\n 'objectId' => $objectId,\n 'objectType' => $noteObject->value,\n ];\n\n $result = $this->client->createNote($notePayload);\n\n // debug saving note response\n $this->logger->info('[integration-app] createNote response', [\n 'objectId' => $objectId,\n 'objectType' => $noteObject->value,\n 'result' => $result,\n 'hasId' => isset($result['id']),\n ]);\n\n return $result['id'] ?? null;\n }\n\n /**\n * @throws CrmException\n */\n #[\\Override] public function saveActivity(Activity $activity): Activity\n {\n $this->logger->info('[integration-app] saveActivity', [\n 'activity' => $activity->getUuid(),\n 'type' => $activity->getType(),\n ]);\n\n if ($activity->getCrmType() === Activity::TYPE_CONFERENCE) {\n $crmActivity = $this->saveMeeting($activity);\n } elseif (in_array($activity->getType(), [Activity::TYPE_SOFTPHONE, Activity::TYPE_SOFTPHONE_INBOUND])) {\n $crmActivity = $this->saveCall($activity);\n } else {\n throw new CrmException('Unsupported activity type');\n }\n\n $crmActivityId = $crmActivity['id'] ?? null;\n\n if ($crmActivityId !== null) {\n $activity->crm_provider_id = $crmActivityId;\n $activity->save();\n\n $this->logger->info('[integration-app] Activity successfully logged to CRM', [\n 'activity' => $activity->getUuid(),\n 'type' => $activity->getType(),\n 'crmId' => $crmActivityId,\n ]);\n }\n\n return $activity;\n }\n\n public function saveMeeting(Activity $activity): array\n {\n $decorateActivity = app(DecorateActivity::class);\n\n $meetingPayload = [\n 'Event_Title' => $decorateActivity->generateTitle($activity),\n 'Start_DateTime' => $activity->getActualStartTime()->toIso8601String(),\n 'End_DateTime' => $activity->getActualEndTime()->toIso8601String(),\n 'ownerId' => $this->getActivityOwnerId($activity),\n ];\n\n $payload = array_merge($meetingPayload, $this->attachToProspect($activity));\n\n if ($activity->hasCrmProviderId()) {\n $crmId = $activity->getCrmProviderId();\n $meeting = $this->client->getMeeting($crmId);\n\n $oldDescription = $meeting['fields']['Description'] ?? null;\n $payload['Description'] = $decorateActivity->generateUpdatedDescription($oldDescription, $activity);\n\n $this->logger->info('[integration-app] CRM update meeting', [\n 'activity' => $activity->getUuid(),\n 'crm_id' => $crmId,\n 'payload' => $payload,\n ]);\n\n return $this->client->updateMeeting($crmId, $payload);\n }\n\n $payload['Description'] = $decorateActivity->generateDescription($activity);\n\n $this->logger->info('[integration-app] CRM log meeting', [\n 'activity' => $activity->getUuid(),\n 'payload' => $payload,\n ]);\n\n return $this->client->createMeeting($payload);\n }\n\n public function saveCall(Activity $activity): array\n {\n $decorateActivity = app(DecorateActivity::class);\n\n $callPayload = [\n 'Call_Type' => $this->getCallType($activity),\n 'Call_Start_Time' => $activity->getActualStartTime()->toIso8601String(),\n 'Call_Duration' => $activity->getDuration(),\n 'name' => $decorateActivity->generateTitle($activity),\n 'ownerId' => $this->getActivityOwnerId($activity),\n ];\n\n $payload = array_merge($callPayload, $this->attachToProspect($activity));\n\n if ($activity->hasCrmProviderId()) {\n $crmId = $activity->getCrmProviderId();\n $call = $this->client->getCall($crmId);\n\n $oldDescription = $call['fields']['Description'] ?? null;\n $payload['description'] = $decorateActivity->generateUpdatedDescription($oldDescription, $activity);\n\n $this->logger->info('[integration-app] CRM update call', [\n 'activity' => $activity->getUuid(),\n 'crm_id' => $crmId,\n 'payload' => $payload,\n ]);\n\n return $this->client->updateCall($crmId, $payload);\n }\n\n $payload['description'] = $decorateActivity->generateDescription($activity);\n\n $this->logger->info('[integration-app] CRM log call', [\n 'activity' => $activity->getUuid(),\n 'payload' => $payload,\n ]);\n\n return $this->client->createCall($payload);\n }\n\n private function getCallType(Activity $activity): string\n {\n if ($activity->getStatus() === Activity::STATUS_NO_ANSWER) {\n return self::CALL_TYPE_MISSED;\n }\n\n return $activity->getType() === Activity::TYPE_SOFTPHONE_INBOUND ? self::CALL_TYPE_INBOUND : self::CALL_TYPE_OUTBOUND;\n }\n\n private function attachToProspect(Activity $activity): array\n {\n $payload = [];\n\n if ($activity->hasContact()) {\n $payload['contactId'] = $activity->getContact()->getCrmProviderId();\n }\n\n if ($activity->hasOpportunity()) {\n return array_merge(\n $payload,\n $this->buildBasicPayload(\n self::RELATIONSHIP_OPPORTUNITY,\n $activity->getOpportunity()->getCrmProviderId()\n )\n );\n }\n\n if ($activity->hasAccount() && ! $activity->getAccount()->getIsInternal()) {\n return array_merge(\n $payload,\n $this->buildBasicPayload(\n self::RELATIONSHIP_ACCOUNT,\n $activity->getAccount()->getCrmProviderId()\n )\n );\n }\n\n if ($activity->hasLead()) {\n $payload = $this->handleLeadPayload($activity);\n }\n\n return $payload;\n }\n\n private function handleLeadPayload(Activity $activity): array\n {\n $freshLead = $this->syncLead($activity->getLead()->getCrmProviderId());\n $lead = $freshLead ?? $activity->getLead();\n\n if ($lead->getConvertedAt() === null) {\n return $this->buildBasicPayload(self::RELATIONSHIP_LEAD, $lead->getCrmProviderId());\n }\n\n $activity->lead_id = null;\n\n if ($lead->hasAccount()) {\n $account = $lead->getAccount();\n $activity->account_id = $account->getId();\n $payload = $this->buildBasicPayload(self::RELATIONSHIP_ACCOUNT, $account->getCrmProviderId());\n } else {\n $payload = [];\n }\n\n if ($lead->hasOpportunity()) {\n $opportunity = $lead->getOpportunity();\n $payload = $this->buildBasicPayload(self::RELATIONSHIP_OPPORTUNITY, $opportunity->getCrmProviderId());\n $activity->opportunity_id = $opportunity->getId();\n $activity->value = $opportunity->value;\n $activity->stage_id = $opportunity->stage_id;\n } else {\n $activity->stage_id = null;\n }\n\n if ($lead->hasContact()) {\n $contact = $lead->getContact();\n $payload['contactId'] = $contact->getCrmProviderId();\n $activity->contact_id = $contact->getId();\n }\n\n $activity->save();\n event(new ActivityLeadConverted($activity, $lead));\n\n $this->logger->info('[integration-app] Lead converted', [\n 'activityUuid' => $activity->getUuid(),\n 'leadUuid' => $lead->getUuid(),\n ]);\n\n return $payload;\n }\n\n private function buildBasicPayload(string $type, string $id): array\n {\n return [\n 'type' => $type,\n 'id' => $id,\n ];\n }\n private function getActivityOwnerId(Activity $activity): ?string\n {\n $ownerId = null;\n if ($activity->hasUser() && $activity->getUser()->getProfile() !== null) {\n $ownerId = $activity->getUser()->getProfile()->getCrmProviderId();\n }\n\n return $ownerId;\n }\n\n #[\\Override] public function saveFollowupActivity(Activity $activity, array $fields): ?string\n {\n $taskPayload = [\n 'subject' => $fields['subject'],\n 'dueTime' => isset($fields['dueDate']) ? Carbon::parse($fields['dueDate'])->format('Y-m-d') : null,\n 'ownerId' => $this->getActivityOwnerId($activity),\n ];\n\n if (isset($fields['status'])) {\n $taskPayload['status'] = $fields['status'];\n }\n\n if (isset($fields['priority'])) {\n $taskPayload['priority'] = $fields['priority'];\n }\n\n if (isset($fields['content'])) {\n $taskPayload['content'] = $fields['content'];\n }\n\n $payload = array_merge($taskPayload, $this->attachToProspect($activity));\n\n $this->logger->info('[integration-app] CRM log follow up task', [\n 'activity' => $activity->getUuid(),\n 'payload' => $payload,\n ]);\n\n $task = $this->client->createTask($payload);\n\n return $task['id'] ?? null;\n }\n\n #[\\Override] public function saveTranscriptionSummaryAsNote(\n ActivityContract $activity,\n string $title,\n string $body,\n ?string $objectId,\n ?NoteObject $noteObject = null,\n ): ?string {\n // We have to find a way to store the transcription summary\n // This might be possible either by Tasks, Events, Engagements & Notes\n // Find what the CRM supports and save the note with the appropriate object(eg Notes)\n\n // For now use only Notes as both ZOHO & Salesforce support them.\n if ($this->supportsNotes() && $objectId !== null) {\n $this->logger->info('[integration-app] saving note', [\n 'activityId' => $activity->getUuid(),\n 'objectId' => $objectId,\n ]);\n\n return $this->saveNote($title, $body, $objectId, $noteObject);\n }\n\n $this->logger->info('[integration-app] skip saveTranscriptionSummaryAsNote', [\n 'activityId' => $activity->getUuid(),\n 'supportsNotes' => $this->supportsNotes(),\n 'objectId' => $objectId,\n ]);\n\n return null;\n }\n\n public function generateProviderUrl(string $providerId, string $objectType): ?string\n {\n return $this->getCrmUrlGenerator()?->generateProviderUrl($providerId, $objectType);\n }\n\n public function updateStage($crmObject, Stage $stage): void\n {\n $objectType = $stage->getType();\n $objectId = $crmObject->getCrmProviderId();\n $params = ['stageName' => $stage->getCrmProviderId()];\n\n $this->logger->info('[integration-app] updateStage', [\n 'objectType' => $objectType,\n 'objectId' => $objectId,\n 'params' => $params,\n ]);\n\n $data = [\n 'data' => $this->normalizeData($objectType, $params),\n ];\n\n\n if ($objectType === Stage::TYPE_LEAD) {\n $this->client->updateLead($objectId, $data);\n } else {\n $this->client->updateDeal($objectId, $data);\n }\n }\n\n /**\n * @throws \\Exception\n */\n public function fetchAndAssociateRelatedActivity(Activity $activity): ?Activity\n {\n if ($activity->getCrm()?->getEdition() !== IntegrationAppProviders::ZOHO_CRM) {\n return null;\n }\n\n if (! $activity->isTypeConference()) {\n return null;\n }\n\n // The related activity is already linked.\n if ($activity->hasCrmProviderId()) {\n return $activity;\n }\n\n if ($activity->hasActualStartTime() === false) {\n return null;\n }\n\n return $this->fetchAndAssociateZohoRelatedActivity($activity);\n }\n\n public function fetchAndAssociateZohoRelatedActivity(Activity $activity): ?Activity\n {\n try {\n $meeting = $this->fetchRelatedZohoActivity($activity);\n if (empty($meeting)) {\n $this->logger->info('[integration-app] fetchRelatedZohoActivity No related activity found', [\n 'activity' => $activity->getUuid(),\n ]);\n\n return null;\n }\n\n $decorateActivity = app(DecorateActivity::class);\n $oldDescription = $meeting['Description'] ?? '';\n $updatedDescription = $decorateActivity->generateUpdatedDescription($oldDescription, $activity);\n\n $this->logger->info('[integration-app] fetchAndAssociateZohoRelatedActivity updating related activity', [\n 'activity' => $activity->getUuid(),\n 'description' => $updatedDescription,\n ]);\n\n $this->client->updateMeeting($meeting['id'], ['Description' => $updatedDescription]);\n\n // Update our activity to reflect the remote data.\n $activity->update([\n 'crm_provider_id' => $meeting['id'],\n 'summary' => $meeting['Description'],\n ]);\n\n return $activity;\n } catch (\\Exception $exception) {\n \\Sentry::captureException($exception);\n\n throw $exception;\n }\n }\n\n public function fetchRelatedZohoActivity(Activity $activity): array\n {\n [$from, $to] = $this->getFromToDates($activity);\n\n $start = $from?->toIso8601String(); // e.g., 2025-07-01T00:00:00+00:00\n $end = $to?->toIso8601String(); // e.g., 2025-07-14T23:59:59+00:00\n if ($start === null || $end === null) {\n $this->logger->info(\n '[integration-app] fetchRelatedZohoActivity missing start or end date',\n [\n 'activity' => $activity->getUuid(),\n 'start' => $start,\n 'end' => $end,\n 'from' => $from,\n 'to' => $to,\n ]\n );\n\n return [];\n }\n\n $whoId = null;\n $whatId = null;\n $criteriaParts = [];\n\n if ($activity->getContact()) {\n $whoId = $activity->getContact()->getCrmProviderId();\n $criteriaParts[] = \"(Who_Id:equals:$whoId)\";\n }\n\n if ($activity->getOpportunity()) {\n $whatId = $activity->getOpportunity()->getCrmProviderId();\n } elseif ($activity->getAccount() && $activity->getAccount()->getIsInternal() === false) {\n $whatId = $activity->getAccount()->getCrmProviderId();\n } elseif ($activity->getLead()) {\n $whatId = $activity->getLead()->getCrmProviderId();\n }\n\n if ($whatId !== null) {\n $criteriaParts[] = \"(What_Id:equals:$whatId)\";\n }\n\n if ($whoId === null && $whatId === null) {\n $this->logger->info(\n '[integration-app] fetchRelatedZohoActivity cannot find prospect',\n [\n 'activity' => $activity->getUuid(),\n ]\n );\n\n return [];\n }\n\n $criteriaParts[] = \"(Start_DateTime:greater_equal:$start)\";\n $criteriaParts[] = \"(End_DateTime:less_equal:$end)\";\n\n $criteria = implode(' AND ', $criteriaParts);\n\n $params = [\n 'criteria' => $criteria,\n 'sort_by' => 'Modified_Time',\n 'sort_order' => 'desc',\n ];\n\n $this->logger->info(\n '[integration-app] fetchRelatedZohoActivity searching for related activity',\n [\n 'activity' => $activity->getUuid(),\n 'params' => $params,\n ]\n );\n\n $meetings = $this->client->searchMeetings($params);\n if (! empty($meetings)) {\n return $meetings[0];\n }\n\n return [];\n }\n\n private function getFromToDates(Activity $activity): array\n {\n $calendarEvent = $activity->calendarEvent()->first();\n\n $from = $calendarEvent?->getStartTime();\n $to = $calendarEvent?->getEndTime();\n\n if (! $from || ! $to) {\n $from = $activity->hasScheduledStartTime()\n ? $activity->getScheduledStartTime()\n : $activity->getActualStartTime();\n\n $to = $activity->hasScheduledEndTime()\n ? $activity->getScheduledEndTime()->addMinutes(15)\n : $activity->getActualEndTime();\n }\n\n return [$from, $to];\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.85486114,"top":0.31,"width":0.018055556,"height":0.026666667},"on_screen":true,"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.87291664,"top":0.31,"width":0.018055556,"height":0.026666667},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Browse Query History","depth":4,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"View Parameters","depth":4,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Open Query Execution Settings…","depth":4,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"In-Editor Results","depth":4,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Tx: Auto","depth":4,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Cancel Running Statements","depth":4,"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Playground","depth":4,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"jiminny","depth":4,"bounds":{"left":0.9138889,"top":0.31,"width":0.059027776,"height":0.026666667},"on_screen":true,"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},"on_screen":false,"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},"on_screen":false,"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},"on_screen":false,"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},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"8","depth":4,"bounds":{"left":0.8645833,"top":0.34444445,"width":0.016666668,"height":0.02111111},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"1","depth":4,"bounds":{"left":0.8854167,"top":0.34444445,"width":0.015277778,"height":0.02111111},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"3","depth":4,"bounds":{"left":0.9048611,"top":0.34444445,"width":0.016666668,"height":0.02111111},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"4","depth":4,"bounds":{"left":0.92569447,"top":0.34444445,"width":0.016666668,"height":0.02111111},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.9458333,"top":0.3422222,"width":0.015277778,"height":0.025555555},"on_screen":true,"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.9611111,"top":0.3422222,"width":0.014583333,"height":0.025555555},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"SELECT\n# DISTINCT\nopp.id as opp_id, opp.uuid, opp.name,\n# COUNT(dr.id) AS deal_risk_count,\n\n# dr.id,\n# cfd.value,\nusr.name AS owner_name,\nopp.value, opp.currency_code, opp.close_date, opp.remotely_created_at, opp.is_closed, opp.is_won,\nusr.uuid as owner_uuid,\nusr.photo_path as owner_photo,\nusr.id AS owner_id,\njt.name as owner_job,\nopp.stage_id, opp.stage_updated_at,\nacc.name AS acc_name, opp.stage_updated_at, acc.crm_provider_id AS acc_provider_id, opp.crm_provider_id AS opp_provider_id,\nrt.business_process_id AS pipeline_id\nFROM opportunities opp\nLEFT JOIN record_types rt ON opp.record_type_id = rt.id\nLEFT JOIN users usr ON opp.user_id = usr.id\nLEFT JOIN accounts acc ON opp.account_id = acc.id\nLEFT JOIN job_titles jt ON usr.job_title_id = jt.id\n\n# LEFT JOIN group_deal_risk_types gdrt ON gdrt.group_id = usr.group_id\n# LEFT JOIN deal_risks dr ON dr.opportunity_id = opp.id AND dr.group_deal_risk_type_id = gdrt.id\n\nLEFT JOIN crm_field_data cfd ON (cfd.object_id = opp.id and cfd.crm_field_id = 66814)\n\nWHERE opp.user_id IS NOT NULL\nAND opp.deleted_at IS NULL\nAND opp.is_closed = 1\nAND opp.is_won = 0\nAND opp.close_date >= '2024-01-01 00:00:00'\nAND opp.close_date <= '2024-12-31 23:59:59'\nAND usr.team_id = 1\n\n# and opp.id = 4823179\n\nGROUP BY opp.id, cfd.value\nORDER BY\n# cfd.value\n CAST(cfd.value AS UNSIGNED)\n# owner_name\n# (SELECT COUNT(dr.id)\n# FROM deal_risks dr\n# JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id\n# WHERE dr.opportunity_id = opp.id\n# AND dr.is_active = 1\n# AND gdrt.is_enabled = 1)\nDESC\nLIMIT 25\n# OFFSET 0\n;\n\nselect * from crm_fields where crm_configuration_id = 1 and object_type = 'opportunity';\nselect * from crm_layout_entities where crm_layout_id = 1493;\n\nSELECT * FROM opportunities WHERE id = 4584045;\nSELECT * FROM crm_field_data WHERE object_id = 4584045;\n\nSELECT * FROM opportunities where team_id = 1 and crm_provider_id = '0061K00000lfb9IQAQ'\n\nSELECT\n opp.id as opportunity_id,\n opp.name,\n COUNT(dr.id) as risk_count\nFROM opportunities opp\nLEFT JOIN deal_risks dr ON dr.opportunity_id = opp.id\nWHERE opp.id IN (\n 6069574,8900938,9507638,9524799,9660490,9662824,9705675,9749758,4158460,4391812,6450439,4448422,5118945,5590675,4584045,7228149,9002408,9165534,9446720,9641778,9665149,9703344,9709280,5747948,4158491,6182565,6263970,5798120,5111315,4536978,6062352,6548383,6072095,6548225,4480986,5011422,6548381,8760540,8917554,9509986,9514392,9569009,9569011,9578490,9713604,5784397,7276612,7288405,8994421,9118219,9608148,9818911,4510535,6479693,5958049,6271674,6550448,4158331,4158483,6126571,6171615,6540943,4897466,5190896,5796182,5932762,8572433,8723698,8892697,9711001,9789264,4549188,6100831,6170064,6260799,6263653,6449936,6530871,6538978,7777651,8059269,8319918,8787049,8901150,9263153,9453207,9514738,9696700,9791062,5752018,6421452,7439134,7878923,9354763,9369285,9514396,9582506,9889949,9890216,4094311,4158495,4158496,6098128,5585661,3872564,6442149,5891604,6164746,6199593,6583474,6519684,9018490,9809006,4496897,5041324,5829430,6198319,6253504,6555763,7242914,7931055,8024125,8797814,8058559,8673347,8892695,8994420,9616219,9714970,9722004,9809439,9818918,6523177,8134147,9002915,9711422,9892713,9901719,9954210,9978435,5800810,6243518,6416114,6222251,6411974,6512456,5791953,6545606,9914780,5805540,6238986,6463838,6547680,9767049,9809437,9810885,9890855,6673493,9902036,4335521,6379871,6503799,6546077,8018765,9907556,9958433,9905855,9916179,9946741,9957877,5563344,6271838,6450815,7641128,7762567,7780592,8684810,8685786,8685787,8685788\n)\nGROUP BY opp.id;\n\nSELECT COUNT(dr.id)\n FROM deal_risks dr\n JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id\n WHERE dr.opportunity_id = 5563344\n# AND gdrt.group_id = usr.group_id\n\n\n\nEXPLAIN SELECT\n opp.id as opp_id, opp.uuid, opp.name,\n\ncfd.value,\ncfv.sequence,\ncfv.value,\n# MAX(cfd.value) AS max_cfd_value,\nusr.name AS owner_name,\nopp.value, opp.currency_code, opp.close_date, opp.remotely_created_at, opp.is_closed, opp.is_won,\nusr.uuid as owner_uuid,\nusr.photo_path as owner_photo,\nusr.id AS owner_id,\njt.name as owner_job,\nopp.stage_id, opp.stage_updated_at,\nacc.name AS acc_name, opp.stage_updated_at, acc.crm_provider_id AS acc_provider_id, opp.crm_provider_id AS opp_provider_id,\nrt.business_process_id AS pipeline_id\nFROM opportunities opp\n\nLEFT JOIN record_types rt ON opp.record_type_id = rt.id\nLEFT JOIN users usr ON opp.user_id = usr.id\nLEFT JOIN accounts acc ON opp.account_id = acc.id\nLEFT JOIN job_titles jt ON usr.job_title_id = jt.id\n\nLEFT JOIN crm_field_data cfd ON cfd.id = (SELECT sub_cfd.id\n FROM crm_field_data sub_cfd\n WHERE sub_cfd.object_id = opp.id\n AND sub_cfd.crm_field_id = 66810\n ORDER BY sub_cfd.updated_at DESC\n LIMIT 1)\n\nLEFT JOIN crm_field_values cfv ON cfv.crm_field_id = 66810 AND cfv.value = cfd.value\n\nWHERE opp.user_id IS NOT NULL\nAND opp.deleted_at IS NULL\nAND opp.is_closed = 0\n# AND opp.is_closed = 1\n# AND opp.is_won = 0\nAND opp.close_date >= '2024-01-01 00:00:00'\nAND opp.close_date <= '2024-12-31 23:59:59'\nAND usr.team_id = 1\n\n# and opp.id = 4823179\n\n# GROUP BY opp.id\nORDER BY\n cfv.sequence DESC,\n# opp.name\n# owner_name\n cfd.value\n# CAST(cfd.value AS UNSIGNED)\n# CAST(MAX(cfd.value) AS UNSIGNED)\n# (SELECT COUNT(dr.id)\n# FROM deal_risks dr\n# JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id\n# WHERE dr.opportunity_id = opp.id\n# AND dr.is_active = 1 AND gdrt.is_enabled = 1)\nDESC\n# LIMIT 75, 25\n;\n\n\n\nSELECT * FROM crm_field_values WHERE crm_field_id = 66810;\n\nSELECT f.id, f.crm_provider_id AS field_name, f.label, fd.object_id AS dealId, fd.value, fd.updated_at, fd.id, fd.created_at\nFROM crm_fields f\nINNER JOIN crm_field_data fd ON fd.crm_field_id = f.id\n WHERE (f.crm_configuration_id = 1)\n AND (f.object_type = 'opportunity')\n# AND (fd.object_id IN (4158331,4158483,4158495,4158496,6069574,6263970,6171615,6540943,6545606,5829430,6198319,6263653,6548381,7242914,8797814,7228149,7439134,7878923,8134147,9002915,9118219,9165534,9354763,9369285,9446720))\n AND (fd.object_id IN (4158460))\n AND (f.crm_provider_id IN ('ForecastCategoryName'))\n ORDER BY fd.object_id ASC, fd.updated_at DESC;\n\nselect * from crm_layouts where crm_configuration_id = 1;\nselect cf.* from crm_fields cf\njoin crm_layout_entities cle on cf.id = cle.crm_field_id\nwhere crm_layout_id = 1493;\n\nSELECT * FROM opportunities WHERE id = 4158460;\nSELECT * FROM crm_field_data WHERE object_id = 4158460;\n\nselect * from users where team_id = 1;\nSELECT * FROM users WHERE id = 7160;\nselect * from role_user where user_id = 3248;\n\nselect * from crm_field_values where crm_field_id = 66824;\n\nSELECT * FROM users WHERE id = 23470;\nselect * from crm_configurations;\n\n# ******************************************\nselect * from teams where id = 1038; # 23521, 966\nselect * from users where team_id = 1038;\nselect * from crm_configurations where id = 966;\nSELECT * FROM activities WHERE uuid_to_bin('e8dc7c34-31f6-4430-bd81-2d9d8f00dd07') = uuid; # 54965762\nSELECT * FROM activities WHERE uuid_to_bin('4b5727c0-69d1-428f-b8d9-b649055166e2') = uuid; # 54965764\nSELECT * FROM participants WHERE activity_id = 54965764;\n\nSELECT id, uuid, title, recording_state FROM activities WHERE uuid_to_bin('355f105d-5606-4379-b0c5-d91daf59f4ce') = uuid; # 54964075\nSELECT * FROM participants WHERE activity_id = 54964075;\nselect f.id, slug, title, tf.team_id from team_features tf JOIN features f on tf.feature_id = f.id\n where tf.team_id = 1038;\n\n\n# ****************************************** PD *************************\nselect * from teams where id = 1029;\nSELECT * FROM crm_configurations WHERE id = 957;\nSELECT * FROM activities WHERE uuid_to_bin('581a33cb-4343-44bd-ac0c-4a5cee71c5ec') = uuid; # 54963423\nSELECT * FROM activities WHERE uuid_to_bin('07238011-25fa-418e-838b-fb21e82b9ea2') = uuid; # 54963433\n\nSELECT * FROM activities WHERE uuid_to_bin('8b6bb2f7-e7a7-4aec-8806-fbfea7093ccd') = uuid; # 54963421\n\n# ****************************************** Close *************************\nselect * from teams where id = 1031;\nSELECT * FROM crm_configurations WHERE id = 959;\nSELECT * FROM activities WHERE uuid_to_bin('59c517e0-96c9-4dad-bfeb-b7bef72f8725') = uuid; # 54963517\n\n\nSELECT * FROM activities WHERE uuid_to_bin('07238011-25fa-418e-838b-fb21e82b9ea2') = uuid; # 54963433\n\nSELECT * FROM activities WHERE uuid_to_bin('d68311e3-ac34-49bd-bf04-88323a7e5352') = uuid; # 54966009\n\n# ****************************************** SF *************************\nSELECT * FROM activities WHERE uuid_to_bin('2bd4cfa3-4eb5-4c77-84a7-9ed46a21c988') = uuid;\n\nselect * from roles;\nselect * from permissions;\nselect * from permission_role where permission_id = 136;\n\nselect * from migrations order by id desc;\n\nselect * from teams where id IN (1, 1037);\nselect * from crm_layouts where crm_configuration_id = 1;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1493;\nSELECT * FROM crm_fields WHERE id IN (1652,1661,66799,66814,66821,66836,66843,66846,66864,84752,182306,323580,380378);\n\nselect * from features;\nselect * from team_features where feature_id = 33;\nselect * from opportunities;\n\nselect * from teams;\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 = 1052 and sa.provider = 'hubspot';\n\nSELECT * FROM accounts where id = 11512582;\nselect * from activities where account_id = 11512582;","depth":4,"on_screen":true,"value":"SELECT\n# DISTINCT\nopp.id as opp_id, opp.uuid, opp.name,\n# COUNT(dr.id) AS deal_risk_count,\n\n# dr.id,\n# cfd.value,\nusr.name AS owner_name,\nopp.value, opp.currency_code, opp.close_date, opp.remotely_created_at, opp.is_closed, opp.is_won,\nusr.uuid as owner_uuid,\nusr.photo_path as owner_photo,\nusr.id AS owner_id,\njt.name as owner_job,\nopp.stage_id, opp.stage_updated_at,\nacc.name AS acc_name, opp.stage_updated_at, acc.crm_provider_id AS acc_provider_id, opp.crm_provider_id AS opp_provider_id,\nrt.business_process_id AS pipeline_id\nFROM opportunities opp\nLEFT JOIN record_types rt ON opp.record_type_id = rt.id\nLEFT JOIN users usr ON opp.user_id = usr.id\nLEFT JOIN accounts acc ON opp.account_id = acc.id\nLEFT JOIN job_titles jt ON usr.job_title_id = jt.id\n\n# LEFT JOIN group_deal_risk_types gdrt ON gdrt.group_id = usr.group_id\n# LEFT JOIN deal_risks dr ON dr.opportunity_id = opp.id AND dr.group_deal_risk_type_id = gdrt.id\n\nLEFT JOIN crm_field_data cfd ON (cfd.object_id = opp.id and cfd.crm_field_id = 66814)\n\nWHERE opp.user_id IS NOT NULL\nAND opp.deleted_at IS NULL\nAND opp.is_closed = 1\nAND opp.is_won = 0\nAND opp.close_date >= '2024-01-01 00:00:00'\nAND opp.close_date <= '2024-12-31 23:59:59'\nAND usr.team_id = 1\n\n# and opp.id = 4823179\n\nGROUP BY opp.id, cfd.value\nORDER BY\n# cfd.value\n CAST(cfd.value AS UNSIGNED)\n# owner_name\n# (SELECT COUNT(dr.id)\n# FROM deal_risks dr\n# JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id\n# WHERE dr.opportunity_id = opp.id\n# AND dr.is_active = 1\n# AND gdrt.is_enabled = 1)\nDESC\nLIMIT 25\n# OFFSET 0\n;\n\nselect * from crm_fields where crm_configuration_id = 1 and object_type = 'opportunity';\nselect * from crm_layout_entities where crm_layout_id = 1493;\n\nSELECT * FROM opportunities WHERE id = 4584045;\nSELECT * FROM crm_field_data WHERE object_id = 4584045;\n\nSELECT * FROM opportunities where team_id = 1 and crm_provider_id = '0061K00000lfb9IQAQ'\n\nSELECT\n opp.id as opportunity_id,\n opp.name,\n COUNT(dr.id) as risk_count\nFROM opportunities opp\nLEFT JOIN deal_risks dr ON dr.opportunity_id = opp.id\nWHERE opp.id IN (\n 6069574,8900938,9507638,9524799,9660490,9662824,9705675,9749758,4158460,4391812,6450439,4448422,5118945,5590675,4584045,7228149,9002408,9165534,9446720,9641778,9665149,9703344,9709280,5747948,4158491,6182565,6263970,5798120,5111315,4536978,6062352,6548383,6072095,6548225,4480986,5011422,6548381,8760540,8917554,9509986,9514392,9569009,9569011,9578490,9713604,5784397,7276612,7288405,8994421,9118219,9608148,9818911,4510535,6479693,5958049,6271674,6550448,4158331,4158483,6126571,6171615,6540943,4897466,5190896,5796182,5932762,8572433,8723698,8892697,9711001,9789264,4549188,6100831,6170064,6260799,6263653,6449936,6530871,6538978,7777651,8059269,8319918,8787049,8901150,9263153,9453207,9514738,9696700,9791062,5752018,6421452,7439134,7878923,9354763,9369285,9514396,9582506,9889949,9890216,4094311,4158495,4158496,6098128,5585661,3872564,6442149,5891604,6164746,6199593,6583474,6519684,9018490,9809006,4496897,5041324,5829430,6198319,6253504,6555763,7242914,7931055,8024125,8797814,8058559,8673347,8892695,8994420,9616219,9714970,9722004,9809439,9818918,6523177,8134147,9002915,9711422,9892713,9901719,9954210,9978435,5800810,6243518,6416114,6222251,6411974,6512456,5791953,6545606,9914780,5805540,6238986,6463838,6547680,9767049,9809437,9810885,9890855,6673493,9902036,4335521,6379871,6503799,6546077,8018765,9907556,9958433,9905855,9916179,9946741,9957877,5563344,6271838,6450815,7641128,7762567,7780592,8684810,8685786,8685787,8685788\n)\nGROUP BY opp.id;\n\nSELECT COUNT(dr.id)\n FROM deal_risks dr\n JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id\n WHERE dr.opportunity_id = 5563344\n# AND gdrt.group_id = usr.group_id\n\n\n\nEXPLAIN SELECT\n opp.id as opp_id, opp.uuid, opp.name,\n\ncfd.value,\ncfv.sequence,\ncfv.value,\n# MAX(cfd.value) AS max_cfd_value,\nusr.name AS owner_name,\nopp.value, opp.currency_code, opp.close_date, opp.remotely_created_at, opp.is_closed, opp.is_won,\nusr.uuid as owner_uuid,\nusr.photo_path as owner_photo,\nusr.id AS owner_id,\njt.name as owner_job,\nopp.stage_id, opp.stage_updated_at,\nacc.name AS acc_name, opp.stage_updated_at, acc.crm_provider_id AS acc_provider_id, opp.crm_provider_id AS opp_provider_id,\nrt.business_process_id AS pipeline_id\nFROM opportunities opp\n\nLEFT JOIN record_types rt ON opp.record_type_id = rt.id\nLEFT JOIN users usr ON opp.user_id = usr.id\nLEFT JOIN accounts acc ON opp.account_id = acc.id\nLEFT JOIN job_titles jt ON usr.job_title_id = jt.id\n\nLEFT JOIN crm_field_data cfd ON cfd.id = (SELECT sub_cfd.id\n FROM crm_field_data sub_cfd\n WHERE sub_cfd.object_id = opp.id\n AND sub_cfd.crm_field_id = 66810\n ORDER BY sub_cfd.updated_at DESC\n LIMIT 1)\n\nLEFT JOIN crm_field_values cfv ON cfv.crm_field_id = 66810 AND cfv.value = cfd.value\n\nWHERE opp.user_id IS NOT NULL\nAND opp.deleted_at IS NULL\nAND opp.is_closed = 0\n# AND opp.is_closed = 1\n# AND opp.is_won = 0\nAND opp.close_date >= '2024-01-01 00:00:00'\nAND opp.close_date <= '2024-12-31 23:59:59'\nAND usr.team_id = 1\n\n# and opp.id = 4823179\n\n# GROUP BY opp.id\nORDER BY\n cfv.sequence DESC,\n# opp.name\n# owner_name\n cfd.value\n# CAST(cfd.value AS UNSIGNED)\n# CAST(MAX(cfd.value) AS UNSIGNED)\n# (SELECT COUNT(dr.id)\n# FROM deal_risks dr\n# JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id\n# WHERE dr.opportunity_id = opp.id\n# AND dr.is_active = 1 AND gdrt.is_enabled = 1)\nDESC\n# LIMIT 75, 25\n;\n\n\n\nSELECT * FROM crm_field_values WHERE crm_field_id = 66810;\n\nSELECT f.id, f.crm_provider_id AS field_name, f.label, fd.object_id AS dealId, fd.value, fd.updated_at, fd.id, fd.created_at\nFROM crm_fields f\nINNER JOIN crm_field_data fd ON fd.crm_field_id = f.id\n WHERE (f.crm_configuration_id = 1)\n AND (f.object_type = 'opportunity')\n# AND (fd.object_id IN (4158331,4158483,4158495,4158496,6069574,6263970,6171615,6540943,6545606,5829430,6198319,6263653,6548381,7242914,8797814,7228149,7439134,7878923,8134147,9002915,9118219,9165534,9354763,9369285,9446720))\n AND (fd.object_id IN (4158460))\n AND (f.crm_provider_id IN ('ForecastCategoryName'))\n ORDER BY fd.object_id ASC, fd.updated_at DESC;\n\nselect * from crm_layouts where crm_configuration_id = 1;\nselect cf.* from crm_fields cf\njoin crm_layout_entities cle on cf.id = cle.crm_field_id\nwhere crm_layout_id = 1493;\n\nSELECT * FROM opportunities WHERE id = 4158460;\nSELECT * FROM crm_field_data WHERE object_id = 4158460;\n\nselect * from users where team_id = 1;\nSELECT * FROM users WHERE id = 7160;\nselect * from role_user where user_id = 3248;\n\nselect * from crm_field_values where crm_field_id = 66824;\n\nSELECT * FROM users WHERE id = 23470;\nselect * from crm_configurations;\n\n# ******************************************\nselect * from teams where id = 1038; # 23521, 966\nselect * from users where team_id = 1038;\nselect * from crm_configurations where id = 966;\nSELECT * FROM activities WHERE uuid_to_bin('e8dc7c34-31f6-4430-bd81-2d9d8f00dd07') = uuid; # 54965762\nSELECT * FROM activities WHERE uuid_to_bin('4b5727c0-69d1-428f-b8d9-b649055166e2') = uuid; # 54965764\nSELECT * FROM participants WHERE activity_id = 54965764;\n\nSELECT id, uuid, title, recording_state FROM activities WHERE uuid_to_bin('355f105d-5606-4379-b0c5-d91daf59f4ce') = uuid; # 54964075\nSELECT * FROM participants WHERE activity_id = 54964075;\nselect f.id, slug, title, tf.team_id from team_features tf JOIN features f on tf.feature_id = f.id\n where tf.team_id = 1038;\n\n\n# ****************************************** PD *************************\nselect * from teams where id = 1029;\nSELECT * FROM crm_configurations WHERE id = 957;\nSELECT * FROM activities WHERE uuid_to_bin('581a33cb-4343-44bd-ac0c-4a5cee71c5ec') = uuid; # 54963423\nSELECT * FROM activities WHERE uuid_to_bin('07238011-25fa-418e-838b-fb21e82b9ea2') = uuid; # 54963433\n\nSELECT * FROM activities WHERE uuid_to_bin('8b6bb2f7-e7a7-4aec-8806-fbfea7093ccd') = uuid; # 54963421\n\n# ****************************************** Close *************************\nselect * from teams where id = 1031;\nSELECT * FROM crm_configurations WHERE id = 959;\nSELECT * FROM activities WHERE uuid_to_bin('59c517e0-96c9-4dad-bfeb-b7bef72f8725') = uuid; # 54963517\n\n\nSELECT * FROM activities WHERE uuid_to_bin('07238011-25fa-418e-838b-fb21e82b9ea2') = uuid; # 54963433\n\nSELECT * FROM activities WHERE uuid_to_bin('d68311e3-ac34-49bd-bf04-88323a7e5352') = uuid; # 54966009\n\n# ****************************************** SF *************************\nSELECT * FROM activities WHERE uuid_to_bin('2bd4cfa3-4eb5-4c77-84a7-9ed46a21c988') = uuid;\n\nselect * from roles;\nselect * from permissions;\nselect * from permission_role where permission_id = 136;\n\nselect * from migrations order by id desc;\n\nselect * from teams where id IN (1, 1037);\nselect * from crm_layouts where crm_configuration_id = 1;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1493;\nSELECT * FROM crm_fields WHERE id IN (1652,1661,66799,66814,66821,66836,66843,66846,66864,84752,182306,323580,380378);\n\nselect * from features;\nselect * from team_features where feature_id = 33;\nselect * from opportunities;\n\nselect * from teams;\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 = 1052 and sa.provider = 'hubspot';\n\nSELECT * FROM accounts where id = 11512582;\nselect * from activities where account_id = 11512582;","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Project","depth":3,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Project","depth":3,"bounds":{"left":0.025,"top":0.06666667,"width":0.050694443,"height":0.034444444},"on_screen":true,"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},"on_screen":false,"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},"on_screen":false,"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},"on_screen":false,"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},"on_screen":false,"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},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
4266403488567062772
|
6524482065460761565
|
visual_change
|
accessibility
|
NULL
|
Project: faVsco.js, menu
#12066 on JY-20725-handle Project: faVsco.js, menu
#12066 on JY-20725-handle-HS-search-rate-limit, menu
Start Listening for PHP Debug Connections
HandleHubspotRateLimitTest
Run 'HandleHubspotRateLimitTest'
Debug 'HandleHubspotRateLimitTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
16
2
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Services\Crm\IntegrationApp;
use Carbon\Carbon;
use Jiminny\Contracts\Crm\Providers;
use Jiminny\Contracts\Services\Crm\ClientInterface;
use Jiminny\Contracts\Services\Crm\FetchRelatedActivityInterface;
use Jiminny\Contracts\Services\Crm\ImportsBusinessProcessesInterface;
use Jiminny\Contracts\Services\Crm\LayoutManagementInterface;
use Jiminny\Contracts\Services\Crm\MatchCrmEntitiesInterface;
use Jiminny\Contracts\Services\Crm\Provider\IntegrationAppInterface;
use Jiminny\Contracts\Services\Crm\RemoteEntityLookupInterface;
use Jiminny\Contracts\Services\Crm\RemoteEntityManipulationInterface;
use Jiminny\Contracts\Services\Crm\RemoteNoteEntityManipulationInterface;
use Jiminny\Contracts\Services\Crm\SendSummaryToCrmInterface;
use Jiminny\Contracts\Services\Crm\SettingsInterface;
use Jiminny\Contracts\Services\Crm\SyncCrmEntitiesInterface;
use Jiminny\Contracts\Services\Crm\SyncCrmMetadataInterface;
use Jiminny\Events\Activities\Crm\ActivityLeadConverted;
use Jiminny\Exceptions\CrmException;
use Jiminny\Exceptions\SocialAccountNotFoundException;
use Jiminny\Jobs\Crm\NoteObject;
use Jiminny\Models\Account;
use Jiminny\Models\Activity;
use Jiminny\Models\Contracts\ActivityContract;
use Jiminny\Models\Crm\Configuration;
use Jiminny\Models\Opportunity;
use Jiminny\Models\Stage;
use Jiminny\Models\User;
use Jiminny\Services\Crm\BaseService;
use Jiminny\Services\Crm\IntegrationApp\Config\IntegrationAppProviders;
use Jiminny\Services\Crm\IntegrationApp\Config\IntegrationConfigFactory;
use Jiminny\Services\Crm\IntegrationApp\DTO\Mappers\FieldMapperInterface;
use Jiminny\Services\Crm\IntegrationApp\DTO\Mappers\LeadFieldMapper;
use Jiminny\Services\Crm\IntegrationApp\DTO\Utils\GenerateProviderUrlInterface;
use Jiminny\Services\Crm\IntegrationApp\DTO\Utils\IntegrationAppCrmGeneratorFactory;
use Jiminny\Services\Crm\IntegrationApp\DTO\Utils\UrlGeneratorInterface;
use Jiminny\Services\Crm\IntegrationApp\ServiceTraits\SyncCrmFieldsTrait;
use Jiminny\Services\Crm\IntegrationApp\ServiceTraits\SystemStateTrait;
use Jiminny\Services\Crm\IntegrationApp\ServiceTraits\LayoutTrait;
use Jiminny\Services\Crm\IntegrationApp\ServiceTraits\MatchProspectsTrait;
use Jiminny\Services\Crm\IntegrationApp\ServiceTraits\NotSupportedTrait;
use Jiminny\Services\Crm\IntegrationApp\ServiceTraits\SyncCrmEntitiesTrait;
use Jiminny\Services\Crm\IntegrationApp\ServiceTraits\SyncCrmMetadataTrait;
use Psr\Log\LoggerInterface;
use Jiminny\Services\Crm\IntegrationApp\DTO\Mappers\OpportunityFieldMapper;
use Jiminny\Repositories\Crm\ProfileRepository;
use Jiminny\Repositories\Crm\OpportunityRepository;
use Jiminny\Models\Crm\Profile;
use Jiminny\Services\Crm\CrmObjects\CrmObjectsRepository;
class Service extends BaseService implements
IntegrationAppInterface,
SyncCrmEntitiesInterface,
SyncCrmMetadataInterface,
ImportsBusinessProcessesInterface,
RemoteEntityManipulationInterface,
LayoutManagementInterface,
SettingsInterface,
MatchCrmEntitiesInterface,
RemoteEntityLookupInterface,
RemoteNoteEntityManipulationInterface,
SendSummaryToCrmInterface,
UrlGeneratorInterface,
FetchRelatedActivityInterface
{
use SyncCrmMetadataTrait;
use SyncCrmEntitiesTrait;
use SystemStateTrait;
use LayoutTrait;
use NotSupportedTrait;
use MatchProspectsTrait;
use SyncCrmFieldsTrait;
public const string CALL_TYPE_MISSED = 'Missed';
public const string CALL_TYPE_INBOUND = 'Inbound';
public const string CALL_TYPE_OUTBOUND = 'Outbound';
public const string RELATIONSHIP_OPPORTUNITY = 'Deals';
public const string RELATIONSHIP_LEAD = 'Leads';
public const string RELATIONSHIP_ACCOUNT = 'Accounts';
/**
* @var ClientInterface&DataClient
*/
protected $client;
protected ?User $invokedUser = null;
protected ?GenerateProviderUrlInterface $crmUrlGenerator = null;
public function __construct(
DataClient $client,
LoggerInterface $logger,
) {
parent::__construct();
$this->client = $client;
$this->logger = $logger;
}
public function getDisplayName(): string
{
return Providers::getProviderDisplayName(
Providers::getCrmIntegrationSlug($this->config)
);
}
/**
* @throws \Exception
*/
public function setUser(User $user): void
{
$this->configureSentryScope($user);
$this->invokedUser = $user;
$this->team = $user->getTeam();
$teamOwner = $this->team->getOwner();
$this->setConfiguration($user->getTeam()->getCrmConfiguration());
$this->setEditionConfiguration(Providers::getCrmIntegrationSlug($this->config));
$this->setCrmUrlGenerator($this->config);
$this->client->setTeam($this->team);
$socialAccount = $teamOwner?->getSocialAccount('integration-app');
if ($socialAccount === null) {
$this->logger->info('[integration-app] Social account not found', [
'teamId' => $this->team->getId(),
'teamOwnerId' => $teamOwner?->getId(),
'userId' => $user->getId(),
]);
throw new SocialAccountNotFoundException('Social account not found!');
}
$this->client->setSocialAccount($socialAccount);
// The CRM Service is properly bootstrapped, and supports remote operations
$this->connect();
}
public function normalizeValue(string $fieldType, string $fieldValue, bool $internal = false): string
{
return $fieldValue;
}
public function find(string $name, array $scopes): array
{
/** @var LocalSearch $localSearch */
$localSearch = app(LocalSearch::class);
$localSearch->setConfiguration($this->config);
$localSearch->setCountryCode($this->invokedUser->getCountryCode());
return $localSearch->search($name);
// if (! empty($localMatch)) {
// return $localMatch;
// }
//
// /** @var RemoteSearch $remoteSearch */
// $remoteSearch = app(RemoteSearch::class);
// $remoteSearch->setClient($this->client);
// $remoteSearch->setConfiguration($this->config);
//
// return $remoteSearch->search($name);
}
public function findOpportunities(?string $crmAccountId, ?string $crmContactId, ?int $userId = null): array
{
$data = [];
$ownerData = [];
$account = $this->getAccount($crmAccountId, $crmContactId);
if ($account === null) {
return [];
}
$ownerId = $this->getOwnerId($userId);
try {
$opportunityRepository = app(OpportunityRepository::class);
$opportunities = $opportunityRepository->findAllByConfigurationAndAccountId(
$this->config,
$account->getId()
);
foreach ($opportunities as $opportunity) {
/** @var Opportunity $opportunity */
$record = $this->buildOpportunityData($opportunity);
if ($ownerId && $opportunity->getOwnerId() === $ownerId) {
$ownerData[] = $record;
}
$data[] = $record;
}
if (! empty($ownerData)) {
return $ownerData;
}
return $data;
} catch (\Exception $e) {
$this->logger->info('[integration-app] Failed to fetch opportunities', [
'contact' => $crmContactId,
'account' => $crmAccountId,
'owner' => $ownerId,
'error' => $e->getMessage(),
]);
return $data;
}
}
private function getOwnerId(?int $userId = null): ?string
{
if (! $userId) {
return null;
}
$profileRepository = app(ProfileRepository::class);
$profile = $profileRepository->findProfileByUserId($this->config, $userId);
return $profile instanceof Profile ? $profile->getCrmProviderId() : null;
}
private function getAccount(?string $crmAccountId = null, ?string $crmContactId = null): ?Account
{
$crmRepository = app(CrmObjectsRepository::class);
if ($crmAccountId === null) {
$contact = $crmRepository->findContactByCrmProviderId($this->config, $crmContactId);
return $contact->getAccount();
}
return $crmRepository->findAccountByCrmProviderId($this->config, $crmAccountId);
}
private function buildOpportunityData(Opportunity $opportunity): array
{
$record = [
'crmId' => $opportunity->getCrmProviderId(),
'name' => $opportunity->getName(),
'won' => $opportunity->isWon(),
'closed' => $opportunity->isClosed(),
];
if (! empty($opportunity->getFormattedValueAttribute())) {
$record['value'] = $opportunity->getFormattedValueAttribute();
}
if (! empty($opportunity->getStage())) {
$record['stage'] = [
'id' => $opportunity->getStage()->getUuid(),
'name' => $opportunity->getStage()->getName(),
];
}
return $record;
}
public function updateRecord(string $objectType, string $objectId, array $data, array $headers = []): void
{
$data = [
'data' => $this->normalizeData($objectType, $data),
];
$this->client->updateRecordById($objectType, $objectId, $data);
}
private function normalizeData(string $objectType, array $data): array
{
$fieldMapper = $this->getFieldMapper($objectType);
if (! $fieldMapper instanceof FieldMapperInterface) {
return $data;
}
return $fieldMapper->mapToCrmFields($data);
}
private function getFieldMapper(string $objectType): ?FieldMapperInterface
{
if ($objectType === self::OBJECT_OPPORTUNITY) {
return app(OpportunityFieldMapper::class);
}
if ($objectType === self::OBJECT_LEAD) {
return app(LeadFieldMapper::class);
}
return null;
}
public function getRecord(string $objectType, string $objectId, array $fields = []): array
{
return $this->client->getRecordById($objectType, $objectId);
}
public function getConfiguration(): Configuration
{
return $this->config;
}
public function setConfiguration(Configuration $config): void
{
$this->clearExternalMapCache();
$this->config = $config;
}
private function setEditionConfiguration(string $provider): void
{
$this->editionConfig = app(IntegrationConfigFactory::class)->create($provider);
}
public function setCrmUrlGenerator(Configuration $config): void
{
$this->crmUrlGenerator = app(IntegrationAppCrmGeneratorFactory::class)->create($config);
}
public function getCrmUrlGenerator(): ?GenerateProviderUrlInterface
{
if ($this->crmUrlGenerator === null) {
$this->setCrmUrlGenerator($this->config);
}
return $this->crmUrlGenerator;
}
public function subscribeEntityEvents(bool $enableTrigger = true): void
{
$eventStates = $this->client->updateEntityEventsState($enableTrigger);
$this->logger->info('[integration-app] Change team entity events subscription', [
'teamId' => $this->team->getId(),
'teamName' => $this->team->getName(),
'states' => $eventStates,
'action' => $enableTrigger ? 'subscribe' : 'unsubscribe',
]);
}
#[\Override] public function supportsNotes(): bool
{
return $this->editionConfig->supportsNotes();
}
#[\Override] public function saveNote(
string $title,
string $body,
string $objectId,
?NoteObject $noteObject = null,
): ?string {
if ($noteObject === null) {
return null;
}
$notePayload = [
'title' => $title,
'content' => $body,
'objectId' => $objectId,
'objectType' => $noteObject->value,
];
$result = $this->client->createNote($notePayload);
// debug saving note response
$this->logger->info('[integration-app] createNote response', [
'objectId' => $objectId,
'objectType' => $noteObject->value,
'result' => $result,
'hasId' => isset($result['id']),
]);
return $result['id'] ?? null;
}
/**
* @throws CrmException
*/
#[\Override] public function saveActivity(Activity $activity): Activity
{
$this->logger->info('[integration-app] saveActivity', [
'activity' => $activity->getUuid(),
'type' => $activity->getType(),
]);
if ($activity->getCrmType() === Activity::TYPE_CONFERENCE) {
$crmActivity = $this->saveMeeting($activity);
} elseif (in_array($activity->getType(), [Activity::TYPE_SOFTPHONE, Activity::TYPE_SOFTPHONE_INBOUND])) {
$crmActivity = $this->saveCall($activity);
} else {
throw new CrmException('Unsupported activity type');
}
$crmActivityId = $crmActivity['id'] ?? null;
if ($crmActivityId !== null) {
$activity->crm_provider_id = $crmActivityId;
$activity->save();
$this->logger->info('[integration-app] Activity successfully logged to CRM', [
'activity' => $activity->getUuid(),
'type' => $activity->getType(),
'crmId' => $crmActivityId,
]);
}
return $activity;
}
public function saveMeeting(Activity $activity): array
{
$decorateActivity = app(DecorateActivity::class);
$meetingPayload = [
'Event_Title' => $decorateActivity->generateTitle($activity),
'Start_DateTime' => $activity->getActualStartTime()->toIso8601String(),
'End_DateTime' => $activity->getActualEndTime()->toIso8601String(),
'ownerId' => $this->getActivityOwnerId($activity),
];
$payload = array_merge($meetingPayload, $this->attachToProspect($activity));
if ($activity->hasCrmProviderId()) {
$crmId = $activity->getCrmProviderId();
$meeting = $this->client->getMeeting($crmId);
$oldDescription = $meeting['fields']['Description'] ?? null;
$payload['Description'] = $decorateActivity->generateUpdatedDescription($oldDescription, $activity);
$this->logger->info('[integration-app] CRM update meeting', [
'activity' => $activity->getUuid(),
'crm_id' => $crmId,
'payload' => $payload,
]);
return $this->client->updateMeeting($crmId, $payload);
}
$payload['Description'] = $decorateActivity->generateDescription($activity);
$this->logger->info('[integration-app] CRM log meeting', [
'activity' => $activity->getUuid(),
'payload' => $payload,
]);
return $this->client->createMeeting($payload);
}
public function saveCall(Activity $activity): array
{
$decorateActivity = app(DecorateActivity::class);
$callPayload = [
'Call_Type' => $this->getCallType($activity),
'Call_Start_Time' => $activity->getActualStartTime()->toIso8601String(),
'Call_Duration' => $activity->getDuration(),
'name' => $decorateActivity->generateTitle($activity),
'ownerId' => $this->getActivityOwnerId($activity),
];
$payload = array_merge($callPayload, $this->attachToProspect($activity));
if ($activity->hasCrmProviderId()) {
$crmId = $activity->getCrmProviderId();
$call = $this->client->getCall($crmId);
$oldDescription = $call['fields']['Description'] ?? null;
$payload['description'] = $decorateActivity->generateUpdatedDescription($oldDescription, $activity);
$this->logger->info('[integration-app] CRM update call', [
'activity' => $activity->getUuid(),
'crm_id' => $crmId,
'payload' => $payload,
]);
return $this->client->updateCall($crmId, $payload);
}
$payload['description'] = $decorateActivity->generateDescription($activity);
$this->logger->info('[integration-app] CRM log call', [
'activity' => $activity->getUuid(),
'payload' => $payload,
]);
return $this->client->createCall($payload);
}
private function getCallType(Activity $activity): string
{
if ($activity->getStatus() === Activity::STATUS_NO_ANSWER) {
return self::CALL_TYPE_MISSED;
}
return $activity->getType() === Activity::TYPE_SOFTPHONE_INBOUND ? self::CALL_TYPE_INBOUND : self::CALL_TYPE_OUTBOUND;
}
private function attachToProspect(Activity $activity): array
{
$payload = [];
if ($activity->hasContact()) {
$payload['contactId'] = $activity->getContact()->getCrmProviderId();
}
if ($activity->hasOpportunity()) {
return array_merge(
$payload,
$this->buildBasicPayload(
self::RELATIONSHIP_OPPORTUNITY,
$activity->getOpportunity()->getCrmProviderId()
)
);
}
if ($activity->hasAccount() && ! $activity->getAccount()->getIsInternal()) {
return array_merge(
$payload,
$this->buildBasicPayload(
self::RELATIONSHIP_ACCOUNT,
$activity->getAccount()->getCrmProviderId()
)
);
}
if ($activity->hasLead()) {
$payload = $this->handleLeadPayload($activity);
}
return $payload;
}
private function handleLeadPayload(Activity $activity): array
{
$freshLead = $this->syncLead($activity->getLead()->getCrmProviderId());
$lead = $freshLead ?? $activity->getLead();
if ($lead->getConvertedAt() === null) {
return $this->buildBasicPayload(self::RELATIONSHIP_LEAD, $lead->getCrmProviderId());
}
$activity->lead_id = null;
if ($lead->hasAccount()) {
$account = $lead->getAccount();
$activity->account_id = $account->getId();
$payload = $this->buildBasicPayload(self::RELATIONSHIP_ACCOUNT, $account->getCrmProviderId());
} else {
$payload = [];
}
if ($lead->hasOpportunity()) {
$opportunity = $lead->getOpportunity();
$payload = $this->buildBasicPayload(self::RELATIONSHIP_OPPORTUNITY, $opportunity->getCrmProviderId());
$activity->opportunity_id = $opportunity->getId();
$activity->value = $opportunity->value;
$activity->stage_id = $opportunity->stage_id;
} else {
$activity->stage_id = null;
}
if ($lead->hasContact()) {
$contact = $lead->getContact();
$payload['contactId'] = $contact->getCrmProviderId();
$activity->contact_id = $contact->getId();
}
$activity->save();
event(new ActivityLeadConverted($activity, $lead));
$this->logger->info('[integration-app] Lead converted', [
'activityUuid' => $activity->getUuid(),
'leadUuid' => $lead->getUuid(),
]);
return $payload;
}
private function buildBasicPayload(string $type, string $id): array
{
return [
'type' => $type,
'id' => $id,
];
}
private function getActivityOwnerId(Activity $activity): ?string
{
$ownerId = null;
if ($activity->hasUser() && $activity->getUser()->getProfile() !== null) {
$ownerId = $activity->getUser()->getProfile()->getCrmProviderId();
}
return $ownerId;
}
#[\Override] public function saveFollowupActivity(Activity $activity, array $fields): ?string
{
$taskPayload = [
'subject' => $fields['subject'],
'dueTime' => isset($fields['dueDate']) ? Carbon::parse($fields['dueDate'])->format('Y-m-d') : null,
'ownerId' => $this->getActivityOwnerId($activity),
];
if (isset($fields['status'])) {
$taskPayload['status'] = $fields['status'];
}
if (isset($fields['priority'])) {
$taskPayload['priority'] = $fields['priority'];
}
if (isset($fields['content'])) {
$taskPayload['content'] = $fields['content'];
}
$payload = array_merge($taskPayload, $this->attachToProspect($activity));
$this->logger->info('[integration-app] CRM log follow up task', [
'activity' => $activity->getUuid(),
'payload' => $payload,
]);
$task = $this->client->createTask($payload);
return $task['id'] ?? null;
}
#[\Override] public function saveTranscriptionSummaryAsNote(
ActivityContract $activity,
string $title,
string $body,
?string $objectId,
?NoteObject $noteObject = null,
): ?string {
// We have to find a way to store the transcription summary
// This might be possible either by Tasks, Events, Engagements & Notes
// Find what the CRM supports and save the note with the appropriate object(eg Notes)
// For now use only Notes as both ZOHO & Salesforce support them.
if ($this->supportsNotes() && $objectId !== null) {
$this->logger->info('[integration-app] saving note', [
'activityId' => $activity->getUuid(),
'objectId' => $objectId,
]);
return $this->saveNote($title, $body, $objectId, $noteObject);
}
$this->logger->info('[integration-app] skip saveTranscriptionSummaryAsNote', [
'activityId' => $activity->getUuid(),
'supportsNotes' => $this->supportsNotes(),
'objectId' => $objectId,
]);
return null;
}
public function generateProviderUrl(string $providerId, string $objectType): ?string
{
return $this->getCrmUrlGenerator()?->generateProviderUrl($providerId, $objectType);
}
public function updateStage($crmObject, Stage $stage): void
{
$objectType = $stage->getType();
$objectId = $crmObject->getCrmProviderId();
$params = ['stageName' => $stage->getCrmProviderId()];
$this->logger->info('[integration-app] updateStage', [
'objectType' => $objectType,
'objectId' => $objectId,
'params' => $params,
]);
$data = [
'data' => $this->normalizeData($objectType, $params),
];
if ($objectType === Stage::TYPE_LEAD) {
$this->client->updateLead($objectId, $data);
} else {
$this->client->updateDeal($objectId, $data);
}
}
/**
* @throws \Exception
*/
public function fetchAndAssociateRelatedActivity(Activity $activity): ?Activity
{
if ($activity->getCrm()?->getEdition() !== IntegrationAppProviders::ZOHO_CRM) {
return null;
}
if (! $activity->isTypeConference()) {
return null;
}
// The related activity is already linked.
if ($activity->hasCrmProviderId()) {
return $activity;
}
if ($activity->hasActualStartTime() === false) {
return null;
}
return $this->fetchAndAssociateZohoRelatedActivity($activity);
}
public function fetchAndAssociateZohoRelatedActivity(Activity $activity): ?Activity
{
try {
$meeting = $this->fetchRelatedZohoActivity($activity);
if (empty($meeting)) {
$this->logger->info('[integration-app] fetchRelatedZohoActivity No related activity found', [
'activity' => $activity->getUuid(),
]);
return null;
}
$decorateActivity = app(DecorateActivity::class);
$oldDescription = $meeting['Description'] ?? '';
$updatedDescription = $decorateActivity->generateUpdatedDescription($oldDescription, $activity);
$this->logger->info('[integration-app] fetchAndAssociateZohoRelatedActivity updating related activity', [
'activity' => $activity->getUuid(),
'description' => $updatedDescription,
]);
$this->client->updateMeeting($meeting['id'], ['Description' => $updatedDescription]);
// Update our activity to reflect the remote data.
$activity->update([
'crm_provider_id' => $meeting['id'],
'summary' => $meeting['Description'],
]);
return $activity;
} catch (\Exception $exception) {
\Sentry::captureException($exception);
throw $exception;
}
}
public function fetchRelatedZohoActivity(Activity $activity): array
{
[$from, $to] = $this->getFromToDates($activity);
$start = $from?->toIso8601String(); // e.g., 2025-07-01T00:00:00+00:00
$end = $to?->toIso8601String(); // e.g., 2025-07-14T23:59:59+00:00
if ($start === null || $end === null) {
$this->logger->info(
'[integration-app] fetchRelatedZohoActivity missing start or end date',
[
'activity' => $activity->getUuid(),
'start' => $start,
'end' => $end,
'from' => $from,
'to' => $to,
]
);
return [];
}
$whoId = null;
$whatId = null;
$criteriaParts = [];
if ($activity->getContact()) {
$whoId = $activity->getContact()->getCrmProviderId();
$criteriaParts[] = "(Who_Id:equals:$whoId)";
}
if ($activity->getOpportunity()) {
$whatId = $activity->getOpportunity()->getCrmProviderId();
} elseif ($activity->getAccount() && $activity->getAccount()->getIsInternal() === false) {
$whatId = $activity->getAccount()->getCrmProviderId();
} elseif ($activity->getLead()) {
$whatId = $activity->getLead()->getCrmProviderId();
}
if ($whatId !== null) {
$criteriaParts[] = "(What_Id:equals:$whatId)";
}
if ($whoId === null && $whatId === null) {
$this->logger->info(
'[integration-app] fetchRelatedZohoActivity cannot find prospect',
[
'activity' => $activity->getUuid(),
]
);
return [];
}
$criteriaParts[] = "(Start_DateTime:greater_equal:$start)";
$criteriaParts[] = "(End_DateTime:less_equal:$end)";
$criteria = implode(' AND ', $criteriaParts);
$params = [
'criteria' => $criteria,
'sort_by' => 'Modified_Time',
'sort_order' => 'desc',
];
$this->logger->info(
'[integration-app] fetchRelatedZohoActivity searching for related activity',
[
'activity' => $activity->getUuid(),
'params' => $params,
]
);
$meetings = $this->client->searchMeetings($params);
if (! empty($meetings)) {
return $meetings[0];
}
return [];
}
private function getFromToDates(Activity $activity): array
{
$calendarEvent = $activity->calendarEvent()->first();
$from = $calendarEvent?->getStartTime();
$to = $calendarEvent?->getEndTime();
if (! $from || ! $to) {
$from = $activity->hasScheduledStartTime()
? $activity->getScheduledStartTime()
: $activity->getActualStartTime();
$to = $activity->hasScheduledEndTime()
? $activity->getScheduledEndTime()->addMinutes(15)
: $activity->getActualEndTime();
}
return [$from, $to];
}
}
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
8
1
3
4
Previous Highlighted Error
Next Highlighted Error
SELECT
# DISTINCT
opp.id as opp_id, opp.uuid, opp.name,
# COUNT(dr.id) AS deal_risk_count,
# dr.id,
# cfd.value,
usr.name AS owner_name,
opp.value, opp.currency_code, opp.close_date, opp.remotely_created_at, opp.is_closed, opp.is_won,
usr.uuid as owner_uuid,
usr.photo_path as owner_photo,
usr.id AS owner_id,
jt.name as owner_job,
opp.stage_id, opp.stage_updated_at,
acc.name AS acc_name, opp.stage_updated_at, acc.crm_provider_id AS acc_provider_id, opp.crm_provider_id AS opp_provider_id,
rt.business_process_id AS pipeline_id
FROM opportunities opp
LEFT JOIN record_types rt ON opp.record_type_id = rt.id
LEFT JOIN users usr ON opp.user_id = usr.id
LEFT JOIN accounts acc ON opp.account_id = acc.id
LEFT JOIN job_titles jt ON usr.job_title_id = jt.id
# LEFT JOIN group_deal_risk_types gdrt ON gdrt.group_id = usr.group_id
# LEFT JOIN deal_risks dr ON dr.opportunity_id = opp.id AND dr.group_deal_risk_type_id = gdrt.id
LEFT JOIN crm_field_data cfd ON (cfd.object_id = opp.id and cfd.crm_field_id = 66814)
WHERE opp.user_id IS NOT NULL
AND opp.deleted_at IS NULL
AND opp.is_closed = 1
AND opp.is_won = 0
AND opp.close_date >= '2024-01-01 00:00:00'
AND opp.close_date <= '2024-12-31 23:59:59'
AND usr.team_id = 1
# and opp.id = 4823179
GROUP BY opp.id, cfd.value
ORDER BY
# cfd.value
CAST(cfd.value AS UNSIGNED)
# owner_name
# (SELECT COUNT(dr.id)
# FROM deal_risks dr
# JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id
# WHERE dr.opportunity_id = opp.id
# AND dr.is_active = 1
# AND gdrt.is_enabled = 1)
DESC
LIMIT 25
# OFFSET 0
;
select * from crm_fields where crm_configuration_id = 1 and object_type = 'opportunity';
select * from crm_layout_entities where crm_layout_id = 1493;
SELECT * FROM opportunities WHERE id = 4584045;
SELECT * FROM crm_field_data WHERE object_id = 4584045;
SELECT * FROM opportunities where team_id = 1 and crm_provider_id = '0061K00000lfb9IQAQ'
SELECT
opp.id as opportunity_id,
opp.name,
COUNT(dr.id) as risk_count
FROM opportunities opp
LEFT JOIN deal_risks dr ON dr.opportunity_id = opp.id
WHERE opp.id IN (
6069574,8900938,9507638,9524799,9660490,9662824,9705675,9749758,4158460,4391812,6450439,4448422,5118945,5590675,4584045,7228149,9002408,9165534,9446720,9641778,9665149,9703344,9709280,5747948,4158491,6182565,6263970,5798120,5111315,4536978,6062352,6548383,6072095,6548225,4480986,5011422,6548381,8760540,8917554,9509986,9514392,9569009,9569011,9578490,9713604,5784397,7276612,7288405,8994421,9118219,9608148,9818911,4510535,6479693,5958049,6271674,6550448,4158331,4158483,6126571,6171615,6540943,4897466,5190896,5796182,5932762,8572433,8723698,8892697,9711001,9789264,4549188,6100831,6170064,6260799,6263653,6449936,6530871,6538978,7777651,8059269,8319918,8787049,8901150,9263153,9453207,9514738,9696700,9791062,5752018,6421452,7439134,7878923,9354763,9369285,9514396,9582506,9889949,9890216,4094311,4158495,4158496,6098128,5585661,3872564,6442149,5891604,6164746,6199593,6583474,6519684,9018490,9809006,4496897,5041324,5829430,6198319,6253504,6555763,7242914,7931055,8024125,8797814,8058559,8673347,8892695,8994420,9616219,9714970,9722004,9809439,9818918,6523177,8134147,9002915,9711422,9892713,9901719,9954210,9978435,5800810,6243518,6416114,6222251,6411974,6512456,5791953,6545606,9914780,5805540,6238986,6463838,6547680,9767049,9809437,9810885,9890855,6673493,9902036,4335521,6379871,6503799,6546077,8018765,9907556,9958433,9905855,9916179,9946741,9957877,5563344,6271838,6450815,7641128,7762567,7780592,8684810,8685786,8685787,8685788
)
GROUP BY opp.id;
SELECT COUNT(dr.id)
FROM deal_risks dr
JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id
WHERE dr.opportunity_id = 5563344
# AND gdrt.group_id = usr.group_id
EXPLAIN SELECT
opp.id as opp_id, opp.uuid, opp.name,
cfd.value,
cfv.sequence,
cfv.value,
# MAX(cfd.value) AS max_cfd_value,
usr.name AS owner_name,
opp.value, opp.currency_code, opp.close_date, opp.remotely_created_at, opp.is_closed, opp.is_won,
usr.uuid as owner_uuid,
usr.photo_path as owner_photo,
usr.id AS owner_id,
jt.name as owner_job,
opp.stage_id, opp.stage_updated_at,
acc.name AS acc_name, opp.stage_updated_at, acc.crm_provider_id AS acc_provider_id, opp.crm_provider_id AS opp_provider_id,
rt.business_process_id AS pipeline_id
FROM opportunities opp
LEFT JOIN record_types rt ON opp.record_type_id = rt.id
LEFT JOIN users usr ON opp.user_id = usr.id
LEFT JOIN accounts acc ON opp.account_id = acc.id
LEFT JOIN job_titles jt ON usr.job_title_id = jt.id
LEFT JOIN crm_field_data cfd ON cfd.id = (SELECT sub_cfd.id
FROM crm_field_data sub_cfd
WHERE sub_cfd.object_id = opp.id
AND sub_cfd.crm_field_id = 66810
ORDER BY sub_cfd.updated_at DESC
LIMIT 1)
LEFT JOIN crm_field_values cfv ON cfv.crm_field_id = 66810 AND cfv.value = cfd.value
WHERE opp.user_id IS NOT NULL
AND opp.deleted_at IS NULL
AND opp.is_closed = 0
# AND opp.is_closed = 1
# AND opp.is_won = 0
AND opp.close_date >= '2024-01-01 00:00:00'
AND opp.close_date <= '2024-12-31 23:59:59'
AND usr.team_id = 1
# and opp.id = 4823179
# GROUP BY opp.id
ORDER BY
cfv.sequence DESC,
# opp.name
# owner_name
cfd.value
# CAST(cfd.value AS UNSIGNED)
# CAST(MAX(cfd.value) AS UNSIGNED)
# (SELECT COUNT(dr.id)
# FROM deal_risks dr
# JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id
# WHERE dr.opportunity_id = opp.id
# AND dr.is_active = 1 AND gdrt.is_enabled = 1)
DESC
# LIMIT 75, 25
;
SELECT * FROM crm_field_values WHERE crm_field_id = 66810;
SELECT f.id, f.crm_provider_id AS field_name, f.label, fd.object_id AS dealId, fd.value, fd.updated_at, fd.id, fd.created_at
FROM crm_fields f
INNER JOIN crm_field_data fd ON fd.crm_field_id = f.id
WHERE (f.crm_configuration_id = 1)
AND (f.object_type = 'opportunity')
# AND (fd.object_id IN (4158331,4158483,4158495,4158496,6069574,6263970,6171615,6540943,6545606,5829430,6198319,6263653,6548381,7242914,8797814,7228149,7439134,7878923,8134147,9002915,9118219,9165534,9354763,9369285,9446720))
AND (fd.object_id IN (4158460))
AND (f.crm_provider_id IN ('ForecastCategoryName'))
ORDER BY fd.object_id ASC, fd.updated_at DESC;
select * from crm_layouts where crm_configuration_id = 1;
select cf.* from crm_fields cf
join crm_layout_entities cle on cf.id = cle.crm_field_id
where crm_layout_id = 1493;
SELECT * FROM opportunities WHERE id = 4158460;
SELECT * FROM crm_field_data WHERE object_id = 4158460;
select * from users where team_id = 1;
SELECT * FROM users WHERE id = 7160;
select * from role_user where user_id = 3248;
select * from crm_field_values where crm_field_id = 66824;
SELECT * FROM users WHERE id = 23470;
select * from crm_configurations;
# [PASSWORD_DOTS]
select * from teams where id = 1038; # 23521, 966
select * from users where team_id = 1038;
select * from crm_configurations where id = 966;
SELECT * FROM activities WHERE uuid_to_bin('e8dc7c34-31f6-4430-bd81-2d9d8f00dd07') = uuid; # 54965762
SELECT * FROM activities WHERE uuid_to_bin('4b5727c0-69d1-428f-b8d9-b649055166e2') = uuid; # 54965764
SELECT * FROM participants WHERE activity_id = 54965764;
SELECT id, uuid, title, recording_state FROM activities WHERE uuid_to_bin('355f105d-5606-4379-b0c5-d91daf59f4ce') = uuid; # 54964075
SELECT * FROM participants WHERE activity_id = 54964075;
select f.id, slug, title, tf.team_id from team_features tf JOIN features f on tf.feature_id = f.id
where tf.team_id = 1038;
# [PASSWORD_DOTS] PD [PASSWORD_DOTS]
select * from teams where id = 1029;
SELECT * FROM crm_configurations WHERE id = 957;
SELECT * FROM activities WHERE uuid_to_bin('581a33cb-4343-44bd-ac0c-4a5cee71c5ec') = uuid; # 54963423
SELECT * FROM activities WHERE uuid_to_bin('07238011-25fa-418e-838b-fb21e82b9ea2') = uuid; # 54963433
SELECT * FROM activities WHERE uuid_to_bin('8b6bb2f7-e7a7-4aec-8806-fbfea7093ccd') = uuid; # 54963421
# [PASSWORD_DOTS] Close [PASSWORD_DOTS]
select * from teams where id = 1031;
SELECT * FROM crm_configurations WHERE id = 959;
SELECT * FROM activities WHERE uuid_to_bin('59c517e0-96c9-4dad-bfeb-b7bef72f8725') = uuid; # 54963517
SELECT * FROM activities WHERE uuid_to_bin('07238011-25fa-418e-838b-fb21e82b9ea2') = uuid; # 54963433
SELECT * FROM activities WHERE uuid_to_bin('d68311e3-ac34-49bd-bf04-88323a7e5352') = uuid; # 54966009
# [PASSWORD_DOTS] SF [PASSWORD_DOTS]
SELECT * FROM activities WHERE uuid_to_bin('2bd4cfa3-4eb5-4c77-84a7-9ed46a21c988') = uuid;
select * from roles;
select * from permissions;
select * from permission_role where permission_id = 136;
select * from migrations order by id desc;
select * from teams where id IN (1, 1037);
select * from crm_layouts where crm_configuration_id = 1;
SELECT * FROM crm_layout_entities WHERE crm_layout_id = 1493;
SELECT * FROM crm_fields WHERE id IN (1652,1661,66799,66814,66821,66836,66843,66846,66864,84752,182306,323580,380378);
select * from features;
select * from team_features where feature_id = 33;
select * from opportunities;
select * from teams;
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 = 1052 and sa.provider = 'hubspot';
SELECT * FROM accounts where id = 11512582;
select * from activities where account_id = 11512582;
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options
Hide...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
45522
|
1627
|
44
|
2026-05-14T14:41:09.421068+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-14/1778 /Users/lukas/.screenpipe/data/data/2026-05-14/1778769669421_m1.jpg...
|
PhpStorm
|
faVsco.js – IntegrationApp/Service.php
|
1
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
#12066 on JY-20725-handle Project: faVsco.js, menu
#12066 on JY-20725-handle-HS-search-rate-limit, menu
Start Listening for PHP Debug Connections
HandleHubspotRateLimitTest
Run 'HandleHubspotRateLimitTest'
Debug 'HandleHubspotRateLimitTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"bounds":{"left":0.054166667,"top":0.027777778,"width":0.08055556,"height":0.035555556},"on_screen":true,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"#12066 on JY-20725-handle-HS-search-rate-limit, menu","depth":5,"bounds":{"left":0.13472222,"top":0.027777778,"width":0.25555557,"height":0.035555556},"on_screen":true,"help_text":"Pull request #12066 exists for current branch JY-20725-handle-HS-search-rate-limit, but local branch is out of sync with remote","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"bounds":{"left":0.6326389,"top":0.027777778,"width":0.023611112,"height":0.035555556},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"HandleHubspotRateLimitTest","depth":6,"bounds":{"left":0.6645833,"top":0.027777778,"width":0.15902779,"height":0.035555556},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run 'HandleHubspotRateLimitTest'","depth":6,"bounds":{"left":0.82361114,"top":0.027777778,"width":0.023611112,"height":0.035555556},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'HandleHubspotRateLimitTest'","depth":6,"bounds":{"left":0.8472222,"top":0.027777778,"width":0.023611112,"height":0.035555556},"on_screen":true,"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.87083334,"top":0.027777778,"width":0.023611112,"height":0.035555556},"on_screen":true,"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.9291667,"top":0.027777778,"width":0.023611112,"height":0.035555556},"on_screen":true,"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.9527778,"top":0.027777778,"width":0.023611112,"height":0.035555556},"on_screen":true,"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.9763889,"top":0.027777778,"width":0.023611112,"height":0.035555556},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
2586234742233688171
|
-7051436856496256053
|
click
|
hybrid
|
NULL
|
Project: faVsco.js, menu
#12066 on JY-20725-handle Project: faVsco.js, menu
#12066 on JY-20725-handle-HS-search-rate-limit, menu
Start Listening for PHP Debug Connections
HandleHubspotRateLimitTest
Run 'HandleHubspotRateLimitTest'
Debug 'HandleHubspotRateLimitTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
PhpStorm•ProjectvFileFV faVsco.jsvEditViewNavigateCodeLaravelRefactorRunToolsGitWindowHelp#12066 on JY-20725-handle-HS-search-rate-limit k vlhlU HandleHubspotRateLimitTest ~100% C* :8• Thu 14 May 17:41:09Q• DeleteCrmEntityTrait.phpDeleteAccountJob.phpImportActivity Types.phpT WriteCrmTrait.php=custom.logSendReportJob.php> MetadataAccessors© Hubspot/DecorateActivity.phpIntegrationAppServiceTrait.phpIntegrationApp/Service.php x( RemoteWriteAccessor.phpT AccountAccessor.php• BaseAccessor.php© IntegrationApp/DecorateActivity.php© Activity.php© Salesforce/Service.phpD LogActivityTrait.phpPlaybook.php• ContactAccessor.php© Pipedrive/Service.phpClose/Service.phpCopper/Service.php© BullhornService.phpPlainTextDecorateActivity.phpDealAccessor.phpT ActivityPlaybookTrait.phpCrmHelperRepository.php© AccountController.php.env.staging=.env18.••© IntegrationAppAccessExce• LeadAccessor.phpDetachActivityObject.phpRematchActivityOnCrmObjectDetach.phpMatchActivityCrmData.phpClient.phpT MeetingAccessor.phpRegisterEventsAccessor.pt55• RemoteWriteAccessor.php413• SystemStateAccessor.php415© HubspotPaginationService.php© HandleHubspotRateLimit.phpclass Service extendsBaseService implementspublic functionsaveMeeting(Activity $activity): array$decorateActivity = app( abstract: DecorateActivity::class):B16 × 2T UserAccessor.php416• Арi417Config418O DTO419D Filters420v D Jobs421SmeetingPayload = ['Event_Title' => SdecorateActivity->generateTitle(Sactivity),'Start_DateTime' => $activity->getActualStartTime()->toIs08601String(),'End_DateTime' => Sactivity->getActualEndTime()->toIs08601String(),'ownerId' => $this->getActivity0wnerId(Sactivity),© CrmEntitiesFullSyncJob.ph4221;© DeleteRemoteTeamJob.ph423T IntegrationAppService Trait424$payload = array_merge($meetingPayload, $this->attachToProspect($activity));© SubscribeForEventsJob.ph425© TeamInitialSyncJob.php426© UnsubscribeForEventsJob.427© UpdateProfileRelatedEntiti428if ($activity->hasCrmProviderIdO) {$crmid = Sactivity->getCrmProviderIdO;$meeting = $this->client->getMeeting($crmId);© ValidateTeamActiveConne429> ProspectSearchStrategy430> D ServiceTraits431$oldDescription = $meeting['fields']['Description'] ?? null;Spayload['Description'] = SdecorateActivity->generateUpdatedDescription(SoldDescription, Sactivith 230© DataClient.php432© DecorateActivity.php433© LocalSearch.php434• LocalSearchlnterface.php435© RemoteSearch.php436$this->logger->info('[integration-app]CRM update meeting','activity' => $activity->getUvid(),'crm_id' = $crmId,'payload' => $payload,© Service.php4371):v • Listeners438C ConvertLeadActivities.php439return $this->client->updateMeeting(ScrmId,Spayload);© Purnel onkunCache nhnWorkspace associated with branch 'JY-20725-handle-HS-search-rate-limit' has been restored // Rollback // Configure... (today 16:17)=laravel.logSF [jiminny@localhost]A HS_local [jiminny@localho:4 console [QAI PROD] X4 console [PROD]A console (EU]DGo jiminny084143 ×4 л215•m_layout_id =2162,1661,66799,66217218219id = 33;_220—221222-223224id THEN •(own=225_226227228229hubspot':-232233V= 11512582;234W Windsurf Teams449:35UTF-8Ca 4 spaces...
|
45521
|
NULL
|
NULL
|
NULL
|
|
45521
|
1627
|
43
|
2026-05-14T14:41:08.435106+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-14/1778 /Users/lukas/.screenpipe/data/data/2026-05-14/1778769668435_m1.jpg...
|
PhpStorm
|
faVsco.js – IntegrationApp/Service.php
|
1
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
#12066 on JY-20725-handle Project: faVsco.js, menu
#12066 on JY-20725-handle-HS-search-rate-limit, menu
Start Listening for PHP Debug Connections
HandleHubspotRateLimitTest
Run 'HandleHubspotRateLimitTest'
Debug 'HandleHubspotRateLimitTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
16
2
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Services\Crm\IntegrationApp;
use Carbon\Carbon;
use Jiminny\Contracts\Crm\Providers;
use Jiminny\Contracts\Services\Crm\ClientInterface;
use Jiminny\Contracts\Services\Crm\FetchRelatedActivityInterface;
use Jiminny\Contracts\Services\Crm\ImportsBusinessProcessesInterface;
use Jiminny\Contracts\Services\Crm\LayoutManagementInterface;
use Jiminny\Contracts\Services\Crm\MatchCrmEntitiesInterface;
use Jiminny\Contracts\Services\Crm\Provider\IntegrationAppInterface;
use Jiminny\Contracts\Services\Crm\RemoteEntityLookupInterface;
use Jiminny\Contracts\Services\Crm\RemoteEntityManipulationInterface;
use Jiminny\Contracts\Services\Crm\RemoteNoteEntityManipulationInterface;
use Jiminny\Contracts\Services\Crm\SendSummaryToCrmInterface;
use Jiminny\Contracts\Services\Crm\SettingsInterface;
use Jiminny\Contracts\Services\Crm\SyncCrmEntitiesInterface;
use Jiminny\Contracts\Services\Crm\SyncCrmMetadataInterface;
use Jiminny\Events\Activities\Crm\ActivityLeadConverted;
use Jiminny\Exceptions\CrmException;
use Jiminny\Exceptions\SocialAccountNotFoundException;
use Jiminny\Jobs\Crm\NoteObject;
use Jiminny\Models\Account;
use Jiminny\Models\Activity;
use Jiminny\Models\Contracts\ActivityContract;
use Jiminny\Models\Crm\Configuration;
use Jiminny\Models\Opportunity;
use Jiminny\Models\Stage;
use Jiminny\Models\User;
use Jiminny\Services\Crm\BaseService;
use Jiminny\Services\Crm\IntegrationApp\Config\IntegrationAppProviders;
use Jiminny\Services\Crm\IntegrationApp\Config\IntegrationConfigFactory;
use Jiminny\Services\Crm\IntegrationApp\DTO\Mappers\FieldMapperInterface;
use Jiminny\Services\Crm\IntegrationApp\DTO\Mappers\LeadFieldMapper;
use Jiminny\Services\Crm\IntegrationApp\DTO\Utils\GenerateProviderUrlInterface;
use Jiminny\Services\Crm\IntegrationApp\DTO\Utils\IntegrationAppCrmGeneratorFactory;
use Jiminny\Services\Crm\IntegrationApp\DTO\Utils\UrlGeneratorInterface;
use Jiminny\Services\Crm\IntegrationApp\ServiceTraits\SyncCrmFieldsTrait;
use Jiminny\Services\Crm\IntegrationApp\ServiceTraits\SystemStateTrait;
use Jiminny\Services\Crm\IntegrationApp\ServiceTraits\LayoutTrait;
use Jiminny\Services\Crm\IntegrationApp\ServiceTraits\MatchProspectsTrait;
use Jiminny\Services\Crm\IntegrationApp\ServiceTraits\NotSupportedTrait;
use Jiminny\Services\Crm\IntegrationApp\ServiceTraits\SyncCrmEntitiesTrait;
use Jiminny\Services\Crm\IntegrationApp\ServiceTraits\SyncCrmMetadataTrait;
use Psr\Log\LoggerInterface;
use Jiminny\Services\Crm\IntegrationApp\DTO\Mappers\OpportunityFieldMapper;
use Jiminny\Repositories\Crm\ProfileRepository;
use Jiminny\Repositories\Crm\OpportunityRepository;
use Jiminny\Models\Crm\Profile;
use Jiminny\Services\Crm\CrmObjects\CrmObjectsRepository;
class Service extends BaseService implements
IntegrationAppInterface,
SyncCrmEntitiesInterface,
SyncCrmMetadataInterface,
ImportsBusinessProcessesInterface,
RemoteEntityManipulationInterface,
LayoutManagementInterface,
SettingsInterface,
MatchCrmEntitiesInterface,
RemoteEntityLookupInterface,
RemoteNoteEntityManipulationInterface,
SendSummaryToCrmInterface,
UrlGeneratorInterface,
FetchRelatedActivityInterface
{
use SyncCrmMetadataTrait;
use SyncCrmEntitiesTrait;
use SystemStateTrait;
use LayoutTrait;
use NotSupportedTrait;
use MatchProspectsTrait;
use SyncCrmFieldsTrait;
public const string CALL_TYPE_MISSED = 'Missed';
public const string CALL_TYPE_INBOUND = 'Inbound';
public const string CALL_TYPE_OUTBOUND = 'Outbound';
public const string RELATIONSHIP_OPPORTUNITY = 'Deals';
public const string RELATIONSHIP_LEAD = 'Leads';
public const string RELATIONSHIP_ACCOUNT = 'Accounts';
/**
* @var ClientInterface&DataClient
*/
protected $client;
protected ?User $invokedUser = null;
protected ?GenerateProviderUrlInterface $crmUrlGenerator = null;
public function __construct(
DataClient $client,
LoggerInterface $logger,
) {
parent::__construct();
$this->client = $client;
$this->logger = $logger;
}
public function getDisplayName(): string
{
return Providers::getProviderDisplayName(
Providers::getCrmIntegrationSlug($this->config)
);
}
/**
* @throws \Exception
*/
public function setUser(User $user): void
{
$this->configureSentryScope($user);
$this->invokedUser = $user;
$this->team = $user->getTeam();
$teamOwner = $this->team->getOwner();
$this->setConfiguration($user->getTeam()->getCrmConfiguration());
$this->setEditionConfiguration(Providers::getCrmIntegrationSlug($this->config));
$this->setCrmUrlGenerator($this->config);
$this->client->setTeam($this->team);
$socialAccount = $teamOwner?->getSocialAccount('integration-app');
if ($socialAccount === null) {
$this->logger->info('[integration-app] Social account not found', [
'teamId' => $this->team->getId(),
'teamOwnerId' => $teamOwner?->getId(),
'userId' => $user->getId(),
]);
throw new SocialAccountNotFoundException('Social account not found!');
}
$this->client->setSocialAccount($socialAccount);
// The CRM Service is properly bootstrapped, and supports remote operations
$this->connect();
}
public function normalizeValue(string $fieldType, string $fieldValue, bool $internal = false): string
{
return $fieldValue;
}
public function find(string $name, array $scopes): array
{
/** @var LocalSearch $localSearch */
$localSearch = app(LocalSearch::class);
$localSearch->setConfiguration($this->config);
$localSearch->setCountryCode($this->invokedUser->getCountryCode());
return $localSearch->search($name);
// if (! empty($localMatch)) {
// return $localMatch;
// }
//
// /** @var RemoteSearch $remoteSearch */
// $remoteSearch = app(RemoteSearch::class);
// $remoteSearch->setClient($this->client);
// $remoteSearch->setConfiguration($this->config);
//
// return $remoteSearch->search($name);
}
public function findOpportunities(?string $crmAccountId, ?string $crmContactId, ?int $userId = null): array
{
$data = [];
$ownerData = [];
$account = $this->getAccount($crmAccountId, $crmContactId);
if ($account === null) {
return [];
}
$ownerId = $this->getOwnerId($userId);
try {
$opportunityRepository = app(OpportunityRepository::class);
$opportunities = $opportunityRepository->findAllByConfigurationAndAccountId(
$this->config,
$account->getId()
);
foreach ($opportunities as $opportunity) {
/** @var Opportunity $opportunity */
$record = $this->buildOpportunityData($opportunity);
if ($ownerId && $opportunity->getOwnerId() === $ownerId) {
$ownerData[] = $record;
}
$data[] = $record;
}
if (! empty($ownerData)) {
return $ownerData;
}
return $data;
} catch (\Exception $e) {
$this->logger->info('[integration-app] Failed to fetch opportunities', [
'contact' => $crmContactId,
'account' => $crmAccountId,
'owner' => $ownerId,
'error' => $e->getMessage(),
]);
return $data;
}
}
private function getOwnerId(?int $userId = null): ?string
{
if (! $userId) {
return null;
}
$profileRepository = app(ProfileRepository::class);
$profile = $profileRepository->findProfileByUserId($this->config, $userId);
return $profile instanceof Profile ? $profile->getCrmProviderId() : null;
}
private function getAccount(?string $crmAccountId = null, ?string $crmContactId = null): ?Account
{
$crmRepository = app(CrmObjectsRepository::class);
if ($crmAccountId === null) {
$contact = $crmRepository->findContactByCrmProviderId($this->config, $crmContactId);
return $contact->getAccount();
}
return $crmRepository->findAccountByCrmProviderId($this->config, $crmAccountId);
}
private function buildOpportunityData(Opportunity $opportunity): array
{
$record = [
'crmId' => $opportunity->getCrmProviderId(),
'name' => $opportunity->getName(),
'won' => $opportunity->isWon(),
'closed' => $opportunity->isClosed(),
];
if (! empty($opportunity->getFormattedValueAttribute())) {
$record['value'] = $opportunity->getFormattedValueAttribute();
}
if (! empty($opportunity->getStage())) {
$record['stage'] = [
'id' => $opportunity->getStage()->getUuid(),
'name' => $opportunity->getStage()->getName(),
];
}
return $record;
}
public function updateRecord(string $objectType, string $objectId, array $data, array $headers = []): void
{
$data = [
'data' => $this->normalizeData($objectType, $data),
];
$this->client->updateRecordById($objectType, $objectId, $data);
}
private function normalizeData(string $objectType, array $data): array
{
$fieldMapper = $this->getFieldMapper($objectType);
if (! $fieldMapper instanceof FieldMapperInterface) {
return $data;
}
return $fieldMapper->mapToCrmFields($data);
}
private function getFieldMapper(string $objectType): ?FieldMapperInterface
{
if ($objectType === self::OBJECT_OPPORTUNITY) {
return app(OpportunityFieldMapper::class);
}
if ($objectType === self::OBJECT_LEAD) {
return app(LeadFieldMapper::class);
}
return null;
}
public function getRecord(string $objectType, string $objectId, array $fields = []): array
{
return $this->client->getRecordById($objectType, $objectId);
}
public function getConfiguration(): Configuration
{
return $this->config;
}
public function setConfiguration(Configuration $config): void
{
$this->clearExternalMapCache();
$this->config = $config;
}
private function setEditionConfiguration(string $provider): void
{
$this->editionConfig = app(IntegrationConfigFactory::class)->create($provider);
}
public function setCrmUrlGenerator(Configuration $config): void
{
$this->crmUrlGenerator = app(IntegrationAppCrmGeneratorFactory::class)->create($config);
}
public function getCrmUrlGenerator(): ?GenerateProviderUrlInterface
{
if ($this->crmUrlGenerator === null) {
$this->setCrmUrlGenerator($this->config);
}
return $this->crmUrlGenerator;
}
public function subscribeEntityEvents(bool $enableTrigger = true): void
{
$eventStates = $this->client->updateEntityEventsState($enableTrigger);
$this->logger->info('[integration-app] Change team entity events subscription', [
'teamId' => $this->team->getId(),
'teamName' => $this->team->getName(),
'states' => $eventStates,
'action' => $enableTrigger ? 'subscribe' : 'unsubscribe',
]);
}
#[\Override] public function supportsNotes(): bool
{
return $this->editionConfig->supportsNotes();
}
#[\Override] public function saveNote(
string $title,
string $body,
string $objectId,
?NoteObject $noteObject = null,
): ?string {
if ($noteObject === null) {
return null;
}
$notePayload = [
'title' => $title,
'content' => $body,
'objectId' => $objectId,
'objectType' => $noteObject->value,
];
$result = $this->client->createNote($notePayload);
// debug saving note response
$this->logger->info('[integration-app] createNote response', [
'objectId' => $objectId,
'objectType' => $noteObject->value,
'result' => $result,
'hasId' => isset($result['id']),
]);
return $result['id'] ?? null;
}
/**
* @throws CrmException
*/
#[\Override] public function saveActivity(Activity $activity): Activity
{
$this->logger->info('[integration-app] saveActivity', [
'activity' => $activity->getUuid(),
'type' => $activity->getType(),
]);
if ($activity->getCrmType() === Activity::TYPE_CONFERENCE) {
$crmActivity = $this->saveMeeting($activity);
} elseif (in_array($activity->getType(), [Activity::TYPE_SOFTPHONE, Activity::TYPE_SOFTPHONE_INBOUND])) {
$crmActivity = $this->saveCall($activity);
} else {
throw new CrmException('Unsupported activity type');
}
$crmActivityId = $crmActivity['id'] ?? null;
if ($crmActivityId !== null) {
$activity->crm_provider_id = $crmActivityId;
$activity->save();
$this->logger->info('[integration-app] Activity successfully logged to CRM', [
'activity' => $activity->getUuid(),
'type' => $activity->getType(),
'crmId' => $crmActivityId,
]);
}
return $activity;
}
public function saveMeeting(Activity $activity): array
{
$decorateActivity = app(DecorateActivity::class);
$meetingPayload = [
'Event_Title' => $decorateActivity->generateTitle($activity),
'Start_DateTime' => $activity->getActualStartTime()->toIso8601String(),
'End_DateTime' => $activity->getActualEndTime()->toIso8601String(),
'ownerId' => $this->getActivityOwnerId($activity),
];
$payload = array_merge($meetingPayload, $this->attachToProspect($activity));
if ($activity->hasCrmProviderId()) {
$crmId = $activity->getCrmProviderId();
$meeting = $this->client->getMeeting($crmId);
$oldDescription = $meeting['fields']['Description'] ?? null;
$payload['Description'] = $decorateActivity->generateUpdatedDescription($oldDescription, $activity);
$this->logger->info('[integration-app] CRM update meeting', [
'activity' => $activity->getUuid(),
'crm_id' => $crmId,
'payload' => $payload,
]);
return $this->client->updateMeeting($crmId, $payload);
}
$payload['Description'] = $decorateActivity->generateDescription($activity);
$this->logger->info('[integration-app] CRM log meeting', [
'activity' => $activity->getUuid(),
'payload' => $payload,
]);
return $this->client->createMeeting($payload);
}
public function saveCall(Activity $activity): array
{
$decorateActivity = app(DecorateActivity::class);
$callPayload = [
'Call_Type' => $this->getCallType($activity),
'Call_Start_Time' => $activity->getActualStartTime()->toIso8601String(),
'Call_Duration' => $activity->getDuration(),
'name' => $decorateActivity->generateTitle($activity),
'ownerId' => $this->getActivityOwnerId($activity),
];
$payload = array_merge($callPayload, $this->attachToProspect($activity));
if ($activity->hasCrmProviderId()) {
$crmId = $activity->getCrmProviderId();
$call = $this->client->getCall($crmId);
$oldDescription = $call['fields']['Description'] ?? null;
$payload['description'] = $decorateActivity->generateUpdatedDescription($oldDescription, $activity);
$this->logger->info('[integration-app] CRM update call', [
'activity' => $activity->getUuid(),
'crm_id' => $crmId,
'payload' => $payload,
]);
return $this->client->updateCall($crmId, $payload);
}
$payload['description'] = $decorateActivity->generateDescription($activity);
$this->logger->info('[integration-app] CRM log call', [
'activity' => $activity->getUuid(),
'payload' => $payload,
]);
return $this->client->createCall($payload);
}
private function getCallType(Activity $activity): string
{
if ($activity->getStatus() === Activity::STATUS_NO_ANSWER) {
return self::CALL_TYPE_MISSED;
}
return $activity->getType() === Activity::TYPE_SOFTPHONE_INBOUND ? self::CALL_TYPE_INBOUND : self::CALL_TYPE_OUTBOUND;
}
private function attachToProspect(Activity $activity): array
{
$payload = [];
if ($activity->hasContact()) {
$payload['contactId'] = $activity->getContact()->getCrmProviderId();
}
if ($activity->hasOpportunity()) {
return array_merge(
$payload,
$this->buildBasicPayload(
self::RELATIONSHIP_OPPORTUNITY,
$activity->getOpportunity()->getCrmProviderId()
)
);
}
if ($activity->hasAccount() && ! $activity->getAccount()->getIsInternal()) {
return array_merge(
$payload,
$this->buildBasicPayload(
self::RELATIONSHIP_ACCOUNT,
$activity->getAccount()->getCrmProviderId()
)
);
}
if ($activity->hasLead()) {
$payload = $this->handleLeadPayload($activity);
}
return $payload;
}
private function handleLeadPayload(Activity $activity): array
{
$freshLead = $this->syncLead($activity->getLead()->getCrmProviderId());
$lead = $freshLead ?? $activity->getLead();
if ($lead->getConvertedAt() === null) {
return $this->buildBasicPayload(self::RELATIONSHIP_LEAD, $lead->getCrmProviderId());
}
$activity->lead_id = null;
if ($lead->hasAccount()) {
$account = $lead->getAccount();
$activity->account_id = $account->getId();
$payload = $this->buildBasicPayload(self::RELATIONSHIP_ACCOUNT, $account->getCrmProviderId());
} else {
$payload = [];
}
if ($lead->hasOpportunity()) {
$opportunity = $lead->getOpportunity();
$payload = $this->buildBasicPayload(self::RELATIONSHIP_OPPORTUNITY, $opportunity->getCrmProviderId());
$activity->opportunity_id = $opportunity->getId();
$activity->value = $opportunity->value;
$activity->stage_id = $opportunity->stage_id;
} else {
$activity->stage_id = null;
}
if ($lead->hasContact()) {
$contact = $lead->getContact();
$payload['contactId'] = $contact->getCrmProviderId();
$activity->contact_id = $contact->getId();
}
$activity->save();
event(new ActivityLeadConverted($activity, $lead));
$this->logger->info('[integration-app] Lead converted', [
'activityUuid' => $activity->getUuid(),
'leadUuid' => $lead->getUuid(),
]);
return $payload;
}
private function buildBasicPayload(string $type, string $id): array
{
return [
'type' => $type,
'id' => $id,
];
}
private function getActivityOwnerId(Activity $activity): ?string
{
$ownerId = null;
if ($activity->hasUser() && $activity->getUser()->getProfile() !== null) {
$ownerId = $activity->getUser()->getProfile()->getCrmProviderId();
}
return $ownerId;
}
#[\Override] public function saveFollowupActivity(Activity $activity, array $fields): ?string
{
$taskPayload = [
'subject' => $fields['subject'],
'dueTime' => isset($fields['dueDate']) ? Carbon::parse($fields['dueDate'])->format('Y-m-d') : null,
'ownerId' => $this->getActivityOwnerId($activity),
];
if (isset($fields['status'])) {
$taskPayload['status'] = $fields['status'];
}
if (isset($fields['priority'])) {
$taskPayload['priority'] = $fields['priority'];
}
if (isset($fields['content'])) {
$taskPayload['content'] = $fields['content'];
}
$payload = array_merge($taskPayload, $this->attachToProspect($activity));
$this->logger->info('[integration-app] CRM log follow up task', [
'activity' => $activity->getUuid(),
'payload' => $payload,
]);
$task = $this->client->createTask($payload);
return $task['id'] ?? null;
}
#[\Override] public function saveTranscriptionSummaryAsNote(
ActivityContract $activity,
string $title,
string $body,
?string $objectId,
?NoteObject $noteObject = null,
): ?string {
// We have to find a way to store the transcription summary
// This might be possible either by Tasks, Events, Engagements & Notes
// Find what the CRM supports and save the note with the appropriate object(eg Notes)
// For now use only Notes as both ZOHO & Salesforce support them.
if ($this->supportsNotes() && $objectId !== null) {
$this->logger->info('[integration-app] saving note', [
'activityId' => $activity->getUuid(),
'objectId' => $objectId,
]);
return $this->saveNote($title, $body, $objectId, $noteObject);
}
$this->logger->info('[integration-app] skip saveTranscriptionSummaryAsNote', [
'activityId' => $activity->getUuid(),
'supportsNotes' => $this->supportsNotes(),
'objectId' => $objectId,
]);
return null;
}
public function generateProviderUrl(string $providerId, string $objectType): ?string
{
return $this->getCrmUrlGenerator()?->generateProviderUrl($providerId, $objectType);
}
public function updateStage($crmObject, Stage $stage): void
{
$objectType = $stage->getType();
$objectId = $crmObject->getCrmProviderId();
$params = ['stageName' => $stage->getCrmProviderId()];
$this->logger->info('[integration-app] updateStage', [
'objectType' => $objectType,
'objectId' => $objectId,
'params' => $params,
]);
$data = [
'data' => $this->normalizeData($objectType, $params),
];
if ($objectType === Stage::TYPE_LEAD) {
$this->client->updateLead($objectId, $data);
} else {
$this->client->updateDeal($objectId, $data);
}
}
/**
* @throws \Exception
*/
public function fetchAndAssociateRelatedActivity(Activity $activity): ?Activity
{
if ($activity->getCrm()?->getEdition() !== IntegrationAppProviders::ZOHO_CRM) {
return null;
}
if (! $activity->isTypeConference()) {
return null;
}
// The related activity is already linked.
if ($activity->hasCrmProviderId()) {
return $activity;
}
if ($activity->hasActualStartTime() === false) {
return null;
}
return $this->fetchAndAssociateZohoRelatedActivity($activity);
}
public function fetchAndAssociateZohoRelatedActivity(Activity $activity): ?Activity
{
try {
$meeting = $this->fetchRelatedZohoActivity($activity);
if (empty($meeting)) {
$this->logger->info('[integration-app] fetchRelatedZohoActivity No related activity found', [
'activity' => $activity->getUuid(),
]);
return null;
}
$decorateActivity = app(DecorateActivity::class);
$oldDescription = $meeting['Description'] ?? '';
$updatedDescription = $decorateActivity->generateUpdatedDescription($oldDescription, $activity);
$this->logger->info('[integration-app] fetchAndAssociateZohoRelatedActivity updating related activity', [
'activity' => $activity->getUuid(),
'description' => $updatedDescription,
]);
$this->client->updateMeeting($meeting['id'], ['Description' => $updatedDescription]);
// Update our activity to reflect the remote data.
$activity->update([
'crm_provider_id' => $meeting['id'],
'summary' => $meeting['Description'],
]);
return $activity;
} catch (\Exception $exception) {
\Sentry::captureException($exception);
throw $exception;
}
}
public function fetchRelatedZohoActivity(Activity $activity): array
{
[$from, $to] = $this->getFromToDates($activity);
$start = $from?->toIso8601String(); // e.g., 2025-07-01T00:00:00+00:00
$end = $to?->toIso8601String(); // e.g., 2025-07-14T23:59:59+00:00
if ($start === null || $end === null) {
$this->logger->info(
'[integration-app] fetchRelatedZohoActivity missing start or end date',
[
'activity' => $activity->getUuid(),
'start' => $start,
'end' => $end,
'from' => $from,
'to' => $to,
]
);
return [];
}
$whoId = null;
$whatId = null;
$criteriaParts = [];
if ($activity->getContact()) {
$whoId = $activity->getContact()->getCrmProviderId();
$criteriaParts[] = "(Who_Id:equals:$whoId)";
}
if ($activity->getOpportunity()) {
$whatId = $activity->getOpportunity()->getCrmProviderId();
} elseif ($activity->getAccount() && $activity->getAccount()->getIsInternal() === false) {
$whatId = $activity->getAccount()->getCrmProviderId();
} elseif ($activity->getLead()) {
$whatId = $activity->getLead()->getCrmProviderId();
}
if ($whatId !== null) {
$criteriaParts[] = "(What_Id:equals:$whatId)";
}
if ($whoId === null && $whatId === null) {
$this->logger->info(
'[integration-app] fetchRelatedZohoActivity cannot find prospect',
[
'activity' => $activity->getUuid(),
]
);
return [];
}
$criteriaParts[] = "(Start_DateTime:greater_equal:$start)";
$criteriaParts[] = "(End_DateTime:less_equal:$end)";
$criteria = implode(' AND ', $criteriaParts);
$params = [
'criteria' => $criteria,
'sort_by' => 'Modified_Time',
'sort_order' => 'desc',
];
$this->logger->info(
'[integration-app] fetchRelatedZohoActivity searching for related activity',
[
'activity' => $activity->getUuid(),
'params' => $params,
]
);
$meetings = $this->client->searchMeetings($params);
if (! empty($meetings)) {
return $meetings[0];
}
return [];
}
private function getFromToDates(Activity $activity): array
{
$calendarEvent = $activity->calendarEvent()->first();
$from = $calendarEvent?->getStartTime();
$to = $calendarEvent?->getEndTime();
if (! $from || ! $to) {
$from = $activity->hasScheduledStartTime()
? $activity->getScheduledStartTime()
: $activity->getActualStartTime();
$to = $activity->hasScheduledEndTime()
? $activity->getScheduledEndTime()->addMinutes(15)
: $activity->getActualEndTime();
}
return [$from, $to];
}
}
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
8
1
3
4
Previous Highlighted Error
Next Highlighted Error
SELECT
# DISTINCT
opp.id as opp_id, opp.uuid, opp.name,
# COUNT(dr.id) AS deal_risk_count,
# dr.id,
# cfd.value,
usr.name AS owner_name,
opp.value, opp.currency_code, opp.close_date, opp.remotely_created_at, opp.is_closed, opp.is_won,
usr.uuid as owner_uuid,
usr.photo_path as owner_photo,
usr.id AS owner_id,
jt.name as owner_job,
opp.stage_id, opp.stage_updated_at,
acc.name AS acc_name, opp.stage_updated_at, acc.crm_provider_id AS acc_provider_id, opp.crm_provider_id AS opp_provider_id,
rt.business_process_id AS pipeline_id
FROM opportunities opp
LEFT JOIN record_types rt ON opp.record_type_id = rt.id
LEFT JOIN users usr ON opp.user_id = usr.id
LEFT JOIN accounts acc ON opp.account_id = acc.id
LEFT JOIN job_titles jt ON usr.job_title_id = jt.id
# LEFT JOIN group_deal_risk_types gdrt ON gdrt.group_id = usr.group_id
# LEFT JOIN deal_risks dr ON dr.opportunity_id = opp.id AND dr.group_deal_risk_type_id = gdrt.id
LEFT JOIN crm_field_data cfd ON (cfd.object_id = opp.id and cfd.crm_field_id = 66814)
WHERE opp.user_id IS NOT NULL
AND opp.deleted_at IS NULL
AND opp.is_closed = 1
AND opp.is_won = 0
AND opp.close_date >= '2024-01-01 00:00:00'
AND opp.close_date <= '2024-12-31 23:59:59'
AND usr.team_id = 1
# and opp.id = 4823179
GROUP BY opp.id, cfd.value
ORDER BY
# cfd.value
CAST(cfd.value AS UNSIGNED)
# owner_name
# (SELECT COUNT(dr.id)
# FROM deal_risks dr
# JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id
# WHERE dr.opportunity_id = opp.id
# AND dr.is_active = 1
# AND gdrt.is_enabled = 1)
DESC
LIMIT 25
# OFFSET 0
;
select * from crm_fields where crm_configuration_id = 1 and object_type = 'opportunity';
select * from crm_layout_entities where crm_layout_id = 1493;
SELECT * FROM opportunities WHERE id = 4584045;
SELECT * FROM crm_field_data WHERE object_id = 4584045;
SELECT * FROM opportunities where team_id = 1 and crm_provider_id = '0061K00000lfb9IQAQ'
SELECT
opp.id as opportunity_id,
opp.name,
COUNT(dr.id) as risk_count
FROM opportunities opp
LEFT JOIN deal_risks dr ON dr.opportunity_id = opp.id
WHERE opp.id IN (
6069574,8900938,9507638,9524799,9660490,9662824,9705675,9749758,4158460,4391812,6450439,4448422,5118945,5590675,4584045,7228149,9002408,9165534,9446720,9641778,9665149,9703344,9709280,5747948,4158491,6182565,6263970,5798120,5111315,4536978,6062352,6548383,6072095,6548225,4480986,5011422,6548381,8760540,8917554,9509986,9514392,9569009,9569011,9578490,9713604,5784397,7276612,7288405,8994421,9118219,9608148,9818911,4510535,6479693,5958049,6271674,6550448,4158331,4158483,6126571,6171615,6540943,4897466,5190896,5796182,5932762,8572433,8723698,8892697,9711001,9789264,4549188,6100831,6170064,6260799,6263653,6449936,6530871,6538978,7777651,8059269,8319918,8787049,8901150,9263153,9453207,9514738,9696700,9791062,5752018,6421452,7439134,7878923,9354763,9369285,9514396,9582506,9889949,9890216,4094311,4158495,4158496,6098128,5585661,3872564,6442149,5891604,6164746,6199593,6583474,6519684,9018490,9809006,4496897,5041324,5829430,6198319,6253504,6555763,7242914,7931055,8024125,8797814,8058559,8673347,8892695,8994420,9616219,9714970,9722004,9809439,9818918,6523177,8134147,9002915,9711422,9892713,9901719,9954210,9978435,5800810,6243518,6416114,6222251,6411974,6512456,5791953,6545606,9914780,5805540,6238986,6463838,6547680,9767049,9809437,9810885,9890855,6673493,9902036,4335521,6379871,6503799,6546077,8018765,9907556,9958433,9905855,9916179,9946741,9957877,5563344,6271838,6450815,7641128,7762567,7780592,8684810,8685786,8685787,8685788
)
GROUP BY opp.id;
SELECT COUNT(dr.id)
FROM deal_risks dr
JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id
WHERE dr.opportunity_id = 5563344
# AND gdrt.group_id = usr.group_id
EXPLAIN SELECT
opp.id as opp_id, opp.uuid, opp.name,
cfd.value,
cfv.sequence,
cfv.value,
# MAX(cfd.value) AS max_cfd_value,
usr.name AS owner_name,
opp.value, opp.currency_code, opp.close_date, opp.remotely_created_at, opp.is_closed, opp.is_won,
usr.uuid as owner_uuid,
usr.photo_path as owner_photo,
usr.id AS owner_id,
jt.name as owner_job,
opp.stage_id, opp.stage_updated_at,
acc.name AS acc_name, opp.stage_updated_at, acc.crm_provider_id AS acc_provider_id, opp.crm_provider_id AS opp_provider_id,
rt.business_process_id AS pipeline_id
FROM opportunities opp
LEFT JOIN record_types rt ON opp.record_type_id = rt.id
LEFT JOIN users usr ON opp.user_id = usr.id
LEFT JOIN accounts acc ON opp.account_id = acc.id
LEFT JOIN job_titles jt ON usr.job_title_id = jt.id
LEFT JOIN crm_field_data cfd ON cfd.id = (SELECT sub_cfd.id
FROM crm_field_data sub_cfd
WHERE sub_cfd.object_id = opp.id
AND sub_cfd.crm_field_id = 66810
ORDER BY sub_cfd.updated_at DESC
LIMIT 1)
LEFT JOIN crm_field_values cfv ON cfv.crm_field_id = 66810 AND cfv.value = cfd.value
WHERE opp.user_id IS NOT NULL
AND opp.deleted_at IS NULL
AND opp.is_closed = 0
# AND opp.is_closed = 1
# AND opp.is_won = 0
AND opp.close_date >= '2024-01-01 00:00:00'
AND opp.close_date <= '2024-12-31 23:59:59'
AND usr.team_id = 1
# and opp.id = 4823179
# GROUP BY opp.id
ORDER BY
cfv.sequence DESC,
# opp.name
# owner_name
cfd.value
# CAST(cfd.value AS UNSIGNED)
# CAST(MAX(cfd.value) AS UNSIGNED)
# (SELECT COUNT(dr.id)
# FROM deal_risks dr
# JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id
# WHERE dr.opportunity_id = opp.id
# AND dr.is_active = 1 AND gdrt.is_enabled = 1)
DESC
# LIMIT 75, 25
;
SELECT * FROM crm_field_values WHERE crm_field_id = 66810;
SELECT f.id, f.crm_provider_id AS field_name, f.label, fd.object_id AS dealId, fd.value, fd.updated_at, fd.id, fd.created_at
FROM crm_fields f
INNER JOIN crm_field_data fd ON fd.crm_field_id = f.id
WHERE (f.crm_configuration_id = 1)
AND (f.object_type = 'opportunity')
# AND (fd.object_id IN (4158331,4158483,4158495,4158496,6069574,6263970,6171615,6540943,6545606,5829430,6198319,6263653,6548381,7242914,8797814,7228149,7439134,7878923,8134147,9002915,9118219,9165534,9354763,9369285,9446720))
AND (fd.object_id IN (4158460))
AND (f.crm_provider_id IN ('ForecastCategoryName'))
ORDER BY fd.object_id ASC, fd.updated_at DESC;
select * from crm_layouts where crm_configuration_id = 1;
select cf.* from crm_fields cf
join crm_layout_entities cle on cf.id = cle.crm_field_id
where crm_layout_id = 1493;
SELECT * FROM opportunities WHERE id = 4158460;
SELECT * FROM crm_field_data WHERE object_id = 4158460;
select * from users where team_id = 1;
SELECT * FROM users WHERE id = 7160;
select * from role_user where user_id = 3248;
select * from crm_field_values where crm_field_id = 66824;
SELECT * FROM users WHERE id = 23470;
select * from crm_configurations;
# [PASSWORD_DOTS]
select * from teams where id = 1038; # 23521, 966
select * from users where team_id = 1038;
select * from crm_configurations where id = 966;
SELECT * FROM activities WHERE uuid_to_bin('e8dc7c34-31f6-4430-bd81-2d9d8f00dd07') = uuid; # 54965762
SELECT * FROM activities WHERE uuid_to_bin('4b5727c0-69d1-428f-b8d9-b649055166e2') = uuid; # 54965764
SELECT * FROM participants WHERE activity_id = 54965764;
SELECT id, uuid, title, recording_state FROM activities WHERE uuid_to_bin('355f105d-5606-4379-b0c5-d91daf59f4ce') = uuid; # 54964075
SELECT * FROM participants WHERE activity_id = 54964075;
select f.id, slug, title, tf.team_id from team_features tf JOIN features f on tf.feature_id = f.id
where tf.team_id = 1038;
# [PASSWORD_DOTS] PD [PASSWORD_DOTS]
select * from teams where id = 1029;
SELECT * FROM crm_configurations WHERE id = 957;
SELECT * FROM activities WHERE uuid_to_bin('581a33cb-4343-44bd-ac0c-4a5cee71c5ec') = uuid; # 54963423
SELECT * FROM activities WHERE uuid_to_bin('07238011-25fa-418e-838b-fb21e82b9ea2') = uuid; # 54963433
SELECT * FROM activities WHERE uuid_to_bin('8b6bb2f7-e7a7-4aec-8806-fbfea7093ccd') = uuid; # 54963421
# [PASSWORD_DOTS] Close [PASSWORD_DOTS]
select * from teams where id = 1031;
SELECT * FROM crm_configurations WHERE id = 959;
SELECT * FROM activities WHERE uuid_to_bin('59c517e0-96c9-4dad-bfeb-b7bef72f8725') = uuid; # 54963517
SELECT * FROM activities WHERE uuid_to_bin('07238011-25fa-418e-838b-fb21e82b9ea2') = uuid; # 54963433
SELECT * FROM activities WHERE uuid_to_bin('d68311e3-ac34-49bd-bf04-88323a7e5352') = uuid; # 54966009
# [PASSWORD_DOTS] SF [PASSWORD_DOTS]
SELECT * FROM activities WHERE uuid_to_bin('2bd4cfa3-4eb5-4c77-84a7-9ed46a21c988') = uuid;
select * from roles;
select * from permissions;
select * from permission_role where permission_id = 136;
select * from migrations order by id desc;
select * from teams where id IN (1, 1037);
select * from crm_layouts where crm_configuration_id = 1;
SELECT * FROM crm_layout_entities WHERE crm_layout_id = 1493;
SELECT * FROM crm_fields WHERE id IN (1652,1661,66799,66814,66821,66836,66843,66846,66864,84752,182306,323580,380378);
select * from features;
select * from team_features where feature_id = 33;
select * from opportunities;
select * from teams;
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 = 1052 and sa.provider = 'hubspot';
SELECT * FROM accounts where id = 11512582;
select * from activities where account_id = 11512582;
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"bounds":{"left":0.054166667,"top":0.027777778,"width":0.08055556,"height":0.035555556},"on_screen":true,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"#12066 on JY-20725-handle-HS-search-rate-limit, menu","depth":5,"bounds":{"left":0.13472222,"top":0.027777778,"width":0.25555557,"height":0.035555556},"on_screen":true,"help_text":"Pull request #12066 exists for current branch JY-20725-handle-HS-search-rate-limit, but local branch is out of sync with remote","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"bounds":{"left":0.6326389,"top":0.027777778,"width":0.023611112,"height":0.035555556},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"HandleHubspotRateLimitTest","depth":6,"bounds":{"left":0.6645833,"top":0.027777778,"width":0.15902779,"height":0.035555556},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run 'HandleHubspotRateLimitTest'","depth":6,"bounds":{"left":0.82361114,"top":0.027777778,"width":0.023611112,"height":0.035555556},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'HandleHubspotRateLimitTest'","depth":6,"bounds":{"left":0.8472222,"top":0.027777778,"width":0.023611112,"height":0.035555556},"on_screen":true,"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.87083334,"top":0.027777778,"width":0.023611112,"height":0.035555556},"on_screen":true,"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.9291667,"top":0.027777778,"width":0.023611112,"height":0.035555556},"on_screen":true,"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.9527778,"top":0.027777778,"width":0.023611112,"height":0.035555556},"on_screen":true,"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.9763889,"top":0.027777778,"width":0.023611112,"height":0.035555556},"on_screen":true,"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},"on_screen":false,"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},"on_screen":false,"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},"on_screen":false,"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},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"16","depth":4,"bounds":{"left":0.77708334,"top":0.3122222,"width":0.02013889,"height":0.02111111},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"2","depth":4,"bounds":{"left":0.80138886,"top":0.3122222,"width":0.016666668,"height":0.02111111},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.8215278,"top":0.31,"width":0.015277778,"height":0.025555555},"on_screen":true,"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.8368056,"top":0.31,"width":0.014583333,"height":0.025555555},"on_screen":true,"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\\IntegrationApp;\n\nuse Carbon\\Carbon;\nuse Jiminny\\Contracts\\Crm\\Providers;\nuse Jiminny\\Contracts\\Services\\Crm\\ClientInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\FetchRelatedActivityInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\ImportsBusinessProcessesInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\LayoutManagementInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\MatchCrmEntitiesInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\Provider\\IntegrationAppInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\RemoteEntityLookupInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\RemoteEntityManipulationInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\RemoteNoteEntityManipulationInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\SendSummaryToCrmInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\SettingsInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\SyncCrmEntitiesInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\SyncCrmMetadataInterface;\nuse Jiminny\\Events\\Activities\\Crm\\ActivityLeadConverted;\nuse Jiminny\\Exceptions\\CrmException;\nuse Jiminny\\Exceptions\\SocialAccountNotFoundException;\nuse Jiminny\\Jobs\\Crm\\NoteObject;\nuse Jiminny\\Models\\Account;\nuse Jiminny\\Models\\Activity;\nuse Jiminny\\Models\\Contracts\\ActivityContract;\nuse Jiminny\\Models\\Crm\\Configuration;\nuse Jiminny\\Models\\Opportunity;\nuse Jiminny\\Models\\Stage;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Services\\Crm\\BaseService;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\Config\\IntegrationAppProviders;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\Config\\IntegrationConfigFactory;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\DTO\\Mappers\\FieldMapperInterface;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\DTO\\Mappers\\LeadFieldMapper;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\DTO\\Utils\\GenerateProviderUrlInterface;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\DTO\\Utils\\IntegrationAppCrmGeneratorFactory;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\DTO\\Utils\\UrlGeneratorInterface;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\ServiceTraits\\SyncCrmFieldsTrait;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\ServiceTraits\\SystemStateTrait;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\ServiceTraits\\LayoutTrait;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\ServiceTraits\\MatchProspectsTrait;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\ServiceTraits\\NotSupportedTrait;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\ServiceTraits\\SyncCrmEntitiesTrait;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\ServiceTraits\\SyncCrmMetadataTrait;\nuse Psr\\Log\\LoggerInterface;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\DTO\\Mappers\\OpportunityFieldMapper;\nuse Jiminny\\Repositories\\Crm\\ProfileRepository;\nuse Jiminny\\Repositories\\Crm\\OpportunityRepository;\nuse Jiminny\\Models\\Crm\\Profile;\nuse Jiminny\\Services\\Crm\\CrmObjects\\CrmObjectsRepository;\n\nclass Service extends BaseService implements\n IntegrationAppInterface,\n SyncCrmEntitiesInterface,\n SyncCrmMetadataInterface,\n ImportsBusinessProcessesInterface,\n RemoteEntityManipulationInterface,\n LayoutManagementInterface,\n SettingsInterface,\n MatchCrmEntitiesInterface,\n RemoteEntityLookupInterface,\n RemoteNoteEntityManipulationInterface,\n SendSummaryToCrmInterface,\n UrlGeneratorInterface,\n FetchRelatedActivityInterface\n{\n use SyncCrmMetadataTrait;\n use SyncCrmEntitiesTrait;\n use SystemStateTrait;\n use LayoutTrait;\n use NotSupportedTrait;\n use MatchProspectsTrait;\n use SyncCrmFieldsTrait;\n\n public const string CALL_TYPE_MISSED = 'Missed';\n public const string CALL_TYPE_INBOUND = 'Inbound';\n public const string CALL_TYPE_OUTBOUND = 'Outbound';\n public const string RELATIONSHIP_OPPORTUNITY = 'Deals';\n public const string RELATIONSHIP_LEAD = 'Leads';\n public const string RELATIONSHIP_ACCOUNT = 'Accounts';\n\n /**\n * @var ClientInterface&DataClient\n */\n protected $client;\n\n protected ?User $invokedUser = null;\n\n protected ?GenerateProviderUrlInterface $crmUrlGenerator = null;\n\n public function __construct(\n DataClient $client,\n LoggerInterface $logger,\n ) {\n parent::__construct();\n $this->client = $client;\n $this->logger = $logger;\n }\n\n public function getDisplayName(): string\n {\n return Providers::getProviderDisplayName(\n Providers::getCrmIntegrationSlug($this->config)\n );\n }\n\n /**\n * @throws \\Exception\n */\n public function setUser(User $user): void\n {\n $this->configureSentryScope($user);\n $this->invokedUser = $user;\n\n $this->team = $user->getTeam();\n $teamOwner = $this->team->getOwner();\n\n $this->setConfiguration($user->getTeam()->getCrmConfiguration());\n $this->setEditionConfiguration(Providers::getCrmIntegrationSlug($this->config));\n $this->setCrmUrlGenerator($this->config);\n\n $this->client->setTeam($this->team);\n $socialAccount = $teamOwner?->getSocialAccount('integration-app');\n if ($socialAccount === null) {\n $this->logger->info('[integration-app] Social account not found', [\n 'teamId' => $this->team->getId(),\n 'teamOwnerId' => $teamOwner?->getId(),\n 'userId' => $user->getId(),\n ]);\n\n throw new SocialAccountNotFoundException('Social account not found!');\n }\n $this->client->setSocialAccount($socialAccount);\n\n // The CRM Service is properly bootstrapped, and supports remote operations\n $this->connect();\n }\n\n public function normalizeValue(string $fieldType, string $fieldValue, bool $internal = false): string\n {\n return $fieldValue;\n }\n\n public function find(string $name, array $scopes): array\n {\n /** @var LocalSearch $localSearch */\n $localSearch = app(LocalSearch::class);\n $localSearch->setConfiguration($this->config);\n $localSearch->setCountryCode($this->invokedUser->getCountryCode());\n\n return $localSearch->search($name);\n\n // if (! empty($localMatch)) {\n // return $localMatch;\n // }\n //\n // /** @var RemoteSearch $remoteSearch */\n // $remoteSearch = app(RemoteSearch::class);\n // $remoteSearch->setClient($this->client);\n // $remoteSearch->setConfiguration($this->config);\n //\n // return $remoteSearch->search($name);\n }\n\n public function findOpportunities(?string $crmAccountId, ?string $crmContactId, ?int $userId = null): array\n {\n $data = [];\n $ownerData = [];\n\n $account = $this->getAccount($crmAccountId, $crmContactId);\n if ($account === null) {\n return [];\n }\n\n $ownerId = $this->getOwnerId($userId);\n\n try {\n $opportunityRepository = app(OpportunityRepository::class);\n $opportunities = $opportunityRepository->findAllByConfigurationAndAccountId(\n $this->config,\n $account->getId()\n );\n\n foreach ($opportunities as $opportunity) {\n /** @var Opportunity $opportunity */\n $record = $this->buildOpportunityData($opportunity);\n\n if ($ownerId && $opportunity->getOwnerId() === $ownerId) {\n $ownerData[] = $record;\n }\n\n $data[] = $record;\n }\n\n if (! empty($ownerData)) {\n return $ownerData;\n }\n\n return $data;\n } catch (\\Exception $e) {\n $this->logger->info('[integration-app] Failed to fetch opportunities', [\n 'contact' => $crmContactId,\n 'account' => $crmAccountId,\n 'owner' => $ownerId,\n 'error' => $e->getMessage(),\n ]);\n\n return $data;\n }\n }\n\n private function getOwnerId(?int $userId = null): ?string\n {\n if (! $userId) {\n return null;\n }\n\n $profileRepository = app(ProfileRepository::class);\n $profile = $profileRepository->findProfileByUserId($this->config, $userId);\n\n return $profile instanceof Profile ? $profile->getCrmProviderId() : null;\n }\n\n private function getAccount(?string $crmAccountId = null, ?string $crmContactId = null): ?Account\n {\n $crmRepository = app(CrmObjectsRepository::class);\n\n if ($crmAccountId === null) {\n $contact = $crmRepository->findContactByCrmProviderId($this->config, $crmContactId);\n\n return $contact->getAccount();\n }\n\n return $crmRepository->findAccountByCrmProviderId($this->config, $crmAccountId);\n }\n\n private function buildOpportunityData(Opportunity $opportunity): array\n {\n $record = [\n 'crmId' => $opportunity->getCrmProviderId(),\n 'name' => $opportunity->getName(),\n 'won' => $opportunity->isWon(),\n 'closed' => $opportunity->isClosed(),\n ];\n\n if (! empty($opportunity->getFormattedValueAttribute())) {\n $record['value'] = $opportunity->getFormattedValueAttribute();\n }\n\n if (! empty($opportunity->getStage())) {\n $record['stage'] = [\n 'id' => $opportunity->getStage()->getUuid(),\n 'name' => $opportunity->getStage()->getName(),\n ];\n }\n\n return $record;\n }\n\n public function updateRecord(string $objectType, string $objectId, array $data, array $headers = []): void\n {\n $data = [\n 'data' => $this->normalizeData($objectType, $data),\n ];\n\n $this->client->updateRecordById($objectType, $objectId, $data);\n }\n\n private function normalizeData(string $objectType, array $data): array\n {\n $fieldMapper = $this->getFieldMapper($objectType);\n\n if (! $fieldMapper instanceof FieldMapperInterface) {\n return $data;\n }\n\n return $fieldMapper->mapToCrmFields($data);\n }\n\n private function getFieldMapper(string $objectType): ?FieldMapperInterface\n {\n if ($objectType === self::OBJECT_OPPORTUNITY) {\n return app(OpportunityFieldMapper::class);\n }\n\n if ($objectType === self::OBJECT_LEAD) {\n return app(LeadFieldMapper::class);\n }\n\n return null;\n }\n\n public function getRecord(string $objectType, string $objectId, array $fields = []): array\n {\n return $this->client->getRecordById($objectType, $objectId);\n }\n\n public function getConfiguration(): Configuration\n {\n return $this->config;\n }\n\n public function setConfiguration(Configuration $config): void\n {\n $this->clearExternalMapCache();\n\n $this->config = $config;\n }\n\n private function setEditionConfiguration(string $provider): void\n {\n $this->editionConfig = app(IntegrationConfigFactory::class)->create($provider);\n }\n\n public function setCrmUrlGenerator(Configuration $config): void\n {\n $this->crmUrlGenerator = app(IntegrationAppCrmGeneratorFactory::class)->create($config);\n }\n\n public function getCrmUrlGenerator(): ?GenerateProviderUrlInterface\n {\n if ($this->crmUrlGenerator === null) {\n $this->setCrmUrlGenerator($this->config);\n }\n\n return $this->crmUrlGenerator;\n }\n\n public function subscribeEntityEvents(bool $enableTrigger = true): void\n {\n $eventStates = $this->client->updateEntityEventsState($enableTrigger);\n\n $this->logger->info('[integration-app] Change team entity events subscription', [\n 'teamId' => $this->team->getId(),\n 'teamName' => $this->team->getName(),\n 'states' => $eventStates,\n 'action' => $enableTrigger ? 'subscribe' : 'unsubscribe',\n ]);\n }\n\n #[\\Override] public function supportsNotes(): bool\n {\n return $this->editionConfig->supportsNotes();\n }\n\n #[\\Override] public function saveNote(\n string $title,\n string $body,\n string $objectId,\n ?NoteObject $noteObject = null,\n ): ?string {\n if ($noteObject === null) {\n return null;\n }\n\n $notePayload = [\n 'title' => $title,\n 'content' => $body,\n 'objectId' => $objectId,\n 'objectType' => $noteObject->value,\n ];\n\n $result = $this->client->createNote($notePayload);\n\n // debug saving note response\n $this->logger->info('[integration-app] createNote response', [\n 'objectId' => $objectId,\n 'objectType' => $noteObject->value,\n 'result' => $result,\n 'hasId' => isset($result['id']),\n ]);\n\n return $result['id'] ?? null;\n }\n\n /**\n * @throws CrmException\n */\n #[\\Override] public function saveActivity(Activity $activity): Activity\n {\n $this->logger->info('[integration-app] saveActivity', [\n 'activity' => $activity->getUuid(),\n 'type' => $activity->getType(),\n ]);\n\n if ($activity->getCrmType() === Activity::TYPE_CONFERENCE) {\n $crmActivity = $this->saveMeeting($activity);\n } elseif (in_array($activity->getType(), [Activity::TYPE_SOFTPHONE, Activity::TYPE_SOFTPHONE_INBOUND])) {\n $crmActivity = $this->saveCall($activity);\n } else {\n throw new CrmException('Unsupported activity type');\n }\n\n $crmActivityId = $crmActivity['id'] ?? null;\n\n if ($crmActivityId !== null) {\n $activity->crm_provider_id = $crmActivityId;\n $activity->save();\n\n $this->logger->info('[integration-app] Activity successfully logged to CRM', [\n 'activity' => $activity->getUuid(),\n 'type' => $activity->getType(),\n 'crmId' => $crmActivityId,\n ]);\n }\n\n return $activity;\n }\n\n public function saveMeeting(Activity $activity): array\n {\n $decorateActivity = app(DecorateActivity::class);\n\n $meetingPayload = [\n 'Event_Title' => $decorateActivity->generateTitle($activity),\n 'Start_DateTime' => $activity->getActualStartTime()->toIso8601String(),\n 'End_DateTime' => $activity->getActualEndTime()->toIso8601String(),\n 'ownerId' => $this->getActivityOwnerId($activity),\n ];\n\n $payload = array_merge($meetingPayload, $this->attachToProspect($activity));\n\n if ($activity->hasCrmProviderId()) {\n $crmId = $activity->getCrmProviderId();\n $meeting = $this->client->getMeeting($crmId);\n\n $oldDescription = $meeting['fields']['Description'] ?? null;\n $payload['Description'] = $decorateActivity->generateUpdatedDescription($oldDescription, $activity);\n\n $this->logger->info('[integration-app] CRM update meeting', [\n 'activity' => $activity->getUuid(),\n 'crm_id' => $crmId,\n 'payload' => $payload,\n ]);\n\n return $this->client->updateMeeting($crmId, $payload);\n }\n\n $payload['Description'] = $decorateActivity->generateDescription($activity);\n\n $this->logger->info('[integration-app] CRM log meeting', [\n 'activity' => $activity->getUuid(),\n 'payload' => $payload,\n ]);\n\n return $this->client->createMeeting($payload);\n }\n\n public function saveCall(Activity $activity): array\n {\n $decorateActivity = app(DecorateActivity::class);\n\n $callPayload = [\n 'Call_Type' => $this->getCallType($activity),\n 'Call_Start_Time' => $activity->getActualStartTime()->toIso8601String(),\n 'Call_Duration' => $activity->getDuration(),\n 'name' => $decorateActivity->generateTitle($activity),\n 'ownerId' => $this->getActivityOwnerId($activity),\n ];\n\n $payload = array_merge($callPayload, $this->attachToProspect($activity));\n\n if ($activity->hasCrmProviderId()) {\n $crmId = $activity->getCrmProviderId();\n $call = $this->client->getCall($crmId);\n\n $oldDescription = $call['fields']['Description'] ?? null;\n $payload['description'] = $decorateActivity->generateUpdatedDescription($oldDescription, $activity);\n\n $this->logger->info('[integration-app] CRM update call', [\n 'activity' => $activity->getUuid(),\n 'crm_id' => $crmId,\n 'payload' => $payload,\n ]);\n\n return $this->client->updateCall($crmId, $payload);\n }\n\n $payload['description'] = $decorateActivity->generateDescription($activity);\n\n $this->logger->info('[integration-app] CRM log call', [\n 'activity' => $activity->getUuid(),\n 'payload' => $payload,\n ]);\n\n return $this->client->createCall($payload);\n }\n\n private function getCallType(Activity $activity): string\n {\n if ($activity->getStatus() === Activity::STATUS_NO_ANSWER) {\n return self::CALL_TYPE_MISSED;\n }\n\n return $activity->getType() === Activity::TYPE_SOFTPHONE_INBOUND ? self::CALL_TYPE_INBOUND : self::CALL_TYPE_OUTBOUND;\n }\n\n private function attachToProspect(Activity $activity): array\n {\n $payload = [];\n\n if ($activity->hasContact()) {\n $payload['contactId'] = $activity->getContact()->getCrmProviderId();\n }\n\n if ($activity->hasOpportunity()) {\n return array_merge(\n $payload,\n $this->buildBasicPayload(\n self::RELATIONSHIP_OPPORTUNITY,\n $activity->getOpportunity()->getCrmProviderId()\n )\n );\n }\n\n if ($activity->hasAccount() && ! $activity->getAccount()->getIsInternal()) {\n return array_merge(\n $payload,\n $this->buildBasicPayload(\n self::RELATIONSHIP_ACCOUNT,\n $activity->getAccount()->getCrmProviderId()\n )\n );\n }\n\n if ($activity->hasLead()) {\n $payload = $this->handleLeadPayload($activity);\n }\n\n return $payload;\n }\n\n private function handleLeadPayload(Activity $activity): array\n {\n $freshLead = $this->syncLead($activity->getLead()->getCrmProviderId());\n $lead = $freshLead ?? $activity->getLead();\n\n if ($lead->getConvertedAt() === null) {\n return $this->buildBasicPayload(self::RELATIONSHIP_LEAD, $lead->getCrmProviderId());\n }\n\n $activity->lead_id = null;\n\n if ($lead->hasAccount()) {\n $account = $lead->getAccount();\n $activity->account_id = $account->getId();\n $payload = $this->buildBasicPayload(self::RELATIONSHIP_ACCOUNT, $account->getCrmProviderId());\n } else {\n $payload = [];\n }\n\n if ($lead->hasOpportunity()) {\n $opportunity = $lead->getOpportunity();\n $payload = $this->buildBasicPayload(self::RELATIONSHIP_OPPORTUNITY, $opportunity->getCrmProviderId());\n $activity->opportunity_id = $opportunity->getId();\n $activity->value = $opportunity->value;\n $activity->stage_id = $opportunity->stage_id;\n } else {\n $activity->stage_id = null;\n }\n\n if ($lead->hasContact()) {\n $contact = $lead->getContact();\n $payload['contactId'] = $contact->getCrmProviderId();\n $activity->contact_id = $contact->getId();\n }\n\n $activity->save();\n event(new ActivityLeadConverted($activity, $lead));\n\n $this->logger->info('[integration-app] Lead converted', [\n 'activityUuid' => $activity->getUuid(),\n 'leadUuid' => $lead->getUuid(),\n ]);\n\n return $payload;\n }\n\n private function buildBasicPayload(string $type, string $id): array\n {\n return [\n 'type' => $type,\n 'id' => $id,\n ];\n }\n private function getActivityOwnerId(Activity $activity): ?string\n {\n $ownerId = null;\n if ($activity->hasUser() && $activity->getUser()->getProfile() !== null) {\n $ownerId = $activity->getUser()->getProfile()->getCrmProviderId();\n }\n\n return $ownerId;\n }\n\n #[\\Override] public function saveFollowupActivity(Activity $activity, array $fields): ?string\n {\n $taskPayload = [\n 'subject' => $fields['subject'],\n 'dueTime' => isset($fields['dueDate']) ? Carbon::parse($fields['dueDate'])->format('Y-m-d') : null,\n 'ownerId' => $this->getActivityOwnerId($activity),\n ];\n\n if (isset($fields['status'])) {\n $taskPayload['status'] = $fields['status'];\n }\n\n if (isset($fields['priority'])) {\n $taskPayload['priority'] = $fields['priority'];\n }\n\n if (isset($fields['content'])) {\n $taskPayload['content'] = $fields['content'];\n }\n\n $payload = array_merge($taskPayload, $this->attachToProspect($activity));\n\n $this->logger->info('[integration-app] CRM log follow up task', [\n 'activity' => $activity->getUuid(),\n 'payload' => $payload,\n ]);\n\n $task = $this->client->createTask($payload);\n\n return $task['id'] ?? null;\n }\n\n #[\\Override] public function saveTranscriptionSummaryAsNote(\n ActivityContract $activity,\n string $title,\n string $body,\n ?string $objectId,\n ?NoteObject $noteObject = null,\n ): ?string {\n // We have to find a way to store the transcription summary\n // This might be possible either by Tasks, Events, Engagements & Notes\n // Find what the CRM supports and save the note with the appropriate object(eg Notes)\n\n // For now use only Notes as both ZOHO & Salesforce support them.\n if ($this->supportsNotes() && $objectId !== null) {\n $this->logger->info('[integration-app] saving note', [\n 'activityId' => $activity->getUuid(),\n 'objectId' => $objectId,\n ]);\n\n return $this->saveNote($title, $body, $objectId, $noteObject);\n }\n\n $this->logger->info('[integration-app] skip saveTranscriptionSummaryAsNote', [\n 'activityId' => $activity->getUuid(),\n 'supportsNotes' => $this->supportsNotes(),\n 'objectId' => $objectId,\n ]);\n\n return null;\n }\n\n public function generateProviderUrl(string $providerId, string $objectType): ?string\n {\n return $this->getCrmUrlGenerator()?->generateProviderUrl($providerId, $objectType);\n }\n\n public function updateStage($crmObject, Stage $stage): void\n {\n $objectType = $stage->getType();\n $objectId = $crmObject->getCrmProviderId();\n $params = ['stageName' => $stage->getCrmProviderId()];\n\n $this->logger->info('[integration-app] updateStage', [\n 'objectType' => $objectType,\n 'objectId' => $objectId,\n 'params' => $params,\n ]);\n\n $data = [\n 'data' => $this->normalizeData($objectType, $params),\n ];\n\n\n if ($objectType === Stage::TYPE_LEAD) {\n $this->client->updateLead($objectId, $data);\n } else {\n $this->client->updateDeal($objectId, $data);\n }\n }\n\n /**\n * @throws \\Exception\n */\n public function fetchAndAssociateRelatedActivity(Activity $activity): ?Activity\n {\n if ($activity->getCrm()?->getEdition() !== IntegrationAppProviders::ZOHO_CRM) {\n return null;\n }\n\n if (! $activity->isTypeConference()) {\n return null;\n }\n\n // The related activity is already linked.\n if ($activity->hasCrmProviderId()) {\n return $activity;\n }\n\n if ($activity->hasActualStartTime() === false) {\n return null;\n }\n\n return $this->fetchAndAssociateZohoRelatedActivity($activity);\n }\n\n public function fetchAndAssociateZohoRelatedActivity(Activity $activity): ?Activity\n {\n try {\n $meeting = $this->fetchRelatedZohoActivity($activity);\n if (empty($meeting)) {\n $this->logger->info('[integration-app] fetchRelatedZohoActivity No related activity found', [\n 'activity' => $activity->getUuid(),\n ]);\n\n return null;\n }\n\n $decorateActivity = app(DecorateActivity::class);\n $oldDescription = $meeting['Description'] ?? '';\n $updatedDescription = $decorateActivity->generateUpdatedDescription($oldDescription, $activity);\n\n $this->logger->info('[integration-app] fetchAndAssociateZohoRelatedActivity updating related activity', [\n 'activity' => $activity->getUuid(),\n 'description' => $updatedDescription,\n ]);\n\n $this->client->updateMeeting($meeting['id'], ['Description' => $updatedDescription]);\n\n // Update our activity to reflect the remote data.\n $activity->update([\n 'crm_provider_id' => $meeting['id'],\n 'summary' => $meeting['Description'],\n ]);\n\n return $activity;\n } catch (\\Exception $exception) {\n \\Sentry::captureException($exception);\n\n throw $exception;\n }\n }\n\n public function fetchRelatedZohoActivity(Activity $activity): array\n {\n [$from, $to] = $this->getFromToDates($activity);\n\n $start = $from?->toIso8601String(); // e.g., 2025-07-01T00:00:00+00:00\n $end = $to?->toIso8601String(); // e.g., 2025-07-14T23:59:59+00:00\n if ($start === null || $end === null) {\n $this->logger->info(\n '[integration-app] fetchRelatedZohoActivity missing start or end date',\n [\n 'activity' => $activity->getUuid(),\n 'start' => $start,\n 'end' => $end,\n 'from' => $from,\n 'to' => $to,\n ]\n );\n\n return [];\n }\n\n $whoId = null;\n $whatId = null;\n $criteriaParts = [];\n\n if ($activity->getContact()) {\n $whoId = $activity->getContact()->getCrmProviderId();\n $criteriaParts[] = \"(Who_Id:equals:$whoId)\";\n }\n\n if ($activity->getOpportunity()) {\n $whatId = $activity->getOpportunity()->getCrmProviderId();\n } elseif ($activity->getAccount() && $activity->getAccount()->getIsInternal() === false) {\n $whatId = $activity->getAccount()->getCrmProviderId();\n } elseif ($activity->getLead()) {\n $whatId = $activity->getLead()->getCrmProviderId();\n }\n\n if ($whatId !== null) {\n $criteriaParts[] = \"(What_Id:equals:$whatId)\";\n }\n\n if ($whoId === null && $whatId === null) {\n $this->logger->info(\n '[integration-app] fetchRelatedZohoActivity cannot find prospect',\n [\n 'activity' => $activity->getUuid(),\n ]\n );\n\n return [];\n }\n\n $criteriaParts[] = \"(Start_DateTime:greater_equal:$start)\";\n $criteriaParts[] = \"(End_DateTime:less_equal:$end)\";\n\n $criteria = implode(' AND ', $criteriaParts);\n\n $params = [\n 'criteria' => $criteria,\n 'sort_by' => 'Modified_Time',\n 'sort_order' => 'desc',\n ];\n\n $this->logger->info(\n '[integration-app] fetchRelatedZohoActivity searching for related activity',\n [\n 'activity' => $activity->getUuid(),\n 'params' => $params,\n ]\n );\n\n $meetings = $this->client->searchMeetings($params);\n if (! empty($meetings)) {\n return $meetings[0];\n }\n\n return [];\n }\n\n private function getFromToDates(Activity $activity): array\n {\n $calendarEvent = $activity->calendarEvent()->first();\n\n $from = $calendarEvent?->getStartTime();\n $to = $calendarEvent?->getEndTime();\n\n if (! $from || ! $to) {\n $from = $activity->hasScheduledStartTime()\n ? $activity->getScheduledStartTime()\n : $activity->getActualStartTime();\n\n $to = $activity->hasScheduledEndTime()\n ? $activity->getScheduledEndTime()->addMinutes(15)\n : $activity->getActualEndTime();\n }\n\n return [$from, $to];\n }\n}","depth":4,"on_screen":true,"value":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Services\\Crm\\IntegrationApp;\n\nuse Carbon\\Carbon;\nuse Jiminny\\Contracts\\Crm\\Providers;\nuse Jiminny\\Contracts\\Services\\Crm\\ClientInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\FetchRelatedActivityInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\ImportsBusinessProcessesInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\LayoutManagementInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\MatchCrmEntitiesInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\Provider\\IntegrationAppInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\RemoteEntityLookupInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\RemoteEntityManipulationInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\RemoteNoteEntityManipulationInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\SendSummaryToCrmInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\SettingsInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\SyncCrmEntitiesInterface;\nuse Jiminny\\Contracts\\Services\\Crm\\SyncCrmMetadataInterface;\nuse Jiminny\\Events\\Activities\\Crm\\ActivityLeadConverted;\nuse Jiminny\\Exceptions\\CrmException;\nuse Jiminny\\Exceptions\\SocialAccountNotFoundException;\nuse Jiminny\\Jobs\\Crm\\NoteObject;\nuse Jiminny\\Models\\Account;\nuse Jiminny\\Models\\Activity;\nuse Jiminny\\Models\\Contracts\\ActivityContract;\nuse Jiminny\\Models\\Crm\\Configuration;\nuse Jiminny\\Models\\Opportunity;\nuse Jiminny\\Models\\Stage;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Services\\Crm\\BaseService;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\Config\\IntegrationAppProviders;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\Config\\IntegrationConfigFactory;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\DTO\\Mappers\\FieldMapperInterface;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\DTO\\Mappers\\LeadFieldMapper;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\DTO\\Utils\\GenerateProviderUrlInterface;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\DTO\\Utils\\IntegrationAppCrmGeneratorFactory;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\DTO\\Utils\\UrlGeneratorInterface;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\ServiceTraits\\SyncCrmFieldsTrait;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\ServiceTraits\\SystemStateTrait;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\ServiceTraits\\LayoutTrait;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\ServiceTraits\\MatchProspectsTrait;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\ServiceTraits\\NotSupportedTrait;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\ServiceTraits\\SyncCrmEntitiesTrait;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\ServiceTraits\\SyncCrmMetadataTrait;\nuse Psr\\Log\\LoggerInterface;\nuse Jiminny\\Services\\Crm\\IntegrationApp\\DTO\\Mappers\\OpportunityFieldMapper;\nuse Jiminny\\Repositories\\Crm\\ProfileRepository;\nuse Jiminny\\Repositories\\Crm\\OpportunityRepository;\nuse Jiminny\\Models\\Crm\\Profile;\nuse Jiminny\\Services\\Crm\\CrmObjects\\CrmObjectsRepository;\n\nclass Service extends BaseService implements\n IntegrationAppInterface,\n SyncCrmEntitiesInterface,\n SyncCrmMetadataInterface,\n ImportsBusinessProcessesInterface,\n RemoteEntityManipulationInterface,\n LayoutManagementInterface,\n SettingsInterface,\n MatchCrmEntitiesInterface,\n RemoteEntityLookupInterface,\n RemoteNoteEntityManipulationInterface,\n SendSummaryToCrmInterface,\n UrlGeneratorInterface,\n FetchRelatedActivityInterface\n{\n use SyncCrmMetadataTrait;\n use SyncCrmEntitiesTrait;\n use SystemStateTrait;\n use LayoutTrait;\n use NotSupportedTrait;\n use MatchProspectsTrait;\n use SyncCrmFieldsTrait;\n\n public const string CALL_TYPE_MISSED = 'Missed';\n public const string CALL_TYPE_INBOUND = 'Inbound';\n public const string CALL_TYPE_OUTBOUND = 'Outbound';\n public const string RELATIONSHIP_OPPORTUNITY = 'Deals';\n public const string RELATIONSHIP_LEAD = 'Leads';\n public const string RELATIONSHIP_ACCOUNT = 'Accounts';\n\n /**\n * @var ClientInterface&DataClient\n */\n protected $client;\n\n protected ?User $invokedUser = null;\n\n protected ?GenerateProviderUrlInterface $crmUrlGenerator = null;\n\n public function __construct(\n DataClient $client,\n LoggerInterface $logger,\n ) {\n parent::__construct();\n $this->client = $client;\n $this->logger = $logger;\n }\n\n public function getDisplayName(): string\n {\n return Providers::getProviderDisplayName(\n Providers::getCrmIntegrationSlug($this->config)\n );\n }\n\n /**\n * @throws \\Exception\n */\n public function setUser(User $user): void\n {\n $this->configureSentryScope($user);\n $this->invokedUser = $user;\n\n $this->team = $user->getTeam();\n $teamOwner = $this->team->getOwner();\n\n $this->setConfiguration($user->getTeam()->getCrmConfiguration());\n $this->setEditionConfiguration(Providers::getCrmIntegrationSlug($this->config));\n $this->setCrmUrlGenerator($this->config);\n\n $this->client->setTeam($this->team);\n $socialAccount = $teamOwner?->getSocialAccount('integration-app');\n if ($socialAccount === null) {\n $this->logger->info('[integration-app] Social account not found', [\n 'teamId' => $this->team->getId(),\n 'teamOwnerId' => $teamOwner?->getId(),\n 'userId' => $user->getId(),\n ]);\n\n throw new SocialAccountNotFoundException('Social account not found!');\n }\n $this->client->setSocialAccount($socialAccount);\n\n // The CRM Service is properly bootstrapped, and supports remote operations\n $this->connect();\n }\n\n public function normalizeValue(string $fieldType, string $fieldValue, bool $internal = false): string\n {\n return $fieldValue;\n }\n\n public function find(string $name, array $scopes): array\n {\n /** @var LocalSearch $localSearch */\n $localSearch = app(LocalSearch::class);\n $localSearch->setConfiguration($this->config);\n $localSearch->setCountryCode($this->invokedUser->getCountryCode());\n\n return $localSearch->search($name);\n\n // if (! empty($localMatch)) {\n // return $localMatch;\n // }\n //\n // /** @var RemoteSearch $remoteSearch */\n // $remoteSearch = app(RemoteSearch::class);\n // $remoteSearch->setClient($this->client);\n // $remoteSearch->setConfiguration($this->config);\n //\n // return $remoteSearch->search($name);\n }\n\n public function findOpportunities(?string $crmAccountId, ?string $crmContactId, ?int $userId = null): array\n {\n $data = [];\n $ownerData = [];\n\n $account = $this->getAccount($crmAccountId, $crmContactId);\n if ($account === null) {\n return [];\n }\n\n $ownerId = $this->getOwnerId($userId);\n\n try {\n $opportunityRepository = app(OpportunityRepository::class);\n $opportunities = $opportunityRepository->findAllByConfigurationAndAccountId(\n $this->config,\n $account->getId()\n );\n\n foreach ($opportunities as $opportunity) {\n /** @var Opportunity $opportunity */\n $record = $this->buildOpportunityData($opportunity);\n\n if ($ownerId && $opportunity->getOwnerId() === $ownerId) {\n $ownerData[] = $record;\n }\n\n $data[] = $record;\n }\n\n if (! empty($ownerData)) {\n return $ownerData;\n }\n\n return $data;\n } catch (\\Exception $e) {\n $this->logger->info('[integration-app] Failed to fetch opportunities', [\n 'contact' => $crmContactId,\n 'account' => $crmAccountId,\n 'owner' => $ownerId,\n 'error' => $e->getMessage(),\n ]);\n\n return $data;\n }\n }\n\n private function getOwnerId(?int $userId = null): ?string\n {\n if (! $userId) {\n return null;\n }\n\n $profileRepository = app(ProfileRepository::class);\n $profile = $profileRepository->findProfileByUserId($this->config, $userId);\n\n return $profile instanceof Profile ? $profile->getCrmProviderId() : null;\n }\n\n private function getAccount(?string $crmAccountId = null, ?string $crmContactId = null): ?Account\n {\n $crmRepository = app(CrmObjectsRepository::class);\n\n if ($crmAccountId === null) {\n $contact = $crmRepository->findContactByCrmProviderId($this->config, $crmContactId);\n\n return $contact->getAccount();\n }\n\n return $crmRepository->findAccountByCrmProviderId($this->config, $crmAccountId);\n }\n\n private function buildOpportunityData(Opportunity $opportunity): array\n {\n $record = [\n 'crmId' => $opportunity->getCrmProviderId(),\n 'name' => $opportunity->getName(),\n 'won' => $opportunity->isWon(),\n 'closed' => $opportunity->isClosed(),\n ];\n\n if (! empty($opportunity->getFormattedValueAttribute())) {\n $record['value'] = $opportunity->getFormattedValueAttribute();\n }\n\n if (! empty($opportunity->getStage())) {\n $record['stage'] = [\n 'id' => $opportunity->getStage()->getUuid(),\n 'name' => $opportunity->getStage()->getName(),\n ];\n }\n\n return $record;\n }\n\n public function updateRecord(string $objectType, string $objectId, array $data, array $headers = []): void\n {\n $data = [\n 'data' => $this->normalizeData($objectType, $data),\n ];\n\n $this->client->updateRecordById($objectType, $objectId, $data);\n }\n\n private function normalizeData(string $objectType, array $data): array\n {\n $fieldMapper = $this->getFieldMapper($objectType);\n\n if (! $fieldMapper instanceof FieldMapperInterface) {\n return $data;\n }\n\n return $fieldMapper->mapToCrmFields($data);\n }\n\n private function getFieldMapper(string $objectType): ?FieldMapperInterface\n {\n if ($objectType === self::OBJECT_OPPORTUNITY) {\n return app(OpportunityFieldMapper::class);\n }\n\n if ($objectType === self::OBJECT_LEAD) {\n return app(LeadFieldMapper::class);\n }\n\n return null;\n }\n\n public function getRecord(string $objectType, string $objectId, array $fields = []): array\n {\n return $this->client->getRecordById($objectType, $objectId);\n }\n\n public function getConfiguration(): Configuration\n {\n return $this->config;\n }\n\n public function setConfiguration(Configuration $config): void\n {\n $this->clearExternalMapCache();\n\n $this->config = $config;\n }\n\n private function setEditionConfiguration(string $provider): void\n {\n $this->editionConfig = app(IntegrationConfigFactory::class)->create($provider);\n }\n\n public function setCrmUrlGenerator(Configuration $config): void\n {\n $this->crmUrlGenerator = app(IntegrationAppCrmGeneratorFactory::class)->create($config);\n }\n\n public function getCrmUrlGenerator(): ?GenerateProviderUrlInterface\n {\n if ($this->crmUrlGenerator === null) {\n $this->setCrmUrlGenerator($this->config);\n }\n\n return $this->crmUrlGenerator;\n }\n\n public function subscribeEntityEvents(bool $enableTrigger = true): void\n {\n $eventStates = $this->client->updateEntityEventsState($enableTrigger);\n\n $this->logger->info('[integration-app] Change team entity events subscription', [\n 'teamId' => $this->team->getId(),\n 'teamName' => $this->team->getName(),\n 'states' => $eventStates,\n 'action' => $enableTrigger ? 'subscribe' : 'unsubscribe',\n ]);\n }\n\n #[\\Override] public function supportsNotes(): bool\n {\n return $this->editionConfig->supportsNotes();\n }\n\n #[\\Override] public function saveNote(\n string $title,\n string $body,\n string $objectId,\n ?NoteObject $noteObject = null,\n ): ?string {\n if ($noteObject === null) {\n return null;\n }\n\n $notePayload = [\n 'title' => $title,\n 'content' => $body,\n 'objectId' => $objectId,\n 'objectType' => $noteObject->value,\n ];\n\n $result = $this->client->createNote($notePayload);\n\n // debug saving note response\n $this->logger->info('[integration-app] createNote response', [\n 'objectId' => $objectId,\n 'objectType' => $noteObject->value,\n 'result' => $result,\n 'hasId' => isset($result['id']),\n ]);\n\n return $result['id'] ?? null;\n }\n\n /**\n * @throws CrmException\n */\n #[\\Override] public function saveActivity(Activity $activity): Activity\n {\n $this->logger->info('[integration-app] saveActivity', [\n 'activity' => $activity->getUuid(),\n 'type' => $activity->getType(),\n ]);\n\n if ($activity->getCrmType() === Activity::TYPE_CONFERENCE) {\n $crmActivity = $this->saveMeeting($activity);\n } elseif (in_array($activity->getType(), [Activity::TYPE_SOFTPHONE, Activity::TYPE_SOFTPHONE_INBOUND])) {\n $crmActivity = $this->saveCall($activity);\n } else {\n throw new CrmException('Unsupported activity type');\n }\n\n $crmActivityId = $crmActivity['id'] ?? null;\n\n if ($crmActivityId !== null) {\n $activity->crm_provider_id = $crmActivityId;\n $activity->save();\n\n $this->logger->info('[integration-app] Activity successfully logged to CRM', [\n 'activity' => $activity->getUuid(),\n 'type' => $activity->getType(),\n 'crmId' => $crmActivityId,\n ]);\n }\n\n return $activity;\n }\n\n public function saveMeeting(Activity $activity): array\n {\n $decorateActivity = app(DecorateActivity::class);\n\n $meetingPayload = [\n 'Event_Title' => $decorateActivity->generateTitle($activity),\n 'Start_DateTime' => $activity->getActualStartTime()->toIso8601String(),\n 'End_DateTime' => $activity->getActualEndTime()->toIso8601String(),\n 'ownerId' => $this->getActivityOwnerId($activity),\n ];\n\n $payload = array_merge($meetingPayload, $this->attachToProspect($activity));\n\n if ($activity->hasCrmProviderId()) {\n $crmId = $activity->getCrmProviderId();\n $meeting = $this->client->getMeeting($crmId);\n\n $oldDescription = $meeting['fields']['Description'] ?? null;\n $payload['Description'] = $decorateActivity->generateUpdatedDescription($oldDescription, $activity);\n\n $this->logger->info('[integration-app] CRM update meeting', [\n 'activity' => $activity->getUuid(),\n 'crm_id' => $crmId,\n 'payload' => $payload,\n ]);\n\n return $this->client->updateMeeting($crmId, $payload);\n }\n\n $payload['Description'] = $decorateActivity->generateDescription($activity);\n\n $this->logger->info('[integration-app] CRM log meeting', [\n 'activity' => $activity->getUuid(),\n 'payload' => $payload,\n ]);\n\n return $this->client->createMeeting($payload);\n }\n\n public function saveCall(Activity $activity): array\n {\n $decorateActivity = app(DecorateActivity::class);\n\n $callPayload = [\n 'Call_Type' => $this->getCallType($activity),\n 'Call_Start_Time' => $activity->getActualStartTime()->toIso8601String(),\n 'Call_Duration' => $activity->getDuration(),\n 'name' => $decorateActivity->generateTitle($activity),\n 'ownerId' => $this->getActivityOwnerId($activity),\n ];\n\n $payload = array_merge($callPayload, $this->attachToProspect($activity));\n\n if ($activity->hasCrmProviderId()) {\n $crmId = $activity->getCrmProviderId();\n $call = $this->client->getCall($crmId);\n\n $oldDescription = $call['fields']['Description'] ?? null;\n $payload['description'] = $decorateActivity->generateUpdatedDescription($oldDescription, $activity);\n\n $this->logger->info('[integration-app] CRM update call', [\n 'activity' => $activity->getUuid(),\n 'crm_id' => $crmId,\n 'payload' => $payload,\n ]);\n\n return $this->client->updateCall($crmId, $payload);\n }\n\n $payload['description'] = $decorateActivity->generateDescription($activity);\n\n $this->logger->info('[integration-app] CRM log call', [\n 'activity' => $activity->getUuid(),\n 'payload' => $payload,\n ]);\n\n return $this->client->createCall($payload);\n }\n\n private function getCallType(Activity $activity): string\n {\n if ($activity->getStatus() === Activity::STATUS_NO_ANSWER) {\n return self::CALL_TYPE_MISSED;\n }\n\n return $activity->getType() === Activity::TYPE_SOFTPHONE_INBOUND ? self::CALL_TYPE_INBOUND : self::CALL_TYPE_OUTBOUND;\n }\n\n private function attachToProspect(Activity $activity): array\n {\n $payload = [];\n\n if ($activity->hasContact()) {\n $payload['contactId'] = $activity->getContact()->getCrmProviderId();\n }\n\n if ($activity->hasOpportunity()) {\n return array_merge(\n $payload,\n $this->buildBasicPayload(\n self::RELATIONSHIP_OPPORTUNITY,\n $activity->getOpportunity()->getCrmProviderId()\n )\n );\n }\n\n if ($activity->hasAccount() && ! $activity->getAccount()->getIsInternal()) {\n return array_merge(\n $payload,\n $this->buildBasicPayload(\n self::RELATIONSHIP_ACCOUNT,\n $activity->getAccount()->getCrmProviderId()\n )\n );\n }\n\n if ($activity->hasLead()) {\n $payload = $this->handleLeadPayload($activity);\n }\n\n return $payload;\n }\n\n private function handleLeadPayload(Activity $activity): array\n {\n $freshLead = $this->syncLead($activity->getLead()->getCrmProviderId());\n $lead = $freshLead ?? $activity->getLead();\n\n if ($lead->getConvertedAt() === null) {\n return $this->buildBasicPayload(self::RELATIONSHIP_LEAD, $lead->getCrmProviderId());\n }\n\n $activity->lead_id = null;\n\n if ($lead->hasAccount()) {\n $account = $lead->getAccount();\n $activity->account_id = $account->getId();\n $payload = $this->buildBasicPayload(self::RELATIONSHIP_ACCOUNT, $account->getCrmProviderId());\n } else {\n $payload = [];\n }\n\n if ($lead->hasOpportunity()) {\n $opportunity = $lead->getOpportunity();\n $payload = $this->buildBasicPayload(self::RELATIONSHIP_OPPORTUNITY, $opportunity->getCrmProviderId());\n $activity->opportunity_id = $opportunity->getId();\n $activity->value = $opportunity->value;\n $activity->stage_id = $opportunity->stage_id;\n } else {\n $activity->stage_id = null;\n }\n\n if ($lead->hasContact()) {\n $contact = $lead->getContact();\n $payload['contactId'] = $contact->getCrmProviderId();\n $activity->contact_id = $contact->getId();\n }\n\n $activity->save();\n event(new ActivityLeadConverted($activity, $lead));\n\n $this->logger->info('[integration-app] Lead converted', [\n 'activityUuid' => $activity->getUuid(),\n 'leadUuid' => $lead->getUuid(),\n ]);\n\n return $payload;\n }\n\n private function buildBasicPayload(string $type, string $id): array\n {\n return [\n 'type' => $type,\n 'id' => $id,\n ];\n }\n private function getActivityOwnerId(Activity $activity): ?string\n {\n $ownerId = null;\n if ($activity->hasUser() && $activity->getUser()->getProfile() !== null) {\n $ownerId = $activity->getUser()->getProfile()->getCrmProviderId();\n }\n\n return $ownerId;\n }\n\n #[\\Override] public function saveFollowupActivity(Activity $activity, array $fields): ?string\n {\n $taskPayload = [\n 'subject' => $fields['subject'],\n 'dueTime' => isset($fields['dueDate']) ? Carbon::parse($fields['dueDate'])->format('Y-m-d') : null,\n 'ownerId' => $this->getActivityOwnerId($activity),\n ];\n\n if (isset($fields['status'])) {\n $taskPayload['status'] = $fields['status'];\n }\n\n if (isset($fields['priority'])) {\n $taskPayload['priority'] = $fields['priority'];\n }\n\n if (isset($fields['content'])) {\n $taskPayload['content'] = $fields['content'];\n }\n\n $payload = array_merge($taskPayload, $this->attachToProspect($activity));\n\n $this->logger->info('[integration-app] CRM log follow up task', [\n 'activity' => $activity->getUuid(),\n 'payload' => $payload,\n ]);\n\n $task = $this->client->createTask($payload);\n\n return $task['id'] ?? null;\n }\n\n #[\\Override] public function saveTranscriptionSummaryAsNote(\n ActivityContract $activity,\n string $title,\n string $body,\n ?string $objectId,\n ?NoteObject $noteObject = null,\n ): ?string {\n // We have to find a way to store the transcription summary\n // This might be possible either by Tasks, Events, Engagements & Notes\n // Find what the CRM supports and save the note with the appropriate object(eg Notes)\n\n // For now use only Notes as both ZOHO & Salesforce support them.\n if ($this->supportsNotes() && $objectId !== null) {\n $this->logger->info('[integration-app] saving note', [\n 'activityId' => $activity->getUuid(),\n 'objectId' => $objectId,\n ]);\n\n return $this->saveNote($title, $body, $objectId, $noteObject);\n }\n\n $this->logger->info('[integration-app] skip saveTranscriptionSummaryAsNote', [\n 'activityId' => $activity->getUuid(),\n 'supportsNotes' => $this->supportsNotes(),\n 'objectId' => $objectId,\n ]);\n\n return null;\n }\n\n public function generateProviderUrl(string $providerId, string $objectType): ?string\n {\n return $this->getCrmUrlGenerator()?->generateProviderUrl($providerId, $objectType);\n }\n\n public function updateStage($crmObject, Stage $stage): void\n {\n $objectType = $stage->getType();\n $objectId = $crmObject->getCrmProviderId();\n $params = ['stageName' => $stage->getCrmProviderId()];\n\n $this->logger->info('[integration-app] updateStage', [\n 'objectType' => $objectType,\n 'objectId' => $objectId,\n 'params' => $params,\n ]);\n\n $data = [\n 'data' => $this->normalizeData($objectType, $params),\n ];\n\n\n if ($objectType === Stage::TYPE_LEAD) {\n $this->client->updateLead($objectId, $data);\n } else {\n $this->client->updateDeal($objectId, $data);\n }\n }\n\n /**\n * @throws \\Exception\n */\n public function fetchAndAssociateRelatedActivity(Activity $activity): ?Activity\n {\n if ($activity->getCrm()?->getEdition() !== IntegrationAppProviders::ZOHO_CRM) {\n return null;\n }\n\n if (! $activity->isTypeConference()) {\n return null;\n }\n\n // The related activity is already linked.\n if ($activity->hasCrmProviderId()) {\n return $activity;\n }\n\n if ($activity->hasActualStartTime() === false) {\n return null;\n }\n\n return $this->fetchAndAssociateZohoRelatedActivity($activity);\n }\n\n public function fetchAndAssociateZohoRelatedActivity(Activity $activity): ?Activity\n {\n try {\n $meeting = $this->fetchRelatedZohoActivity($activity);\n if (empty($meeting)) {\n $this->logger->info('[integration-app] fetchRelatedZohoActivity No related activity found', [\n 'activity' => $activity->getUuid(),\n ]);\n\n return null;\n }\n\n $decorateActivity = app(DecorateActivity::class);\n $oldDescription = $meeting['Description'] ?? '';\n $updatedDescription = $decorateActivity->generateUpdatedDescription($oldDescription, $activity);\n\n $this->logger->info('[integration-app] fetchAndAssociateZohoRelatedActivity updating related activity', [\n 'activity' => $activity->getUuid(),\n 'description' => $updatedDescription,\n ]);\n\n $this->client->updateMeeting($meeting['id'], ['Description' => $updatedDescription]);\n\n // Update our activity to reflect the remote data.\n $activity->update([\n 'crm_provider_id' => $meeting['id'],\n 'summary' => $meeting['Description'],\n ]);\n\n return $activity;\n } catch (\\Exception $exception) {\n \\Sentry::captureException($exception);\n\n throw $exception;\n }\n }\n\n public function fetchRelatedZohoActivity(Activity $activity): array\n {\n [$from, $to] = $this->getFromToDates($activity);\n\n $start = $from?->toIso8601String(); // e.g., 2025-07-01T00:00:00+00:00\n $end = $to?->toIso8601String(); // e.g., 2025-07-14T23:59:59+00:00\n if ($start === null || $end === null) {\n $this->logger->info(\n '[integration-app] fetchRelatedZohoActivity missing start or end date',\n [\n 'activity' => $activity->getUuid(),\n 'start' => $start,\n 'end' => $end,\n 'from' => $from,\n 'to' => $to,\n ]\n );\n\n return [];\n }\n\n $whoId = null;\n $whatId = null;\n $criteriaParts = [];\n\n if ($activity->getContact()) {\n $whoId = $activity->getContact()->getCrmProviderId();\n $criteriaParts[] = \"(Who_Id:equals:$whoId)\";\n }\n\n if ($activity->getOpportunity()) {\n $whatId = $activity->getOpportunity()->getCrmProviderId();\n } elseif ($activity->getAccount() && $activity->getAccount()->getIsInternal() === false) {\n $whatId = $activity->getAccount()->getCrmProviderId();\n } elseif ($activity->getLead()) {\n $whatId = $activity->getLead()->getCrmProviderId();\n }\n\n if ($whatId !== null) {\n $criteriaParts[] = \"(What_Id:equals:$whatId)\";\n }\n\n if ($whoId === null && $whatId === null) {\n $this->logger->info(\n '[integration-app] fetchRelatedZohoActivity cannot find prospect',\n [\n 'activity' => $activity->getUuid(),\n ]\n );\n\n return [];\n }\n\n $criteriaParts[] = \"(Start_DateTime:greater_equal:$start)\";\n $criteriaParts[] = \"(End_DateTime:less_equal:$end)\";\n\n $criteria = implode(' AND ', $criteriaParts);\n\n $params = [\n 'criteria' => $criteria,\n 'sort_by' => 'Modified_Time',\n 'sort_order' => 'desc',\n ];\n\n $this->logger->info(\n '[integration-app] fetchRelatedZohoActivity searching for related activity',\n [\n 'activity' => $activity->getUuid(),\n 'params' => $params,\n ]\n );\n\n $meetings = $this->client->searchMeetings($params);\n if (! empty($meetings)) {\n return $meetings[0];\n }\n\n return [];\n }\n\n private function getFromToDates(Activity $activity): array\n {\n $calendarEvent = $activity->calendarEvent()->first();\n\n $from = $calendarEvent?->getStartTime();\n $to = $calendarEvent?->getEndTime();\n\n if (! $from || ! $to) {\n $from = $activity->hasScheduledStartTime()\n ? $activity->getScheduledStartTime()\n : $activity->getActualStartTime();\n\n $to = $activity->hasScheduledEndTime()\n ? $activity->getScheduledEndTime()->addMinutes(15)\n : $activity->getActualEndTime();\n }\n\n return [$from, $to];\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.85486114,"top":0.31,"width":0.018055556,"height":0.026666667},"on_screen":true,"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.87291664,"top":0.31,"width":0.018055556,"height":0.026666667},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Browse Query History","depth":4,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"View Parameters","depth":4,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Open Query Execution Settings…","depth":4,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"In-Editor Results","depth":4,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Tx: Auto","depth":4,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Cancel Running Statements","depth":4,"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Playground","depth":4,"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"jiminny","depth":4,"bounds":{"left":0.9138889,"top":0.31,"width":0.059027776,"height":0.026666667},"on_screen":true,"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},"on_screen":false,"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},"on_screen":false,"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},"on_screen":false,"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},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"8","depth":4,"bounds":{"left":0.8645833,"top":0.34444445,"width":0.016666668,"height":0.02111111},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"1","depth":4,"bounds":{"left":0.8854167,"top":0.34444445,"width":0.015277778,"height":0.02111111},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"3","depth":4,"bounds":{"left":0.9048611,"top":0.34444445,"width":0.016666668,"height":0.02111111},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"4","depth":4,"bounds":{"left":0.92569447,"top":0.34444445,"width":0.016666668,"height":0.02111111},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.9458333,"top":0.3422222,"width":0.015277778,"height":0.025555555},"on_screen":true,"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.9611111,"top":0.3422222,"width":0.014583333,"height":0.025555555},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"SELECT\n# DISTINCT\nopp.id as opp_id, opp.uuid, opp.name,\n# COUNT(dr.id) AS deal_risk_count,\n\n# dr.id,\n# cfd.value,\nusr.name AS owner_name,\nopp.value, opp.currency_code, opp.close_date, opp.remotely_created_at, opp.is_closed, opp.is_won,\nusr.uuid as owner_uuid,\nusr.photo_path as owner_photo,\nusr.id AS owner_id,\njt.name as owner_job,\nopp.stage_id, opp.stage_updated_at,\nacc.name AS acc_name, opp.stage_updated_at, acc.crm_provider_id AS acc_provider_id, opp.crm_provider_id AS opp_provider_id,\nrt.business_process_id AS pipeline_id\nFROM opportunities opp\nLEFT JOIN record_types rt ON opp.record_type_id = rt.id\nLEFT JOIN users usr ON opp.user_id = usr.id\nLEFT JOIN accounts acc ON opp.account_id = acc.id\nLEFT JOIN job_titles jt ON usr.job_title_id = jt.id\n\n# LEFT JOIN group_deal_risk_types gdrt ON gdrt.group_id = usr.group_id\n# LEFT JOIN deal_risks dr ON dr.opportunity_id = opp.id AND dr.group_deal_risk_type_id = gdrt.id\n\nLEFT JOIN crm_field_data cfd ON (cfd.object_id = opp.id and cfd.crm_field_id = 66814)\n\nWHERE opp.user_id IS NOT NULL\nAND opp.deleted_at IS NULL\nAND opp.is_closed = 1\nAND opp.is_won = 0\nAND opp.close_date >= '2024-01-01 00:00:00'\nAND opp.close_date <= '2024-12-31 23:59:59'\nAND usr.team_id = 1\n\n# and opp.id = 4823179\n\nGROUP BY opp.id, cfd.value\nORDER BY\n# cfd.value\n CAST(cfd.value AS UNSIGNED)\n# owner_name\n# (SELECT COUNT(dr.id)\n# FROM deal_risks dr\n# JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id\n# WHERE dr.opportunity_id = opp.id\n# AND dr.is_active = 1\n# AND gdrt.is_enabled = 1)\nDESC\nLIMIT 25\n# OFFSET 0\n;\n\nselect * from crm_fields where crm_configuration_id = 1 and object_type = 'opportunity';\nselect * from crm_layout_entities where crm_layout_id = 1493;\n\nSELECT * FROM opportunities WHERE id = 4584045;\nSELECT * FROM crm_field_data WHERE object_id = 4584045;\n\nSELECT * FROM opportunities where team_id = 1 and crm_provider_id = '0061K00000lfb9IQAQ'\n\nSELECT\n opp.id as opportunity_id,\n opp.name,\n COUNT(dr.id) as risk_count\nFROM opportunities opp\nLEFT JOIN deal_risks dr ON dr.opportunity_id = opp.id\nWHERE opp.id IN (\n 6069574,8900938,9507638,9524799,9660490,9662824,9705675,9749758,4158460,4391812,6450439,4448422,5118945,5590675,4584045,7228149,9002408,9165534,9446720,9641778,9665149,9703344,9709280,5747948,4158491,6182565,6263970,5798120,5111315,4536978,6062352,6548383,6072095,6548225,4480986,5011422,6548381,8760540,8917554,9509986,9514392,9569009,9569011,9578490,9713604,5784397,7276612,7288405,8994421,9118219,9608148,9818911,4510535,6479693,5958049,6271674,6550448,4158331,4158483,6126571,6171615,6540943,4897466,5190896,5796182,5932762,8572433,8723698,8892697,9711001,9789264,4549188,6100831,6170064,6260799,6263653,6449936,6530871,6538978,7777651,8059269,8319918,8787049,8901150,9263153,9453207,9514738,9696700,9791062,5752018,6421452,7439134,7878923,9354763,9369285,9514396,9582506,9889949,9890216,4094311,4158495,4158496,6098128,5585661,3872564,6442149,5891604,6164746,6199593,6583474,6519684,9018490,9809006,4496897,5041324,5829430,6198319,6253504,6555763,7242914,7931055,8024125,8797814,8058559,8673347,8892695,8994420,9616219,9714970,9722004,9809439,9818918,6523177,8134147,9002915,9711422,9892713,9901719,9954210,9978435,5800810,6243518,6416114,6222251,6411974,6512456,5791953,6545606,9914780,5805540,6238986,6463838,6547680,9767049,9809437,9810885,9890855,6673493,9902036,4335521,6379871,6503799,6546077,8018765,9907556,9958433,9905855,9916179,9946741,9957877,5563344,6271838,6450815,7641128,7762567,7780592,8684810,8685786,8685787,8685788\n)\nGROUP BY opp.id;\n\nSELECT COUNT(dr.id)\n FROM deal_risks dr\n JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id\n WHERE dr.opportunity_id = 5563344\n# AND gdrt.group_id = usr.group_id\n\n\n\nEXPLAIN SELECT\n opp.id as opp_id, opp.uuid, opp.name,\n\ncfd.value,\ncfv.sequence,\ncfv.value,\n# MAX(cfd.value) AS max_cfd_value,\nusr.name AS owner_name,\nopp.value, opp.currency_code, opp.close_date, opp.remotely_created_at, opp.is_closed, opp.is_won,\nusr.uuid as owner_uuid,\nusr.photo_path as owner_photo,\nusr.id AS owner_id,\njt.name as owner_job,\nopp.stage_id, opp.stage_updated_at,\nacc.name AS acc_name, opp.stage_updated_at, acc.crm_provider_id AS acc_provider_id, opp.crm_provider_id AS opp_provider_id,\nrt.business_process_id AS pipeline_id\nFROM opportunities opp\n\nLEFT JOIN record_types rt ON opp.record_type_id = rt.id\nLEFT JOIN users usr ON opp.user_id = usr.id\nLEFT JOIN accounts acc ON opp.account_id = acc.id\nLEFT JOIN job_titles jt ON usr.job_title_id = jt.id\n\nLEFT JOIN crm_field_data cfd ON cfd.id = (SELECT sub_cfd.id\n FROM crm_field_data sub_cfd\n WHERE sub_cfd.object_id = opp.id\n AND sub_cfd.crm_field_id = 66810\n ORDER BY sub_cfd.updated_at DESC\n LIMIT 1)\n\nLEFT JOIN crm_field_values cfv ON cfv.crm_field_id = 66810 AND cfv.value = cfd.value\n\nWHERE opp.user_id IS NOT NULL\nAND opp.deleted_at IS NULL\nAND opp.is_closed = 0\n# AND opp.is_closed = 1\n# AND opp.is_won = 0\nAND opp.close_date >= '2024-01-01 00:00:00'\nAND opp.close_date <= '2024-12-31 23:59:59'\nAND usr.team_id = 1\n\n# and opp.id = 4823179\n\n# GROUP BY opp.id\nORDER BY\n cfv.sequence DESC,\n# opp.name\n# owner_name\n cfd.value\n# CAST(cfd.value AS UNSIGNED)\n# CAST(MAX(cfd.value) AS UNSIGNED)\n# (SELECT COUNT(dr.id)\n# FROM deal_risks dr\n# JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id\n# WHERE dr.opportunity_id = opp.id\n# AND dr.is_active = 1 AND gdrt.is_enabled = 1)\nDESC\n# LIMIT 75, 25\n;\n\n\n\nSELECT * FROM crm_field_values WHERE crm_field_id = 66810;\n\nSELECT f.id, f.crm_provider_id AS field_name, f.label, fd.object_id AS dealId, fd.value, fd.updated_at, fd.id, fd.created_at\nFROM crm_fields f\nINNER JOIN crm_field_data fd ON fd.crm_field_id = f.id\n WHERE (f.crm_configuration_id = 1)\n AND (f.object_type = 'opportunity')\n# AND (fd.object_id IN (4158331,4158483,4158495,4158496,6069574,6263970,6171615,6540943,6545606,5829430,6198319,6263653,6548381,7242914,8797814,7228149,7439134,7878923,8134147,9002915,9118219,9165534,9354763,9369285,9446720))\n AND (fd.object_id IN (4158460))\n AND (f.crm_provider_id IN ('ForecastCategoryName'))\n ORDER BY fd.object_id ASC, fd.updated_at DESC;\n\nselect * from crm_layouts where crm_configuration_id = 1;\nselect cf.* from crm_fields cf\njoin crm_layout_entities cle on cf.id = cle.crm_field_id\nwhere crm_layout_id = 1493;\n\nSELECT * FROM opportunities WHERE id = 4158460;\nSELECT * FROM crm_field_data WHERE object_id = 4158460;\n\nselect * from users where team_id = 1;\nSELECT * FROM users WHERE id = 7160;\nselect * from role_user where user_id = 3248;\n\nselect * from crm_field_values where crm_field_id = 66824;\n\nSELECT * FROM users WHERE id = 23470;\nselect * from crm_configurations;\n\n# ******************************************\nselect * from teams where id = 1038; # 23521, 966\nselect * from users where team_id = 1038;\nselect * from crm_configurations where id = 966;\nSELECT * FROM activities WHERE uuid_to_bin('e8dc7c34-31f6-4430-bd81-2d9d8f00dd07') = uuid; # 54965762\nSELECT * FROM activities WHERE uuid_to_bin('4b5727c0-69d1-428f-b8d9-b649055166e2') = uuid; # 54965764\nSELECT * FROM participants WHERE activity_id = 54965764;\n\nSELECT id, uuid, title, recording_state FROM activities WHERE uuid_to_bin('355f105d-5606-4379-b0c5-d91daf59f4ce') = uuid; # 54964075\nSELECT * FROM participants WHERE activity_id = 54964075;\nselect f.id, slug, title, tf.team_id from team_features tf JOIN features f on tf.feature_id = f.id\n where tf.team_id = 1038;\n\n\n# ****************************************** PD *************************\nselect * from teams where id = 1029;\nSELECT * FROM crm_configurations WHERE id = 957;\nSELECT * FROM activities WHERE uuid_to_bin('581a33cb-4343-44bd-ac0c-4a5cee71c5ec') = uuid; # 54963423\nSELECT * FROM activities WHERE uuid_to_bin('07238011-25fa-418e-838b-fb21e82b9ea2') = uuid; # 54963433\n\nSELECT * FROM activities WHERE uuid_to_bin('8b6bb2f7-e7a7-4aec-8806-fbfea7093ccd') = uuid; # 54963421\n\n# ****************************************** Close *************************\nselect * from teams where id = 1031;\nSELECT * FROM crm_configurations WHERE id = 959;\nSELECT * FROM activities WHERE uuid_to_bin('59c517e0-96c9-4dad-bfeb-b7bef72f8725') = uuid; # 54963517\n\n\nSELECT * FROM activities WHERE uuid_to_bin('07238011-25fa-418e-838b-fb21e82b9ea2') = uuid; # 54963433\n\nSELECT * FROM activities WHERE uuid_to_bin('d68311e3-ac34-49bd-bf04-88323a7e5352') = uuid; # 54966009\n\n# ****************************************** SF *************************\nSELECT * FROM activities WHERE uuid_to_bin('2bd4cfa3-4eb5-4c77-84a7-9ed46a21c988') = uuid;\n\nselect * from roles;\nselect * from permissions;\nselect * from permission_role where permission_id = 136;\n\nselect * from migrations order by id desc;\n\nselect * from teams where id IN (1, 1037);\nselect * from crm_layouts where crm_configuration_id = 1;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1493;\nSELECT * FROM crm_fields WHERE id IN (1652,1661,66799,66814,66821,66836,66843,66846,66864,84752,182306,323580,380378);\n\nselect * from features;\nselect * from team_features where feature_id = 33;\nselect * from opportunities;\n\nselect * from teams;\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 = 1052 and sa.provider = 'hubspot';\n\nSELECT * FROM accounts where id = 11512582;\nselect * from activities where account_id = 11512582;","depth":4,"on_screen":true,"value":"SELECT\n# DISTINCT\nopp.id as opp_id, opp.uuid, opp.name,\n# COUNT(dr.id) AS deal_risk_count,\n\n# dr.id,\n# cfd.value,\nusr.name AS owner_name,\nopp.value, opp.currency_code, opp.close_date, opp.remotely_created_at, opp.is_closed, opp.is_won,\nusr.uuid as owner_uuid,\nusr.photo_path as owner_photo,\nusr.id AS owner_id,\njt.name as owner_job,\nopp.stage_id, opp.stage_updated_at,\nacc.name AS acc_name, opp.stage_updated_at, acc.crm_provider_id AS acc_provider_id, opp.crm_provider_id AS opp_provider_id,\nrt.business_process_id AS pipeline_id\nFROM opportunities opp\nLEFT JOIN record_types rt ON opp.record_type_id = rt.id\nLEFT JOIN users usr ON opp.user_id = usr.id\nLEFT JOIN accounts acc ON opp.account_id = acc.id\nLEFT JOIN job_titles jt ON usr.job_title_id = jt.id\n\n# LEFT JOIN group_deal_risk_types gdrt ON gdrt.group_id = usr.group_id\n# LEFT JOIN deal_risks dr ON dr.opportunity_id = opp.id AND dr.group_deal_risk_type_id = gdrt.id\n\nLEFT JOIN crm_field_data cfd ON (cfd.object_id = opp.id and cfd.crm_field_id = 66814)\n\nWHERE opp.user_id IS NOT NULL\nAND opp.deleted_at IS NULL\nAND opp.is_closed = 1\nAND opp.is_won = 0\nAND opp.close_date >= '2024-01-01 00:00:00'\nAND opp.close_date <= '2024-12-31 23:59:59'\nAND usr.team_id = 1\n\n# and opp.id = 4823179\n\nGROUP BY opp.id, cfd.value\nORDER BY\n# cfd.value\n CAST(cfd.value AS UNSIGNED)\n# owner_name\n# (SELECT COUNT(dr.id)\n# FROM deal_risks dr\n# JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id\n# WHERE dr.opportunity_id = opp.id\n# AND dr.is_active = 1\n# AND gdrt.is_enabled = 1)\nDESC\nLIMIT 25\n# OFFSET 0\n;\n\nselect * from crm_fields where crm_configuration_id = 1 and object_type = 'opportunity';\nselect * from crm_layout_entities where crm_layout_id = 1493;\n\nSELECT * FROM opportunities WHERE id = 4584045;\nSELECT * FROM crm_field_data WHERE object_id = 4584045;\n\nSELECT * FROM opportunities where team_id = 1 and crm_provider_id = '0061K00000lfb9IQAQ'\n\nSELECT\n opp.id as opportunity_id,\n opp.name,\n COUNT(dr.id) as risk_count\nFROM opportunities opp\nLEFT JOIN deal_risks dr ON dr.opportunity_id = opp.id\nWHERE opp.id IN (\n 6069574,8900938,9507638,9524799,9660490,9662824,9705675,9749758,4158460,4391812,6450439,4448422,5118945,5590675,4584045,7228149,9002408,9165534,9446720,9641778,9665149,9703344,9709280,5747948,4158491,6182565,6263970,5798120,5111315,4536978,6062352,6548383,6072095,6548225,4480986,5011422,6548381,8760540,8917554,9509986,9514392,9569009,9569011,9578490,9713604,5784397,7276612,7288405,8994421,9118219,9608148,9818911,4510535,6479693,5958049,6271674,6550448,4158331,4158483,6126571,6171615,6540943,4897466,5190896,5796182,5932762,8572433,8723698,8892697,9711001,9789264,4549188,6100831,6170064,6260799,6263653,6449936,6530871,6538978,7777651,8059269,8319918,8787049,8901150,9263153,9453207,9514738,9696700,9791062,5752018,6421452,7439134,7878923,9354763,9369285,9514396,9582506,9889949,9890216,4094311,4158495,4158496,6098128,5585661,3872564,6442149,5891604,6164746,6199593,6583474,6519684,9018490,9809006,4496897,5041324,5829430,6198319,6253504,6555763,7242914,7931055,8024125,8797814,8058559,8673347,8892695,8994420,9616219,9714970,9722004,9809439,9818918,6523177,8134147,9002915,9711422,9892713,9901719,9954210,9978435,5800810,6243518,6416114,6222251,6411974,6512456,5791953,6545606,9914780,5805540,6238986,6463838,6547680,9767049,9809437,9810885,9890855,6673493,9902036,4335521,6379871,6503799,6546077,8018765,9907556,9958433,9905855,9916179,9946741,9957877,5563344,6271838,6450815,7641128,7762567,7780592,8684810,8685786,8685787,8685788\n)\nGROUP BY opp.id;\n\nSELECT COUNT(dr.id)\n FROM deal_risks dr\n JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id\n WHERE dr.opportunity_id = 5563344\n# AND gdrt.group_id = usr.group_id\n\n\n\nEXPLAIN SELECT\n opp.id as opp_id, opp.uuid, opp.name,\n\ncfd.value,\ncfv.sequence,\ncfv.value,\n# MAX(cfd.value) AS max_cfd_value,\nusr.name AS owner_name,\nopp.value, opp.currency_code, opp.close_date, opp.remotely_created_at, opp.is_closed, opp.is_won,\nusr.uuid as owner_uuid,\nusr.photo_path as owner_photo,\nusr.id AS owner_id,\njt.name as owner_job,\nopp.stage_id, opp.stage_updated_at,\nacc.name AS acc_name, opp.stage_updated_at, acc.crm_provider_id AS acc_provider_id, opp.crm_provider_id AS opp_provider_id,\nrt.business_process_id AS pipeline_id\nFROM opportunities opp\n\nLEFT JOIN record_types rt ON opp.record_type_id = rt.id\nLEFT JOIN users usr ON opp.user_id = usr.id\nLEFT JOIN accounts acc ON opp.account_id = acc.id\nLEFT JOIN job_titles jt ON usr.job_title_id = jt.id\n\nLEFT JOIN crm_field_data cfd ON cfd.id = (SELECT sub_cfd.id\n FROM crm_field_data sub_cfd\n WHERE sub_cfd.object_id = opp.id\n AND sub_cfd.crm_field_id = 66810\n ORDER BY sub_cfd.updated_at DESC\n LIMIT 1)\n\nLEFT JOIN crm_field_values cfv ON cfv.crm_field_id = 66810 AND cfv.value = cfd.value\n\nWHERE opp.user_id IS NOT NULL\nAND opp.deleted_at IS NULL\nAND opp.is_closed = 0\n# AND opp.is_closed = 1\n# AND opp.is_won = 0\nAND opp.close_date >= '2024-01-01 00:00:00'\nAND opp.close_date <= '2024-12-31 23:59:59'\nAND usr.team_id = 1\n\n# and opp.id = 4823179\n\n# GROUP BY opp.id\nORDER BY\n cfv.sequence DESC,\n# opp.name\n# owner_name\n cfd.value\n# CAST(cfd.value AS UNSIGNED)\n# CAST(MAX(cfd.value) AS UNSIGNED)\n# (SELECT COUNT(dr.id)\n# FROM deal_risks dr\n# JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id\n# WHERE dr.opportunity_id = opp.id\n# AND dr.is_active = 1 AND gdrt.is_enabled = 1)\nDESC\n# LIMIT 75, 25\n;\n\n\n\nSELECT * FROM crm_field_values WHERE crm_field_id = 66810;\n\nSELECT f.id, f.crm_provider_id AS field_name, f.label, fd.object_id AS dealId, fd.value, fd.updated_at, fd.id, fd.created_at\nFROM crm_fields f\nINNER JOIN crm_field_data fd ON fd.crm_field_id = f.id\n WHERE (f.crm_configuration_id = 1)\n AND (f.object_type = 'opportunity')\n# AND (fd.object_id IN (4158331,4158483,4158495,4158496,6069574,6263970,6171615,6540943,6545606,5829430,6198319,6263653,6548381,7242914,8797814,7228149,7439134,7878923,8134147,9002915,9118219,9165534,9354763,9369285,9446720))\n AND (fd.object_id IN (4158460))\n AND (f.crm_provider_id IN ('ForecastCategoryName'))\n ORDER BY fd.object_id ASC, fd.updated_at DESC;\n\nselect * from crm_layouts where crm_configuration_id = 1;\nselect cf.* from crm_fields cf\njoin crm_layout_entities cle on cf.id = cle.crm_field_id\nwhere crm_layout_id = 1493;\n\nSELECT * FROM opportunities WHERE id = 4158460;\nSELECT * FROM crm_field_data WHERE object_id = 4158460;\n\nselect * from users where team_id = 1;\nSELECT * FROM users WHERE id = 7160;\nselect * from role_user where user_id = 3248;\n\nselect * from crm_field_values where crm_field_id = 66824;\n\nSELECT * FROM users WHERE id = 23470;\nselect * from crm_configurations;\n\n# ******************************************\nselect * from teams where id = 1038; # 23521, 966\nselect * from users where team_id = 1038;\nselect * from crm_configurations where id = 966;\nSELECT * FROM activities WHERE uuid_to_bin('e8dc7c34-31f6-4430-bd81-2d9d8f00dd07') = uuid; # 54965762\nSELECT * FROM activities WHERE uuid_to_bin('4b5727c0-69d1-428f-b8d9-b649055166e2') = uuid; # 54965764\nSELECT * FROM participants WHERE activity_id = 54965764;\n\nSELECT id, uuid, title, recording_state FROM activities WHERE uuid_to_bin('355f105d-5606-4379-b0c5-d91daf59f4ce') = uuid; # 54964075\nSELECT * FROM participants WHERE activity_id = 54964075;\nselect f.id, slug, title, tf.team_id from team_features tf JOIN features f on tf.feature_id = f.id\n where tf.team_id = 1038;\n\n\n# ****************************************** PD *************************\nselect * from teams where id = 1029;\nSELECT * FROM crm_configurations WHERE id = 957;\nSELECT * FROM activities WHERE uuid_to_bin('581a33cb-4343-44bd-ac0c-4a5cee71c5ec') = uuid; # 54963423\nSELECT * FROM activities WHERE uuid_to_bin('07238011-25fa-418e-838b-fb21e82b9ea2') = uuid; # 54963433\n\nSELECT * FROM activities WHERE uuid_to_bin('8b6bb2f7-e7a7-4aec-8806-fbfea7093ccd') = uuid; # 54963421\n\n# ****************************************** Close *************************\nselect * from teams where id = 1031;\nSELECT * FROM crm_configurations WHERE id = 959;\nSELECT * FROM activities WHERE uuid_to_bin('59c517e0-96c9-4dad-bfeb-b7bef72f8725') = uuid; # 54963517\n\n\nSELECT * FROM activities WHERE uuid_to_bin('07238011-25fa-418e-838b-fb21e82b9ea2') = uuid; # 54963433\n\nSELECT * FROM activities WHERE uuid_to_bin('d68311e3-ac34-49bd-bf04-88323a7e5352') = uuid; # 54966009\n\n# ****************************************** SF *************************\nSELECT * FROM activities WHERE uuid_to_bin('2bd4cfa3-4eb5-4c77-84a7-9ed46a21c988') = uuid;\n\nselect * from roles;\nselect * from permissions;\nselect * from permission_role where permission_id = 136;\n\nselect * from migrations order by id desc;\n\nselect * from teams where id IN (1, 1037);\nselect * from crm_layouts where crm_configuration_id = 1;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 1493;\nSELECT * FROM crm_fields WHERE id IN (1652,1661,66799,66814,66821,66836,66843,66846,66864,84752,182306,323580,380378);\n\nselect * from features;\nselect * from team_features where feature_id = 33;\nselect * from opportunities;\n\nselect * from teams;\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 = 1052 and sa.provider = 'hubspot';\n\nSELECT * FROM accounts where id = 11512582;\nselect * from activities where account_id = 11512582;","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Project","depth":3,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Project","depth":3,"bounds":{"left":0.025,"top":0.06666667,"width":0.050694443,"height":0.034444444},"on_screen":true,"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},"on_screen":false,"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},"on_screen":false,"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},"on_screen":false,"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},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
7748463095849305329
|
6524482065460761565
|
visual_change
|
accessibility
|
NULL
|
Project: faVsco.js, menu
#12066 on JY-20725-handle Project: faVsco.js, menu
#12066 on JY-20725-handle-HS-search-rate-limit, menu
Start Listening for PHP Debug Connections
HandleHubspotRateLimitTest
Run 'HandleHubspotRateLimitTest'
Debug 'HandleHubspotRateLimitTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
16
2
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Services\Crm\IntegrationApp;
use Carbon\Carbon;
use Jiminny\Contracts\Crm\Providers;
use Jiminny\Contracts\Services\Crm\ClientInterface;
use Jiminny\Contracts\Services\Crm\FetchRelatedActivityInterface;
use Jiminny\Contracts\Services\Crm\ImportsBusinessProcessesInterface;
use Jiminny\Contracts\Services\Crm\LayoutManagementInterface;
use Jiminny\Contracts\Services\Crm\MatchCrmEntitiesInterface;
use Jiminny\Contracts\Services\Crm\Provider\IntegrationAppInterface;
use Jiminny\Contracts\Services\Crm\RemoteEntityLookupInterface;
use Jiminny\Contracts\Services\Crm\RemoteEntityManipulationInterface;
use Jiminny\Contracts\Services\Crm\RemoteNoteEntityManipulationInterface;
use Jiminny\Contracts\Services\Crm\SendSummaryToCrmInterface;
use Jiminny\Contracts\Services\Crm\SettingsInterface;
use Jiminny\Contracts\Services\Crm\SyncCrmEntitiesInterface;
use Jiminny\Contracts\Services\Crm\SyncCrmMetadataInterface;
use Jiminny\Events\Activities\Crm\ActivityLeadConverted;
use Jiminny\Exceptions\CrmException;
use Jiminny\Exceptions\SocialAccountNotFoundException;
use Jiminny\Jobs\Crm\NoteObject;
use Jiminny\Models\Account;
use Jiminny\Models\Activity;
use Jiminny\Models\Contracts\ActivityContract;
use Jiminny\Models\Crm\Configuration;
use Jiminny\Models\Opportunity;
use Jiminny\Models\Stage;
use Jiminny\Models\User;
use Jiminny\Services\Crm\BaseService;
use Jiminny\Services\Crm\IntegrationApp\Config\IntegrationAppProviders;
use Jiminny\Services\Crm\IntegrationApp\Config\IntegrationConfigFactory;
use Jiminny\Services\Crm\IntegrationApp\DTO\Mappers\FieldMapperInterface;
use Jiminny\Services\Crm\IntegrationApp\DTO\Mappers\LeadFieldMapper;
use Jiminny\Services\Crm\IntegrationApp\DTO\Utils\GenerateProviderUrlInterface;
use Jiminny\Services\Crm\IntegrationApp\DTO\Utils\IntegrationAppCrmGeneratorFactory;
use Jiminny\Services\Crm\IntegrationApp\DTO\Utils\UrlGeneratorInterface;
use Jiminny\Services\Crm\IntegrationApp\ServiceTraits\SyncCrmFieldsTrait;
use Jiminny\Services\Crm\IntegrationApp\ServiceTraits\SystemStateTrait;
use Jiminny\Services\Crm\IntegrationApp\ServiceTraits\LayoutTrait;
use Jiminny\Services\Crm\IntegrationApp\ServiceTraits\MatchProspectsTrait;
use Jiminny\Services\Crm\IntegrationApp\ServiceTraits\NotSupportedTrait;
use Jiminny\Services\Crm\IntegrationApp\ServiceTraits\SyncCrmEntitiesTrait;
use Jiminny\Services\Crm\IntegrationApp\ServiceTraits\SyncCrmMetadataTrait;
use Psr\Log\LoggerInterface;
use Jiminny\Services\Crm\IntegrationApp\DTO\Mappers\OpportunityFieldMapper;
use Jiminny\Repositories\Crm\ProfileRepository;
use Jiminny\Repositories\Crm\OpportunityRepository;
use Jiminny\Models\Crm\Profile;
use Jiminny\Services\Crm\CrmObjects\CrmObjectsRepository;
class Service extends BaseService implements
IntegrationAppInterface,
SyncCrmEntitiesInterface,
SyncCrmMetadataInterface,
ImportsBusinessProcessesInterface,
RemoteEntityManipulationInterface,
LayoutManagementInterface,
SettingsInterface,
MatchCrmEntitiesInterface,
RemoteEntityLookupInterface,
RemoteNoteEntityManipulationInterface,
SendSummaryToCrmInterface,
UrlGeneratorInterface,
FetchRelatedActivityInterface
{
use SyncCrmMetadataTrait;
use SyncCrmEntitiesTrait;
use SystemStateTrait;
use LayoutTrait;
use NotSupportedTrait;
use MatchProspectsTrait;
use SyncCrmFieldsTrait;
public const string CALL_TYPE_MISSED = 'Missed';
public const string CALL_TYPE_INBOUND = 'Inbound';
public const string CALL_TYPE_OUTBOUND = 'Outbound';
public const string RELATIONSHIP_OPPORTUNITY = 'Deals';
public const string RELATIONSHIP_LEAD = 'Leads';
public const string RELATIONSHIP_ACCOUNT = 'Accounts';
/**
* @var ClientInterface&DataClient
*/
protected $client;
protected ?User $invokedUser = null;
protected ?GenerateProviderUrlInterface $crmUrlGenerator = null;
public function __construct(
DataClient $client,
LoggerInterface $logger,
) {
parent::__construct();
$this->client = $client;
$this->logger = $logger;
}
public function getDisplayName(): string
{
return Providers::getProviderDisplayName(
Providers::getCrmIntegrationSlug($this->config)
);
}
/**
* @throws \Exception
*/
public function setUser(User $user): void
{
$this->configureSentryScope($user);
$this->invokedUser = $user;
$this->team = $user->getTeam();
$teamOwner = $this->team->getOwner();
$this->setConfiguration($user->getTeam()->getCrmConfiguration());
$this->setEditionConfiguration(Providers::getCrmIntegrationSlug($this->config));
$this->setCrmUrlGenerator($this->config);
$this->client->setTeam($this->team);
$socialAccount = $teamOwner?->getSocialAccount('integration-app');
if ($socialAccount === null) {
$this->logger->info('[integration-app] Social account not found', [
'teamId' => $this->team->getId(),
'teamOwnerId' => $teamOwner?->getId(),
'userId' => $user->getId(),
]);
throw new SocialAccountNotFoundException('Social account not found!');
}
$this->client->setSocialAccount($socialAccount);
// The CRM Service is properly bootstrapped, and supports remote operations
$this->connect();
}
public function normalizeValue(string $fieldType, string $fieldValue, bool $internal = false): string
{
return $fieldValue;
}
public function find(string $name, array $scopes): array
{
/** @var LocalSearch $localSearch */
$localSearch = app(LocalSearch::class);
$localSearch->setConfiguration($this->config);
$localSearch->setCountryCode($this->invokedUser->getCountryCode());
return $localSearch->search($name);
// if (! empty($localMatch)) {
// return $localMatch;
// }
//
// /** @var RemoteSearch $remoteSearch */
// $remoteSearch = app(RemoteSearch::class);
// $remoteSearch->setClient($this->client);
// $remoteSearch->setConfiguration($this->config);
//
// return $remoteSearch->search($name);
}
public function findOpportunities(?string $crmAccountId, ?string $crmContactId, ?int $userId = null): array
{
$data = [];
$ownerData = [];
$account = $this->getAccount($crmAccountId, $crmContactId);
if ($account === null) {
return [];
}
$ownerId = $this->getOwnerId($userId);
try {
$opportunityRepository = app(OpportunityRepository::class);
$opportunities = $opportunityRepository->findAllByConfigurationAndAccountId(
$this->config,
$account->getId()
);
foreach ($opportunities as $opportunity) {
/** @var Opportunity $opportunity */
$record = $this->buildOpportunityData($opportunity);
if ($ownerId && $opportunity->getOwnerId() === $ownerId) {
$ownerData[] = $record;
}
$data[] = $record;
}
if (! empty($ownerData)) {
return $ownerData;
}
return $data;
} catch (\Exception $e) {
$this->logger->info('[integration-app] Failed to fetch opportunities', [
'contact' => $crmContactId,
'account' => $crmAccountId,
'owner' => $ownerId,
'error' => $e->getMessage(),
]);
return $data;
}
}
private function getOwnerId(?int $userId = null): ?string
{
if (! $userId) {
return null;
}
$profileRepository = app(ProfileRepository::class);
$profile = $profileRepository->findProfileByUserId($this->config, $userId);
return $profile instanceof Profile ? $profile->getCrmProviderId() : null;
}
private function getAccount(?string $crmAccountId = null, ?string $crmContactId = null): ?Account
{
$crmRepository = app(CrmObjectsRepository::class);
if ($crmAccountId === null) {
$contact = $crmRepository->findContactByCrmProviderId($this->config, $crmContactId);
return $contact->getAccount();
}
return $crmRepository->findAccountByCrmProviderId($this->config, $crmAccountId);
}
private function buildOpportunityData(Opportunity $opportunity): array
{
$record = [
'crmId' => $opportunity->getCrmProviderId(),
'name' => $opportunity->getName(),
'won' => $opportunity->isWon(),
'closed' => $opportunity->isClosed(),
];
if (! empty($opportunity->getFormattedValueAttribute())) {
$record['value'] = $opportunity->getFormattedValueAttribute();
}
if (! empty($opportunity->getStage())) {
$record['stage'] = [
'id' => $opportunity->getStage()->getUuid(),
'name' => $opportunity->getStage()->getName(),
];
}
return $record;
}
public function updateRecord(string $objectType, string $objectId, array $data, array $headers = []): void
{
$data = [
'data' => $this->normalizeData($objectType, $data),
];
$this->client->updateRecordById($objectType, $objectId, $data);
}
private function normalizeData(string $objectType, array $data): array
{
$fieldMapper = $this->getFieldMapper($objectType);
if (! $fieldMapper instanceof FieldMapperInterface) {
return $data;
}
return $fieldMapper->mapToCrmFields($data);
}
private function getFieldMapper(string $objectType): ?FieldMapperInterface
{
if ($objectType === self::OBJECT_OPPORTUNITY) {
return app(OpportunityFieldMapper::class);
}
if ($objectType === self::OBJECT_LEAD) {
return app(LeadFieldMapper::class);
}
return null;
}
public function getRecord(string $objectType, string $objectId, array $fields = []): array
{
return $this->client->getRecordById($objectType, $objectId);
}
public function getConfiguration(): Configuration
{
return $this->config;
}
public function setConfiguration(Configuration $config): void
{
$this->clearExternalMapCache();
$this->config = $config;
}
private function setEditionConfiguration(string $provider): void
{
$this->editionConfig = app(IntegrationConfigFactory::class)->create($provider);
}
public function setCrmUrlGenerator(Configuration $config): void
{
$this->crmUrlGenerator = app(IntegrationAppCrmGeneratorFactory::class)->create($config);
}
public function getCrmUrlGenerator(): ?GenerateProviderUrlInterface
{
if ($this->crmUrlGenerator === null) {
$this->setCrmUrlGenerator($this->config);
}
return $this->crmUrlGenerator;
}
public function subscribeEntityEvents(bool $enableTrigger = true): void
{
$eventStates = $this->client->updateEntityEventsState($enableTrigger);
$this->logger->info('[integration-app] Change team entity events subscription', [
'teamId' => $this->team->getId(),
'teamName' => $this->team->getName(),
'states' => $eventStates,
'action' => $enableTrigger ? 'subscribe' : 'unsubscribe',
]);
}
#[\Override] public function supportsNotes(): bool
{
return $this->editionConfig->supportsNotes();
}
#[\Override] public function saveNote(
string $title,
string $body,
string $objectId,
?NoteObject $noteObject = null,
): ?string {
if ($noteObject === null) {
return null;
}
$notePayload = [
'title' => $title,
'content' => $body,
'objectId' => $objectId,
'objectType' => $noteObject->value,
];
$result = $this->client->createNote($notePayload);
// debug saving note response
$this->logger->info('[integration-app] createNote response', [
'objectId' => $objectId,
'objectType' => $noteObject->value,
'result' => $result,
'hasId' => isset($result['id']),
]);
return $result['id'] ?? null;
}
/**
* @throws CrmException
*/
#[\Override] public function saveActivity(Activity $activity): Activity
{
$this->logger->info('[integration-app] saveActivity', [
'activity' => $activity->getUuid(),
'type' => $activity->getType(),
]);
if ($activity->getCrmType() === Activity::TYPE_CONFERENCE) {
$crmActivity = $this->saveMeeting($activity);
} elseif (in_array($activity->getType(), [Activity::TYPE_SOFTPHONE, Activity::TYPE_SOFTPHONE_INBOUND])) {
$crmActivity = $this->saveCall($activity);
} else {
throw new CrmException('Unsupported activity type');
}
$crmActivityId = $crmActivity['id'] ?? null;
if ($crmActivityId !== null) {
$activity->crm_provider_id = $crmActivityId;
$activity->save();
$this->logger->info('[integration-app] Activity successfully logged to CRM', [
'activity' => $activity->getUuid(),
'type' => $activity->getType(),
'crmId' => $crmActivityId,
]);
}
return $activity;
}
public function saveMeeting(Activity $activity): array
{
$decorateActivity = app(DecorateActivity::class);
$meetingPayload = [
'Event_Title' => $decorateActivity->generateTitle($activity),
'Start_DateTime' => $activity->getActualStartTime()->toIso8601String(),
'End_DateTime' => $activity->getActualEndTime()->toIso8601String(),
'ownerId' => $this->getActivityOwnerId($activity),
];
$payload = array_merge($meetingPayload, $this->attachToProspect($activity));
if ($activity->hasCrmProviderId()) {
$crmId = $activity->getCrmProviderId();
$meeting = $this->client->getMeeting($crmId);
$oldDescription = $meeting['fields']['Description'] ?? null;
$payload['Description'] = $decorateActivity->generateUpdatedDescription($oldDescription, $activity);
$this->logger->info('[integration-app] CRM update meeting', [
'activity' => $activity->getUuid(),
'crm_id' => $crmId,
'payload' => $payload,
]);
return $this->client->updateMeeting($crmId, $payload);
}
$payload['Description'] = $decorateActivity->generateDescription($activity);
$this->logger->info('[integration-app] CRM log meeting', [
'activity' => $activity->getUuid(),
'payload' => $payload,
]);
return $this->client->createMeeting($payload);
}
public function saveCall(Activity $activity): array
{
$decorateActivity = app(DecorateActivity::class);
$callPayload = [
'Call_Type' => $this->getCallType($activity),
'Call_Start_Time' => $activity->getActualStartTime()->toIso8601String(),
'Call_Duration' => $activity->getDuration(),
'name' => $decorateActivity->generateTitle($activity),
'ownerId' => $this->getActivityOwnerId($activity),
];
$payload = array_merge($callPayload, $this->attachToProspect($activity));
if ($activity->hasCrmProviderId()) {
$crmId = $activity->getCrmProviderId();
$call = $this->client->getCall($crmId);
$oldDescription = $call['fields']['Description'] ?? null;
$payload['description'] = $decorateActivity->generateUpdatedDescription($oldDescription, $activity);
$this->logger->info('[integration-app] CRM update call', [
'activity' => $activity->getUuid(),
'crm_id' => $crmId,
'payload' => $payload,
]);
return $this->client->updateCall($crmId, $payload);
}
$payload['description'] = $decorateActivity->generateDescription($activity);
$this->logger->info('[integration-app] CRM log call', [
'activity' => $activity->getUuid(),
'payload' => $payload,
]);
return $this->client->createCall($payload);
}
private function getCallType(Activity $activity): string
{
if ($activity->getStatus() === Activity::STATUS_NO_ANSWER) {
return self::CALL_TYPE_MISSED;
}
return $activity->getType() === Activity::TYPE_SOFTPHONE_INBOUND ? self::CALL_TYPE_INBOUND : self::CALL_TYPE_OUTBOUND;
}
private function attachToProspect(Activity $activity): array
{
$payload = [];
if ($activity->hasContact()) {
$payload['contactId'] = $activity->getContact()->getCrmProviderId();
}
if ($activity->hasOpportunity()) {
return array_merge(
$payload,
$this->buildBasicPayload(
self::RELATIONSHIP_OPPORTUNITY,
$activity->getOpportunity()->getCrmProviderId()
)
);
}
if ($activity->hasAccount() && ! $activity->getAccount()->getIsInternal()) {
return array_merge(
$payload,
$this->buildBasicPayload(
self::RELATIONSHIP_ACCOUNT,
$activity->getAccount()->getCrmProviderId()
)
);
}
if ($activity->hasLead()) {
$payload = $this->handleLeadPayload($activity);
}
return $payload;
}
private function handleLeadPayload(Activity $activity): array
{
$freshLead = $this->syncLead($activity->getLead()->getCrmProviderId());
$lead = $freshLead ?? $activity->getLead();
if ($lead->getConvertedAt() === null) {
return $this->buildBasicPayload(self::RELATIONSHIP_LEAD, $lead->getCrmProviderId());
}
$activity->lead_id = null;
if ($lead->hasAccount()) {
$account = $lead->getAccount();
$activity->account_id = $account->getId();
$payload = $this->buildBasicPayload(self::RELATIONSHIP_ACCOUNT, $account->getCrmProviderId());
} else {
$payload = [];
}
if ($lead->hasOpportunity()) {
$opportunity = $lead->getOpportunity();
$payload = $this->buildBasicPayload(self::RELATIONSHIP_OPPORTUNITY, $opportunity->getCrmProviderId());
$activity->opportunity_id = $opportunity->getId();
$activity->value = $opportunity->value;
$activity->stage_id = $opportunity->stage_id;
} else {
$activity->stage_id = null;
}
if ($lead->hasContact()) {
$contact = $lead->getContact();
$payload['contactId'] = $contact->getCrmProviderId();
$activity->contact_id = $contact->getId();
}
$activity->save();
event(new ActivityLeadConverted($activity, $lead));
$this->logger->info('[integration-app] Lead converted', [
'activityUuid' => $activity->getUuid(),
'leadUuid' => $lead->getUuid(),
]);
return $payload;
}
private function buildBasicPayload(string $type, string $id): array
{
return [
'type' => $type,
'id' => $id,
];
}
private function getActivityOwnerId(Activity $activity): ?string
{
$ownerId = null;
if ($activity->hasUser() && $activity->getUser()->getProfile() !== null) {
$ownerId = $activity->getUser()->getProfile()->getCrmProviderId();
}
return $ownerId;
}
#[\Override] public function saveFollowupActivity(Activity $activity, array $fields): ?string
{
$taskPayload = [
'subject' => $fields['subject'],
'dueTime' => isset($fields['dueDate']) ? Carbon::parse($fields['dueDate'])->format('Y-m-d') : null,
'ownerId' => $this->getActivityOwnerId($activity),
];
if (isset($fields['status'])) {
$taskPayload['status'] = $fields['status'];
}
if (isset($fields['priority'])) {
$taskPayload['priority'] = $fields['priority'];
}
if (isset($fields['content'])) {
$taskPayload['content'] = $fields['content'];
}
$payload = array_merge($taskPayload, $this->attachToProspect($activity));
$this->logger->info('[integration-app] CRM log follow up task', [
'activity' => $activity->getUuid(),
'payload' => $payload,
]);
$task = $this->client->createTask($payload);
return $task['id'] ?? null;
}
#[\Override] public function saveTranscriptionSummaryAsNote(
ActivityContract $activity,
string $title,
string $body,
?string $objectId,
?NoteObject $noteObject = null,
): ?string {
// We have to find a way to store the transcription summary
// This might be possible either by Tasks, Events, Engagements & Notes
// Find what the CRM supports and save the note with the appropriate object(eg Notes)
// For now use only Notes as both ZOHO & Salesforce support them.
if ($this->supportsNotes() && $objectId !== null) {
$this->logger->info('[integration-app] saving note', [
'activityId' => $activity->getUuid(),
'objectId' => $objectId,
]);
return $this->saveNote($title, $body, $objectId, $noteObject);
}
$this->logger->info('[integration-app] skip saveTranscriptionSummaryAsNote', [
'activityId' => $activity->getUuid(),
'supportsNotes' => $this->supportsNotes(),
'objectId' => $objectId,
]);
return null;
}
public function generateProviderUrl(string $providerId, string $objectType): ?string
{
return $this->getCrmUrlGenerator()?->generateProviderUrl($providerId, $objectType);
}
public function updateStage($crmObject, Stage $stage): void
{
$objectType = $stage->getType();
$objectId = $crmObject->getCrmProviderId();
$params = ['stageName' => $stage->getCrmProviderId()];
$this->logger->info('[integration-app] updateStage', [
'objectType' => $objectType,
'objectId' => $objectId,
'params' => $params,
]);
$data = [
'data' => $this->normalizeData($objectType, $params),
];
if ($objectType === Stage::TYPE_LEAD) {
$this->client->updateLead($objectId, $data);
} else {
$this->client->updateDeal($objectId, $data);
}
}
/**
* @throws \Exception
*/
public function fetchAndAssociateRelatedActivity(Activity $activity): ?Activity
{
if ($activity->getCrm()?->getEdition() !== IntegrationAppProviders::ZOHO_CRM) {
return null;
}
if (! $activity->isTypeConference()) {
return null;
}
// The related activity is already linked.
if ($activity->hasCrmProviderId()) {
return $activity;
}
if ($activity->hasActualStartTime() === false) {
return null;
}
return $this->fetchAndAssociateZohoRelatedActivity($activity);
}
public function fetchAndAssociateZohoRelatedActivity(Activity $activity): ?Activity
{
try {
$meeting = $this->fetchRelatedZohoActivity($activity);
if (empty($meeting)) {
$this->logger->info('[integration-app] fetchRelatedZohoActivity No related activity found', [
'activity' => $activity->getUuid(),
]);
return null;
}
$decorateActivity = app(DecorateActivity::class);
$oldDescription = $meeting['Description'] ?? '';
$updatedDescription = $decorateActivity->generateUpdatedDescription($oldDescription, $activity);
$this->logger->info('[integration-app] fetchAndAssociateZohoRelatedActivity updating related activity', [
'activity' => $activity->getUuid(),
'description' => $updatedDescription,
]);
$this->client->updateMeeting($meeting['id'], ['Description' => $updatedDescription]);
// Update our activity to reflect the remote data.
$activity->update([
'crm_provider_id' => $meeting['id'],
'summary' => $meeting['Description'],
]);
return $activity;
} catch (\Exception $exception) {
\Sentry::captureException($exception);
throw $exception;
}
}
public function fetchRelatedZohoActivity(Activity $activity): array
{
[$from, $to] = $this->getFromToDates($activity);
$start = $from?->toIso8601String(); // e.g., 2025-07-01T00:00:00+00:00
$end = $to?->toIso8601String(); // e.g., 2025-07-14T23:59:59+00:00
if ($start === null || $end === null) {
$this->logger->info(
'[integration-app] fetchRelatedZohoActivity missing start or end date',
[
'activity' => $activity->getUuid(),
'start' => $start,
'end' => $end,
'from' => $from,
'to' => $to,
]
);
return [];
}
$whoId = null;
$whatId = null;
$criteriaParts = [];
if ($activity->getContact()) {
$whoId = $activity->getContact()->getCrmProviderId();
$criteriaParts[] = "(Who_Id:equals:$whoId)";
}
if ($activity->getOpportunity()) {
$whatId = $activity->getOpportunity()->getCrmProviderId();
} elseif ($activity->getAccount() && $activity->getAccount()->getIsInternal() === false) {
$whatId = $activity->getAccount()->getCrmProviderId();
} elseif ($activity->getLead()) {
$whatId = $activity->getLead()->getCrmProviderId();
}
if ($whatId !== null) {
$criteriaParts[] = "(What_Id:equals:$whatId)";
}
if ($whoId === null && $whatId === null) {
$this->logger->info(
'[integration-app] fetchRelatedZohoActivity cannot find prospect',
[
'activity' => $activity->getUuid(),
]
);
return [];
}
$criteriaParts[] = "(Start_DateTime:greater_equal:$start)";
$criteriaParts[] = "(End_DateTime:less_equal:$end)";
$criteria = implode(' AND ', $criteriaParts);
$params = [
'criteria' => $criteria,
'sort_by' => 'Modified_Time',
'sort_order' => 'desc',
];
$this->logger->info(
'[integration-app] fetchRelatedZohoActivity searching for related activity',
[
'activity' => $activity->getUuid(),
'params' => $params,
]
);
$meetings = $this->client->searchMeetings($params);
if (! empty($meetings)) {
return $meetings[0];
}
return [];
}
private function getFromToDates(Activity $activity): array
{
$calendarEvent = $activity->calendarEvent()->first();
$from = $calendarEvent?->getStartTime();
$to = $calendarEvent?->getEndTime();
if (! $from || ! $to) {
$from = $activity->hasScheduledStartTime()
? $activity->getScheduledStartTime()
: $activity->getActualStartTime();
$to = $activity->hasScheduledEndTime()
? $activity->getScheduledEndTime()->addMinutes(15)
: $activity->getActualEndTime();
}
return [$from, $to];
}
}
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
8
1
3
4
Previous Highlighted Error
Next Highlighted Error
SELECT
# DISTINCT
opp.id as opp_id, opp.uuid, opp.name,
# COUNT(dr.id) AS deal_risk_count,
# dr.id,
# cfd.value,
usr.name AS owner_name,
opp.value, opp.currency_code, opp.close_date, opp.remotely_created_at, opp.is_closed, opp.is_won,
usr.uuid as owner_uuid,
usr.photo_path as owner_photo,
usr.id AS owner_id,
jt.name as owner_job,
opp.stage_id, opp.stage_updated_at,
acc.name AS acc_name, opp.stage_updated_at, acc.crm_provider_id AS acc_provider_id, opp.crm_provider_id AS opp_provider_id,
rt.business_process_id AS pipeline_id
FROM opportunities opp
LEFT JOIN record_types rt ON opp.record_type_id = rt.id
LEFT JOIN users usr ON opp.user_id = usr.id
LEFT JOIN accounts acc ON opp.account_id = acc.id
LEFT JOIN job_titles jt ON usr.job_title_id = jt.id
# LEFT JOIN group_deal_risk_types gdrt ON gdrt.group_id = usr.group_id
# LEFT JOIN deal_risks dr ON dr.opportunity_id = opp.id AND dr.group_deal_risk_type_id = gdrt.id
LEFT JOIN crm_field_data cfd ON (cfd.object_id = opp.id and cfd.crm_field_id = 66814)
WHERE opp.user_id IS NOT NULL
AND opp.deleted_at IS NULL
AND opp.is_closed = 1
AND opp.is_won = 0
AND opp.close_date >= '2024-01-01 00:00:00'
AND opp.close_date <= '2024-12-31 23:59:59'
AND usr.team_id = 1
# and opp.id = 4823179
GROUP BY opp.id, cfd.value
ORDER BY
# cfd.value
CAST(cfd.value AS UNSIGNED)
# owner_name
# (SELECT COUNT(dr.id)
# FROM deal_risks dr
# JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id
# WHERE dr.opportunity_id = opp.id
# AND dr.is_active = 1
# AND gdrt.is_enabled = 1)
DESC
LIMIT 25
# OFFSET 0
;
select * from crm_fields where crm_configuration_id = 1 and object_type = 'opportunity';
select * from crm_layout_entities where crm_layout_id = 1493;
SELECT * FROM opportunities WHERE id = 4584045;
SELECT * FROM crm_field_data WHERE object_id = 4584045;
SELECT * FROM opportunities where team_id = 1 and crm_provider_id = '0061K00000lfb9IQAQ'
SELECT
opp.id as opportunity_id,
opp.name,
COUNT(dr.id) as risk_count
FROM opportunities opp
LEFT JOIN deal_risks dr ON dr.opportunity_id = opp.id
WHERE opp.id IN (
6069574,8900938,9507638,9524799,9660490,9662824,9705675,9749758,4158460,4391812,6450439,4448422,5118945,5590675,4584045,7228149,9002408,9165534,9446720,9641778,9665149,9703344,9709280,5747948,4158491,6182565,6263970,5798120,5111315,4536978,6062352,6548383,6072095,6548225,4480986,5011422,6548381,8760540,8917554,9509986,9514392,9569009,9569011,9578490,9713604,5784397,7276612,7288405,8994421,9118219,9608148,9818911,4510535,6479693,5958049,6271674,6550448,4158331,4158483,6126571,6171615,6540943,4897466,5190896,5796182,5932762,8572433,8723698,8892697,9711001,9789264,4549188,6100831,6170064,6260799,6263653,6449936,6530871,6538978,7777651,8059269,8319918,8787049,8901150,9263153,9453207,9514738,9696700,9791062,5752018,6421452,7439134,7878923,9354763,9369285,9514396,9582506,9889949,9890216,4094311,4158495,4158496,6098128,5585661,3872564,6442149,5891604,6164746,6199593,6583474,6519684,9018490,9809006,4496897,5041324,5829430,6198319,6253504,6555763,7242914,7931055,8024125,8797814,8058559,8673347,8892695,8994420,9616219,9714970,9722004,9809439,9818918,6523177,8134147,9002915,9711422,9892713,9901719,9954210,9978435,5800810,6243518,6416114,6222251,6411974,6512456,5791953,6545606,9914780,5805540,6238986,6463838,6547680,9767049,9809437,9810885,9890855,6673493,9902036,4335521,6379871,6503799,6546077,8018765,9907556,9958433,9905855,9916179,9946741,9957877,5563344,6271838,6450815,7641128,7762567,7780592,8684810,8685786,8685787,8685788
)
GROUP BY opp.id;
SELECT COUNT(dr.id)
FROM deal_risks dr
JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id
WHERE dr.opportunity_id = 5563344
# AND gdrt.group_id = usr.group_id
EXPLAIN SELECT
opp.id as opp_id, opp.uuid, opp.name,
cfd.value,
cfv.sequence,
cfv.value,
# MAX(cfd.value) AS max_cfd_value,
usr.name AS owner_name,
opp.value, opp.currency_code, opp.close_date, opp.remotely_created_at, opp.is_closed, opp.is_won,
usr.uuid as owner_uuid,
usr.photo_path as owner_photo,
usr.id AS owner_id,
jt.name as owner_job,
opp.stage_id, opp.stage_updated_at,
acc.name AS acc_name, opp.stage_updated_at, acc.crm_provider_id AS acc_provider_id, opp.crm_provider_id AS opp_provider_id,
rt.business_process_id AS pipeline_id
FROM opportunities opp
LEFT JOIN record_types rt ON opp.record_type_id = rt.id
LEFT JOIN users usr ON opp.user_id = usr.id
LEFT JOIN accounts acc ON opp.account_id = acc.id
LEFT JOIN job_titles jt ON usr.job_title_id = jt.id
LEFT JOIN crm_field_data cfd ON cfd.id = (SELECT sub_cfd.id
FROM crm_field_data sub_cfd
WHERE sub_cfd.object_id = opp.id
AND sub_cfd.crm_field_id = 66810
ORDER BY sub_cfd.updated_at DESC
LIMIT 1)
LEFT JOIN crm_field_values cfv ON cfv.crm_field_id = 66810 AND cfv.value = cfd.value
WHERE opp.user_id IS NOT NULL
AND opp.deleted_at IS NULL
AND opp.is_closed = 0
# AND opp.is_closed = 1
# AND opp.is_won = 0
AND opp.close_date >= '2024-01-01 00:00:00'
AND opp.close_date <= '2024-12-31 23:59:59'
AND usr.team_id = 1
# and opp.id = 4823179
# GROUP BY opp.id
ORDER BY
cfv.sequence DESC,
# opp.name
# owner_name
cfd.value
# CAST(cfd.value AS UNSIGNED)
# CAST(MAX(cfd.value) AS UNSIGNED)
# (SELECT COUNT(dr.id)
# FROM deal_risks dr
# JOIN group_deal_risk_types gdrt ON dr.group_deal_risk_type_id = gdrt.id
# WHERE dr.opportunity_id = opp.id
# AND dr.is_active = 1 AND gdrt.is_enabled = 1)
DESC
# LIMIT 75, 25
;
SELECT * FROM crm_field_values WHERE crm_field_id = 66810;
SELECT f.id, f.crm_provider_id AS field_name, f.label, fd.object_id AS dealId, fd.value, fd.updated_at, fd.id, fd.created_at
FROM crm_fields f
INNER JOIN crm_field_data fd ON fd.crm_field_id = f.id
WHERE (f.crm_configuration_id = 1)
AND (f.object_type = 'opportunity')
# AND (fd.object_id IN (4158331,4158483,4158495,4158496,6069574,6263970,6171615,6540943,6545606,5829430,6198319,6263653,6548381,7242914,8797814,7228149,7439134,7878923,8134147,9002915,9118219,9165534,9354763,9369285,9446720))
AND (fd.object_id IN (4158460))
AND (f.crm_provider_id IN ('ForecastCategoryName'))
ORDER BY fd.object_id ASC, fd.updated_at DESC;
select * from crm_layouts where crm_configuration_id = 1;
select cf.* from crm_fields cf
join crm_layout_entities cle on cf.id = cle.crm_field_id
where crm_layout_id = 1493;
SELECT * FROM opportunities WHERE id = 4158460;
SELECT * FROM crm_field_data WHERE object_id = 4158460;
select * from users where team_id = 1;
SELECT * FROM users WHERE id = 7160;
select * from role_user where user_id = 3248;
select * from crm_field_values where crm_field_id = 66824;
SELECT * FROM users WHERE id = 23470;
select * from crm_configurations;
# [PASSWORD_DOTS]
select * from teams where id = 1038; # 23521, 966
select * from users where team_id = 1038;
select * from crm_configurations where id = 966;
SELECT * FROM activities WHERE uuid_to_bin('e8dc7c34-31f6-4430-bd81-2d9d8f00dd07') = uuid; # 54965762
SELECT * FROM activities WHERE uuid_to_bin('4b5727c0-69d1-428f-b8d9-b649055166e2') = uuid; # 54965764
SELECT * FROM participants WHERE activity_id = 54965764;
SELECT id, uuid, title, recording_state FROM activities WHERE uuid_to_bin('355f105d-5606-4379-b0c5-d91daf59f4ce') = uuid; # 54964075
SELECT * FROM participants WHERE activity_id = 54964075;
select f.id, slug, title, tf.team_id from team_features tf JOIN features f on tf.feature_id = f.id
where tf.team_id = 1038;
# [PASSWORD_DOTS] PD [PASSWORD_DOTS]
select * from teams where id = 1029;
SELECT * FROM crm_configurations WHERE id = 957;
SELECT * FROM activities WHERE uuid_to_bin('581a33cb-4343-44bd-ac0c-4a5cee71c5ec') = uuid; # 54963423
SELECT * FROM activities WHERE uuid_to_bin('07238011-25fa-418e-838b-fb21e82b9ea2') = uuid; # 54963433
SELECT * FROM activities WHERE uuid_to_bin('8b6bb2f7-e7a7-4aec-8806-fbfea7093ccd') = uuid; # 54963421
# [PASSWORD_DOTS] Close [PASSWORD_DOTS]
select * from teams where id = 1031;
SELECT * FROM crm_configurations WHERE id = 959;
SELECT * FROM activities WHERE uuid_to_bin('59c517e0-96c9-4dad-bfeb-b7bef72f8725') = uuid; # 54963517
SELECT * FROM activities WHERE uuid_to_bin('07238011-25fa-418e-838b-fb21e82b9ea2') = uuid; # 54963433
SELECT * FROM activities WHERE uuid_to_bin('d68311e3-ac34-49bd-bf04-88323a7e5352') = uuid; # 54966009
# [PASSWORD_DOTS] SF [PASSWORD_DOTS]
SELECT * FROM activities WHERE uuid_to_bin('2bd4cfa3-4eb5-4c77-84a7-9ed46a21c988') = uuid;
select * from roles;
select * from permissions;
select * from permission_role where permission_id = 136;
select * from migrations order by id desc;
select * from teams where id IN (1, 1037);
select * from crm_layouts where crm_configuration_id = 1;
SELECT * FROM crm_layout_entities WHERE crm_layout_id = 1493;
SELECT * FROM crm_fields WHERE id IN (1652,1661,66799,66814,66821,66836,66843,66846,66864,84752,182306,323580,380378);
select * from features;
select * from team_features where feature_id = 33;
select * from opportunities;
select * from teams;
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 = 1052 and sa.provider = 'hubspot';
SELECT * FROM accounts where id = 11512582;
select * from activities where account_id = 11512582;
Project
Project
New File or Directory…
Expand Selected
Collapse All
Options...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
45519
|
1628
|
32
|
2026-05-14T14:40:54.932563+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-14/1778 /Users/lukas/.screenpipe/data/data/2026-05-14/1778769654932_m2.jpg...
|
PhpStorm
|
faVsco.js – IntegrationApp/Service.php
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Jiminny... ~ActivityFilesLater@ jiminny-x-integrat Jiminny... ~ActivityFilesLater@ jiminny-x-integrati• plattorm-inner-teamE Channels# ai-chapter# alertsi backend# bugscontusion-cllnia# curiosity lab# engineering# general#jiminny-bgac nlattorm-nckets# product launches# random# releases# sofia-officed sunport# thank-yous# the people of iimi... Direct messages• 8la 62% Galya Dimitrovavasil VasilevM Stefka StovanovaSg: Todor StamatovMario GeorgievNiudlay lanay. James Graham "* Stoyan Tanevo Stelivan Georgiev( Petko Kashinski*. Lukas Kovali...::: AnnsToastS lira Gloud6d Huddle with Aneliva Angelova* Aneliya Angelova &• Messagest Add canvasur FilesAneliya Angelova 2:30 PMЛукаш, само при Сейлсфорс и Хубспот се синкваха активити типовете, когато се направи плейбук,нали?пои останалите скМі тоябва оъчно ла се въвелат.Lukas Kovalik 2:47 PMтряова да се за всички, някъде не се ли попьлвапри зохо май беше hardcoded но май и там си връщаха две категорииAneliya Angelova 4:00 PMЛукаш имаш ли време да се чуем за тестването на https://jiminny.atlassian.net/browse/JY-20725X Preuiew in sact[HubSpotl Optimise CRM rematct(7 OpenRosdy for OA- MediumAA Aneliya AngelovaAs of today at 4:00 PM RetreshOpen in Jira* SummariseLukas Kovalik 4:02 PMzean-iurwiniareelYou joined the huddle (LIVE 4:06 PMAneliva Angelova is here toolAneliva Angelova 4:44 PN11512582Lukas Kovalik M 5.16 PNcurl --location "httns:ani.hubani.com/crm/v3/obiects/contacts/search--header 'Content-vne' annlication/ison'--header "Authorization: BearerC|Kvma?iMx7OINOM8kOFwrAowAcAkUAhIR24?A05D?xiVrIYMILuP6SA01Kwcmhr=n.v2 hytorDniMvDalYck-CMalovolNOM9kOFwrAUAcrkcaws-ThwRARIRAOF-ATFSAOFRAO-ROIEBAQUBEggBAQEBAYICFIr7Au8O2Nwal9YW2CbCCxYvwngmSgNldTFSAFoAYABoAHAAeAA'\--data "{ "limit", 13'Message Aneliva Angelova+ AaIAl Notes: OffLeavev Q SearchDate ModifiedYesterdav at 13.35Yesterday at 13:34Yesterday at 13.33Yesterdav at 13:33Yesterday at 13:32Yesterday at 13:32Yesterday at 13:31Yesterday at 13.30Yesterdav at 13:29Yesterday at 13:29resterday at 15.2oYesterdav at 13:28Yesterday at 13:27Yesterday at 13:26Yesterdav at 13:26resterday at 13-40Yesterdav at 13:24Yesterday at 13:24Yesterday at 13:23Yesterday at 13.20Yesterdav at 13:20Yesterdav at 13:19Yesterday at 13:19Yesterday at 13:18Yesterday at 13:18Yesterday at 13.17Yecterdav at 12:16Yesterdav at 13:16Yesterday at 13.10Yesterdav at 13:15Yesterday at 13:14Yesterday at 13:13Yecterdav at 12:12Yesterdav at 13:12Yesterday at 13.12Yesterdav at 13:11Yesterday at 13:11Yesterday at 13:10Yoctorday at 12:00Yesterdav at 13:09Yesterday at 13.08Yocterdav at 12:08Yesterdav at 13:07Yesterdav at 13:0616 K:MPEG-4 movie17 KB29 KBMDEG-A movieMPEG-4 movieMPEG-4 movie12 KE9 KBMPE0"4 movie8 K:37 KB10 KBIKBnMDSG-A movieMP2G-4 movie8 KBI9 KB8 KB72 K:MPEG-4 movieMPEG-4 movie14 KB13 KBMoECA movieMPEG-4 movie18 KBI12 KB10 KBMPEG-1 movidMPEG-4 movie16 KEMPEG-4 movie6 KB MPEG-4 movie6 KB12 KB|MPEG-4 movie23 KBMDSG.A movicMPEG-4 movie6KE11 KBMPEG-4 movieMPEG-4 movie11 KBMPEG-4 movie20 K:MPEG-4 movie2AKR10 KB7 KBMDEGA movidMPEG-4 movie5KPMDEG-A movie11 KBMPEG-4 movie26 KBMPEG-4 movie111 K:102 KB88 KB59 KBMPEG-4 movieMDEC.A moviaMPEG-4 movieO9 KR97 KB66 KBMDEG-A movieMPEG-4 movie44K:MPSG-A movid93 KBMPEG-4 movie78 KB50 KB59 KPMPEG-4 movieMDEG.A movio27 KBMPEG-4 movie12 K:32 KBMDEC A movid17 KB19K8MPEG-4 movie• • CFavourites• jiminny• Recents* ApplicationsiCloud• iCloud Drive992 Svnc tolde0 DXP4800PLUS-B5F49 Networl• CRMI• Orange• Red|• Yellow• Green• Purple•) All lags..IhlDownloadsNameLoom.pkgAlfred copv.alfredoreterences=KeychronAssist-1.0.2 (1).dmeKeychronAssist-1.0.2.dmgmazanoke-images-yWJo.zioPhotos-3-001.zip• Transcript.pd→mage U.loge1 Orioninstaller.dma_image.jpg- image (2).1pc• ПO-22221726037035-004-001_ORGES.pdf%D0%9F%D0%9E-22221726037035-004-001 archive.zipПO-22221726037035-004-001_archive (1).zip• repon 4).XmAltred copy2.altredoreterencesСE 060209С О000000026571172 CWICT 0Р70501260015900 ndt= 27022026_0000000026574472_ SWIFT_ [IBAN].pdf= 03042026 [CREDIT_CARD] SWIFT [CREDIT_CARD].001reportxmmi=pdt.odiB pdf-1.pdfD pdf-2.pdf-pdf-5.pd1= ndf-1 ndipdf-3.pdfP Kdf-a,k Ffmiv Tree.sebitwarden export 20251031122528.isonlKoválik Family Tree.zip*macOS Storage_Cleanup.mdal favicon icofirst aid_notes_complete.docxrenortl2).esv1 config.vmlIteration run Search HS.postman_collection.jsonm licence bettertouchtoalMariusHosting Config.isonnokc.901a6502.6667.A62h-062 ccu•AlfredwPmazanoko.imnaoc.YWIfана Ковалик.jpg•искане даниел Ковалик..pg• Фактура Март Даниел Ковалик.jрс• Фактура Април Даниел Ковалик iро• Dhotac 2.001Q SearchKind00,4 MD55.9 MBinstdlle..dckageAlfred...ferences10,1 MB10,1 MBIL MBDisk ImageDisk ImageLiP archive6.6 MBZIp archive2,5 MB PDF Document2,5 MBJreo lmage2.2 MBDisk Image2,2 MB PDF Document2 MBJPEG image1,9 MBJPEG imaqe192 KBPDE Document140 KbZIP archive148 KВ148 KB122 KBZIP archivelZIP archiveXML document111 KBAlfred...ferences94 KBDDE Documont92 KBPDr DocumentK:PDF Document91 KB91 KBXML document30 KBn0kpDDE Nocumont28 KBPDF Document28 KRPDE Document28 KB27 KBDocument14 KB11 KB6 KB6KBJSONINCV NacumontZIP archiveMarkdo…..ument5KRWindo...n image4 KB3 KBword ..cumentCSV Document2 KBVAMI dosumon1 KB029 buteccSV Documenthttlicence183 bytesZero butesJSONAlfrod foronso!Zero bytesFolde1.9 MB1,8 MB17 MB1,7 MBColdorJPEG imageJPEG ImageIPEG imadeJPEG imageColdo1 of 58 selected, 8.43 GB availabld• Inu 14 Mаy 1/.40:04)Date AddedIs Mdl ZUzo dl 19:4530 Jan 2026 at 12:3617 Mar 2026 at 20:2717 Mar 2026 at 20:26Z3 Aor 2020 al 13:0229 ,Jan 2026 at 15:2019 Dec 2025 at 10:1619 Dec 2025 at 12:238 Aor 2026 at 20:3519 Dec 2025 at 10:2919 Dec 2025 at 12:1819 Dec 2025 at 12:4026 Mar 2026 at 11:2410 May 2026 at 13:5326 Mar 2026 at 11:2426 Mar 2026 at 11:2426 Mar 2026 at 11:2310 May 2026 at 14:3730 Jan 2026 at 12:3712 Goh 2006 9t 11:5 A1Z3 Apr 2026 at 13.0823 Aor 2026 at 13:0810 May 2026 at 13:5410 May 2026 at 14:3710 May 2026 at 13:4910 May 2026 at 13:5010 May 2026 at 13:5110 Mav 2026 at 12:51110 May 2026 at 13:5019 Dec 2025 at 11:3431 Oct 2025 at 12:2525 Nau 2025 4+ 17:506 Mar 2026 at 11.2224 Anr 2026 at 16:5220 Oct 2025 at 11:0218 Mar 2026 at 15:29• Mav 2026 at 11:09129 Oct 2025 at 19:329 May 2026 at 10:0419 Mar 2026 at 11:55|10 May 2026 at 13:5712 Jun 2025 at 19:0430 Jan 2026 at 12:362616 Oct 2025 aт 16:0122 Aar 2026 at 12:0223 Apr 2026 at 13:0223 Apr 2026 at 13:0222 Anr 2026 at 12:0223 Apr 2026 at 13:0229 Jan 2026 at 15:20...
|
NULL
|
-5443114342615826628
|
NULL
|
click
|
ocr
|
NULL
|
Jiminny... ~ActivityFilesLater@ jiminny-x-integrat Jiminny... ~ActivityFilesLater@ jiminny-x-integrati• plattorm-inner-teamE Channels# ai-chapter# alertsi backend# bugscontusion-cllnia# curiosity lab# engineering# general#jiminny-bgac nlattorm-nckets# product launches# random# releases# sofia-officed sunport# thank-yous# the people of iimi... Direct messages• 8la 62% Galya Dimitrovavasil VasilevM Stefka StovanovaSg: Todor StamatovMario GeorgievNiudlay lanay. James Graham "* Stoyan Tanevo Stelivan Georgiev( Petko Kashinski*. Lukas Kovali...::: AnnsToastS lira Gloud6d Huddle with Aneliva Angelova* Aneliya Angelova &• Messagest Add canvasur FilesAneliya Angelova 2:30 PMЛукаш, само при Сейлсфорс и Хубспот се синкваха активити типовете, когато се направи плейбук,нали?пои останалите скМі тоябва оъчно ла се въвелат.Lukas Kovalik 2:47 PMтряова да се за всички, някъде не се ли попьлвапри зохо май беше hardcoded но май и там си връщаха две категорииAneliya Angelova 4:00 PMЛукаш имаш ли време да се чуем за тестването на https://jiminny.atlassian.net/browse/JY-20725X Preuiew in sact[HubSpotl Optimise CRM rematct(7 OpenRosdy for OA- MediumAA Aneliya AngelovaAs of today at 4:00 PM RetreshOpen in Jira* SummariseLukas Kovalik 4:02 PMzean-iurwiniareelYou joined the huddle (LIVE 4:06 PMAneliva Angelova is here toolAneliva Angelova 4:44 PN11512582Lukas Kovalik M 5.16 PNcurl --location "httns:ani.hubani.com/crm/v3/obiects/contacts/search--header 'Content-vne' annlication/ison'--header "Authorization: BearerC|Kvma?iMx7OINOM8kOFwrAowAcAkUAhIR24?A05D?xiVrIYMILuP6SA01Kwcmhr=n.v2 hytorDniMvDalYck-CMalovolNOM9kOFwrAUAcrkcaws-ThwRARIRAOF-ATFSAOFRAO-ROIEBAQUBEggBAQEBAYICFIr7Au8O2Nwal9YW2CbCCxYvwngmSgNldTFSAFoAYABoAHAAeAA'\--data "{ "limit", 13'Message Aneliva Angelova+ AaIAl Notes: OffLeavev Q SearchDate ModifiedYesterdav at 13.35Yesterday at 13:34Yesterday at 13.33Yesterdav at 13:33Yesterday at 13:32Yesterday at 13:32Yesterday at 13:31Yesterday at 13.30Yesterdav at 13:29Yesterday at 13:29resterday at 15.2oYesterdav at 13:28Yesterday at 13:27Yesterday at 13:26Yesterdav at 13:26resterday at 13-40Yesterdav at 13:24Yesterday at 13:24Yesterday at 13:23Yesterday at 13.20Yesterdav at 13:20Yesterdav at 13:19Yesterday at 13:19Yesterday at 13:18Yesterday at 13:18Yesterday at 13.17Yecterdav at 12:16Yesterdav at 13:16Yesterday at 13.10Yesterdav at 13:15Yesterday at 13:14Yesterday at 13:13Yecterdav at 12:12Yesterdav at 13:12Yesterday at 13.12Yesterdav at 13:11Yesterday at 13:11Yesterday at 13:10Yoctorday at 12:00Yesterdav at 13:09Yesterday at 13.08Yocterdav at 12:08Yesterdav at 13:07Yesterdav at 13:0616 K:MPEG-4 movie17 KB29 KBMDEG-A movieMPEG-4 movieMPEG-4 movie12 KE9 KBMPE0"4 movie8 K:37 KB10 KBIKBnMDSG-A movieMP2G-4 movie8 KBI9 KB8 KB72 K:MPEG-4 movieMPEG-4 movie14 KB13 KBMoECA movieMPEG-4 movie18 KBI12 KB10 KBMPEG-1 movidMPEG-4 movie16 KEMPEG-4 movie6 KB MPEG-4 movie6 KB12 KB|MPEG-4 movie23 KBMDSG.A movicMPEG-4 movie6KE11 KBMPEG-4 movieMPEG-4 movie11 KBMPEG-4 movie20 K:MPEG-4 movie2AKR10 KB7 KBMDEGA movidMPEG-4 movie5KPMDEG-A movie11 KBMPEG-4 movie26 KBMPEG-4 movie111 K:102 KB88 KB59 KBMPEG-4 movieMDEC.A moviaMPEG-4 movieO9 KR97 KB66 KBMDEG-A movieMPEG-4 movie44K:MPSG-A movid93 KBMPEG-4 movie78 KB50 KB59 KPMPEG-4 movieMDEG.A movio27 KBMPEG-4 movie12 K:32 KBMDEC A movid17 KB19K8MPEG-4 movie• • CFavourites• jiminny• Recents* ApplicationsiCloud• iCloud Drive992 Svnc tolde0 DXP4800PLUS-B5F49 Networl• CRMI• Orange• Red|• Yellow• Green• Purple•) All lags..IhlDownloadsNameLoom.pkgAlfred copv.alfredoreterences=KeychronAssist-1.0.2 (1).dmeKeychronAssist-1.0.2.dmgmazanoke-images-yWJo.zioPhotos-3-001.zip• Transcript.pd→mage U.loge1 Orioninstaller.dma_image.jpg- image (2).1pc• ПO-22221726037035-004-001_ORGES.pdf%D0%9F%D0%9E-22221726037035-004-001 archive.zipПO-22221726037035-004-001_archive (1).zip• repon 4).XmAltred copy2.altredoreterencesСE 060209С О000000026571172 CWICT 0Р70501260015900 ndt= 27022026_0000000026574472_ SWIFT_ [IBAN].pdf= 03042026 [CREDIT_CARD] SWIFT [CREDIT_CARD].001reportxmmi=pdt.odiB pdf-1.pdfD pdf-2.pdf-pdf-5.pd1= ndf-1 ndipdf-3.pdfP Kdf-a,k Ffmiv Tree.sebitwarden export 20251031122528.isonlKoválik Family Tree.zip*macOS Storage_Cleanup.mdal favicon icofirst aid_notes_complete.docxrenortl2).esv1 config.vmlIteration run Search HS.postman_collection.jsonm licence bettertouchtoalMariusHosting Config.isonnokc.901a6502.6667.A62h-062 ccu•AlfredwPmazanoko.imnaoc.YWIfана Ковалик.jpg•искане даниел Ковалик..pg• Фактура Март Даниел Ковалик.jрс• Фактура Април Даниел Ковалик iро• Dhotac 2.001Q SearchKind00,4 MD55.9 MBinstdlle..dckageAlfred...ferences10,1 MB10,1 MBIL MBDisk ImageDisk ImageLiP archive6.6 MBZIp archive2,5 MB PDF Document2,5 MBJreo lmage2.2 MBDisk Image2,2 MB PDF Document2 MBJPEG image1,9 MBJPEG imaqe192 KBPDE Document140 KbZIP archive148 KВ148 KB122 KBZIP archivelZIP archiveXML document111 KBAlfred...ferences94 KBDDE Documont92 KBPDr DocumentK:PDF Document91 KB91 KBXML document30 KBn0kpDDE Nocumont28 KBPDF Document28 KRPDE Document28 KB27 KBDocument14 KB11 KB6 KB6KBJSONINCV NacumontZIP archiveMarkdo…..ument5KRWindo...n image4 KB3 KBword ..cumentCSV Document2 KBVAMI dosumon1 KB029 buteccSV Documenthttlicence183 bytesZero butesJSONAlfrod foronso!Zero bytesFolde1.9 MB1,8 MB17 MB1,7 MBColdorJPEG imageJPEG ImageIPEG imadeJPEG imageColdo1 of 58 selected, 8.43 GB availabld• Inu 14 Mаy 1/.40:04)Date AddedIs Mdl ZUzo dl 19:4530 Jan 2026 at 12:3617 Mar 2026 at 20:2717 Mar 2026 at 20:26Z3 Aor 2020 al 13:0229 ,Jan 2026 at 15:2019 Dec 2025 at 10:1619 Dec 2025 at 12:238 Aor 2026 at 20:3519 Dec 2025 at 10:2919 Dec 2025 at 12:1819 Dec 2025 at 12:4026 Mar 2026 at 11:2410 May 2026 at 13:5326 Mar 2026 at 11:2426 Mar 2026 at 11:2426 Mar 2026 at 11:2310 May 2026 at 14:3730 Jan 2026 at 12:3712 Goh 2006 9t 11:5 A1Z3 Apr 2026 at 13.0823 Aor 2026 at 13:0810 May 2026 at 13:5410 May 2026 at 14:3710 May 2026 at 13:4910 May 2026 at 13:5010 May 2026 at 13:5110 Mav 2026 at 12:51110 May 2026 at 13:5019 Dec 2025 at 11:3431 Oct 2025 at 12:2525 Nau 2025 4+ 17:506 Mar 2026 at 11.2224 Anr 2026 at 16:5220 Oct 2025 at 11:0218 Mar 2026 at 15:29• Mav 2026 at 11:09129 Oct 2025 at 19:329 May 2026 at 10:0419 Mar 2026 at 11:55|10 May 2026 at 13:5712 Jun 2025 at 19:0430 Jan 2026 at 12:362616 Oct 2025 aт 16:0122 Aar 2026 at 12:0223 Apr 2026 at 13:0223 Apr 2026 at 13:0222 Anr 2026 at 12:0223 Apr 2026 at 13:0229 Jan 2026 at 15:20...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
45517
|
1627
|
41
|
2026-05-14T14:40:54.904545+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-14/1778 /Users/lukas/.screenpipe/data/data/2026-05-14/1778769654904_m1.jpg...
|
PhpStorm
|
faVsco.js – IntegrationApp/Service.php
|
1
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
PhpStormFileEditViewNavigateCodeLaravelRefactorRun PhpStormFileEditViewNavigateCodeLaravelRefactorRunToolsGitWindowHelp•FV faVsco.jsv#12066 on JY-20725-handle-HS-search-rate-limit k vlhlU HandleHubspotRateLimitTest ~100% C8• Thu 14 May 17:40:54* :QProjectvTrackAutomatedReportGeneratedEvent.phpSendReportJob.phpDeleteCrmEntity Trait.phpDeleteAccountJob.php:© FieldTypeConverter.phpImportActivityTypes.php€ WriteCrmTrait.phpHubspot/DecorateActivity.phpIntegrationAppServiceTrait.php• HubspotClientinterface.php© HubspotTokenManager.php© IntegrationApp/Service.php X© IntegrationApp/DecorateActivity.phpActivity-php© Salesforce/Service.php© LogActivityTrait.php© PayloadBuilder.php© Playbook.php© Pipedrive/Service.phpClose/Service.phpCopper/Service.php© BullhornService.php© RemoteCrmObjectManipulatoi© PlainTextDecorateActivity.phpT ActivityPlaybookTrait.php© CrmHelperRepository.phpAccountController.php=.env.staging18© ResponseNormalize.php© Service.phpE.envDetachActivityObject.phpRematchActivityOnCrmObjectDetach.php© MatchActivityCrmData.phpClient.php© SyncFieldAction.php© SyncRelatedActivityManager.|55© WebhookSyncBatchProcessol413v D IntegrationApp426> D Accessors427• Арі428© HubspotPaginationService.php© HandleHubspotRateLimit.phpclass Service extendsBaseService implementspublic function saveMeeting(Activity $activity): arrayif ($activity->hasCrmProviderIdO) {$crmId =Sactivity->getCrmProviderIdO;$meeting = $this->client->getMeeting($crmId);A 16 × 2ConfigO DTO429430> O Filters4311v D Jobs$oldDescription = $meeting['fields']['Description'] ?? null;Spayload[ 'Description'] = $decorateActivity->generateUpdatedDescription(SoldDescription, $activity 220© CrmEntitiesFullSyncJob.ph432433© DeleteRemoteTeamJob.phT IntegrationAppService Trait434435© SubscribeForEventsJob.ph© TeamInitialSyncJob.php436$this->logger-›info('[integration-app] CRM update meeting', ['activity' => $activity->getUuidO,'crm_id' => $crmId,'payload'=> Spayload,437© UnsubscribeForEventsJob.1):438© UpdateProfileRelatedEntiti439© ValidateTeamActiveConnereturn $this->client->updateMeeting($crmId, $payload);440> ProspectSearchStrategy441> D ServiceTraits442© DataClient.php$payload['Description'] = SdecorateActivity->generateDescription(Sactivity);© DecorateActivity.php443© LocalSearch.php444• LocalSearchlnterface.php445446© RemoteSearch.php$this->logger->info('[integration-app] CRM log meeting', ['activity' => $activity->getUuid),'payload' => $payload,447© Service.php1):v • Listeners448C ConvertLeadActivities.php449return $this->client-›createMeeting($payload);© Purnel onkunCache nhn450Workspace associated with branch 'JY-20725-handle-HS-search-rate-limit' has been restored // Rollback // Configure... (today 16:17)=custom.log=laravel.logSF [jiminny@localhost]A HS_local [jiminny@localho:W4 console [QAI PROD] X4 console [PROD]A console (EU]DGo jiminny084143 ×4 л215•m_layout_id =2162,1661,66799,66217218219id = 33;-221222-223224id THEN •(own=225_226227228229230hubspot':-231232233= 11512582;234W Windsurf Teams439:40UTF-8Ca 4 spaces...
|
NULL
|
-8953191298664258298
|
NULL
|
click
|
ocr
|
NULL
|
PhpStormFileEditViewNavigateCodeLaravelRefactorRun PhpStormFileEditViewNavigateCodeLaravelRefactorRunToolsGitWindowHelp•FV faVsco.jsv#12066 on JY-20725-handle-HS-search-rate-limit k vlhlU HandleHubspotRateLimitTest ~100% C8• Thu 14 May 17:40:54* :QProjectvTrackAutomatedReportGeneratedEvent.phpSendReportJob.phpDeleteCrmEntity Trait.phpDeleteAccountJob.php:© FieldTypeConverter.phpImportActivityTypes.php€ WriteCrmTrait.phpHubspot/DecorateActivity.phpIntegrationAppServiceTrait.php• HubspotClientinterface.php© HubspotTokenManager.php© IntegrationApp/Service.php X© IntegrationApp/DecorateActivity.phpActivity-php© Salesforce/Service.php© LogActivityTrait.php© PayloadBuilder.php© Playbook.php© Pipedrive/Service.phpClose/Service.phpCopper/Service.php© BullhornService.php© RemoteCrmObjectManipulatoi© PlainTextDecorateActivity.phpT ActivityPlaybookTrait.php© CrmHelperRepository.phpAccountController.php=.env.staging18© ResponseNormalize.php© Service.phpE.envDetachActivityObject.phpRematchActivityOnCrmObjectDetach.php© MatchActivityCrmData.phpClient.php© SyncFieldAction.php© SyncRelatedActivityManager.|55© WebhookSyncBatchProcessol413v D IntegrationApp426> D Accessors427• Арі428© HubspotPaginationService.php© HandleHubspotRateLimit.phpclass Service extendsBaseService implementspublic function saveMeeting(Activity $activity): arrayif ($activity->hasCrmProviderIdO) {$crmId =Sactivity->getCrmProviderIdO;$meeting = $this->client->getMeeting($crmId);A 16 × 2ConfigO DTO429430> O Filters4311v D Jobs$oldDescription = $meeting['fields']['Description'] ?? null;Spayload[ 'Description'] = $decorateActivity->generateUpdatedDescription(SoldDescription, $activity 220© CrmEntitiesFullSyncJob.ph432433© DeleteRemoteTeamJob.phT IntegrationAppService Trait434435© SubscribeForEventsJob.ph© TeamInitialSyncJob.php436$this->logger-›info('[integration-app] CRM update meeting', ['activity' => $activity->getUuidO,'crm_id' => $crmId,'payload'=> Spayload,437© UnsubscribeForEventsJob.1):438© UpdateProfileRelatedEntiti439© ValidateTeamActiveConnereturn $this->client->updateMeeting($crmId, $payload);440> ProspectSearchStrategy441> D ServiceTraits442© DataClient.php$payload['Description'] = SdecorateActivity->generateDescription(Sactivity);© DecorateActivity.php443© LocalSearch.php444• LocalSearchlnterface.php445446© RemoteSearch.php$this->logger->info('[integration-app] CRM log meeting', ['activity' => $activity->getUuid),'payload' => $payload,447© Service.php1):v • Listeners448C ConvertLeadActivities.php449return $this->client-›createMeeting($payload);© Purnel onkunCache nhn450Workspace associated with branch 'JY-20725-handle-HS-search-rate-limit' has been restored // Rollback // Configure... (today 16:17)=custom.log=laravel.logSF [jiminny@localhost]A HS_local [jiminny@localho:W4 console [QAI PROD] X4 console [PROD]A console (EU]DGo jiminny084143 ×4 л215•m_layout_id =2162,1661,66799,66217218219id = 33;-221222-223224id THEN •(own=225_226227228229230hubspot':-231232233= 11512582;234W Windsurf Teams439:40UTF-8Ca 4 spaces...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
45516
|
1628
|
31
|
2026-05-14T14:40:51.925615+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-14/1778 /Users/lukas/.screenpipe/data/data/2026-05-14/1778769651925_m2.jpg...
|
PhpStorm
|
faVsco.js – IntegrationApp/Service.php
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"bounds":{"left":0.2962101,"top":1.0,"width":0.03856383,"height":-0.019952059},"on_screen":true,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
8043719072324535154
|
-8628527368849355612
|
click
|
hybrid
|
NULL
|
Project: faVsco.js, menu
Jiminny... ~ActivityFiles Project: faVsco.js, menu
Jiminny... ~ActivityFilesLater@ jiminny-x-integrati• plattorm-inner-teamE Channels# ai-chapter# alertsi backend# bugscontusion-cllnia# curiosity lab# engineering# general#jiminny-bgac nlattorm-nckets# product launches# random# releases# sofia-officed sunport# thank-yous# the people of iimi... Direct messages• 8la 62% Galya Dimitrovavasil VasilevM Stefka StovanovaSg: Todor StamatovMario GeorgievNiudlay lanay. James Graham "* Stoyan Tanevo Stelivan Georgiev( Petko Kashinski*. Lukas Kovali...::: AnnsToastS lira Gloud6d Huddle with Aneliva Angelova* Aneliya Angelova &• Messagest Add canvasur FilesAneliya Angelova 2:30 PMЛукаш, само при Сейлсфорс и Хубспот се синкваха активити типовете, когато се направи плейбук,нали?пои останалите скМі тоябва оъчно ла се въвелат.Lukas Kovalik 2:47 PMтряова да се за всички, някъде не се ли попьлвапри зохо май беше hardcoded но май и там си връщаха две категорииAneliya Angelova 4:00 PMЛукаш имаш ли време да се чуем за тестването на https://jiminny.atlassian.net/browse/JY-20725X Preuiew in sact[HubSpotl Optimise CRM rematct(7 OpenRosdy for OA- MediumAA Aneliya AngelovaAs of today at 4:00 PM RetreshOpen in Jira* SummariseLukas Kovalik 4:02 PMzean-iurwiniareelYou joined the huddle (LIVE 4:06 PMAneliva Angelova is here toolAneliva Angelova 4:44 PN11512582Lukas Kovalik M 5.16 PNcurl --location "httns:ani.hubani.com/crm/v3/obiects/contacts/search--header 'Content-vne' annlication/ison'--header "Authorization: BearerC|Kvma?iMx7OINOM8kOFwrAowAcAkUAhIR24?A05D?xiVrIYMILuP6SA01Kwcmhr=n.v2 hytorDniMvDalYck-CMalovolNOM9kOFwrAUAcrkcaws-ThwRARIRAOF-ATFSAOFRAO-ROIEBAQUBEggBAQEBAYICFIr7Au8O2Nwal9YW2CbCCxYvwngmSgNldTFSAFoAYABoAHAAeAA'\--data "{ "limit", 13'Message Aneliva Angelova+ AaIAl Notes: OffLeavev Q SearchDate ModifiedYesterdav at 13.35Yesterday at 13:34Yesterday at 13.33Yesterdav at 13:33Yesterday at 13:32Yesterday at 13:32Yesterday at 13:31Yesterday at 13.30Yesterdav at 13:29Yesterday at 13:29resterday at 15.2oYesterdav at 13:28Yesterday at 13:27Yesterday at 13:26Yesterdav at 13:26resterday at 13-40Yesterdav at 13:24Yesterday at 13:24Yesterday at 13:23Yesterday at 13.20Yesterdav at 13:20Yesterdav at 13:19Yesterday at 13:19Yesterday at 13:18Yesterday at 13:18Yesterday at 13.17Yecterdav at 12:16Yesterdav at 13:16Yesterday at 13.10Yesterdav at 13:15Yesterday at 13:14Yesterday at 13:13Yecterdav at 12:12Yesterdav at 13:12Yesterday at 13.12Yesterdav at 13:11Yesterday at 13:11Yesterday at 13:10Yoctorday at 12:00Yesterdav at 13:09Yesterday at 13.08Yocterdav at 12:08Yesterdav at 13:07Yesterdav at 13:0616 K:MPEG-4 movie17 KB29 KBMDEG-A movieMPEG-4 movieMPEG-4 movie12 KE9 KBMPE0"4 movie8 K:37 KB10 KBIKBnMDSG-A movieMP2G-4 movie8 KBI9 KB8 KB72 K:MPEG-4 movieMPEG-4 movie14 KB13 KBMoECA movieMPEG-4 movie18 KBI12 KB10 KBMPEG-1 movidMPEG-4 movie16 KEMPEG-4 movie6 KB MPEG-4 movie6 KB12 KB|MPEG-4 movie23 KBMDSG.A movicMPEG-4 movie6KE11 KBMPEG-4 movieMPEG-4 movie11 KBMPEG-4 movie20 K:MPEG-4 movie2AKR10 KB7 KBMDEGA movidMPEG-4 movie5KPMDEG-A movie11 KBMPEG-4 movie26 KBMPEG-4 movie111 K:102 KB88 KB59 KBMPEG-4 movieMDEC.A moviaMPEG-4 movieO9 KR97 KB66 KBMDEG-A movieMPEG-4 movie44K:MPSG-A movid93 KBMPEG-4 movie78 KB50 KB59 KPMPEG-4 movieMDEG.A movio27 KBMPEG-4 movie12 K:32 KBMDEC A movid17 KB19K8MPEG-4 movie• • CFavourites• jiminny• Recents* ApplicationsiCloud• iCloud Drive992 Svnc tolde0 DXP4800PLUS-B5F49 Networl• CRMI• Orange• Red|• Yellow• Green• Purple•) All lags..IhlDownloadsNameLoom.pkgAlfred copv.alfredoreterences=KeychronAssist-1.0.2 (1).dmeKeychronAssist-1.0.2.dmgmazanoke-images-yWJo.zioPhotos-3-001.zip• Transcript.pd→mage U.loge1 Orioninstaller.dma_image.jpg- image (2).1pc• ПO-22221726037035-004-001_ORGES.pdf%D0%9F%D0%9E-22221726037035-004-001 archive.zipПO-22221726037035-004-001_archive (1).zip• repon 4).XmAltred copy2.altredoreterencesСE 060209С О000000026571172 CWICT 0Р70501260015900 ndt= 27022026_0000000026574472_ SWIFT_ [IBAN].pdf= 03042026 [CREDIT_CARD] SWIFT [CREDIT_CARD].001reportxmmi=pdt.odiB pdf-1.pdfD pdf-2.pdf-pdf-5.pd1= ndf-1 ndipdf-3.pdfP Kdf-a,k Ffmiv Tree.sebitwarden export 20251031122528.isonlKoválik Family Tree.zip*macOS Storage_Cleanup.mdal favicon icofirst aid_notes_complete.docxrenortl2).esv1 config.vmlIteration run Search HS.postman_collection.jsonm licence bettertouchtoalMariusHosting Config.isonnokc.901a6502.6667.A62h-062 ccu•AlfredwPmazanoko.imnaoc.YWIfана Ковалик.jpg•искане даниел Ковалик..pg• Фактура Март Даниел Ковалик.jрс• Фактура Април Даниел Ковалик iро• Dhotac 2.001Q SearchKind00,4 MD55.9 MBinstdlle..dckageAlfred...ferences10,1 MB10,1 MBIL MBDisk ImageDisk ImageLiP archive6.6 MBZIp archive2,5 MB PDF Document2,5 MBJreo lmage2.2 MBDisk Image2,2 MB PDF Document2 MBJPEG image1,9 MBJPEG imaqe192 KBPDE Document140 KbZIP archive148 KВ148 KB122 KBZIP archivelZIP archiveXML document111 KBAlfred...ferences94 KBDDE Documont92 KBPDr DocumentK:PDF Document91 KB91 KBXML document30 KBn0kpDDE Nocumont28 KBPDF Document28 KRPDE Document28 KB27 KBDocument14 KB11 KB6 KB6KBJSONINCV NacumontZIP archiveMarkdo…..ument5KRWindo...n image4 KB3 KBword ..cumentCSV Document2 KBVAMI dosumon1 KB029 buteccSV Documenthttlicence183 bytesZero butesJSONAlfrod foronso!Zero bytesFolde1.9 MB1,8 MB17 MB1,7 MBColdorJPEG imageJPEG ImageIPEG imadeJPEG imageColdo1 of 58 selected, 8.43 GB availabld• Inu 14 May 1/.40:0)Date AddedIs Mdl ZUzo dl 19:4530 Jan 2026 at 12:3617 Mar 2026 at 20:2717 Mar 2026 at 20:26Z3 Aor 2020 al 13:0229 ,Jan 2026 at 15:2019 Dec 2025 at 10:1619 Dec 2025 at 12:238 Aor 2026 at 20:3519 Dec 2025 at 10:2919 Dec 2025 at 12:1819 Dec 2025 at 12:4026 Mar 2026 at 11:2410 May 2026 at 13:5326 Mar 2026 at 11:2426 Mar 2026 at 11:2426 Mar 2026 at 11:2310 May 2026 at 14:3730 Jan 2026 at 12:3712 Goh 2006 9t 11:5 A1Z3 Apr 2026 at 13.0823 Aor 2026 at 13:0810 May 2026 at 13:5410 May 2026 at 14:3710 May 2026 at 13:4910 May 2026 at 13:5010 May 2026 at 13:5110 Mav 2026 at 12:51110 May 2026 at 13:5019 Dec 2025 at 11:3431 Oct 2025 at 12:2525 Nau 2025 4+ 17:506 Mar 2026 at 11.2224 Anr 2026 at 16:5220 Oct 2025 at 11:0218 Mar 2026 at 15:29• Mav 2026 at 11:09129 Oct 2025 at 19:329 May 2026 at 10:0419 Mar 2026 at 11:55|10 May 2026 at 13:5712 Jun 2025 at 19:0430 Jan 2026 at 12:362616 Oct 2025 aт 16:0122 Aar 2026 at 12:0223 Apr 2026 at 13:0223 Apr 2026 at 13:0222 Anr 2026 at 12:0223 Apr 2026 at 13:0229 Jan 2026 at 15:20...
|
45513
|
NULL
|
NULL
|
NULL
|
|
45515
|
1627
|
40
|
2026-05-14T14:40:51.925647+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-14/1778 /Users/lukas/.screenpipe/data/data/2026-05-14/1778769651925_m1.jpg...
|
PhpStorm
|
faVsco.js – IntegrationApp/Service.php
|
1
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"bounds":{"left":0.054166667,"top":0.027777778,"width":0.08055556,"height":0.035555556},"on_screen":true,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
8043719072324535154
|
-8628527368849355612
|
click
|
hybrid
|
NULL
|
Project: faVsco.js, menu
PhpStormFileEditViewNavig Project: faVsco.js, menu
PhpStormFileEditViewNavigateCodeLaravelRefactorRunToolsGitWindowHelp•FV faVsco.jsv#12066 on JY-20725-handle-HS-search-rate-limit k vlhlU HandleHubspotRateLimitTest ~100% C8• Thu 14 May 17:40:51* :QProjectvTrackAutomatedReportGeneratedEvent.phpSendReportJob.phpDeleteCrmEntity Trait.phpDeleteAccountJob.php:© FieldTypeConverter.phpImportActivityTypes.php€ WriteCrmTrait.phpHubspot/DecorateActivity.phpIntegrationAppServiceTrait.php• HubspotClientinterface.php© HubspotTokenManager.php© IntegrationApp/Service.php X© IntegrationApp/DecorateActivity.phpActivity-php© Salesforce/Service.php© LogActivityTrait.php© PayloadBuilder.php© Playbook.php© Pipedrive/Service.phpClose/Service.phpCopper/Service.php© BullhornService.php© RemoteCrmObjectManipulatoi© PlainTextDecorateActivity.phpT ActivityPlaybookTrait.php© CrmHelperRepository.phpAccountController.php=.env.staging18© ResponseNormalize.php© Service.phpE.envDetachActivityObject.phpRematchActivityOnCrmObjectDetach.php© MatchActivityCrmData.phpClient.php© SyncFieldAction.php© SyncRelatedActivityManager.|55© WebhookSyncBatchProcessol413v D IntegrationApp426> D Accessors427• Арі428© HubspotPaginationService.php© HandleHubspotRateLimit.phpclass Service extendsBaseService implementspublic function saveMeeting(Activity $activity): arrayif ($activity->hasCrmProviderIdO) {$crmId =Sactivity->getCrmProviderIdO;$meeting = $this->client->getMeeting($crmId);A 16 × 2ConfigO DTO429430D Filters431v D Jobs$oldDescription = $meeting['fields']['Description'] ?? null;Spayload[ 'Description'] = $decorateActivity->generateUpdatedDescription(SoldDescription, $activity 220© CrmEntitiesFullSyncJob.ph432433© DeleteRemoteTeamJob.phT IntegrationAppService Trait434435© SubscribeForEventsJob.ph© TeamInitialSyncJob.php436$this->logger-›info('[integration-app] CRM update meeting', ['activity' => $activity->getUuidO,'crm_id' => $crmId,'payload"=> Spayload,437© UnsubscribeForEventsJob.1):438© UpdateProfileRelatedEntiti439© ValidateTeamActiveConnereturn $this->client->updateMeeting($crmId, $payload);440> ProspectSearchStrategy441> D ServiceTraits442© DataClient.php$payload['Description'] = SdecorateActivity->generateDescription(Sactivity);© DecorateActivity.php443© LocalSearch.php444• LocalSearchlnterface.php445446© RemoteSearch.php$this->logger->info('[integration-app] CRM log meeting', ['activity' => $activity->getUuid),'payload' => $payload,447© Service.php1):v • Listeners448C ConvertLeadActivities.php449return $this->client-›createMeeting($payload);© Purnel onkunCache nhn450Workspace associated with branch 'JY-20725-handle-HS-search-rate-limit' has been restored // Rollback // Configure... (today 16:17)=custom.log=laravel.logSF [jiminny@localhost]A HS_local [jiminny@localho:W4 console [QAI PROD] X4 console [PROD]A console (EU]DGo jiminny084143 ×4 л215•m_layout_id =2162,1661,66799,66217218219id = 33;-221222-223224id THEN •(own=225_226227228229230hubspot':-231-232233 V= 11512582;— 234W Windsurf Teams431:75UTF-8Ca 4 spaces...
|
45514
|
NULL
|
NULL
|
NULL
|